#include <acknex.h>
#include <default.c>
#include "entmove.c"
///////////////////////
var opst_getmaxforce(ENTITY* ent);
var opst_getspeed(ENTITY* ent);
var opst_getradius(ENTITY* ent);
var opst_getmass(ENTITY* ent);
int possible_collision_neigbours(ENTITY* ent,var time);
void opst_addent(ENTITY* ent);
void opst_persuit(ENTITY* follower_ent,ENTITY* target_ent,var time,var maxprediction);
void opst_avoid_neigbours(ENTITY* ent,var time);
void opst_seekpos(ENTITY* ent,VECTOR* pos,var time);
void opst_setmaxforce(ENTITY* ent,var maxforce);
void opst_setspeed(ENTITY* ent,var speed);
void opst_setradius(ENTITY* ent,var radius);
void opst_setmass(ENTITY* ent,var mass);
void opst_setmaxspeed(ENTITY* ent,var speed);
void opst_brake(ENTITY* ent,var rate,var time);
VECTOR* opst_predictfuturepos(ENTITY* ent,var predictiontime);
VECTOR* opst_getvelocity(ENTITY* ent);
void opst_setpos(ENTITY* ent,VECTOR* pos);
////////////////////////
VECTOR* opst_getforwardvec(ENTITY* ent);
VECTOR* opst_toavoidcloseneighbors(ENTITY* ent,var minseperationdist);
VECTOR* opst_toavoidneighbors(ENTITY* ent,var mintimetocollision);
VECTOR* opst_forpursuit(ENTITY* follower_ent,ENTITY* target_ent,var predictiontime);
VECTOR* opst_forseek(ENTITY* ent,VECTOR* pos);
void opst_applysteerforce(ENTITY* ent,VECTOR* force,var time);
int opst_iszerovec(VECTOR* force);
VECTOR* opst_incforwardvec(ENTITY* ent,VECTOR* steerforce,VECTOR* otherforce);
VECTOR* opst_getfacedir(ENTITY* ent);
var anim;
ENTITY* seeker_ent;
action seeker()
{
while(!me){wait(1);}
VECTOR* tpos;
random_seed(0);
tpos.x=random(1000);
tpos.y=random(1000);
tpos.z=0;
// set(me,PASSABLE);
opst_addent(me);
opst_setmaxspeed(me,10);
opst_setradius(me,60);
opst_setmaxforce(me,1.5);
VECTOR* steer;
while(1)
{
if(vec_dist(vector(me.x,me.y,me.z),vector(tpos.x,tpos.y,me.z))<=50)
{
tpos.x=random(1000);
tpos.y=random(1000);
tpos.z=0;
}
VECTOR* forward=opst_getforwardvec(me);
VECTOR* avoid=opst_toavoidneighbors(me,1);
VECTOR* seek =opst_forseek(me,tpos);
if(!opst_iszerovec(avoid))
{
steer=opst_incforwardvec(me,steer,avoid);
}
else
{
steer=opst_incforwardvec(me,steer,seek);
}
opst_applysteerforce(me,steer,time_step);
// opst_seekpos(me,tpos,1*time_step);
ent_faceto(my,opst_getfacedir(me),99999*time_step);
c_move(me,vector(opst_getspeed(me)*time_step,0,0),NULL,GLIDE);
opst_setpos(me,vector(me.x,me.y,me.z));
draw_point3d(opst_getfacedir(me),COLOR_GREEN,100,5);
draw_point3d(tpos,COLOR_RED,100,5);
draw_point3d(opst_predictfuturepos(me,5),COLOR_WHITE,100,5);
my.skill1+=opst_getspeed(me)*time_step;
my.skill1%= 100;
ent_animate(me,"walk",my.skill1, ANM_CYCLE);
wait(1);
}
}
action persuier()
{
while(!me){wait(1);}
// set(me,PASSABLE);
opst_addent(me);
opst_setmaxspeed(me,10);
opst_setradius(me,60);
opst_setmaxforce(me,1.5);
VECTOR* steer;
while(1)
{
if(vec_dist(vector(me.x,me.y,me.z),vector(seeker_ent.x,seeker_ent.y,me.z))<=50)
{
opst_brake(me,1,1*time_step);
}
draw_point3d(opst_predictfuturepos(seeker_ent,20),vector(0,255,255),100,5);
VECTOR* forward=opst_getforwardvec(me);
VECTOR* avoid=opst_toavoidneighbors(me,1);
//VECTOR* avoid=opst_toavoidneighbors(me,5);
//VECTOR* pursuit=opst_forseek(me,opst_predictfuturepos(seeker_ent,20));
//VECTOR* pursuit=opst_forpursuit(me,seeker_ent,20);
VECTOR* pursuit=opst_forpursuit(me,seeker_ent,1);
if(!opst_iszerovec(avoid))
{
steer=opst_incforwardvec(me,steer,avoid);
}
else
{
steer=opst_incforwardvec(me,steer,pursuit);
}
opst_applysteerforce(me,steer,time_step);
ent_faceto(my,opst_getfacedir(me),99999*time_step);
c_move(me,vector(opst_getspeed(me)*time_step,0,0),NULL,GLIDE);
opst_setpos(me,vector(me.x,me.y,me.z));
draw_point3d(opst_getfacedir(me),COLOR_GREEN,100,5);
draw_point3d(opst_predictfuturepos(me,5),COLOR_WHITE,100,5);
my.skill1+=opst_getspeed(me)*time_step;
my.skill1%= 100;
ent_animate(me,"walk",my.skill1, ANM_CYCLE);
wait(1);
}
}
action spectator()
{
while(!me){wait(1);}
// set(me,PASSABLE);
opst_addent(me);
opst_setmaxspeed(me,10);
opst_setradius(me,60);
// opst_setmaxforce(me,2);
while(1)
{
VECTOR mypos;
// ent_rotate(me,-mouse_force.x*100*time_step,0,0); // A7 remove
// camera.tilt=clamp(camera.tilt,-45,45);
// camera.tilt+=mouse_force.y*30*time_step;
if(key_w)c_move(me,vector(10*time_step,0,0),NULL,GLIDE);
if(key_s)c_move(me,vector(-10*time_step,0,0),NULL,GLIDE);
// if(key_a)c_move(me,vector(0,10*time_step,0),NULL,GLIDE);
// if(key_d)c_move(me,vector(0,-10*time_step,0),NULL,GLIDE);
if(key_a)c_rotate(me,vector(10*time_step,0,0),GLIDE);
if(key_d)c_rotate(me,vector(-10*time_step,0,0),GLIDE);
// camera.pan=my.pan;
// camera.x=me.x;
// camera.y=me.y;
// camera.z=me.z+30;
opst_setpos(me,vector(me.x,me.y,me.z));
my.skill1+=5*time_step;
my.skill1%= 100;
if(key_any) {ent_animate(me,"walk",my.skill1, ANM_CYCLE);}
else {ent_animate(me,"idle",my.skill1, ANM_CYCLE);}
wait(1);
}
}
void main()
{
level_load(NULL);
wait(4) ;
seeker_ent=ent_create("blueguard.mdl",nullvector,seeker);
vec_set(sky_color,COLOR_BLACK);
int n;
for(n=0;n<10;n++)
ent_create("redguard.mdl",vector(100+n*80,0,0),persuier);
ent_create("blueguard.mdl",vector(0,-100,0),spectator);
vec_set(camera.x,vector(1023,-590,1067));
camera.arc=90;
camera.tilt=-53;
camera.pan=135;
camera.clip_near=1;
// fps_min=60;
// fps_max=60;
//def_move();
//def_move();
def_debug();
}