1
/* Script file for Cam1A (now start of Campaign 1)*/
4
/* structure limit stuff */
5
public STRUCTURESTAT factory, research, oilDerrick, powerGen;
6
public STRUCTURESTAT command;
7
//public STRUCTURESTAT powerModuleHack;
8
public INT numPow, numExt, numFac, numRes;
9
public int startPower; //initial power level
12
public BODY viperBody;
13
public CONSTRUCT spade;
14
public PROPULSION wheeledProp;
17
/* Starting Tech now done as completed research */
19
public RESEARCHSTAT tech[4];
25
private int numart; //keep track of number of artifacts collected
26
//private int res1x,res1y;
27
//public STRUCTURE commandCentre;
29
/* Base Under Attack Stuff */
30
private STRUCTURE hitStruc;
31
private BASEOBJ attackerObj;
33
public SOUND attackSnd1;
36
public INTMESSAGE MissionBrief, MissionBrief2, obj1Msg;
37
public SOUND incomingSnd;
38
public INTMESSAGE endMsg; //, winMsg;
40
//public SOUND briefSnd1, briefSnd2;
42
/* Proximity: Resources */
45
public INTMESSAGE res1Msg;
47
public STRUCTURESTAT derrick;
50
/* Proximity: Artifacts */
51
public FEATURESTAT crate;
53
public int art1X, art1Y;
54
public STRUCTURE art1Get;
55
public SOUND art1Snd2;
56
//public INTMESSAGE art1Msg;
57
public RESEARCHSTAT art1Comp; //Engineering Upgrade
58
private FEATURE art1ID;
60
public int art2X, art2Y;
61
public STRUCTURE art2Get;
62
public SOUND art2Snd2;
63
//public INTMESSAGE art2Msg;
64
public RESEARCHSTAT art2Comp; //Repair Facility (NOT Robotics)
65
private FEATURE art2ID;
67
public int art3X, art3Y;
68
public STRUCTURE art3Get;
69
public SOUND art3Snd2;
70
//public INTMESSAGE art3Msg;
71
public RESEARCHSTAT art3Comp; //Flamer
72
private FEATURE art3ID;
74
public int art4X, art4Y;
75
//public STRUCTURE art4Get; //placed in script
76
public SOUND art4Snd2;
77
//public INTMESSAGE art4Msg;
78
public RESEARCHSTAT art4Comp; //Light Machine Gun Mk1
79
private FEATURE art4ID;
81
/* player Bonus Research topics given at end of mission */
83
public RESEARCHSTAT resP0[20]; //need to be declared with value >= numResP0, numResP1, etc.
86
/* Proximity: Enemy */
87
public STRUCTURE enm0;
88
public INTMESSAGE enm0Msg;
89
public SOUND enm0Snd1;
90
public SOUND enm0Snd2;
92
public STRUCTURE enm1;
93
public STRUCTUREID enm1ID;
94
public INTMESSAGE enm1Msg;
95
public SOUND enm1Snd1;
96
public SOUND enm1Snd2;
98
public STRUCTURE enm2;
99
public STRUCTUREID enm2ID;
100
public INTMESSAGE enm2Msg;
101
public SOUND enm2Snd1;
102
public SOUND enm2Snd2;
103
public STRUCTURE enm22;
104
public STRUCTUREID enm22ID;
105
public INTMESSAGE enm22Msg;
106
public SOUND enm22Snd1;
107
//public SOUND enm22Snd2;
108
private BOOL base2Flag;
111
public TEMPLATE trike;
112
public TEMPLATE buggy;
113
public TEMPLATE bloke;
114
public TEMPLATE jeep;
117
public SOUND lostSnd;
118
public LEVEL NextLev;
119
public INT timeLimit;
121
//group to stop players droids chsing too much!!
122
private GROUP allPlayer, scavGroup;
124
/* Triggers: Resource */
126
trigger res1SeenTrig(droidHasSeen(res1, player), 10); //resWait
127
trigger res1UsedTrig(every, 10); //resWait
128
//trigger res1UsedTrig(CALL_RESEX_BUILT); //until built function fixed
131
/* Triggers: Artifacts */
132
//trigger art1SeenTrig(droidInRange(player, art1X, art1Y, 512), 5);
133
//trigger art1SeenTrig(droidHasSeen(art1ID, player), 5);
134
trigger art1TakeTrig(droidInRange(player, art1X, art1Y, 171), 5);
135
trigger art1PlaceTrig((art1Get==NULLOBJECT), 5);
137
//trigger art2SeenTrig(droidInRange(player, art2X, art2Y, 512), 5);
138
//trigger art2SeenTrig(droidHasSeen(art2ID, player), 5);
139
trigger art2TakeTrig(droidInRange(player, art2X, art2Y, 171), 5);
140
trigger art2PlaceTrig((art2Get==NULLOBJECT), 5);
142
//trigger art3SeenTrig(droidInRange(player, art3X, art3Y, 512), 5);
143
//trigger art3SeenTrig(droidHasSeen(art3ID, player), 5);
144
trigger art3TakeTrig(droidInRange(player, art3X, art3Y, 171), 5);
145
trigger art3PlaceTrig((art3Get==NULLOBJECT), 5);
147
//trigger art4SeenTrig(droidInRange(player, art4X, art4Y, 512), 5);
148
//trigger art4SeenTrig(droidHasSeen(art4ID, player), 5);
149
trigger art4TakeTrig(droidInRange(player, art4X, art4Y, 171), 5);
150
//trigger art4PlaceTrig((art4Get==NULLOBJECT), 5);
153
/* Triggers: Enemy */
154
trigger enm0SeenTrig(seenStructInArea(player, enemy1, FALSE, 3520, 4416, 4416, 5056), 10);
155
trigger enm0DeadTrig((numStructsButNotWallsInArea(enemy1, 3520, 4416, 4416, 5056) == 0), 20);
157
trigger enm1SeenTrig(seenStructInArea(player, enemy1, FALSE, 4544, 1856, 5440, 2496), 10);
158
trigger enm1DeadTrig((numStructsButNotWallsInArea(enemy1, 4544, 1856, 5440, 2496) == 0), 20);
160
trigger enm2SeenTrig(seenStructInArea(player, enemy2, FALSE, 1088, 1216, 2240, 2240), 10);
161
trigger enm2DeadTrig((numStructsButNotWallsInArea(enemy2, 1088, 1216, 2240, 2240) == 0), 20);
163
trigger enm22SeenTrig(seenStructInArea(player, enemy2, FALSE, 1472, 3776, 2752, 5440), 10);
164
trigger enm22DeadTrig((numStructsButNotWallsInArea(enemy2, 1472, 3776, 2752, 5440) == 0), 20);
168
/* Triggers: Win or Lose */
169
trigger winLoseTrig(every, 5);
170
trigger gameLostTrig(every, 20);
172
/* initial scav attack */
173
trigger scavtrig(every, 100); //better if checks for HQ built?
174
trigger scavtrig2(droidInArea(player, 2496, 6080, 4928, 7232), 5);
175
trigger scavtrig3(wait, 1); //go immediately
176
trigger obj1Trig(droidInRange(player, 4928, 6592, 5*128), 20);
178
/* Events: Initialise */
182
//event art4SeenEvnt;
188
event startEvnt(CALL_GAMEINIT)
190
//take over the selectedPlayer's units to avoid id number clashes on later levels
191
takeOverDroidsInArea(0,0, 0,0, mapWidth*128, mapHeight*128);
194
// setScrollParams(0, 0, 64, 70); //limit scroll
195
//centreView(commandCentre);
196
centreViewPos(1728, 6720); //centre near transport
197
//set zoom Level 64x64
200
setPowerLevel(startPower,player);
203
makeComponentAvailable(viperBody, player);
204
makeComponentAvailable(spade, player);
205
makeComponentAvailable(wheeledProp, player);
207
makeComponentAvailable(mg, player); //needs to be done this way so doesn't enable rest of tree!
210
while (count < numTech)
212
completeResearch(tech[count], player);
215
//give player briefing
216
addMessage(MissionBrief, CAMP_MSG, player, false);
217
//make sure all buttons available
218
addReticuleButton(OPTIONS);
219
addReticuleButton(CANCEL);
220
addReticuleButton(BUILD);
221
addReticuleButton(MANUFACTURE);
222
addReticuleButton(RESEARCH);
223
addReticuleButton(INTELMAP);
224
addReticuleButton(DESIGN);
225
//stop player building on LZ
226
setLandingZone(10, 51, 12, 53);
227
//stop players droids from chasing!
228
/* not any more - john
229
groupAddArea(allPlayer, player, 0, 30*128, 40*128, 70*128);
230
setGroupSecondary(allPlayer,DSO_HALTTYPE, DSS_HALT_HOLD);
233
//set no time limits (can carry over from previous missions if not set!)
234
setReinforcementTime(-1);
235
setMissionTime(timeLimit); //set Mission time limit
237
///allow to build stuff
238
setStructureLimits (powerGen,numPow,0);
239
setStructureLimits (oilDerrick,numExt,0);
240
setStructureLimits (research,numRes,0); // numRes changed by Keith to set Research Facility Limits to 1, until.... 1C
241
setStructureLimits (factory,numFac,0);
242
setStructureLimits(command, 1, player);
243
enableStructure(command, player);
244
enableStructure(powerGen,0);
245
enableStructure(oilDerrick,0);
246
enableStructure(research,0);
247
enableStructure(factory,0);
248
//enableStructure(powerModuleHack, 0);
250
//add machine gun crate *** BACK IN ***
251
//now got from new 1st base
252
art4ID=addFeature(crate, art4X, art4Y);
253
//setEventTrigger(art4SeenEvnt, art4SeenTrig);
254
//setEventTrigger(art4TakeEvnt, art4TakeTrig); //set from start since didn't always set!!
256
//set up initial attack group
257
groupAddArea(scavGroup, enemy1, 4416, 6336, 5440, 7104);
259
setGroupRetreatPoint(scavGroup, 4416, 5440); //retreat to crossroads
260
setGroupRetreatForce(scavGroup, 99); //set morale to 1%
261
setGroupRetreatLeadership(scavGroup, 10); //set leadership chance 10% (small=more likely)
263
setEventTrigger(startEvnt, inactive);
267
/* Events: Artifacts */
268
event art1TakeEvnt(inactive)
271
//playSound(art1Snd2, player);
272
playSoundPos(art1Snd2, player, art1ID.x, art1ID.y, art1ID.z);
273
destroyFeature(art1ID);
274
//removeMessage(art1Msg, PROX_MSG, player);
275
enableResearch(art1Comp, player);
276
setEventTrigger(art1TakeEvnt, inactive);
279
event art1PlaceEvnt(art1PlaceTrig)
281
//place artifact crate, and allow check for prox
282
art1ID=addFeature(crate, art1X, art1Y);
283
//setEventTrigger(art1SeenEvnt, art1SeenTrig);
284
setEventTrigger(art1TakeEvnt, art1TakeTrig);
285
setEventTrigger(art1PlaceEvnt, inactive);
288
event art2TakeEvnt(inactive)
291
//playSound(art2Snd2, player);
292
playSoundPos(art2Snd2, player, art2ID.x, art2ID.y, art2ID.z);
293
destroyFeature(art2ID);
294
//removeMessage(art2Msg, PROX_MSG, player);
295
enableResearch(art2Comp, player);
296
setEventTrigger(art2TakeEvnt, inactive);
299
event art2PlaceEvnt(art2PlaceTrig)
301
//place artifact crate, and allow check for prox
302
art2ID=addFeature(crate, art2X, art2Y);
303
//setEventTrigger(art2SeenEvnt, art2SeenTrig);
304
setEventTrigger(art2TakeEvnt, art2TakeTrig);
305
//make sure art2 placed before base2 dead
306
//setEventTrigger(enm2DeadEvnt, enm2DeadTrig);
307
//make sure art2 placed before mission won as well!!!
308
setEventTrigger(wonYetEvnt, winLoseTrig);
309
setEventTrigger(art2PlaceEvnt, inactive);
312
event art3TakeEvnt(inactive)
315
destroyFeature(art3ID);
316
//playSound(art3Snd2, player);
317
playSoundPos(art3Snd2, player, art3ID.x, art3ID.y, art3ID.z);
318
//removeMessage(art3Msg, PROX_MSG, player);
319
enableResearch(art3Comp, player);
320
setEventTrigger(art3TakeEvnt, inactive);
323
event art3PlaceEvnt(art3PlaceTrig)
325
//place artifact crate, and allow check for prox
326
art3ID=addFeature(crate, art3X, art3Y);
327
//setEventTrigger(art3SeenEvnt, art3SeenTrig);
328
setEventTrigger(art3TakeEvnt, art3TakeTrig);
329
setEventTrigger(art3PlaceEvnt, inactive);
332
event art4TakeEvnt(art4TakeTrig) //mg crate (placed at start of script)
335
destroyFeature(art4ID);
336
//playSound(art4Snd2, player);
337
playSoundPos(art4Snd2, player, art4ID.x, art4ID.y, art4ID.z);
338
//removeMessage(art4Msg, PROX_MSG, player);
339
enableResearch(art4Comp, player);
340
setEventTrigger(art4TakeEvnt, inactive);
343
/* Events: Enemies */
344
event enm0DeadEvnt(inactive) //newbase dead?
346
killStructsInArea(enemy1, REF_WALL, 3520, 4416, 4416, 5056, TRUE, TRUE); //remove walls and building features in base
347
killStructsInArea(enemy1, REF_WALLCORNER, 3520, 4416, 4416, 5056, TRUE, FALSE); //remove corner walls in base
348
removeMessage(enm0Msg, PROX_MSG, player);
349
//playSound(enm0Snd2, player);
350
playSoundPos(enm0Snd2, player, 3904, 4672, 0); //should be same as in prox1a.txt
351
setEventTrigger(enm0DeadEvnt, inactive);
354
event enm0SeenEvnt(enm0SeenTrig) //base 2 seen
356
addMessage(enm0Msg, PROX_MSG, player, false);
357
//playSound(enm0Snd1, player);
358
playSoundPos(enm0Snd1, player, 3904, 4672, 0); //should be same as in prox1a.txt
359
setEventTrigger(enm0DeadEvnt, enm0DeadTrig);
360
setEventTrigger(enm0SeenEvnt, inactive);
363
event enm1DeadEvnt(inactive)
365
killStructsInArea(enemy1, REF_WALL, 4544, 1856, 5440, 2496, TRUE, TRUE); //remove walls and features in base
366
killStructsInArea(enemy1, REF_WALLCORNER, 4544, 1856, 5440, 2496, TRUE, FALSE); //remove corner walls in base
367
removeMessage(enm1Msg, PROX_MSG, player);
368
//playSound(enm1Snd2, player);
369
playSoundPos(enm1Snd2, player, 5002, 2154, 135); //should be same as in prox1a.txt
370
//trigger 2nd base blip if not already triggered
374
addMessage(enm2Msg, PROX_MSG, player, false);
375
//playSound(enm2Snd1, player);
376
playSoundPos(enm2Snd1, player, 1600, 1728, 0); //should be same as in prox1a.txt
377
setEventTrigger(enm2DeadEvnt, enm2DeadTrig);
378
setEventTrigger(enm2SeenEvnt, inactive);
380
setEventTrigger(enm1DeadEvnt, inactive);
383
event enm1SeenEvnt(enm1SeenTrig)
385
addMessage(enm1Msg, PROX_MSG, player, false);
386
//playSound(enm1Snd1, player);
387
playSoundPos(enm1Snd1, player, 5002, 2154, 135); //should be same as in prox1a.txt
388
setEventTrigger(enm1DeadEvnt, enm1DeadTrig);
389
setEventTrigger(enm1SeenEvnt, inactive);
392
event enm2DeadEvnt(inactive) //base 2 dead?
394
killStructsInArea(enemy2, REF_WALL, 1088, 1216, 2240, 2240, TRUE, TRUE); //remove walls and features in base
395
killStructsInArea(enemy2, REF_WALLCORNER, 1088, 1216, 2240, 2240, TRUE, FALSE); //remove corner walls in base
396
removeMessage(enm2Msg, PROX_MSG, player);
397
//playSound(enm2Snd2, player);
398
playSoundPos(enm2Snd2, player, 1600, 1728, 0); //should be same as in prox1a.txt
399
setEventTrigger(enm2DeadEvnt, inactive);
402
event enm2SeenEvnt(enm2SeenTrig) //base 2 seen (used to be wrong trigger!)
405
addMessage(enm2Msg, PROX_MSG, player, false);
406
//playSound(enm2Snd1, player);
407
playSoundPos(enm2Snd1, player, 1600, 1728, 0); //should be same as in prox1a.txt
408
setEventTrigger(enm2DeadEvnt, enm2DeadTrig);
409
setEventTrigger(enm2SeenEvnt, inactive);
412
event enm22DeadEvnt(inactive) //base 2A dead?
414
killStructsInArea(enemy2, REF_WALL, 1472, 3776, 2752, 5440, TRUE, TRUE); //remove walls and features in base
415
killStructsInArea(enemy2, REF_WALLCORNER, 1472, 3776, 2752, 5440, TRUE, FALSE); //remove corner walls in base
416
removeMessage(enm22Msg, PROX_MSG, player);
417
//playSound(enm2Snd2, player); //should this be enm22Snd2?
418
playSoundPos(enm2Snd2, player, 2112, 4544, 0); //should be same as in prox1a.txt
419
setEventTrigger(enm22DeadEvnt, inactive);
422
event enm22SeenEvnt(enm22SeenTrig) //base 2A seen
424
addMessage(enm22Msg, PROX_MSG, player, false);
425
//playSound(enm22Snd1, player);
426
playSoundPos(enm22Snd1, player, 2112, 4544, 0); //should be same as in prox1a.txt
427
setEventTrigger(enm22DeadEvnt, enm22DeadTrig);
428
setEventTrigger(enm22SeenEvnt, inactive);
431
/* Events: Win or Lose */
433
event nextLevEvnt(inactive) //assumes victory already checked
436
pause(40); //increased to allow all audio before won
438
// give bonus research (if req'd)
440
while (count < numResP0)
442
enableResearch(resP0[count], 0);
446
gameLevel=gameLevel+1; //flag next part of map
447
//removeMessage(MissionBrief, MISS_MSG, player);
448
startMission(CAMP_EXPAND, NextLev);
449
setEventTrigger(nextLevEvnt, inactive);
452
event gameLost(inactive)
454
// addMessage(endMsg, MISS_MSG, 0, true);
457
gameOverMessage(endMsg, MISS_MSG, 0, false);
458
setEventTrigger(gameLost, inactive);
461
event lostYetEvnt(winLoseTrig)
463
if (not anyDroidsLeft(player))
465
if (not anyStructButWallsLeft(player))
467
setEventTrigger(wonYetEvnt,inactive);
468
setEventTrigger(gameLost, gameLostTrig); //waits 2 seconds before ending
469
setEventTrigger(lostYetEvnt, inactive);
470
setEventTrigger(timeUp, inactive);
476
event wonYetEvnt(inactive) // have all enemies lost yet, and all artifacts picked up?
478
if (not anyDroidsLeft(enemy2))
480
if (not anyStructButWallsLeft(enemy2))
482
if (not anyDroidsLeft(enemy1))
484
if (not anyStructButWallsLeft(enemy1))
488
setEventTrigger(lostYetEvnt, inactive);
489
setEventTrigger(nextLevEvnt, winLoseTrig);
490
setEventTrigger(wonYetEvnt, inactive);
491
setEventTrigger(timeUp, inactive);
499
event cheatEvnt(CALL_MISSION_START) //cheat button ctrl M
501
setEventTrigger(nextLevEvnt, winLoseTrig);
502
setEventTrigger(cheatEvnt, inactive);
506
/* Base Under Attack */
507
event baseHit(CALL_STRUCT_ATTACKED, selectedPlayer, ref hitStruc, ref attackerObj)
512
if (hitStruc != NULLOBJECT)
514
playSoundPos(attackSnd1, selectedPlayer, hitStruc.x, hitStruc.y, hitStruc.z); //show position if still alive
518
playSound(attackSnd1, selectedPlayer);
523
event everySec(every, 20)
528
event seeBaseHit(CALL_MISSION_END)
530
//go to where the structure being attacked is on CTRL B
531
if (hitStruc!=NULLOBJECT)
533
centreView(hitStruc);
534
t=0; //flag known about!
538
event removeObj1(inactive)
540
removeMessage(obj1Msg, PROX_MSG, player);
541
setEventTrigger(removeObj1, inactive);
545
event scavAttack(scavtrig)
547
setEventTrigger(scavAttack2, inactive);
548
setEventTrigger(scavAttack, inactive);
549
//setEventTrigger(removeObj1, obj1Trig);
550
//addMessage(MissionBrief2, MISS_MSG, player, true);
551
//addMessage(obj1Msg, PROX_MSG, player, false);
552
//orderGroupLoc(scavGroup, DORDER_SCOUT, 2100, 6700);
556
event scavAttack2(scavtrig2)
558
//setEventTrigger(scavAttack, inactive);
559
playSound(incomingSnd, player);
561
setEventTrigger(scavAttack2, inactive);
562
setEventTrigger(removeObj1, obj1Trig);
563
addMessage(MissionBrief2, MISS_MSG, player, true);
564
addMessage(obj1Msg, PROX_MSG, player, false);
565
orderGroupLoc(scavGroup, DORDER_SCOUT, 2100, 6700);
568
event timeUp(CALL_MISSION_TIME)
570
setEventTrigger(wonYetEvnt,inactive);
571
setEventTrigger(lostYetEvnt,inactive);
572
setEventTrigger(gameLost, gameLostTrig);
573
setEventTrigger(timeUp, inactive);