Here is the only way i can find to make it work. Making the structures global
Code:
[/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]