[/code]
#include <acknex.h>
#include <default.c>
////////////////////////////////////////////////////////////////////
var video_depth = 32; // 32 bit mode
var d3d_lockable = 1;
typedef struct
{
var health;
var shield;
var count;
var state;
var pathnode;
var lin_speed;
var rot_speed;
var anim_speed;
var range;
var weapon_type;
var weapon;
var weapon_range;
var ammo;
ENTITY* model;
}entity3d;
entity3d npc[5];
STRING* buff = " ";
static int NPC_Counter = 0;
entity3d* player1 = &npc[0];
entity3d* enemy1 = &npc[1];
entity3d* enemy2 = &npc[2];
entity3d* enemy3 = &npc[3];
#define MODE_STAND 0
#define MODE_WALK 1
#define MODE_RUN 2
#define MODE_DEATH 3
#define MODE_ATTACK 4
#define MODE_STOP 5
#define MODE_MARCH 6
#define MODE_STANDBY 7
STRING* work01_wmb = "flatplane.wmb"; // flat plane for test
ENTITY* any;
function all_events();
function act_player(entity3d* ent);
function check_downward(ent, vmin, vmax);
function act_enemy(entity3d* ent);
function loadEntity();
////////////////////////////////////////////////////////////////////
function main()
{
fps_max = 50;
level_load (work01_wmb);
wait(5);
loadEntity();
}
function act_player(entity3d* ent)
{
var speed = 5;
my = player = ent.model;
set(ent.model, INVISIBLE);
my.scale_x = .5;
my.scale_y = .5;
my.scale_z = .5;
my.emask |= (ENABLE_BLOCK | ENABLE_ENTITY | ENABLE_IMPACT);
my.event = all_events;
while(1)
{
camera.x = my.x;
camera.y = my.y;
camera.z = my.z + 5;
camera.pan = my.pan;
camera.tilt = my.tilt;
move_mode = IGNORE_PASSABLE + USE_BOX;
if(key_w == 1)
{
ent_move (vector(speed * time_step,0,0), nullvector);
my.z += .5 * sin(total_ticks * 25) * time_step;
if(my.tilt < 1)
my.tilt += .25;
if(my.tilt > 1)
my.tilt -= .25;
}
if(key_s == 1)
{
ent_move (vector(-speed * time_step,0,0), nullvector);
if(my.tilt < 1) //tilted down?...recover
my.tilt += .25;
if(my.tilt > 1) // tilted up... recover
my.tilt -= .25;
}
if(key_a == 1)
my.pan += 3 * time_step;
if(key_d == 1)
my.pan -= 3 * time_step;
if(key_q == 1)
{
if(my.tilt > 30) // maximun tilt allow
my.tilt = 30;
my.tilt += 1;
}
if(key_z == 1)
{
if(my.tilt < -30) // minimum tilt allow
my.tilt = -30;
my.tilt -= 1;
}
check_downward(my, 10, 13); // put me on the surface
wait(1);
}
}
function loadEntity()
{
zero(npc[0]);
npc[0].model = ent_create ("player.mdl", vector(270,120,20), NULL);
act_player(npc[0]);
zero(npc[1]);
npc[1].model = ent_create ("gangst1.mdl", vector(300,-300, 25), NULL);
act_enemy(npc[1]);
}
function all_events()
{
switch (event_type)
{
case EVENT_BLOCK:
return;
case EVENT_ENTITY:
return;
}
}
function check_downward(ent, vmin, vmax)
{
proc_kill(4);
var dist;
VECTOR temp;
my = ent;
// check downward
vec_set (temp, my.x);
temp.z = my.z - 15000;
trace_mode = IGNORE_ME + IGNORE_SPRITES + USE_BOX + IGNORE_PASSABLE;
dist = trace (my.x, temp);
// stay above ground
if(dist < vmin) { my.z += 1; }
if(dist > vmax) { my.z -= 1; }
if(dist > (vmax + 5)) { my.z -= 3; }
if(dist < (vmin - 4)) { my.z += 3; }
}
function act_enemy( entity3d* ent )
{
var percent;
var d1;
var d2;
var vmin = 0;
var vmax = 3;
VECTOR temp;
var dist_trace;
my = ent.model;
my.scale_x = .4;
my.scale_y = .4;
my.scale_z = .4;
while(!player){wait(1);}
ent.state = MODE_WALK;
ent.health = 100;
ent.range = 250;
while(ent.health > 10)
{
d1 = vec_dist(ent.model.x, player.x);
if (ent.state == MODE_WALK)
{
percent += 3 * time_step;
ent_animate(ent.model,"walk", percent, ANM_CYCLE);
percent %= 100;
}
if (ent.state == MODE_ATTACK)
{
vec_set(temp,my.x);
if(vec_dist(me.x, player.x)<1000 && vec_to_screen(temp,camera)!=NULL)
{
str_for_num(buff, ent.health);
draw_text(buff, temp.x, temp.y-20, vector(200,200,200));
}
// perform animation
percent += 3 * time_step;
ent_animate(my,"attack", percent, ANM_CYCLE);
percent %= 100;
// rotate to the target
vec_set(temp,player.x);
vec_sub(temp,my.x);
vec_to_angle(my.pan,temp); // now MY looks at YOU
}
// traced something in range AND is the player
if((c_trace (my.x, player.x, IGNORE_ME | IGNORE_PASSABLE) < ent.range) && (you == player))
{
d2 = vec_dist(my.x,player.x);
//im moving toward the player
if((d2 <= d1) && ( ent.health > 30))
{
ent.state = MODE_ATTACK;
}
}
else
{
ent.state = MODE_WALK;
}
wait(1);
check_downward(my, vmin, vmax);
}
}
[code]