// TMW2 Scripts // Author: // Jesusalva // Description: // Controls Forgotten Shrine 018-6-3 mapflag nowarpto // 01863_RelevanceCheck ( Room ID ) function script 01863_RelevanceCheck { .@id=getarg(0); .@q=getq(LoFQuest_Barbara); .@q2=getq2(LoFQuest_Barbara); .@q3=getq3(LoFQuest_Barbara); if (.@q < 3) Exception("INVALID QUEST STATE, REVCHECK", RB_DEFAULT|RB_ISFATAL); if (.@q != 3) return false; if (.@q3 & .@id) return false; return true; } // Shut down the enabled warps. function script 01863_DisableAllWarps { .@q=getq(LoFQuest_Barbara); .@q2=getq2(LoFQuest_Barbara); .@q3=getq3(LoFQuest_Barbara); if (.@q < 3) Exception("ERROR, INVALID WARP", RB_DEFAULT|RB_ISFATAL); disablenpc instance_npcname("#01863_fromNorthtoOut", .@q2); disablenpc instance_npcname("#01863_fromNorthtoNW", .@q2); disablenpc instance_npcname("#01863_fromNorthtoNE", .@q2); disablenpc instance_npcname("#01863_fromSouthtoOut", .@q2); disablenpc instance_npcname("#01863_fromSouthtoSW", .@q2); disablenpc instance_npcname("#01863_fromSouthtoSE", .@q2); disablenpc instance_npcname("#01863_fromNWtoNorth", .@q2); disablenpc instance_npcname("#01863_fromNWtoNC", .@q2); disablenpc instance_npcname("#01863_fromNWtoSW", .@q2); disablenpc instance_npcname("#01863_fromSWtoSouth", .@q2); disablenpc instance_npcname("#01863_fromSWtoSC", .@q2); disablenpc instance_npcname("#01863_fromSWtoNW", .@q2); disablenpc instance_npcname("#01863_fromNEtoNorth", .@q2); disablenpc instance_npcname("#01863_fromNEtoNC", .@q2); disablenpc instance_npcname("#01863_fromNEtoSE", .@q2); disablenpc instance_npcname("#01863_fromSEtoSouth", .@q2); disablenpc instance_npcname("#01863_fromSEtoSC", .@q2); disablenpc instance_npcname("#01863_fromSEtoNE", .@q2); disablenpc instance_npcname("#01863_fromNCtoNW", .@q2); disablenpc instance_npcname("#01863_fromNCtoNE", .@q2); disablenpc instance_npcname("#01863_fromNCtoCC", .@q2); disablenpc instance_npcname("#01863_fromSCtoSW", .@q2); disablenpc instance_npcname("#01863_fromSCtoSE", .@q2); disablenpc instance_npcname("#01863_fromSCtoCC", .@q2); disablenpc instance_npcname("#01863_fromCCtoNC", .@q2); disablenpc instance_npcname("#01863_fromCCtoSC", .@q2); return; } // Main Controller for Instanced maps 018-6-3,0,0,0 script #01863_InstCtrl NPC_HIDDEN,{ end; // Map, x1, y1, x2, y2, mob, amount function AreaMonsterB { .@m$=getarg(0); .@x1=getarg(1); .@x2=getarg(3); .@y1=getarg(2); .@y2=getarg(4); .@mi=getarg(5); .@am=getarg(6); if (!.@am) return; areamonster(.@m$, .@x1, .@y1, .@x2, .@y2, strmobinfo(1, .@mi), .@mi, .@am); //, instance_npcname(.name$)+"::OnKill"+.@mi); return; } // Map, x1, y1, x2, y2, mob, bossID function AreaMonsterBoss { .@m$=getarg(0); .@x1=getarg(1); .@x2=getarg(3); .@y1=getarg(2); .@y2=getarg(4); .@mi=getarg(5); .@id=getarg(6); areamonster(.@m$, .@x1, .@y1, .@x2, .@y2, strmobinfo(1, .@mi), .@mi, 1, instance_npcname(.name$)+"::OnKill"+.@id); return; } // BossRoom ( RoomID, x1, y1, x2, y2, adjustment ) // Adjustment is for bigger rooms. Defaults to false. function BossRoom { .@id=getarg(0); .@x1=getarg(1); .@y1=getarg(2); .@x2=getarg(3); .@y2=getarg(4); .@ad=getarg(5, false); // True: Must spawn boss, False: Allow to use warps if (01863_RelevanceCheck(.@id)) { mapannounce getmap(), l("BOSS FIGHT!"), bc_map|bc_pc; // Spawn a boss. Passive chance: 17% // Removed: HolyPixie, NulityPixie, VanityPixie AreaMonsterBoss(getmap(), .@x1, .@y1, .@x2, .@y2, any(CopperSkullSlime, LavaSkullSlime, BlackSlimeMother, TerraniteProtector, GoboBear, Centaur), .@id); // BIG ROOM: 6~12 support units // SMALL ROOM: 5~10 support units AreaMonsterB(getmap(), .@x1, .@y1, .@x2, .@y2, BlackSlime, rand2(2,4)+.@ad); AreaMonsterB(getmap(), .@x1, .@y1, .@x2, .@y2, DarkLizard, rand2(1,2)+.@ad); AreaMonsterB(getmap(), .@x1, .@y1, .@x2, .@y2, BlackScorpion, rand2(1,2)); AreaMonsterB(getmap(), .@x1, .@y1, .@x2, .@y2, Archant, rand2(1,2)-.@ad); // Only spawn the fast Hooded Ninja on big rooms if (.@ad) { AreaMonsterB(getmap(), .@x1, .@y1, .@x2, .@y2, HoodedNinja, any(0,0,1)); } return false; } return true; } // W - West, C - Center, E - East, N - North, S - South OnRoomNorth: L_Room1: if (BossRoom(1, 62, 41, 121, 58, true)) { enablenpc instance_npcname("#01863_fromNorthtoNW"); enablenpc instance_npcname("#01863_fromNorthtoNE"); enablenpc instance_npcname("#01863_fromNorthtoOut"); } end; OnRoomNW: L_Room2: if (BossRoom(2, 48, 65, 68, 85)) { enablenpc instance_npcname("#01863_fromNWtoNorth"); enablenpc instance_npcname("#01863_fromNWtoNC"); enablenpc instance_npcname("#01863_fromNWtoSW"); } end; OnRoomNC: L_Room4: if (BossRoom(4, 77, 65, 103, 76)) { enablenpc instance_npcname("#01863_fromNCtoNW"); enablenpc instance_npcname("#01863_fromNCtoNE"); enablenpc instance_npcname("#01863_fromNCtoCC"); } end; OnRoomNE: L_Room8: if (BossRoom(8, 111, 65, 131, 85)) { enablenpc instance_npcname("#01863_fromNEtoNorth"); enablenpc instance_npcname("#01863_fromNEtoNC"); enablenpc instance_npcname("#01863_fromNEtoSE"); } end; OnRoomSW: L_Room16: if (BossRoom(16, 48, 95, 68, 115)) { enablenpc instance_npcname("#01863_fromSWtoSouth"); enablenpc instance_npcname("#01863_fromSWtoSC"); enablenpc instance_npcname("#01863_fromSWtoNW"); } end; OnRoomSC: L_Room32: if (BossRoom(32, 77, 104, 103, 115)) { enablenpc instance_npcname("#01863_fromSCtoSW"); enablenpc instance_npcname("#01863_fromSCtoSE"); enablenpc instance_npcname("#01863_fromSCtoCC"); } end; OnRoomSE: L_Room64: if (BossRoom(64, 111, 95, 131, 115)) { enablenpc instance_npcname("#01863_fromSEtoSouth"); enablenpc instance_npcname("#01863_fromSEtoSC"); enablenpc instance_npcname("#01863_fromSEtoNE"); } end; OnRoomSouth: L_Room128: if (BossRoom(128, 62, 122, 121, 139, true)) { enablenpc instance_npcname("#01863_fromSouthtoSW"); enablenpc instance_npcname("#01863_fromSouthtoSE"); enablenpc instance_npcname("#01863_fromSouthtoOut"); } end; OnRoomCC: enablenpc instance_npcname("#01863_fromCCtoNC"); enablenpc instance_npcname("#01863_fromCCtoSC"); end; OnFinalRoom: // Room: 74,83 ~ 106,97 .@x1=74; .@y1=83; .@x2=106; .@y2=97; .@id=256; changemusic getmap(), "let_the_battles_begin.ogg"; mapannounce getmap(), col(l("FINAL BOSS FIGHT - WATCH OUT!"), 1), bc_map|bc_pc; .@mi=NightDragon; @boss=monster(getmap(), 90, 89, strmobinfo(1, .@mi), .@mi, 1, instance_npcname(.name$)+"::OnKillBoss"); // Spawn reinforcements based on difficulty AreaMonsterB(getmap(), .@x1, .@y1, .@x2, .@y2, MagicGoblin, (@difficulty_modulus ? 5 : 3)); AreaMonsterB(getmap(), .@x1, .@y1, .@x2, .@y2, DeathCat, (@difficulty_modulus ? 3 : 1)); end; // Kill boss will use setq3 and also erase any remaining monster // Then it'll cast again the room event to enable the warps. OnKill1: .@q3=getq3(LoFQuest_Barbara); setq3 LoFQuest_Barbara, .@q3|1; killmonsterall(getmap()); goto L_Room1; OnKill2: .@q3=getq3(LoFQuest_Barbara); setq3 LoFQuest_Barbara, .@q3|2; killmonsterall(getmap()); goto L_Room2; OnKill4: .@q3=getq3(LoFQuest_Barbara); setq3 LoFQuest_Barbara, .@q3|4; killmonsterall(getmap()); goto L_Room4; OnKill8: .@q3=getq3(LoFQuest_Barbara); setq3 LoFQuest_Barbara, .@q3|8; killmonsterall(getmap()); goto L_Room8; OnKill16: .@q3=getq3(LoFQuest_Barbara); setq3 LoFQuest_Barbara, .@q3|16; killmonsterall(getmap()); goto L_Room16; OnKill32: .@q3=getq3(LoFQuest_Barbara); setq3 LoFQuest_Barbara, .@q3|32; killmonsterall(getmap()); goto L_Room32; OnKill64: .@q3=getq3(LoFQuest_Barbara); setq3 LoFQuest_Barbara, .@q3|64; killmonsterall(getmap()); goto L_Room64; OnKill128: .@q3=getq3(LoFQuest_Barbara); setq3 LoFQuest_Barbara, .@q3|128; killmonsterall(getmap()); goto L_Room128; OnKill256: .@q3=getq3(LoFQuest_Barbara); setq3 LoFQuest_Barbara, .@q3|256; killmonsterall(getmap()); end; OnKillBoss: if (!playerattached()) { enablenpc instance_npcname("Mana Stone#01863"); Exception("Could not finish the Boss Fight!"); end; } changemusic getmap(), "Misty_Shrine.ogg"; enablenpc instance_npcname("???#01863"); enablenpc instance_npcname("#01863_fromCCtoNC"); enablenpc instance_npcname("#01863_fromCCtoSC"); getexp 200000, 10000; unittalk(@boss, l("You are a mere %s, but you may be a hero... Find me again...", get_race())); .@q=getq(LoFQuest_Barbara); .@q2=getq2(LoFQuest_Barbara); .@q3=getq3(LoFQuest_Barbara); setq LoFQuest_Barbara, 4, .@q2, 0; makeitem2(HeadHood, 1, 1, 0, 0, BlackDye, 0, 0, 0, getmap(), -1, -1, 3); // ChocolateDye or BrownDye, maybe specialeffect(FX_FANFARE, AREA, getcharid(3)); end; } ///////////////////////////// ///////////////////////////// ///////////////////////////// // Critical Room // NCCC: 90.74 → 90,85 // SCCC: 90.105 → 90,95 // Altar: 90,90 // Room: 74,83 ~ 106,97 018-6-3,90,91,0 script Mana Stone#01863 NPC_MANA_STONE,{ mesn; mes l("The mighty Mana Stone does not reacts against you."); mes l("It's")+b(l("small, red, round and shiny.")); mes l("If you fell ready, perhaps you should touch it?"); mes ""; select l("Touch it!"), l("Take it!"), l("Break it!"), l("Leave it alone!"); mes ""; switch (@menu) { case 1: mesc l("Curiously, you try to touch the Mana Stone."); next; break; case 2: mesc l("Determinate, you move your hand to grab it."); next; break; case 3: mesc l("Are you out of your mind?!"); mesc l("We must capture Barbara AND return the stolen item!"); mesc l("If you break that, you could never go to the World's Edge!"); mesc l("...Assuming you can break a Mana Stone, that is."); next; mesc l("Attempt to break the Mana Stone?"), 1; if (askyesno() == ASK_NO) close; mes ""; @difficulty_modulus=true; break; default: close; } mes ""; mes ".:: " + l("The Mana Stone") + " ::."; mesq l("Do you think yourself worthy of my power?"); next; // Both choices are valid, actually. askyesno(); mes ".:: " + l("The Mana Stone") + " ::."; if (@menu == ASK_YES) mesq l("Then prove yourself!"); else mesq l("But that's no excuse for cowardice!"); next; mes ".:: " + l("The Mana Stone") + " ::."; mesq l("Foolish mortal, who doesn't knows what you are doing!"); next; setnpcdisplay instance_npcname("Mana Stone#01863"), NPC_LIGHTBRINGER; setnpcdialogtitle l("The Mana Sword, Lightbringer?"); mes ".:: " + l("The Mana Sword") + " ::."; mesq l("I shall decide here and now, if you are worth of living in this world!"); next; mes ".:: " + l("The Mana Sword") + " ::."; mesq l("I am the Judge, and I shall make Judgment upon you!"); mesc l("WARNING: ")+l("If you die or logout here, the quest will be reset!"), 1; next; 01863_DisableAllWarps(); doevent instance_npcname("#01863_InstCtrl")+"::OnFinalRoom"; disablenpc instance_npcname(.name$); setq3 LoFQuest_Barbara, 255; close; // Mana Stone is the initial NPC, not hidden OnInit: disablenpc .name$; end; } 018-6-3,90,91,0 script ???#01863 NPC_NO_SPRITE,{ .@q=getq(LoFQuest_Barbara); .@q2=getq2(LoFQuest_Barbara); .@q3=getq3(LoFQuest_Barbara); if (.@q != 4) Exception("ERROR INVALID APPLE 1863 ST NOT 4", RB_DEFAULT|RB_ISFATAL); if (.@q3) Exception("ERROR INVALID APPLE 1863 Q3 IS VALID", RB_DEFAULT|RB_ISFATAL); mesc l("You see a red apple here. It is ")+b(l("small, red, round and shiny.")); next; mesc l("Take it?"); if (askyesno() == ASK_YES) { inventoryplace MagicApple, 1; getitem MagicApple, 1; setq3 LoFQuest_Barbara, 1; mes ""; mesc l("You take the @@. It seems to be the stolen item.", getitemlink(MagicApple)); if (@difficulty_modulus) { @difficulty_modulus=false; Zeny+=200; mesc l("You also find @@ GP with it.", 200); } disablenpc instance_npcname(.name$); } close; // NPC must remain hidden. OnInit: disablenpc .name$; end; OnInstanceInit: disablenpc instance_npcname(.name$); end; } 018-6-3,34,148,0 script Book#01863A NPC_NO_SPRITE,{ if (!getskilllv(TMW2_ANCIENTLANGUAGES)) { mesn strcharinfo(0); mesc l("It's written in an ancient language, you cannot understand what's written."); mesc l("The symbols at the end of the book look to be warnings, though."); mesc l("I should check if I have more than enough potions and food before proceeding!"); mesc l("REMEMBER: FAILURE AT A BOSS FIGHT WILL CAUSE QUEST TO RESET!"), 1; next; mesc l("I am really curious what this shrine is about, though."); close; } mes ".:: " + l("Orbyter Shrine") + " ::."; mes l("This shrine is devoted to those whom shall never come back."); mes l("Deep sorrow and sadness, this is the Forgotten Shrine."); mes ""; // TRANSLATORS: IWS = Internal Warp System mes l("To the wanderer: Please avoid entering on the rooms by the internal warp system."); mesc l("Guardians will come to stop you, and to lock down the shrine!"), 1; mes l("In memoriam. May those whom shall never come back find rest in their afterlifes."); // TRANSLATORS: In Memoriam = Latin expression, means "in memory" mes l("May their journey be successful, may their objectives be attained, may the Mana rest in peace."); mes ""; mes l("The Mana Guardian,"); //mes "MEE6 the Bot"; mesc "« "+l("It's too faint to read.")+" »"; if (!@warning) { next; @warning=true; mesn strcharinfo(0); mesc l("This shrine seems to be a dangerous place, and nobody should defile it."); mesc l("I should check if I have more than enough potions and food before proceeding!"); mesc l("REMEMBER: FAILURE AT A BOSS FIGHT WILL CAUSE QUEST TO RESET!"), 1; } close; OnInit: .distance=3; end; } 018-6-3,142,28,0 duplicate(Book#01863A) Book#01863B NPC_NO_SPRITE