% Towers of hanoi animation for level 1 graphics

hanoi(N) :-
	all_float(Float, off),
	g_clear,
	buildtower(N, T, 0),
	move([left, 0, T], [centre, 0, T], [right, 0, []]),
	all_float(_, Float).

buildtower(0, [], _).
buildtower(N, [N|T], H) :-
	shade(N),
	place(left, H, N),
	N1 is N - 1,
	H1 is H + 1,
	buildtower(N1, T, H1).

move([A, _, []], _, _).
move([A, Ha, [Ba|Ra]], [B, Hb, [Ba|Rb]], [C, Hc, []]) :-
	Ha1 is Ha + 1,
	Hb1 is Hb + 1,
	move([A, Ha1, Ra], [C, Hc, Ra], [B, Hb, []]),
	g_colour(0),
	place(A, Ha, Ba),
	shade(Ba),
	place(B, Hb, Ba),
	move([C, Hc, Ra], [B, Hb1, Ra], [A, Ha, []]).

place(Pole, Height, Disc) :-
	base(Pole, X, Y),
	W is Disc * 20,
	X0 is X - W / 2,
	X1 is X + W / 2,
	Y0 is Y + Height * 50,
	Y1 is Y0 + 49,
	g_fill(X0, Y0, X1, Y1).

shade(N) :-
	M is N mod 7 + 1,
	g_colour(M).

base(left, 100, 0).
base(centre, 300, 0).
base(right, 500, 0).
