home *** CD-ROM | disk | FTP | other *** search
/ PC Games.EXE 1999 January / pcgamesexe-1999-01.iso / Warzone / data1.cab / Program_Executable_Files / script / fastplay / s-demo-ai.slo < prev    next >
Text File  |  1998-10-27  |  10KB  |  370 lines

  1. /*
  2.  * Cam1-2-AI.slo
  3.  *
  4.  * Opposition AI
  5.  *
  6.  */
  7.  
  8.  
  9. // enemy1 variables
  10. private        GROUP        enemy1Build, enemy1Attack, enemy1Start, enemy1Fin, enemy1Force1, enemy1Force2;
  11. private        GROUP        enemy2Build, enemy2Attack, enemy2Start, enemy2Fin, enemy2Force1, enemy2Force2;
  12. public        INT        rBlkX,rBlkY;
  13. public        INT        oilPatchX,oilPatchY;
  14. public        INT        playerX,playerY;
  15. private        BOOL        oilWellClear;
  16.  
  17. private        STRUCTURE    attackedStruct;
  18. private        BASEOBJ        attacker;
  19.  
  20. private        STRUCTURE    newDroidFactory;
  21.  
  22. // temporary variables
  23. private        DROID        newDroid;
  24. private        INT        moveX,moveY;
  25. private        INT        xdiff,ydiff;
  26. private        INT        ld;    //default leadership for enemy2
  27.  
  28. /* values for build lists start here */
  29. /* General Values */
  30. public        int        player;
  31. public        int        enemy1;
  32. public        int        enemy2;
  33. public        int        enemy1Tot;    //limit build to this number
  34. public        int        enemy2Tot;
  35.  
  36. /* Enemy Tactics */
  37. public        TEMPLATE    trike;
  38. public        TEMPLATE    buggy;
  39. public        TEMPLATE    bloke;
  40. public        TEMPLATE    jeep;
  41. public        TEMPLATE    rktJeep;
  42.  
  43. /* enemy1 */
  44. public        STRUCTURE    enm1;
  45. public        STRUCTUREID    enm1ID;
  46. public        int        enm1Ass1X, enm1Ass1Y;
  47. public        int        enm1Ret1X, enm1Ret1Y;
  48. public        int        enm1Ret2X, enm1Ret2Y;
  49. private        int        enm1Fact1State;
  50. private        bool        enm1Fact1Destroyed;
  51.  
  52. /* enemy2 */
  53. public        STRUCTURE    enm2;
  54. public        STRUCTUREID    enm2ID;
  55. public        int        enm2Ass1X, enm2Ass1Y;
  56. public        int        enm2Ret1X, enm2Ret1Y;
  57. public        int        enm2Ret2X, enm2Ret2Y;
  58. private        int        enm2Fact1State;
  59. private        bool        enm2Fact1Destroyed;
  60.  
  61. trigger        enemy1AttackPause( every, 3000 );    //5 mins
  62.  
  63. /* triggers for build lists start here */
  64. /* Triggers: Enemy Tactics */
  65. trigger enm1Start1Trig(droidInRange(player, enm1.x, enm1.y, 2000),10);
  66. trigger enm1Fact1Trig(every,150);
  67.  
  68. //trigger enm2Start1Trig(droidInRange(player, enm2.x, enm2.y, 2000),10);
  69. trigger enm2Start1Trig(wait, 300);    //triggered after 30 seconds
  70. trigger enm2Fact1Trig(every,100);
  71.  
  72. // event prototypes
  73. event enemy1AttackBase;
  74.  
  75.  
  76. event startup(init)
  77. {
  78. //setass here since factory might be dead if done later!!!
  79.     setAssemblyPoint (enm1, enm1Ass1X, enm1Ass1Y);
  80.     setAssemblyPoint (enm2, enm2Ass1X, enm2Ass1Y);
  81.  
  82.     //set up of positions now done in VLO
  83.  
  84.     // whether the oil well has been cleared
  85.     oilWellClear = FALSE;
  86.     ld=75;                        //enemy2 leadership (change to higher when fixed!)
  87. //set retreat stuff for non grouped units
  88.     setRetreatPoint(enemy1, enm1Ret1X, enm1Ret1Y);    //retreat to base1 by rocket pit
  89.     setRetreatForce(enemy1, 50);            //set morale to 50%
  90.     setRetreatLeadership(enemy1, 50);        //set leadership chance (small=more likely?)
  91.  
  92. //make up starting forces
  93.     //groupAddArea(enemy1Force1, enemy1, 4288, 9024, 5568, 9920);
  94.     //groupAddArea(enemy1Force2, enemy1, 1600, 10048, 2624, 10816);
  95.     //groupAddArea(enemy1Force1, enemy1, 448, 960, 1472, 1728);    //lots of blokes round back
  96.     groupAddArea(enemy1Force1, enemy1, 2496, 5824, 3136, 6336);    //4 Jeeps (West door)
  97. //set retreat point
  98.     setGroupRetreatPoint(enemy1Force1, enm1Ret1X, enm1Ret1Y);    //retreat to base1 by rocket pit
  99.     setGroupRetreatForce(enemy1Force1, 80);            //set morale to 10%
  100.     setGroupRetreatLeadership(enemy1Force1, 50);        //set leadership chance (small=more likely?)
  101.  
  102.  
  103.     //groupAddArea(enemy1Force2, enemy1, 5312, 960, 6336, 1984);    //lots of blokes near base1
  104.     groupAddArea(enemy1Force2, enemy1, 3904, 4032, 5312, 4928);    //4 Jeeps 2 blokes (east door)
  105.  
  106. //set retreat point enemy2
  107.     setGroupRetreatPoint(enemy1Force2, enm2Ret1X, enm2Ret1Y);    //retreat to base2
  108.     setGroupRetreatForce(enemy1Force2, 75);            //set morale to 25%
  109.     setGroupRetreatLeadership(enemy1Force2, ld);        //set leadership chance (small=more likely?)
  110.  
  111. }
  112.  
  113.  
  114. // deal with a droid being built by enemy1
  115. event enemy1build(CALL_NEWDROID, enemy1, ref newDroid, ref newDroidFactory)
  116. {
  117.     if (newDroidFactory == enm1) //and (idleGroup(enemy1Force1) >= enemy1Force1.members/2))    //only for 1st factory and idle
  118.     {
  119.         // see if there are any enemy droids near the base
  120.         if (droidInRange(player, enm1Ass1X, enm1Ass1Y, 9 * 128))
  121.         {
  122.             //set Morale to stubborn
  123.             setGroupRetreatPoint(enemy1Force1, enm1Ret2X, enm1Ret2Y);    //retreat to base
  124.             //setRetreatForce(enemy1, 50);            //set morale to 50%
  125.             //setRetreatLeadership(enemy1, 50);        //set leadership chance (small=more likely?)
  126.             groupAddDroid(enemy1Force1, newDroid);
  127.             // get all the droids back to base
  128.             orderGroupLoc(enemy1Force1, DORDER_SCOUT, enm1Ass1X, enm1Ass1Y);
  129.         }
  130.         else
  131.         {
  132.             groupAddDroid(enemy1Build, newDroid);
  133.             if (enemy1Build.members >= 4)
  134.             {
  135.                 groupAddGroup(enemy1Force1, enemy1Build);
  136.                 if (droidInRange(player, rBlkX,rBlkY, 8 * 128))
  137.                 {
  138.                     // in the canyon go get em
  139.                     moveX = rBlkX; moveY = rBlkY;
  140.                 }
  141.                 else
  142.                 {
  143.                     if (oilWellClear)
  144.                     {
  145.                         // go attack the base
  146.                         moveX = playerX;
  147.                         moveY = playerY;
  148.                     }
  149.                     else
  150.                     {
  151.                         // go and have a look at the derek
  152.                         moveX = oilPatchX; moveY = oilPatchY;
  153.                         //setEventTrigger(enemy1AttackBase, enemy1AttackPause);
  154.                     }
  155.  
  156.                 }
  157.  
  158.                 orderGroupLoc(enemy1Force1, DORDER_SCOUT, moveX,moveY);
  159.             }
  160.         }
  161.     }
  162. }
  163.  
  164.  
  165. // send the droids to the player base if there is nothing at
  166. // the oil derek
  167. event enemy1AttackBase( inactive )
  168. {
  169.     if (not objectInRange(player, oilPatchX, oilPatchY, 8*128))
  170.     {
  171.         orderGroupLoc(enemy1Force1, DORDER_SCOUT, playerX,playerY);
  172.         oilWellClear = TRUE;
  173.     }
  174.     else
  175.     {
  176.         oilWellClear = FALSE;
  177.     }
  178. }
  179.  
  180.  
  181. // deal with a droid being built by enemy2
  182. event enemy2build(CALL_NEWDROID, enemy2, ref newDroid, ref newDroidFactory)
  183. {
  184.  
  185.     if (newDroidFactory == enm2)    // and (idleGroup(enemy1Force2) >= enemy1Force2.members/2))    //only for 2nd factory and group idle
  186.     {
  187.         // see if there are any player droids near enemy2 base1
  188.         if (droidInRange(player, enm2Ass1X, enm2Ass1Y, 9 * 128))
  189.         {
  190.             groupAddDroid(enemy1Force2, newDroid);
  191.             //Set Morale to stubborn
  192.             setGroupRetreatPoint(enemy1Force2, enm2Ret2X, enm2Ret2Y);    //retreat to base2
  193.             //setRetreatForce(enemy2, 50);            //set morale to 50%
  194.             //setRetreatLeadership(enemy2, ld);        //set leadership chance (small=more likely?)    
  195.  
  196.             // get all the droids back to base
  197.             orderGroupLoc(enemy1Force2, DORDER_SCOUT, enm2Ass1X, enm2Ass1Y);
  198.         }
  199.         else
  200.         {
  201.             groupAddDroid(enemy2Build, newDroid);
  202.     
  203.             if (enemy2Build.members >= 4)
  204.             {
  205.                 groupAddGroup(enemy1Force2, enemy2Build);
  206.                 //set Morale low
  207.                 //setRetreatPoint(enemy2, enm2Ret2X, enm2Ret2Y);    //retreat to base2
  208.                 //setRetreatForce(enemy2, 75);            //set morale to 25%
  209.                 //setRetreatLeadership(enemy2, ld);        //set leadership chance (small=more likely?)
  210.     
  211.                 if (droidInRange(player, rBlkX,rBlkY, 8 * 128))
  212.                 {
  213.                     // in the canyon go get em
  214.                     moveX = rBlkX; moveY = rBlkY;
  215.                 }
  216.                 else
  217.                 {
  218.                     if (oilWellClear)
  219.                     {
  220.                         // go attack the base
  221.                         moveX = playerX;
  222.                         moveY = playerY;
  223.                     }
  224.                     else
  225.                     {
  226.                         // go and have a look at the derek
  227.                         moveX = oilPatchX; moveY = oilPatchY;
  228.                         setEventTrigger(enemy1AttackBase, enemy1AttackPause);
  229.                     }
  230.                 }
  231.                 orderGroupLoc(enemy1Force2, DORDER_SCOUT, moveX,moveY);
  232.             }
  233.         }
  234.     }
  235. }
  236.  
  237.  
  238.  
  239. /* events for build lists start here */
  240. /* Enemy 1 */
  241. //build list
  242. event enm1Fact1Evnt(inactive)
  243. {
  244.     enm1Fact1Destroyed = buildingDestroyed (enm1ID, enemy1);
  245.     if     (enm1Fact1Destroyed)
  246.     {
  247.          setEventTrigger(enm1Fact1Evnt, inactive);
  248.     }
  249.     else if (structureIdle(enm1) and (enemy1Build.members+enemy1Force1.members)<enemy1Tot)
  250.     {
  251.         if (enm1Fact1State == 0)
  252.         {
  253.             buildDroid (bloke, enm1, enemy1, 3);
  254.             enm1Fact1State = 1;
  255.         }
  256.         else if (enm1Fact1State == 1)
  257.         {
  258.             buildDroid (buggy, enm1, enemy1, 3);
  259.             enm1Fact1State = 2;
  260.         }
  261.         else if (enm1Fact1State == 2)
  262.         {
  263.             buildDroid (jeep, enm1, enemy1, 2);    
  264.             enm1Fact1State = 3;
  265.         }
  266.         else
  267.         {
  268.             buildDroid (rktJeep, enm1, enemy1, 2);    
  269.             enm1Fact1State = 0;
  270.         }
  271.     }
  272. }
  273.  
  274. event enm1Start1Evnt(enm1Start1Trig)
  275. {
  276.  
  277.  
  278.     //set Morale to low
  279.     //setRetreatPoint(enemy1, enm1Ret2X, enm1Ret2Y);    //retreat to base 
  280.     //setRetreatForce(enemy1, 75);            //set morale to 25%
  281.     //setRetreatLeadership(enemy1, 50);        //set leadership chance (small=more likely?)
  282. //order guys around bunker to get into position behind when player near
  283.  
  284.     orderGroupLoc(enemy1Force1, DORDER_SCOUT, playerX, playerY);
  285.  
  286.     buildDroid (bloke, enm1, enemy1, 3);        //build first ones so AI triggered
  287.     setEventTrigger(enm1Fact1Evnt, enm1Fact1Trig);
  288.     setEventTrigger(enm1Start1Evnt, inactive);
  289. }
  290.  
  291. /* Enemy 2 */
  292. //build list
  293. event enm2Fact1Evnt(inactive)
  294. {
  295.     enm2Fact1Destroyed = buildingDestroyed (enm2ID, enemy2);
  296.     if     (enm2Fact1Destroyed)
  297.     {
  298.          setEventTrigger(enm2Fact1Evnt, inactive);
  299.     }
  300.     else if (structureIdle(enm2) and (enemy2Build.members+enemy1Force2.members)<enemy2Tot)
  301.     {
  302.  
  303.         if (enm2Fact1State == 0)
  304.         {
  305.             buildDroid (bloke, enm2, enemy2, 3);
  306.             enm2Fact1State = 1;
  307.         }
  308.         else if (enm2Fact1State == 1)
  309.         {
  310.             buildDroid (buggy, enm2, enemy2, 2);
  311.             enm2Fact1State = 2;
  312.         }
  313.         else if (enm2Fact1State == 2)
  314.         {
  315.             buildDroid (jeep, enm2, enemy2, 1);    
  316.             enm2Fact1State = 3;
  317.         }
  318.         else
  319.         {
  320.             buildDroid (rktJeep, enm2, enemy2, 1);    
  321.             enm2Fact1State = 0;
  322.         }
  323.     }
  324. }
  325.  
  326. event enm2Start1Evnt(enm2Start1Trig)
  327. {
  328.  
  329.     //build first ones to Trigger AI
  330.     buildDroid (trike, enm2, enemy2, 1);
  331.     orderGroupLoc(enemy1Force2, DORDER_SCOUT, playerX, playerY);
  332.     setEventTrigger(enm2Fact1Evnt, enm2Fact1Trig);
  333.     setEventTrigger(enm2Start1Evnt, inactive);
  334. }
  335.  
  336. event enemy1Atk1(every, 20)
  337. {
  338.     if (enm1Fact1Destroyed)
  339.     {
  340. //order guys around village to attack player near enemy1 base when factory destroyed
  341.  
  342.         orderGroupLoc(enemy1Force2, DORDER_SCOUT, rBlkX, rBlkY);
  343.  
  344.         setEventTrigger(enemy1Atk1, inactive);
  345.     }
  346. }
  347.  
  348. event lastAttack1(every, 50)
  349. {
  350. //make enemy easier to find if all his buildings destroyed
  351.     if (enm1Fact1Destroyed)    //(not anyStructButWallsLeft(enemy1))
  352.     {
  353.         groupAddArea(enemy1Fin, enemy1, 0, 0, 64*128, 64*128);
  354. //go to LZ if base dead
  355.         orderGroupLoc(enemy1Fin, DORDER_SCOUT, 52*128, 55*128);
  356.         //setEventTrigger(lastAttack1, inactive);
  357.     }
  358. }
  359.  
  360. event lastAttack2(every, 50)
  361. {
  362. //make enemy easier to find if all his buildings destroyed
  363.     if (not anyStructButWallsLeft(enemy2))
  364.     {
  365.         groupAddArea(enemy2Fin, enemy1, 0, 0, 64*128, 64*128);
  366.         orderGroupLoc(enemy2Fin, DORDER_SCOUT, 52*128, 55*128);
  367.         //setEventTrigger(lastAttack2, inactive);
  368.     }
  369. }
  370.