mirror of
				https://github.com/KevinMidboe/linguist.git
				synced 2025-10-29 17:50:22 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			1051 lines
		
	
	
		
			26 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			1051 lines
		
	
	
		
			26 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
// Originally from /spelunky/Scripts/Platform Engine/characterStepEvent.gml in the Spelunky Community Update Project
 | 
						|
 | 
						|
/**********************************************************************************
 | 
						|
    Copyright (c) 2008, 2009 Derek Yu and Mossmouth, LLC
 | 
						|
    
 | 
						|
    This file is part of Spelunky.
 | 
						|
 | 
						|
    You can redistribute and/or modify Spelunky, including its source code, under
 | 
						|
    the terms of the Spelunky User License.
 | 
						|
 | 
						|
    Spelunky is distributed in the hope that it will be entertaining and useful,
 | 
						|
    but WITHOUT WARRANTY. Please see the Spelunky User License for more details.
 | 
						|
 | 
						|
    The Spelunky User License should be available in "Game Information", which
 | 
						|
    can be found in the Resource Explorer, or as an external file called COPYING.
 | 
						|
    If not, please obtain a new copy of Spelunky from <http://spelunkyworld.com/>
 | 
						|
    
 | 
						|
***********************************************************************************/
 | 
						|
 | 
						|
/*
 | 
						|
This script should be placed in the step event for the platform character.
 | 
						|
It updates the keys used by the character, moves all of the solids, moves the
 | 
						|
character, sets the sprite index, and sets the animation speed for the sprite.
 | 
						|
*/
 | 
						|
hangCountMax = 3;
 | 
						|
 | 
						|
//////////////////////////////////////
 | 
						|
// KEYS
 | 
						|
//////////////////////////////////////
 | 
						|
 | 
						|
kLeft = checkLeft();
 | 
						|
 | 
						|
if (kLeft) kLeftPushedSteps += 1;
 | 
						|
else kLeftPushedSteps = 0;
 | 
						|
  
 | 
						|
kLeftPressed = checkLeftPressed();
 | 
						|
kLeftReleased = checkLeftReleased();
 | 
						|
  
 | 
						|
kRight = checkRight();
 | 
						|
  
 | 
						|
if (kRight) kRightPushedSteps += 1;
 | 
						|
else kRightPushedSteps = 0;
 | 
						|
  
 | 
						|
kRightPressed = checkRightPressed();
 | 
						|
kRightReleased = checkRightReleased();
 | 
						|
  
 | 
						|
kUp = checkUp();
 | 
						|
kDown = checkDown();
 | 
						|
  
 | 
						|
//key "run"
 | 
						|
if canRun
 | 
						|
    kRun = 0;
 | 
						|
// kRun=runKey
 | 
						|
else
 | 
						|
    kRun=0
 | 
						|
  
 | 
						|
kJump = checkJump();
 | 
						|
kJumpPressed = checkJumpPressed();
 | 
						|
kJumpReleased = checkJumpReleased();
 | 
						|
  
 | 
						|
if (cantJump > 0)
 | 
						|
{
 | 
						|
    kJump = 0;
 | 
						|
    kJumpPressed = 0;
 | 
						|
    kJumpReleased = 0;
 | 
						|
    cantJump -= 1;
 | 
						|
}
 | 
						|
