summaryrefslogtreecommitdiff
path: root/npc
diff options
context:
space:
mode:
authorJesusaves <cpntb1@ymail.com>2021-03-18 01:11:56 -0300
committerJesusaves <cpntb1@ymail.com>2021-03-18 01:11:56 -0300
commit6ddb573269bc7b0af11bbada28d769eb04ce7bad (patch)
treec19b81ff39ecf5ffee7aa00595d1190babce1679 /npc
parentfe9ddbaa6acea3854f6da32b4aa47276a5fb1620 (diff)
downloadserverdata-6ddb573269bc7b0af11bbada28d769eb04ce7bad.tar.gz
serverdata-6ddb573269bc7b0af11bbada28d769eb04ce7bad.tar.bz2
serverdata-6ddb573269bc7b0af11bbada28d769eb04ce7bad.tar.xz
serverdata-6ddb573269bc7b0af11bbada28d769eb04ce7bad.zip
Fires Of Steam, Final Showdown - Initial Version
Diffstat (limited to 'npc')
-rw-r--r--npc/023-2/mk.txt2
-rw-r--r--npc/025-1/ihclot.txt2
-rw-r--r--npc/025-1/phoenix.txt2
-rw-r--r--npc/025-1/salohcin.txt6
-rw-r--r--npc/029-0/mobs.txt6
-rw-r--r--npc/029-9/boss.txt451
-rw-r--r--npc/functions/mkbot.txt12
-rw-r--r--npc/functions/news.txt15
8 files changed, 472 insertions, 24 deletions
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,