// TMW2 scripts. // Author: // Jesusalva // Description: // 023-3 Abandoned Ice Caves Configuration File. Variables: $@LOGIC_0233BOSS 023-3 mapflag zone MMO 023-3,63,220,0 script #Exit0233 NPC_HIDDEN,0,0,{ end; OnTouch: .@q=getq(General_Narrator); .@q2=getq2(General_Narrator); // Cheater Detected if (.@q < 15) { warp "Save", 0, 0; die(); end; } mesc l("Return to Frostia's Castle?"); if (askyesno() == ASK_YES) { .@mapn$="024-16"; warp .@mapn$, 30, 26; } closeclientdialog; close; } 023-3,48,22,0 script #Finish0233 NPC_HIDDEN,0,0,{ end; OnTouch: .@q=getq(General_Narrator); .@q2=getq2(General_Narrator); // Cheater Detected if (.@q < 15) { warp "Save", 0, 0; die(); end; } // Not allowed to proceed if (.@q > 15) { dispbottom l("Hmm, no, I shouldn't go back there..."); end; } .@mapn$="001-7"; warp .@mapn$, 91, 90; end; } // A simple random treasure chest - to be sure players were introduced to this // awesome system. Same rules as any treasure box still applies. 023-3,94,212,0 script #chest_02330 NPC_CHEST,{ TreasureBox(); specialeffect(.dir == 0 ? 24 : 25, AREA, getnpcid()); // closed ? opening : closing close; OnInit: .distance = 2; end; } // Miniboss fight must be enabled on right npc. No passing before that. 023-3,120,103,0 script #MiniBossTrap0233 NPC_HIDDEN,0,2,{ end; OnTouch: .@q=getq(FrostiaQuest_Homunculus); if (!.@q) { dispbottom l("A powerful magic barrier repels you!"); getmapxy(.@m$, .@x, .@y, 0); slide .@x-2, .@y; sit(); } end; } // The scout which went ahead of you (+ miniboss mechanics) 023-3,86,88,0 script Elite Scout#MB0233 NPC_DARKSABER,{ if ($@LOGIC_0233BOSS) { npctalkonce l("FIGHT!"); end; } if (getq(FrostiaQuest_Homunculus) >= 1 && !is_sponsor()) { npctalkonce l("I'm not going any closer to that cursed place!"); end; } if (getq(FrostiaQuest_Homunculus) >= 1) end; mesn; mesq l("Congratulations in making this far, @@.", strcharinfo(0)); next; select l("Thanks, and bye."), l("What should I do now?"); if (@menu == 1) close; mes ""; mesn; mesq l("So, there is a magical barrier to the right, which is in place exactly to protect us."); next; mesn; mesq l("Past this checkpoint, is the village where the Monster King was born."); next; mesn; mesq l("If you want to pass through it, you'll need to defeat the Guardian which made the seal. You can bring friends for healing and support."); next; mesn; mesq l("Once the fight begins, the barrier at your left will lock. It won't open until the fight is over."); next; mesn; mesq l("Are you ready?"); mesc l("WARNING: DO NOT PROCEED UNLESS YOU'RE READY."), 1; if (askyesno() == ASK_YES && !$@LOGIC_0233BOSS) { $@LOGIC_0233BOSS=getcharid(3); // It could be 1. $@LOGIC_0233BOXX=monster("023-3", any(85,94,103,113), any(91,96,102,111), "Guardian", Yeti, 1, .name$+"::OnYetiDefeat"); initnpctimer; } closeclientdialog; end; // Check if fight is still going on OnTimer10000: if (!attachrid($@LOGIC_0233BOSS)) { killmonster("023-3", .name$+"::OnYetiDefeat"); $@LOGIC_0233BOSS=0; end; } // You gave up, finish it now and not later if (getmap() != "023-3") { killmonster("023-3", .name$+"::OnYetiDefeat"); $@LOGIC_0233BOSS=0; end; } // What if the Yeti left the chamber? O.o // It's not like there was mob collision to prevent this from happening // If that's the case, bring the Yeti to player position and order attack :> getmapxy(.@m$, .@x, .@y, UNITTYPE_MOB, $@LOGIC_0233BOXX); getmapxy(.@mx$, .@xx, .@yx, 0); if (!(is_between(79, 120, .@x) && is_between(75, 125, .@y))) { unitwarp($@LOGIC_0233BOXX, .@mx$, .@xx, .@yx); unitattack($@LOGIC_0233BOXX, $@LOGIC_0233BOSS); unittalk($@LOGIC_0233BOXX, "I did not forgot you, @@! %%e", strcharinfo(0)); end; } initnpctimer; end; // Yeti Defeated OnYetiDefeat: stopnpctimer; .@rid=$@LOGIC_0233BOSS; $@LOGIC_0233BOSS=0; // In past, only MVP would count. Now, the requester count. if (playerattached()) detachrid(); // Player decided to leave the game, annuled if (!attachrid(.@rid)) end; // Player decided to leave for a walk, annuled if (!isin("023-3", 79, 75, 120, 125)) end; // We don't need compareandsetq because it's now the requester message(.@rid, l("You've slayed the Yeti.")); npctalk l("Good luck in your journey, @@.", rid2name(.@rid)); setq FrostiaQuest_Homunculus, 1; end; OnInit: .distance = 5; end; } // Cannot flee from Miniboss Fight 023-3,80,84,0 script #MiniBossTrapB0233 NPC_HIDDEN,5,0,{ end; OnTouch: .@q=getq(FrostiaQuest_Homunculus); .@q2=getq(FrostiaQuest_Homunculus); if (.@q) end; if ($@LOGIC_0233BOSS) { dispbottom l("A powerful magic barrier repels you!"); slide 81, 86; sit(); } end; } // A not-so-simple treasure chest from Sagratha's Dungeon 023-3,0,0,0 script #0233ChestCtrl NPC_HIDDEN,{ end; OnDelay: initnpctimer; end; OnTimer180000: stopnpctimer; OnInit: setarray .@x, 189, 191, 193, 186; setarray .@y, 44, 42, 43, 45; .@r=rand2(getarraysize(.@x)); monster "023-3", .@x[.@r], .@y[.@r], "Treasure Chest", any(BronzeChest,BronzeMimic,SilverChest,SilverMimic,GoldenChest,GoldenMimic), 1, "#0233ChestCtrl::OnDelay"; end; } // Aethyr Gateway 023-3,26,219,0 script #AethyrGate NPC_HIDDEN,{ end; OnInit: // In theory, pattern ID must be between 1~9 // To set $@p1$~$@p9$ with the PERL expression // But as we're only using $@p0$ (full string) // the value itself is meaningless .pid=getnpcid(); debugmes "Aethyr: Pattern %d", .pid; //I'm not going to learn PERL just for that defpattern(.pid, "^(.*)$", "OnTalkNearby"); activatepset(.pid); end; OnTalkNearby: // not very obvious stuff by gumi, $@p0$ contains the whole string // so we must cut it. Could use $@p1$ if perl was proper but... meh. .@no_nick$ = strip(substr($@p0$, getstrlen(strcharinfo(PC_NAME)) + 3, getstrlen($@p0$) - 1)); .@message$ = strtoupper(.@no_nick$); //0234_Password_BlackBox(.@message$); callfunc "0234_Password_BlackBox", .@message$; end; } // TODO: Spike traps and etc. at the corritor // TODO: Rolling Stone Trap // Delete rolling stones as they hit this wall /*023-3,47,40,0 script #0233DelStone NPC_HIDDEN,1,0,{ OnTouch: end; OnTouchNPC: //die(); //unitkill(0); unitwarp(0, "023-3", 42, 26); end; } // TODO: Rolling Stone core 023-3,0,0,0 script #0233RollStone NPC_HIDDEN,{ end; OnInit: $@0233_STONEA=monster("023-3", 47, 23, "Rolling Stone", RollingStone, 1); $@0233_STONEB=monster("023-3", 48, 25, "Rolling Stone", RollingStone, 1); $@0233_STONEC=monster("023-3", 47, 30, "Rolling Stone", RollingStone, 1); $@0233_STONED=monster("023-3", 48, 37, "Rolling Stone", RollingStone, 1); initnpctimer; end; OnTimer250: unitwalk($@0233_STONEA, 47, 40); unitwalk($@0233_STONEC, 47, 40); unitwalk($@0233_STONEB, 48, 40); unitwalk($@0233_STONED, 48, 40); getmapxy(.@m$, .@x, .@y, UNITTYPE_MOB, $@0233_STONEA); if (.@y >= 40) unitwarp($@0233_STONEA, "023-3", 47, 23); getmapxy(.@m$, .@x, .@y, UNITTYPE_MOB, $@0233_STONEB); if (.@y >= 40) unitwarp($@0233_STONEB, "023-3", 48, 23); getmapxy(.@m$, .@x, .@y, UNITTYPE_MOB, $@0233_STONEC); if (.@y >= 40) unitwarp($@0233_STONEC, "023-3", 47, 23); getmapxy(.@m$, .@x, .@y, UNITTYPE_MOB, $@0233_STONED); if (.@y >= 40) unitwarp($@0233_STONED, "023-3", 48, 23); initnpctimer; end; } */ // TODO: NPC walking cannot trigger OnTouch events >.> 023-3,47,23,0 script #0233RollStoneA NPC_ROLLINGSTONE,0,0,{ end; OnInit: npcspeed(240); initnpctimer; npcwalkto(47, 41); end; OnTimer120: if (.y >= 40) { movenpc(.name$, 47, 23); npcwalkto(47, 41); } if (getareausers("023-3", 0)) { areatimer2("023-3", .x, .y, .x, .y, 10, .name$+"::OnTouchie"); } initnpctimer; end; OnTouchie: if (isin(.map$, .x, .y, 0)) { percentheal -40, -40; warp .map$, 49, 41; } end; OnTouchNPC: sc_start SC_COMA, 60000, 0; end; } 023-3,48,26,0 script #0233RollStoneB NPC_ROLLINGSTONE,0,0,{ end; OnInit: npcspeed(240); initnpctimer; npcwalkto(49, 41); end; OnTimer120: if (.y >= 40) { movenpc(.name$, 48, 23); npcwalkto(48, 41); } if (getareausers("023-3", 0)) { areatimer2("023-3", .x, .y, .x, .y, 10, .name$+"::OnTouchie"); } initnpctimer; end; OnTouchie: if (isin(.map$, .x, .y, 0)) { percentheal -40, -40; warp .map$, 49, 41; } end; OnTouchNPC: sc_start SC_COMA, 60000, 0; end; } 023-3,47,30,0 duplicate(#0233RollStoneA) #0233RollStoneC NPC_ROLLINGSTONE,0,0 023-3,48,37,0 duplicate(#0233RollStoneB) #0233RollStoneD NPC_ROLLINGSTONE,0,0