else
 | 
						|
{
 | 
						|
    if (global.isTunnelMan and
 | 
						|
        sprite_index == sTunnelAttackL and
 | 
						|
        !holdItem)
 | 
						|
    {
 | 
						|
        kJump = 0;
 | 
						|
        kJumpPressed = 0;
 | 
						|
        kJumpReleased = 0;
 | 
						|
        cantJump -= 1;
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
kAttack = checkAttack();
 | 
						|
kAttackPressed = checkAttackPressed();
 | 
						|
kAttackReleased = checkAttackReleased();
 | 
						|
 | 
						|
kItemPressed = checkItemPressed();
 | 
						|
 | 
						|
xPrev = x;
 | 
						|
yPrev = y;
 | 
						|
 | 
						|
if (stunned or dead)
 | 
						|
{
 | 
						|
    kLeft = false;
 | 
						|
    kLeftPressed = false;
 | 
						|
    kLeftReleased = false;
 | 
						|
    kRight = false;
 | 
						|
    kRightPressed = false;
 | 
						|
    kRightReleased = false;
 | 
						|
    kUp = false;
 | 
						|
    kDown = false;
 | 
						|
    kJump = false;
 | 
						|
    kJumpPressed = false;
 | 
						|
    kJumpReleased = false;
 | 
						|
    kAttack = false;
 | 
						|
    kAttackPressed = false;
 | 
						|
    kAttackReleased = false;
 | 
						|
    kItemPressed = false;
 | 
						|
}
 | 
						|
 | 
						|
//////////////////////////////////////////
 | 
						|
// Collisions
 | 
						|
//////////////////////////////////////////
 | 
						|
 | 
						|
colSolidLeft = false;
 | 
						|
colSolidRight = false;
 | 
						|
colLeft = false;
 | 
						|
colRight = false;
 | 
						|
colTop = false;
 | 
						|
colBot = false;
 | 
						|
colLadder = false;
 | 
						|
colPlatBot = false;
 | 
						|
colPlat = false;
 | 
						|
colWaterTop = false;
 | 
						|
colIceBot = false;
 | 
						|
runKey = false;
 | 
						|
if (isCollisionMoveableSolidLeft(1)) colSolidLeft = true;
 | 
						|
if (isCollisionMoveableSolidRight(1)) colSolidRight = true;
 | 
						|
if (isCollisionLeft(1)) colLeft = true;
 | 
						|
if (isCollisionRight(1)) colRight = true;
 | 
						|
if (isCollisionTop(1)) colTop = true;
 | 
						|
if (isCollisionBottom(1)) colBot = true;
 | 
						|
if (isCollisionLadder()) colLadder = true;
 | 
						|
if (isCollisionPlatformBottom(1)) colPlatBot = true;
 | 
						|
if (isCollisionPlatform()) colPlat = true;
 | 
						|
if (isCollisionWaterTop(1)) colWaterTop = true;
 | 
						|
if (collision_point(x, y+8, oIce, 0, 0)) colIceBot = true;
 | 
						|
if (checkRun())
 | 
						|
{
 | 
						|
    runHeld = 100;
 | 
						|
    runKey = true;
 | 
						|
}
 | 
						|
 | 
						|
if (checkAttack() and not whipping)
 | 
						|
{
 | 
						|
    runHeld += 1;
 | 
						|
    runKey = true;
 | 
						|
}
 | 
						|
 | 
						|
if (not runKey or (not kLeft and not kRight)) runHeld = 0;
 | 
						|
 | 
						|
// allows the character to run left and right
 | 
						|
// if state!=DUCKING and state!=LOOKING_UP and state!=CLIMBING
 | 
						|
if (state != CLIMBING and state != HANGING)
 | 
						|
{
 | 
						|
    if (kLeftReleased and approximatelyZero(xVel)) xAcc -= 0.5
 | 
						|
    if (kRightReleased and approximatelyZero(xVel)) xAcc += 0.5
 | 
						|
    
 | 
						|
    if (kLeft and not kRight)
 | 
						|
    {
 | 
						|
        if (colSolidLeft)
 | 
						|
        {
 | 
						|
            // xVel = 3;
 | 
						|
            if (platformCharacterIs(ON_GROUND) and state != DUCKING)
 | 
						|
            {
 | 
						|
                xAcc -= 1;
 | 
						|
                pushTimer += 10;
 | 
						|
                //if (not SS_IsSoundPlaying(global.sndPush)) playSound(global.sndPush);
 | 
						|
            }
 | 
						|
        }
 | 
						|
        else if (kLeftPushedSteps > 2) and (facing=LEFT or approximatelyZero(xVel))
 | 
						|
        {
 | 
						|
            xAcc -= runAcc;
 | 
						|
        }
 | 
						|
        facing = LEFT;
 | 
						|
        //if (platformCharacterIs(ON_GROUND) and abs(xVel) > 0 and alarm[3] < 1) alarm[3] = floor(16/-xVel);
 | 
						|
    }
 | 
						|
  
 | 
						|
    if (kRight and not kLeft)
 | 
						|
    {
 | 
						|
        if (colSolidRight)
 | 
						|
        {
 | 
						|
            // xVel = 3;
 | 
						|
            if (platformCharacterIs(ON_GROUND) and state != DUCKING)
 | 
						|
            {
 | 
						|
                xAcc += 1;
 | 
						|
                pushTimer += 10;
 | 
						|
                //if (not SS_IsSoundPlaying(global.sndPush)) playSound(global.sndPush);
 | 
						|
            }
 | 
						|
        }
 | 
						|
        else if (kRightPushedSteps > 2 or colSolidLeft) and (facing=RIGHT or approximatelyZero(xVel))
 | 
						|
        {
 | 
						|
            xAcc += runAcc;
 | 
						|
        }
 | 
						|
        facing = RIGHT;
 | 
						|
        //if (platformCharacterIs(ON_GROUND) and abs(xVel) > 0 and alarm[3] < 1) alarm[3] = floor(16/xVel);
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
/******************************************
 | 
						|
 | 
						|
  LADDERS
 | 
						|
  
 | 
						|
*******************************************/
 | 
						|
 | 
						|
if (state == CLIMBING)
 | 
						|
{
 | 
						|
    if (instance_exists(oCape))
 | 
						|
    {
 | 
						|
        oCape.open = false;
 | 
						|
    }
 | 
						|
    kJumped = false;
 | 
						|
    ladderTimer = 10;
 | 
						|
    ladder = collision_point(x, y, oLadder, 0, 0);
 | 
						|
    if (ladder) x = ladder.x + 8;
 | 
						|
 | 
						|
    if (kLeft) facing = LEFT;
 | 
						|
    else if (kRight) facing = RIGHT;
 | 
						|
    if (kUp)
 | 
						|
    {
 | 
						|
        if (collision_point(x, y-8, oLadder, 0, 0) or collision_point(x, y-8, oLadderTop, 0, 0))
 | 
						|
        {
 | 
						|
            yAcc -= climbAcc;
 | 
						|
            if (alarm[2] < 1) alarm[2] = 8;
 | 
						|
        }
 | 
						|
    }
 | 
						|
    else if (kDown)
 | 
						|
    {
 | 
						|
        if (collision_point(x, y+8, oLadder, 0, 0) or collision_point(x, y+8, oLadderTop, 0, 0))
 | 
						|
        {
 | 
						|
            yAcc += climbAcc;
 | 
						|
            if (alarm[2] < 1) alarm[2] = 8;
 | 
						|
        }
 | 
						|
        else
 | 
						|
            state = FALLING;
 | 
						|
        if (colBot) state = STANDING;
 | 
						|
    }
 | 
						|
    
 | 
						|
    if (kJumpPressed and not whipping)
 | 
						|
    {
 | 
						|
        if (kLeft)
 | 
						|
            xVel = -departLadderXVel;
 | 
						|
        else if (kRight)
 | 
						|
            xVel = departLadderXVel;
 | 
						|
        else
 | 
						|
            xVel = 0;
 | 
						|
        yAcc += departLadderYVel;
 | 
						|
        state = JUMPING;
 | 
						|
        jumpButtonReleased = 0;
 | 
						|
        jumpTime = 0;
 | 
						|
        ladderTimer = 5;
 | 
						|
    }
 | 
						|
}
 | 
						|
else
 | 
						|
{
 | 
						|
     if (ladderTimer > 0) ladderTimer -= 1;
 | 
						|
}
 | 
						|
 | 
						|
if (platformCharacterIs(IN_AIR) and state != HANGING)
 | 
						|
{
 | 
						|
    yAcc += gravityIntensity;
 | 
						|
}
 | 
						|
 | 
						|
// Player has landed
 | 
						|
if ((colBot or colPlatBot) and platformCharacterIs(IN_AIR) and yVel >= 0)
 | 
						|
{
 | 
						|
    if (not colPlat or colBot)
 | 
						|
    {
 | 
						|
        yVel = 0;
 | 
						|
        yAcc = 0;
 | 
						|
        state = RUNNING;
 | 
						|
        jumps = 0;
 | 
						|
    }
 | 
						|
    //playSound(global.sndLand);
 | 
						|
}
 | 
						|
if ((colBot or colPlatBot) and not colPlat) yVel = 0;
 | 
						|
 | 
						|
// Player has just walked off of the edge of a solid
 | 
						|
if (colBot == 0 and (not colPlatBot or colPlat) and platformCharacterIs(ON_GROUND))
 | 
						|
{
 | 
						|
    state = FALLING;
 | 
						|
    yAcc += grav;
 | 
						|
    kJumped = true;
 | 
						|
    if (global.hasGloves) hangCount = 5;
 | 
						|
}
 | 
						|
 | 
						|
if (colTop)
 | 
						|
{
 | 
						|
    if (dead or stunned) yVel = -yVel * 0.8;
 | 
						|
    else if (state == JUMPING) yVel = abs(yVel*0.3)
 | 
						|
}
 | 
						|
 | 
						|
if (colLeft and facing == LEFT) or (colRight and facing == RIGHT)
 | 
						|
{
 | 
						|
    if (dead or stunned) xVel = -xVel * 0.5;
 | 
						|
    else xVel = 0;
 | 
						|
}
 | 
						|
 | 
						|
/******************************************
 | 
						|
 | 
						|
  JUMPING
 | 
						|
  
 | 
						|
*******************************************/
 | 
						|
 | 
						|
if (kJumpReleased and platformCharacterIs(IN_AIR))
 | 
						|
{
 | 
						|
    kJumped = true;
 | 
						|
}
 | 
						|
else if (platformCharacterIs(ON_GROUND))
 | 
						|
{
 | 
						|
    oCape.open = false;
 | 
						|
    kJumped = false;
 | 
						|
}
 | 
						|
 | 
						|
if (kJumpPressed and collision_point(x, y, oWeb, 0, 0))
 | 
						|
{
 | 
						|
    obj = instance_place(x, y, oWeb);
 | 
						|
    obj.life -= 1;
 | 
						|
    yAcc += initialJumpAcc * 2;
 | 
						|
    yVel -= 3;
 | 
						|
    xAcc += xVel/2;
 | 
						|
    
 | 
						|
    state = JUMPING;
 | 
						|
    jumpButtonReleased = 0;
 | 
						|
    jumpTime = 0;
 | 
						|
    
 | 
						|
    grav = gravNorm;
 | 
						|
}
 | 
						|
else if (kJumpPressed and colWaterTop)
 | 
						|
{
 | 
						|
    yAcc += initialJumpAcc * 2;
 | 
						|
    yVel -= 3;
 | 
						|
    xAcc += xVel/2;
 | 
						|
    
 | 
						|
    state = JUMPING;
 | 
						|
    jumpButtonReleased = 0;
 | 
						|
    jumpTime = 0;
 | 
						|
    
 | 
						|
    grav = gravNorm;
 | 
						|
}
 | 
						|
else if (global.hasCape and kJumpPressed and kJumped and platformCharacterIs(IN_AIR))
 | 
						|
{
 | 
						|
    if (not oCape.open) oCape.open = true;
 | 
						|
    else oCape.open = false;
 | 
						|
}
 | 
						|
else if (global.hasJetpack and kJump and kJumped and platformCharacterIs(IN_AIR) and jetpackFuel > 0)
 | 
						|
{
 | 
						|
    yAcc += initialJumpAcc;
 | 
						|
    yVel = -1;
 | 
						|
    jetpackFuel -= 1;
 | 
						|
    if (alarm[10] < 1) alarm[10] = 3;
 | 
						|
    
 | 
						|
    state = JUMPING;
 | 
						|
    jumpButtonReleased = 0;
 | 
						|
    jumpTime = 0;
 | 
						|
    
 | 
						|
    grav = 0;
 | 
						|
}
 | 
						|
else if (platformCharacterIs(ON_GROUND) and kJumpPressed and fallTimer == 0)
 | 
						|
{
 | 
						|
    if (xVel > 3 or xVel < -3)
 | 
						|
    {
 | 
						|
        yAcc += initialJumpAcc * 2;
 | 
						|
        xAcc += xVel * 2;
 | 
						|
    }
 | 
						|
    else
 | 
						|
    {
 | 
						|
        yAcc += initialJumpAcc * 2;
 | 
						|
        xAcc += xVel/2;
 | 
						|
    }
 | 
						|
    
 | 
						|
    if (global.hasJordans)
 | 
						|
    {
 | 
						|
        yAcc *= 3;
 | 
						|
        yAccLimit = 12;
 | 
						|
        grav = 0.5;
 | 
						|
    }
 | 
						|
    else if (global.hasSpringShoes) yAcc *= 1.5;
 | 
						|
    else
 | 
						|
    {
 | 
						|
        yAccLimit = 6;
 | 
						|
        grav = gravNorm;
 | 
						|
    }
 | 
						|
    
 | 
						|
    playSound(global.sndJump);
 | 
						|
    
 | 
						|
    pushTimer = 0;
 | 
						|
 | 
						|
    // the "state" gets changed to JUMPING later on in the code
 | 
						|
    state = FALLING;
 | 
						|
    // "variable jumping" states
 | 
						|
    jumpButtonReleased = 0;
 | 
						|
    jumpTime = 0;
 | 
						|
}
 | 
						|
 | 
						|
if (jumpTime < jumpTimeTotal) jumpTime += 1;
 | 
						|
//let the character continue to jump
 | 
						|
if (kJump == 0) jumpButtonReleased = 1;
 | 
						|
if (jumpButtonReleased) jumpTime = jumpTimeTotal;
 | 
						|
 | 
						|
gravityIntensity = (jumpTime/jumpTimeTotal) * grav;
 | 
						|
 | 
						|
if (kUp and platformCharacterIs(ON_GROUND) and not colLadder)
 | 
						|
{
 | 
						|
    looking = UP;
 | 
						|
    if (xVel == 0 and xAcc == 0) state = LOOKING_UP;
 | 
						|
}
 | 
						|
else looking = 0;
 | 
						|
 | 
						|
if (not kUp and state == LOOKING_UP)
 | 
						|
{
 | 
						|
    state=STANDING
 | 
						|
}
 | 
						|
 | 
						|
/******************************************
 | 
						|
 | 
						|
  HANGING
 | 
						|
  
 | 
						|
*******************************************/
 | 
						|
 | 
						|
if (not colTop)
 | 
						|
{
 | 
						|
if (global.hasGloves and yVel > 0)
 | 
						|
{
 | 
						|
    if (hangCount == 0 and y > 16 and !platformCharacterIs(ON_GROUND) and kRight and colRight and
 | 
						|
        (collision_point(x+9, y-5, oSolid, 0, 0) or collision_point(x+9, y-6, oSolid, 0, 0)))
 | 
						|
    {
 | 
						|
        state = HANGING;
 | 
						|
        move_snap(1, 8);
 | 
						|
        yVel = 0;
 | 
						|
        yAcc = 0;
 | 
						|
        grav = 0;
 | 
						|
    }
 | 
						|
    else if (hangCount == 0 and y > 16 and !platformCharacterIs(ON_GROUND) and kLeft and colLeft and
 | 
						|
        (collision_point(x-9, y-5, oSolid, 0, 0) or collision_point(x-9, y-6, oSolid, 0, 0)))
 | 
						|
    {
 | 
						|
        state = HANGING;
 | 
						|
        move_snap(1, 8);
 | 
						|
        yVel = 0;
 | 
						|
        yAcc = 0;
 | 
						|
        grav = 0;
 | 
						|
    }
 | 
						|
}
 | 
						|
else if (hangCount == 0 and y > 16 and !platformCharacterIs(ON_GROUND) and kRight and colRight and
 | 
						|
        (collision_point(x+9, y-5, oTree, 0, 0) or collision_point(x+9, y-6, oTree, 0, 0)))
 | 
						|
{
 | 
						|
    state = HANGING;
 | 
						|
    move_snap(1, 8);
 | 
						|
    yVel = 0;
 | 
						|
    yAcc = 0;
 | 
						|
    grav = 0;
 | 
						|
}
 | 
						|
else if (hangCount == 0 and y > 16 and !platformCharacterIs(ON_GROUND) and kLeft and colLeft and
 | 
						|
        (collision_point(x-9, y-5, oTree, 0, 0) or collision_point(x-9, y-6, oTree, 0, 0)))
 | 
						|
{
 | 
						|
    state = HANGING;
 | 
						|
    move_snap(1, 8);
 | 
						|
    yVel = 0;
 | 
						|
    yAcc = 0;
 | 
						|
    grav = 0;
 | 
						|
}
 | 
						|
else if (hangCount == 0 and y > 16 and !platformCharacterIs(ON_GROUND) and kRight and colRight and
 | 
						|
    (collision_point(x+9, y-5, oSolid, 0, 0) or collision_point(x+9, y-6, oSolid, 0, 0)) and
 | 
						|
    not collision_point(x+9, y-9, oSolid, 0, 0) and not collision_point(x, y+9, oSolid, 0, 0))
 | 
						|
{
 | 
						|
  state = HANGING;
 | 
						|
  move_snap(1, 8);
 | 
						|
  yVel = 0;
 | 
						|
  yAcc = 0;
 | 
						|
  grav = 0;
 | 
						|
}
 | 
						|
else if (hangCount == 0 and y > 16 and !platformCharacterIs(ON_GROUND) and kLeft and colLeft and
 | 
						|
    (collision_point(x-9, y-5, oSolid, 0, 0) or collision_point(x-9, y-6, oSolid, 0, 0)) and
 | 
						|
    not collision_point(x-9, y-9, oSolid, 0, 0) and not collision_point(x, y+9, oSolid, 0, 0))
 | 
						|
{
 | 
						|
  state = HANGING;
 | 
						|
  move_snap(1, 8);
 | 
						|
  yVel = 0;
 | 
						|
  yAcc = 0;
 | 
						|
  grav = 0;
 | 
						|
}
 | 
						|
 | 
						|
if (hangCount == 0 and y > 16 and !platformCharacterIs(ON_GROUND) and state == FALLING and
 | 
						|
    (collision_point(x, y-5, oArrow, 0, 0) or collision_point(x, y-6, oArrow, 0, 0)) and
 | 
						|
    not collision_point(x, y-9, oArrow, 0, 0) and not collision_point(x, y+9, oArrow, 0, 0))
 | 
						|
{
 | 
						|
    obj = instance_nearest(x, y-5, oArrow);
 | 
						|
    if (obj.stuck)
 | 
						|
    {
 | 
						|
        state = HANGING;
 | 
						|
        // move_snap(1, 8);
 | 
						|
        yVel = 0;
 | 
						|
        yAcc = 0;
 | 
						|
        grav = 0;
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
/*
 | 
						|
if (hangCount == 0 and y > 16 and !platformCharacterIs(ON_GROUND) and state == FALLING and
 | 
						|
    (collision_point(x, y-5, oTreeBranch, 0, 0) or collision_point(x, y-6, oTreeBranch, 0, 0)) and
 | 
						|
    not collision_point(x, y-9, oTreeBranch, 0, 0) and not collision_point(x, y+9, oTreeBranch, 0, 0))
 | 
						|
{
 | 
						|
  state = HANGING;
 | 
						|
  // move_snap(1, 8);
 | 
						|
  yVel = 0;
 | 
						|
  yAcc = 0;
 | 
						|
  grav = 0;
 | 
						|
}
 | 
						|
*/
 | 
						|
 | 
						|
}
 | 
						|
 | 
						|
if (hangCount > 0) hangCount -= 1;
 | 
						|
 | 
						|
if (state == HANGING)
 | 
						|
{
 | 
						|
    if (instance_exists(oCape)) oCape.open = false;
 | 
						|
    kJumped = false;
 | 
						|
    
 | 
						|
    if (kDown and kJumpPressed)
 | 
						|
    {
 | 
						|
        grav = gravNorm;
 | 
						|
        state = FALLING;
 | 
						|
        yAcc -= grav;
 | 
						|
        hangCount = 5;
 | 
						|
        if (global.hasGloves) hangCount = 10;
 | 
						|
    }
 | 
						|
    else if (kJumpPressed)
 | 
						|
    {
 | 
						|
        grav = gravNorm;
 | 
						|
        if ((facing == RIGHT and kLeft) or (facing == LEFT and kRight))
 | 
						|
        {
 | 
						|
            state = FALLING;
 | 
						|
            yAcc -= grav;
 | 
						|
        }
 | 
						|
        else
 | 
						|
        {
 | 
						|
            state = JUMPING;
 | 
						|
            yAcc += initialJumpAcc * 2;
 | 
						|
            if (facing == RIGHT) x -= 2;
 | 
						|
            else x += 2;
 | 
						|
        }
 | 
						|
        hangCount = hangCountMax;
 | 
						|
    }
 | 
						|
    
 | 
						|
    if ((facing == LEFT and not isCollisionLeft(2)) or
 | 
						|
        (facing == RIGHT and not isCollisionRight(2)))
 | 
						|
    {
 | 
						|
        grav = gravNorm;
 | 
						|
        state = FALLING;
 | 
						|
        yAcc -= grav;
 | 
						|
        hangCount = 4;
 | 
						|
    }
 | 
						|
}
 | 
						|
else
 | 
						|
{
 | 
						|
    grav = gravNorm;
 | 
						|
}
 | 
						|
 | 
						|
// pressing down while standing
 | 
						|
if (kDown and platformCharacterIs(ON_GROUND) and not whipping)
 | 
						|
{
 | 
						|
    if (colBot)
 | 
						|
    {
 | 
						|
        state = DUCKING;
 | 
						|
    }
 | 
						|
    else if colPlatBot
 | 
						|
    {
 | 
						|
        // climb down ladder if possible, else jump down
 | 
						|
        fallTimer = 0;
 | 
						|
        if (not colBot)
 | 
						|
        {
 | 
						|
            ladder = 0;
 | 
						|
            ladder = instance_place(x, y+16, oLadder);
 | 
						|
            if (instance_exists(ladder))
 | 
						|
            {
 | 
						|
                if (abs(x-(ladder.x+8)) < 4)
 | 
						|
                {
 | 
						|
                    x = ladder.x + 8;
 | 
						|
 | 
						|
                    xVel = 0;
 | 
						|
                    yVel = 0;
 | 
						|
                    xAcc = 0;
 | 
						|
                    yAcc = 0;
 | 
						|
                    state = CLIMBING;
 | 
						|
                }
 | 
						|
            }
 | 
						|
            else
 | 
						|
            {
 | 
						|
                y += 1;
 | 
						|
                state = FALLING;
 | 
						|
                yAcc += grav;
 | 
						|
            }
 | 
						|
        }
 | 
						|
        else
 | 
						|
        {
 | 
						|
            //the character can't move down because there is a solid in the way
 | 
						|
            state = RUNNING;
 | 
						|
        }
 | 
						|
    }
 | 
						|
}
 | 
						|
if (not kDown and state == DUCKING)
 | 
						|
{
 | 
						|
    state = STANDING;
 | 
						|
    xVel = 0;
 | 
						|
    xAcc = 0;
 | 
						|
}
 | 
						|
if (xVel == 0 and xAcc == 0 and state == RUNNING)
 | 
						|
{
 | 
						|
    state = STANDING;
 | 
						|
}
 | 
						|
if (xAcc != 0 and state == STANDING)
 | 
						|
{
 | 
						|
    state = RUNNING;
 | 
						|
}
 | 
						|
if (yVel < 0 and platformCharacterIs(IN_AIR) and state != HANGING)
 | 
						|
{
 | 
						|
    state = JUMPING;
 | 
						|
}
 | 
						|
if (yVel > 0 and platformCharacterIs(IN_AIR) and state != HANGING)
 | 
						|
{
 | 
						|
    state = FALLING;
 | 
						|
    setCollisionBounds(-5, -6, 5, 8);
 | 
						|
}
 | 
						|
else setCollisionBounds(-5, -8, 5, 8);
 | 
						|
 | 
						|
// CLIMB LADDER
 | 
						|
colPointLadder = collision_point(x, y, oLadder, 0, 0) or collision_point(x, y, oLadderTop, 0, 0);
 | 
						|
 | 
						|
if ((kUp and platformCharacterIs(IN_AIR) and collision_point(x, y-8, oLadder, 0, 0) and ladderTimer == 0) or
 | 
						|
    (kUp and colPointLadder and ladderTimer == 0) or
 | 
						|
    (kDown and colPointLadder and ladderTimer == 0 and platformCharacterIs(ON_GROUND) and collision_point(x, y+9, oLadderTop, 0, 0) and xVel == 0))
 | 
						|
{
 | 
						|
    ladder = 0;
 | 
						|
    ladder = instance_place(x, y-8, oLadder);
 | 
						|
    if (instance_exists(ladder))
 | 
						|
    {
 | 
						|
        if (abs(x-(ladder.x+8)) < 4)
 | 
						|
        {
 | 
						|
            x = ladder.x + 8;
 | 
						|
            if (not collision_point(x, y, oLadder, 0, 0) and
 | 
						|
                not collision_point(x, y, oLadderTop, 0, 0))
 | 
						|
            {
 | 
						|
                y = ladder.y + 14;
 | 
						|
            }
 | 
						|
 | 
						|
            xVel = 0;
 | 
						|
            yVel = 0;
 | 
						|
            xAcc = 0;
 | 
						|
            yAcc = 0;
 | 
						|
            state = CLIMBING;
 | 
						|
        }
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
/*
 | 
						|
if (sprite_index == sDuckToHangL or sprite_index == sDamselDtHL)
 | 
						|
{
 | 
						|
    ladder = 0;
 | 
						|
    if (facing == LEFT and collision_rectangle(x-8, y, x, y+16, oLadder, 0, 0) and not collision_point(x-4, y+16, oSolid, 0, 0))
 | 
						|
    {
 | 
						|
        ladder = instance_nearest(x-4, y+16, oLadder);
 | 
						|
    }
 | 
						|
    else if (facing == RIGHT and collision_rectangle(x, y, x+8, y+16, oLadder, 0, 0) and not collision_point(x+4, y+16, oSolid, 0, 0))
 | 
						|
    {
 | 
						|
        ladder = instance_nearest(x+4, y+16, oLadder);
 | 
						|
    }
 | 
						|
    
 | 
						|
    if (ladder)
 | 
						|
    {
 | 
						|
        x = ladder.x + 8;
 | 
						|
 | 
						|
        xVel = 0;
 | 
						|
        yVel = 0;
 | 
						|
        xAcc = 0;
 | 
						|
        yAcc = 0;
 | 
						|
        state = CLIMBING;
 | 
						|
    }
 | 
						|
}
 | 
						|
*/
 | 
						|
/*
 | 
						|
if (colLadder and state == CLIMBING and kJumpPressed and not whipping)
 | 
						|
{
 | 
						|
    if (kLeft)
 | 
						|
        xVel = -departLadderXVel;
 | 
						|
    else if (kRight)
 | 
						|
        xVel = departLadderXVel;
 | 
						|
    else
 | 
						|
        xVel = 0;
 | 
						|
    yAcc += departLadderYVel;
 | 
						|
    state = JUMPING;
 | 
						|
    jumpButtonReleased = 0;
 | 
						|
    jumpTime = 0;
 | 
						|
    ladderTimer = 5;
 | 
						|
}
 | 
						|
*/
 | 
						|
 | 
						|
// Calculate horizontal/vertical friction
 | 
						|
if (state == CLIMBING)
 | 
						|
{
 | 
						|
    xFric = frictionClimbingX;
 | 
						|
    yFric = frictionClimbingY;
 | 
						|
}
 | 
						|
else
 | 
						|
{
 | 
						|
    if (runKey and platformCharacterIs(ON_GROUND) and runHeld >= 10)
 | 
						|
    {
 | 
						|
        if (kLeft) // run
 | 
						|
        {
 | 
						|
            xVel -= 0.1;
 | 
						|
            xVelLimit = 6;
 | 
						|
            xFric = frictionRunningFastX;
 | 
						|
        }
 | 
						|
        else if (kRight)
 | 
						|
        {
 | 
						|
            xVel += 0.1;
 | 
						|
            xVelLimit = 6;
 | 
						|
            xFric = frictionRunningFastX;
 | 
						|
        }
 | 
						|
    }
 | 
						|
    else if (state == DUCKING)
 | 
						|
    {
 | 
						|
        if (xVel<2 and xVel>-2)
 | 
						|
        {
 | 
						|
            xFric = 0.2
 | 
						|
            xVelLimit = 3;
 | 
						|
            image_speed = 0.8;
 | 
						|
        }
 | 
						|
        else if (kLeft and global.downToRun) // run
 | 
						|
        {
 | 
						|
            xVel -= 0.1;
 | 
						|
            xVelLimit = 6;
 | 
						|
            xFric = frictionRunningFastX;
 | 
						|
        }
 | 
						|
        else if (kRight and global.downToRun)
 | 
						|
        {
 | 
						|
            xVel += 0.1;
 | 
						|
            xVelLimit = 6;
 | 
						|
            xFric = frictionRunningFastX;
 | 
						|
        }
 | 
						|
        else
 | 
						|
        {
 | 
						|
            xVel *= 0.8;
 | 
						|
            if (xVel < 0.5) xVel = 0;
 | 
						|
            xFric = 0.2
 | 
						|
            xVelLimit = 3;
 | 
						|
            image_speed = 0.8;
 | 
						|
        }
 | 
						|
    }
 | 
						|
    else
 | 
						|
    {
 | 
						|
        //decrease the friction when the character is "flying"
 | 
						|
        if (platformCharacterIs(IN_AIR))
 | 
						|
        {
 | 
						|
            if (dead or stunned) xFric = 1.0;
 | 
						|
            else xFric = 0.8;
 | 
						|
        }
 | 
						|
        else
 | 
						|
        {
 | 
						|
            xFric = frictionRunningX;
 | 
						|
        }
 | 
						|
    }
 | 
						|
    
 | 
						|
    // Stuck on web or underwater
 | 
						|
    if (collision_point(x, y, oWeb, 0, 0))
 | 
						|
    {
 | 
						|
        xFric = 0.2;
 | 
						|
        yFric = 0.2;
 | 
						|
        fallTimer = 0;
 | 
						|
    }
 | 
						|
    else if (collision_point(x, y, oWater, -1, -1))
 | 
						|
    {
 | 
						|
        if (instance_exists(oCape)) oCape.open = false;
 | 
						|
    
 | 
						|
        if (state == FALLING and yVel > 0)
 | 
						|
        {
 | 
						|
            yFric = 0.5;
 | 
						|
        }
 | 
						|
        else if (not collision_point(x, y-9, oWater, -1, -1))
 | 
						|
        {
 | 
						|
            yFric = 1;
 | 
						|
        }
 | 
						|
        else
 | 
						|
        {
 | 
						|
            yFric = 0.9;
 | 
						|
        }
 | 
						|
    }
 | 
						|
    else
 | 
						|
    {
 | 
						|
        swimming = false;
 | 
						|
        yFric = 1;
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
if (colIceBot and state != DUCKING and not global.hasSpikeShoes)
 | 
						|
{
 | 
						|
    xFric = 0.98;
 | 
						|
    yFric = 1;
 | 
						|
}
 | 
						|
 | 
						|
// RUNNING
 | 
						|
 | 
						|
if (platformCharacterIs(ON_GROUND))
 | 
						|
{
 | 
						|
    if (state == RUNNING and kLeft and colLeft)
 | 
						|
    {
 | 
						|
        pushTimer += 1;
 | 
						|
    }
 | 
						|
    else if (state == RUNNING and kRight and colRight)
 | 
						|
    {
 | 
						|
        pushTimer += 1;
 | 
						|
    }
 | 
						|
    else
 | 
						|
    {
 | 
						|
        pushTimer = 0;
 | 
						|
    }
 | 
						|
    
 | 
						|
    if (platformCharacterIs(ON_GROUND) and not kJump and not kDown and not runKey)
 | 
						|
    {   
 | 
						|
        xVelLimit = 3;
 | 
						|
    }
 | 
						|
    
 | 
						|
    
 | 
						|
    // ledge flip
 | 
						|
    if (state == DUCKING and abs(xVel) < 3 and facing == LEFT and
 | 
						|
        collision_point(x, y+9, oSolid, 0, 0) and not collision_line(x-1, y+9, x-10, y+9, oSolid, 0, 0) and kLeft)
 | 
						|
    {
 | 
						|
        state = DUCKTOHANG;
 | 
						|
        
 | 
						|
        if (holdItem)
 | 
						|
        {
 | 
						|
            holdItem.held = false;
 | 
						|
            if (holdItem.type == "Gold Idol") holdItem.y -= 8;
 | 
						|
            scrDropItem(-1, -4);
 | 
						|
        }
 | 
						|
        
 | 
						|
        with oMonkey
 | 
						|
        {
 | 
						|
            // knock off monkeys that grabbed you
 | 
						|
            if (status == 7)
 | 
						|
            {
 | 
						|
                xVel = -1;
 | 
						|
                yVel = -4;
 | 
						|
                status = 1;
 | 
						|
                vineCounter = 20;
 | 
						|
                grabCounter = 60;
 | 
						|
            }
 | 
						|
        }
 | 
						|
    }
 | 
						|
    else if (state == DUCKING and abs(xVel) < 3 and facing == RIGHT and
 | 
						|
        collision_point(x, y+9, oSolid, 0, 0) and not collision_line(x+1, y+9, x+10, y+9, oSolid, 0, 0) and kRight)
 | 
						|
    {
 | 
						|
        state = DUCKTOHANG;
 | 
						|
        
 | 
						|
        if (holdItem)
 | 
						|
        {
 | 
						|
            // holdItem.held = false;
 | 
						|
            if (holdItem.type == "Gold Idol") holdItem.y -= 8;
 | 
						|
            scrDropItem(1, -4);
 | 
						|
        }
 | 
						|
        
 | 
						|
        with oMonkey
 | 
						|
        {
 | 
						|
            // knock off monkeys that grabbed you
 | 
						|
            if (status == 7)
 | 
						|
            {
 | 
						|
                xVel = 1;
 | 
						|
                yVel = -4;
 | 
						|
                status = 1;
 | 
						|
                vineCounter = 20;
 | 
						|
                grabCounter = 60;
 | 
						|
            }
 | 
						|
        }
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
if (state == DUCKTOHANG)
 | 
						|
{
 | 
						|
    x = xPrev;
 | 
						|
    y = yPrev;
 | 
						|
    xVel = 0;
 | 
						|
    yVel = 0;
 | 
						|
    xAcc = 0;
 | 
						|
    yAcc = 0;
 | 
						|
    grav = 0;
 | 
						|
}
 | 
						|
 | 
						|
// PARACHUTE AND CAPE
 | 
						|
if (instance_exists(oParachute))
 | 
						|
{
 | 
						|
    yFric = 0.5;
 | 
						|
}
 | 
						|
if (instance_exists(oCape))
 | 
						|
{
 | 
						|
    if (oCape.open) yFric = 0.5;
 | 
						|
}
 | 
						|
 | 
						|
if (pushTimer > 100) pushTimer = 100;
 | 
						|
 | 
						|
// limits the acceleration if it is too extreme
 | 
						|
if (xAcc > xAccLimit) xAcc = xAccLimit;
 | 
						|
else if (xAcc < -xAccLimit) xAcc = -xAccLimit;
 | 
						|
if (yAcc > yAccLimit) yAcc = yAccLimit;
 | 
						|
else if (yAcc < -yAccLimit) yAcc = -yAccLimit;
 | 
						|
 | 
						|
// applies the acceleration
 | 
						|
xVel += xAcc;
 | 
						|
if (dead or stunned) yVel += 0.6;
 | 
						|
else yVel += yAcc;
 | 
						|
 | 
						|
// nullifies the acceleration
 | 
						|
xAcc = 0;
 | 
						|
yAcc = 0;
 | 
						|
 | 
						|
// applies the friction to the velocity, now that the velocity has been calculated
 | 
						|
xVel *= xFric;
 | 
						|
yVel *= yFric;
 | 
						|
 | 
						|
// apply ball and chain
 | 
						|
if (instance_exists(oBall))
 | 
						|
{
 | 
						|
    if (distance_to_object(oBall) >= 24)
 | 
						|
    {
 | 
						|
        if (xVel > 0 and oBall.x < x and abs(oBall.x-x) > 24) xVel = 0;
 | 
						|
        if (xVel < 0 and oBall.x > x and abs(oBall.x-x) > 24) xVel = 0;
 | 
						|
        if (yVel > 0 and oBall.y < y and abs(oBall.y-y) > 24)
 | 
						|
        {
 | 
						|
            if (abs(oBall.x-x) < 1)
 | 
						|
            {
 | 
						|
                x = oBall.x;
 | 
						|
            }
 | 
						|
            else if (oBall.x < x and not kRight)
 | 
						|
            {
 | 
						|
                if (xVel > 0) xVel *= -0.25;
 | 
						|
                else if (xVel == 0) xVel -= 1;
 | 
						|
            }
 | 
						|
            else if (oBall.x > x and not kLeft)
 | 
						|
            {
 | 
						|
                if (xVel < 0) xVel *= -0.25;
 | 
						|
                else if (xVel == 0) xVel += 1;
 | 
						|
            }
 | 
						|
            yVel = 0;
 | 
						|
            fallTimer = 0;
 | 
						|
        }
 | 
						|
        if (yVel < 0 and oBall.y > y and abs(oBall.y-y) > 24) yVel = 0;
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
// apply the limits since the velocity may be too extreme
 | 
						|
if (not dead and not stunned)
 | 
						|
{
 | 
						|
    if (xVel > xVelLimit) xVel = xVelLimit;
 | 
						|
    else if (xVel < -xVelLimit) xVel = -xVelLimit;
 | 
						|
}
 | 
						|
if (yVel > yVelLimit) yVel = yVelLimit;
 | 
						|
else if (yVel < -yVelLimit) yVel = -yVelLimit;
 | 
						|
    
 | 
						|
// approximates the "active" variables
 | 
						|
if approximatelyZero(xVel) xVel=0
 | 
						|
if approximatelyZero(yVel) yVel=0
 | 
						|
if approximatelyZero(xAcc) xAcc=0
 | 
						|
if approximatelyZero(yAcc) yAcc=0
 | 
						|
 | 
						|
// prepares the character to move up a hill
 | 
						|
// we need to use the "slopeYPrev" variable later to know the "true" y previous value
 | 
						|
// keep this condition the same
 | 
						|
if maxSlope>0 and platformCharacterIs(ON_GROUND) and xVel!=0
 | 
						|
{
 | 
						|
  slopeYPrev=y
 | 
						|
  for(y=y;y>=slopeYPrev-maxSlope;y-=1)
 | 
						|
    if colTop
 | 
						|
      break
 | 
						|
  slopeChangeInY=slopeYPrev-y
 | 
						|
}
 | 
						|
else
 | 
						|
  slopeChangeInY=0
 | 
						|
 | 
						|
// moves the character, and balances out the effects caused by other processes
 | 
						|
// keep this condition the same
 | 
						|
if maxSlope*abs(xVel)>0 and platformCharacterIs(ON_GROUND)
 | 
						|
{
 | 
						|
  // we need to check if we should dampen out the speed as the character runs on upward slopes
 | 
						|
  xPrev=x
 | 
						|
  yPrev=slopeYPrev       // we don't want to use y, because y is too high
 | 
						|
  yPrevHigh=y            // we'll use the higher previous variable later
 | 
						|
  moveTo(xVel,yVel+slopeChangeInY)
 | 
						|
  dist=point_distance(xPrev,yPrev,x,y)// overall distance that has been traveled
 | 
						|
  // we should have only ran at xVel
 | 
						|
  if dist>abs(xVelInteger)
 | 
						|
  {
 | 
						|
    // show_message(string(dist)+ " "+string(abs(xVelInteger)))
 | 
						|
    excess=dist-abs(xVelInteger)
 | 
						|
    if(xVelInteger<0)
 | 
						|
      excess*=-1
 | 
						|
    // move back since the character moved too far
 | 
						|
    x=xPrev
 | 
						|
    y=yPrevHigh     // we need the character to be high so the character can move down
 | 
						|
    // this time we'll move the correct distance, but we need to shorten out the xVel a little
 | 
						|
    // these lines can be changed for different types of slowing down when running up hills
 | 
						|
    ratio=abs(xVelInteger)/dist*0.9        //can be changed
 | 
						|
    moveTo( round(xVelInteger*ratio),round(yVelInteger*ratio+slopeChangeInY) )
 | 
						|
  }
 | 
						|
}
 | 
						|
else
 | 
						|
{
 | 
						|
  // we simply move xVel and yVel while in the air or on a ladder
 | 
						|
  moveTo(xVel,yVel)
 | 
						|
}
 | 
						|
// move the character downhill if possible
 | 
						|
// we need to multiply maxDownSlope by the absolute value of xVel since the character normally runs at an xVel larger than 1
 | 
						|
if not colBot and maxDownSlope>0 and xVelInteger!=0 and platformCharacterIs(ON_GROUND)
 | 
						|
{
 | 
						|
  //the character is floating just above the slope, so move the character down
 | 
						|
  upYPrev=y
 | 
						|
  for(y=y;y<=upYPrev+maxDownSlope;y+=1)
 | 
						|
    if colBot             // we hit a solid below
 | 
						|
    {
 | 
						|
      upYPrev=y           // I know that this doesn't seem to make sense, because of the name of the variable, but it all works out correctly after we break out of this loop
 | 
						|
      break
 | 
						|
    }
 | 
						|
  y=upYPrev
 | 
						|
}
 | 
						|
 | 
						|
//figures out what the sprite index of the character should be
 | 
						|
characterSprite();
 | 
						|
 | 
						|
//sets the previous state and the previously previous state
 | 
						|
statePrevPrev = statePrev;
 | 
						|
statePrev = state;
 | 
						|
 | 
						|
//calculates the image_speed based on the character's velocity
 | 
						|
if (state == RUNNING or state == DUCKING or state == LOOKING_UP)
 | 
						|
{
 | 
						|
    if (state == RUNNING or state == LOOKING_UP) image_speed = abs(xVel) * runAnimSpeed + 0.1;
 | 
						|
}
 | 
						|
 | 
						|
if (state == CLIMBING) image_speed = sqrt(sqr(abs(xVel))+sqr(abs(yVel))) * climbAnimSpeed
 | 
						|
if (xVel >= 4 or xVel <= -4)
 | 
						|
{
 | 
						|
    image_speed = 1;
 | 
						|
    if (platformCharacterIs(ON_GROUND)) setCollisionBounds(-8, -8, 8, 8);
 | 
						|
    else setCollisionBounds(-5, -8, 5, 8);
 | 
						|
}
 | 
						|
else setCollisionBounds(-5, -8, 5, 8);
 | 
						|
if (whipping) image_speed = 1;
 | 
						|
if (state == DUCKTOHANG)
 | 
						|
{
 | 
						|
    image_index = 0;
 | 
						|
    image_speed = 0.8;
 | 
						|
}
 | 
						|
//limit the image_speed at 1 so the animation always looks good
 | 
						|
if (image_speed > 1) image_speed = 1;
 |