// SCRIPT file for Cam 1-7 /* General Values */ public int player; public int enemy1, enemy2; public int pow1, pow2; private int numart; //blipFlag; private STRUCTURE newDroidFactory; /* structure limit stuff */ public STRUCTURESTAT factory, research, oilDerrick, powerGen; //public STRUCTURESTAT powerModuleHack; public STRUCTURESTAT command, comRelay; public INT numPow, numExt, numFac, numRes; /* Win or lose */ public SOUND lostSnd; public LEVEL NextLev; //public TEMPLATE transporter; private int totDroids; /* Base Under Attack Stuff */ private STRUCTURE hitStruc; private BASEOBJ attackerObj; private int t; public SOUND attackSnd1; /* Transport Entry/Exit coords */ public int entryX, entryY, exitX, exitY; public TEMPLATE transporter; //required for enemy transports landing public SOUND warnSnd; public TEXTSTRING badMsg; private DROID transportDroid, loadDroid; private TEMPLATE reinforceTemplate; private BOOL transFlag; //has transport been triggered? /* Briefing stuff */ public INTMESSAGE MissionBrief, MissionBrief2; public INTMESSAGE endMsg; //, winMsg; public SOUND incomingSnd; /* LZ Message */ public INTMESSAGE LZ_MSG; public SOUND LZSnd; public INTMESSAGE obj1; public TEXTSTRING RetLZMsg; public INT ReinforceTime; public SOUND LZComp, LZClear; private BOOL playerTransOnMap; /* Proximity: Artifacts */ public FEATURESTAT crate; public int art1X, art1Y; public STRUCTURE art1Get; public SOUND art1Snd2; //public INTMESSAGE art1Msg; public RESEARCHSTAT art1Comp; public FEATURE art1ID; /* 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 STRUCTURE enm1See, enm2See, enm3See; public INTMESSAGE enm1Msg; public SOUND enm1Snd1; public SOUND enm1Snd2; public INTMESSAGE enm2Msg; public SOUND enm2Snd1; public SOUND enm2Snd2; public INTMESSAGE enm3Msg; public SOUND enm3Snd1; public SOUND enm3Snd2; /* AI STUFF */ /* Enemy Waypoints */ public INT numWay; public INT wayX[4], wayY[4]; /* Enemy Groups*/ private GROUP Recovery1, Recovery2, artGroup; private INT temp1, temp2, wayCount; private FEATURE testID; // enemy1 variables private GROUP enemy1Build, enemy1Attack, enemy1Start, enemy1Fin, enemy1Force1, enemy1Force2; private GROUP enemy2Build, enemy2Attack, enemy2Start, enemy2Fin, enemy1Guard, enemy2Guard; private GROUP Strike1, Ambush1, Reserve1; private GROUP Scav1, Scav2, Scav3; private INT tempx1, tempx2, tempy1, tempy2; private INT AmbushTot, Scav2Health; //for keeping track of casualties public INT playerX,playerY; private STRUCTURE attackedStruct; private BASEOBJ attacker; // temporary variables private DROID newDroid; private INT moveX,moveY; private INT xdiff,ydiff; private INT ld; //default leadership for enemy2 private BOOL briefFlag; //for additional briefing when NP have picked up artifact /* 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 template1[8], template2[14], template3[3]; /* enemy1 */ private int enm1aState, enm1bState, enm1cState; private bool enm1aDestroyed, enm1bDestroyed, enm1cDestroyed; /* Values for build Commands */ public DROID enemyTruck1; private int comTruck1; /* Structures to be built */ public INT numStruc1; public STRUCTURESTAT struc1[6]; public INT struc1X[6], struc1Y[6]; /* Starting Technology */ public int numtecE1, numtecE2; public RESEARCHSTAT tecE1[2], tecE2[21]; /* Triggers: Win or Lose */ //check no player droids outside LZ, and some within!! (since shouldn't use groups for player 0) //trigger checkLZTrig((droidInArea(player, 0, 6592, 1600, 8192)) and (not droidInArea(player, 0, 0, 8192, 6592)) and (not droidInArea(player, 1600, 6592, 8192, 8192)), 10); //trigger checkLZTrig((droidInArea(player, 0, 0, 8192, 8192)), 10); trigger winLoseTrig(every, 10); /* Triggers: Briefing */ trigger vidEndTrig(CALL_VIDEO_QUIT); trigger obj1Trig(droidInRange(player, 4160, 3904, 5*128), 20); /* Triggers: Artifacts */ //trigger art1SeenTrig(droidHasSeen(art1ID, player), 5); //trigger art1SeenTrig(droidInRange(player, art1X, art1Y, 12*128), 10); trigger art1TakeTrig(droidInRange(player, art1X, art1Y, 171), 10); trigger art1PlaceTrig(every, 5); trigger every10( every, 10); /* Enemy Grab Artifact */ trigger art1EnmTakeTrig(droidInRange(enemy2, art1X, art1Y, 171), 10); trigger enemyWayTrig(every, 10); //trigger startGrabTrig(droidInArea(player, 0, 3392, 7872, 4800), 10); trigger startGrabTrig(droidInArea(player, 2122, 3392, 7872, 5184), 10); /* Triggers: Enemy */ trigger enm1SeenTrig(seenStructInArea(player, enemy1, FALSE, 3136, 4288, 5056, 7616), 10); trigger enm1DeadTrig(numStructsButNotWallsInArea(enemy1, 3136, 4288, 5056, 7616) == 0, 20); trigger enm2SeenTrig(seenStructInArea(player, enemy1, FALSE, 5696, 5312, 8000, 8000), 10); trigger enm2DeadTrig(numStructsButNotWallsInArea(enemy1, 5696, 5312, 8000, 8000) == 0, 20); trigger enm3SeenTrig(seenStructInArea(player, enemy1, FALSE, 3392, 448, 8000, 1984), 10); trigger enm3DeadTrig(numStructsButNotWallsInArea(enemy1, 3392, 448, 8000, 1984) == 0, 20); /* 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 enm1aFactTrig(every,300); trigger enm1bStartTrig(droidInRange(player,enm1b.x, enm1b.y, 15*128),20); trigger enm1bFactTrig(every,300); trigger enm1cStartTrig(droidInRange(player,enm1c.x, enm1c.y, 15*128),20); trigger enm1cFactTrig(every,300); trigger buildTrig(every, 30); trigger retLZTrig(not anyDroidsLeft(enemy2), 24); //NP vehicles all dead? trigger gameLostTrig (every, 20); /* transport triggers */ trigger landTransTrig(droidInArea(player, 0, 0, 3392, 2368), 10); trigger NPTRansLeft(CALL_TRANSPORTER_OFFMAP, enemy2); trigger warnPlayerTrig(wait, 2); //extra brief //LZ contains enemies? trigger LZNoGoTrig((objectInArea(enemy1, 128, 6400, 1664, 7936)) or (objectInArea(enemy2, 128, 6400, 1664, 7936)), 35); //LZ clear of enemies? trigger LZ_OKTrig((not objectInArea(enemy1, 128, 6400, 1664, 7936)) and (not objectInArea(enemy2, 128, 6400, 1664, 7936)), 35); trigger RTLZStart(wait,0); trigger RTLZFreq(every,300); /* Events: Start */ event wonYetEvnt; event timeUp; event art1EnmTakeEvnt; event recoveryDead; event enemyWayEvnt; event startGrab2; event setBuild1; //event art1SeenEvnt; event landTrans; event LZNoGo; event LZ_OK; event periodicRTLZ; event startEvnt(CALL_GAMEINIT) { centreViewPos(7*128, 56*128); //centre near LZ //make scavengers and New paradigm allies (just in case!) createAlliance(enemy1, enemy2); //set scroll limits // setScrollParams(0, 0, 64, 64); //limit scroll //set zoom Level 64x64 setRadarZoom(1); //stop player building on LZ#1 setLandingZone(6, 55, 8, 57); //call in transport flyTransporterIn(player, entryX, entryY, false); setTransporterExit(player, exitX, exitY); //add enemy transport (once!) setNoGoArea(12, 10, 14, 12, enemy2); transportDroid = addDroidToMissionList(transporter, enemy2); setPowerLevel(pow1, enemy1); setPowerLevel(pow2, enemy2); //Blip Given at start addMessage(obj1, PROX_MSG, player, false); //allow to build stuff setStructureLimits (powerGen,numPow,0); setStructureLimits (oilDerrick,numExt,0); setStructureLimits (research,numRes,0); setStructureLimits (factory,numFac,0); setStructureLimits(command, 0, player); setStructureLimits(comRelay, 0, player); enableStructure(command, player); enableStructure(powerGen,0); enableStructure(oilDerrick,0); enableStructure(research,0); enableStructure(factory,0); //enableStructure(powerModuleHack, 0); //set transport time setReinforcementTime(ReinforceTime); //add enemy transport!! //addDroid(transporter, 1728, 1472, enemy2); //place enemy transporter!!! //get Enemy Recovery Group to pick up artifact groupAddArea(Recovery1, enemy2, 4544, 3520, 4800, 3776); // 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; } setEventTrigger(startEvnt, inactive); addMessage(MissionBrief, MISS_MSG, 0, false); flashOff(INTELMAP); } /* Events: Artifacts */ event art1TakeEvnt(art1TakeTrig) { if (art1ID != NULLOBJECT) { //stop enemy taking it!! or doing anything else! setEventTrigger(art1EnmTakeEvnt, inactive); setEventTrigger(recoveryDead, inactive); setEventTrigger(enemyWayEvnt, inactive); //setEventTrigger(art1SeenEvnt, inactive); numart=numart+1; //playSound(art1Snd2, player); playSoundPos(art1Snd2, player, art1ID.x, art1ID.y, art1ID.z); destroyFeature(art1ID); //if (blipFlag > 0) //{ // removeMessage(art1Msg, PROX_MSG, player); //} enableResearch(art1Comp, player); setEventTrigger(art1TakeEvnt, inactive); } } /* Events: Enemies */ event enm1DeadEvnt(inactive) { killStructsInArea(enemy1, REF_WALL, 3136, 4288, 5056, 7616, TRUE, TRUE); //remove walls and features in base killStructsInArea(enemy1, REF_WALLCORNER, 3136, 4288, 5056, 7616, TRUE, FALSE); //remove corner walls in base removeMessage(enm1Msg, PROX_MSG, player); //playSound(enm1Snd2, player); playSoundPos(enm1Snd2, player, 4288, 4928, 0); setEventTrigger(enm1DeadEvnt, inactive); } event enm1SeenEvnt(enm1SeenTrig) { addMessage(enm1Msg, PROX_MSG, player, false); //playSound(enm1Snd1, player); playSoundPos(enm1Snd1, player, 4288, 4928, 0); setEventTrigger(enm1DeadEvnt, enm1DeadTrig); setEventTrigger(enm1SeenEvnt, inactive); } event enm2DeadEvnt(inactive) { killStructsInArea(enemy1, REF_WALL, 5696, 5312, 8000, 8000, TRUE, TRUE); //remove walls and features in base killStructsInArea(enemy1, REF_WALLCORNER, 5696, 5312, 8000, 8000, TRUE, FALSE); //remove corner walls in base removeMessage(enm2Msg, PROX_MSG, player); //playSound(enm2Snd2, player); playSoundPos(enm2Snd2, player, 7232, 7104, 0); setEventTrigger(enm2DeadEvnt, inactive); } event enm2SeenEvnt(enm2SeenTrig) { addMessage(enm2Msg, PROX_MSG, player, false); //playSound(enm2Snd1, player); playSoundPos(enm2Snd1, player, 7232, 7104, 0); setEventTrigger(enm2DeadEvnt, enm2DeadTrig); setEventTrigger(enm2SeenEvnt, inactive); } event enm3DeadEvnt(inactive) { killStructsInArea(enemy1, REF_WALL, 3392, 448, 8000, 1984, TRUE, TRUE); //remove walls and features in base killStructsInArea(enemy1, REF_WALLCORNER, 3392, 448, 8000, 1984, TRUE, FALSE); //remove corner walls in base removeMessage(enm3Msg, PROX_MSG, player); //playSound(enm3Snd2, player); playSoundPos(enm3Snd2, player, 7616, 576, 0); setEventTrigger(enm3DeadEvnt, inactive); } event enm3SeenEvnt(enm3SeenTrig) { addMessage(enm3Msg, PROX_MSG, player, false); //playSound(enm3Snd1, player); playSoundPos(enm3Snd1, player, 7616, 576, 0); setEventTrigger(enm3DeadEvnt, enm3DeadTrig); setEventTrigger(enm3SeenEvnt, inactive); } /* 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 //setLandingZone(10, 51, 12, 53); enableResearch(art1Comp, player); removeMessage(MissionBrief, MISS_MSG, player); startMission(BETWEEN, 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(timeUp, inactive); setEventTrigger(gameLost, gameLostTrig); setEventTrigger(lostYetEvnt, inactive); } } } //out of time? event timeUp(CALL_MISSION_TIME) { setEventTrigger(wonYetEvnt,inactive); setEventTrigger(lostYetEvnt,inactive); setEventTrigger(gameLost, gameLostTrig); //waits 2 seconds before ending setEventTrigger(timeUp, inactive); } event wonYetEvnt(retLZTrig) //All NP Droids dead //(winLoseTrig) //alternate victory condition, got artifact(s) and back at LZ { totDroids = numDroidsInArea(player, 0, 0, 64*128, 64*128); //if (totDroids == numDroidsInArea(player, 5*128, 80*128, 13*128, 86*128)) if (totDroids == numDroidsInArea(player, 0, 6592, 1600, 8192)) { if (totDroids!=0) { if (numart==1) { setEventTrigger(lostYetEvnt, inactive); setEventTrigger(nextLevEvnt, winLoseTrig); setEventTrigger(wonYetEvnt, 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! } } event retLZ(retLZTrig) //ALl NP droids dead (winLoseTrig) { if (numart==1) { //add LZ blip and WAV message addMessage(LZ_MSG, PROX_MSG, player, false); setEventTrigger(periodicRTLZ,RTLZStart); // addConsoleText(RetLZMsg, player); //playSound(LZSnd, player); // playSoundPos(LZSnd, player, 960, 7232, 0); setEventTrigger(retLZ, inactive); } } event periodicRTLZ(inactive) { showConsoleText(RetLZMsg, player); playSoundPos(LZSnd, player, 960, 7232, 0); setEventTrigger(periodicRTLZ,RTLZFreq); } event removeObj1(obj1Trig) { removeMessage(obj1, PROX_MSG, player); setEventTrigger(removeObj1, inactive); } /* AI EVENTS */ event startup(init) { //setass here since factory may be dead if done later!!! setAssemblyPoint (enm1a, 4288, 5770); setAssemblyPoint (enm1b, 5824, 6080); setAssemblyPoint (enm1c, 4800, 576); //make up starting forces //set up Scavenger forces } // deal with a droid being built by enemy1 event enemy1build(CALL_NEWDROID, enemy1, ref newDroid, ref newDroidFactory) { groupAddDroid(enemy1Build, newDroid); if (enemy1Build.members >= 4) { groupAddGroup(enemy1Attack, enemy1Build); //do attack force decision here! orderGroupLoc(enemy1Attack, DORDER_SCOUT, 896, 7168); //attack player's LZ } } /* events for build lists start here */ /* Enemy 1 Scavengers*/ event enm1aFactEvnt(inactive) { enm1aDestroyed = buildingDestroyed (enm1aID, enemy1); if (enm1aDestroyed) { setEventTrigger(enm1aFactEvnt, inactive); } else if (structureIdle(enm1a) and (enemy1Build.members+enemy1Attack.members)= numStruc1) { setEventTrigger(setBuild1, inactive); setEventTrigger(buildStruc1, inactive); } } event warnPlayer(inactive) { playSound(incomingSnd, player); pause(20); addMessage(MissionBrief2, MISS_MSG, 0, true); setEventTrigger(warnPlayer, inactive); } /* Get enemy to grab the artifact */ event art1EnmTakeEvnt(art1EnmTakeTrig) { //check if enemy recovery group has got artifact temp1 = Recovery1.members; groupAddArea(Recovery2, enemy2, art1X - 171, art1Y - 171, art1X + 171, art1Y + 171); temp2 = Recovery2.members; //hack to recalc Recovery1 members also! if ((temp1 > Recovery1.members) and (temp2 > 0)) { if (art1ID != NULLOBJECT) { //stop player from taking it! setEventTrigger(art1TakeEvnt, inactive); //or seeing it! //setEventTrigger(art1SeenEvnt, inactive); setEventTrigger(art1EnmTakeEvnt, inactive); //add taker back to group //groupAddGroup(Recovery1, Recovery2); //artTake id the droid with the ball!!! groupAddGroup(artGroup, Recovery2); //remove artifact destroyFeature(art1ID); if (not briefFlag) { briefFlag = TRUE; setEventTrigger(warnPlayer, warnPlayerTrig); } //flag check for all of this group dead, so can drop artifact!! setEventTrigger(recoveryDead, art1PlaceTrig); setEventTrigger(enemyWayEvnt, enemyWayTrig); //go to LZ hopefully! if (wayCount < numWay) { orderGroupLoc(Recovery1, DORDER_SCOUT, wayX[wayCount], wayY[wayCount]); orderGroupLoc(artGroup, DORDER_MOVE, wayX[wayCount], wayY[wayCount]); } } } } event enemyWayEvnt(inactive) { if (wayCount < numWay) { //check if artGroup has got to next waypoint //if ( (artGroup.members > 0) and (artGroup.x >= wayX[wayCount] - 256) and (artGroup.y >= wayY[wayCount] - 256) and (artGroup.x <= wayX[wayCount] + 256) and (artGroup.y <= wayY[wayCount] + 256)) if ((artGroup.members > 0) and (idleGroup(artGroup) == artGroup.members )) { //add back to group wayCount = wayCount + 1; if (wayCount < numWay) { orderGroupLoc(Recovery1, DORDER_MOVE, wayX[wayCount], wayY[wayCount]); //don't use scout, get distracted! orderGroupLoc(artGroup, DORDER_MOVE, wayX[wayCount], wayY[wayCount]); } else { //got to last waypoint, so player has lost!!! //land transport to pick them up //hold position groupAddGroup(Recovery1, Recovery2); groupAddGroup(Recovery1, artGroup); setGroupSecondary(Recovery1, DSO_HALTTYPE, DSS_HALT_HOLD); setEventTrigger(landTrans, landTransTrig); setEventTrigger(enemyWayEvnt, inactive); } } } else { setEventTrigger(enemyWayEvnt, inactive); } } event recoveryDead(inactive) { //check to see if the artGroup has died if (artGroup.members == 0) { //place artifact!! art1ID=addFeature(crate, art1X, art1Y); //allow player to snatch it setEventTrigger(art1TakeEvnt, art1TakeTrig); //allow remaining recovery group to snatch it!! orderGroupLoc(Recovery1, DORDER_MOVE, art1X, art1Y); //OK on scout? setEventTrigger(enemyWayEvnt, inactive); setEventTrigger(art1EnmTakeEvnt, art1EnmTakeTrig); //need to make a new recovery force to try to snatch it back if all dead(later!) setEventTrigger(recoveryDead, inactive); } else { //mark groups position, so can drop artifact if dead art1X = artGroup.x; art1Y = artGroup.y; } } event startGrab(startGrabTrig) { //start grab earlier if player nearby! orderGroupLoc(Recovery1, DORDER_MOVE, art1X, art1Y); setEventTrigger(startGrab2, inactive); setEventTrigger(startGrab, inactive); } event startGrab2(wait, 1200) { //delay for 2 mins before they go for the grab! orderGroupLoc(Recovery1, DORDER_MOVE, art1X, art1Y); setEventTrigger(startGrab, inactive); setEventTrigger(startGrab2, inactive); } /* Transports */ /* group landed enemy units and get going! */ event groupTrans(CALL_TRANSPORTER_LANDED, Recovery1, enemy2) { setEventTrigger(recoveryDead, inactive); //don't leave artufact behind! setEventTrigger(gameLost, NPTRansLeft); setEventTrigger(wonYetEvnt,inactive); //player has lost, so can't win! //need to make this group vanish along with the artifact group //Recovery1, Recovery2, artGroup; //vanish all these! initIterateGroup(Recovery1); count = 0; while (count < Recovery1.members) { loadDroid = iterateGroup(Recovery1); vanishUnit(loadDroid); count = count + 1; } //playSound(warnSnd, player); playSoundPos(warnSnd, player, 1728, 1472, 0); showConsoleText(badMsg, player); //text version pause(10); } event landTrans(inactive) { //call enemy transport in when artifact group gets to LZ if (transportDroid != NULLOBJECT) { transFlag = TRUE; loadDroid = addDroidToMissionList(template2[0], enemy2); if (loadDroid != NULLOBJECT) { addDroidToTransporter(transportDroid, loadDroid); //call in transport setTransporterExit(enemy2, 32, 62); flyTransporterIn(enemy2, 46, 1, false); } } setEventTrigger(landTrans, inactive); } event LZNoGo(LZNoGoTrig) { if (not playerTransOnMap) //make sure transport not already landing! { //check LZ area for enemy structures and/or vehicles (in Trigger) //playSound(LZComp, player); //"LZ Compromised" playSoundPos(LZComp, player, 896, 7168, 0); //disable transport landing setReinforcementTime(LZ_COMPROMISED_TIME); //(set to 30 mins) //allow check for clear! setEventTrigger(LZ_OK,LZ_OKTrig); setEventTrigger(LZNoGo, inactive); } } event LZ_OK(inactive) { //check LZ area clear of enemy structures and/or vehicles (in Trigger) //playSound(LZClear, player); //"LZ Clear" playSoundPos(LZClear, player, 896, 7168, 0); //allow reinforcements now LZ clear setReinforcementTime(ReinforceTime); //(set back to normal) setEventTrigger(LZNoGo, LZNoGoTrig); setEventTrigger(LZ_OK, inactive); } event transOn(CALL_TRANSPORTER_REINFORCE) { playerTransOnMap = TRUE; } event transOff(CALL_TRANSPORTER_OFFMAP, player) { playerTransOnMap = FALSE; }