//----------------------------------------------------------------------------
// Lesson8: MAKING A GAME
//
// SIMPLE OBJECT COLLISION
// Now let's have more meaningful collision with...dum dum dum...ANOTHER
// OBJECT!  Well, how do you do that?  Instead of trying to check the
// exact shape of each object, you cheat--you just make a box roughly their
// size, and see if those boxes intersect.  This is a really quick check
// (only four comparisons), and is close enough to work, unless you are
// doing physics-based collisions, like a pool game.  (Actually, you might
// still use this kind of collision, then do another check to see if they
// _really_ collided...)
//
// All this file does is print a message when the Pong ball is inside each
// of the paddles.  Try to work on your own after these lessons to make
// the ball react different if it is in different parts of the paddle!
//
// Next, we'll need to know how to make our games run the same on different
// computers, which all run at different speeds!
//
// To check out Lesson8...
//
//       MAP TEST
//       LOADAPE Lesson8
//       INVOKE 2:1
//
// Move on to Lesson 9!
//
//#############################################################################
// DEFINES
//#############################################################################

#define $Lesson8            "2"
#define $HitTheWalls       "1"
#define $Before            "2"
#define $During            "3"
#define $After             "4"
#define $PaddleCollision   "5"
#define $CheckTopPaddle    "6"
#define $CheckBottomPaddle "7"
#define $CheckBallHit      "8"

//-------------------------------------------------------
// CONSTANTS
//-------------------------------------------------------
#define $TOPSIDE         "1"
#define $LEFTSIDE        "1"
#define $RIGHTSIDE       "232"
#define $BOTTOMSIDE      "232"

#define %PADDLEWIDTH     "24"       // size of paddle
#define %PADDLEHEIGHT    "8"

//#############################################################################
// CODE
//#############################################################################
#window $Lesson8:$HitTheWalls
startswitch $Lesson8:$Before
thinkswitch $Lesson8:$During
finishswitch $Lesson8:$After
//-------------------------------------------------------
width 256
height 256
flags noscroll // Don't scroll the text onto the screen, like dialog.
body "                                                                   "
if (colliding == 0) body "Nope"
if (colliding == 1) body "TOP!"
if (colliding == 2) body "BOTTOM!"
body "\n                                                                   "
body "Top Collisions %d", collisioncount1
body "\n                                                                   "
body "Bottom Collisions %d", collisioncount2
font "Boost12"
image "zong\zongball.pcx" zongX,zongY
image "zong\tpaddle.pcx" tpaddleX,tpaddleY
image "zong\bpaddle.pcx" bpaddleX,bpaddleY


//=======================================================
// Before
// Initialize stuff!
//=======================================================
#switch $Lesson8:$Before
zongX = 200				// ball
zongY = 128
bpaddleX = 112			// bottom paddle
bpaddleY = 224
tpaddleX = 112			// top paddle
tpaddleY = 16
deltaX = 2.1
deltaY = .43
return

//=======================================================
// During
// Actively update appropriate variables
//=======================================================
#switch $Lesson8:$During
zongX = zongX + deltaX              // add change to X location                  
zongY = zongY + deltaY              // add change to Y location                  
if (zongX > $RIGHTSIDE) deltaX = -1  * deltaX     // if on right side, go left
if (zongX < $LEFTSIDE) deltaX = -1 * deltaX         // if on left side, go right
if (zongY > $BOTTOMSIDE) deltaY = -1 * deltaY      // if at bottom side, go up
if (zongY < $TOPSIDE) deltaY = -1 * deltaY         // if at top side, go down
gosub $Lesson8:$PaddleCollision
return
//=======================================================
// PaddleCollision
// Where we check each if ball hit either paddle.
//=======================================================
#switch $Lesson8:$PaddleCollision
unset colliding
gosub $Lesson8:$CheckTopPaddle
gosub $Lesson8:$CheckBottomPaddle
return

//=======================================================
// CheckTopPaddle
// See if collided with top paddle, and alter ball
// trajectory.
//=======================================================
#switch $Lesson8:$CheckTopPaddle
checkX = tpaddleX
checky = tpaddleY
checkWidth = %PADDLEWIDTH
checkHeight = %PADDLEHEIGHT
gosub $Lesson8:$CheckBallHit
if (colliding) set collisioncount1 = collisioncount1 + 1
return
//=======================================================
// CheckBottomPaddle
// See if collided with bottom paddle, and alter ball
// trajectory.
//=======================================================
#switch $Lesson8:$CheckBottomPaddle
if (colliding) return
checkX = bpaddleX
checky = bpaddleY
checkWidth = %PADDLEWIDTH
checkHeight = %PADDLEHEIGHT
gosub $Lesson8:$CheckBallHit
if (colliding) 
{
	colliding = 2      // bottom paddle collision!
	set collisioncount2 = collisioncount2 + 1
}
return

//=======================================================
// CheckBallHit
// Check if ball hit something
//=======================================================
#switch $Lesson8:$CheckBallHit
set box1Left = checkX			// whatever's bounding box
set box1Right = checkX + checkWidth
set box1Top = checkY
set box1Bottom = checkY + checkHeight
set box2Left = zongX				// ball is 8 x 7
set box2Right = zongX + 7
set box2Top = zongY
set box2Bottom = zongY + 6

unset colliding				// only set if inside each other

if (box1Top > box2Bottom) RETURN	// check if boxes to any of four sides
if (box2Top > box1Bottom) RETURN
if (box1Left > box2Right) RETURN
if (box2Left > box1Right) RETURN	

set colliding = 1			// if not to any of four sides, collision!
RETURN

//=======================================================
// After
// Leave the place like we found it
//=======================================================
#switch $Lesson8:$After
unset zongX
unset zongY
unset deltaX
unset deltaY
unset tpaddleX 			// top paddle
unset tpaddleY 
unset bpaddleX 			// bottom paddle
unset bpaddleY 
unset collisioncount1
unset collisioncount2
return