// 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 PCs 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; // What about Doppelganger TOP 3? .@dr=array_find($@udt_name$, strcharinfo(0)); .@dr=limit(0, (.@dr >= 0 ? 3-.@dr : 0), 3); .@pts+=.@dr; // Max points: 101→104 return .@pts; } }