
:-object wasp4 : [bcilib].

var url = './soccer/soccer2b.wrl'.

var timelimit = 500.


main :-
	text_area(Browser),
	set_output(Browser),

	format('Load the game ...~n'),
	loadURL(url),

	format('the game will start in 5 seconds,~n'),
	format('note that the total playing time period is ~w seconds,~n', [timelimit]),
	delay(5000),
	format('the game startup,~n'),
	play_ball(me, ball).


play_ball(Agent, Ball) :-
	-- timelimit,
	timelimit > 0, !,
	format('time left: ~w seconds~n', [timelimit]),
	delay(800),
	look_at_ball(goalKeeper1,Ball),
	near_ball_then_kick(Agent, Ball),
	play_ball(Agent, Ball).

play_ball(_, _).


near_ball_then_kick(Agent, Ball):-
	getViewpointPositionEx(Agent,X,_Y,Z),
	getPosition(Ball,X1,Y1,Z1),
	Xdif is X1-X,
	Zdif is Z1-Z,
	Dist is sqrt(Xdif*Xdif + Zdif*Zdif),
	Dist < 5, !,
	X2 is Xdif*3,
	Z2 is Zdif*3,
	X3 is X2 + X1,
	Z3 is Z2 + Z1,
	setPosition(Ball,X3,Y1,Z3),
	checkBallPosition(Ball,X3,Y1,Z3).

near_ball_then_kick(_, _).



checkBallPosition(Ball, X, Y, Z):-
	getPosition(goalKeeper1,X1,_Y1,Z1),
	Xdif is X-X1,
	Zdif is Z-Z1,
	Dist is sqrt(Xdif*Xdif + Zdif*Zdif),
	Dist < 4, !,
	X2 is X - 8,
	format('The goalkeeper kicks the ball back~n'),
	setPosition(Ball,X2,Y,Z).

checkBallPosition(_,_,_,_).
	
look_at_ball(Sportman,Ball):-
	getPosition(Sportman,X,_,Z),
	getPosition(Ball, X1,_,Z1),
	Xdif is X-X1,
	Zdif is Z1-Z,
	Xdif =\= 0.0,
	R is atan(Zdif/Xdif) - sign(Xdif)*1.571,
	setRotation(Sportman,0.0, 1.0, 0.0, R).
	
look_at_ball(Sportman,Ball):-
	getPosition(Sportman,_X,_,Z),
	getPosition(Ball, _X1,_,Z1),
	Z1 < Z,
	setRotation(Sportman,0.0, 1.0, 0.0, 3.14).

look_at_ball(Sportman,Ball):-
	getPosition(Sportman,_X,_,Z),
	getPosition(Ball, _X1,_,Z1),
	Z1 > Z,
	setRotation(Sportman,0.0, 1.0, 0.0, 0.0).		
	
look_at_ball(_,_).

getViewpointPositionEx(_,X,Y,Z) :- getSFVec3f(proxSensor,position,X,Y,Z).
getViewpointOrientationEx(_,X,Y,Z,R):- getSFRotation(proxSensor,orientation,X,Y,Z,R).


:-end_object wasp4.

