// SCRIPT file for Cam 1-C /* General Values */ public int player; public int enemy1, enemy2; public int pow1, pow2; private int numart; private STRUCTURE newDroidFactory; /* structure limit stuff */ public STRUCTURESTAT factory, research, oilDerrick, powerGen; //public STRUCTURESTAT powerModuleHack; public STRUCTURESTAT command; public INT numPow, numExt, numFac, numRes; /* Win or lose */ public SOUND lostSnd; public LEVEL NextLev; public INT timeLimit; private GROUP allPlayer, nearLZ; private int totDroids; public TEMPLATE transporter; //required for enemy transports landing private DROID transportDroid, loadDroid; private TEMPLATE reinforceTemplate; private BOOL transOnMap; /* Base Under Attack Stuff */ private STRUCTURE hitStruc; private BASEOBJ attackerObj, viewerObj, targetObj; private int t; public SOUND attackSnd1; private DROID targetDroid; /* Briefing stuff */ public INTMESSAGE MissionBrief, MissionBrief2, MissionBrief3, MissionBrief4; //public INTMESSAGE NewParadigm_MSG1, NewParadigm_MSG2; public SOUND incomingSnd; public INTMESSAGE endMsg; //, winMsg; public INTMESSAGE obj0Msg, obj1Msg, obj2Msg; //enemy LZ's /* Proximity: Resources */ /* public FEATURE res1; public INTMESSAGE res1Msg; public SOUND res1Snd; public STRUCTURESTAT derrick; private int res1x,res1y; //temp values to cope with oil disappearing! */ /* Proximity: Artifacts */ public FEATURESTAT crate; public int art1X, art1Y; public STRUCTURE art1Get; public SOUND art1Snd2; //public INTMESSAGE art1Msg; public RESEARCHSTAT art1Comp; private FEATURE art1ID; public int art2X, art2Y; public STRUCTURE art2Get; public SOUND art2Snd2; //public INTMESSAGE art2Msg; public RESEARCHSTAT art2Comp; private FEATURE art2ID; public int art3X, art3Y; public STRUCTURE art3Get; public SOUND art3Snd2; //public INTMESSAGE art3Msg; public RESEARCHSTAT art3Comp; private FEATURE art3ID; /* No longer used public int art4X, art4Y; public STRUCTURE art4Get; public SOUND art4Snd2; //public INTMESSAGE art4Msg; public RESEARCHSTAT art4Comp; private FEATURE art4ID; */ public int art5X, art5Y; public STRUCTURE art5Get; public SOUND art5Snd2; //public INTMESSAGE art5Msg; public RESEARCHSTAT art5Comp; private FEATURE art5ID; /* player Bonus Research topics given at end of mission */ public int numResP0; public RESEARCHSTAT resP0[20]; //need to be declared with value >= numResP0, numResP1, etc. private INT count; /* Proximity: Enemy */ public STRUCTURE enm1a, enm1b, enm1c; public STRUCTUREID enm1aID, enm1bID, enm1cID; //public INTMESSAGE enm1Msg; //public SOUND enm1Snd1; //public SOUND enm1Snd2; public STRUCTURE enm2a, enm2b, enm2c; //enm2d; public STRUCTUREID enm2aID, enm2bID, enm2cID; //enm2dID; //public INTMESSAGE enm2Msg; //public SOUND enm2Snd1; //public SOUND enm2Snd2; /* AI STUFF */ // enemy1 variables private GROUP enemy1Build, enemy1Attack, enemy1Start, enemy1Fin, enemy1Force1, enemy1Force2; private GROUP enemy2Build, enemy2Attack, enemy2Start, enemy2Fin, enemy1Guard, enemy2Guard; private GROUP Strike3, Ambush1, Reserve1, IDF1, dummy1, dummy2; private GROUP Scav1, Scav2, Scav3; //public DROID sensor1, sensor2; //public DROID Ambush1Droid; //a Howitzer droid used to figure out when in position! private INT tempInt, tempx1, tempx2, tempy1, tempy2, temp1, temp2; private INT AmbushTot, Scav2Health; //for keeping track of casualties public INT playerX,playerY; private STRUCTURE attackedStruct; private BASEOBJ attacker; // temporary variables private DROID newDroid, testDroid; private INT moveX,moveY; private INT xdiff,ydiff; private INT ld; //default leadership for enemy2 /* values for build lists start here */ /* General Values */ public int enemy1Tot; //limit build to this number public int enemy2Tot; //limit build to this number /* Enemy Tactics */ public TEMPLATE trike, buggy, bloke, jeep; public TEMPLATE rktJeep, rktBuggy; public TEMPLATE BusCan, FireCan; public TEMPLATE BugRktP, BugHMG, BugSensor; public TEMPLATE ScorpMCan, ScorpMCan2, ScorpLMort; public TEMPLATE scorpTruck; /* Reinforcement Lists for New Paradigm */ public INT numScout, numHeavy; public TEMPLATE scout[3], heavy[3]; /* public TEMPLATE scorpRkt, scorpTank, scorpHow, scorpTruck; public TEMPLATE beetSensor, beetTank; */ /* enemy1 */ private int enm1aState, enm1bState, enm1cState, atkTot; private bool enm1aDestroyed, enm1bDestroyed, enm1cDestroyed; /* enemy2 */ private int enm2aState, enm2bState, enm2cState; //enm2dState; private bool enm2aDestroyed, enm2bDestroyed, enm2cDestroyed; //enm2dDestroyed; /* Values for build Commands */ public DROID enemyTruck1; //, enemyTruck2, enemyTruck3; private int comTruck1, comTruck2, comTruck3; private INT dist1, dist2, dist3; //used to calc closest repair truck! /* DON'T BOTHER!!!! Structures to be built public INT numStruc1, numStruc2, numStruc3; public STRUCTURESTAT struc1[6], struc2[2], struc3[19]; public INT struc1X[6], struc1Y[6], struc2X[2], struc2Y[2], struc3X[19], struc3Y[19]; */ private STRUCTURE testStruc; //for checking repair /* Starting nology */ public int numtecE1, numtecE2; public RESEARCHSTAT tecE1[2], tecE2[12]; /* Enemy LZs for 1CA */ public INT numLZ, enemyLZX[7], enemyLZY[7]; public SOUND warnSnd; private INT LZpos; /* Sectors to check */ public int numAtk1Sects; public int atk1SectX1[17], atk1SectY1[17], atk1SectX2[17], atk1SectY2[17]; private int as, as1, asX, asY; /* target acquisition */ public int targetMax; private int targetX[2][5], targetY[2][5]; //arrayed version of sector scout! public int st; //scouts total (2) private int targetCount[2], scoutSector[2], sectInc[2], sn; //scout number (used in loops) private GROUP Strike1[2], Strike2[2]; //scout and heavy forces private int temp; //Build oil derricks public FEATURESTAT oilRes; private FEATURE feature; public int numDefStructs; public STRUCTURESTAT defStructs[4]; private int oilFlag, oilX, oilY; private BOOL boolResult; /* Enemy Base Blips */ public int numBases, basePlayer[10]; public int baseRegion[10], baseWav1[10], baseWav2[10]; public INTMESSAGE baseMsg[10]; private int baseFlag[10]; private int basesDead; public int regionsX1[10], regionsY1[10], regionsX2[10], regionsY2[10]; public SOUND baseSnd[5]; //base detected/dead /* Triggers: Win or Lose */ trigger winLoseTrig(every, 5); trigger gameLostTrig(every, 20); /* Triggers: Briefing */ trigger vidEndTrig(CALL_VIDEO_QUIT); /* Triggers: Resource */ /* trigger res1SeenTrig(droidHasSeen(res1, player), 10); trigger res1UsedTrig(every, 10); */ /* Triggers: Artifacts */ //trigger art1SeenTrig(droidHasSeen(art1ID, player), 5); trigger art1TakeTrig(droidInRange(player, art1X, art1Y, 171), 5); trigger art1PlaceTrig((art1Get==NULLOBJECT), 5); //trigger art2SeenTrig(droidHasSeen(art2ID, player), 5); trigger art2TakeTrig(droidInRange(player, art2X, art2Y, 171), 5); trigger art2PlaceTrig((art2Get==NULLOBJECT), 5); //trigger art3SeenTrig(droidHasSeen(art3ID, player), 5); trigger art3TakeTrig(droidInRange(player, art3X, art3Y, 171), 5); trigger art3PlaceTrig((art3Get==NULLOBJECT), 5); /* //trigger art4SeenTrig(droidHasSeen(art4ID, player), 5); trigger art4TakeTrig(droidInRange(player, art4X, art4Y, 171), 5); trigger art4PlaceTrig((art4Get==NULLOBJECT), 5); */ //trigger art5SeenTrig(droidHasSeen(art5ID, player), 5); trigger art5TakeTrig(droidInRange(player, art5X, art5Y, 171), 5); trigger art5PlaceTrig((art5Get==NULLOBJECT), 5); /* Triggers: Enemy */ //trigger enm1SeenTrig(droidHasSeen(enm1a, player), 10); //enmWait //trigger enm1DeadTrig(every, 10); //enmWait //trigger enm2SeenTrig(droidHasSeen(enm2a, player), 10); //enmWait //trigger enm2DeadTrig(every, 10); //enmWait /* AI TRIGGERS */ trigger enemy1AttackPause( every, 3000 ); //5 mins /* triggers for build lists start here */ /* Triggers: Enemy Tactics */ //trigger enm1aStartTrig(droidInRange(player,enm1a.x, enm1a.y, 15*128),20); trigger enm1aStartTrig(wait, 20); trigger enm1aFactTrig(every,900); //600); trigger enm1bStartTrig(droidInRange(player,enm1b.x, enm1b.y, 15*128),20); trigger enm1bFactTrig(every,600); //400); trigger enm1cStartTrig(droidInRange(player,enm1c.x, enm1c.y, 15*128),20); trigger enm1cFactTrig(every,300); //200); //trigger enm2aStartTrig(droidInRange(player,enm2a.x, enm2a.y, 15*128),20); trigger enm2aFactTrig(every,900); //600); //trigger enm2bStartTrig(droidInRange(player,enm2b.x, enm2b.y, 15*128),20); trigger enm2bStartTrig(wait, 3000); //5 min delay on first factory trigger enm2bFactTrig(every,600); //450); trigger enm2cStartTrig(droidInRange(player,enm2c.x, enm2c.y, 15*128),20); trigger enm2cFactTrig(every,300); //trigger enm2dStartTrig(droidInRange(player,enm2d.x, enm2d.y, 15*128),20); //trigger enm2dFactTrig(every,300); trigger buildTrig(every, 30); //Triggers for ordering groups //trigger orderTrig1((droidInArea(enemy2, 4288, 12480, 6080, 14272)), 20); //for ambush force to follow trigger orderTrig1((droidInArea(player, 8896, 13760, 10048, 14656)), 10); //for ambush force to attack when player through ravine trigger orderTrig2((droidInArea(player, 6592, 14656, 8896, 15680)), 20); //for reserve force to protect South of Ravine trigger orderTrig4(every, 30); //for checking Ambush in position (so can Hold) trigger baseTrig (every, 15); /* transport triggers */ trigger landTransTrig(every, 3000); //5min delay trigger landTransTrig2(wait, 100); //10 second delay //trigger startTransTrig1(droidInArea(player, 9536, 9024, 15808, 9920), 25); //start for 1st landing trigger startTransTrig1(droidInArea(player, 10560, 6400, 16320, 8256), 25); //Moved Further NORTH! trigger startTransTrig2(droidInArea(player, 7616, 4800, 9408, 5696), 25); //start for 2nd landing trigger stopTransTrig1((numStructsButNotWallsInArea(enemy2, 12992, 3904, 14272, 5568)== 0), 35); //stop 1st landing trigger stopTransTrig2((numStructsButNotWallsInArea(enemy2, 8512, 9792, 9664, 10944)== 0), 35); //stop 2nd landing trigger obj0Trig(droidInRange(player, 6848, 13888, 5*128), 20); /* Events: Initialise */ event timeUp; /* Events: Start */ event start2Evnt; event startEvnt(CALL_GAMEINIT) { centreViewPos(11*128, 52*128); //make scavengers and New paradigm allies (just in case!) createAlliance(enemy1, enemy2); //set scroll limits // setScrollParams(0, 0, 128, 128); //limit scroll //set zoom Level 128x128 setRadarZoom(0); //stop player building on LZ initAllNoGoAreas(); setLandingZone(10, 51, 12, 53); //also don't allow building on 1CA's enemy LZs! count = 0; while (count < numLZ - 1) //don't go over 7!! SKIP LAST ONE, since changes! { setNoGoArea((enemyLZX[count]/128) - 1, (enemyLZY[count]/128) - 1, (enemyLZX[count]/128) + 1, (enemyLZY[count]/128) + 1, count + 2); //count+2 so doesn't set NP's LZ (since changes later!) count = count + 1; } //set no time limits (can carry over from previous missions if not set!) setReinforcementTime(-1); setMissionTime(timeLimit); //set Mission time limit //add enemy transport (once!) setNoGoArea((enemyLZX[0] / 128) - 1, (enemyLZY[0] / 128) - 1, (enemyLZX[0] / 128) + 1, (enemyLZY[0] / 128) + 1, enemy2); transportDroid = addDroidToMissionList(transporter, enemy2); //allow to build stuff setStructureLimits (powerGen,numPow,0); setStructureLimits (oilDerrick,numExt,0); setStructureLimits (research,numRes,0); setStructureLimits (factory,numFac,0); setStructureLimits(command, 1, player); enableStructure(command, player); enableStructure(powerGen,0); enableStructure(oilDerrick,0); enableStructure(research,0); enableStructure(factory,0); //enableStructure(powerModuleHack, 0); setPowerLevel(pow1, enemy1); setPowerLevel(pow2, enemy2); setEventTrigger(startEvnt, inactive); addMessage(obj0Msg, PROX_MSG, player, false); //show enemy Position addMessage(MissionBrief, MISS_MSG, 0, true); } event start2Evnt(CALL_VIDEO_QUIT) { //remove first part of two part message, and play second part setEventTrigger(start2Evnt, inactive); removeMessage(MissionBrief, MISS_MSG, 0); addMessage(MissionBrief2, MISS_MSG, 0, true); } event removeObj0(obj0Trig) { removeMessage(obj0Msg, PROX_MSG, player); setEventTrigger(removeObj0, inactive); } /*Events:*/ /* Events: Artifacts */ event art1TakeEvnt(inactive) { numart=numart+1; //playSound(art1Snd2, player); playSoundPos(art1Snd2, player, art1ID.x, art1ID.y, art1ID.z); destroyFeature(art1ID); //removeMessage(art1Msg, PROX_MSG, player); enableResearch(art1Comp, player); setEventTrigger(art1TakeEvnt, inactive); } event art1PlaceEvnt(art1PlaceTrig) { //place artifact crate, and allow check for prox art1ID=addFeature(crate, art1X, art1Y); //setEventTrigger(art1SeenEvnt, art1SeenTrig); setEventTrigger(art1TakeEvnt, art1TakeTrig); setEventTrigger(art1PlaceEvnt, inactive); } event art2TakeEvnt(inactive) { numart=numart+1; //playSound(art2Snd2, player); playSoundPos(art2Snd2, player, art2ID.x, art2ID.y, art2ID.z); destroyFeature(art2ID); //removeMessage(art2Msg, PROX_MSG, player); enableResearch(art2Comp, player); setEventTrigger(art2TakeEvnt, inactive); } event art2PlaceEvnt(art2PlaceTrig) { //place artifact crate, and allow check for prox art2ID=addFeature(crate, art2X, art2Y); //setEventTrigger(art2SeenEvnt, art2SeenTrig); setEventTrigger(art2TakeEvnt, art2TakeTrig); setEventTrigger(art2PlaceEvnt, inactive); } event art3TakeEvnt(inactive) { numart=numart+1; //playSound(art3Snd2, player); playSoundPos(art3Snd2, player, art3ID.x, art3ID.y, art3ID.z); destroyFeature(art3ID); //removeMessage(art3Msg, PROX_MSG, player); enableResearch(art3Comp, player); setEventTrigger(art3TakeEvnt, inactive); } event art3PlaceEvnt(art3PlaceTrig) { //place artifact crate, and allow check for prox art3ID=addFeature(crate, art3X, art3Y); //setEventTrigger(art3SeenEvnt, art3SeenTrig); setEventTrigger(art3TakeEvnt, art3TakeTrig); setEventTrigger(art3PlaceEvnt, inactive); } /* event art4TakeEvnt(inactive) { numart=numart+1; //playSound(art4Snd2, player); playSoundPos(art4Snd2, player, art4ID.x, art4ID.y, art4ID.z); destroyFeature(art4ID); //removeMessage(art4Msg, PROX_MSG, player); enableResearch(art4Comp, player); setEventTrigger(art4TakeEvnt, inactive); } event art4PlaceEvnt(art4PlaceTrig) { //place artifact crate, and allow check for prox art4ID=addFeature(crate, art4X, art4Y); //setEventTrigger(art4SeenEvnt, art4SeenTrig); setEventTrigger(art4TakeEvnt, art4TakeTrig); setEventTrigger(art4PlaceEvnt, inactive); } */ event art5TakeEvnt(inactive) { numart=numart+1; //playSound(art5Snd2, player); playSoundPos(art5Snd2, player, art5ID.x, art5ID.y, art5ID.z); destroyFeature(art5ID); //removeMessage(art5Msg, PROX_MSG, player); enableResearch(art5Comp, player); setEventTrigger(art5TakeEvnt, inactive); } event art5PlaceEvnt(art5PlaceTrig) { //place artifact crate, and allow check for prox art5ID=addFeature(crate, art5X, art5Y); //setEventTrigger(art5SeenEvnt, art5SeenTrig); setEventTrigger(art5TakeEvnt, art5TakeTrig); setEventTrigger(art5PlaceEvnt, inactive); } event wonYetEvnt; /* Events: Win or Lose */ event nextLevEvnt(inactive) //assumes victory already checked { pause(20); //increased to allow all audio before won // give bonus research (if req'd) count = 0; while (count < numResP0) { enableResearch(resP0[count], 0); count = count +1; } gameLevel=gameLevel+1; //flag next part of map //removing message unnecessary //removeMessage(MissionBrief2, MISS_MSG, player); startMission(CAMP_EXPAND, NextLev); //End game here for now! (don't try next mission) //gameOver(true); setEventTrigger(nextLevEvnt, inactive); } event gameLost(inactive) { // addMessage(endMsg, MISS_MSG, 0, true); // pause(10); // gameOver(false); gameOverMessage(endMsg, MISS_MSG, 0, false); setEventTrigger(gameLost, inactive); } event lostYetEvnt(winLoseTrig) { if (not anyDroidsLeft(player)) { if (not anyStructButWallsLeft(player)) { setEventTrigger(wonYetEvnt,inactive); setEventTrigger(gameLost, gameLostTrig); //waits 2 seconds before ending setEventTrigger(lostYetEvnt, inactive); setEventTrigger(timeUp, inactive); } } } event wonYetEvnt(winLoseTrig) // have all enemies lost yet? { if (not anyDroidsLeft(enemy2)) { if (not anyStructButWallsLeft(enemy2)) { if (not anyDroidsLeft(enemy1)) { if (not anyStructButWallsLeft(enemy1)) { if (numart==4) // a victory condition { setEventTrigger(lostYetEvnt, inactive); setEventTrigger(nextLevEvnt, winLoseTrig); setEventTrigger(wonYetEvnt, inactive); setEventTrigger(timeUp, inactive); } } } } } } event cheatEvnt(CALL_MISSION_START) //cheat button ctrl M { setEventTrigger(nextLevEvnt, winLoseTrig); setEventTrigger(cheatEvnt, inactive); } /* Base Under Attack */ event baseHit(CALL_STRUCT_ATTACKED, selectedPlayer, ref hitStruc, ref attackerObj) { if (t >= 20) { t=0; if (hitStruc != NULLOBJECT) { playSoundPos(attackSnd1, selectedPlayer, hitStruc.x, hitStruc.y, hitStruc.z); //show position if still alive } else { playSound(attackSnd1, selectedPlayer); } } } event everySec(every, 10) { t=t+1; } event seeBaseHit(CALL_MISSION_END) { //go to where the structure being attacked is on CTRL B if (hitStruc!=NULLOBJECT) { centreView(hitStruc); t=0; //flag known about! } } /* AI EVENTS */ // event prototypes //event enemy1AttackBase; event enm1bFactEvnt; event enm1cFactEvnt; event enm2bFactEvnt; event enm2cFactEvnt; //event enm2dFactEvnt; //event setBuild1; //event setBuild2; //event setBuild3; event startup(CALL_GAMEINIT) //(init) { //setass here since factory may be dead if done later!!! setAssemblyPoint (enm1a, 13248, 13632); //setAssemblyPoint (enm1b, 8384, 704); //in good place setAssemblyPoint (enm1c, 8384, 704); //setAssemblyPoint (enm2a, 13504, 13248); //12736, 14016); setAssemblyPoint (enm2b, 12736, 11456); setAssemblyPoint (enm2c, 9920, 3136); //setAssemblyPoint (enm2d, 14528, 3776); randomiseSeed(); //make scavengers allies with NP createAlliance(enemy1, enemy2); //set attack level for scavs atkTot = 4; //make up starting forces //Send sensor droids to new positions //orderDroidLoc(sensor1, DORDER_SCOUT, 6976, 13376); //orderDroidLoc(sensor2, DORDER_SCOUT, 6592, 14400); //Setup Mortar group groupAddArea(IDF1, enemy2, 8384, 15168, 9024, 15680); //orderGroupLoc(IDF1, DORDER_SCOUT, 7232, 15168); //then move into position (no good other way round!) //set up strike force (scout) groupAddArea(Strike1[0], enemy2, 8384, 13760, 8512, 14144); //rocket-sensor scout force groupAddArea(Strike2[0], enemy2, 8640, 13760, 8896, 14144); //rocket-sensor force groupAddArea(Strike1[1], enemy2, 9280, 13760, 9920, 14144); //halftrack 'scout' force groupAddArea(Strike2[1], enemy2, 9280, 14272, 9920, 14656); //tank force scoutSector[0] = 6; //first scout to south of players base as1 = scoutSector[0]; //set going immediately! asX = atk1SectX1[as1] + random(atk1SectX2[as1] - atk1SectX1[as1]); asY = atk1SectY1[as1] + random(atk1SectY2[as1] - atk1SectY1[as1]); orderGroupLoc(Strike1[0], DORDER_SCOUT, asX, asY); as1 = 3; //5; //move followup force out to 2 sectors back asX = atk1SectX1[as1] + random(atk1SectX2[as1] - atk1SectX1[as1]); asY = atk1SectY1[as1] + random(atk1SectY2[as1] - atk1SectY1[as1]); //orderGroupLoc(Strike2[0], DORDER_SCOUT, asX, asY); scoutSector[1] = 0; //3;//second scout South 1B sectInc[0] = 1; //sector increment to get to next one sectInc[1] = 1; //setGroupSecondary(Strike1, DSO_ATTACK_RANGE, DSS_ARANGE_LONG); //scout player's base groupAddArea(Ambush1, enemy2, 10944, 10816, 11712, 11712); AmbushTot=Ambush1.members; //keep note of max for checking casualties later //orderGroupObj(Ambush1, DORDER_FIRESUPPORT, sensor1); //use sensor droid for firesupport? //groupAddArea(Reserve1, enemy2, 9280, 13632, 9664, 14144); //set up Scavenger forces groupAddArea(Scav1, enemy1, 13120, 13376, 12896, 13587); //4 Jeeps groupAddArea(Scav2, enemy1, 13730, 9419, 13863, 9505); //4 Rocket Buggies //setGroupSecondary(Scav2, DSO_HALTTYPE, DSS_HALT_HOLD); //Hold position Scav2Health=Scav2.health; //keep track of casualties // player specific technology startups count = 0; while (count < numtecE1) { completeResearch(tecE1[count], enemy1); count = count +1; } count = 0; while (count < numtecE2) { completeResearch(tecE2[count], enemy2); count = count +1; } initGetFeature(oilRes, enemy2, enemy2); //build on oil resources setup } //event orderEvnt4; event enm1bFactEvnt; event enm1cFactEvnt; event orderEvnt1(orderTrig1) { //follow attack force when they're a bit ahead orderGroupLoc(Ambush1, DORDER_SCOUT, 8352, 13880); setEventTrigger(enm1bFactEvnt, enm1bFactTrig); //start mid scavs building also! playerX = 8352; //change attack point to ravine ambush playerY = 13880; //setEventTrigger(orderEvnt4, orderTrig4); setEventTrigger(orderEvnt1, inactive); } // deal with a droid being built by enemy1 event enemy1build(CALL_NEWDROID, enemy1, ref newDroid,ref newDroidFactory) { groupAddDroid(enemy1Build, newDroid); if (enemy1Build.members >= atkTot) { groupAddGroup(enemy1Attack, enemy1Build); //do attack force decision here! if (atkTot < enemy1Tot) { atkTot = atkTot + 1; } if (targetCount[0] > 0) { orderGroupLoc(enemy1Attack, DORDER_SCOUT, targetX[0][0], targetY[0][0]); //only use first target seen! } else { orderGroupLoc(enemy1Attack, DORDER_SCOUT, playerX, playerY); //go to set position } } } // deal with a droid being built by enemy2 event enemy2build(CALL_NEWDROID, enemy2, ref newDroid,ref newDroidFactory) { //check for New Truck Built!!!! if (newDroid.droidType == DROID_CONSTRUCT) { if (enemyTruck1 == NULLOBJECT) { enemyTruck1=newDroid; //setEventTrigger(setBuild1, buildTrig); } /* else if (enemyTruck2 == NULLOBJECT) { enemyTruck2=newDroid; setEventTrigger(setBuild2, buildTrig); } else if (enemyTruck3 == NULLOBJECT) { enemyTruck3=newDroid; setEventTrigger(setBuild3, buildTrig); } */ } else //just normal droid so add to attack etc. { groupAddDroid(enemy2Build, newDroid); if (enemy2Build.members >= 4) { if (enemy2Attack.members >= 4) { groupAddGroup(enemy2Attack, enemy2Build); //keep defemsive force } else { sn = 0; while (sn < st) { if (Strike1[sn].members == 0) { groupAddGroup(Strike1[sn], enemy2Build); //rebuild scout and strike groups! scoutSector[sn] = 0; //start from 1st sector again! sectInc[sn] = 1; } else if (Strike2[sn].members == 0) { groupAddGroup(Strike2[sn], enemy2Build); } sn = sn +1; } } } } } /* events for build lists start here */ /* Enemy 1 Scavengers*/ //build list Scav South factory! event enm1aFactEvnt(inactive) { enm1aDestroyed = buildingDestroyed (enm1aID, enemy1); if (enm1aDestroyed) { setEventTrigger(enm1bFactEvnt, enm1bFactTrig); //start other factory!! setEventTrigger(enm1aFactEvnt, inactive); } else if (structureIdle(enm1a) and (enemy1Build.members+enemy1Attack.members)= numStruc1) { setEventTrigger(setBuild1, inactive); setEventTrigger(buildStruc1, inactive); } } event buildStruc2(every, 30) { if (enemyTruck2 == NULLOBJECT) { setEventTrigger(setBuild2, inactive); setEventTrigger(buildStruc2, inactive); } else if (comTruck2 < numStruc2) { orderDroidStatsLoc(enemyTruck2, DORDER_BUILD, struc2[comTruck2], struc2X[comTruck2], struc2Y[comTruck2]); } setEventTrigger(setBuild2, buildTrig); setEventTrigger(buildStruc2, inactive); } event setBuild2(inactive) { if (enemyTruck2 == NULLOBJECT) { setEventTrigger(setBuild2, inactive); setEventTrigger(buildStruc2, inactive); } else if (enemyTruck2.order == DORDER_NONE) { comTruck2 = comTruck2+1; setEventTrigger(buildStruc2, buildTrig); setEventTrigger(setBuild2, inactive); } //check if finished if (comTruck2 >= numStruc2) { setEventTrigger(setBuild2, inactive); setEventTrigger(buildStruc2, inactive); } } event buildStruc3(every, 30) { if (enemyTruck3 == NULLOBJECT) { setEventTrigger(setBuild3, inactive); setEventTrigger(buildStruc3, inactive); } else if (comTruck3 < numStruc3) { orderDroidStatsLoc(enemyTruck3, DORDER_BUILD, struc3[comTruck3], struc3X[comTruck3], struc3Y[comTruck3]); } setEventTrigger(setBuild3, buildTrig); setEventTrigger(buildStruc3, inactive); } event setBuild3(inactive) { if (enemyTruck3 == NULLOBJECT) { setEventTrigger(setBuild3, inactive); setEventTrigger(buildStruc3, inactive); } else if (enemyTruck3.order == DORDER_NONE) { comTruck3=comTruck3+1; setEventTrigger(buildStruc3, buildTrig); setEventTrigger(setBuild3, inactive); } //check if finished if (comTruck3 >= numStruc3) { setEventTrigger(setBuild3, inactive); setEventTrigger(buildStruc3, inactive); } } */ /* done in factory event now! event checkTrucks(every, 30) { //check for any trucks dead, and set to manufacturing a replacement if (enemyTruck1 == NULLOBJECT) // or (enemyTruck2 == NULLOBJECT) or (enemyTruck3 == NULLOBJECT)) { enm2cState = 3; //build another one!! enm2bState = 3; //build another one!! } } //This callback doesn't seem to work! Need John to fix! /* event checkSensor(CALL_STRUCT_SEEN, player, ref hitStruc, ref viewerObj) { playSound(lostSnd,1); if (viewerObj.type == OBJ_DROID) { testDroid = objToDroid(viewerObj); if (testDroid == sensor2) { orderDroidObj(sensor2, DORDER_OBSERVE, targetDroid); } } } */ event scoutAtk1Sectors(every, 150) { sn = 0; while (sn < st) //for all 'st' forces (scout group + heavy group) { if (Strike1[sn].members == 0) { groupAddGroup(Strike1[sn], Strike2[sn]); //make next group in chain the scout group! } //check all attack areas for enemy as1 = scoutSector[sn]; //if (not (objectInArea(player, atk1SectX1[as1], atk1SectY1[as1], atk1SectX2[as1], atk1SectY2[as1]))) //if ((numStructsButNotWallsInArea(player, atk1SectX1[as1], atk1SectY1[as1], atk1SectX2[as1], atk1SectY2[as1]) == 0) // and (numStructsButNotWallsInArea(player, targetX[sn] - 768, targetY[sn] - 768, targetX[sn] + 768, targetY[sn] + 768) == 0)) //if ((random(100) < 25) and (targetCount[sn] == 0)) //25% chance of moving on if no targets //10% chance of scouting past an occupied sector (even if targets!) temp1 = numStructsButNotWallsInArea(player, atk1SectX1[as1], atk1SectY1[as1], atk1SectX2[as1], atk1SectY2[as1]); temp2 = numDroidsInArea(player, atk1SectX1[as1], atk1SectY1[as1], atk1SectX2[as1], atk1SectY2[as1]); if ((random(100) < 10) or (temp1 == 0) or (temp2 ==0)) { //sector clear so use as a retreat point setGroupRetreatPoint(Strike1[sn], Strike1[sn].x, Strike1[sn].y); //sector clear so choose another scoutSector[sn] = scoutSector[sn] + sectInc[sn]; //keep track of frontline if ((scoutSector[sn] >= numAtk1Sects) or (scoutSector[sn] < 0)) { //out of sectors! so work back through them sectInc[sn] = - sectInc[sn]; scoutSector[sn] = scoutSector[sn] + sectInc[sn]; } } if (idleGroup(Strike1[sn]) >= Strike1[sn].members / 2) { as1 = scoutSector[sn]; //order scout forces to random position in this sector asX = atk1SectX1[as1] + random(atk1SectX2[as1] - atk1SectX1[as1]); asY = atk1SectY1[as1] + random(atk1SectY2[as1] - atk1SectY1[as1]); orderGroupLoc(Strike1[sn], DORDER_SCOUT, asX, asY); } sn = sn +1; } } event attackAtk1Sector(every, 250) { //order heavies to acquired target sn = 0; while (sn < st) { if ((idleGroup(Strike2[sn]) >= Strike2[sn].members / 2) or (random(100) < 5)) { if (targetCount[sn] > 0) { //new targetting system!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! //find a target in area resetStructTargets(); if (random(100) < 10) { setStructTarPref(ST_WALL); //pick walls occassionally } hitStruc = structTargetInArea(player, enemy2, Strike2[sn].x - 768, Strike2[sn].y - 768, Strike2[sn].x + 768, Strike2[sn].y + 768); if (hitStruc != NULLOBJECT) { orderGroupObj(Strike2[sn], DORDER_ATTACK, hitStruc); } else //go to new target { orderGroupLoc(Strike2[sn], DORDER_SCOUT, targetX[sn][0] - 384 + random(768), targetY[sn][0] - 384 + random(768)); //only use first target seen! } } else { //go to previous scouted sector as1 = scoutSector[sn] - sectInc[sn]; if ((as1 >= numAtk1Sects) or (as1 < 0)) { as1 = scoutSector[sn]; } asX = atk1SectX1[as1] + random(atk1SectX2[as1] - atk1SectX1[as1]); asY = atk1SectY1[as1] + random(atk1SectY2[as1] - atk1SectY1[as1]); orderGroupLoc(Strike2[sn], DORDER_SCOUT, asX, asY); //random pos in previous sector } } sn = sn +1; } } event scavAttack(every, 190) { //update targets for scavs also if (targetCount[0] > 0) { orderGroupLoc(enemy1Attack, DORDER_SCOUT, targetX[0][0], targetY[0][0]); //only use first target seen! } else { orderGroupLoc(enemy1Attack, DORDER_SCOUT, playerX, playerY); //go to set position } } /* event flagIDF(wait, 600) { //playSound(wonSnd,0); orderGroupObj(IDF1, DORDER_FIRESUPPORT, sensor2); //use sensor droid for firesupport, once mortars hopefully in position } */ /* */ /* New Version using 2D Arrays */ /* */ event flagTargets(every, 77) //(every, 43) { //clear targets if any gone (by shuffling down array) sn = 0; while (sn < st) { if (targetCount[sn] > 0) { tempInt = 0; while (tempInt < targetCount[sn]) { /* OLD SYSTEM if (numStructsButNotWallsInArea(player, targetX[sn][tempInt] - 768, targetY[sn][tempInt] - 768, targetX[sn][tempInt] + 768, targetY[sn][tempInt] + 768) == 0) //(not (objectInRange(player, targetX[sn][tempInt], targetY[sn][tempInt], 6 * 128))) */ //find a target in area resetStructTargets(); setStructTarPref(ST_WALL); //include walls always hitStruc = structTargetInArea(player, enemy2, targetX[sn][tempInt] - 768, targetY[sn][tempInt] - 768, targetX[sn][tempInt] + 768, targetY[sn][tempInt] + 768); if (hitStruc == NULLOBJECT) { //target cleared so shuffle down count = tempInt; while (count < targetCount[sn]) { targetX[sn][count] = targetX[sn][count + 1]; targetY[sn][count] = targetY[sn][count + 1]; count = count + 1; } targetCount[sn] = targetCount[sn] - 1; //reduce total } tempInt = tempInt + 1; } } //flag new targets, if any (structures and droids but not walls!) temp1 = numStructsButNotWallsInArea(player, Strike1[sn].x - 768, Strike1[sn].y - 768, Strike1[sn].x + 768, Strike1[sn].y + 768); temp2 = numDroidsInArea(player, Strike1[sn].x - 768, Strike1[sn].y - 768, Strike1[sn].x + 768, Strike1[sn].y + 768); /* OLD SYSTEM if ((targetCount[sn] < targetMax) and ((temp1 > 0) or (temp2 > 0))) //(objectInRange(player, Strike1[sn].x, Strike1[sn].y, 6 * 128))) { */ //new targetting system!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! //find a target in area resetStructTargets(); if (random(100) < 10) { setStructTarPref(ST_WALL); //pick walls occassionally } hitStruc = structTargetInArea(player, enemy2, Strike1[sn].x - 768, Strike1[sn].y - 768, Strike1[sn].x + 768, Strike1[sn].y + 768); if ((targetCount[sn] < targetMax) and (hitStruc != NULLOBJECT)) { //playSound(lostSnd,1); targetX[sn][targetCount[sn]] = Strike1[sn].x; targetY[sn][targetCount[sn]] = Strike1[sn].y; orderGroupLoc(Strike2[sn], DORDER_SCOUT, targetX[sn][targetCount[sn]], targetY[sn][targetCount[sn]]); //if (Strike2[sn].members > Strike1[sn].members) //make heavies target this, and shoot with scouts (if more than heavies)! if ((Strike1[sn].members < temp1) or (Strike1[sn].members < temp2)) //if more objects than scouts, run away!!! { //make scout group back off one sector (unless last sector) scoutSector[sn] = scoutSector[sn] - sectInc[sn]; if ((scoutSector[sn] >= numAtk1Sects) or (scoutSector[sn] < 0)) { scoutSector[sn] = scoutSector[sn] + sectInc[sn]; } as1 = scoutSector[sn]; //order scout forces to random position in this sector asX = atk1SectX1[as1] + random(atk1SectX2[as1] - atk1SectX1[as1]); asY = atk1SectY1[as1] + random(atk1SectY2[as1] - atk1SectY1[as1]); orderGroupLoc(Strike1[sn], DORDER_SCOUT, asX, asY); //orderGroup(Strike1[sn], DORDER_RUN); //run away for a bit! } else if ((idleGroup(Strike1[sn]) >= Strike1[sn].members / 2) or (random(100) < 5)) //only if not busy or small chance { /* OLD SYSTEM orderGroup(Strike1[sn], DORDER_STOP); //stay where you are (and hopefully kill stuff) */ orderGroupObj(Strike1[sn], DORDER_ATTACK, hitStruc); } targetCount[sn] = targetCount[sn] +1; } /* OLD SYSTEM //check for targets from heavies also! temp1 = numStructsButNotWallsInArea(player, Strike2[sn].x - 768, Strike2[sn].y - 768, Strike2[sn].x + 768, Strike2[sn].y + 768); temp2 = numDroidsInArea(player, Strike2[sn].x - 768, Strike2[sn].y - 768, Strike2[sn].x + 768, Strike2[sn].y + 768); if ((targetCount[sn] < targetMax) and ((temp1 > 0) or (temp2 > 0))) */ //new targetting system!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! //find a target in area resetStructTargets(); if (random(100) < 10) { setStructTarPref(ST_WALL); //pick walls occassionally } hitStruc = structTargetInArea(player, enemy2, Strike2[sn].x - 768, Strike2[sn].y - 768, Strike2[sn].x + 768, Strike2[sn].y + 768); if ((targetCount[sn] < targetMax) and (hitStruc != NULLOBJECT)) { targetX[sn][targetCount[sn]] = Strike2[sn].x; targetY[sn][targetCount[sn]] = Strike2[sn].y; orderGroup(Strike2[sn], DORDER_STOP); //stay where you are (and hopefully kill stuff) targetCount[sn] = targetCount[sn] + 1; } sn = sn +1; } } event buildDerrick(every, 50) { //Build a new powergen if less than one if (not (structureBuilt(powerGen, enemy2))) { if (enemyTruck1 != NULLOBJECT) { if (enemyTruck1.order == DORDER_NONE) { tempx1 = enemyTruck1.x; //build as soon as poss! tempy1 = enemyTruck1.y; boolResult = pickStructLocation(powerGen, ref tempx1, ref tempy1, enemy2); if (boolResult == TRUE) { orderDroidStatsLoc(enemyTruck1, DORDER_BUILD, powerGen, tempx1, tempy1); } } } } feature = getFeature(enemy2); // find unoccupied oil resource that's been seen! if(feature != NULLOBJECT) { if (enemyTruck1 != NULLOBJECT) { if (enemyTruck1.order == DORDER_NONE) { if (oilFlag == 0) { oilX = feature.x; //keep track of coords for building defences later oilY = feature.y; orderDroidStatsLoc(enemyTruck1, DORDER_BUILD, oilDerrick, oilX, oilY); //build a derick oilFlag = random(4) + 1; //number of defences to build nearby //need special guard force to go with truck (later!). } else if (oilFlag < 6) { tempx1 = oilX + random(1024) - 512; tempy1 = oilY + random(1024) - 512; temp1 = random(numDefStructs); boolResult = pickStructLocation(defStructs[temp1], ref tempx1, ref tempy1, enemy2); if(boolResult == TRUE) { orderDroidStatsLoc(enemyTruck1, DORDER_BUILD, defStructs[temp1], tempx1, tempy1); oilFlag = oilFlag - 1; } } } } } else // feature is null { initGetFeature(oilRes, enemy2, enemy2); // start again next time. } } /* Enemy Base Blips */ event baseLoop(baseTrig) //update base blips { if (basesDead == numBases) //all bases gone? { setEventTrigger(baseLoop, inactive); } else { count = 0; while (count < numBases) { if (baseFlag[count] == 0) { if (seenStructInArea(player, basePlayer[count], FALSE, regionsX1[baseRegion[count]], regionsY1[baseRegion[count]], regionsX2[baseRegion[count]], regionsY2[baseRegion[count]])) { addMessage(baseMsg[count], PROX_MSG, player, false); if (baseWav1[count] >= 0) { //playSound(baseSnd[baseWav1[count]], player); //tricky one since don't have coords! Use middle of region?? playSoundPos(baseSnd[baseWav1[count]], player, (regionsX1[baseRegion[count]] + regionsX2[baseRegion[count]]) / 2, (regionsY1[baseRegion[count]] + regionsY2[baseRegion[count]]) / 2, 0); } baseFlag[count] = 1; } } if (baseFlag[count] == 1) { if (numStructsButNotWallsInArea(basePlayer[count], regionsX1[baseRegion[count]], regionsY1[baseRegion[count]], regionsX2[baseRegion[count]], regionsY2[baseRegion[count]])== 0) { basesDead = basesDead + 1; baseFlag[count] = 2; if (baseWav2[count] >= 0) { //playSound(baseSnd[baseWav2[count]], player); //tricky one since don't have coords! Use middle of region?? playSoundPos(baseSnd[baseWav2[count]], player, (regionsX1[baseRegion[count]] + regionsX2[baseRegion[count]]) / 2, (regionsY1[baseRegion[count]] + regionsY2[baseRegion[count]]) / 2, 0); } removeMessage(baseMsg[count], PROX_MSG, player); killStructsInArea(basePlayer[count], REF_WALL, //remove walls and building features in base regionsX1[baseRegion[count]], regionsY1[baseRegion[count]], regionsX2[baseRegion[count]], regionsY2[baseRegion[count]], TRUE, TRUE); killStructsInArea(basePlayer[count], REF_WALLCORNER, //remove corner walls in base regionsX1[baseRegion[count]], regionsY1[baseRegion[count]], regionsX2[baseRegion[count]], regionsY2[baseRegion[count]], TRUE, FALSE); } } count = count + 1; } } } /* Transports */ /* group landed enemy units and get going! */ event groupTrans(CALL_TRANSPORTER_LANDED, enemy2Build, enemy2) { //playSound(warnSnd, player); //tricky one since the LZ moves later, but uses this same event playSoundPos(warnSnd, player, enemyLZX[LZpos], enemyLZY[LZpos], 0); pause(10); //use random to figure out which groups to go into temp = random(3); if (temp == 0) { groupAddGroup(Strike1[0], enemy2Build); //rebuild scout and strike groups! scoutSector[0] = 0; //start from 1st sector again! sectInc[0] = 1; } else if (temp == 1) { groupAddGroup(Strike1[1], enemy2Build); //rebuild scout and strike groups! scoutSector[1] = 0; //start from 1st sector again! sectInc[1] = 1; } else if (temp == 2) { groupAddGroup(Strike2[0], enemy2Build); } else { groupAddGroup(Strike2[1], enemy2Build); } } event landTrans(inactive) { if (transportDroid != NULLOBJECT) { if (not transOnMap) //make sure transporter not still on map! { //transportDroid = addDroidToMissionList(transporter, enemy2); temp1 = 1 + random(5); //range 1 to 5 temp2 = 8 - temp1; //make rest upto 8 count =0; while (count < temp1) { reinforceTemplate = scout[random(numScout)]; //random selection of scouts loadDroid = addDroidToMissionList(reinforceTemplate, enemy2); if (loadDroid != NULLOBJECT) { addDroidToTransporter(transportDroid, loadDroid); } count = count + 1; } reinforceTemplate = heavy[random(numHeavy)]; //use same selection for all heavies count =0; while (count < temp2) { loadDroid = addDroidToMissionList(reinforceTemplate, enemy2); if (loadDroid != NULLOBJECT) { addDroidToTransporter(transportDroid, loadDroid); } count = count + 1; } //call in transport setTransporterExit(1, 126, 20 + random(32)); flyTransporterIn(1, 126, 60 + random(32), false); transOnMap = TRUE; setEventTrigger(landTrans, landTransTrig); //5 mins until next one } } } event startTrans1(startTransTrig1) { //need Warning message here!!!! playSound(incomingSnd, player); LZpos = 0; //used to keep track of where the LZ is for F12 pause(20); addMessage(MissionBrief4, MISS_MSG, 0, true); addMessage(obj1Msg, PROX_MSG, player, false); //show enemy LZ setNoGoArea((enemyLZX[0] / 128) - 1, (enemyLZY[0] / 128) - 1, (enemyLZX[0] / 128) + 1, (enemyLZY[0] / 128) + 1, enemy2); setEventTrigger(landTrans, landTransTrig2); setEventTrigger(startTrans1, inactive); } event startTrans2(startTransTrig2) { //need Warning message here!!!! playSound(incomingSnd, player); LZpos = 6; //used to keep track of where the LZ is for F12 pause(20); addMessage(MissionBrief3, MISS_MSG, 0, true); addMessage(obj2Msg, PROX_MSG, player, false); //show enemy LZ //move LZ setNoGoArea((enemyLZX[6] / 128) - 1, (enemyLZY[6] / 128) - 1, (enemyLZX[6] / 128) + 1, (enemyLZY[6] / 128) + 1, enemy2); setEventTrigger(landTrans, landTransTrig2); setEventTrigger(startTrans2, inactive); } event stopTrans1(stopTransTrig1) { removeMessage(obj1Msg, PROX_MSG, player); setEventTrigger(landTrans, inactive); setEventTrigger(stopTrans1, inactive); } event stopTrans2(stopTransTrig2) { removeMessage(obj2Msg, PROX_MSG, player); setEventTrigger(landTrans, inactive); setEventTrigger(stopTrans2, inactive); } event transOff(CALL_TRANSPORTER_OFFMAP, enemy2) { transOnMap = FALSE; } event timeUp(CALL_MISSION_TIME) { setEventTrigger(wonYetEvnt,inactive); setEventTrigger(lostYetEvnt,inactive); setEventTrigger(gameLost, gameLostTrig); setEventTrigger(timeUp, inactive); }