// TMW2 scripts.
// Authors:
// Jesusalva
// Description:
// Sagratha Quest (field 3)
015-8-1,49,38,0 script #SaggyDungeonCore NPC_NO_SPRITE,{
// Not in instance, we don't care.
if (instance_id() < 0)
end;
if (!.SAGRATHA)
dispbottom l("I cannot read the signs from this far away.");
if (@swin)
goto OnSW06;
end;
// There is no instance init
OnBegin:
.@m$=getmap();
.@n$=instance_npcname(.name$);
.PLAYERID=getcharid(3);
// PCBLOCK_HARD = PCBLOCK_ATTACK|PCBLOCK_SKILL|PCBLOCK_USEITEM|PCBLOCK_COMMANDS|PCBLOCK_SITSTAND|PCBLOCK_IMMUNE|PCBLOCK_CHAT|PCBLOCK_MOVE
setpcblock(PCBLOCK_HARD, true);
setq3 HurnscaldQuest_Sagratha, 1;
// Setup boss units
.SAGRATHA=monster(.@m$, 52, 40, "Sagratha", Sagratha, 1, .@n$+"::OnSagrathaDie", Size_Medium, 2);
.BOSS=monster(.@m$, 47, 40, l("Masked Assassin"), HoodedAssassin, 1, .@n$+"::OnSagrathaWin");
unitstop(.SAGRATHA);
unitstop(.BOSS);
sc_start(SC_STUN, 9000, 1, 10000, SCFLAG_NOAVOID|SCFLAG_FIXEDTICK, .SAGRATHA);
sc_start(SC_STUN, 9000, 1, 10000, SCFLAG_NOAVOID|SCFLAG_FIXEDTICK, .BOSS);
// FIXME: Seems like this is an "unsafe command" in 4144's opinion
// Prevent players from engaging Sagratha and allies
clientcommand "addignoreattack Sagratha";
clientcommand "addignoreattack "+l(strmobinfo(1, Mouboo));
clientcommand "addignoreattack "+l(strmobinfo(1, ForestMushroom));
clientcommand "addignoreattack "+strmobinfo(1, Mouboo);
clientcommand "addignoreattack "+strmobinfo(1, ForestMushroom);
unittalk(.SAGRATHA, l("What are you doing here, @@!", get_race()));
addtimer(2000, .@n$+"::OnS02");
end;
OnS02:
.@m$=getmap();
.@n$=instance_npcname(.name$);
unittalk(.SAGRATHA, l("I don't need help!"));
unittalk(.BOSS, l("Die already!"));
addtimer(3000, .@n$+"::OnS03");
end;
OnS03:
.@m$=getmap();
.@n$=instance_npcname(.name$);
unittalk(.SAGRATHA, l("If you don't want to die, fight!"));
unittalk(.BOSS, lg("Murder her too!", "Murder him too!"));
addtimer(3000, .@n$+"::OnS04");
end;
OnS04:
.@m$=getmap();
.@n$=instance_npcname(.name$);
// Assassin's Army
areamonster .@m$, 44, 40, 55, 50, strmobinfo(1, HoodedNinja), HoodedNinja, 2, .@n$+"::OnError";
areamonster .@m$, 44, 40, 55, 50, strmobinfo(1, Assassin), Assassin, 4, .@n$+"::OnError";
// Sagratha's Army
areamonster .@m$, 44, 40, 55, 50, strmobinfo(1, Mouboo), Mouboo, 5, .@n$+"::OnError", Size_Medium, 2;
areamonster .@m$, 44, 40, 55, 50, strmobinfo(1, ForestMushroom), ForestMushroom, 2, .@n$+"::OnError", Size_Medium, 2;
// Heal them because you should not be fighting (yet).
setunitdata(.BOSS, UDT_HP, getunitdata(.BOSS, UDT_MAXHP));
setunitdata(.SAGRATHA, UDT_HP, getunitdata(.SAGRATHA, UDT_MAXHP));
unitstop(.SAGRATHA);
unitstop(.BOSS);
// Objective announce
mapannounce(.@m$, "##2"+l("Victory Conditions: Protect Sagratha!"), 0);
mapannounce(.@m$, "##2"+l("Victory Conditions: Defeat the assassin!"), 0);
mapannounce(.@m$, "##1"+l("Defeat Conditions: Your death!"), 0);
mapannounce(.@m$, "##1"+l("Defeat Conditions: Time run out!"), 0);
mapannounce(.@m$, "##1"+l("Defeat Conditions: Sagratha gets killed!"), 0);
// Status cleanup
// PCBLOCK_HARD = PCBLOCK_ATTACK|PCBLOCK_SKILL|PCBLOCK_USEITEM|PCBLOCK_COMMANDS|PCBLOCK_SITSTAND|PCBLOCK_IMMUNE|PCBLOCK_CHAT|PCBLOCK_MOVE
setpcblock(PCBLOCK_HARD, false);
// TODO: After x time, reinforcements on both sides
// BOSS: “Kill 'em all!”
// SAGGY: “Beings of florest, come to my aid and protect me!”
addtimer(20000, .@n$+"::OnW01");
end;
OnW01:
.@m$=getmap();
.@n$=instance_npcname(.name$);
unittalk(.BOSS, l("Kill 'em all!"));
unittalk(.SAGRATHA, l("It's an ambush!"));
monster .@m$, 39, 39, strmobinfo(1, HoodedNinja), HoodedNinja, 1, .@n$+"::OnError";
monster .@m$, 60, 39, strmobinfo(1, HoodedNinja), HoodedNinja, 1, .@n$+"::OnError";
monster .@m$, 39, 54, strmobinfo(1, Assassin), Assassin, 1, .@n$+"::OnError";
monster .@m$, 60, 54, strmobinfo(1, Assassin), Assassin, 1, .@n$+"::OnError";
addtimer(rand(10000,15000), .@n$+"::OnW02");
end;
OnW02:
.@m$=getmap();
.@n$=instance_npcname(.name$);
unittalk(.SAGRATHA, l("Mouboos, come to my aid and protect me!"));
monster .@m$, 46, 59, strmobinfo(1, Mouboo), Mouboo, 1, .@n$+"::OnError", Size_Medium, 2;
monster .@m$, 44, 61, strmobinfo(1, Mouboo), Mouboo, 1, .@n$+"::OnError", Size_Medium, 2;
monster .@m$, 49, 61, strmobinfo(1, Mouboo), Mouboo, 1, .@n$+"::OnError", Size_Medium, 2;
addtimer(30000, .@n$+"::OnW03");
end;
OnW03:
.@m$=getmap();
.@n$=instance_npcname(.name$);
unittalk(.SAGRATHA, l("Do not think you can defeat me yet!"));
unittalk(.BOSS, l("You'll all die here!"));
monster .@m$, 49, 34, strmobinfo(1, ForestMushroom), ForestMushroom, 1, .@n$+"::OnError", Size_Medium, 2;
monster .@m$, 47, 36, strmobinfo(1, Assassin), Assassin, 1, .@n$+"::OnError";
monster .@m$, 52, 36, strmobinfo(1, Assassin), Assassin, 1, .@n$+"::OnError";
addtimer(20000, .@n$+"::OnW04");
end;
OnW04:
.@m$=getmap();
.@n$=instance_npcname(.name$);
unittalk(.SAGRATHA, l("It's far from over! You cannot defeat me!"));
monster .@m$, 46, 59, strmobinfo(1, Wolvern), Wolvern, 1, .@n$+"::OnError", Size_Medium, 2;
monster .@m$, 44, 61, strmobinfo(1, ForestMushroom), ForestMushroom, 1, .@n$+"::OnError", Size_Medium, 2;
monster .@m$, 49, 61, strmobinfo(1, PoisonSpikyMushroom), PoisonSpikyMushroom, 1, .@n$+"::OnError", Size_Medium, 2;
end;
// Assassin, HoodedNinja, HoodedAssassin (boss)
// Mouboo, ForestMushroom, Fluffy, Sagratha (boss)
OnSagrathaDie:
.@n$=instance_npcname(.name$);
addtimer(70, .@n$+"::OnSagrathaReallyDie", .PLAYERID);
end;
OnSagrathaReallyDie:
.@m$=getmap();
.@n$=instance_npcname(.name$);
deltimer(.@n$+"::OnW01");
deltimer(.@n$+"::OnW02");
deltimer(.@n$+"::OnW03");
deltimer(.@n$+"::OnW04");
killmonster(.@m$, .@n$+"::OnError");
unitkill(.BOSS);
mapannounce(.@m$, "##2"+l("You lose!"), 0);
dispbottom l("You failed to protect Sagratha..."); // and will need to start the quest again...");
setq1 HurnscaldQuest_Sagratha, 3;
setq3 HurnscaldQuest_Sagratha, 0;
die();
end;
OnSagrathaWin:
.@n$=instance_npcname(.name$);
addtimer(70, .@n$+"::OnSagrathaReallyWin", .PLAYERID);
@swin=true;
end;
OnSagrathaReallyWin:
.@m$=getmap();
.@n$=instance_npcname(.name$);
@swin=true;
if (ispcdead())
end;
deltimer(.@n$+"::OnW01");
deltimer(.@n$+"::OnW02");
deltimer(.@n$+"::OnW03");
killmonster(.@m$, .@n$+"::OnError");
mapannounce(.@m$, "##2"+l("You win!"), 0);
mapannounce(.@m$, "##2"+l("You must go talk with the Obelisk!"), 0);
npctalk l("YOU WHO DEFILE THIS PLACE...");
// How does she even knows your name?
unittalk(.SAGRATHA, l("@@, watch out! The obelisk - it is talking!", strcharinfo(0)));
unitstop(.SAGRATHA);
addtimer(300, .@n$+"::OnSW01");
end;
OnSW01:
.@m$=getmap();
.@n$=instance_npcname(.name$);
unitwalk(.SAGRATHA, 50, 39);
addtimer(2000, .@n$+"::OnSW02");
end;
OnSW02:
.@m$=getmap();
.@n$=instance_npcname(.name$);
npctalk l("YOU WHO DEFILE THIS PLACE...");
addtimer(2000, .@n$+"::OnSW03");
end;
OnSW03:
.@m$=getmap();
.@n$=instance_npcname(.name$);
// Perhaps “Cursed” instead of “Sacred”?
npctalk l("THIS IS THE MOUBOOTAUR TEMPLE RUINS... THIS PLACE IS SACRED...");
addtimer(3000, .@n$+"::OnSW04");
end;
OnSW04:
.@m$=getmap();
.@n$=instance_npcname(.name$);
npctalk l("THE BLOOD HERE SPILLED TODAY... ONLY ENRAGES HIM MORE...");
unittalk(.SAGRATHA, l("Yikes, the Moubootaur!"));
addtimer(3000, .@n$+"::OnSW05");
end;
OnSW05:
.@m$=getmap();
.@n$=instance_npcname(.name$);
npctalk l("LEAVE NOW... BEFORE IT BECOMES TOO LATE....");
addtimer(3000, .@n$+"::OnSW06");
end;
OnSW06:
.@m$=getmap();
.@n$=instance_npcname(.name$);
if (getq(HurnscaldQuest_Sagratha) != 5)
end;
mesn l("Sagratha");
mesq l("@@, we should leave here now.", strcharinfo(0));
next;
select
l("What is the Moubootaur?"),
l("I came here to ask for help with curses."),
l("WHAT IN THE NAME OF THE FREAKING PENGUIN WAS THAT?!");
mes "";
mesn l("Sagratha");
mesq l("That's none of your bussiness! We should leave here NOW!");
next;
mesn l("Sagratha");
mesq l("You can tell me the details about why you're here on the way out...");
next;
mesn l("Sagratha");
mesq l("But for now, we must NOT enrage the Moubootaur!!");
next;
@swin=false;
setq HurnscaldQuest_Sagratha, 6, 0, 0;
warp "014-5", 122, 139;
clear;
mesc l(".:: Victory ::."), 3;
mesc l("You successfully completed Sagratha's Campaign."), 3;
close;
OnError:
end;
OnInit:
.SAGRATHA=0;
end;
}
// Dummy NPC to fire #SaggyDungeonCore when you get close to battle scene
015-8-1,49,39,0 script #SaggyDungeonFire NPC_HIDDEN,1,0,{
end;
OnTouch:
if (instance_id() < 0)
end;
if (!getq3(HurnscaldQuest_Sagratha)) {
.@in=getq2(HurnscaldQuest_Sagratha);
doevent(instance_npcname("#SaggyDungeonCore", .@in)+"::OnBegin");
}
end;
OnInit:
.distance=0;
end;
}