// TMW2 scripts.
// Authors:
// Jesusalva
// Description:
// The most powerful sword ever. It's alive.
boss,45,42,0 script Lightbringer NPC_LIGHTBRINGER,{
function movelb;
function matrixlb;
if ($GAME_STORYLINE >= 3) goto L_Today;
npctalkonce l("It still isn't time to awake the King Of Holy Swords, Light Bringer.");
end;
L_Today:
.@q=getq(General_Narrator);
// Prologue missed - straight refusal
if (.@q < 19) {
npctalk3 l("The sword glows too much. Perhaps @@ could take it.", $MOST_HEROIC$);
end;
}
// Determine if you are worthy (from 0 to 101)
if (!@lbscore)
@lbscore=matrixlb();
if (is_staff())
dispbottom "I only did "+@lbscore+" points...";
if (@lbscore <= 30) {
npctalk3 l("...");
end;
} else if (@lbscore <= 60) {
npctalk3 l("You are not worthy...");
end;
}
// Else: score > 60, 2 minutes per additional score
rentitem Lightbringer, (120*(@lbscore-60));
dispbottom l("This live sword drafts itself to your hand. You can wield it for a while.");
disablenpc .name$;
.busy=gettimetick(2)+(120*(@lbscore-60))*3/2;
end;
OnInit:
.sex = G_MALE;
.distance = 2;
if ($GAME_STORYLINE < 3)
disablenpc .name$;
.npcId=getnpcid();
.users=getusers(1);
.busy=false;
// Constants
// We should jump straight to loop (it runs every 5 minutes)
OnTimer300000:
.users=getusers(1);
// If $LIGHTBRINGER_OWNER$ is set, we die here
if ($LIGHTBRINGER_OWNER$ != "")
end;
// Proccess busy time
if (.busy) {
if (.busy < gettimetick(2)) {
.busy=false;
enablenpc .name$;
} else {
initnpctimer;
end;
}
}
// Min. 2 NPCs for the Lightbringer to show up
if (!.busy) {
if (.users <= 2 && !$@GM_OVERRIDE) {
disablenpc .name$;
.busy=true;
}
}
// You cannot interact with it during events
if ($@MK_SCENE || $@GM_EVENT) {
disablenpc .name$;
.busy=true;
initnpctimer;
end;
}
// Move Lightbringer to a random map
movelb(.npcId);
// Debug markers
if ($@GM_OVERRIDE)
debugmes "Light Bringer (bot): "+.map$+" ("+.x+", "+.y+")";
// We're done, restart loop timer
initnpctimer;
end;
// Functions
// movelb(npcid)
function movelb {
.@id=getarg(0);
setarray .@m$, "boss", "boss", "001-1", "001-3", "001-7",
"004-2", "004-2-1",
"010-1", "010-1-1", "011-2", "011-3",
"013-1", "014-5", "015-1", "015-2", "015-3", "015-4", "015-5", "015-6", "015-7",
"018-1", "018-1-1", "018-2", "018-3", "018-4", "018-4-1", "018-5-1",
"019-4", "021-1", "021-2", "021-3", "022-1", "023-1";
.mp$=any_of(.@m$);
// Try to warp randomly: 30 attempts for a walkable spot
.@e=0; .@x=0; .@y=0;
.@mx=getmapinfo(MAPINFO_SIZE_X, .mp$)-20;
.@my=getmapinfo(MAPINFO_SIZE_Y, .mp$)-20;
do {
if (.@e >= 30) {
.mp$="boss";
.@x=45;
.@y=42;
break;
}
.@x = rand2(20, .@mx);
.@y = rand2(20, .@my);
.@e+=1;
} while (!checknpccell(.mp$, .@x, .@y, cell_chkpass));
if (!checknpccell(.mp$, .@x, .@y, cell_chkpass)) {
Exception("gm.bot runtime error: GM_ERR_128 highlight @Jesusalva", RB_DEBUGMES|RB_IRCBROADCAST); .mp$="boss"; .@x=45; .@y=42;
}
// Time to warp the NPC
npctalk("...");
sleep(20);
unitwarp(.@id, .mp$, .@x, .@y);
sleep(50); // For some reason or other, adding sleep(norid) and sleep2(rid).
return;
}
// matrixlb()
function matrixlb {
.@pts=0;
// Heroic Matrice
.@pts+=($MOST_HEROIC$ == strcharinfo(0) ? 10 : 0);
// Magic Matrice
.@pts+=min(7, MAGIC_LVL);
// Main levels matrix
.@pts+=min(15, BaseLevel/10);
.@pts+=min(15, JobLevel/10);
// Scoreboards matrix
.@br=array_find($@hoblvl_name$, strcharinfo(0));
.@jr=array_find($@hojlvl_name$, strcharinfo(0));
.@mr=array_find($@hofortune_name$, strcharinfo(0));
.@br=limit(0, (.@br >= 0 ? 10-.@br : 0), 10);
.@jr=limit(0, (.@jr >= 0 ? 10-.@jr : 0), 10);
.@mr=limit(0, (.@mr >= 0 ? 10-.@mr : 0), 10);
.@pts+=.@br;
.@pts+=.@jr;
.@pts+=.@mr;
// Reputation matrix
.@pts+=min(3, reputation("Tulim")/33);
.@pts+=min(3, reputation("Hurns")/33);
.@pts+=min(3, reputation("LoF")/33);
.@pts+=min(3, reputation("Nival")/33);
.@pts+=min(3, reputation("Halin")/33);
.@pts+=min(3, reputation("Frostia")/33);
.@pts+=min(3, reputation("Candor")/33);
// What about Lilit?
// Who am I bonus TODO
// Temporaly I'll use Candor Battle Top 3
.@cr=array_find($@cfefe_name$, strcharinfo(0));
.@cr=limit(0, (.@cr >= 0 ? 3-.@cr : 0), 3);
.@pts+=.@cr;
// Max points: 101
return .@pts;
}
}