//********************************************************************************* // //[[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); // check : nLoopCount = GetCOOP(-2); // // nStageNumber could be 1, 2 or 3 for s1s1/s1s2/s1s3.abl // nLoopCount could be 0, 1, 2, 3, 4, 5..... // // 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_ // 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_ var eternal integer playermech; static integer cinema_cut; static integer group_player; static integer group_1org; static integer group_1; static integer group_2org; static integer group_2; static integer group_3org; 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 nLoopCount; 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); nLoopCount = GetCOOP(-2); if (2 < nLoopCount) then nLoopCount = 2; endif; //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_1org = GroupObjectId(11); group_1 = GroupObjectId(12); group_2org = GroupObjectId(21); group_2 = GroupObjectId(22); group_3org = GroupObjectId(31); group_3 = GroupObjectId(32); group_boss = GroupObjectId(42); group_b1org = GroupObjectId(51); group_b1 = GroupObjectId(52); group_b1blds = GroupObjectId(53); playermech = getplayervehicle(epl_player0); GetLocation(playermech,PlayerStart); // for stage 1 & 3 PlayerStart[1] = PlayerStart[1] + 1; GroupAddObject(group_player,playermech); GroupAddObject(group_1org,eve_s1m1); GroupAddObject(group_1org,eve_s1m2); GroupAddObject(group_1org,eve_s1m3); GroupAddObject(group_1org,eve_s1m4); GroupAddObject(group_1org,eve_s1m5); RandSelect(group_1, group_1org, -(3 + nLoopCount)); SetBotLevel(eve_s1m1,3); SetBotLevel(eve_s1m2,4); SetBotLevel(eve_s1m3,3); SetBotLevel(eve_s1m4,4); SetBotLevel(eve_s1m5,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_2org,eve_s2m1); GroupAddObject(group_2org,eve_s2m2); GroupAddObject(group_2org,eve_s2m3); GroupAddObject(group_2org,eve_s2m4); GroupAddObject(group_2org,eve_s2m5); GroupAddObject(group_2org,eve_s2m6); GroupAddObject(group_2org,eve_s2m7); RandSelect(group_2, group_2org, -(5 + nLoopCount)); /* stage 2 only - begine GroupAddObject(group_2,etu_s2w1); GroupAddObject(group_2,etu_s2w2); GroupAddObject(group_2,etu_s2w3); GroupAddObject(group_2,etu_s2w4); */ // stage 2 only - end SetBotLevel(eve_s2m1,2); SetBotLevel(eve_s2m2,3); SetBotLevel(eve_s2m3,2); SetBotLevel(eve_s2m4,3); SetBotLevel(eve_s2m5,4); SetBotLevel(eve_s2m6,5); SetBotLevel(eve_s2m7,3); SetGroupAI(group_2,GROUPAI_MOODSQUAD); GroupAddObject(group_3org,eve_s3m1); GroupAddObject(group_3org,eve_s3m2); GroupAddObject(group_3org,eve_s3m3); GroupAddObject(group_3org,eve_s3m4); GroupAddObject(group_3org,eve_s3m5); GroupAddObject(group_3org,eve_s3m6); GroupAddObject(group_3org,eve_s3m7); GroupAddObject(group_3org,eve_s3m8); GroupAddObject(group_3org,eve_s3m9); RandSelect(group_3, group_3org, -(7 + nLoopCount)); /* 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,3); SetBotLevel(eve_s3m3,2); SetBotLevel(eve_s3m4,2); SetBotLevel(eve_s3m5,3); SetBotLevel(eve_s3m6,2); SetBotLevel(eve_s3m7,5); SetBotLevel(eve_s3m8,3); SetBotLevel(eve_s3m9,2); 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 switch nStageNumber case 1: SetBotLevel(eve_boss,7 + nLoopCount); endcase; case 2: if 0 < nLoopCount then SetBotLevel(eve_boss,9); else SetBotLevel(eve_boss,8); endif; endcase; case 3: SetBotLevel(eve_boss,9); endcase; endswitch; SetGroupAI(group_boss,GROUPAI_MOODSQUAD); SetMemoryInteger(group_1org, 31, 19); SetMemoryInteger(group_1org, 30, 29); SetMemoryInteger(group_1org, 29, 0); SetMemoryInteger(group_1, 31, 11); SetMemoryInteger(group_1, 30, 21); SetMemoryInteger(group_1, 29, 0); SetMemoryInteger(group_2org, 31, 19); SetMemoryInteger(group_2org, 30, 29); SetMemoryInteger(group_2org, 29, 0); SetMemoryInteger(group_2, 31, 12); SetMemoryInteger(group_2, 30, 22); SetMemoryInteger(group_2, 29, 0); SetMemoryInteger(group_3org, 31, 19); SetMemoryInteger(group_3org, 30, 29); SetMemoryInteger(group_3org, 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 /* stage 2 only - begine SetMemoryInteger(group_b1, 28, epa_jumppath); */ // stage 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_1org); TeleportToHell(group_1); TeleportToHell(group_2org); TeleportToHell(group_2); TeleportToHell(group_3org); TeleportToHell(group_3); TeleportToHell(group_boss); //* stage 1&2 only - begine TeleportToHell(group_b1org); TeleportToHell(group_b1); 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 = 180; 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 = 150; 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. //******************************************************************