///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
#define dist_x skill1
#define dist_y skill2
#define dist_z skill3
#define absdist_x skill4
#define absdist_y skill5
#define absdist_z skill6
#define force_x skill7
#define force_y skill8
#define force_z skill9
#define move_spd skill10
#define turn_spd skill11
#define armor skill99 // used for health
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
ENTITY* turret;
ENTITY* body;
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
function handle_size(ENTITY* ent,X,Y,Z)
{
ent.scale_x = X;
ent.scale_y = Y;
ent.scale_z = Z;
}
function handle_gravity(ENTITY* ent)
{
VECTOR temp;
vec_set(temp.x,ent.x);
temp.z -= 200;
my.absdist_z = -c_trace(ent.x,temp.x,IGNORE_FLAG2|IGNORE_PASSABLE|USE_POLYGON|USE_BOX) - ent.min_z - 5;
}
function set_camera()
{
camera.pan += ang(turret.pan - camera.pan) * time_step * 0.8;
camera.tilt = -90;
camera.arc = 70;
vec_set(camera.x,vector(my.x,my.y,my.z + 500));
}
function set_tank()
{
VECTOR temp;
proc_mode = PROC_LATE;
body = ent_create("body.mdl",my.x,NULL); // body's model
turret = ent_create("turret.mdl",my.x,NULL); // turret's model
set(body,FLAG2);
handle_size(body,1,1,1);
set(turret,FLAG2);
handle_size(turret,1,1,1);
while(1)
{
vec_set(body.x,my.x);
////////////////////////////////////
// vec_set(body.pan,my.pan);
////////////////////////////////////
body.pan = my.pan;
////////////////////////////////////
// body.tilt = 0;
////////////////////////////////////
vec_for_bone(temp,body,"TURRET"); // bone's name
vec_set(turret.x,temp.x);
turret.pan -= 0.5 * mickey.x * time_step;
////////////////////////////////////
// turret.tilt = 0;
////////////////////////////////////
wait(1);
}
}
////////////////////////////////////
#define SWING_UP 1
#define SWING_DOWN 2
#define SWING_ANGLE 5 // 5°
#define SWING_SPEED 0.12 // ~0.5 seconds (0.25 up + 0.25 down)
#define SwingPan skill30
#define SwingPercent skill31 // 0..1
int state_swing = 0;
////////////////////////////////////
action tank()
{
////////////////////////////////////
var tilt, roll;
////////////////////////////////////
player = my;
set(my,TRANSLUCENT|FLAG2);
my.alpha = 5;
handle_size(my,1,1,1);
my.armor = 200; // health
my.move_spd = 10;
my.turn_spd = 10;
set_tank(); // create tank parts
while(my.armor > 0)
{
my.force_x = my.move_spd * (key_w - 0.8 * key_s) * time_step;
accelerate(my.dist_x,my.force_x,0.8);
my.force_y = 0;
my.force_z = 0;
my.dist_y = 0;
my.dist_z = 0;
handle_gravity(my); // apply gravity
my.pan += my.turn_spd * (key_a - key_d) * time_step;
c_move(my,my.dist_x,my.absdist_x,IGNORE_PASSABLE|IGNORE_FLAG2|USE_POLYGON|GLIDE);
set_camera(); // set camera position
////////////////////////////////////
if (key_space) { // fire
my.SwingPan = turret.pan;
state_swing = SWING_UP;
}
if (state_swing) {
if (state_swing == SWING_UP) {
my.SwingPercent += time_step * SWING_SPEED;
if (my.SwingPercent >= 1) state_swing = SWING_DOWN;
} else {
my.SwingPercent -= time_step * SWING_SPEED;
if (my.SwingPercent <= 0) state_swing = 0;
}
if (state_swing) {
tilt = cos(my.SwingPan)*my.SwingPercent*SWING_ANGLE;
roll = sin(my.SwingPan)*my.SwingPercent*SWING_ANGLE; // or -sin(...)??
my.tilt = tilt;
my.roll = roll;
turret.tilt = tilt;
turret.roll = roll;
body.tilt = tilt;
body.roll = roll;
} else {
my.tilt = 0;
my.roll = 0;
turret.tilt = 0;
turret.roll = 0;
body.tilt = 0;
body.roll = 0;
}
}
////////////////////////////////////
wait(1);
}
}