function pl_character()
{
player = me;
//local variables
var move[3];
var move_result;
var trace_from[3];
var trace_to[3];
var ground_dist;
var anim_per;
//adjust bounding box
wait(1);
c_setminmax(me);
vec_set(my.min_x,vector(-25,-25,-60));
vec_set(my.max_x,vector(25,25,60));
//loop
while(me)
{
temp.x = -1000;
temp.y = 0;
if(key_w && !key_s && !key_a && !key_d){temp.x = camera.pan;}
if(key_s && !key_w && !key_a && !key_d){temp.x = camera.pan + 180;}
if(key_a && !key_s && !key_w && !key_d){temp.x = camera.pan + 90;}
if(key_d && !key_s && !key_a && !key_w){temp.x = camera.pan - 90;}
if(key_w && key_a && !key_d && !key_s){temp.x = camera.pan + 45;}
if(key_w && key_d && !key_a && !key_s){temp.x = camera.pan - 45;}
if(key_s && key_a && !key_d && !key_w){temp.x = camera.pan + 135;}
if(key_s && key_d && !key_a && !key_w){temp.x = camera.pan - 135;}
//calculate directional force
if(temp.x != -1000){temp.y = 20 * time;}
move.x = fcos(temp.x,temp.y);
move.y = fsin(temp.x,temp.y);
//trace floor
vec_set(trace_from,my.x);
vec_set(trace_to,my.x);
trace_to.z -= 500;
ground_dist = c_trace(trace_from,trace_to,ignore_me|ignore_passents|ignore_passable|ignore_sprites|use_box);
//calculate jumping
if(key_space)
{
if(ground_dist < 5)
{
ground_dist = 3;
move.z = 5;
}
}
//gravity
if(ground_dist > 0)
{
accelerate(move.z,(-3 * time_step),0);
if (move.z < (ground_dist * -1))
{
move.z = ground_dist * -1;
}
}
else
{
move.z = -1 * ground_dist;
}
//move player
move_result = c_move(my,nullvector,move.x,ignore_passable|ignore_passents|ignore_sprites|glide);
//calculate rotation
if(my.pan != temp.x && (temp.y > 0))
{
result = ang(temp.x - my.pan);
if(result > 0){my.pan += 30 * time;}
if(result < 0){my.pan -= 30 * time;}
if(ang(temp.x - my.pan) < 0 && result > 0){my.pan = temp.x;}
if(ang(temp.x - my.pan) > 0 && result < 0){my.pan = temp.x;}
}
//rough draft animation
if(temp.y == 0)
{
anim_per += (1 * time_step);
ent_animate(me,"idle",anim_per,anm_cycle);
anim_per %= 100;
}
else
{
anim_per += (move_result * (2 * time_step));
ent_animate(me,"run",anim_per,anm_cycle);
anim_per %= 100;
}
orbit_camera();
wait(1);
}
}