function rotate_entity(var rotate_angle, var rotate_speed);
function handle_gravity();
function handle_movement();
function handle_camera();
function handle_animation(var animation_speed);
#define nullframe -2
#define blend -1
#define stand 0
#define run 1
#define walk 2
#define jump 3
#define fall 4
#define attack_a 5
#define attack_b 6
#define attack_c 7
#define attack_d 8
#define attack_e 9
#define attack_f 10
#define move_x skill22
#define move_y skill23
#define move_z skill24
#define force_x skill25
#define force_y skill26
#define force_z skill27
#define velocity_x skill28
#define velocity_y skill29
#define velocity_z skill30
#define animate skill31
#define animate2 skill32
#define animblend skill33
#define currentframe skill34
#define blendframe skill35
#define z_offset skill50
#define jumping_mode skill51
#define gravity skill52
#define movement_mode skill53
#define moving skill54
#define hit_by_player skill55
#define entity_type skill56
ENTITY* player_weapon;
ENTITY* target_enemy;
var temp;
VECTOR* tempV = { x=0; y=0; z=0; }
VECTOR* tempV2= { x=0; y=0; z=0; }
ANGLE* tempA = { pan=0; tilt=0; roll=0; }
ANGLE* tempA2= { pan=0; tilt=0; roll=0; }
VECTOR* camera_move_to = { x=0; y=0; z=0; }
var camera_distance = 200;
var camera_pan;
var camera_tilt;
var space_press = 0;
var mouse_left_press = 0;
var mouse_right_press = 0;
var combo_continue = 0;
var player_lock_on = 0;
var airborne_attack = 0;
action attach_weapon()
{
player_weapon = my;
set(my,PASSABLE);
proc_mode = PROC_LATE;
while(you != NULL)
{
vec_for_vertex(tempV.x, you, 1175); //hand palm base
vec_for_vertex(tempV2.x, you, 1240); //hand palm tip
vec_set(my.x, tempV.x);
vec_diff(tempV.x, tempV2.x, tempV.x);
vec_to_angle(tempA.pan, tempV.x);
vec_set(my.pan, tempA.pan);
wait(1);
}
}
action player_action()
{
player = my;
my.gravity = 6;
my.z_offset = 12;
set(my,SHADOW);
ent_create("sword.mdl", my.x, attach_weapon);
wait(1);
while(1)
{ //the main player loop
handle_gravity();
handle_movement();
handle_camera();
handle_animation(1);
wait(1);
}
}
function handle_movement()
{
tempV.x = -1000;
tempV.y = 0;
my.moving = 0;
if(key_w == 1 && key_s == 0 && key_a == 0 && key_d == 0) tempV.x = camera.pan;
if(key_s == 1 && key_w == 0 && key_a == 0 && key_d == 0) tempV.x = camera.pan + 180;
if(key_a == 1 && key_s == 0 && key_w == 0 && key_d == 0) tempV.x = camera.pan + 90;
if(key_d == 1 && key_s == 0 && key_a == 0 && key_w == 0) tempV.x = camera.pan - 90;
if(key_w == 1 && key_a == 1 && key_d == 0 && key_s == 0) tempV.x = camera.pan + 45;
if(key_w == 1 && key_d == 1 && key_a == 0 && key_s == 0) tempV.x = camera.pan - 45;
if(key_s == 1 && key_a == 1 && key_d == 0 && key_w == 0) tempV.x = camera.pan + 135;
if(key_s == 1 && key_d == 1 && key_a == 0 && key_w == 0) tempV.x = camera.pan - 135;
if(tempV.x != -1000)
{
my.moving = 1;
if(key_shift == 1) tempV.y = 10 * time_step;
else tempV.y = 15 * time_step;
}
//
if(my.movement_mode==0)
{
my.move_x = fcos(tempV.x, tempV.y);
my.move_y = fsin(tempV.x, tempV.y);
}
else if((my.movement_mode==1)||(my.movement_mode==2))
{
tempV.y = fsin((my.animate * 1.2) + 45,15 * time_step);
my.move_x = fcos(my.pan, tempV.y);
my.move_y = fsin(my.pan, tempV.y);
tempV.y = 0;
//NextLine: if we need to rotate whilst attacking (the player is pressing keys to rotate)
if(tempV.x != -1000) tempV.y = 1;
}
//
c_move(my, nullvector, my.move_x, USE_BOX | IGNORE_PASSABLE | GLIDE);
result = -my.z_offset + c_trace(vector(my.x,my.y,my.z - my.z_offset), vector(my.x,my.y,my.z - 4000), IGNORE_ME | IGNORE_PASSABLE | USE_BOX);
result = clamp(result, -150, 150);
if(result < 0) { my.z -= result; my.velocity_z = 0; }
//
if(target_enemy == NULL)
{ if(tempV.y > 0) rotate_entity(tempV.x, 30); }
else
{
vec_diff(tempV2.x, target_enemy.x, my.x);
vec_to_angle(tempA2.pan, tempV2.x);
rotate_entity(tempA2.pan,30);
}
//
if(my.movement_mode == 0)
{
my.gravity = 6;
if(my.move_x != 0 || my.move_y != 0)
{ //ifwe are moving
if(my.animblend == stand)
{ //ifour current animation is stand
if(key_shift == 1) my.blendframe = walk;
else my.blendframe = run;
}
if(my.animblend == run && key_shift == 1) my.blendframe = walk;
if(my.animblend == walk && key_shift == 0) my.blendframe = run;
}
else
{
if(my.animblend > stand && my.animblend != jump && my.animblend != fall)
{ //if we arn't moving and our current animation is walk or run, blend and cycle the stand animation
my.blendframe = stand;
}
}
if(mouse_left == 0 && mouse_left_press == 1) mouse_left_press = 0;
if(mouse_left == 1 && mouse_left_press == 0 && my.animblend >= stand)
{
mouse_left_press = 1;
my.blendframe = attack_a;
if(my.jumping_mode == 1) airborne_attack = 1;
else airborne_attack = 0;
my.movement_mode = 1;
combo_continue = 0;
}
if(mouse_right == 0 && mouse_right_press == 1) mouse_right_press = 0;
if(mouse_right == 1 && mouse_right_press == 0)
{
if(player_lock_on == 0)
{
c_scan(player.x, player.pan, vector(360,180,250), SCAN_ENTS | SCAN_LIMIT | IGNORE_ME);
if(you != NULL)
{
if(you.entity_type == 2)
{ //make sure you've scanned an enemy
player_lock_on = 1;
target_enemy = you;
}
}
}
else
{
player_lock_on = 0;
target_enemy = NULL;
}
mouse_right_press = 1;
}
}
//
if(my.movement_mode == 1)
{
if(my.jumping_mode != 10) my.jumping_mode = 0;
else if(my.animate >= 60 && my.animblend >= stand) my.jumping_mode = 0;
//
if(mouse_left == 0 && mouse_left_press == 1)
mouse_left_press = 0;
if(mouse_left == 1 && mouse_left_press == 0 && my.animate >= 30 && combo_continue == 0)
{ mouse_left_press = 1; combo_continue = 1; }
}
//
if(my.movement_mode == 2)
{
my.jumping_mode = 0;
if(mouse_left == 0 && mouse_left_press == 1)
mouse_left_press = 0;
if(mouse_left == 1 && mouse_left_press == 0 && my.animate >= 30 && combo_continue == 0)
{ mouse_left_press = 1; combo_continue = 1; }
}
}
function handle_gravity()
{
result = -my.z_offset + c_trace(vector(my.x,my.y,my.z - my.z_offset), vector(my.x,my.y,my.z - 4000), IGNORE_ME | IGNORE_PASSABLE | USE_BOX );
result = clamp(result, -150, 150);
if(result < 3)
{
if(my.jumping_mode == 0)
{
my.force_z = -1 * result;
if(key_space == 0 && space_press == 1) space_press = 0;
if(key_space == 1 && space_press == 0 && my.movement_mode == 0 && my.animblend >= stand && my.animblend != jump && my.animblend != fall)
{
space_press = 1;
my.jumping_mode = 1;
my.force_z = 25;
my.blendframe = jump;
my.animate2 = 0;
my.animblend = blend;
}
}
if(my.jumping_mode == 2 || my.jumping_mode == 3) my.jumping_mode = 0;
}
else
{
if(my.jumping_mode == 2)
{
if(result > 120)
{
my.animate = 60;
my.jumping_mode = 3;
}
else
my.jumping_mode = 0;
}
if(my.jumping_mode == 3 && result <= 120) my.jumping_mode = 0;
if(my.jumping_mode == 0 && my.movement_mode == 0)
{
if(result > 120 && my.animblend >= stand && my.animblend != jump && my.animblend != fall)
{
my.jumping_mode = 3;
my.blendframe = fall;
my.animate2 = 0;
my.animblend = blend;
}
}
my.force_z -= my.gravity * time_step;
my.force_z = maxv(-30, my.force_z);
if(my.movement_mode == 2) my.force_z = 0;
}
my.velocity_z += (time_step * my.force_z) - (minv(time_step*0.7, 1) * my.velocity_z);
my.move_z = my.velocity_z * time_step;
}
//////////////////////////////
//Stable/rigid camera collision
//////////////////////////////
function handle_camera()
{
camera.pan -= mouse_force.x * 12 * time_step;
camera.tilt += mouse_force.y * 8 * time_step;
camera.tilt = clamp(camera.tilt, -30, 10);
temp = fcos(camera.tilt, -camera_distance);
vec_set(camera.x, vector(my.x + fcos(camera.pan, temp),my.y + fsin(camera.pan, temp),my.z + 20 + fsin(camera.tilt, -camera_distance)));
vec_diff(tempV.x, camera.x, my.x); //find the vector from the player to the camera
vec_normalize(tempV.x, 16); //get the magnitude of it's vector to 16 quants and store it in temp
vec_add(tempV.x, camera.x); //add the vector (from player to camera) of a magnitude of 16 quants and add it to the camera's position.
result = c_trace(my.x, tempV.x, IGNORE_ME|IGNORE_PASSABLE|IGNORE_MODELS); //trace from the player to 16 quants behind the camera.
if(result > 0)
{
vec_diff(tempV.x, my.x, target.x); //find the vector from the point the trace hit to the player
vec_normalize(tempV.x, 16); //get the magnitude of this vector to 16 quants and store in temp
vec_set(camera.x, target.x); //place the camera at the trace hit point
vec_add(camera.x, tempV.x); //move the camera away from the wall by the vector temp, 16 quants towards the player
}
}
//////////////////////////////
//Smooth camera collision
//////////////////////////////
/*function handle_camera()
{
camera_pan -= mouse_force.x * 12 * time_step;
camera_tilt += mouse_force.y * 8 * time_step;
camera_tilt = clamp(camera_tilt, -30, 10);
camera.pan = camera_pan;
temp = fcos(camera_tilt,-camera_distance);
vec_set(camera_move_to.x, vector(my.x + fcos(camera.pan, temp), my.y + fsin(camera.pan, temp), my.z + 20 + fsin(camera_tilt, -camera_distance)));
temp = minv(1,0.5 * time_step); //changing 0.5 will change how fast the camera moves, at 1 places us at target, this value is what allows the smooth movement
camera.x += temp*(camera_move_to.x - camera.x);
camera.y += temp*(camera_move_to.y - camera.y);
camera.z += temp*(camera_move_to.z - camera.z);
vec_diff(tempV.x, camera.x, my.x);
vec_normalize(tempV.x, 16);
vec_add(tempV.x, camera.x);
if(c_trace(my.x, tempV.x, IGNORE_ME|IGNORE_PASSABLE|IGNORE_MODELS) > 0)
{
vec_diff(tempV.x, my.x, target.x);
vec_normalize(tempV.x, 16);
vec_set(camera.x, target.x);
vec_add(camera.x, tempV.x);
}
vec_diff(tempV.x, my.x, camera.x);
vec_to_angle(camera.pan, tempV.x);
}*/
function rotate_entity(var rotate_angle, var rotate_speed)
{
if(my.pan == rotate_angle) return;
result = ang(rotate_angle - my.pan);
if(result > 0) my.pan += rotate_speed * time_step;
if(result < 0) my.pan -= rotate_speed * time_step;
if(ang(rotate_angle - my.pan) < 0 && result > 0) my.pan = rotate_angle;
if(ang(rotate_angle - my.pan) > 0 && result < 0) my.pan = rotate_angle;
}
function handle_sword_collision()
{
you = NULL;
vec_for_vertex(tempV.x, player_weapon, 274); //sword base
vec_for_vertex(tempV2.x, player_weapon, 54); //sword tip
result = c_trace(tempV.x, tempV2.x, IGNORE_ME | IGNORE_PASSABLE | USE_BOX);
if(you != NULL)
{
if(you.entity_type == 2 && you.hit_by_player == 0)
{
if(airborne_attack == 1 && my.animblend == attack_a) my.movement_mode = 2;
you.hit_by_player = 1;
if(target_enemy == NULL) { target_enemy = you; player_lock_on = 1; }
}
}
}