// 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; }