home *** CD-ROM | disk | FTP | other *** search
- class Ball extends BaseObject
- {
- var nSpeed;
- var nTempSpeedModifier;
- var nPermanentSpeedModifier;
- var nRadian;
- var bPassThroughAbility;
- var bHasTrailStars;
- var mcRef;
- var nTrailStarsDelay;
- static var sSTATE_LAUNCH_WAIT = "LaunchWait";
- static var sSTATE_LAUNCH_WAIT_PASSTHROUGH = "LWSuit";
- static var sSTATE_LAUNCH_WAIT_CHEWINGGUM = "LWGum";
- static var sSTATE_LAUNCH_WAIT_PASSPLUSGUM = "LWSuitGum";
- static var sSTATE_MOVING = "Moving";
- static var sSTATE_MOVING_PASSTHROUGH = "MSuit";
- static var sSTATE_MOVING_CHEWINGGUM = "MGum";
- static var sSTATE_MOVING_PASSPLUSGUM = "MSuitGum";
- static var nHIT_WITH_BOTTOM = 1;
- static var nHIT_WITH_TOP = 2;
- static var nHIT_WITH_LEFT = 3;
- static var nHIT_WITH_RIGHT = 4;
- static var nPROHIBED_ANGLE_RANGE_1_MIN = 165;
- static var nPROHIBED_ANGLE_RANGE_1_MAX = 195;
- static var nPROHIBED_ANGLE_RANGE_2_MIN = 345;
- static var nPROHIBED_ANGLE_RANGE_2_MAX = 360;
- static var nPROHIBED_ANGLE_RANGE_3_MIN = 0;
- static var nPROHIBED_ANGLE_RANGE_3_MAX = 15;
- static var nPROHIBED_ANGLE_RANGE_4_MIN = 75;
- static var nPROHIBED_ANGLE_RANGE_4_MAX = 105;
- static var nPROHIBED_ANGLE_RANGE_5_MIN = 255;
- static var nPROHIBED_ANGLE_RANGE_5_MAX = 285;
- static var nPADDLE_HIT_SPEED_BURST = 6;
- static var nBALL_HIT_SPEED_BURST = 3;
- static var nSPEED_BURST_REDUCE_SPEED = 0.4;
- static var nANGLE_RANDOM_ADDON_RAND = 10;
- static var nTRAIL_STARS_DELAY = 2;
- function Ball(_mcRef)
- {
- super(_mcRef);
- this.setState(Ball.sSTATE_LAUNCH_WAIT);
- this.nSpeed = 0;
- this.nTempSpeedModifier = 0;
- this.nPermanentSpeedModifier = 0;
- this.nRadian = undefined;
- this.bPassThroughAbility = false;
- this.bHasTrailStars = false;
- LevelManager.Instance.doAddListener(this);
- }
- function onGainPassThroughAbility()
- {
- this.bPassThroughAbility = true;
- switch(this.CurrentState)
- {
- case Ball.sSTATE_LAUNCH_WAIT:
- this.setState(Ball.sSTATE_LAUNCH_WAIT_PASSTHROUGH);
- break;
- case Ball.sSTATE_MOVING:
- this.setState(Ball.sSTATE_MOVING_PASSTHROUGH);
- break;
- case Ball.sSTATE_LAUNCH_WAIT_CHEWINGGUM:
- this.setState(Ball.sSTATE_LAUNCH_WAIT_PASSPLUSGUM);
- break;
- case Ball.sSTATE_MOVING_CHEWINGGUM:
- this.setState(Ball.sSTATE_MOVING_PASSPLUSGUM);
- }
- }
- function onBallHit(_oBall, _nHitSide)
- {
- var _loc2_ = this.Speeds;
- switch(_nHitSide)
- {
- case Ball.nHIT_WITH_BOTTOM:
- if(Library.Utils.MoreMath.getPolarity(_loc2_.y) == -1)
- {
- this.onBounceY();
- }
- break;
- case Ball.nHIT_WITH_TOP:
- if(Library.Utils.MoreMath.getPolarity(_loc2_.y) == 1)
- {
- this.onBounceY();
- }
- break;
- case Ball.nHIT_WITH_LEFT:
- if(Library.Utils.MoreMath.getPolarity(_loc2_.c) == -1)
- {
- this.onBounceX();
- }
- break;
- case Ball.nHIT_WITH_RIGHT:
- if(Library.Utils.MoreMath.getPolarity(_loc2_.c) == 1)
- {
- this.onBounceX();
- }
- }
- }
- function setPosition(_nPosX, _nPosY)
- {
- this.mcRef._x = _nPosX;
- this.mcRef._y = _nPosY;
- }
- function setAngle(_nAngle)
- {
- this.nRadian = Library.Utils.MoreMath.getRadianFromDegree(_nAngle);
- }
- function doAffectSpeed(_nSpeedMod)
- {
- this.nPermanentSpeedModifier += _nSpeedMod;
- this.bHasTrailStars = this.nPermanentSpeedModifier > 0;
- }
- function setSpeed(_nSpeed)
- {
- switch(this.CurrentState)
- {
- case Ball.sSTATE_LAUNCH_WAIT:
- this.setState(Ball.sSTATE_MOVING);
- break;
- case Ball.sSTATE_LAUNCH_WAIT_PASSTHROUGH:
- this.setState(Ball.sSTATE_MOVING_PASSTHROUGH);
- break;
- case Ball.sSTATE_LAUNCH_WAIT_CHEWINGGUM:
- this.setState(Ball.sSTATE_MOVING_CHEWINGGUM);
- break;
- case Ball.sSTATE_LAUNCH_WAIT_PASSPLUSGUM:
- this.setState(Ball.sSTATE_MOVING_PASSPLUSGUM);
- }
- this.nSpeed = _nSpeed;
- }
- function onChewingGumCatch()
- {
- switch(this.CurrentState)
- {
- case Ball.sSTATE_LAUNCH_WAIT:
- this.setState(Ball.sSTATE_LAUNCH_WAIT_CHEWINGGUM);
- break;
- case Ball.sSTATE_MOVING:
- this.setState(Ball.sSTATE_MOVING_CHEWINGGUM);
- break;
- case Ball.sSTATE_LAUNCH_WAIT_PASSTHROUGH:
- this.setState(Ball.sSTATE_LAUNCH_WAIT_PASSPLUSGUM);
- break;
- case Ball.sSTATE_MOVING_PASSTHROUGH:
- this.setState(Ball.sSTATE_MOVING_PASSPLUSGUM);
- }
- }
- function onChewingGumEnd()
- {
- switch(this.CurrentState)
- {
- case Ball.sSTATE_LAUNCH_WAIT_CHEWINGGUM:
- this.setState(Ball.sSTATE_LAUNCH_WAIT);
- break;
- case Ball.sSTATE_MOVING_CHEWINGGUM:
- this.setState(Ball.sSTATE_MOVING);
- break;
- case Ball.sSTATE_LAUNCH_WAIT_PASSPLUSGUM:
- this.setState(Ball.sSTATE_LAUNCH_WAIT_PASSTHROUGH);
- break;
- case Ball.sSTATE_MOVING_PASSPLUSGUM:
- this.setState(Ball.sSTATE_MOVING_PASSTHROUGH);
- }
- }
- function doDestroy()
- {
- LevelManager.Instance.doRemoveListener(this);
- super.doDestroy();
- }
- function get Angle()
- {
- return Library.Utils.MoreMath.getDegreeFromRadius(this.nRadian);
- }
- function get Speed()
- {
- return this.nSpeed;
- }
- function get Speeds()
- {
- var _loc2_ = new Object();
- if(this.CurrentState == Ball.sSTATE_MOVING || this.CurrentState == Ball.sSTATE_MOVING_PASSTHROUGH || this.CurrentState == Ball.sSTATE_MOVING_CHEWINGGUM || this.CurrentState == Ball.sSTATE_MOVING_PASSPLUSGUM)
- {
- var _loc3_ = Math.cos(this.nRadian) * (this.nSpeed + this.nPermanentSpeedModifier + this.nTempSpeedModifier);
- var _loc4_ = Math.sin(this.nRadian) * (this.nSpeed + this.nPermanentSpeedModifier + this.nTempSpeedModifier);
- _loc2_.x = _loc3_;
- _loc2_.y = _loc4_;
- }
- else
- {
- _loc2_.x = 0;
- _loc2_.y = 0;
- }
- return _loc2_;
- }
- function doMSuit()
- {
- this.doMoving();
- }
- function doMGum()
- {
- this.doMoving();
- }
- function doMSuitGum()
- {
- this.doMoving();
- }
- function doMoving()
- {
- this.doValidateAngle();
- this.nTempSpeedModifier = Library.Utils.MoreMath.getReachZero(this.nTempSpeedModifier,Ball.nSPEED_BURST_REDUCE_SPEED);
- var _loc8_ = this.Speeds;
- var _loc4_ = _loc8_.x;
- var _loc5_ = _loc8_.y;
- var _loc2_ = this.mcRef._x + _loc4_;
- var _loc3_ = this.mcRef._y + _loc5_;
- _loc3_ = this.doCheckTopBottom(_loc5_,_loc3_);
- _loc2_ = this.doCheckSides(_loc4_,_loc2_);
- var _loc6_ = this.doCheckPaddles(_loc4_,_loc5_,_loc2_,_loc3_);
- _loc2_ = _loc6_.nFutureX;
- _loc3_ = _loc6_.nFutureY;
- var _loc9_ = this.doCheckBlocks(_loc4_,_loc5_,_loc2_,_loc3_);
- _loc2_ = _loc9_.nFutureX;
- _loc3_ = _loc9_.nFutureY;
- var _loc7_ = this.doCheckBalls(_loc4_,_loc5_,_loc2_,_loc3_);
- _loc2_ = _loc7_.nFutureX;
- _loc3_ = _loc7_.nFutureY;
- if(this.bHasTrailStars)
- {
- this.doTrailStars();
- }
- this.mcRef._x = _loc2_;
- this.mcRef._y = _loc3_;
- }
- function doCheckPaddles(_nSpeedX, _nSpeedY, _nFutureX, _nFutureY)
- {
- var _loc2_ = LevelManager.Instance.getNearPaddlesForObject(this);
- for(var _loc9_ in _loc2_)
- {
- switch(Library.Utils.MoreMath.getPolarity(_nSpeedY))
- {
- case 1:
- if(this.getCollideBottom(_loc2_[_loc9_],_nFutureX,_nFutureY))
- {
- _nFutureY = _loc2_[_loc9_].Bounds.yMin - this.StateBounds.yMax;
- var _loc5_ = _loc2_[_loc9_].getBallHitReaction(this);
- if(_loc5_ == Paddle.nBALL_HIT_BOUNCE_BACK)
- {
- this.onBounceY();
- _loc2_[_loc9_].onPaddleBounce();
- var _loc6_ = _loc2_[_loc9_].getAffectedBounceAngleForBall(this);
- this.nRadian = Library.Utils.MoreMath.getRadianFromDegree(_loc6_);
- this.nTempSpeedModifier = Ball.nPADDLE_HIT_SPEED_BURST;
- }
- else if(_loc5_ == Paddle.nBALL_HIT_STICKS)
- {
- switch(this.CurrentState)
- {
- case Ball.sSTATE_MOVING:
- this.setState(Ball.sSTATE_LAUNCH_WAIT);
- break;
- case Ball.sSTATE_MOVING_PASSTHROUGH:
- this.setState(Ball.sSTATE_LAUNCH_WAIT_PASSTHROUGH);
- break;
- case Ball.sSTATE_MOVING_CHEWINGGUM:
- this.setState(Ball.sSTATE_LAUNCH_WAIT_CHEWINGGUM);
- break;
- case Ball.sSTATE_MOVING_PASSPLUSGUM:
- this.setState(Ball.sSTATE_LAUNCH_WAIT_PASSPLUSGUM);
- }
- _loc2_[_loc9_].onBallSticks(this);
- this.nSpeed = 0;
- }
- this.onPaddleTouch(_loc2_[_loc9_],true);
- }
- break;
- case -1:
- if(this.getCollideTop(_loc2_[_loc9_],_nFutureX,_nFutureY))
- {
- _nFutureY = _loc2_[_loc9_].Bounds.yMax - this.StateBounds.yMin;
- this.onBounceY();
- this.onPaddleTouch();
- }
- }
- switch(Library.Utils.MoreMath.getPolarity(_nSpeedX))
- {
- case 1:
- if(this.getCollideRight(_loc2_[_loc9_],_nFutureX,_nFutureY))
- {
- _nFutureX = _loc2_[_loc9_].Bounds.xMin - this.StateBounds.xMax;
- this.onBounceX();
- this.onPaddleTouch(_loc2_[_loc9_]);
- }
- break;
- case -1:
- if(this.getCollideLeft(_loc2_[_loc9_],_nFutureX,_nFutureY))
- {
- _nFutureX = _loc2_[_loc9_].Bounds.xMax - this.StateBounds.xMin;
- this.onBounceX();
- this.onPaddleTouch(_loc2_[_loc9_]);
- }
- }
- }
- return {nFutureX:_nFutureX,nFutureY:_nFutureY};
- }
- function doCheckBlocks(_nSpeedX, _nSpeedY, _nFutureX, _nFutureY)
- {
- var _loc2_ = LevelManager.Instance.getNearBlocksForObject(this);
- for(var _loc9_ in _loc2_)
- {
- var _loc5_ = false;
- switch(Library.Utils.MoreMath.getPolarity(_nSpeedY))
- {
- case 1:
- if(this.getCollideBottom(_loc2_[_loc9_],_nFutureX,_nFutureY))
- {
- _loc2_[_loc9_].onBallHit(this,Ball.nHIT_WITH_BOTTOM);
- var _loc6_ = false;
- if(_loc2_[_loc9_].StillAlive)
- {
- this.onBounceY();
- }
- else
- {
- if(!this.bPassThroughAbility)
- {
- this.onBounceY();
- }
- else
- {
- _loc6_ = false;
- }
- this.onBlockDestroy();
- }
- if(_loc6_)
- {
- _nFutureY = _loc2_[_loc9_].Bounds.yMin - this.StateBounds.yMax;
- }
- _loc5_ = true;
- }
- break;
- case -1:
- if(this.getCollideTop(_loc2_[_loc9_],_nFutureX,_nFutureY))
- {
- _loc2_[_loc9_].onBallHit(this,Ball.nHIT_WITH_TOP);
- _loc6_ = false;
- if(_loc2_[_loc9_].StillAlive)
- {
- this.onBounceY();
- }
- else
- {
- if(!this.bPassThroughAbility)
- {
- this.onBounceY();
- }
- else
- {
- _loc6_ = false;
- }
- this.onBlockDestroy();
- }
- if(_loc6_)
- {
- _nFutureY = _loc2_[_loc9_].Bounds.yMax - this.StateBounds.yMin;
- }
- _loc5_ = true;
- }
- }
- if(!_loc5_)
- {
- switch(Library.Utils.MoreMath.getPolarity(_nSpeedX))
- {
- case 1:
- if(this.getCollideRight(_loc2_[_loc9_],_nFutureX,_nFutureY))
- {
- _loc2_[_loc9_].onBallHit(this,Ball.nHIT_WITH_RIGHT);
- _loc6_ = false;
- if(_loc2_[_loc9_].StillAlive)
- {
- this.onBounceX();
- }
- else
- {
- if(!this.bPassThroughAbility)
- {
- this.onBounceX();
- }
- else
- {
- _loc6_ = false;
- }
- this.onBlockDestroy();
- }
- if(_loc6_)
- {
- _nFutureX = _loc2_[_loc9_].Bounds.xMin - this.StateBounds.xMax;
- }
- }
- break;
- case -1:
- if(this.getCollideLeft(_loc2_[_loc9_],_nFutureX,_nFutureY))
- {
- _loc2_[_loc9_].onBallHit(this,Ball.nHIT_WITH_LEFT);
- _loc6_ = false;
- if(_loc2_[_loc9_].StillAlive)
- {
- this.onBounceX();
- }
- else
- {
- if(!this.bPassThroughAbility)
- {
- this.onBounceX();
- }
- else
- {
- _loc6_ = false;
- }
- this.onBlockDestroy();
- }
- if(_loc6_)
- {
- _nFutureX = _loc2_[_loc9_].Bounds.xMax - this.StateBounds.xMin;
- }
- }
- }
- }
- }
- return {nFutureX:_nFutureX,nFutureY:_nFutureY};
- }
- function doCheckBalls(_nSpeedX, _nSpeedY, _nFutureX, _nFutureY)
- {
- var _loc2_ = LevelManager.Instance.getNearBallsForObject(this);
- for(var _loc8_ in _loc2_)
- {
- var _loc3_ = false;
- switch(Library.Utils.MoreMath.getPolarity(_nSpeedY))
- {
- case 1:
- if(this.getCollideBottom(_loc2_[_loc8_],_nFutureX,_nFutureY))
- {
- this.onBallHit(_loc2_[_loc8_],Ball.nHIT_WITH_TOP);
- _loc2_[_loc8_].onBallHit(this,Ball.nHIT_WITH_BOTTOM);
- _loc3_ = true;
- }
- break;
- case -1:
- if(this.getCollideTop(_loc2_[_loc8_],_nFutureX,_nFutureY))
- {
- this.onBallHit(_loc2_[_loc8_],Ball.nHIT_WITH_BOTTOM);
- _loc2_[_loc8_].onBallHit(this,Ball.nHIT_WITH_TOP);
- _loc3_ = true;
- }
- }
- if(!_loc3_)
- {
- switch(Library.Utils.MoreMath.getPolarity(_nSpeedX))
- {
- case 1:
- if(this.getCollideRight(_loc2_[_loc8_],_nFutureX,_nFutureY))
- {
- this.onBallHit(_loc2_[_loc8_],Ball.nHIT_WITH_LEFT);
- _loc2_[_loc8_].onBallHit(this,Ball.nHIT_WITH_RIGHT);
- }
- break;
- case -1:
- if(this.getCollideLeft(_loc2_[_loc8_],_nFutureX,_nFutureY))
- {
- this.onBallHit(_loc2_[_loc8_],Ball.nHIT_WITH_RIGHT);
- _loc2_[_loc8_].onBallHit(this,Ball.nHIT_WITH_LEFT);
- }
- }
- }
- }
- return {nFutureX:_nFutureX,nFutureY:_nFutureY};
- }
- function doCheckSides(_nSpeedX, _nFutureX)
- {
- switch(Library.Utils.MoreMath.getPolarity(_nSpeedX))
- {
- case 1:
- if(_nFutureX + this.StateBounds.xMax > LevelManager.nLIMITS_RIGHT)
- {
- this.onBounceX();
- this.onBounceSides();
- _nFutureX = LevelManager.nLIMITS_RIGHT - this.StateBounds.xMax;
- }
- break;
- case -1:
- if(_nFutureX + this.StateBounds.xMin < LevelManager.nLIMITS_LEFT)
- {
- this.onBounceX();
- this.onBounceSides();
- _nFutureX = LevelManager.nLIMITS_LEFT - this.StateBounds.xMin;
- }
- }
- return _nFutureX;
- }
- function doCheckTopBottom(_nSpeedY, _nFutureY)
- {
- switch(Library.Utils.MoreMath.getPolarity(_nSpeedY))
- {
- case 1:
- if(_nFutureY + this.StateBounds.yMax > LevelManager.nLIMITS_FLOOR)
- {
- LevelManager.Instance.onBallLost(this);
- }
- break;
- case -1:
- if(_nFutureY + this.StateBounds.yMin < LevelManager.nLIMITS_CEIL)
- {
- this.onBounceY();
- this.onBounceSides();
- _nFutureY = LevelManager.nLIMITS_CEIL - this.StateBounds.yMin;
- }
- }
- return _nFutureY;
- }
- function onBounceX(_bRandomAdd)
- {
- if(_bRandomAdd == undefined)
- {
- _bRandomAdd = true;
- }
- var _loc3_ = this.Speeds;
- var _loc2_ = _loc3_.x;
- var _loc4_ = _loc3_.y;
- _loc2_ *= -1;
- if(_bRandomAdd)
- {
- this.doAngleRandomAdd();
- }
- this.nRadian = Math.atan2(_loc4_,_loc2_);
- }
- function onBounceY(_bRandomAdd)
- {
- if(_bRandomAdd == undefined)
- {
- _bRandomAdd = true;
- }
- var _loc3_ = this.Speeds;
- var _loc4_ = _loc3_.x;
- var _loc2_ = _loc3_.y;
- _loc2_ *= -1;
- if(_bRandomAdd)
- {
- this.doAngleRandomAdd();
- }
- this.nRadian = Math.atan2(_loc2_,_loc4_);
- }
- function doAngleRandomAdd()
- {
- var _loc2_ = Library.Utils.MoreMath.getDegreeFromRadius(this.nRadian);
- _loc2_ += Library.Utils.MoreMath.getRandomRange(- Ball.nANGLE_RANDOM_ADDON_RAND,Ball.nANGLE_RANDOM_ADDON_RAND);
- this.nRadian = Library.Utils.MoreMath.getRadianFromDegree(_loc2_);
- }
- function doTrailStars()
- {
- this.nTrailStarsDelay = this.nTrailStarsDelay - 1;
- if(this.nTrailStarsDelay <= 0)
- {
- this.nTrailStarsDelay = Ball.nTRAIL_STARS_DELAY;
- this.doSpecificTrailStar();
- }
- }
- function doValidateAngle()
- {
- var _loc2_ = Library.Utils.MoreMath.getDegreeFromRadius(this.nRadian);
- _loc2_ = this.doCheckAngleGroup(_loc2_,Ball.nPROHIBED_ANGLE_RANGE_1_MIN,Ball.nPROHIBED_ANGLE_RANGE_1_MAX);
- _loc2_ = this.doCheckAngleGroup(_loc2_,Ball.nPROHIBED_ANGLE_RANGE_2_MIN,Ball.nPROHIBED_ANGLE_RANGE_2_MAX);
- _loc2_ = this.doCheckAngleGroup(_loc2_,Ball.nPROHIBED_ANGLE_RANGE_3_MIN,Ball.nPROHIBED_ANGLE_RANGE_3_MAX);
- _loc2_ = this.doCheckAngleGroup(_loc2_,Ball.nPROHIBED_ANGLE_RANGE_4_MIN,Ball.nPROHIBED_ANGLE_RANGE_4_MAX);
- _loc2_ = this.doCheckAngleGroup(_loc2_,Ball.nPROHIBED_ANGLE_RANGE_5_MIN,Ball.nPROHIBED_ANGLE_RANGE_5_MAX);
- this.nRadian = Library.Utils.MoreMath.getRadianFromDegree(_loc2_);
- }
- function doCheckAngleGroup(_nDegree, _nMin, _nMax)
- {
- if(_nDegree > _nMin && _nDegree < _nMax)
- {
- var _loc4_ = _nDegree - (_nMax + _nMin) / 2;
- switch(Library.Utils.MoreMath.getPolarity(_loc4_))
- {
- case 1:
- _nDegree = _nMax;
- break;
- case -1:
- default:
- _nDegree = _nMin;
- }
- }
- return _nDegree;
- }
- function doSpecificTrailStar()
- {
- }
- function onBlockDestroy()
- {
- }
- function onBounceSides()
- {
- }
- function onPaddleTouch(_oPaddle, _bBounceTop)
- {
- }
- }
-