diff options
author | Jesusaves <cpntb1@ymail.com> | 2021-03-18 01:11:56 -0300 |
---|---|---|
committer | Jesusaves <cpntb1@ymail.com> | 2021-03-18 01:11:56 -0300 |
commit | 6ddb573269bc7b0af11bbada28d769eb04ce7bad (patch) | |
tree | c19b81ff39ecf5ffee7aa00595d1190babce1679 | |
parent | fe9ddbaa6acea3854f6da32b4aa47276a5fb1620 (diff) | |
download | serverdata-6ddb573269bc7b0af11bbada28d769eb04ce7bad.tar.gz serverdata-6ddb573269bc7b0af11bbada28d769eb04ce7bad.tar.bz2 serverdata-6ddb573269bc7b0af11bbada28d769eb04ce7bad.tar.xz serverdata-6ddb573269bc7b0af11bbada28d769eb04ce7bad.zip |
Fires Of Steam, Final Showdown - Initial Version
-rw-r--r-- | db/constants.conf | 1 | ||||
-rw-r--r-- | db/re/mob_db.conf | 2 | ||||
-rw-r--r-- | npc/023-2/mk.txt | 2 | ||||
-rw-r--r-- | npc/025-1/ihclot.txt | 2 | ||||
-rw-r--r-- | npc/025-1/phoenix.txt | 2 | ||||
-rw-r--r-- | npc/025-1/salohcin.txt | 6 | ||||
-rw-r--r-- | npc/029-0/mobs.txt | 6 | ||||
-rw-r--r-- | npc/029-9/boss.txt | 451 | ||||
-rw-r--r-- | npc/functions/mkbot.txt | 12 | ||||
-rw-r--r-- | npc/functions/news.txt | 15 |
10 files changed, 474 insertions, 25 deletions
diff --git a/db/constants.conf b/db/constants.conf index e92fa2c70..739b06773 100644 --- a/db/constants.conf +++ b/db/constants.conf @@ -2333,6 +2333,7 @@ constants_db: { BCONFB_DROP: 100 BCONFN_DROP: 7 BCONFD_DROP: 0 + INT_MAX: 2147483647 comment__: "Maze Generator constants" MAZEMAPTYPE_NULL: 0 diff --git a/db/re/mob_db.conf b/db/re/mob_db.conf index f73cd4dea..866a8752b 100644 --- a/db/re/mob_db.conf +++ b/db/re/mob_db.conf @@ -9414,7 +9414,7 @@ mob_db: ( } ViewRange: 12 ChaseRange: 18 - Race: 2 + Race: 8 Element: (0, 1) Mode: { CanMove: false diff --git a/npc/023-2/mk.txt b/npc/023-2/mk.txt index b6938eb01..cf5ded181 100644 --- a/npc/023-2/mk.txt +++ b/npc/023-2/mk.txt @@ -47,7 +47,7 @@ OnReprocess: // Event Handler L_Finish: - $MANA_BLVL-=10; // Set level to 40 + $MANA_BLVL-=10; // Set level to 30 // Just being bigger is not enough. Must be over the double for the advantage draw (about 1 player for 10m) if (.victory_count > (.defeat_count*2)) { announce "The fight ends in draw! The Monster King did accomplish what he set, though...", bc_all|bc_npc; diff --git a/npc/025-1/ihclot.txt b/npc/025-1/ihclot.txt index 490b4c1f5..cd093e2b1 100644 --- a/npc/025-1/ihclot.txt +++ b/npc/025-1/ihclot.txt @@ -100,7 +100,7 @@ mesn; mesc l("Well, here you are. I hope you enjoy ^^", 3); // Act 5+ Grace Reroll - if ($GAME_STORYLINE >= 4) { + if ($GAME_STORYLINE >= 5) { next; mesc l("DO YOU WANT TO REROLL THE ITEM? THIS CANNOT BE UNDONE! (free)"), 1; next; diff --git a/npc/025-1/phoenix.txt b/npc/025-1/phoenix.txt index e820f2cb9..d89713208 100644 --- a/npc/025-1/phoenix.txt +++ b/npc/025-1/phoenix.txt @@ -35,7 +35,7 @@ case 4: .@blvl+=175; .@rebirth$=l("final"); - if ($GAME_STORYLINE >= 4) + if ($GAME_STORYLINE >= 5) break; default: setpcblock(PCBLOCK_HARD, false); diff --git a/npc/025-1/salohcin.txt b/npc/025-1/salohcin.txt index df322af22..6063eaaf3 100644 --- a/npc/025-1/salohcin.txt +++ b/npc/025-1/salohcin.txt @@ -6,7 +6,11 @@ 025-1,108,67,0 script Salohnic NPC_NICHOLAS,{ // Define variables - if ($GAME_STORYLINE >= 4) { + if ($GAME_STORYLINE >= 5) { + .@tx$=l("thrice"); + .@txn=4; + .@prc=150000; + } else if ($GAME_STORYLINE >= 4) { .@tx$=l("twice"); .@txn=3; .@prc=90000; diff --git a/npc/029-0/mobs.txt b/npc/029-0/mobs.txt index 48e679049..3dce22d29 100644 --- a/npc/029-0/mobs.txt +++ b/npc/029-0/mobs.txt @@ -47,7 +47,7 @@ function SFspawn { $@FOS_RESPAWN[getarg(8)]=true; setmapflag(getarg(0), mf_nopenalty); } - + return; } @@ -222,7 +222,9 @@ function SFreset { if (!.@m) { if ($FIRESOFSTEAM == .@s) { $FIRESOFSTEAM+=1; - $FIRESOFSTEAM_CD=gettimetick(2)+10800; // 3 hours cooldown (180 min) + // 3 hours cooldown (180 min) + if (gettime(GETTIME_YEAR) != 2021) + $FIRESOFSTEAM_CD=gettimetick(2)+10800; return 2; } else { return 1; diff --git a/npc/029-9/boss.txt b/npc/029-9/boss.txt index ad98c7c6d..ed4e93e7a 100644 --- a/npc/029-9/boss.txt +++ b/npc/029-9/boss.txt @@ -3,6 +3,12 @@ // Jesusalva // Description: // Fires of Steam: The Death of Andrei Sakar +/* ***************************************** +$@FIRESOFSTEAM_BOSS +0 = Off; 1 = Moubootaur summoning; 2 = Moubootaur summoned +$@FIRESOFSTEAM_DIFF +Level of difficulty setting (100/130/160/190/220) +***************************************** */ ////////////////////////////////////////// // Boss Room @@ -13,36 +19,455 @@ select l("Ignore this book"), l("Begin classic mode"), - l("Begin endless mode"); + l("Skip prologue"); + mes ""; + $@FIRESOFSTEAM_BOSS=(@menu-1); + if ($@FIRESOFSTEAM_BOSS == 0) close; + select + l("Easy Mode"), + l("Crazy Mode"), + l("Cadis Mode"), + l("Crazy Cadis Ultimate Pandorica Mode"), + l("Portable Apocalypsis"); mes ""; - $@FIRESOFSTEAM_BOSS=@menu; + $@FIRESOFSTEAM_DIFF=70+(@menu*30); + closeclientdialog; + // Dispose of the GM + //warp "029-8", 175, 80; // TODO FIXME + sleep(200); + // PC no longer attached + // Start the event mapwarp("029-9", "029-9", 96, 41); maptimer2("029-9", 200, "Book#FoS::OnMFStun"); - initnpctimer; sleep(200); - // PC no longer attached - // TODO: Spawn Isbamuth - // TODO: Dialog - You are too late! I did it!! Muahahaha! - // The power of the Moubootaur will be mine... And you no longer can stop me! + // Cleanup previous data (if any) + $@FOS_ISB=0; + $@FOS_MOB=0; + $@FOS_AND=0; + .Support1=0; + .Support2=0; + .Support3=0; + .Support4=0; + .Support5=0; + // Lockdown + disablenpc "#029-9_97_49"; // Exit + disablenpc "#029-9_103_48"; // To Storage + disablenpc "#029-9_91_26"; // To Moubootaur + disablenpc "#029-9_34_23"; // From Moubootaur + disablenpc "#029-9_137_41"; // From Storage + // Summon Andrei, and handle prologue skips + $@FOS_AND=monster("029-9", 96, 35, "Andrei Sakar", AndreiSakar, 1); + if ($@FIRESOFSTEAM_BOSS == 2) goto OnProlEnd; + // Spawn Isbamuth and his support + $@FOS_ISB=monster("029-9", 96, 32, "Isbamuth", Isbamuth, 1, "Book#FoS::OnProlEnd"); + .Support1=monster("029-9", 95, 31, "Hooded Assassin", HoodedAssassin, 1); + .Support2=monster("029-9", 97, 31, "Hooded Assassin", HoodedAssassin, 1); + .Support3=monster("029-9", 95, 27, "Assassin", Assassin, 1); + .Support4=monster("029-9", 96, 27, "Assassin", Assassin, 1); + .Support5=monster("029-9", 97, 27, "Assassin", Assassin, 1); + // Freeze everyone! + sc_start(SC_STUN, .firstime, 1, 10000, SCFLAG_NOAVOID|SCFLAG_FIXEDTICK, $@FOS_AND); + sc_start(SC_STUN, .firstime, 1, 10000, SCFLAG_NOAVOID|SCFLAG_FIXEDTICK, $@FOS_ISB); + sc_start(SC_STUN, .firstime, 1, 10000, SCFLAG_NOAVOID|SCFLAG_FIXEDTICK, .Support1); + sc_start(SC_STUN, .firstime, 1, 10000, SCFLAG_NOAVOID|SCFLAG_FIXEDTICK, .Support2); + sc_start(SC_STUN, .firstime, 1, 10000, SCFLAG_NOAVOID|SCFLAG_FIXEDTICK, .Support3); + sc_start(SC_STUN, .firstime, 1, 10000, SCFLAG_NOAVOID|SCFLAG_FIXEDTICK, .Support4); + sc_start(SC_STUN, .firstime, 1, 10000, SCFLAG_NOAVOID|SCFLAG_FIXEDTICK, .Support5); + // Boost Isbamuth stats + .@avg=$@FIRESOFSTEAM_DIFF; + // Reconfigure the monster + setunitdata($@FOS_ISB, UDT_LEVEL, .@avg); + setunitdata($@FOS_ISB, UDT_STR, 1+.@avg/2); + setunitdata($@FOS_ISB, UDT_AGI, 1+.@avg/2); + setunitdata($@FOS_ISB, UDT_VIT, 1+.@avg/2); + setunitdata($@FOS_ISB, UDT_INT, 1+.@avg/2); + setunitdata($@FOS_ISB, UDT_DEX, 1+.@avg/2); + setunitdata($@FOS_ISB, UDT_LUK, 1+.@avg/2); + setunitdata($@FOS_ISB, UDT_ADELAY, 1072); + setunitdata($@FOS_ISB, UDT_ATKRANGE, 4); + // Battle Status + setunitdata($@FOS_ISB, UDT_MAXHP, .@avg*700); + setunitdata($@FOS_ISB, UDT_HP, .@avg*700); + setunitdata($@FOS_ISB, UDT_ATKMIN, .@avg*6); + setunitdata($@FOS_ISB, UDT_ATKMAX, .@avg*8); + setunitdata($@FOS_ISB, UDT_DEF, 4+.@avg); + setunitdata($@FOS_ISB, UDT_MDEF, 1+.@avg); + setunitdata($@FOS_ISB, UDT_HIT, .@avg*12); // Advised: x18 + setunitdata($@FOS_ISB, UDT_FLEE, .@avg*4); // Advised: x5 + setunitdata($@FOS_ISB, UDT_CRIT, 20+.@avg); + // Reconfigure the AI + .@opt=getunitdata($@FOS_ISB, UDT_MODE); + // Disable looting + if (.@opt & MD_LOOTER) + .@opt=.@opt^MD_LOOTER; + // Add knockback immunity + .@opt=.@opt|MD_NOKNOCKBACK; + // Mark as boss + .@opt=.@opt|MD_BOSS; + // Mark as aggressive + .@opt=.@opt|MD_AGGRESSIVE; + .@opt=.@opt|MD_ANGRY; + // Make it crazy + .@opt=.@opt|MD_RANDOMTARGET; + setunitdata($@FOS_ISB, UDT_MODE, .@opt); + + // Begin Isbamuth's monologue + unittalk($@FOS_ISB, "You are too late! I did it!! Muahahaha!"); + sleep(1000); + unittalk(.Support1, "Yeah, you did it!"); + sleep(400); + unittalk(.Support2, "Yeah, you are the best!"); + sleep(600); + unittalk($@FOS_ISB, "Silence!"); + sleep(1000); + unittalk($@FOS_ISB, "You did well tracking me down... However the rite is almost complete."); + sleep(3000); + unittalk($@FOS_ISB, "The power of the Moubootaur will be mine..."); + sleep(2000); + unittalk($@FOS_ISB, "And you no longer can stop me!! Muahahahaha!"); + sleep(1000); + unittalk(.Support1, "Yeah, that's our boss!"); + sleep(600); + unittalk(.Support2, "Yeah, none is like boss!"); + sleep(400); + unittalk($@FOS_AND, "Your evil plans shall never prevail, Isbamuth!"); + sleep(2500); + unittalk($@FOS_AND, "Adventurers! I'll go ahead, you shall buy me time!"); + maptimer2("029-9", 200, "Book#FoS::OnMFAndreiMagic"); + sleep(500); + sc_end(SC_STUN, $@FOS_AND); + unitwalk($@FOS_AND, 96, 24); + sleep(1000); + unitwalk($@FOS_AND, 96, 24); + sleep(1000); + unittalk($@FOS_AND, "I'm sure Isbamuth will be no match for all of you!"); + unitwalk($@FOS_AND, 90, 26); + sleep(1500); + unitwarp($@FOS_AND, "029-9", 39, 21); + unittalk($@FOS_ISB, "Hahaha... YOU THINK YOU CAN DEFEAT ME??"); + sc_start(SC_STUN, INT_MAX, 1, 10000, SCFLAG_NOAVOID|SCFLAG_FIXEDTICK, $@FOS_AND); + sleep(1000); + unittalk($@FOS_ISB, "We will see! Engarde!!"); + initnpctimer; + // TODO: Andrei Sakar was ambushed by Valia and Luvia, the Gemini Assassins // ... end; +////////////// Prologue End ////////////// +OnProlEnd: + if (playerattached()) + getexp 200000, 50000; + mapannounce("029-9", "##1##BA huge sound is heard from the basement.", 0); + $@FIRESOFSTEAM_BOSS=2; + enablenpc "#029-9_91_26"; // To Moubootaur + // Cleanup previous data (if any) + $@FOS_ISB=0; + $@FOS_MOB=0; + .Support1=0; + .Support2=0; + .Support3=0; + .Support4=0; + .Support5=0; + maptimer2("029-9", 10000, "Book#FoS::OnMFMark"); + maptimer2("029-9", .firstime, "Book#FoS::OnMFScene"); + // Ensure Andrei Sakar is at his place and stunned + unitwarp($@FOS_AND, "029-9", 39, 21); + sc_start(SC_STUN, INT_MAX, 1, 10000, SCFLAG_NOAVOID|SCFLAG_FIXEDTICK, $@FOS_AND); + // Bring on the Gemini Assassins + .Support1=monster("029-9", 38, 21, "Valia", Sagratha, 1); + .Support2=monster("029-9", 40, 21, "Luvia", Sagratha, 1); + sc_start(SC_STUN, INT_MAX, 1, 10000, SCFLAG_NOAVOID|SCFLAG_FIXEDTICK, .Support1); + sc_start(SC_STUN, INT_MAX, 1, 10000, SCFLAG_NOAVOID|SCFLAG_FIXEDTICK, .Support2); + setunitdata($@FOS_AND, UDT_MAXHP, 999999); + setunitdata($@FOS_AND, UDT_HP, 999999); + setunitdata(.Support1, UDT_MAXHP, 999999); + setunitdata(.Support1, UDT_HP, 999999); + setunitdata(.Support2, UDT_MAXHP, 999999); + setunitdata(.Support2, UDT_HP, 999999); + sleep(.firstime+100); // Wait for cutscene to start + latebloomers + ////////////////////////////////////////////////////////////// + unittalk(.Support1, "...I'm sorry!"); + sleep(1000); + unittalk(.Support2, "...But Isbamuth told us to kill you!"); + sleep(1000); + unittalk(.Support1, "...Die for us!"); + sleep(1000); + unitkill($@FOS_AND); // DEAD + $@FOS_AND=0; + maptimer2("029-9", 3000, "Book#FoS::OnMFShake"); + sleep(3200); // Dramatic Silence + mapannounce("029-9", "##1##BGRRRRRRRRR!!!!", 0); + sleep(800); + mapannounce("029-9", "##1##BHUMANS!!!!", 0); + sleep(2000); + unittalk(.Support2, "Sister, we should go."); + sleep(3000); + unittalk(.Support1, "...Yes, sister, let's go!"); + sleep(3000); + unitwarp(.Support1, "029-9", 130, 32); + unitwarp(.Support2, "029-9", 131, 32); + sleep(1000); // Dramatic Silence + unitkill(.Support1); + unitkill(.Support2); + $@FOS_MOB=monster("029-9", 39, 36, "Moubootaur (Sealed)", MobMoubootaur, 1, "Book#FoS::OnEventEnd"); + sc_start(SC_STUN, 31000, 1, 10000, SCFLAG_NOAVOID|SCFLAG_FIXEDTICK, $@FOS_MOB); + sleep(1000); // Dramatic Silence + unittalk($@FOS_MOB, "##1Who dares awake me from my slumber..."); + sleep(3000); + unittalk($@FOS_MOB, "##1It was just a few nights since I turned a nearby town in Mouboos for their insolence..."); + sleep(5000); + maptimer2("029-9", 2000, "Book#FoS::OnMFShake"); + sleep(2000); + unittalk($@FOS_MOB, "##1AND YOU DARE TO NOT LEARN YOUR LESSON?? %%e"); + sleep(2000); + unittalk($@FOS_MOB, "##1USELESS, UNWORTHY CREATURES!! %%e"); + sleep(6000); + unittalk($@FOS_MOB, "##1I SHALL TURN THIS WHOLE WORLD INTO MOUBOOS..."); + sleep(6000); + unittalk($@FOS_MOB, "##1THE PROPHECY... OF MY RETURN... IS FULFILLED AT LEAST!!"); + .@avg=$@FIRESOFSTEAM_DIFF*12/10; // Moubootaur: +20% bonus (+20~40 lvls) + // Reconfigure the monster (otherwise it is night immortal) + setunitdata($@FOS_MOB, UDT_LEVEL, .@avg); + setunitdata($@FOS_MOB, UDT_STR, 1+.@avg*2/3); + setunitdata($@FOS_MOB, UDT_AGI, 1+.@avg*2/3); + setunitdata($@FOS_MOB, UDT_VIT, 1+.@avg*2/3); + setunitdata($@FOS_MOB, UDT_INT, 1+.@avg*2/3); + setunitdata($@FOS_MOB, UDT_DEX, 1+.@avg*2/3); + setunitdata($@FOS_MOB, UDT_LUK, 1+.@avg*2/3); + setunitdata($@FOS_MOB, UDT_ADELAY, 1472); + setunitdata($@FOS_MOB, UDT_ATKRANGE, 5); + // Battle Status + setunitdata($@FOS_MOB, UDT_MAXHP, .@avg*1500); + setunitdata($@FOS_MOB, UDT_HP, .@avg*1500); + setunitdata($@FOS_MOB, UDT_ATKMIN, .@avg*8); + setunitdata($@FOS_MOB, UDT_ATKMAX, .@avg*10); + setunitdata($@FOS_MOB, UDT_DEF, 12+.@avg*4/3); + setunitdata($@FOS_MOB, UDT_MDEF, 1+.@avg); + setunitdata($@FOS_MOB, UDT_HIT, .@avg*18); // Advised: x18 + setunitdata($@FOS_MOB, UDT_FLEE, .@avg*4); // Advised: x5 + setunitdata($@FOS_MOB, UDT_CRIT, 60+.@avg*4/3); + // Reconfigure the AI + .@opt=getunitdata($@FOS_MOB, UDT_MODE); + // Disable looting + if (.@opt & MD_LOOTER) + .@opt=.@opt^MD_LOOTER; + // Add knockback immunity + .@opt=.@opt|MD_NOKNOCKBACK; + // Mark as boss + .@opt=.@opt|MD_BOSS; + // Mark as aggressive + .@opt=.@opt|MD_AGGRESSIVE; + .@opt=.@opt|MD_ANGRY; + // Make it more op + .@opt=.@opt|MD_DETECTOR; + .@opt=.@opt|MD_CASTSENSOR_CHASE; + .@opt=.@opt|MD_CASTSENSOR_IDLE; + .@opt=.@opt|MD_CHANGECHASE; + .@opt=.@opt|MD_CHANGETARGET_MELEE; + .@opt=.@opt|MD_CHANGETARGET_CHASE; + setunitdata($@FOS_MOB, UDT_MODE, .@opt); + sleep(1000); + mapannounce("029-9", "##1##BON YOUR MARKS...", 0); + sleep(2000); + mapannounce("029-9", "##1##B3...", 0); + sleep(1000); + mapannounce("029-9", "##1##B2...", 0); + sleep(1000); + mapannounce("029-9", "##1##B1...", 0); + sleep(1000); + mapannounce("029-9", "##1##BBEGIN!!", 0); + .Support3=monster("029-9", 25, 29, "Magic Commander", Moubi, 1); + .Support4=monster("029-9", 53, 29, "Army Commander", BloodyMouboo, 1); + .Support5=monster("029-9", 39, 45, "Mouboo Governor", AlphaMouboo, 1); + setunitdata(.Support3, UDT_MAXHP, .@avg*300); + setunitdata(.Support3, UDT_HP, .@avg*300); + setunitdata(.Support4, UDT_MAXHP, .@avg*300); + setunitdata(.Support4, UDT_HP, .@avg*300); + setunitdata(.Support5, UDT_MAXHP, .@avg*300); + setunitdata(.Support5, UDT_HP, .@avg*300); + setunitdata(.Support3, UDT_RACE, RC_Legendary); + setunitdata(.Support4, UDT_RACE, RC_Legendary); + setunitdata(.Support5, UDT_RACE, RC_Legendary); + initnpctimer; + end; + +OnEventEnd: + stopnpctimer; + mapannounce("029-9", "Moubootaur : ##1##BThis is not the place...", 0); + sleep(2000); + mapannounce("029-9", "Moubootaur : ##1##BMy powers are weak here...", 0); + sleep(2000); + mapannounce("029-9", "Moubootaur : ##1##BHowever... I know where I must go.", 0); + sleep(3000); + mapannounce("029-9", "Moubootaur : ##1##BThe prophecy... LIVES!", 0); + sleep(3000); + // TODO Reward cycle + // This can be slow, beware + .@c = getunits(BL_PC, .@players, MAX_CYCLE_PC); + for (.@i = 0; .@i < .@c; .@i++) { + attachrid(.@players[.@i]); + if ($FIRESOFSTEAM >= 10) { + getexp 50000, 5000; + } else { + getexp 1000000, 500000; + getitem StrangeCoin, 2000; + Mobpt+=1500000; + Zeny+=1000000; + } + dispbottom l("Congratulations! You've received participation rewards due to the Moubootaur Death."); + detachrid(); + } + if ($FIRESOFSTEAM < 10) { + kamibroadcast("The Moubootaur has been awakened. The gears of destiny are on motion.", "Jesusalva"); + sleep(5000); + kamibroadcast("Great calamity shall soon befall upon this world.", "Jesusalva"); + sleep(5000); + kamibroadcast("But if we all fight togheter, we might have a chance!", "Saulc"); + sleep(5000); + kamibroadcast("At due time... The Secret of Mana will be revealed.", "Jesusalva"); + sleep(5000); + kamibroadcast("May the apocalypse begin: The revelation of this world!", "Jesusalva"); + kamibroadcast("MOUBOOTAUR LEGENDS, FIFTH ACT - THE WORLD'S CURSE"); + $FIRESOFSTEAM=10; + $GAME_STORYLINE=4; + $MANA_BLVL-=5; // Set level to 15~25 + $MANA_JLVL-=5; // Set job level to 10 + $MANA_BINT-=15; // Set min. int to 15 + } + end; + +////////////// Map Broadcast ////////////// OnMFStun: - sc_start(SC_STUN, 60000, 1, 10000, SCFLAG_NOAVOID|SCFLAG_FIXEDTICK); + sc_start(SC_STUN, .firstime, 1, 10000, SCFLAG_NOAVOID|SCFLAG_FIXEDTICK); + end; + +OnMFAndreiMagic: + .@stat=max(1, 5-((100-$@FIRESOFSTEAM_DIFF)/30)); + dispbottom col(l("Enemies stunned!"), 3); + dispbottom col(l("All Stats temporarily raised!"), 2); + dispbottom l("Andrei Sakar used magic: Triumph of the Eternals"); + sc_start(SC_INCALLSTATUS, .boostime, .@stat, 10000, SCFLAG_NOAVOID|SCFLAG_FIXEDTICK); + end; + +OnMFMark: + dispbottom col(l("On your marks..."), 1); end; -// TODO: Heartbeat. I think there's no real need to lock the door? -OnTimer5000: +OnMFScene: + if (!isin("029-9", 20, 20, 60, 50)) + warp "029-9", rand2(33,34), rand2(24,26); + sc_start(SC_STUN, .subitime, 1, 10000, SCFLAG_NOAVOID|SCFLAG_FIXEDTICK); + end; + +OnMFShake: + sshake(); + closeclientdialog; + sleep2(1000); + sshake(); + sshake(); + closeclientdialog; + end; + +////////////// Heartbeat ////////////// +OnTimer15000: + if ($@FIRESOFSTEAM_BOSS == 1) { + monster("029-9", 102, 47, "Assassin", Assassin, 1); + } else if ($@FIRESOFSTEAM_BOSS == 2) { + // Handle Moubootaur Magic + // But only if .Support3 was defined (control variable) + if (!.Support3) {initnpctimer; end;} + // Select random magic from arsenal + .@r=rand2(16); + switch (.@r) { + case 1: + mapannounce("029-9", "Moubootaur : ##BAncient Magic: Bleeding", 0); + areasc2("029-9", 40, 35, 20, 15000, SC_BLOODING, BL_PC, 1); + break; + case 2: + mapannounce("029-9", "Moubootaur : ##BAncient Magic: Blind", 0); + areasc2("029-9", 40, 35, 20, 15000, SC_BLIND, BL_PC, 1); + break; + case 3: + mapannounce("029-9", "Moubootaur : ##BAncient Magic: Lag", 0); + areasc2("029-9", 40, 35, 20, 15000, SC_CONFUSION, BL_PC, 1); + break; + case 4: + mapannounce("029-9", "Moubootaur : ##BAncient Magic: Curse", 0); + areasc2("029-9", 40, 35, 20, 15000, SC_CURSE, BL_PC, 1); + break; + case 5: + mapannounce("029-9", "Moubootaur : ##BAncient Magic: Poison", 0); + areasc2("029-9", 40, 35, 20, 15000, SC_POISON, BL_PC, 1); + break; + case 6: + mapannounce("029-9", "Moubootaur : ##BAncient Magic: Sleep", 0); + areasc2("029-9", 40, 35, 20, 15000, SC_SLEEP, BL_PC, 1); + break; + case 7: + mapannounce("029-9", "Moubootaur : ##BAncient Magic: Deadly Poison", 0); + areasc2("029-9", 40, 35, 20, 15000, SC_DPOISON, BL_PC, 1); + break; + case 8: + mapannounce("029-9", "Moubootaur : ##BAncient Magic: Chilling", 0); + areasc2("029-9", 40, 35, 20, 15000, SC_COLD, BL_PC, 1); + break; + case 9: + mapannounce("029-9", "Moubootaur : ##BAncient Magic: Burning", 0); + areasc2("029-9", 40, 35, 20, 15000, SC_BURNING, BL_PC, 1); + break; + case 10: + mapannounce("029-9", "Moubootaur : ##BAncient Magic: Fear", 0); + areasc2("029-9", 40, 35, 20, 15000, SC_FEAR, BL_PC, 1); + break; + case 11: + mapannounce("029-9", "Moubootaur : ##BAncient Magic: Obliterate", 0); + rectharm($@FOS_MOB, 7, 7, rand2(700, 900), HARM_MISC, Ele_Holy, "filter_always", BL_PC | BL_MER | BL_HOM); + break; + case 12: + mapannounce("029-9", "Moubootaur : ##BAncient Magic: Disarm Homun", 0); + areasc2("029-9", 40, 35, 20, 15000, SC_STUN, BL_HOM, 1); + break; + case 13: + mapannounce("029-9", "Moubootaur : ##BAncient Magic: Exterminate Lesserform", 0); + rectharm($@FOS_MOB, 7, 7, rand2(800, 1400), HARM_MISC, Ele_Holy, "filter_always", BL_MER | BL_HOM); + break; + case 14: + mapannounce("029-9", "Moubootaur : ##BAncient Magic: Summon Reinforcement", 0); + for (.@i=0;.@i <= rand2(4);.@i++) { + .@m=monster("029-9", 39, 36, "Reinforcement", + any(AlphaMouboo, Moubi, BloodyMouboo, Moubi), 1); + setunitdata(.@m, UDT_RACE, RC_Legendary); + } + break; + case 15: + mapannounce("029-9", "Moubootaur : ##BAncient Magic: Wizcat", 0); + for (.@i=0;.@i <= 2+rand2(7);.@i++) { + .@m=monster("029-9", rand2(35,43), rand2(35,38), + "Reinforcement", BlackCat, 1); + setunitdata(.@m, UDT_RACE, RC_Legendary); + } + break; + case 16: + mapannounce("029-9", "Moubootaur : ##BAncient Magic: Nuke", 0); + rectharm($@FOS_MOB, 14, 14, rand2(450, 750), HARM_MISC, Ele_Holy, "filter_always", BL_PC | BL_MER | BL_HOM); + break; + default: // case 0 + mapannounce("029-9", "Moubootaur : ##BAncient Magic: Seal", 0); + areasc2("029-9", 40, 35, 20, 15000, SC_SILENCE, BL_PC, 1); + break; + } + sleep(rand2(45000)); // Wait a bit longer between magic (random) + } initnpctimer; end; OnInit: + .firstime = 18000; + .boostime = 900000; + .subitime = 47000; .distance = 5; .sex = G_OTHER; end; } -/* ***************************************** -0 = Off; 1 = Moubootaur leaves; 2 = Moubootaur stays -***************************************** */ diff --git a/npc/functions/mkbot.txt b/npc/functions/mkbot.txt index 7fc290a24..4f1037488 100644 --- a/npc/functions/mkbot.txt +++ b/npc/functions/mkbot.txt @@ -16,7 +16,7 @@ // 2 - The Monster King is currently sieging towns at random // 3 - The Monster King is preparing to perfom the Rite and Lightbringer seeks // a wielder -// 4 - The Rite is in progress. Players must walk to MK evil lair and fight. +// 4 - The Rite is CONCLUDED. Players must walk to MK evil lair and fight. // 5 - The Monster King is dead. Or something. Depends on players. // // $MK_TEMPVAR meaning depends on GAME STORYLINE @@ -104,7 +104,7 @@ OnTimer90000: // The Monster King will not move anymore because story if ($GAME_STORYLINE == 0 || - $GAME_STORYLINE == 4) { + $GAME_STORYLINE == 5) { if (.mp$ != "boss") unitwarp($@MK, "boss", 45, 45); initnpctimer; @@ -163,12 +163,12 @@ OnTimer90000: // Siege events (req. 300 aggro, 3 users, and 70% chances to begin) if ($@MK_AGGRO >= ($GAME_STORYLINE == 2 ? 300 : 900) && .users >= 3 && rand2(0,100) < 70 && - is_between(1, 3, $GAME_STORYLINE) && $@MK_THROTTLE < gettimetick(2)){ + is_between(1, 4, $GAME_STORYLINE) && $@MK_THROTTLE < gettimetick(2)){ // Delta handles the compulsory wait time between waves. // 6 hours normally, 24 hours if the army is in disarray. .@delta=6; $@SIEGE_ABORTED = false; - if ($GAME_STORYLINE == 3) + if ($GAME_STORYLINE >= 3) .@delta=24; // Tulimshar if (compare(.mp$, "003-")) { @@ -203,7 +203,7 @@ OnTimer90000: // If a player is nearby while the Monster King prepares, event may happen // Minimum 60 Aggro if (.nearby > 1 && $@MK_AGGRO >= 80 && - ($GAME_STORYLINE == 1 || ($GAME_STORYLINE == 3 && $@MK_THROTTLE >= gettimetick(2)) )){ + ($GAME_STORYLINE == 1 || ($GAME_STORYLINE >= 3 && $@MK_THROTTLE >= gettimetick(2)) )){ // We should decide event kind, but that's NYI announce ("Monster King: I smell humans! Humans must die!"), bc_map|bc_npc; @@ -242,6 +242,8 @@ OnTimer90000: // Apply the changes $GAME_STORYLINE=3; $MK_TEMPVAR=0; // In past, we forced 1 month wait. Now we have KW mechs... + $MANA_BLVL-=10; // Set level to 20~30 + $MANA_JLVL-=5; // Set job level to 15 } // We're done, restart loop timer diff --git a/npc/functions/news.txt b/npc/functions/news.txt index 9192db862..7f7152d41 100644 --- a/npc/functions/news.txt +++ b/npc/functions/news.txt @@ -60,6 +60,17 @@ function script GameNews { mesc l("Only then we may have peace!!"); next; break; + ////////////////////////////////////////////////////////////////// + case 105: + mes ""; + mes ".:: "+ l("The Final Act") + " ::."; + next; + mesc l("The Moubootaur is the final opponent."); + mesc l("How many lives will be claimed until he is put to rest?"); + next; + mesc l("According to the prophecy, he'll not stop, until life itself as we know today is removed from existence."); + next; + break; default: break; } @@ -317,6 +328,9 @@ function script Journalman { mesc l("We must defeat the Monster King on his evil lair!"); mesc l("Only then we may have peace!!"); break; + case 5: + mesc l("Moubootaur, please spare me..."); + break; default: Exception(l("I do now know what this means: GS-@@-ICXN-@@", $GAME_STORYLINE, $MK_TEMPVAR), RB_DEFAULT|RB_SPEECH); break; } @@ -327,6 +341,7 @@ function script Journalman { menuint l("Thanks for your help!"), 1, l("Event News"), 0, + rif($GAME_STORYLINE >= 5, l("The Final Act")), 105, rif($GAME_STORYLINE >= 4, l("The Fifth Act")), 104, rif($GAME_STORYLINE >= 3, l("The Fourth Act")), 103, rif($GAME_STORYLINE >= 2, l("The Third Act")), 102, |