turf/mine/proc/work()
for(var/turf/t in orange(1, src))
if(istype(t,/turf/village))
for(var/turf/i in orange(1, src))
if(istype(i,/turf/hill))
t.stone = t.stone + 0.5
i.subDurability(1, "grass")
Problem description:
How I should add stones to the t (a village turf) and slowly destroy the i (a hill turf)?
The nested loops aren't really so wonderful, as you're wasting a lot of cycles on the same things. Instead, I'd separate the loops. There's no reason the i loop has to be inside the t loop as long as they're both centered on src.
I'd create two temporary lists. From all turfs in orange(1,src) (so you only loop once), add a turf to the hill list if it's a hill, and the village list if it's a village turf.
Then, to be equivalent to your current code you would add 0.5*hills.len to the stone var for each turf in the village list, and then for each hill you would call subDurability().
Another way to do this, which is more interesting, is to pick a turf at random from each list.