setvar I 0 whilevarvarn I NUMWALLS { setvarvar A I getwall[I].point2 B setvarvar K I whilevarvarn A B { addvar K 1 getwall[K].point2 B }
The whilevarvarn A B loop assumes that if you keep incrementing K (where K is some arbitrary wall number), then the point 2 of K will eventually loop back around and be equal to K's starting value (which is saved in A). This is true in every map I have encountered except for this one. Does that mean that the map is corrupt, or what? And how would I go about fixing the code? I can't just make it bail out because it has already swapped a lot of walls by the time it it goes infinite and the result of bailing would be a bizarre corrupted map.
EDIT: Here's what I did for now --
setvar I 0 whilevarvarn I NUMWALLS { setvarvar A I getwall[I].point2 B setvarvar K I whilevarvarn A B { addvar K 1 ifvarvare K NUMWALLS setvarvar B A else getwall[K].point2 B } ifvarvarn K NUMWALLS { setvarvar A K setvarvar J I setvarvar L K subvarvar L J divvar L 2 addvar J 1 whilevarn L 0 { state swapwall setarray SWAPWALLS[J] K setarray SWAPWALLS[K] J addvar J 1 addvar K -1 addvar L -1 } setvarvar J I whilevarvarn I A { setvarvar K I addvar K 1 getwall[J].x B getwall[J].y C getwall[K].x D getwall[K].y E setwall[J].x D setwall[J].y E setwall[K].x B setwall[K].y C addvar I 1 } } addvar I 1 }
If on some I, K reaches an invalid wall number, it stops the loop and does not proceed with the wall swap for that I. However, it proceeds with the next I. So far it seems to work ok.