diff options
author | Jesusaves <cpntb1@ymail.com> | 2022-10-23 21:44:22 -0300 |
---|---|---|
committer | Jesusaves <cpntb1@ymail.com> | 2022-10-23 21:44:22 -0300 |
commit | a7c45a192268da2601cef47a4cdba987ae2327ca (patch) | |
tree | c5fb5b97db109fe7106496dd96498c475881046b /npc/042-0 | |
download | serverdata-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.txt | 5 | ||||
-rw-r--r-- | npc/042-0/_warps.txt | 3 | ||||
-rw-r--r-- | npc/042-0/arthur.txt | 524 | ||||
-rw-r--r-- | npc/042-0/mf.txt | 12 |
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 |