// TMW2 scripts. // Authors: // Jesusalva // Description: // Gemini Sisters Quest - Valia Gemini. The quest can be resumed within 4 hours. 034-1 mapflag zone MMO 034-2 mapflag zone MMO 034-3 mapflag zone MMO 034-4 mapflag zone MMO // Check if you can do this action or not (hero) function script GeminiCheck { .@st = getarg(0, 0); if (getq(General_Narrator) < 16 || @mystatus < .@st) { warp "Save", 0, 0; dispbottom l("You don't feel so well... And then, you're dead."); die(); end; } } // You killed a mob function script GeminiKill { if (!compare(getmap(), "val")) end; switch ('STATUS) { case 1: // Quest initiated break; case 2: // Looking for a runestone if (killedrid == GreenSlime) { if (!rand2(40)) { getexp 8132, 657; dispbottom l("You found the Runestone! You gave it to the party leader."); 'STATUS = 3; } } break; case 3: // Has runestone break; case 4: // Desert unlocked, but no clue on what to do case 5: // Desert unlocked, cutscene over if (killedrid == CaveSnake) { if (!rand2(5) && countitem(SealedSoul) < 10) { getitem SealedSoul, 1; areamonster(getmap(), 100, 20, 170, 60, strmobinfo(1, MagicGoblin), MagicGoblin, 1, "Valia::OnMGoblin"); } } break; case 6: // Just entered the Den break; case 7: // Just got stunned break; // Forest -> Desert -> Bandit Cave -> Island -> Fake showdown -> Storage -> Showdown -> Chest, Lore and Exit -> Wumpus' Trap -> End } return; } // Janitor function script GeminiFail { .@id=getarg(0, 0); return; } // Valia Gemini 014-2-2,36,22,0 script Valia NPC_RED_WIZARD_F,{ GeminiCheck(); .@q = getq(HurnscaldQuest_Gemini); mesn; mesq l("Greetings, adventurer. I am Valia Gemini, owner of this abode."); next; mesn; mesq l("I usually don't let anyone in, but I had to make an exception for the likes of you."); next; mesn; mesq l("You see, I have a sister. Luvia Gemini. Very talented, but unfortunately, not enough to prevent being captured and brainwashed by Isbamuth."); next; mesn; mesq l("I am sure you already fought him. And survived, too, apparently. Help her, and I will reward your efforts appropriately."); next; mesn; mesq l("You can bring up to 3 other friends with you, but they must be on the same party as you and you must be the party leader."); next; select l("I'm not interested, sorry."), l("Why don't you go yourself?"), l("Alright, I will help."); mes ""; switch (@menu) { case 1: close; case 2: mesn; mesq l("Because Isbamuth is tracking me? It would be pointless if he noticed. If you can't even understand this, maybe I overestimated you, after all..."); close; } // You accepted the quest mesn; // ...But you lack a party if (getcharid(1) <= 0) { mesq l("You don't have a party. You're useless to me."); close; } // ...But you are not the leader if (strcharinfo(0) != getpartyleader(getcharid(1))) { mesq l("Bring me %s or make your own party if you want to help me.", getpartyleader(getcharid(1))); close; } // ...But the party is too large getpartymember(getcharid(1)); .@count = $@partymembercount; if (.@count > 4) { mesq l("Your party is too big. Discretion is a key if we want to succeed."); close; } // Alright. mesq l("Good. I hope you have stocked everything. The time limit is 4 hours."); // Only first attempt is free - all others are charged if (getq(HurnscaldQuest_Gemini)) { next; mesn; mesq l("Actually, I need help with reagents this time. Bring me a %s and a %s and I'll gladly warp you... again.", getitemlink(GemPowder), getitemlink(EverburnPowder)); if (!countitem(GemPowder) || !countitem(EverburnPowder)) close; next; } mesc l("Are you and your party ready?"), 1; if (askyesno() != ASK_YES) close; // Not eligible for free lunch if (getq(HurnscaldQuest_Gemini)) { delitem GemPowder, 1; delitem EverburnPowder, 1; } // Handle first attempt mesn; mesq l("Good. Here, take this key and hide it. I will quickly brief you:"); mes ""; mesc l(".:: GEMINI ASSASSINS QUEST ::."), 3; mesc ("Recommended Level: %d+", 85); mes ""; mes l("- The goal is to rescue Luvia from Isabamuth. She has been ##Bbrainwashed##b."); mes l("- Luvia is a powerful mage and Isbamuth is watching, so teleporting directly would be risky."); mes l("- Instead, the party will be teleported ##Bto a forest.##b"); mes l("- Find a path to the island where she is hiding herself!"); if (!getq(HurnscaldQuest_Gemini)) mesc l("- If you fail, you'll need to pay me ingredients to try again!"), 1; mes ""; mesc l("Good luck!"); compareandsetq HurnscaldQuest_Gemini, 0, 1; // Create instance .@p=getcharid(1); .@inst = instance_create("Gemini "+.@p, .@p, IOT_PARTY); // If it worked then setup if (.@inst >= 0) { // Attach maps instance_attachmap("034-1", .@inst, false, "val1@"+.@p); instance_attachmap("034-2", .@inst, false, "val2@"+.@p); instance_attachmap("034-3", .@inst, false, "val3@"+.@p); instance_attachmap("034-4", .@inst, false, "val4@"+.@p); // Save the instance ID $@VALIA_INST[.@p]=.@inst; $@VALIA_MAP$[.@p]=""; } // Instance lasts 4 hours - your time limit instance_set_timeout(14400, 14400, $@VALIA_INST[.@p]); // Do we need to initialize or are we just restarting? if (.@inst >= 0) instance_init(.@inst); // Warp everyone and add timers partytimer("014-2-2", 1000, "Valia::OnCoreInit", getcharid(1)); warpparty("val1@"+.@p, 24, 24, getcharid(1), "014-2-2", true); close; // Macros OnCoreInit: @mystatus = 0; if (!'STATUS) 'STATUS = 1; OnCore: if (!compare(getmap(), "val")) end; .@p = getcharid(1); // Always true on first interaction // This handles new stages for person if (@mystatus != 'STATUS) { switch ('STATUS) { case 1: // Quest initiated @mystatus = 1; // Spawn monsters areamonster("val1@"+.@p, 20, 20, 60, 60, strmobinfo(1, GreenSlime), GreenSlime, (BaseLevel/15), "Valia::OnGSlime"); areamonster("val1@"+.@p, 20, 20, 70, 60, strmobinfo(1, LogHead), LogHead, (BaseLevel/15), "Valia::OnLHead"); areamonster("val1@"+.@p, 20, 20, 70, 60, strmobinfo(1, ForestMushroom), ForestMushroom, (BaseLevel/12), "Valia::OnFShroom"); areamonster("val1@"+.@p, 20, 20, 70, 60, strmobinfo(1, RedMushroom), RedMushroom, 1+(BaseLevel/30), "Valia::OnRShroom"); break; case 2: // Looking for a runestone break; case 3: // Runestone was found getexp 8132, 657; break; case 4: // Desert unlocked, but no clue on what to do dispbottom l("You hear a noise from distance."); // Spawn monsters areamonster("val1@"+.@p, 100, 20, 170, 60, strmobinfo(1, CaveSnake), CaveSnake, 2, "Valia::OnCSnake"); areamonster(getmap(), 100, 20, 170, 60, strmobinfo(1, MagicGoblin), MagicGoblin, 1, "Valia::OnMGoblin"); // These refuse to respawn but are numerous // Thus far, the quest is still easy. But soon it won't be. areamonster(getmap(), 100, 20, 170, 60, strmobinfo(1, MountainSnake), MountainSnake, 1+(BaseLevel/24)); areamonster(getmap(), 100, 20, 170, 60, strmobinfo(1, DarkLizard), DarkLizard, 1+(BaseLevel/20)); areamonster(getmap(), 100, 20, 170, 60, strmobinfo(1, WickedMushroom), WickedMushroom, 1+(BaseLevel/32)); areamonster(getmap(), 100, 20, 170, 60, strmobinfo(1, EliteDuck), EliteDuck, 1); break; case 6: // Passage Open if (countitem(SealedSoul)) delitem SealedSoul, countitem(SealedSoul); dispbottom l("You hear waterfall opening in distance."); // FALLTHROUGH case 5: // JackO shows up getexp 32000, 1400; break; case 7: // Ambushed & Captured @lockpicks=false; // Prision Area .@m=any(Bandit, RobinBandit, SleepingBandit); areamonster("val2@"+.@p, 52, 93, 70, 98, strmobinfo(1, .@m), .@m, 1); .@m=any(Bandit, RobinBandit, SleepingBandit); areamonster("val2@"+.@p, 52, 93, 70, 98, strmobinfo(1, .@m), .@m, 1); // Ante-chamber areamonster("val2@"+.@p, 69, 96, 85, 107, strmobinfo(1, Bandit), Bandit, 1); .@m=any(Bandit, RobinBandit, SleepingBandit, RobinBandit); areamonster("val2@"+.@p, 69, 96, 85, 107, strmobinfo(1, .@m), .@m, 1); // Reception & Lord Desk areamonster("val2@"+.@p, 50, 30, 80, 75, strmobinfo(1, Bandit), Bandit, (BaseLevel/15)); areamonster("val2@"+.@p, 50, 30, 80, 75, strmobinfo(1, RobinBandit), RobinBandit, (BaseLevel/25)); // Whole Map areamonster("val2@"+.@p, 20, 24, 78, 72, strmobinfo(1, Archant), Archant, (BaseLevel/8)); // Great Hall areamonster("val2@"+.@p, 25, 24, 50, 45, strmobinfo(1, RobinBandit), RobinBandit, (BaseLevel/22)); areamonster("val2@"+.@p, 25, 24, 50, 45, strmobinfo(1, Assassin), Assassin, (BaseLevel/20)); areamonster("val2@"+.@p, 25, 24, 50, 45, strmobinfo(1, Bandit), Bandit, (BaseLevel/18)); areamonster("val2@"+.@p, 25, 24, 50, 45, strmobinfo(1, HoodedNinja), HoodedNinja, 1); break; case 8: // Key retrieved getexp 128000, 2000; break; } } addtimer(5000, "Valia::OnCoreInit"); end; OnGSlime: fix_mobkill(GreenSlime); .@p = getcharid(1); areamonster("val1@"+.@p, 20, 20, 60, 60, strmobinfo(1, GreenSlime), GreenSlime, 1, "Valia::OnGSlime"); end; OnLHead: fix_mobkill(LogHead); .@p = getcharid(1); areamonster("val1@"+.@p, 20, 20, 70, 60, strmobinfo(1, LogHead), LogHead, 1, "Valia::OnLHead"); end; OnFShroom: fix_mobkill(ForestMushroom); .@p = getcharid(1); areamonster("val1@"+.@p, 20, 20, 70, 60, strmobinfo(1, ForestMushroom), ForestMushroom, 1, "Valia::OnFShroom"); end; OnRShroom: fix_mobkill(RedMushroom); .@p = getcharid(1); areamonster("val1@"+.@p, 20, 20, 70, 60, strmobinfo(1, RedMushroom), RedMushroom, 1, "Valia::OnRShroom"); end; /////////////////////////////////// OnCSnake: fix_mobkill(CaveSnake); .@p = getcharid(1); areamonster("val1@"+.@p, 100, 20, 170, 60, strmobinfo(1, CaveSnake), CaveSnake, 1, "Valia::OnCSnake"); end; OnMGoblin: fix_mobkill(MagicGoblin); .@p = getcharid(1); areamonster("val1@"+.@p, 100, 20, 170, 60, strmobinfo(1, MagicGoblin), MagicGoblin, 2, "Valia::OnMGoblin"); end; /////////////////////////////////// OnKey1: .@p = getcharid(1); .@mob=monster("val2@"+.@p, 57, 104, strmobinfo(1, CopperSlime), CopperSlime, 1, "Valia::OnKey1"); // This should wipe the monster experience value setunitdata(.@mob, UDT_LEVEL, 1); if (countitem(Lockpicks) || @lockpicks || rand2(3)) end; getitem Lockpicks, 1; @lockpicks=true; end; OnKey2: .@p = getcharid(1); .@mob=monster("val2@"+.@p, 61, 104, strmobinfo(1, CopperSlime), CopperSlime, 1, "Valia::OnKey2"); // This should wipe the monster experience value setunitdata(.@mob, UDT_LEVEL, 1); if (countitem(Lockpicks) || @lockpicks || rand2(3)) end; getitem Lockpicks, 1; @lockpicks=true; end; OnKey3: .@p = getcharid(1); .@mob=monster("val2@"+.@p, 66, 104, strmobinfo(1, CopperSlime), CopperSlime, 1, "Valia::OnKey3"); // This should wipe the monster experience value setunitdata(.@mob, UDT_LEVEL, 1); if (countitem(Lockpicks) || @lockpicks || rand2(3)) end; getitem Lockpicks, 1; @lockpicks=true; end; OnLord: .@p = getcharid(1); if (mobcount("val2@"+.@p, "Valia::OnLord")) { 'STATUS = 8; Zeny+=15000; dispbottom l("This lord dropped a key and a stash of gold!"); } end; OnInit: .distance=4; end; }