/// INPUT
key_lft = -keyboard_check(ord("A"));
key_rgt = +keyboard_check(ord("D"));
move = key_lft + key_rgt;
key_upw = -keyboard_check(ord("W"));
key_dwn = +keyboard_check(ord("S"));
tilt = key_upw + key_dwn;
key_jump = keyboard_check_pressed(vk_space);
key_jump_held = keyboard_check(vk_space);
use_item = mouse_check_button(mb_left);
key_walk = keyboard_check(vk_shift);
/// MOTION
//GRAVITATION/////////////////////////////////////////////////////////////////////////////
if (liquidborn)
{
//GRAVITY
if (vspd < 4)
vspd += 0.10;
else vspd -= 0.10;
//FALLDAMAGE
fall_damage = 0;
}
else
{
//GRAVITY IN LIQUIDS
if (vspd < 20)
vspd += 0.40;
}
//DEATH///////////////////////////////////////////////////////////////////////////////////
if (state == STATES.DEAD)
{
if (abs(hspd) < 0.1)
hspd = 0;
else if (earthborn)
hspd *= 0.80;
//TERMINATE
exit;
}
//JUMPING////////////////////////////////////////////////////////////////////////////////
if (key_jump && earthborn)
vspd -= jump_height;
if (vspd < 0 && !key_jump_held)
vspd = max(vspd, -jump_height / 2.50)
//ACCELERATE/////////////////////////////////////////////////////////////////////////////
if (move != 0 && state == STATES.CHILL)
{
//ROUND SPEED
if (abs(hspd) < 0.10)
hspd = 0;
//FACING
image_xscale = move;
}
//MOTION PLANING/////////////////////////////////////////////////////////////////////////
if (earthborn)
{
if (tilt)
{
//HARD CAP MAX SPEED
move_spd = 0;
if (abs(hspd) > move_spd || move == 0)
hspd *= 0.90;
}
else
{
//HARD CAP MAX SPEED
move_spd = ground_spd;
if (abs(hspd) > move_spd || move == 0)
hspd *= 0.80;
//GAIN MOTION
if (abs(hspd) < move_spd || sign(hspd) != move)
hspd += move * move_spd / 12.00 ;
}
}
else
{
//HARD CAP MAX SPEED
move_spd = air_spd;
if (abs(hspd) > move_spd || move == 0)
hspd *= 0.95;
//GAIN MOTION
if (abs(hspd) < move_spd || sign(hspd) != move)
hspd += move * move_spd / 12.00;
}
if (liquidborn)
move_spd = liquid_spd;
//OTHER/////////////////////////////////////////////////////////////////////////////////
if (key_walk)
{
ground_spd = ground_walk_spd;
air_spd = air_walk_spd;
liquid_spd = liquid_walk_spd;
}
else
{
ground_spd = ground_run_spd;
air_spd = air_run_spd;
liquid_spd = liquid_run_spd;
}
//FALLDAMAGE////////////////////////////////////////////////////////////////////////////
if (!earthborn)
{
if (vspd >= 20)
fall_damage += 10;
}
else
{
if (fall_damage >= 25)
{
//DO FALLDAMAGE
if (invincible == false)
{
hp -= min(fall_damage, hp);
}
//TERMINATE
fall_damage = 0;
}
}
/// COLLISION
//HORIZONTAL COLLISION
if (grid_place_meeting(x+(hspd),y))
{
while (!grid_place_meeting(x+sign(hspd),y))
{
x += sign(hspd);
}
hspd = 0;
}
x += hspd;
//VERTICAL COLLISION
if (grid_place_meeting(x,y+(vspd)))
{
while (!grid_place_meeting(x,y+sign(vspd)))
{
y += sign(vspd);
}
vspd = 0;
}
y += vspd;
earthborn = (
getType(global.TILE[@ bbox_left div 16, (bbox_bottom+1) div 16]) > 0 ||
getType(global.TILE[@ x div 16, (bbox_bottom+1) div 16]) > 0 ||
getType(global.TILE[@ bbox_right div 16, (bbox_bottom+1) div 16]) > 0);
/// ANIMATION
if (tilt) mask_index = spr_player_cbox;
else mask_index = spr_player_bbox;
switch (state)
{
case STATES.CHILL:
{
if (earthborn)
{
var spd = abs(hspd);
if (tilt)
{
image_speed = 0;
image_index = 0;
sprite_index = spr_player_crouch;
}
else
{
if (spd > 1.00)
{
if (ground_spd == ground_walk_spd)
{
sprite_index = spr_player_move;
image_speed = spd / 12;
}
else
{
sprite_index = spr_player_run;
image_speed = spd / 16;
}
}
else
{
sprite_index = spr_player_chill;
image_speed = 0;
image_index = 0;
}
}
}
else
{
sprite_index = spr_player_jump;
image_speed = 0;
image_index = 0;
}
}
break;
}
/// PLAYER UPDATE
if (hp <= 0)
{
state = STATES.DEAD;
}
else
{
if (tick mod 60 == 0)
hp += min(hpr, max_hp - hp);
}