home *** CD-ROM | disk | FTP | other *** search
/ PC Gamer 5.14 / 2000-11_-_Disc_5.14.iso / Goodies / 3DGameStudio / Mission / war.wdl < prev    next >
Text File  |  2000-02-08  |  9KB  |  360 lines

  1. //////////////////////////////////////////////////////////////////////
  2. // WAR.WDL - fighting behaviour
  3. ///////////////////////////////////////////////////////////////////////
  4. IFNDEF WAR_DEFS;
  5.  DEFINE ACTOR_EXPLO,<explo+7.pcx>;
  6.  DEFINE ACTOR_EXPLO_FRAMES,7;
  7. ENDIF;
  8.  
  9. ///////////////////////////////////////////////////////////////////////
  10. SKILL freeze_actors { VAL 0; }    // 1,2 for testing purposes
  11.  
  12. ///////////////////////////////////////////////////////////////////////
  13. DEFINE _STATE_WAIT,1;
  14. DEFINE _STATE_ATTACK,2;
  15. DEFINE _STATE_ESCAPE,3;
  16. DEFINE _STATE_DIE,4;
  17. DEFINE _STATE_FREEZE,4;
  18.  
  19. ///////////////////////////////////////////////////////////////////////
  20. SYNONYM test_actor { TYPE entity; }
  21.  
  22. ACTION robot_test {
  23. IFNDEF test;
  24.     REMOVE ME;
  25.     RETURN;
  26. ENDIF;
  27.  
  28.     SET test_actor,ME;
  29.     MY._WALKFRAMES = 8.030;
  30.     MY._RUNFRAMES = 4.050;
  31.     MY._ATTACKFRAMES = 6;
  32.     MY._DIEFRAMES = 1;
  33.     MY._FORCE = 2;
  34.     MY._FIREMODE = DAMAGE_SHOOT+FIRE_PARTICLE+HIT_FLASH+0.05;
  35.     MY._HITMODE = HIT_EXPLO;
  36.     MY._WALKSOUND = _SOUND_ROBOT;
  37.     CALL  drop_shadow;
  38.     CALL    anim_init;
  39.     CALL    actor_fight;
  40. }
  41.  
  42. ACTION robot1 {
  43.     MY._WALKFRAMES = 7.020;
  44.     MY._RUNFRAMES = 4.050;
  45.     MY._ATTACKFRAMES = 3;
  46.     MY._DIEFRAMES = 5;
  47.     MY._FORCE = 0.7;
  48.     MY._FIREMODE = DAMAGE_EXPLODE+FIRE_BALL+HIT_EXPLO+BULLET_SMOKETRAIL+0.20;
  49.     MY._HITMODE = 0;
  50.     MY._WALKSOUND = _SOUND_ROBOT;
  51.     CALL  drop_shadow;
  52.     CALL    anim_init;
  53.     CALL    actor_fight;
  54. //    IF (MY.FLAG4 == ON) { CALL patrol; }
  55. }
  56.  
  57. ACTION robot2 {
  58.     MY._WALKFRAMES = 8.030;
  59.     MY._RUNFRAMES = 4.050;
  60.     MY._ATTACKFRAMES = 6;
  61.     MY._DIEFRAMES = 1;
  62.     MY._FORCE = 2;
  63.     MY._FIREMODE = DAMAGE_SHOOT+FIRE_PARTICLE+HIT_FLASH+0.05;
  64.     MY._HITMODE = HIT_EXPLO;
  65.     MY._WALKSOUND = _SOUND_ROBOT;
  66.     CALL  drop_shadow;
  67.     CALL    anim_init;
  68.     CALL    actor_fight;
  69. //    IF (MY.FLAG4 == ON) { CALL patrol; }
  70. }
  71.  
  72. ACTION robot3 {
  73.     REMOVE ME;
  74.     RETURN;
  75.     MY._WALKFRAMES = 7.030;
  76.     MY._RUNFRAMES = 4.050;
  77.     MY._ATTACKFRAMES = 3;
  78.     MY._DIEFRAMES = 5;
  79.     MY._FORCE = 0.7;
  80.     MY._FIREMODE = DAMAGE_EXPLODE+FIRE_BALL+HIT_EXPLO+BULLET_SMOKETRAIL+0.20;
  81.     CALL  drop_shadow;
  82.     CALL    anim_init;
  83.     CALL    actor_fight;
  84. //    IF (MY.FLAG4 == ON) { CALL patrol; }
  85. }
  86.  
  87.  
  88. ///////////////////////////////////////////////////////////////////////
  89. ACTION actor_fight
  90. {
  91. //    IF (MY._ARMOR == 0) { MY._ARMOR = 100; }
  92.     IF (MY._HEALTH == 0) { MY._HEALTH = 100; }
  93.     IF (MY._FORCE == 0) { MY._FORCE = 1; }
  94.  
  95.     IF (freeze_actors > 1) { SET MY.PASSABLE,ON; }
  96.  
  97.     MY._SIGNAL = 0;
  98.     SET MY.ENABLE_SCAN,ON;
  99.     SET MY.ENABLE_SHOOT,ON;
  100.     SET MY.ENABLE_DETECT,ON;
  101.     SET MY.EVENT,fight_event;
  102.  
  103.     BRANCH state_wait;
  104. }
  105.  
  106. ACTION state_wait
  107. {
  108.     MY._STATE = _STATE_WAIT;
  109.     WHILE (MY._STATE == _STATE_WAIT) {
  110.         IF (MY._HEALTH <= 0) { BRANCH state_die; }
  111.         IF (MY._HEALTH <= 30) { BRANCH state_escape; }
  112.  
  113. // scan for the player coming near
  114.         temp.PAN = 180;
  115.         temp.TILT = 180;
  116.         temp.Z = 1000;
  117.         indicator = _WATCH;
  118.         SCAN    MY.POS,MY.ANGLE,temp;
  119.         IF (MY._SIGNAL == _DETECTED) {
  120.             MY._SIGNAL = 0;
  121.             BRANCH state_attack;
  122.         }
  123.         WAITT 4;
  124.     }
  125. }
  126.  
  127. ACTION state_attack
  128. {
  129.     MY._STATE = _STATE_ATTACK;
  130.     MY._MOVEMODE = _MODE_ATTACK;    // stop patroilling etc.
  131.     CALL attack_transitions;
  132.     WHILE (MY._STATE == _STATE_ATTACK)
  133.     {
  134. // fire two or three times
  135.         MY._COUNTER = 1.5 + RANDOM(1);
  136.         CALL attack_fire;
  137.         WHILE (MY._COUNTER > 0) { WAIT 1; }
  138.  
  139. // walk towards player for one to three seconds
  140.         MY._COUNTER = 16 + RANDOM(32);
  141.         CALL attack_approach;
  142.         WHILE (MY._COUNTER > 0) { WAIT 1; }
  143.     }
  144. }
  145.  
  146. ACTION attack_transitions
  147. {
  148.     WHILE (MY._STATE == _STATE_ATTACK) {
  149.         IF (MY._HEALTH <= 0) { BRANCH state_die; }
  150.         IF (MY._HEALTH <= 30) { BRANCH state_escape; }
  151.         IF (freeze_actors > 0) { BRANCH state_freeze; }
  152.         WAIT 1;
  153.     }
  154. }
  155.  
  156. ACTION attack_fire
  157. {
  158.     MY.FRAME = 1 + MY._WALKFRAMES + MY._RUNFRAMES + 1;
  159. IFDEF ACKNEX_VERSION412;
  160.     MY.NEXT_FRAME = 0;    // inbetween to the real next frame
  161. ENDIF;
  162.     WHILE ((MY._STATE == _STATE_ATTACK) && (MY._COUNTER > 0))
  163.     {
  164. // turn towards player
  165.         temp.X = player.X - MY.X;
  166.         temp.Y = player.Y - MY.Y;
  167.         temp.Z = player.Z - MY.Z;
  168.         TO_ANGLE MY_ANGLE,temp;
  169.         force = MY._FORCE * 2;
  170.         CALL actor_turn;
  171. // play attack animation
  172.         MY.FRAME += 0.4 * TIME;
  173.         IF (MY.FRAME > 1 + MY._WALKFRAMES + MY._RUNFRAMES + MY._ATTACKFRAMES) {
  174.             MY.FRAME = 1 + MY._WALKFRAMES + MY._RUNFRAMES + 1;
  175.  
  176. // watch out if player visible. If yes, then shoot at him
  177.             indicator = _WATCH;
  178.             SHOOT MY.POS,player.POS;
  179.             IF ((RESULT > 0) && (YOU == player))    // spotted him!
  180.             {
  181. // fire at player
  182.                 damage = FRC(MY._FIREMODE) * 100;
  183.                 fire_mode = MY._FIREMODE;
  184.                 IF ((fire_mode & MODE_DAMAGE) == DAMAGE_SHOOT) {
  185.                     shot_speed.X = 500;
  186.                 } ELSE {
  187.                     shot_speed.X = 100;
  188.                 }
  189.                 shot_speed.Y = 0;
  190.                 shot_speed.Z = 0;
  191.                 MY_ANGLE.PAN = MY.PAN;    // TILT is already set from TO_ANGLE
  192.                 VECROTATE shot_speed,MY_ANGLE;
  193. // now shot_speed points ahead
  194.  
  195.                 gun_muzzle.X = MY.X;
  196.                 gun_muzzle.Y = MY.Y;
  197.                 gun_muzzle.Z = MY.Z;
  198.                 PLAY_ENTSOUND ME,gun_wham,150;
  199.                 CALL gun_shot;
  200.                 MY._COUNTER -= 1;
  201.             }
  202.         }
  203.         WAIT 1;
  204.     }
  205. }
  206.  
  207. ACTION attack_approach
  208. {
  209. // calculate a direction to walk into
  210.     temp.X = player.X - MY.X;
  211.     temp.Y = player.Y - MY.Y;
  212.     temp.Z = 0;
  213.     TO_ANGLE MY_ANGLE,temp;
  214. // ADD random deviation angle
  215.     MY._TARGET_PAN = MY_ANGLE.PAN - 15 + RANDOM(30);
  216.  
  217.     WHILE ((MY._STATE == _STATE_ATTACK) && (MY._COUNTER > 0))
  218.     {
  219. // turn towards player
  220.         MY_ANGLE.PAN = MY._TARGET_PAN;
  221.         MY_ANGLE.TILT = 0;
  222.         MY_ANGLE.ROLL = 0;
  223.         force = MY._FORCE * 2;
  224.         CALL actor_turn;
  225.  
  226. // walk towards him if not too close
  227.         temp = (player.X - MY.X)*(player.X - MY.X)+(player.Y - MY.Y)*(player.Y - MY.Y);
  228.         if (temp > 0) {    //$$$10000) {
  229.             force = MY._FORCE;
  230.             MY._MOVEMODE = _MODE_WALKING;
  231.             CALL actor_move;
  232.         }
  233.  
  234.         WAIT 1;
  235.         MY._COUNTER -= TIME;
  236.     }
  237. }
  238.  
  239. // few health => try to run away
  240. ACTION state_escape
  241. {
  242.     MY._STATE = _STATE_ESCAPE;
  243.     WHILE (MY._STATE == _STATE_ESCAPE) {
  244.         IF (MY._HEALTH <= 0) { BRANCH state_die; }
  245. // turn away from player
  246.         temp.X = MY.X - player.X;
  247.         temp.Y = MY.Y - player.Y;
  248.         temp.Z = MY.Z - player.Z;
  249.         TO_ANGLE MY_ANGLE,temp;
  250.         force = MY._FORCE * 6;
  251.         CALL actor_turn;
  252.  
  253.         force = MY._FORCE * 4;
  254.         MY._MOVEMODE = _MODE_WALKING;
  255.         CALL actor_move;
  256.  
  257.         WAIT 1;
  258.     }
  259. }
  260.  
  261. // no health anymore => die animation
  262. ACTION state_die
  263. {
  264.     MY._MOVEMODE = 0;        // don't move anymore
  265.     MY._STATE = _STATE_DIE;
  266.     SET MY.ENABLE_SCAN,OFF;        // get deaf and blind
  267.     SET MY.ENABLE_SHOOT,OFF;
  268.     SET MY.EVENT,NULL;            // and don't react anymore
  269.  
  270.     MY.FRAME = 1 + MY._WALKFRAMES + MY._RUNFRAMES + MY._ATTACKFRAMES + 1;
  271. IFDEF ACKNEX_VERSION412;
  272.     MY.NEXT_FRAME = 0;    // inbetween to the real next frame
  273. ENDIF;
  274.     WHILE (MY.FRAME <= (1 + MY._WALKFRAMES + MY._RUNFRAMES + MY._ATTACKFRAMES + MY._DIEFRAMES))
  275.     {
  276.         WAIT 1;
  277.         MY.FRAME += 0.7 * TIME;
  278. //        MY.Z -= TIME;    // sink into ground a little
  279.     }
  280.     IF ((ME != player) && (MY._HITMODE & HIT_EXPLO)) {
  281.         MORPH ACTOR_EXPLO,ME;
  282.         MY._DIEFRAMES = ACTOR_EXPLO_FRAMES;
  283.         BRANCH actor_explode;
  284.     }
  285.     SET MY.PASSABLE,ON;
  286. }
  287.  
  288. ACTION state_freeze
  289. {
  290.     MY._STATE = _STATE_FREEZE;
  291.     MY._MOVEMODE = _MODE_STILL;    // stop patroilling etc.
  292.     WHILE (MY._STATE == _STATE_FREEZE) {
  293.         IF (freeze_actors > 1) { SET MY.PASSABLE,ON; }
  294.         IF (freeze_actors == 0) { BRANCH state_wait; }
  295.         WAIT 1;
  296.     }
  297. }
  298.  
  299. ////////////////////////////////////////////////////////////////////////
  300. ACTION fight_event {
  301.     IF ((EVENT_TYPE == EVENT_SCAN && indicator == _EXPLODE)
  302.         || (EVENT_TYPE == EVENT_SHOOT && indicator == _GUNFIRE))
  303.     {
  304.         MY._SIGNAL = _DETECTED;    // by shooting, player gives away his position
  305.  
  306.         if (indicator == _EXPLODE) {    // reduce damage according to distance
  307.             damage *= ABS(range - RESULT)/range;
  308.         }
  309.  
  310.         IF (MY._ARMOR <= 0) {
  311.             MY._HEALTH -= damage;
  312.         } ELSE {
  313.             MY._ARMOR -= damage;
  314.         }
  315.         RETURN;
  316.     }
  317.  
  318.     IF (EVENT_TYPE == EVENT_DETECT && YOU == player) {
  319.         indicator = _WATCH;
  320.         SHOOT MY.POS,YOUR.POS;    // can player be seen from here?
  321.         IF ((RESULT > 0) && (YOU == player)) {        // yes
  322.             MY._SIGNAL = _DETECTED;
  323.         }
  324.         RETURN;
  325.     }
  326. }
  327.  
  328. ///////////////////////////////////////////////////////////////////////
  329. ACTION player_fight
  330. {
  331.     IF (MY._HEALTH == 0) { MY._HEALTH = 100; }
  332.  
  333.     SET MY.ENABLE_SCAN,ON;
  334.     SET MY.ENABLE_SHOOT,ON;
  335.     SET MY.EVENT,fight_event;
  336.  
  337.     WHILE (MY._HEALTH > 0)
  338.     {
  339.         IF (MY._SIGNAL == _DETECTED) {    // Hit received?
  340.             MY._SIGNAL = 0;    // reset the _signal skill
  341.             IF (person_3rd == 0) {
  342.                 CALL player_shake; }
  343.         }
  344.         WAIT 1;
  345.     }
  346.  
  347. // Dead
  348.     MY._HEALTH = 0;
  349.     IF (person_3rd == 0)
  350.     {    // 1st person die action
  351.         MY._MOVEMODE = 0;        // don't move anymore
  352.         MY.EVENT = NULL;        // prevent health counting down
  353.         CALL player_tip;
  354.         WAITT 8;
  355.         CALL weapon_remove;     // let weapon disappear
  356.     } ELSE {
  357.         CALL weapon_remove;    // prevent dead player firing
  358.         BRANCH state_die;
  359.     }
  360. }