// TMW2 scripts.
// Author:
// Jesusalva
// Description:
// SEALED SHRINE submodule - Sagratha's Cave - 015-8
// Uses setq3 - setq1 stage 3
// NPC_FAKIR + NPC_STATUE_FAFA
// Check for validity
function script SaggySealCheck {
.@q=getq(HurnscaldQuest_Sagratha);
.@q3=getq3(HurnscaldQuest_Sagratha);
// Cheater Detected
if (!MAGIC_LVL || .@q < 3) {
setq HurnscaldQuest_Sagratha, 0, 0, 0;
sc_end SC_CASH_PLUSEXP;
sc_end SC_OVERLAPEXPUP;
sc_start SC_OVERLAPEXPUP, 300000, -20;
warp "Save", 0, 0;
closeclientdialog;
end;
return false;
}
// Okay, if it is not stage 3, we don't need to unseal
if (.@q != 3)
return false;
return true;
}
// Seal Spawn
// (name, seal x, seal y, stageId, {seal map})
function script SaggySealInit {
.@n$=getarg(0);
.@x=getarg(1);
.@y=getarg(2);
.@z=getarg(3);
.@m$=getarg(4, "015-8");
// Do nothing if @SaggySeal$ is busy - we will NOT begin another unsealing.
if (@SaggySeal$ != "" && !.@z)
end;
else
@SaggySeal$=.@n$;
// You're dead, drop the script
if (ispcdead()) {
npctalk l("You are dead. Aborting.");
@SaggySeal$="";
end;
}
// Drain some Mana
// Max wave is 9... So it should cap at 10%
.@val=7+(.@z/3);
if (Sp < MaxSp/100*.@val) {
npctalk l("You don't have enough mana to continue. The seal remains active.");
@SaggySeal$="";
end;
}
percentheal 0, -(.@val);
// BaseLevel: 37
areamonster .@m$, .@x-1, .@y-1, .@x+1, .@y+1, "Seal Guardian", MagicGoblin, (.@z/3)+1;
switch (.@z) {
case 0:
.@mobId=any(HouseMaggot,SlimeBlast); break;
case 1:
.@mobId=AngryScorpion; break;
case 2:
.@mobId=AngryBat; break;
case 3:
.@mobId=RedSlime; break;
case 4:
.@mobId=AngryRedScorpion; break;
case 5:
.@mobId=Bandit; break;
case 6:
.@mobId=Skeleton; break;
case 7:
.@mobId=BlueSlime; break;
case 8:
.@mobId=RedMushroom; break;
case 9:
.@mobId=BlackSlime; break;
default:
Exception("ERROR, INVALID Z VALUE FOR SAGRATHA SEAL: "+.@z, RB_DEFAULT|RB_IRCBROADCAST);
.@mobId=WickedMushroom; break;
}
monster .@m$, .@x, .@y, "Seal Protector", .@mobId, 1;
// Schedule next sequence
if (.@z+1 < 10)
.@nx$="0"+(.@z+1);
else
.@nx$=str(.@z+1);
// 3.5s each wave, giving you ~1s to kill/endure each "boss"
.@t=3500+(.@z*980);
addtimer2(.@t, .@n$+"::OnBreakSeal"+.@nx$);
return;
}
// Main menu - SaggySealTrueInit
// ( .name$, x, y )
function script SaggySealTrueInit {
// Do nothing if @SaggySeal$ is busy - we will NOT begin another unsealing.
if (@SaggySeal$ != "")
end;
// Okay, we can begin! (variable will be filled on SaggySealInit)
mesc l("Attempt to break the seal?");
mesc l("Warning: This will drain mana and spawn monsters. You shall not leave this cave section!");
if (askyesno() == ASK_YES) {
npctalk3 l("You started the seal break sequence. Please stand by.");
SaggySealInit(getarg(0), getarg(1), getarg(2), 0);
}
closeclientdialog;
return;
}
015-8,0,0,0 script #SaggySeal1 NPC_SUMMONING_CIRC,0,0,{
end;
OnTouch:
.@q=getq(HurnscaldQuest_Sagratha);
.@q3=getq3(HurnscaldQuest_Sagratha);
// Check if it can be operated
if (!SaggySealCheck())
end;
// Check if this seal is ok
if (.@q3 & .sealId) {
npctalkonce l("This seal was already broken, proceed to the next seal!");
end;
}
// It is stage 3, so we will write to setq3 that the seal is open... Soon.
SaggySealTrueInit(.name$, .x, .y);
end;
OnBreakSeal01:
SaggySealInit(.name$, .x, .y, 1);
end;
OnBreakSeal02:
SaggySealInit(.name$, .x, .y, 2);
end;
OnBreakSeal03:
SaggySealInit(.name$, .x, .y, 3);
end;
OnBreakSeal04:
SaggySealInit(.name$, .x, .y, 4);
end;
OnBreakSeal05:
SaggySealInit(.name$, .x, .y, 5);
end;
OnBreakSeal06:
SaggySealInit(.name$, .x, .y, 6);
end;
OnBreakSeal07:
SaggySealInit(.name$, .x, .y, 7);
end;
OnBreakSeal08:
SaggySealInit(.name$, .x, .y, 8);
end;
OnBreakSeal09:
SaggySealInit(.name$, .x, .y, 9);
end;
OnBreakSeal10:
.@q3=getq3(HurnscaldQuest_Sagratha);
npctalk3 l("The seal was broken!");
@SaggySeal$="";
setq3 HurnscaldQuest_Sagratha, .@q3 | .sealId;
end;
OnInit:
.sealId=1;
setarray .xpos, 115, 119, 116, 121, 126, 125, 137, 136, 115;
setarray .ypos, 117, 117, 119, 122, 125, 115, 117, 123, 118;
.@z=rand(getarraysize(.xpos));
movenpc .name$, .xpos[.@z], .ypos[.@z], 0;
end;
}
015-8,0,0,0 script #SaggySeal2 NPC_SUMMONING_CIRC,0,0,{
end;
OnTouch:
.@q=getq(HurnscaldQuest_Sagratha);
.@q3=getq3(HurnscaldQuest_Sagratha);
// Check if it can be operated
if (!SaggySealCheck())
end;
// Check if this seal is ok
if (.@q3 & .sealId) {
npctalkonce l("This seal was already broken, proceed to the next seal!");
end;
}
// It is stage 3, so we will write to setq3 that the seal is open... Soon.
SaggySealTrueInit(.name$, .x, .y);
end;
OnBreakSeal01:
SaggySealInit(.name$, .x, .y, 1);
end;
OnBreakSeal02:
SaggySealInit(.name$, .x, .y, 2);
end;
OnBreakSeal03:
SaggySealInit(.name$, .x, .y, 3);
end;
OnBreakSeal04:
SaggySealInit(.name$, .x, .y, 4);
end;
OnBreakSeal05:
SaggySealInit(.name$, .x, .y, 5);
end;
OnBreakSeal06:
SaggySealInit(.name$, .x, .y, 6);
end;
OnBreakSeal07:
SaggySealInit(.name$, .x, .y, 7);
end;
OnBreakSeal08:
SaggySealInit(.name$, .x, .y, 8);
end;
OnBreakSeal09:
SaggySealInit(.name$, .x, .y, 9);
end;
OnBreakSeal10:
.@q3=getq3(HurnscaldQuest_Sagratha);
npctalk3 l("The seal was broken!");
@SaggySeal$="";
setq3 HurnscaldQuest_Sagratha, .@q3 | .sealId;
end;
OnInit:
.sealId=2;
setarray .xpos, 39, 33, 43, 53, 51, 55, 60, 68, 63, 56;
setarray .ypos, 120, 130, 134, 132, 119, 121, 122, 120, 129, 124;
.@z=rand(getarraysize(.xpos));
movenpc .name$, .xpos[.@z], .ypos[.@z], 0;
end;
}
015-8,0,0,0 script #SaggySeal3 NPC_SUMMONING_CIRC,0,0,{
end;
OnTouch:
.@q=getq(HurnscaldQuest_Sagratha);
.@q3=getq3(HurnscaldQuest_Sagratha);
// Check if it can be operated
if (!SaggySealCheck())
end;
// Check if this seal is ok
if (.@q3 & .sealId) {
npctalkonce l("This seal was already broken, proceed to the next seal!");
end;
}
// It is stage 3, so we will write to setq3 that the seal is open... Soon.
SaggySealTrueInit(.name$, .x, .y);
end;
OnBreakSeal01:
SaggySealInit(.name$, .x, .y, 1);
end;
OnBreakSeal02:
SaggySealInit(.name$, .x, .y, 2);
end;
OnBreakSeal03:
SaggySealInit(.name$, .x, .y, 3);
end;
OnBreakSeal04:
SaggySealInit(.name$, .x, .y, 4);
end;
OnBreakSeal05:
SaggySealInit(.name$, .x, .y, 5);
end;
OnBreakSeal06:
SaggySealInit(.name$, .x, .y, 6);
end;
OnBreakSeal07:
SaggySealInit(.name$, .x, .y, 7);
end;
OnBreakSeal08:
SaggySealInit(.name$, .x, .y, 8);
end;
OnBreakSeal09:
SaggySealInit(.name$, .x, .y, 9);
end;
OnBreakSeal10:
.@q3=getq3(HurnscaldQuest_Sagratha);
npctalk3 l("The seal was broken!");
@SaggySeal$="";
setq3 HurnscaldQuest_Sagratha, .@q3 | .sealId;
end;
OnInit:
.sealId=4;
setarray .xpos, 140, 143, 146, 147, 145, 143;
setarray .ypos, 140, 141, 139, 144, 147, 143;
.@z=rand(getarraysize(.xpos));
movenpc .name$, .xpos[.@z], .ypos[.@z], 0;
end;
}
// Sagratha Seals Eletronic Barriers
015-8,120,130,0 script #SaggySealBarrier1 NPC_HIDDEN,0,4,{
OnTouch:
if (@SaggySeal$ != "") {
npctalk3 l("The seal retaliates! It was super effective. You are dead!");
@SaggySeal$="";
die();
end;
}
end;
}
015-8,74,142,0 script #SaggySealBarrier2 NPC_HIDDEN,0,4,{
OnTouch:
if (@SaggySeal$ != "") {
npctalk3 l("The seal retaliates! It was super effective. You are dead!");
@SaggySeal$="";
die();
end;
}
end;
}
015-8,137,154,0 script #SaggySealBarrier3 NPC_HIDDEN,0,5,{
OnTouch:
if (@SaggySeal$ != "") {
npctalk3 l("The seal retaliates! It was super effective. You are dead!");
@SaggySeal$="";
die();
end;
}
end;
}
// Magic Barrier
015-8,94,104,0 script Dog Statue#Saggy NPC_STATUE_FAFA,{
OnDialog:
mesn;
mesq l("This is a magical barrier, powered by three seals in your part.");
next;
mesn;
mesq l("You must break all three seals to cross this barrier! For that, walk on them!");
next;
mesn;
mesq l("Breaking a seal is easy, just flow mana on it for enough time to it shatter.");
next;
mesn;
mesq l("I, Fafa, the Magical Statue, grant you this power! Prove your worth! And never run from the seal, or die for your cowardice!");
close;
OnInit:
.distance=5;
end;
}
015-8,93,109,0 script #SaggyBarrier NPC_HIDDEN,2,0,{
end;
OnTouch:
if (!SaggySealCheck()) {
slide 93, 106;
end;
}
.@q=getq(HurnscaldQuest_Sagratha);
.@q3=getq3(HurnscaldQuest_Sagratha);
// Magic Number
if (.@q3 == 7) {
npctalk3 l("The seals having been broken, the barrier was weakened! You did it! The path is now open!");
setq1 HurnscaldQuest_Sagratha, 4;
setq3 HurnscaldQuest_Sagratha, 0;
slide 93, 106;
} else {
getmapxy(.@m$, .@x, .@y, 0);
slide .@x, .@y+3;
dispbottom l("A powerful magic barrier repels you!");
addtimer(200, "Dog Statue#Saggy::OnDialog");
}
end;
}
015-8,93,107,0 script #SaggyBarrier2 NPC_HIDDEN,2,0,{
end;
OnTouch:
// You should not be on this side of the barrier
if (SaggySealCheck()) {
setq HurnscaldQuest_Sagratha, 0, 0, 0;
sc_end SC_CASH_PLUSEXP;
sc_end SC_OVERLAPEXPUP;
sc_start SC_OVERLAPEXPUP, 300000, -20;
warp "Save", 0, 0;
closeclientdialog;
end;
}
slide 93, 110;
end;
}
// Shrine Statue Control
// SaggyShrineStatue( .name$ )
function script SaggyShrineStatue {
.@n$=getarg(0);
.@q=getq(HurnscaldQuest_Sagratha);
// Initial check
if (!MAGIC_LVL || .@q < 4) {
setq HurnscaldQuest_Sagratha, 0, 0, 0;
sc_end SC_CASH_PLUSEXP;
sc_end SC_OVERLAPEXPUP;
sc_start SC_OVERLAPEXPUP, 300000, -20;
warp "Save", 0, 0;
closeclientdialog;
end;
return false;
}
mesn l("Guardian Statue");
if (.@q != 4) {
mesq l("...");
next;
mesc l("The statue doesn't replies.");
close;
}
mesq l("Decipher me... Or I will devour you...");
next;
mesc l("Take the riddle?"), 1;
mesc l("Time limit for answer: 2 minutes");
next;
if (askyesno() == ASK_YES) {
// You have unlimited time if you don't close the dialog
addtimer(120000, .@n$+"::OnScheduledDeath");
if (0158_Riddle_BlackBox()) {
deltimer(.@n$+"::OnScheduledDeath");
setq1 HurnscaldQuest_Sagratha, 5;
setq3 HurnscaldQuest_Sagratha, 0;
mesn l("Guardian Statue");
mesq l("You shall pass. Beyond this gate, she waits for you.");
next;
mesn l("Guardian Statue");
mesq l("Your worth shall be tested, and from inside, you shall not leave.");
} else {
deltimer(.@n$+"::OnScheduledDeath");
doevent(.@n$+"::OnScheduledDeath");
closeclientdialog;
}
}
return;
}
// The Sealed Shrine Itself and the guardians
015-8,96,22,0 script #SaggyShrineRight NPC_FAKIR,{
SaggyShrineStatue(.name$);
close;
OnScheduledDeath:
npctalk3 l("Be devoured!");
die();
end;
OnInit:
.distance=5;
end;
}
015-8,93,22,0 script #SaggyShrineLeft NPC_FAKIR,{
SaggyShrineStatue(.name$);
close;
OnScheduledDeath:
npctalk3 l("Be devoured!");
die();
end;
OnInit:
.distance=5;
end;
}
015-8,94,20,0 script #ShrineGate NPC_NO_SPRITE,1,0,{
.@q=getq(HurnscaldQuest_Sagratha);
.@q3=getq3(HurnscaldQuest_Sagratha);
// Cheater Detected
if (!MAGIC_LVL || .@q < 4) {
setq HurnscaldQuest_Sagratha, 0, 0, 0;
sc_end SC_CASH_PLUSEXP;
sc_end SC_OVERLAPEXPUP;
sc_start SC_OVERLAPEXPUP, 300000, -20;
warp "Save", 0, 0;
closeclientdialog;
end;
return false;
}
// Quest Status 4: Riddle pending
if (.@q == 4) {
npctalk3 l("The gates are firmly shut, no amount of force will break them.");
}
// Quest Status 5: Riddle solved, access granted
if (.@q == 5) {
enable_items();
mesc l(".:: The Mouboo Temple ::."), 3;
mesc l("WARNING: You are about to enter a HIGH-RISK zone."), 1;
mesc l("We advise you to change your equipment now."), 1;
if (getmapusers("015-8") > 1)
mesc l("THIS IS A SOLO FIGHT, TEAMS ARE NOT ALLOWED INSIDE."), 1;
next;
disable_items();
if (askyesno() == ASK_YES) {
setq3 HurnscaldQuest_Sagratha, 0;
closeclientdialog;
.@map2$=SaggyInstCheck(false);
warp .@map2$, 50, 78;
end;
}
close;
}
// Quest Status 6: Boss defeated, no instance needed
if (.@q >= 6) {
warp "015-8-1", 50, 78;
}
end;
}