--Done By SunXU(HuaMuLan)
--a sphere game
scriptStr =  "x_pos = (gw.mapCPToWorld (mapScreenToCP  mouse.pos)).x\n";
scriptStr += "if x_pos > 146.5 then x = 146.5;\n";
scriptStr += "else \n"
scriptStr += "(\n"
scriptStr += "\tif x_pos < -146.5 then x = -146.5;\n";
scriptStr += "\telse x = x_pos;\n"
scriptStr += ")\n";
scriptStr += "x;";

struct ball(
	sphere_Node = GeoSphere radius:10,
	pos = [0,0,30],
	radius = 10
);

struct Game(
	ball,
	border,
	border_B,
	direction,
	iSpeed = 2,
	ratoteMat,
	stepVector,
	function createBall ballStruct = (
		ball = ballStruct;
		setTransformLockFlags ball.sphere_Node #all;
	),
	function createBorder = (
		border = box Length:250 Width:350 Height:60;
		border.boxMode = on;
		border.xray = off;
		setTransformLockFlags border #all;
	),
	function createBorder_B = (
		border_B = box pos:[0,-112.428,0] Length:23 Width:57 Height:60;
		setTransformLockFlags border_B #all;
	),
	function resetGame = (
		ball.pos = [0,0,0];
		direction = random 60 120;
		ratoteMat = rotateZMatrix direction;
		stepVector = iSpeed * [1,0,0] * ratoteMat;
	),
	function colWhichBorder = (
		local x_border_R = border.width / 2;
		local x_border_L = -x_border_R;
		local y_border_T = border.length / 2;
		local y_border_B = -y_border_T;
		local position = ball.pos;
		local rad = ball.radius;
		local len = border_B.length;
		local wid = border_B.Width;
		if position.x > x_border_R - rad then return 1;
		if position.x < x_border_L + rad then return 2;
		if position.y > y_border_T - rad then return 3;
		if position.y < y_border_B + rad + len then
		(
			if abs(position.x - border_B.pos.x) <  wid / 2 then return 4;
			return 5;
		)
		
		return 0;
	),
	function handleCollision = (
		local whichB = colWhichBorder();
		--format "whichB:%\n" whichB;
		case whichB of
		(
			0: return 0;
			1: stepVector.x = -stepVector.x;
			2: stepVector.x = -stepVector.x;
			3: stepVector.y = -stepVector.y;
			4: stepVector.y = -stepVector.y;
			5: resetGame();
		)
	),
	function moveBall = (
		handleCollision();
		ball.pos += stepVector;
	),
	function setConstraint = (
		ball.sphere_Node.pos.controller = position_script();
		ball.sphere_Node.pos.controller.script = "newGame.moveBall();"
		border_B.pos.controller.X_Position.controller = float_script();
		border_B.pos.controller.X_Position.controller.script = scriptStr;
	),
	function start ball= (
		createBall ball;		
		createBorder();
		createBorder_B();
		resetGame();
		
		setConstraint();
	)
);


try(
	delete newBall.sphere_Node;
	delete newGame.border;
	delete newGame.border_B;
)
catch()
resetMaxFile #noPrompt;
viewport.activeViewport = 1;
viewport.setLayout #layout_1;
viewport.setType #view_top;
newBall = ball();
newGame = Game();
newGame.start newBall;
playAnimation();
