// In snooker, replace balls according to the actual rules.

diff -u -r flying-6.20.orig/snooker.C flying-6.20/snooker.C
--- flying-6.20.orig/snooker.C	2009-05-01 02:55:08.000000000 +0200
+++ flying-6.20/snooker.C	2009-05-01 03:01:01.000000000 +0200
@@ -215,18 +215,18 @@
 				if (b->FitsAt(defs[i])) {
 					b->SetP(defs[i]);		// reset to default position
 				}
-				else if (b->FitsAt(defs[5])) {
-					b->SetP(defs[5]);		// reset to black position
-				}
-				else if (i<4) {
-					Vec2	newpos;
-					b->FitsNextTo(defs[i],Vec2(-1.0,RealZero),&newpos);
-					b->SetP(newpos);		// closer to left wall
-				}
 				else {
-					Vec2	newpos;
-					b->FitsNextTo(defs[i],Vec2(1.0,RealZero),&newpos);
-					b->SetP(newpos);		// closer to right wall
+					int j=5;
+					while (j>=0 && !b->FitsAt(defs[j]))
+						j--;
+					if (j>=0) {
+						b->SetP(defs[j]);               // reset to highest free position
+					}
+					else {
+						Vec2    newpos;
+						b->FitsNextTo(defs[i],Vec2(1.0,RealZero),&newpos);
+						b->SetP(newpos);                // closer to right wall
+					}
 				}
 
 				b->ChgV(Vec2Zero);
