// TMW2 scripts.
// Author:
// Jesusalva
// Description:
// Some of the event scripts
001-3 mapflag zone MMO
001-13-2 mapflag zone MMO
/////////////////////////////////////////////////////////////////////////////////
// Area 06: Moubootaur Showdown
001-13-2,47,26,0 script #FoSCore NPC_NO_SPRITE,{
if (!is_admin() && !is_master()) end;
if ($@FIRESOFSTEAM_BOSS) end;
select
l("Ignore this book"),
l("Begin Moubootaur Showdown");
mes "";
$@FIRESOFSTEAM_BOSS=(@menu-1)*2;
if ($@FIRESOFSTEAM_BOSS == 0) close;
select
l("Easy Mode"),
l("Crazy Mode"),
l("Cadis Mode"),
l("Crazy Cadis Ultimate Pandorica Mode"),
l("Portable Apocalypse");
mes "";
$@FIRESOFSTEAM_DIFF=70+(@menu*30);
$@EVENT_06 = PORTHOS_BUSY;
switch (@menu) {
case 1: .@d$="##2Easy"; break;
case 2: .@d$="##3Crazy"; break;
case 3: .@d$="##5Cadis"; break;
case 4: .@d$="##6Crazy Cadis Ultimate Pandorica"; break;
case 5: .@d$="##1Portable Apocalypse"; break;
default: .@d$="Unknown";
}
mapannounce("001-13-2", "Difficulty Selected: ##B"+.@d$+"##b", 0);
changemusic("001-13-2", "mythica.ogg");
closeclientdialog;
// Dispose of the GM
warp "033-1", 49, 193;
sleep(200);
// PC no longer attached
// Start the event
mapwarp("001-13-2", "001-13-2", 47, 37);
sleep(200);
// Cleanup previous data (if any)
$@FOS_ISB=0;
$@FOS_MOB=0;
$@FOS_AND=0;
.Support1=0;
.Support2=0;
.Support3=0;
.Support4=0;
.Support5=0;
$@FOS_MOB=monster("001-13-2", 47, 32, "Moubootaur (Sealed)", MobMoubootaur, 1, "#FoSCore::OnEventEnd");
.@c = getunits(BL_PC|BL_MER|BL_HOM, .@players, MAX_CYCLE_PC, "001-13-2");
for (.@i = 0; .@i < .@c; .@i++) {
sc_start(SC_STUN, 31000, 1, 10000,
SCFLAG_NOAVOID|SCFLAG_FIXEDTICK, .@players[.@i]);
}
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 not even a decade since I turned a whole world in a Moubootaur Legend for their insolence...");
sleep(5000);
maptimer2("001-13-2", 2000, "#FoSCore::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 THE WHOLE FRICKIN' MULTIVERSE INTO MOUBOOS...");
sleep(6000);
unittalk($@FOS_MOB, "##1MY RETURN... IS AT HAND!!");
.@avg=$@FIRESOFSTEAM_DIFF*13/10; // Moubootaur: +30% bonus (+30~60 lvls)
// Reconfigure the monster (otherwise it is night immortal)
setunitdata($@FOS_MOB, UDT_LEVEL, .@avg);
setunitdata($@FOS_MOB, UDT_STR, 1+.@avg*3/4);
setunitdata($@FOS_MOB, UDT_AGI, 1+.@avg*3/4);
setunitdata($@FOS_MOB, UDT_VIT, 1+.@avg*3/4);
setunitdata($@FOS_MOB, UDT_INT, 1+.@avg*3/4);
setunitdata($@FOS_MOB, UDT_DEX, 1+.@avg*3/4);
setunitdata($@FOS_MOB, UDT_LUK, 1+.@avg*3/4);
setunitdata($@FOS_MOB, UDT_ADELAY, 1472);
setunitdata($@FOS_MOB, UDT_ATKRANGE, 4);
// Battle Status
setunitdata($@FOS_MOB, UDT_MAXHP, .@avg*1350);
setunitdata($@FOS_MOB, UDT_HP, .@avg*1350);
setunitdata($@FOS_MOB, UDT_ATKMIN, .@avg*6);
setunitdata($@FOS_MOB, UDT_ATKMAX, .@avg*8);
setunitdata($@FOS_MOB, UDT_DEF, 12+.@avg*5/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("001-13-2", "##1##BON YOUR MARKS...", 0);
sleep(2000);
mapannounce("001-13-2", "##1##B3...", 0);
sleep(1000);
mapannounce("001-13-2", "##1##B2...", 0);
sleep(1000);
mapannounce("001-13-2", "##1##B1...", 0);
sleep(1000);
mapannounce("001-13-2", "##1##BBEGIN!!", 0);
.Support3=monster("001-13-2", 59, 36, "Magic Commander", Moubi, 1);
.Support4=monster("001-13-2", 44, 44, "Army Commander", BloodyMouboo, 1);
.Support5=monster("001-13-2", 37, 36, "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;
changemusic("001-13-2", "Arabesque.ogg");
end;
////////////// Player's Victory //////////////
OnEventEnd:
stopnpctimer;
killmonsterall("001-13-2");
changemusic("001-13-2", "Misty_Shrine.ogg");
mapannounce("001-13-2", "Moubootaur : ##1##BThis is not the place...", 0);
sleep(2000);
mapannounce("001-13-2", "Moubootaur : ##1##BMy powers are weak here...", 0);
sleep(2000);
mapannounce("001-13-2", "Moubootaur : ##1##BBut you won't foil my plans forever!", 0);
sleep(3000);
mapannounce("001-13-2", "Moubootaur : ##1##BI'll come back... Stronger than ever!", 0);
sleep(3000);
maptimer2("001-13-2", 10, "#FoSCore::OnMFSurvive");
$@EVENT_06 = PORTHOS_UNUSED;
end;
////////////// Map Broadcast //////////////
OnMFMark:
dispbottom col(l("On your marks..."), 1);
end;
OnMFShake:
sshake();
closeclientdialog;
sleep2(1000);
sshake();
sshake();
closeclientdialog;
end;
OnMFDispose:
if (ispcdead()) warp("033-1", 154, 240);
end;
OnMFSurvive:
dispbottom l("Mission accomplished. Well played!");
// Mark as "done" on Mirror Lake Quest Tracker
##01_CRQUEST = ##01_CRQUEST | MLP_CR_DEBUT;
specialeffect(FX_FANFARE, AREA, getcharid(3));
sleep2(15000);
warp("033-1", 154, 240);
end;
////////////// Heartbeat //////////////
OnTimer15000:
maptimer2("001-13-2", 10, "#FoSCore::OnMFDispose");
sleep(30);
if (getmapusers("001-13-2") < 1) goto L_Defeat;
// Main cycle
if ($@FIRESOFSTEAM_BOSS) {
// Handle Moubootaur Magic
// But only if .Support3 was defined (control variable)
if (!.Support3) {initnpctimer; end;}
// Spawn a fiend
.@m=monster("001-13-2", 47, 31, "Mouboo", Mouboo, 1);
setunitdata(.@m, UDT_RACE, RC_Legendary);
.@hp=getunitdata(.@m, UDT_MAXHP)*$@FIRESOFSTEAM_DIFF/80;
.@op=getunitdata(.@m, UDT_MODE);
.@op=.@op|MD_AGGRESSIVE;
setunitdata(.@m, UDT_MAXHP, .@hp);
setunitdata(.@m, UDT_HP, .@hp);
setunitdata(.@m, UDT_MODE, .@op);
// Select random magic from arsenal
.@r=rand2(16);
switch (.@r) {
case 1:
mapannounce("001-13-2", "Moubootaur : ##BAncient Magic: Bleeding", 0);
areasc2("001-13-2", 50, 40, 30, 15000, SC_BLOODING, BL_PC, 1);
break;
case 2:
mapannounce("001-13-2", "Moubootaur : ##BAncient Magic: Blind", 0);
areasc2("001-13-2", 50, 40, 30, 15000, SC_BLIND, BL_PC, 1);
break;
case 3:
mapannounce("001-13-2", "Moubootaur : ##BAncient Magic: Lag", 0);
areasc2("001-13-2", 50, 40, 30, 15000, SC_CONFUSION, BL_PC, 1);
break;
case 4:
mapannounce("001-13-2", "Moubootaur : ##BAncient Magic: Curse", 0);
areasc2("001-13-2", 50, 40, 30, 15000, SC_CURSE, BL_PC, 1);
break;
case 5:
mapannounce("001-13-2", "Moubootaur : ##BAncient Magic: Poison", 0);
areasc2("001-13-2", 50, 40, 30, 15000, SC_POISON, BL_PC, 1);
break;
case 6:
mapannounce("001-13-2", "Moubootaur : ##BAncient Magic: Sleep", 0);
areasc2("001-13-2", 50, 40, 30, 15000, SC_SLEEP, BL_PC, 1);
break;
case 7:
mapannounce("001-13-2", "Moubootaur : ##BAncient Magic: Deadly Poison", 0);
areasc2("001-13-2", 50, 40, 30, 15000, SC_DPOISON, BL_PC, 1);
break;
case 8:
mapannounce("001-13-2", "Moubootaur : ##BAncient Magic: Chilling", 0);
areasc2("001-13-2", 50, 40, 30, 15000, SC_COLD, BL_PC, 1);
break;
case 9:
mapannounce("001-13-2", "Moubootaur : ##BAncient Magic: Burning", 0);
areasc2("001-13-2", 50, 40, 30, 15000, SC_BURNING, BL_PC, 1);
break;
case 10:
mapannounce("001-13-2", "Moubootaur : ##BAncient Magic: Fear", 0);
areasc2("001-13-2", 50, 40, 30, 15000, SC_FEAR, BL_PC, 1);
break;
case 11:
mapannounce("001-13-2", "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("001-13-2", "Moubootaur : ##BAncient Magic: Disarm Homun", 0);
areasc2("001-13-2", 50, 40, 30, 15000, SC_STUN, BL_HOM, 1);
break;
case 13:
mapannounce("001-13-2", "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("001-13-2", "Moubootaur : ##BAncient Magic: Summon Reinforcement", 0);
for (.@i=0;.@i <= rand2(4);.@i++) {
.@m=monster("001-13-2", rand2(35,43), rand2(35,38), "Reinforcement",
any(AlphaMouboo, Moubi, BloodyMouboo, Moubi), 1);
setunitdata(.@m, UDT_RACE, RC_Legendary);
.@hp=getunitdata(.@m, UDT_MAXHP)*$@FIRESOFSTEAM_DIFF/60;
setunitdata(.@m, UDT_MAXHP, .@hp);
setunitdata(.@m, UDT_HP, .@hp);
}
break;
case 15:
mapannounce("001-13-2", "Moubootaur : ##BAncient Magic: Wizcat", 0);
for (.@i=0;.@i <= 2+rand2(7);.@i++) {
.@m=monster("001-13-2", rand2(35,43), rand2(35,38),
"Reinforcement", BlackCat, 1);
setunitdata(.@m, UDT_RACE, RC_Legendary);
.@hp=getunitdata(.@m, UDT_MAXHP)*$@FIRESOFSTEAM_DIFF/70;
setunitdata(.@m, UDT_MAXHP, .@hp);
setunitdata(.@m, UDT_HP, .@hp);
}
break;
case 16:
mapannounce("001-13-2", "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("001-13-2", "Moubootaur : ##BAncient Magic: Seal", 0);
areasc2("001-13-2", 50, 40, 30, 15000, SC_SILENCE, BL_PC, 1);
break;
}
sleep(rand2(45000)); // Wait a bit longer between magic (random)
}
initnpctimer;
end;
////////////// Player's Defeat //////////////
OnDefeat:
L_Defeat:
$@FIRESOFSTEAM_BOSS=0;
$@FIRESOFSTEAM_DIFF=0;
$@FOS_ISB=0;
$@FOS_MOB=0;
$@FOS_AND=0;
.Support1=0;
.Support2=0;
.Support3=0;
.Support4=0;
.Support5=0;
killmonsterall("001-13-2");
kamibroadcast("The players were defeated at Fires of Steam Showdown.", "Fires of Steam");
$@EVENT_06 = PORTHOS_UNUSED;
stopnpctimer;
end;
OnInit:
.boostime = 900000;
.subitime = 47000;
.distance = 5;
.sex = G_OTHER;
end;
}
/////////////////////////////////////////////////////////////////////////////////
// Area 08: Blanc's Showdown
001-3,147,153,0 script #E08_CF NPC_HIDDEN,2,0,{
end;
OnTouch:
if (!(get_byte(EVENT_08, 0) & EV08_KEY)) {
dispbottom l("Darn, it is locked. A few keys will be necessary to open this.");
end;
}
warp "026-2", 32, 96;
end;
OnBossDie:
.@p=get_nibble(EVENT_08, 2)+1;
set_nibble(EVENT_08, 2, .@p);
if (.@p >= 3) {
set_byte(EVENT_08, 0, get_byte(EVENT_08, 0) | EV08_KEY);
dispbottom l("I got all the keys! Time to get out of here!");
sleep2(500);
warp "001-3", 164, 33;
end;
}
dispbottom l("Keys: %d/%d", .@p, 3);
end;
OnInit:
.sex = G_OTHER;
end;
}
001-3,35,32,0 script #E08WP_150 NPC_HIDDEN,0,0,{
end;
OnTouch:
if ($@EVENT_08 != PORTHOS_ACTIVE) end;
//if (get_byte(EVENT_08, 0) & EV08_P150) end;
if (get_byte(EVENT_08, 0) & EV08_KEY) end;
setpcblock(PCBLOCK_HARD, true);
mesc l("STORY MODE ENABLED. Monsters won't attack you, so you can read without worries."), 1;
next;
mesc l("Seems like our prey was through. This portal connects to a Level %d Maze.", .lvl);
if (BaseLevel > .lvl*2) {
mesc l("Meaning I cannot use this one. Dang!");
next;
goto L_Close;
}
mesc l("If I can find Elmo or Marley inside, they should be holding the keys for the castle, where we presume Blanc ran off to.");
mesc l("I need to defeat at least three of them."), 1;
next;
mesc l("Will I explore this Maze? Or will I look another?"), 1;
next;
if (askyesno() == ASK_YES) {
set_nibble(EVENT_08, 2, 0);
CreateMaze(IOT_CHAR, MAZE_SIZE_G | MAZE_SIZE_X);
if (BaseLevel > .lvl)
.density=12;
else
.density=15;
MazeMobs(.lvl, false, .density);
// Spawn & Configure the boss monster
.@mx=getmapinfo(MAPINFO_SIZE_X, MAZE_MAP$)-20;
.@my=getmapinfo(MAPINFO_SIZE_Y, MAZE_MAP$)-20;
.@mob=areamonster(MAZE_MAP$, 20, 20, .@mx, .@my, "Elmo", Marley, 5, "#E08_CF::OnBossDie");
InitMaze(7200);
dispbottom col(l("Reminder : Defeat 3/5 %s to win. Time limit: %d minutes or death.", b("Elmo"), 120), 2);
}
L_Close:
closeclientdialog;
setpcblock(PCBLOCK_HARD, false);
end;
OnInit:
.sex = G_OTHER;
.@n$ = strnpcinfo(0, "_0");
explode(.@ni$, .@n$, "_");
.lvl = atoi(.@ni$[1]);
end;
}
001-3,113,148,0 duplicate(#E08WP_150) #E08WP_100 NPC_HIDDEN,0,0
001-3,258,39,0 duplicate(#E08WP_150) #E08WP_75 NPC_HIDDEN,0,0
001-3,38,257,0 duplicate(#E08WP_150) #E08WP_50 NPC_HIDDEN,0,0
001-3,229,188,0 duplicate(#E08WP_150) #E08WP_25 NPC_HIDDEN,0,0
// 35,32 NW (150) OK
// 113,148 Central circle (100)
// 258,39 NE (75)
// 38,257 SW (50)
// 229,188 SE (25)