anchor.diff:  			..top = posY
   			..width = width
   			..height = height;
  +	}
  +
  +	updateLadderStatus(double dt) {
  +		if(doPhysicsApply && inputManager.upKey == true) {
  +			// moving up
  +
  +			bool found = false;
  +			Rectangle playerRect = new Rectangle(posX,posY+currentStreet.streetData['dynamic']['ground_y'],width,height-15);
  +			for(Ladder ladder in currentStreet.ladders) {
  +				if(intersect(ladder.bounds,playerRect)) {
  +					// touching a ladder
  +
  +					if(playerRect.top+playerRect.height < ladder.bounds.top) {
  +						//if our feet are above the ladder, stop climbing
  +						break;
  +					}
  +
  +					posY -= speed/4 * dt;
  +					climbingUp = true;
  +					activeClimb = true;
  +					jumping = false;
  +					found = true;
  +					break;
  +				}
  +			}
  +			if(!found) {
  +				// not touching a ladder
  +				climbingUp = false;
  +				climbingDown = false;
  +				activeClimb = false;
  +			}
  +		}
  +
  +		if(doPhysicsApply && inputManager.downKey == true) {
  +			// moving down
  +
  +			bool found = false;
  +			Rectangle playerRect = new Rectangle(posX,posY+currentStreet.streetData['dynamic']['ground_y'],width,height);
  +			for(Ladder ladder in currentStreet.ladders) {
  +				if(intersect(ladder.bounds,playerRect)) {
  +					// touching a ladder
  +
  +					if(playerRect.top+playerRect.height > ladder.bounds.top+ladder.bounds.height) {
  +						//if our feet are below the ladder, stop climbing
  +						break;
  +					}
  +
  +					posY += speed/4 * dt;
  +					climbingDown = true;
  +					activeClimb = true;
  +					jumping = false;
  +					found = true;
  +					break;
  +				}
  +			}
  +			if(!found) {
  +				// not touching a ladder
  +				climbingDown = false;
  +				climbingUp = false;
  +				activeClimb = false;
  +			}
  +		}
  +
  +		if(inputManager.rightKey == true || inputManager.leftKey == true) {
  +			Rectangle playerRect = new Rectangle(posX,posY+currentStreet.streetData['dynamic']['ground_y'],width + 20,height + 20);
  +			for(Ladder ladder in currentStreet.ladders) {
  +				if (!intersect(ladder.bounds, playerRect)) {
  +					climbingDown = false;
  +					climbingUp = false;
  +					activeClimb = false;
  +				}
  +			}
  +		}
   	}
   
   	void render()
  
positive.code: 
  		//needs acceleration, some gravity const somewhere
  		//for jumps/falling
  		if(doPhysicsApply && !climbingUp && !climbingDown)
  		{
  			yVel -= yAccel * dt;
  			posY += yVel * dt;
  		}
  		else
  		{
  			if(inputManager.downKey == true)
  				posY += speed * dt;
  			if(inputManager.upKey == true)
  				posY -= speed * dt;
  		}
  
  		if(posX < 0)
  			posX = 0.0;
  		if(posX > currentStreet.bounds.width - width)
  			posX = currentStreet.bounds.width - width;
  
  		//check for collisions with platforms
  		if(doPhysicsApply && !climbingDown && !climbingUp && yVel >= 0)
  		{
  			num x = posX+width/2;
  			Platform bestPlatform = _getBestPlatform(cameFrom);
  
  			if(bestPlatform != null)
  			{
  				num goingTo = posY+height+currentStreet.streetData['dynamic']['ground_y'];
  				num slope = (bestPlatform.end.y-bestPlatform.start.y)/(bestPlatform.end.x-bestPlatform.start.x);
  				num yInt = bestPlatform.start.y - slope*bestPlatform.start.x;
  				num lineY = slope*x+yInt;
  
  				if(goingTo >= lineY)
  				{
  					posY = lineY-height-currentStreet.streetData['dynamic']['ground_y'];
  					yVel = 0;
  					jumping = false;
  
negative.code: 				jumpTimer = null;
  				audio.playSound('tripleJump');
  			}
  			else {
  				// normal jump
  				jumpcount++;
  				yVel = -1000 * jumpMultiplier;
  