summaryrefslogtreecommitdiff
path: root/npc/042-0
diff options
context:
space:
mode:
authorJesusaves <cpntb1@ymail.com>2022-10-23 21:44:22 -0300
committerJesusaves <cpntb1@ymail.com>2022-10-23 21:44:22 -0300
commita7c45a192268da2601cef47a4cdba987ae2327ca (patch)
treec5fb5b97db109fe7106496dd96498c475881046b /npc/042-0
downloadserverdata-a7c45a192268da2601cef47a4cdba987ae2327ca.tar.gz
serverdata-a7c45a192268da2601cef47a4cdba987ae2327ca.tar.bz2
serverdata-a7c45a192268da2601cef47a4cdba987ae2327ca.tar.xz
serverdata-a7c45a192268da2601cef47a4cdba987ae2327ca.zip
Initial commit (Moubootaur Legends fork)
Diffstat (limited to 'npc/042-0')
-rw-r--r--npc/042-0/_import.txt5
-rw-r--r--npc/042-0/_warps.txt3
-rw-r--r--npc/042-0/arthur.txt524
-rw-r--r--npc/042-0/mf.txt12
4 files changed, 544 insertions, 0 deletions
diff --git a/npc/042-0/_import.txt b/npc/042-0/_import.txt
new file mode 100644
index 0000000..93ab827
--- /dev/null
+++ b/npc/042-0/_import.txt
@@ -0,0 +1,5 @@
+// Map 042-0: Camelot - Throne Room
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+"npc/042-0/_warps.txt",
+"npc/042-0/arthur.txt",
+"npc/042-0/mf.txt",
diff --git a/npc/042-0/_warps.txt b/npc/042-0/_warps.txt
new file mode 100644
index 0000000..064ab81
--- /dev/null
+++ b/npc/042-0/_warps.txt
@@ -0,0 +1,3 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Map 042-0: Camelot - Throne Room warps
+042-0,60,81,0 warp #042-0_60_81 3,0,014-4,67,27
diff --git a/npc/042-0/arthur.txt b/npc/042-0/arthur.txt
new file mode 100644
index 0000000..fc7565f
--- /dev/null
+++ b/npc/042-0/arthur.txt
@@ -0,0 +1,524 @@
+// TMW 2 Script
+// Author:
+// Jesusalva
+// Micksha
+// Description:
+// Part of Kamelot Guild Dungeon
+// TODO: Random guard (Tezer) on the cursed soldier statues (easter egg)
+
+042-0,58,28,0 script King Arthur NPC_KING_ARTHUR,{
+ function arthurSpawn;
+ .@g=getcharid(2);
+ .@pos=getguildrole(.@g, getcharid(3));
+ if (.@pos > GPOS_VICELEADER) goto L_Refusal;
+ if (getguildlvl(.@g) < 2) goto L_Annoyed;
+ if (!$KAMELOT_COOLDOWN[.@g]) goto L_Tutorial;
+ if ($KAMELOT_QUEST[.@g] & 1) goto L_Progress;
+ goto L_Prologue;
+
+L_Prologue:
+ mesn l("King Arthur the Micksha");
+ mes l("Hello Adventurer.");
+ next;
+ mesn l("King Arthur the Micksha");
+ mes l("So good you are here. We have a huge problem.");
+ next;
+ npctalk l("JAIL THEM!!");
+ mesn l("King Arthur the Corrupted");
+ mes col(l("JAIL THEM!!"), 9)+l(" -- No, wait!");
+ next;
+ select
+ "[START] "+l("What is going on here?"),
+ l("Your problems are not mine. By the way, you really should consider taking a shower."),
+ l("[TUTORIAL]"),
+ "[QUIT] "+l("You are weird, I have to go, sorry.");
+ mes "";
+ switch (@menu) {
+ case 1:
+ goto L_Quest;
+ case 2:
+ if (any(true, true, true, true, false))
+ goto L_Smash;
+ else
+ goto L_Annoyed;
+ case 3:
+ goto L_Tutorial;
+ case 4:
+ if (!any(true, true, true, true, false))
+ goto L_Smash;
+ else
+ goto L_Annoyed;
+ }
+ close;
+
+L_Quest:
+ mesn l("King Arthur the Micksha");
+ mes l("Something is happening down there.");
+ next;
+ npctalk l("GUARDS! GET THEM!");
+ mesn l("King Arthur the Corrupted");
+ mes l("It is so dangerous, and it... ")+col(l("GUARDS! GET THEM!"), 9);
+ next;
+ mesn l("King Arthur the Micksha");
+ mes l("You must be fast! The guards are also affected.");
+ next;
+ npctalk l("OFF WITH THEIR HEADS!");
+ mesn l("King Arthur the Corrupted");
+ mes col(l("OFF WITH THEIR HEADS!"), 9)+l(" Take this key, it opens the door behind my throne.");
+ next;
+ npctalk l("AFTER THEM!!");
+ mesn l("King Arthur the Corrupted");
+ mes l("Be careful! ")+col(l("AFTER THEM!!"), 9);
+ next;
+ // Be sure the quest only starts now, and destroy any eventual artifact
+ KamelotCleanup(.@g);
+ getguildmember(.@g, 2); // 2 = count by account IDs
+ $KAMELOT_QUEST[.@g]=1;
+ $KAMELOT_MX[.@g]=getguildavg(.@g);
+ $KAMELOT_PC[.@g]=$@guildmembercount;
+ $KAMELOT_KEY[.@g]=any(1,2,4,8);
+ $KAMELOT_PASSCODE[.@g]=rand2(1, 31);
+ // TODO: Kamelot Event could bypass the cooldown? ...Nah.
+ $KAMELOT_COOLDOWN[.@g] = gettimeparam(GETTIME_WEEKDAY);
+ mapannounce(getmap(), "##1KAMELOT CASTLE, GUILD DUNGEON: MISSION START!", bc_map);
+ // Spawn a few foot soldiers
+ arthurSpawn(1, 25, 29, 43, 37);
+ arthurSpawn(3, 22, 43, 43, 73);
+ arthurSpawn(5, 76, 55, 98, 77);
+ mesc l(".:: KAMELOT CASTLE, THE GUILD DUNGEON ::."), 1;
+ mes "";
+ mes l("1. Investigate Kamelot Basements");
+ mes l("2. Free Kamelot from its curse!");
+ next;
+ mesc l("Please select quest difficulty.");
+ mesc l("This will affect rewards, and decision is final!"), 1;
+ select
+ l("Normal"),
+ l("Easy"),
+ l("Hard"),
+ l("Crazy");
+ mes "";
+ switch (@menu) {
+ case 2: // Easy
+ $KAMELOT_MX[.@g]-=15;
+ $KAMELOT_PC[.@g]=max(1, $KAMELOT_PC[.@g]*8/10);
+ mapannounce(getmap(), "Kamelot Difficulty set to: Easy.", bc_map);
+ break;
+ case 3: // Hard
+ $KAMELOT_MX[.@g]+=15;
+ $KAMELOT_PC[.@g]=max(1, $KAMELOT_PC[.@g]*12/10)+1;
+ mapannounce(getmap(), "Kamelot Difficulty set to: Hard.", bc_map);
+ break;
+ case 4: // Crazy(fefe)
+ $KAMELOT_MX[.@g]+=30;
+ $KAMELOT_PC[.@g]=max(1, $KAMELOT_PC[.@g]*15/10)+3;
+ mapannounce(getmap(), "Kamelot Difficulty set to: Crazy.", bc_map);
+ break;
+ }
+ close;
+
+
+//////////////////////////////////////////////////////////////////////////
+// King manages to control himself
+L_Annoyed:
+ npctalk l("Don't bore me.");
+ closeclientdialog;
+ close;
+
+// King loses his coolness.
+L_Smash:
+ npctalk l("MEEEEEERLIN!!! SMASH THEM!!");
+ maptimer(getmap(), 300, instance_npcname(.name$)+"::OnPreSmash");
+ closeclientdialog;
+ close;
+
+OnPreSmash:
+ specialeffect FX_CUPID, AREA, getcharid(3);
+ addtimer(380, instance_npcname(.name$)+"::OnSmash");
+ end;
+
+OnSmash:
+ die();
+ end;
+
+//////////////////////////////////////////////////////////////////////////
+L_Progress:
+ if ($KAMELOT_QUEST[.@g] & 64) goto L_Reward;
+ npctalk l("What are you still doing here?! GO!!");
+ mes l("Read tutorial again?");
+ next;
+ if (askyesno() == ASK_YES) goto L_Tutorial;
+ close;
+
+L_Reward:
+ .@cn=$KAMELOT_MX[.@g]/3;
+ mesn;
+ mesq l("Thanks for vanishing the source of the curse.");
+ next;
+ mesn;
+ mesq l("Since Merlin left in an expedition with Morgan, strange things have been happening in Kamelot.");
+ next;
+ mesn;
+ mesq l("Please accept this reward from my part. And if anything else happens again, I'll leave the doors open for you and your guild.");
+ next;
+ warp "014-4", 67, 27;
+ if ($KAMELOT_QUEST[.@g] & 128)
+ goto L_DoReward2;
+ $KAMELOT_QUEST[.@g]=$KAMELOT_QUEST[.@g]|128;
+ getitem GuildCoin, .@cn;
+ guildgetexp(.@cn*1000);
+ // TODO: Make this a decent reward
+ getitembound any(SilverRing, GoldenRing), 1, 2;
+ goto L_DoReward2;
+
+//////////////////////////////////////////////////////////////////////////
+L_Tutorial:
+ // Update variable
+ if ($KAMELOT_COOLDOWN[.@g] != gettimeparam(GETTIME_WEEKDAY))
+ $KAMELOT_COOLDOWN[.@g]=gettimeparam(GETTIME_WEEKDAY)-1;
+ mes b(".:: KAMELOT CASTLE ::.");
+ mes "The Guild Dungeon of Kamelot Castle";
+ mes "";
+ mes l("Kamelot Castle is a GUILD DUNGEON which refreshes WEEKLY.");
+ mes l("Only the Guild Master and the Vice Leaders are capable of starting this quest.");
+ next;
+ mes l("An unlimited number of members can join.");
+ mes l("Once the quest is started, entrance will be closed.");
+ mes l("No one can go out during the quest, so ensure every guild member has proper equipment, potions, and time for this dungeon.");
+ next;
+ mes l("Additionally, for the optimal experience, ensure your party has at least the following members and items:");
+ mes "";
+ mes l("* Thief");
+ mes l("* Mage");
+ mes l("* %s", getitemlink(TreasureKey));
+ mes l("* %s", getitemlink(Lockpicks));
+ mes "";
+ next;
+ mes b(".:: VICTORY REWARDS ::.");
+ mes l("Victory prizes include guild experience, guild money, and guild bound items.");
+ mes "";
+ mes b(".:: DEFEAT PENALTIES ::.");
+ mes l("If your guild is defeat during the quest, you'll need to wait the weekly cooldown to expire.");
+ mes "";
+ mes "----------------- by Lancelot";
+ next;
+ clear;
+ if ($KAMELOT_QUEST[.@g] & 1) goto L_Progress;
+ goto L_Prologue;
+
+
+//////////////////////////////////////////////////////////////////////////
+L_Refusal:
+ if ($KAMELOT_QUEST[.@g] & 64) goto L_Reward2;
+ mesc l("This man is THE LEGENDARY KING ARTHUR!");
+ mes "";
+ mesc l("I better leave talking to him to the guild Vice Leaders and Master.");
+ close;
+
+L_Reward2:
+ mesn;
+ mesq l("Thanks for your services, knight. One day, you might even deserve a seat at this castle.");
+ next;
+
+L_DoReward2:
+ mesn;
+ mesq l("Farewell, until the next time. Shall we met again, and may the light guide our paths.");
+ warp "014-4", 67, 27;
+ .@cn=$KAMELOT_MX[.@g]/10;
+ // Penalty if you dragged the guild down
+ if (BaseLevel < getguildavg(.@g)*5/10)
+ .@cn=.@cn*5/10;
+ // Penalty if you carried the guild
+ if (BaseLevel > getguildavg(.@g)*15/10)
+ .@cn=.@cn*5/10;
+ // Your reward
+ .@cn+=1;
+ getitem GuildCoin, .@cn;
+ guildgetexp(.@cn*300);
+ getexp BaseLevel*10, .@cn*35;
+ Zeny+=.@cn*1000;
+ close;
+
+OnKillMob:
+ if (!playerattached()) end;
+ .@g=getcharid(2);
+ if (.@g < 1) die();
+ getexp $KAMELOT_MX[.@g], $KAMELOT_MX[.@g]/2+1;
+ end;
+
+function arthurSpawn {
+ .@label$=instance_npcname(.name$)+"::OnKillMob";
+ .@gcount=getarg(0);
+ .@x1=getarg(1);
+ .@x2=getarg(3);
+ .@y1=getarg(2);
+ .@y2=getarg(4);
+ .@g=getcharid(2);
+ if (.@g < 1) die();
+ .@avg=$KAMELOT_MX[.@g];
+ .@m$=getmap();
+ for (.@i=0; .@i < .@gcount; .@i++) {
+ .@mobId=CursedSoldier;
+ .@mob=areamonster(.@m$, .@x1, .@y1, .@x2, .@y2, strmobinfo(1, .@mobId), .@mobId, 1, .@label$);
+ // Reconfigure the monster
+ setunitdata(.@mob, UDT_LEVEL, .@avg);
+ setunitdata(.@mob, UDT_STR, 1+.@avg/6);
+ setunitdata(.@mob, UDT_AGI, 1+.@avg/7);
+ setunitdata(.@mob, UDT_VIT, 1+.@avg/6);
+ setunitdata(.@mob, UDT_INT, 1+.@avg/6);
+ setunitdata(.@mob, UDT_DEX, 1+.@avg/7);
+ setunitdata(.@mob, UDT_LUK, 1+.@avg/6);
+ setunitdata(.@mob, UDT_ADELAY, 2072);
+ setunitdata(.@mob, UDT_ATKRANGE, 1);
+ // Battle Status
+ setunitdata(.@mob, UDT_MAXHP, .@avg*20);
+ setunitdata(.@mob, UDT_HP, .@avg*20);
+ setunitdata(.@mob, UDT_ATKMIN, .@avg*25/10);
+ setunitdata(.@mob, UDT_ATKMAX, .@avg*45/10);
+ setunitdata(.@mob, UDT_DEF, 1+.@avg*6/10);
+ setunitdata(.@mob, UDT_MDEF, 1+.@avg*3/10);
+ setunitdata(.@mob, UDT_HIT, .@avg*4); // Advised: x3
+ setunitdata(.@mob, UDT_FLEE, .@avg*25/10); // Advised: x4
+ // Critical calculation
+ .@min=1;
+ .@max=max(.@min, min(15, .@avg/6));
+ setunitdata(.@mob, UDT_CRIT, rand2(.@min, .@max));
+ // Loop through
+ }
+ freeloop(false);
+ return;
+}
+
+OnInit:
+ .distance=4;
+ .sex=G_MALE;
+ npcsit;
+ end;
+
+OnInstanceInit:
+ .distance=4;
+ .sex=G_MALE;
+ npcsit;
+ end;
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+042-0,69,24,0 script #K042-0_69_24 NPC_HIDDEN,0,0,{
+ end;
+
+OnTouch:
+ .@g=getcharid(2);
+
+ // Quest already finished.
+ if ($KAMELOT_QUEST[.@g] & 64) {
+ dispbottom l("I should talk to King Arthur.");
+ end;
+ }
+
+ // Quest (not yet) started
+ if ($KAMELOT_QUEST[.@g] & 1) {
+ warp "042-1@"+.@g, 55, 99;
+ } else {
+ dispbottom l("The door is locked.");
+ end;
+ }
+
+ // Maybe event must be fired
+ if (!($KAMELOT_KEYMASK[.@g] & 16)) {
+ .@label$=instance_npcname("#KDoor0421", $@KAMELOT_ID[.@g])+"::OnArrival";
+ deltimer .@label$;
+ addtimer 15000, .@label$;
+ }
+ end;
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+042-0,86,27,0 script Guinevere NPC_GUINEVERE,{
+ function guinevereSpawn;
+ .@g=getcharid(2);
+ .@pos=getguildrole(.@g, getcharid(3));
+ if (.@pos > GPOS_VICELEADER) goto L_Refusal;
+ if ($KAMELOT_QUEST[.@g] & 1) goto L_Hint;
+ npctalk3 l("Oh, hello %s.", strcharinfo(0));
+ end;
+
+L_Refusal:
+ mesn;
+ mesq l("Hello, %s.", strcharinfo(0));
+ next;
+ mesc "["+strcharinfo(0)+"]";
+ mesc l("She doesn't seems to trust me... Maybe I should bring a guild vice-leader, or even better, the guild master himself.");
+ close;
+
+L_Hint:
+ mesc l("Guinevere is the King's Wife. If you talk to her, the King will be upset and will send soldiers to you."), 1;
+ next;
+ mesc l("However, she may have a better assessment of the current situation better than you and your allies."), 1;
+ next;
+ mesc l("Continue anyway? You'll die if your allies cannot protect you!"), 1;
+ next;
+ if (askyesno() == ASK_NO)
+ close;
+
+ // Okay... So here we go (again), spawning monsters
+ guinevereSpawn(1);
+ mesn;
+ mesq l("Ah, %s, a good thing you're here. You must help!", strcharinfo(0));
+ next;
+ guinevereSpawn(1);
+ mesn;
+ mesq l("Something very terrible happened.");
+ next;
+ guinevereSpawn(2);
+ mesn;
+ mesq l("They're back - and they took hold of your majesty - my husband - king Arthur!");
+ next;
+ guinevereSpawn(2);
+ mesn;
+ mesq l("Of course, he doesn't likes the fact you're talking to me.");
+ next;
+ guinevereSpawn(3);
+ mesn;
+ mesq l("*They* couldn't take hold of me, but I'm bound to this castle; I can't leave.");
+ next;
+ guinevereSpawn(3);
+ mesn;
+ mesq l("They are in the basement, pulling the strings from behind.");
+ next;
+ guinevereSpawn(3);
+ mesn;
+ mesq l("The way is full of dangers. Not only king soldiers, but the beast has an army of their own!");
+ next;
+ guinevereSpawn(4);
+ mesn;
+ mesq l("You need to be very careful. Use the sewers to reach... them.");
+ next;
+ guinevereSpawn(4);
+ mesn;
+ mesq l("Also, listen well, because there are traps and dangers on the whole way. Their leader sealed themselves in safety.");
+ next;
+ guinevereSpawn(5);
+ mesn;
+ mesq l("I'm afraid you'll need a key to reach them. But there's a fork on the way.");
+ next;
+ guinevereSpawn(3);
+ mesn;
+ switch ($KAMELOT_KEY[.@g]) {
+ case 1:
+ .@path$=l("West"); break;
+ case 2:
+ .@path$=l("North West"); break;
+ case 4:
+ .@path$=l("North East"); break;
+ case 8:
+ .@path$=l("East"); break;
+ default:
+ .@path$=l("ERROR, REPORT ME: Invalid: %d", $KAMELOT_KEY[.@g]); break;
+ }
+ mesq l("The key is on the sewer %s path. Be careful. May the light be with you.", b(.@path$));
+ if ($KAMELOT_QUEST[.@g] & 2)
+ close;
+ next;
+ guinevereSpawn(5);
+ mesn;
+ mesq l("And one more thing...");
+ next;
+ guinevereSpawn(2);
+ mesn;
+ mesq l("Take this with you. And please bring Arthur back, the world needs him!");
+ $KAMELOT_QUEST[.@g]=$KAMELOT_QUEST[.@g]|2;
+ // Player Reward for completing this stage
+ getitem any(SacredImmortalityPotion, SacredLifePotion, SacredManaPotion), 1;
+ getitem GuildCoin, 5;
+ // Guild Reward for completing this stage
+ .@ggp=100+$KAMELOT_MX[.@g]*4;
+ .@gxp=$KAMELOT_MX[.@g]*2;
+ $GUILD_BANK[.@g]+=.@ggp;
+ guildgetexp(.@gxp); // 2xp per player average level (max 200/300)
+ // Guild Master Notification
+ .@gm$=getguildmaster(.@g);
+ if (!getcharid(3, .@gm$)) end;
+ .@gma=getcharid(3, .@gm$);
+ .@gmb=getcharid(0, .@gm$);
+ if (!isloggedin(.@gma, .@gmb)) end;
+ message .@gm$, strcharinfo(0)+" cleared Guinevere: Guild GP +"+.@ggp+" Guild XP +"+.@gxp;
+ close;
+
+OnKillMob:
+ if (!playerattached()) end;
+ .@g=getcharid(2);
+ if (.@g < 1) die();
+ getexp $KAMELOT_MX[.@g]*2, $KAMELOT_MX[.@g];
+ end;
+
+function guinevereSpawn {
+ .@label$=instance_npcname(.name$)+"::OnKillMob";
+ .@gcount=getarg(0);
+ .@g=getcharid(2);
+ if (.@g < 1) die();
+ .@avg=$KAMELOT_MX[.@g];
+ .@m$=getmap();
+ for (.@i=0; .@i < .@gcount; .@i++) {
+ .@mobId=CursedSoldier;
+ .@mob=areamonster(.@m$, 82, 26, 90, 34, strmobinfo(1, .@mobId), .@mobId, 1, .@label$);
+ // Reconfigure the monster
+ setunitdata(.@mob, UDT_LEVEL, .@avg);
+ setunitdata(.@mob, UDT_STR, 1+.@avg/6);
+ setunitdata(.@mob, UDT_AGI, 1+.@avg/7);
+ setunitdata(.@mob, UDT_VIT, 1+.@avg/6);
+ setunitdata(.@mob, UDT_INT, 1+.@avg/6);
+ setunitdata(.@mob, UDT_DEX, 1+.@avg/7);
+ setunitdata(.@mob, UDT_LUK, 1+.@avg/6);
+ setunitdata(.@mob, UDT_ADELAY, 2072);
+ setunitdata(.@mob, UDT_ATKRANGE, 1);
+ // Battle Status
+ setunitdata(.@mob, UDT_MAXHP, .@avg*20);
+ setunitdata(.@mob, UDT_HP, .@avg*20);
+ setunitdata(.@mob, UDT_ATKMIN, .@avg*25/10);
+ setunitdata(.@mob, UDT_ATKMAX, .@avg*45/10);
+ setunitdata(.@mob, UDT_DEF, 1+.@avg*6/10);
+ setunitdata(.@mob, UDT_MDEF, 1+.@avg*3/10);
+ setunitdata(.@mob, UDT_HIT, .@avg*4); // Advised: x3
+ setunitdata(.@mob, UDT_FLEE, .@avg*25/10); // Advised: x4
+ // Critical calculation
+ .@min=1;
+ .@max=max(.@min, min(15, .@avg/6));
+ setunitdata(.@mob, UDT_CRIT, rand2(.@min, .@max));
+ // Loop through
+ }
+ freeloop(false);
+ return;
+}
+
+OnInit:
+OnInstanceInit:
+ .distance=4;
+ .sex=G_FEMALE;
+ end;
+}
+
diff --git a/npc/042-0/mf.txt b/npc/042-0/mf.txt
new file mode 100644
index 0000000..714ce27
--- /dev/null
+++ b/npc/042-0/mf.txt
@@ -0,0 +1,12 @@
+042-0 mapflag zone MMO
+042-1 mapflag zone MMO
+042-2 mapflag zone MMO
+042-3 mapflag zone MMO
+042-4 mapflag zone MMO
+042-5 mapflag zone MMO
+042-6 mapflag zone MMO
+042-7 mapflag zone MMO
+042-8 mapflag zone MMO
+042-9 mapflag zone MMO
+042-10 mapflag zone MMO
+042-11 mapflag zone MMO