summaryrefslogtreecommitdiff
path: root/npc/functions/gmbot.txt
diff options
context:
space:
mode:
Diffstat (limited to 'npc/functions/gmbot.txt')
-rw-r--r--npc/functions/gmbot.txt182
1 files changed, 182 insertions, 0 deletions
diff --git a/npc/functions/gmbot.txt b/npc/functions/gmbot.txt
new file mode 100644
index 000000000..4615c0f58
--- /dev/null
+++ b/npc/functions/gmbot.txt
@@ -0,0 +1,182 @@
+// 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, 1 minute per additional score
+ rentitem Lightbringer, (60*(@lbscore-60));
+ dispbottom l("This live sword drafts itself to your hand. You can wield it for a while.");
+ disablenpc .name$;
+ .busy=gettimetick(2)+(60*(@lbscore-60));
+ 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;
+}
+
+}
+