// 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. Aggressive chance: 33%
AreaMonsterBoss(getmap(), .@x1, .@y1, .@x2, .@y2, any(HolyPixie, NulityPixie, VanityPixie, 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 ? 4 : 2));
AreaMonsterB(getmap(), .@x1, .@y1, .@x2, .@y2, DeathCat, (@difficulty_modulus ? 2 : 0));
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:
changemusic getmap(), "Misty_Shrine.ogg";
if (playerattached()) {
enablenpc instance_npcname("???#01863");
getexp 200000, 10000;
unittalk(@boss, l("Alright... I shall acknowledge you..."));
.@q=getq(LoFQuest_Barbara);
.@q2=getq2(LoFQuest_Barbara);
.@q3=getq3(LoFQuest_Barbara);
setq LoFQuest_Barbara, 4, .@q2, 0;
// else: victory nullified (how did this happen)
} else {
enablenpc instance_npcname("Mana Stone#01863");
Exception("Could not finish the Boss Fight!");
}
enablenpc instance_npcname("#01863_fromCCtoNC");
enablenpc instance_npcname("#01863_fromCCtoSC");
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("If you break that, you could never go to the World's Edge!");
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;
mes ".:: " + l("The Mana Stone") + " ::.";
mesq l("I shall decide here and now, if you are worth of living in this world!");
next;
mes ".:: " + l("The Mana Stone") + " ::.";
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;
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