// TMW2 scripts.
// Authors:
// Jesusalva
// Description:
// Gemini Sisters Quest - Outside the Building
034-3,23,50,0 script #GeminiBack2 NPC_HIDDEN,0,0,{
end;
OnTouch:
if (instance_id() < 0 || getcharid(1) < 1) end;
GeminiCheck(8);
.@p=getcharid(1);
warp "val2@"+.@p, 37, 25;
end;
}
034-3,57,29,0 script #GeminiDoor NPC_HIDDEN,0,0,{
end;
OnTouch:
if (instance_id() < 0 || getcharid(1) < 1) end;
GeminiCheck(8);
.@p=getcharid(1);
if ($@VALIA_STATUS[.@p] >= 9) {
warp "val4@"+.@p, 43, 51;
end;
}
slide 58, 34;
percentheal -20, 0;
dispbottom l("You are pushed back violently. There is probably some way to break this barrier.");
end;
}
034-3,51,38,0 script Engravings#Gemini NPC_NO_SPRITE,{
mes l("You can read some words engraved inside this rock, but some are erased by wind and time:");
next;
mes l("\".. can use this .. power..´. . .´. . . amplify a spell ..´.");
mes l(" . ´´. Don't let .. spell power .´..´ . .. fade away ...");
mes l("´ .Use lazurite stones ´..´. they will appear. ..´ .. drop them inside .. this circle.");
mes l(". ´ power.. drains .. life..´. .´ focus . .not move at all´. .\"");
next;
mes l("Below this strange writing, you notice a word still deeply engraved in the stone:");
next;
mesq b("catalazuli");
next;
.@p=getcharid(1);
mes l("... that looks like an incantation or something.");
if (strcharinfo(0) != getpartyleader(.@p)) {
mes l("I probably should let %s chant it.", getpartyleader(.@p));
close;
}
next;
mes l("I think this blue circle right here can be helpful to break the enchantment that blocks the door of the Inn.");
next;
mes l("Let's see how I can activate it...");
mes l("But I should probably get inside it, first.");
close;
OnChannel:
if (instance_id() < 0 || getcharid(1) < 1) end;
GeminiCheck(8);
// Check location
getmapxy(.@m$, .@x, .@y, 0);
if (.@x < 52 ||
.@x > 54 ||
.@y < 37 ||
.@y > 38) end;
// Only party leader may proceed
.@p=getcharid(1);
if (strcharinfo(0) != getpartyleader(.@p)) {
percentheal 0, -25;
specialeffect(312, AREA, getcharid(3));
dispbottom l("Argh! I assume I can't do this chant!");
end;
}
// Bonus is based on int
.@bonus = readparam2(bInt) / 25;
// Unlike TMW's, all Lazurites show up at same place
// ...
// amount of initial magic power
.@magic_power = 1811 + readparam2(bInt)*2;
// Channelling required power depends on the base Int of the character
.@magic_power_required = 5707 - 2*readparam2(bInt);
// magic power loss depends also on Int. TMW uses 53, we use 21
.@magic_power_loss = 21 - (((readparam2(bInt)+1)*2)/10);
dispbottom l("Ok, let's stay focused now!");
areamonster getmap(), 27, 20, 77, 47, strmobinfo(1, Forain), Forain, 1;
// TODO: Loop
debugmes "NPC: %s / %s (%d)", .name$, .extname$, instance_id();
.aid=getcharid(3);
.mp$=getmap();
.power=.@magic_power;
.state=0;
.maxpw=.@magic_power_required;
.mloss=.@magic_power_loss;
initnpctimer;
end;
OnTimer13000:
initnpctimer; // Reset timer
// Time to spawn monsters
.@pc = getmapusers(.mp$);
areamonster .mp$, 56, 30, 60, 31, "Guardian", Scar, 1+.@pc;
areamonster .mp$, 27, 20, 77, 47, strmobinfo(1, Forain), Forain, 2;
// Terranites only show up when doing multiplayer, based on number of players
if (.@pc >= 2)
areamonster .mp$, 56, 30, 60, 31, "Guardian", Terranite, (.@pc/2);
OnTimer10000:
OnTimer8000:
OnTimer6000:
OnTimer4000:
OnTimer2000:
if (instance_id() < 0) end;
if (!attachrid(.aid)) {
npctalk "The caster ceased to exist!";
stopnpctimer;
end;
}
getmapxy(.@m$, .@x, .@y, 0, .aid);
if (.@m$ != .mp$) {
npctalk "The caster is gone!";
stopnpctimer;
end;
}
if (.@x < 52 ||
.@x > 54 ||
.@y < 37 ||
.@y > 38) {
npctalk "The caster left the power circle!";
dispbottom l("The magic accumulated backfires at you!");
heal -(.power), -(.power/2);
stopnpctimer;
end;
}
// Harm you
//misceffect FX_CHANNELLING_RAISE;
percentheal -4, -1;
if (ispcdead()) {
npctalk "The caster is dead!";
stopnpctimer;
end;
}
if (Sp <= 0) {
npctalk "The caster ran out of mana!";
stopnpctimer;
end;
}
// Deplete power over time
// But only if not doing solo
if (getmapusers(.mp$) > 1 || .mloss < 0)
.power -= .mloss;
// Remove stones inside the circle
.@cat=getareadropitem(.mp$, 52, 37, 54, 39, LazuriteShard, true) * 12;
.@cbt=getareadropitem(.mp$, 52, 37, 54, 39, LazuriteCrystal, true) * 32;
.@cct=getareadropitem(.mp$, 52, 37, 54, 39, LazuriteHeart, true) * 65;
// Grant them POWER
.power+=.@cat+.@cbt+.@cct;
.@cur = 4 * .power / .maxpw; // Goes from 0 to 4
// Check status and update
if (.@cur < .status)
npctalk "NOTICING a sudden power loss!";
else if (.@cur > .status)
npctalk "NOTICING an increase of power!";
.status=.@cur;
// Are we done?
if (.power >= .maxpw) {
npctalk "*the gate spell has been redefined*";
if (getcharid(1) > 0) {
$@VALIA_STATUS[getcharid(1)]=9;
stopnpctimer;
.power=0;
.mloss=0;
.maxpw=0;
.state=0;
.mp$="";
.aid=0;
}
stopnpctimer;
end;
}
detachrid();
// Should we spawn items?
.@t = (getnpctimer(0)+500) / 1000;
// Item time!
if (.@t == 6 ||
.@t == 10) {
.@i = 0;
// More Shards than Crystals and Hearts
freeloop(true);
while (.@i < ((5-getmapusers(.mp$)) * 2 + 5)) {
.@it=any(LazuriteShard, LazuriteShard, LazuriteShard,
LazuriteCrystal, LazuriteCrystal,
LazuriteHeart);
makeitem(.@it, 1, .mp$, rand2(27, 77), rand2(20, 47));
.@i += 1;
}
freeloop(false);
}
end;
OnTalkNearby:
// not very obvious stuff by gumi
.@no_nick$ = strip(substr($@p0$, getstrlen(strcharinfo(PC_NAME)) + 3, getstrlen($@p0$) - 1));
.@message$ = strtoupper(.@no_nick$);
if (.@message$ == "CATALAZULI") {
goto OnChannel;
}
end;
OnInit:
OnInstanceInit:
.distance=3;
.pid=getnpcid();
// For players
.aid=0;
.mp$="";
.power=0;
.state=0;
.maxpw=0;
.mloss=0;
debugmes "Gemini Pattern %d", .pid;
//defpattern(.pid, "^([Kk][Aa][Tt][Aa][Zz][Uu][Ll][Ii])$", "OnTalkNearby");
defpattern(.pid, "^(.*)$", "OnTalkNearby");
activatepset(.pid);
end;
}