Complete disaster-recovery snapshot: engine/game source, game data assets, VC6 toolchain + DX SDKs, build outputs, deployed game, and _UNUSED archive. Large binaries in Git LFS; text preserved byte-for-byte (core.autocrlf=false, no eol attributes). See RECOVERY.md for the one-clone rebuild procedure.
1081 lines
26 KiB
Plaintext
1081 lines
26 KiB
Plaintext
|
|
//*********************************************************************************
|
|
//
|
|
//[[GlobalTrigger Usage]]
|
|
// 0 - never use this trigger fo safety!!!
|
|
// in AttackHero.abl, see GetGlobalTrigger(GetMemoryInteger(ME,31)) for teleport back!!!
|
|
// initially GetMemoryInteger(ME,31) is 0, so don't use trigger 0
|
|
//
|
|
// 11, 12, 13, 14, 15: start sub stage 1-4(=boss) + bonus1 - teleport enemys back!!!
|
|
// 21, 22, 23, 24, 25: start sub stage 1-4(=boss) + bonus1 - player is ready, enemy start fighting!!!
|
|
// 19 & 29 is dummy...
|
|
|
|
// 4: ask score display... & time bonus too....
|
|
// 5: score displayed... continue...
|
|
//
|
|
// 6: ask continue? for mission-failure...
|
|
// 7: true if user answered for 6
|
|
|
|
//[[MemoryInteger Usage]]
|
|
// 30: GlobalTrigger Index(21-24) see above...
|
|
// 31: GlobalTrigger Index(11-14) see above...
|
|
// 29: Should I jump from sky?
|
|
// 28: Path for patrol
|
|
//
|
|
//[[Timer Usage]]
|
|
// 6: current sub-stage timer - resetted as 0.0f on sub-stage start and accumulated in that sub-stage
|
|
// 7: current sub-stage timer - resetted as 0.0f on sub-stage start and resetted on continue situation...
|
|
// currently used in .cpp: mwapplication.cpp, mw4shell.cpp // Timer(6) && Timer(7)
|
|
// 8: for checking player's dying after mission-success, for 6? secs...
|
|
// 10: effect play timer - resetted as 0.0f on sub-stage start
|
|
//
|
|
//[[.abl source management]]
|
|
//
|
|
// * just edit s1s1.abl and copy&rename s1s1.abl as s1s2.abl, s1s3.abl
|
|
// * attackhero.abl should be same for all 3 missions(s1s1,s1s2,s1s3)
|
|
//
|
|
// stage 1 - used only in s1s1.abl
|
|
// stage 2 - used only in s1s2.abl
|
|
// stage 3 - used only in s1s3.abl
|
|
//
|
|
// check : nStageNumber = GetCOOP(-1);
|
|
//
|
|
// nStageNumber could be 1, 2 or 3 for s1s1/s1s2/s1s3.abl
|
|
// currently s1s1 & s1s3 is same(except bonus stage) & s1s2 is sligtly different with s1s1&s1s3
|
|
//
|
|
// check "stage " for correct stage scipting
|
|
//
|
|
// to uncomment below block
|
|
//
|
|
// /* comment - begin
|
|
// */ comment - end
|
|
//
|
|
// change as like below
|
|
//
|
|
// //* comment - begin
|
|
// //*/ comment - end
|
|
//
|
|
// i.e. insert / at the start of comment block
|
|
// i.e. insert // at the end of comment block
|
|
//
|
|
//*********************************************************************************
|
|
|
|
fsm Script4COOP : integer;
|
|
|
|
const
|
|
|
|
#include_ <content\ABLScripts\mwconst.abi>
|
|
|
|
// see & sync w/ "mwmission.hpp"
|
|
COOP_MISC_START = 0;
|
|
MAX_COOP_MISCS = 100;
|
|
|
|
COOP_SUBSTAGE_SCORE_OLD = 101;
|
|
|
|
COOP_ENEMY_GROUP = 102;
|
|
COOP_ENEMY_GROUP_OLD = 103;
|
|
|
|
COOP_MODAL_START = 104;
|
|
COOP_MODAL_IS_ENDED = 105;
|
|
|
|
COOP_SUBSTAGE_TIMEGOAL = 106;
|
|
COOP_SUBSTAGE_NUMBER = 107;
|
|
|
|
MAX_COOP_VARS = 108;
|
|
|
|
type
|
|
|
|
#include_ <content\ABLScripts\mwtype.abi>
|
|
|
|
var
|
|
|
|
eternal integer playermech;
|
|
|
|
static integer cinema_cut;
|
|
|
|
static integer group_player;
|
|
static integer group_1;
|
|
static integer group_2;
|
|
static integer group_3;
|
|
static integer group_boss;
|
|
static integer group_b1org;
|
|
static integer group_b1;
|
|
static integer group_b1blds;
|
|
|
|
static integer old_stage; // should be
|
|
static integer old_group_Enemy; // should be
|
|
static integer cur_stage; // should be
|
|
static integer new_stage; // could be 1...end-state
|
|
static integer cur_objective; // should be
|
|
static integer new_objective; // should be
|
|
static integer cur_obj_time;
|
|
static integer cur_end_time;
|
|
static integer group_Enemy;
|
|
static integer cur_tele_trigger;
|
|
static integer cur_tele_trigger2;
|
|
static integer cur_eye_Target;
|
|
static integer nDmgHero;
|
|
static integer nDmgEnemy;
|
|
|
|
static locpoint PlayerStart;
|
|
static locpoint LookLoc;
|
|
static integer DROP_OFFS_Y;
|
|
static locpoint Dummy_HellPoint;
|
|
|
|
static integer nStageNumber;
|
|
|
|
static integer nTemp1;
|
|
static integer nTemp2;
|
|
static integer nTemp3;
|
|
static integer nTemp4;
|
|
|
|
static real fDyingBegin;
|
|
static integer nPlayerPaused;
|
|
static integer nEnemyPaused;
|
|
|
|
static locpoint loc_1;
|
|
static locpoint loc_2;
|
|
static locpoint loc_3;
|
|
static locpoint loc_boss;
|
|
static locpoint loc_b1;
|
|
|
|
static integer n30notified;
|
|
static integer n60notified;
|
|
static integer nLastNotified;
|
|
|
|
function SetBotLevel(ObjectID obj, integer bot_level);
|
|
var
|
|
real minDelay; // Minimum amount of time I will wait between shots once a weapon is reloaded
|
|
real maxDelay; // Maximum amount of time I will wait between shots once a weapon is reloaded
|
|
integer isShotRadius; // How far away from me will I detect an enemy shot?
|
|
integer mood; // mood.
|
|
integer piloting; // Piloting skill
|
|
integer gunnery; // Gunnery skill/chance to hit
|
|
integer eliteLevel; // Elite level. This helps determine tactics, defensive manuevers, opportunity fire
|
|
integer attackThrottle; // My attack throttle
|
|
Boolean EnablePWRC;
|
|
integer minspeed;
|
|
code
|
|
EnablePWRC = false;
|
|
minspeed = 0;
|
|
|
|
switch(bot_level)
|
|
case -1:
|
|
minDelay = 10000.0;
|
|
maxDelay = 10000.0;
|
|
|
|
isShotRadius = 1;
|
|
mood = DESPERATE_START;
|
|
|
|
piloting = 0;
|
|
gunnery = 0;
|
|
eliteLevel = 0;
|
|
|
|
attackThrottle = 1;
|
|
|
|
EnablePWRC = false;
|
|
endcase;
|
|
case 0: // WussyBot.abl
|
|
minDelay = 3.0;
|
|
maxDelay = 8.0;
|
|
|
|
isShotRadius = 120;
|
|
mood = DEFENSIVE_START;
|
|
|
|
piloting = 0;
|
|
gunnery = 0;
|
|
eliteLevel = 0;
|
|
|
|
attackThrottle = 36;
|
|
|
|
EnablePWRC = true;
|
|
endcase;
|
|
case 1: // EasyBot.abl
|
|
minDelay = 2.0;
|
|
maxDelay = 6.0;
|
|
|
|
isShotRadius = 160;
|
|
mood = DEFENSIVE_END;
|
|
|
|
piloting = 10;
|
|
gunnery = 15;
|
|
eliteLevel = 0;
|
|
|
|
attackThrottle = 50;
|
|
endcase;
|
|
case 2: // RookieSniperBot.abl
|
|
minDelay = 2.0;
|
|
maxDelay = 6.0;
|
|
|
|
isShotRadius = 160;
|
|
mood = NEUTRAL_START;
|
|
|
|
piloting = 80;
|
|
gunnery = 10;
|
|
eliteLevel = 30;
|
|
|
|
attackThrottle = 90;
|
|
endcase;
|
|
case 3: // DodgeBot.abl
|
|
minDelay = 1.0;
|
|
maxDelay = 4.0;
|
|
|
|
isShotRadius = 160;
|
|
mood = NEUTRAL_START;
|
|
|
|
piloting = 10;
|
|
gunnery = 60;
|
|
eliteLevel = 30;
|
|
|
|
attackThrottle = 36;
|
|
endcase;
|
|
case 4: // RookieBot.abl
|
|
minDelay = 1.0;
|
|
maxDelay = 4.0;
|
|
|
|
isShotRadius = 120;
|
|
mood = NEUTRAL_START;
|
|
|
|
piloting = 30;
|
|
gunnery = 35;
|
|
eliteLevel = 30;
|
|
|
|
attackThrottle = 60;
|
|
endcase;
|
|
case 5: // RookieDodgeBot.abl
|
|
minDelay = 1.0;
|
|
maxDelay = 4.0;
|
|
|
|
isShotRadius = 160;
|
|
mood = NEUTRAL_START;
|
|
|
|
piloting = 90;
|
|
gunnery = 50;
|
|
eliteLevel = 60;
|
|
|
|
attackThrottle = 100;
|
|
endcase;
|
|
case 6: // SniperBot.abl
|
|
minDelay = 0.0;
|
|
maxDelay = 2.5;
|
|
|
|
isShotRadius = 160;
|
|
mood = NEUTRAL_START;
|
|
|
|
piloting = 75;
|
|
gunnery = 110;
|
|
eliteLevel = 60;
|
|
|
|
attackThrottle = 60;
|
|
endcase;
|
|
case 7: // KillerBot.abl
|
|
minDelay = 0.0;
|
|
maxDelay = 2.5;
|
|
|
|
isShotRadius = 160;
|
|
mood = NEUTRAL_END;
|
|
|
|
piloting = 80;
|
|
gunnery = 90;
|
|
eliteLevel = 80;
|
|
|
|
attackThrottle = 85;
|
|
endcase;
|
|
case 8: // SlaughterBot.abl
|
|
minDelay = 0.0;
|
|
maxDelay = 1.0;
|
|
|
|
isShotRadius = 160;
|
|
mood = AGRESSIVE_START;
|
|
|
|
piloting = 90;
|
|
gunnery = 110;
|
|
eliteLevel = 90;
|
|
|
|
attackThrottle = 95;
|
|
|
|
minspeed = 50;
|
|
endcase;
|
|
case 9: // UberBot.abl
|
|
minDelay = 0.0;
|
|
maxDelay = 0.0;
|
|
|
|
isShotRadius = 200;
|
|
mood = BRUTAL_START;
|
|
|
|
piloting = 100;
|
|
gunnery = 999;
|
|
eliteLevel = 100;
|
|
|
|
attackThrottle = 100;
|
|
|
|
EnablePWRC = true;
|
|
endcase;
|
|
endswitch;
|
|
|
|
SetFiringDelay (obj,minDelay,maxDelay);
|
|
SetIgnoreFriendlyFire (obj,true);
|
|
SetIsShotRadius (obj,isShotRadius);
|
|
SetEntropyMood (obj,mood);
|
|
SetCurMood (obj,mood);
|
|
SetSkillLevel (obj,piloting,gunnery,eliteLevel);
|
|
SetAttackThrottle (obj,attackThrottle);
|
|
EnablePerWeaponRayCasting(obj,EnablePWRC);
|
|
if (minspeed <> 0) then
|
|
SetMinSpeed(obj,minspeed);
|
|
endif;
|
|
endfunction;
|
|
|
|
function init;
|
|
var
|
|
|
|
integer i;
|
|
|
|
code
|
|
nStageNumber = GetCOOP(-1);
|
|
|
|
//SetupScoring_Attrition;
|
|
|
|
SetFlagsEnabled(FLAGS_HIDE);
|
|
SetCustomBucketName("Campaign: s1s1");
|
|
//SetCustomBucketNameIndex(843);
|
|
|
|
//AddStandardBuckets;
|
|
|
|
TrackBucket(Bucket_KILLS,0,true);
|
|
TrackBucket(Bucket_DEATHS,0,true);
|
|
|
|
TrackBucket(Bucket_CUSTOM,0,true);
|
|
|
|
AddCustomBucketParameter(Bucket_ENEMY_DAMAGE_INFLICT,1);
|
|
AddCustomBucketParameter(Bucket_FRIENDLY_DAMAGE_INFLICT,-1);
|
|
|
|
AddCustomBucketParameter(Bucket_ENEMY_KILLS,500);
|
|
AddCustomBucketParameter(Bucket_FRIENDLY_KILLS,-500);
|
|
AddCustomBucketParameter(Bucket_SUICIDES,-500);
|
|
AddCustomBucketParameter(Bucket_ENEMY_KILLS_BY_TONNAGE,5);
|
|
|
|
AddCustomBucketParameter(Bucket_ENEMY_COMPONENT_KILLS,50);
|
|
AddCustomBucketParameter(Bucket_FRIENDLY_COMPONENT_KILLS,-50);
|
|
|
|
DROP_OFFS_Y = 300;
|
|
|
|
group_player = GroupObjectId(1);
|
|
group_1 = GroupObjectId(11);
|
|
group_2 = GroupObjectId(22);
|
|
group_3 = GroupObjectId(33);
|
|
group_boss = GroupObjectId(44);
|
|
group_b1org = GroupObjectId(55);
|
|
group_b1 = GroupObjectId(56);
|
|
group_b1blds = GroupObjectId(57);
|
|
|
|
playermech = getplayervehicle(epl_player0);
|
|
GetLocation(playermech,PlayerStart); // for stage 1 & 3
|
|
PlayerStart[1] = PlayerStart[1] + 1;
|
|
GroupAddObject(group_player,playermech);
|
|
|
|
GroupAddObject(group_1,eve_s1m1);
|
|
GroupAddObject(group_1,eve_s1m2);
|
|
GroupAddObject(group_1,eve_s1m3);
|
|
SetBotLevel(eve_s1m1,3);
|
|
SetBotLevel(eve_s1m2,3);
|
|
SetBotLevel(eve_s1m3,3);
|
|
//* stage 2 only - begine
|
|
GroupAddObject(group_1,etu_s1t1);
|
|
GroupAddObject(group_1,etu_s1t2);
|
|
GroupAddObject(group_1,etu_s1t3);
|
|
GroupAddObject(group_1,etu_s1t4);
|
|
//*/ // stage 2 only - end
|
|
SetGroupAI(group_1,GROUPAI_MOODSQUAD);
|
|
|
|
GroupAddObject(group_2,eve_s2m1);
|
|
GroupAddObject(group_2,eve_s2m2);
|
|
//* stage 2 only - begine
|
|
GroupAddObject(group_2,etu_s2w1);
|
|
GroupAddObject(group_2,etu_s2w2);
|
|
//*/ // stage 2 only - end
|
|
GroupAddObject(group_2,eve_s2m3);
|
|
GroupAddObject(group_2,eve_s2m4);
|
|
GroupAddObject(group_2,eve_s2m5);
|
|
//* stage 2 only - begine
|
|
GroupAddObject(group_2,etu_s2w3);
|
|
GroupAddObject(group_2,etu_s2w4);
|
|
//*/ // stage 2 only - end
|
|
|
|
SetBotLevel(eve_s2m1,0);
|
|
SetBotLevel(eve_s2m2,2);
|
|
SetBotLevel(eve_s2m3,2);
|
|
SetBotLevel(eve_s2m4,3);
|
|
SetBotLevel(eve_s2m5,4);
|
|
SetGroupAI(group_2,GROUPAI_MOODSQUAD);
|
|
|
|
GroupAddObject(group_3,eve_s3m1);
|
|
GroupAddObject(group_3,eve_s3m2);
|
|
GroupAddObject(group_3,eve_s3m3);
|
|
GroupAddObject(group_3,eve_s3m4);
|
|
GroupAddObject(group_3,eve_s3m5);
|
|
GroupAddObject(group_3,eve_s3m6);
|
|
GroupAddObject(group_3,eve_s3m7);
|
|
//* stage 2 only - begine
|
|
GroupAddObject(group_3,etu_s3w1);
|
|
GroupAddObject(group_3,etu_s3w2);
|
|
GroupAddObject(group_3,etu_s3w3);
|
|
GroupAddObject(group_3,etu_s3w4);
|
|
GroupAddObject(group_3,etu_s3w5);
|
|
GroupAddObject(group_3,etu_s3w6);
|
|
//*/ // stage 2 only - end
|
|
SetBotLevel(eve_s3m1,1);
|
|
SetBotLevel(eve_s3m2,2);
|
|
SetBotLevel(eve_s3m3,2);
|
|
SetBotLevel(eve_s3m4,2);
|
|
SetBotLevel(eve_s3m5,3);
|
|
SetBotLevel(eve_s3m6,4);
|
|
SetBotLevel(eve_s3m7,5);
|
|
SetGroupAI(group_3,GROUPAI_MOODSQUAD);
|
|
|
|
GroupAddObject(group_boss,eve_boss);
|
|
|
|
//* stage 1&2 only - begine
|
|
GroupAddObject(group_b1org, eve_b1m1);
|
|
GroupAddObject(group_b1org, eve_b1m2);
|
|
GroupAddObject(group_b1org, eve_b1m3);
|
|
GroupAddObject(group_b1org, eve_b1m4);
|
|
GroupAddObject(group_b1org, eve_b1m5);
|
|
GroupAddObject(group_b1org, eve_b1m6);
|
|
GroupAddObject(group_b1org, eve_b1m7);
|
|
GroupAddObject(group_b1org, eve_b1m8);
|
|
GroupAddObject(group_b1blds, ebu_b1b1);
|
|
GroupAddObject(group_b1blds, ebu_b1b2);
|
|
GroupAddObject(group_b1blds, ebu_b1b3);
|
|
GroupAddObject(group_b1blds, ebu_b1b4);
|
|
GroupAddObject(group_b1blds, ebu_b1b5);
|
|
GroupAddObject(group_b1blds, ebu_b1b6);
|
|
GroupAddObject(group_b1blds, ebu_b1b7);
|
|
GroupAddObject(group_b1blds, ebu_b1b8);
|
|
if (nStageNumber == 1) then
|
|
RandSelect(group_b1, group_b1blds, -8);
|
|
RandSelect(group_b1, group_b1org, -5); // move 5 mechs from b1org to b1
|
|
else
|
|
SetDmgModifier(group_b1blds, 0, 1);
|
|
RandSelect(group_b1, group_b1org, -8); // move 8 mechs from b1org to b1
|
|
endif;
|
|
//*/ // stage 1&2 only - end
|
|
//* stage 2 only - begine
|
|
SetBotLevel(eve_b1m1,-1);
|
|
SetBotLevel(eve_b1m2,-1);
|
|
SetBotLevel(eve_b1m3,-1);
|
|
SetBotLevel(eve_b1m4,-1);
|
|
SetBotLevel(eve_b1m5,-1);
|
|
SetBotLevel(eve_b1m6,-1);
|
|
SetBotLevel(eve_b1m7,-1);
|
|
SetBotLevel(eve_b1m8,-1);
|
|
//*/ // stage 2 only - end
|
|
//* stage 2 only - begine
|
|
SetMemoryInteger(group_b1, 28, epa_jumppath);
|
|
//*/ // stage 2 only - end
|
|
|
|
switch nStageNumber
|
|
case 1:
|
|
SetBotLevel(eve_boss,7);
|
|
endcase;
|
|
case 2:
|
|
SetBotLevel(eve_boss,8);
|
|
endcase;
|
|
case 3:
|
|
SetBotLevel(eve_boss,9);
|
|
endcase;
|
|
endswitch;
|
|
|
|
SetGroupAI(group_boss,GROUPAI_MOODSQUAD);
|
|
|
|
SetMemoryInteger(group_1, 31, 11);
|
|
SetMemoryInteger(group_1, 30, 21);
|
|
SetMemoryInteger(group_1, 29, 0);
|
|
|
|
SetMemoryInteger(group_2, 31, 12);
|
|
SetMemoryInteger(group_2, 30, 22);
|
|
SetMemoryInteger(group_2, 29, 0);
|
|
|
|
SetMemoryInteger(group_3, 31, 13);
|
|
SetMemoryInteger(group_3, 30, 23);
|
|
SetMemoryInteger(group_3, 29, 0);
|
|
|
|
SetMemoryInteger(group_boss, 31, 14);
|
|
SetMemoryInteger(group_boss, 30, 24);
|
|
SetMemoryInteger(group_boss, 29, 0);
|
|
SetMemoryInteger(eve_boss, 29, 1);
|
|
|
|
//* stage 1&2 only - begine
|
|
SetMemoryInteger(group_b1, 31, 15);
|
|
SetMemoryInteger(group_b1, 30, 25);
|
|
SetMemoryInteger(group_b1, 29, 0);
|
|
|
|
SetMemoryInteger(group_b1org, 31, 19);
|
|
SetMemoryInteger(group_b1org, 30, 29);
|
|
SetMemoryInteger(group_b1org, 29, 0);
|
|
|
|
SetMemoryInteger(group_b1blds, 31, 15);
|
|
SetMemoryInteger(group_b1blds, 30, 25);
|
|
SetMemoryInteger(group_b1blds, 29, 0);
|
|
//*/ // stage 1&2 only - end
|
|
|
|
cinema_cut = 0;
|
|
|
|
old_stage = -1; // should be
|
|
old_group_Enemy = -1; // should be
|
|
cur_stage = -1; // should be
|
|
new_stage = 1; // could be 1...end-state // TEST ROUTINE
|
|
cur_objective = -1; // should be
|
|
new_objective = -1; // could be 1...s1..boss
|
|
cur_obj_time = 120;
|
|
cur_end_time = 0;
|
|
group_Enemy = NO_UNIT;
|
|
cur_tele_trigger = -1;
|
|
cur_tele_trigger2 = -1;
|
|
cur_eye_Target = NO_UNIT; // ena_eye_point;
|
|
nDmgHero = 10000;
|
|
nDmgEnemy = 10000;
|
|
|
|
nPlayerPaused = 0;
|
|
nEnemyPaused = -1;
|
|
|
|
SetInputTypeEnabled(65535, true);
|
|
|
|
// store group position & teleport to hell alll
|
|
GetLocation(group_1, loc_1);
|
|
|
|
GetLocation(group_2, loc_2);
|
|
|
|
GetLocation(group_3, loc_3);
|
|
|
|
GetLocation(group_boss, loc_boss);
|
|
|
|
//* stage 1&2 only - begine
|
|
GetLocation(eve_b1m1, loc_b1); // GetLocation(group_b1, loc_b1);
|
|
//*/ // stage 1&2 only - end
|
|
|
|
endfunction;
|
|
|
|
function set_dmgfactors;
|
|
code
|
|
// default damage type
|
|
SetDmgModifier(epl_player0, 0, nDmgHero); // 500000
|
|
SetDmgModifier(group_Enemy, 0, nDmgEnemy);
|
|
// splash damage type
|
|
SetDmgModifier(epl_player0, 1, 1); // nDmgHero / 5
|
|
SetDmgModifier(group_Enemy, 1, 1); // nDmgEnemy / 5
|
|
/* for stage end testing - begin
|
|
SetDmgModifier(epl_player0, 0, 1);
|
|
SetDmgModifier(group_Enemy, 0, 1000000);
|
|
// splash damage type
|
|
SetDmgModifier(epl_player0, 1, 1);
|
|
SetDmgModifier(group_Enemy, 1, 1000000);
|
|
*/ // for stage end testing - end
|
|
endfunction;
|
|
|
|
function player_pause;
|
|
code
|
|
if (nPlayerPaused == 0) then
|
|
nPlayerPaused = 1;
|
|
|
|
playerai(epl_player0,true);
|
|
|
|
//PauseTimer(gti_timer_7, false);
|
|
//ShowTimer(gti_timer_7, 0, 0, FALSE, 0, FALSE);
|
|
endif;
|
|
endfunction;
|
|
|
|
function player_restart;
|
|
code
|
|
if (nPlayerPaused == 1) then
|
|
nPlayerPaused = 0;
|
|
|
|
//PauseTimer(gti_timer_7, true);
|
|
//ShowTimer(gti_timer_7, 0, cur_obj_time, FALSE, MakeColor(255, 255, 255, 0), TRUE);
|
|
|
|
playerai(epl_player0,false);
|
|
endif;
|
|
|
|
endfunction;
|
|
|
|
function enemy_pause;
|
|
code
|
|
if (nEnemyPaused == -1) then
|
|
nEnemyPaused = group_Enemy;
|
|
|
|
StopExecute(nEnemyPaused);
|
|
SetAlwaysIgnoreObstacles(TRUE);
|
|
SetSensorVisibility(nEnemyPaused, FALSE);
|
|
endif;
|
|
endfunction;
|
|
|
|
function enemy_restart;
|
|
code
|
|
if (nEnemyPaused <> -1) then
|
|
SetSensorVisibility(nEnemyPaused, TRUE);
|
|
SetAlwaysIgnoreObstacles(FALSE);
|
|
StartExecute(nEnemyPaused);
|
|
|
|
nEnemyPaused = -1;
|
|
endif;
|
|
endfunction;
|
|
|
|
function set_mission_notifies;
|
|
code
|
|
if 60 <= cur_obj_time then
|
|
n30notified = 0;
|
|
n60notified = 0;
|
|
else
|
|
n60notified = 1;
|
|
if 30 <= cur_obj_time then
|
|
n30notified = 0;
|
|
else
|
|
n30notified = 1;
|
|
endif;
|
|
endif;
|
|
nLastNotified = 0;
|
|
endfunction;
|
|
|
|
//------------------------------------------------------------------
|
|
//
|
|
// Main Code
|
|
//
|
|
//------------------------------------------------------------------
|
|
state startState;
|
|
|
|
code
|
|
//enableglobalinvulnerable; // for testing...
|
|
|
|
//playsound(eso_start);
|
|
//setactivationdistance(6800);
|
|
//trans opening;
|
|
|
|
trans sit;
|
|
|
|
endstate;
|
|
|
|
|
|
state deadState;
|
|
code
|
|
endstate;
|
|
|
|
//------------------------------------------------------------------
|
|
//
|
|
// Sit state : description
|
|
//
|
|
//------------------------------------------------------------------
|
|
state sit;
|
|
|
|
code
|
|
//Fail the mission when the player dies
|
|
if (cur_stage <> new_stage) then
|
|
player_pause;
|
|
|
|
if (old_stage <> -1) then
|
|
SetCOOP(COOP_MODAL_START, 2);
|
|
enemy_pause;
|
|
trans q_score;
|
|
else
|
|
TeleportToHell(group_1);
|
|
TeleportToHell(group_2);
|
|
TeleportToHell(group_3);
|
|
TeleportToHell(group_boss);
|
|
//* stage 1&2 only - begine
|
|
TeleportToHell(group_b1);
|
|
TeleportToHell(group_b1org);
|
|
TeleportToHell(group_b1blds);
|
|
//*/ // stage 1&2 only - end
|
|
endif;
|
|
|
|
cur_stage = new_stage;
|
|
SetCOOP(COOP_SUBSTAGE_NUMBER, new_stage);
|
|
cur_objective = new_objective;
|
|
|
|
//Reveal the objectives
|
|
switch new_stage
|
|
case 1:
|
|
group_Enemy = group_1;
|
|
LookLoc = loc_1;
|
|
|
|
GetLocation(edr_dz_s1,PlayerStart);
|
|
RespawnPosition(-1, edr_dz_s1);
|
|
|
|
PlayerStart[1] = PlayerStart[1] + DROP_OFFS_Y;
|
|
|
|
cur_eye_Target = eve_s1m1; // group_Enemy;
|
|
cur_obj_time = 120;
|
|
nDmgHero = 600 + (nStageNumber * 100);
|
|
nDmgEnemy = 50000;
|
|
cur_tele_trigger = 11;
|
|
cur_tele_trigger2 = 21;
|
|
endcase;
|
|
|
|
case 2:
|
|
group_Enemy = group_2;
|
|
LookLoc = loc_2;
|
|
|
|
GetLocation(edr_dz_s2,PlayerStart);
|
|
RespawnPosition(-1, edr_dz_s2);
|
|
|
|
//no drop - PlayerStart[1] = PlayerStart[1] + DROP_OFFS_Y;
|
|
|
|
cur_eye_Target = eve_s2m1; // group_Enemy;
|
|
cur_obj_time = 120;
|
|
nDmgHero = 700 + (nStageNumber * 100);
|
|
nDmgEnemy = 50000;
|
|
cur_tele_trigger = 12;
|
|
cur_tele_trigger2 = 22;
|
|
endcase;
|
|
|
|
case 3:
|
|
group_Enemy = group_3;
|
|
LookLoc = loc_3;
|
|
|
|
GetLocation(edr_dz_s3,PlayerStart);
|
|
RespawnPosition(-1, edr_dz_s3);
|
|
|
|
//no drop - PlayerStart[1] = PlayerStart[1] + DROP_OFFS_Y;
|
|
|
|
cur_eye_Target = eve_s3m3; // group_Enemy;
|
|
cur_obj_time = 180;
|
|
nDmgHero = 800 + (nStageNumber * 100);
|
|
nDmgEnemy = 50000;
|
|
cur_tele_trigger = 13;
|
|
cur_tele_trigger2 = 23;
|
|
endcase;
|
|
|
|
case 4:
|
|
group_Enemy = group_boss;
|
|
LookLoc = loc_boss;
|
|
|
|
GetLocation(edr_dz_boss,PlayerStart);
|
|
RespawnPosition(-1, edr_dz_boss);
|
|
|
|
//no drop - PlayerStart[1] = PlayerStart[1] + DROP_OFFS_Y;
|
|
|
|
cur_eye_Target = eve_boss; // group_Enemy;
|
|
cur_obj_time = 60;
|
|
|
|
nDmgHero = 3000 + (nStageNumber * 1500);
|
|
nDmgEnemy = 15000;
|
|
cur_tele_trigger = 14;
|
|
cur_tele_trigger2 = 24;
|
|
endcase;
|
|
|
|
case 5:
|
|
//* stage 1&2 only - begine
|
|
group_Enemy = group_b1;
|
|
LookLoc = loc_b1;
|
|
|
|
GetLocation(edr_dz_b1,PlayerStart);
|
|
RespawnPosition(-1, edr_dz_boss);
|
|
|
|
//no drop - PlayerStart[1] = PlayerStart[1] + DROP_OFFS_Y;
|
|
|
|
cur_eye_Target = eve_b1m1; // group_Enemy;
|
|
cur_obj_time = 45; // TEST ROUTINE
|
|
|
|
nDmgHero = 1000;
|
|
nDmgEnemy = 2000000;
|
|
cur_tele_trigger = 15;
|
|
cur_tele_trigger2 = 25;
|
|
//*/ // stage 1&2 only - end
|
|
endcase;
|
|
|
|
endswitch;
|
|
|
|
set_dmgfactors;
|
|
|
|
resettimer(gti_timer_6);
|
|
resettimer(gti_timer_7);
|
|
set_mission_notifies;
|
|
|
|
//ShowTimer(gti_timer_7, 0, cur_obj_time, FALSE, MakeColor(255, 255, 255, 0), TRUE);
|
|
SetCOOP(COOP_SUBSTAGE_TIMEGOAL, cur_obj_time);
|
|
cur_end_time = 0;
|
|
SetCOOP(COOP_ENEMY_GROUP, group_Enemy); // valid enemy group
|
|
|
|
SetGlobalTrigger(cur_tele_trigger, true);
|
|
|
|
cinema_cut = 0;
|
|
/*
|
|
PlayEffect(ede_eff_boss);
|
|
PlayEffect(ede_eff_a);
|
|
PlayEffect(ede_eff_b);
|
|
PlayEffect(ede_eff_c);
|
|
PlayEffect(ede_eff_d);
|
|
|
|
resettimer(gti_timer_10);
|
|
*/
|
|
|
|
if (old_stage == -1) then
|
|
teleportAndLook(playermech, LookLoc, 1 + 2, PlayerStart);
|
|
endif;
|
|
|
|
enemy_pause;
|
|
|
|
trans opening;
|
|
endif;
|
|
|
|
/*
|
|
if (timegreater(gti_timer_10,7)) then
|
|
resettimer(gti_timer_10);
|
|
setTimer(gti_timer_10, 0);
|
|
killtimer(gti_timer_10);
|
|
|
|
KillEffect(ede_eff_d);
|
|
KillEffect(ede_eff_c);
|
|
KillEffect(ede_eff_b);
|
|
KillEffect(ede_eff_a);
|
|
KillEffect(ede_eff_boss);
|
|
endif;
|
|
*/
|
|
|
|
if (cur_stage <> -1) then
|
|
if n60notified <> 0 then
|
|
if n30notified <> 0 then
|
|
if timegreater(gti_timer_7,cur_obj_time - 10) then
|
|
if (not (nLastNotified <> 0)) or ((IGetTime - nLastNotified) >= 1000) then
|
|
PlaySoundStr("cmp_incoming_missile.wav{handle}");
|
|
nLastNotified = IGetTime;
|
|
endif;
|
|
endif;
|
|
else
|
|
if timegreater(gti_timer_7,cur_obj_time - 30) then
|
|
PlaySoundStr("vo\created\end30.wav{handle}"); // no \\
|
|
n30notified = 1;
|
|
endif;
|
|
endif;
|
|
else
|
|
if timegreater(gti_timer_7,cur_obj_time - 60) then
|
|
PlaySoundStr("vo\created\end60.wav{handle}"); // no \\
|
|
n60notified = 1;
|
|
endif;
|
|
endif;
|
|
|
|
if ((GroupNumDead(group_Enemy) < GroupSize(group_Enemy)) AND timegreater(gti_timer_7,cur_obj_time)) then
|
|
killtimer(gti_timer_7);
|
|
setTimer(gti_timer_7, 0);
|
|
if 5 <= cur_stage then
|
|
// bnus stage...
|
|
trans sub_stage_end;
|
|
else
|
|
SelfDestruct(playermech);
|
|
endif;
|
|
endif;
|
|
if isdead(playermech) then
|
|
// failobjectiveall(5); // stay 5 seconds...
|
|
fDyingBegin = GetTime + 4.0;
|
|
trans q_continue_after_dying;
|
|
else
|
|
if (GroupSize(group_Enemy) <= GroupNumDead(group_Enemy)) then
|
|
if (cur_end_time <= 0) then
|
|
resettimer(gti_timer_8);
|
|
setTimer(gti_timer_8, 0);
|
|
starttimer(gti_timer_8);
|
|
cur_end_time = 6
|
|
else
|
|
if (timegreater(gti_timer_8,cur_end_time)) then
|
|
trans sub_stage_end;
|
|
endif;
|
|
endif;
|
|
endif;
|
|
endif;
|
|
endif;
|
|
|
|
endstate;
|
|
|
|
state opening;
|
|
code
|
|
|
|
if (IsWithinLocPoint(group_Enemy, Dummy_HellPoint, -100) == false) then
|
|
|
|
getlocation(group_Enemy, LookLoc);
|
|
if (cur_stage == 1) then
|
|
teleportAndLook(playermech, LookLoc, 1 + 2, PlayerStart); // NO_UNIT
|
|
else
|
|
teleportAndLook(playermech, LookLoc, 0 + 2, PlayerStart); // NO_UNIT
|
|
endif;
|
|
|
|
SetGlobalTrigger(cur_tele_trigger2, true);
|
|
|
|
switch cur_stage
|
|
case 1:
|
|
//SetBoundsFromPaths(epa_mb_path, -1);
|
|
if (0 < DROP_OFFS_Y) then
|
|
Drop(playermech);
|
|
PlayerStart[1] = PlayerStart[1] - DROP_OFFS_Y;
|
|
endif;
|
|
endcase;
|
|
|
|
case 2:
|
|
//RestoreOriginalBounds;
|
|
endcase;
|
|
|
|
case 3:
|
|
//SetBoundsFromPaths(epa_mb_path, -1);
|
|
endcase;
|
|
|
|
case 4:
|
|
endcase;
|
|
|
|
endswitch;
|
|
|
|
if (cur_objective <> -1) then
|
|
RevealObjective(cur_objective);
|
|
HelpMessage(cur_objective, 10);
|
|
endif;
|
|
|
|
SetCOOP(COOP_MODAL_START, 1);
|
|
trans q_briefing;
|
|
|
|
trans sub_stage_start;
|
|
endif;
|
|
|
|
endstate;
|
|
|
|
state sub_stage_start;
|
|
code
|
|
player_restart;
|
|
enemy_restart;
|
|
|
|
//SelfDestruct(group_Enemy); // for stage end testing
|
|
|
|
trans sit;
|
|
endstate;
|
|
|
|
state sub_stage_end;
|
|
code
|
|
old_stage = cur_stage;
|
|
old_group_Enemy = group_Enemy;
|
|
|
|
SetCOOP(COOP_ENEMY_GROUP_OLD, old_group_Enemy); // for scoring...
|
|
KillTimer(gti_timer_6);
|
|
KillTimer(gti_timer_7);
|
|
|
|
switch cur_stage
|
|
case 1:
|
|
new_stage = 2;
|
|
//new_objective = eob_kill_boss;
|
|
endcase;
|
|
|
|
case 2:
|
|
new_stage = 3;
|
|
//new_objective = eob_s3;
|
|
endcase;
|
|
|
|
case 3:
|
|
new_stage = 4;
|
|
//new_objective = eob_kill_boss;
|
|
endcase;
|
|
|
|
case 4:
|
|
if nStageNumber <> 3 then
|
|
new_stage = 5;
|
|
else
|
|
new_stage = 99;
|
|
endif;
|
|
//new_objective = -1;
|
|
endcase;
|
|
|
|
case 5:
|
|
new_stage = 99;
|
|
//new_objective = -1;
|
|
endcase;
|
|
|
|
endswitch;
|
|
|
|
trans sit;
|
|
endstate;
|
|
|
|
state q_briefing;
|
|
code
|
|
nTemp1 = GetCOOP(COOP_MODAL_IS_ENDED);
|
|
if (nTemp1 <> 0) then
|
|
SetCOOP(COOP_MODAL_START, 0); // COOP_MODAL_IS_ENDED is resetted as 0 too
|
|
trans sub_stage_start;
|
|
endif;
|
|
endstate;
|
|
|
|
state q_score;
|
|
code
|
|
nTemp1 = GetCOOP(COOP_MODAL_IS_ENDED);
|
|
if (nTemp1 <> 0) then
|
|
SetCOOP(COOP_MODAL_START, 0); // COOP_MODAL_IS_ENDED is resetted as 0 too
|
|
if (new_stage == 99) then
|
|
SuccessObjectiveAll(0); // stay 0 seconds..
|
|
trans won;
|
|
else
|
|
enemy_restart;
|
|
|
|
old_stage = -1;
|
|
trans sit;
|
|
endif;
|
|
endif;
|
|
endstate;
|
|
|
|
state q_continue_after_dying;
|
|
code
|
|
if (fDyingBegin <= GetTime) then
|
|
SetCOOP(COOP_MODAL_START, 3);
|
|
player_pause;
|
|
trans q_continue;
|
|
endif;
|
|
endstate;
|
|
|
|
state q_continue;
|
|
code
|
|
nTemp1 = GetCOOP(COOP_MODAL_IS_ENDED);
|
|
if (nTemp1 <> 0) then
|
|
SetCOOP(COOP_MODAL_START, 0); // COOP_MODAL_IS_ENDED is resetted as 0 too
|
|
if (0 < nTemp1) then
|
|
resettimer(gti_timer_7);
|
|
set_mission_notifies;
|
|
|
|
getlocation(group_Enemy, LookLoc);
|
|
teleportAndLook(playermech, LookLoc, 0 + 2, PlayerStart); // NO_UNIT
|
|
|
|
player_restart;
|
|
set_dmgfactors;
|
|
|
|
trans sit;
|
|
else
|
|
failobjectiveall(0);
|
|
|
|
trans lost;
|
|
endif;
|
|
endif;
|
|
endstate;
|
|
|
|
state won;
|
|
code
|
|
|
|
switch cinema_cut
|
|
case 0:
|
|
endcase;
|
|
|
|
case 1:
|
|
endcase;
|
|
|
|
endswitch;
|
|
|
|
endstate;
|
|
|
|
state lost;
|
|
code
|
|
|
|
switch cinema_cut
|
|
case 0:
|
|
endcase;
|
|
|
|
case 1:
|
|
endcase;
|
|
|
|
endswitch;
|
|
|
|
endstate;
|
|
|
|
|
|
endfsm.
|
|
//******************************************************************
|