summaryrefslogtreecommitdiff
path: root/npc/033-1
diff options
context:
space:
mode:
Diffstat (limited to 'npc/033-1')
-rw-r--r--npc/033-1/_import.txt2
-rw-r--r--npc/033-1/misc.txt111
-rw-r--r--npc/033-1/nico.txt472
-rw-r--r--npc/033-1/trainer.txt184
4 files changed, 755 insertions, 14 deletions
diff --git a/npc/033-1/_import.txt b/npc/033-1/_import.txt
index 90c62d6..bd2a012 100644
--- a/npc/033-1/_import.txt
+++ b/npc/033-1/_import.txt
@@ -2,3 +2,5 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
"npc/033-1/_warps.txt",
"npc/033-1/misc.txt",
+"npc/033-1/nico.txt",
+"npc/033-1/trainer.txt",
diff --git a/npc/033-1/misc.txt b/npc/033-1/misc.txt
index f57cc03..608cc1f 100644
--- a/npc/033-1/misc.txt
+++ b/npc/033-1/misc.txt
@@ -44,21 +44,69 @@ OnTouch:
function script SetPorthosPortal {
.@id = getarg(0);
mesn l("Portal %02d", .@id);
- mes l("Do you want to activate an event?");
+ switch (.@id) {
+ case 6:
+ mesc l("Event: Moubootaur Showdown"), 1; break;
+ case 7:
+ mesc l("Warp: TMW Classic"), 1; close;
+ case 8:
+ mesc l("Event: Blanc's Showdown"), 1; break;
+ case 9:
+ mesc l("Warp: TMW ML"), 1; close;
+ default:
+ mesc l("This portal has not been coded yet."); close;
+ }
next;
- select
- l("Cancel"),
- l("Moubootaur Showdown");
- mes "";
- switch (@menu) {
- case 2:
+ mes l("Do you want to activate the event?");
+ if (askyesno() == ASK_NO) close;
+ switch (.@id) {
+ case 6:
setd(sprintf("$@EVENT_%02d", .@id), PORTHOS_ACTIVE);
setd(sprintf("$@EVENT_%02d_M$", .@id), "001-13-2");
setd(sprintf("$@EVENT_%02d_X", .@id), 47);
setd(sprintf("$@EVENT_%02d_Y", .@id), 52);
break;
+ case 8:
+ // Clean-up 001-3 in case there are already mobs there
+ killmonsterall("001-3");
+ // Environment Monsters, they do not respawn
+ .@m$="001-3";
+ // Thematic mobs
+ areamonster(.@m$, 20, 20, getmapinfo(MAPINFO_SIZE_X, .@m$), getmapinfo(MAPINFO_SIZE_Y, .@m$), strmobinfo(1, Thug), Thug, 150);
+ areamonster(.@m$, 20, 20, getmapinfo(MAPINFO_SIZE_X, .@m$), getmapinfo(MAPINFO_SIZE_Y, .@m$), strmobinfo(1, Swashbuckler), Swashbuckler, 150);
+ areamonster(.@m$, 20, 20, getmapinfo(MAPINFO_SIZE_X, .@m$), getmapinfo(MAPINFO_SIZE_Y, .@m$), strmobinfo(1, Grenadier), Grenadier, 140);
+ areamonster(.@m$, 20, 20, getmapinfo(MAPINFO_SIZE_X, .@m$), getmapinfo(MAPINFO_SIZE_Y, .@m$), strmobinfo(1, OceanPirate), OceanPirate, 100);
+ // There's `Marley` but they're listed as boss
+ // We'll likely use them in the mazes, as your target?
+ // Environment runt
+ areamonster(.@m$, 20, 20, getmapinfo(MAPINFO_SIZE_X, .@m$), getmapinfo(MAPINFO_SIZE_Y, .@m$), strmobinfo(1, DeathCat), DeathCat, 100);
+ areamonster(.@m$, 20, 20, getmapinfo(MAPINFO_SIZE_X, .@m$), getmapinfo(MAPINFO_SIZE_Y, .@m$), strmobinfo(1, BlackSlime), BlackSlime, 90);
+ areamonster(.@m$, 20, 20, getmapinfo(MAPINFO_SIZE_X, .@m$), getmapinfo(MAPINFO_SIZE_Y, .@m$), strmobinfo(1, SmallFrog), SmallFrog, 80);
+ areamonster(.@m$, 20, 20, getmapinfo(MAPINFO_SIZE_X, .@m$), getmapinfo(MAPINFO_SIZE_Y, .@m$), strmobinfo(1, BigFrog), BigFrog, 80);
+ // The lower tier
+ areamonster(.@m$, 20, 20, getmapinfo(MAPINFO_SIZE_X, .@m$), getmapinfo(MAPINFO_SIZE_Y, .@m$), strmobinfo(1, WickedMushroom), WickedMushroom, 50);
+ areamonster(.@m$, 20, 20, getmapinfo(MAPINFO_SIZE_X, .@m$), getmapinfo(MAPINFO_SIZE_Y, .@m$), strmobinfo(1, Forain), Forain, 50);
+ areamonster(.@m$, 20, 20, getmapinfo(MAPINFO_SIZE_X, .@m$), getmapinfo(MAPINFO_SIZE_Y, .@m$), strmobinfo(1, Assassin), Assassin, 50);
+ // The mid tier
+ areamonster(.@m$, 20, 20, getmapinfo(MAPINFO_SIZE_X, .@m$), getmapinfo(MAPINFO_SIZE_Y, .@m$), strmobinfo(1, HoodedNinja), HoodedNinja, 30);
+ // The high tier
+ areamonster(.@m$, 20, 20, getmapinfo(MAPINFO_SIZE_X, .@m$), getmapinfo(MAPINFO_SIZE_Y, .@m$), strmobinfo(1, BlackSlimeMother), BlackSlimeMother, 10);
+ // The boss level spawns
+ areamonster(.@m$, 20, 20, getmapinfo(MAPINFO_SIZE_X, .@m$), getmapinfo(MAPINFO_SIZE_Y, .@m$), strmobinfo(1, Reaper), Reaper, 2);
+ areamonster(.@m$, 20, 20, getmapinfo(MAPINFO_SIZE_X, .@m$), getmapinfo(MAPINFO_SIZE_Y, .@m$), strmobinfo(1, NightmareDragon), NightmareDragon, 2);
+ areamonster(.@m$, 20, 20, getmapinfo(MAPINFO_SIZE_X, .@m$), getmapinfo(MAPINFO_SIZE_Y, .@m$), strmobinfo(1, Mandragora), Mandragora, 1);
+ areamonster(.@m$, 20, 20, getmapinfo(MAPINFO_SIZE_X, .@m$), getmapinfo(MAPINFO_SIZE_Y, .@m$), strmobinfo(1, SiegeTower), SiegeTower, 1);
+ areamonster(.@m$, 20, 20, getmapinfo(MAPINFO_SIZE_X, .@m$), getmapinfo(MAPINFO_SIZE_Y, .@m$), strmobinfo(1, Golem), Golem, 2);
+ areamonster(.@m$, 20, 20, getmapinfo(MAPINFO_SIZE_X, .@m$), getmapinfo(MAPINFO_SIZE_Y, .@m$), strmobinfo(1, ShadowTortuga), ShadowTortuga, 1);
+ // Set everything up
+ setd(sprintf("$@EVENT_%02d", .@id), PORTHOS_ACTIVE);
+ setd(sprintf("$@EVENT_%02d_M$", .@id), "001-3");
+ setd(sprintf("$@EVENT_%02d_X", .@id), 164);
+ setd(sprintf("$@EVENT_%02d_Y", .@id), 33);
+ kamibroadcast("Blanc's Showdown was enabled.");
+ break;
default:
- mes l("Ok.");
+ mes l("Error.");
break;
}
close;
@@ -66,25 +114,40 @@ function script SetPorthosPortal {
}
-033-1,72,190,0 script #Porthos01 NPC_NO_SPRITE,0,0,{
+// Shortcut to TMW Classic?
+033-1,85,227,0 script #Porthos07 NPC_NO_SPRITE,0,0,{
+ end;
+OnTouch:
+ slide 85, 228;
+ mes l("Do you want to visit The Mana World: Classic?");
+ next;
+ if (askyesno() == ASK_YES)
+ MirrorLakeSendTo(MLP_TMW, 0);
+ closeclientdialog;
+ end;
+}
+
+// Event: Blanc's Manhunt
+033-1,72,190,0 script #Porthos08 NPC_NO_SPRITE,0,0,{
end;
OnTouch:
- if ($@EVENT_01 == PORTHOS_BUSY) {
+ if ($@EVENT_06 == PORTHOS_BUSY) {
dispbottom l("This portal is currently busy - an event must be in progress.");
end;
}
- if ($@EVENT_01 == PORTHOS_UNUSED) {
+ // 001-3 portals
+ if ($@EVENT_08 == PORTHOS_UNUSED) {
if (is_admin() || is_master())
- SetPorthosPortal(1);
+ SetPorthosPortal(8);
dispbottom l("This portal is not currently active.");
end;
}
- warp $@EVENT_01_M$, $@EVENT_01_X, $@EVENT_01_Y;
+ warp $@EVENT_08_M$, $@EVENT_08_X, $@EVENT_08_Y;
end;
}
// Shortcut to Moubootaur Legends?
-033-1,31,155,0 script #Porthos02 NPC_NO_SPRITE,0,0,{
+033-1,31,155,0 script #Porthos09 NPC_NO_SPRITE,0,0,{
end;
OnTouch:
slide 31, 156;
@@ -96,3 +159,23 @@ OnTouch:
end;
}
+// TODO: Event: Zax De'Kagen Showdown
+// Event: Moubootaur Showdown
+// This is a draft in npc/config/events.txt
+033-1,154,238,0 script #Porthos06 NPC_NO_SPRITE,0,0,{
+ end;
+OnTouch:
+ if ($@EVENT_06 == PORTHOS_BUSY) {
+ dispbottom l("This portal is currently busy - an event must be in progress.");
+ end;
+ }
+ if ($@EVENT_06 == PORTHOS_UNUSED) {
+ if (is_admin() || is_master())
+ SetPorthosPortal(6);
+ dispbottom l("This portal is not currently active.");
+ end;
+ }
+ warp $@EVENT_06_M$, $@EVENT_06_X, $@EVENT_06_Y;
+ end;
+}
+
diff --git a/npc/033-1/nico.txt b/npc/033-1/nico.txt
new file mode 100644
index 0000000..e656f4b
--- /dev/null
+++ b/npc/033-1/nico.txt
@@ -0,0 +1,472 @@
+// TMW2 scripts.
+// Authors:
+// Jesusalva
+// Description:
+// Arcmage Cards Enhancer
+
+033-1,157,89,0 script Nico Goethe NPC_PLAYER,{
+ function colorname;
+ function gameinfo;
+ mesn;
+ mesq l("My name is Nico Goethe, an %s card player.", "[@@https://arcmage.org|Arcmage@@]");
+ next;
+ mesn;
+ mesq l("Would love to invite you to a card minigame... But alas, Kenton told me that minigames are a waste of time, and that I should not bother adventurers with it.");
+ next;
+ mesn;
+ mesq l("However, I am still up for trading cards, if you wish.");
+ mesc l("%s discreetly point out that cards only works well in Moubootaur Legends weapons, but this depends on your origin server.", .name$);
+ next;
+ goto L_Main;
+
+L_Main:
+ select
+ l("Trade a card"),
+ l("Evolve a card"),
+ l("Remove a card"),
+ l("Lets play!"),
+ l("Bye.");
+ mes "";
+ switch (@menu) {
+ // Trade Card
+ case 1:
+ mesn;
+ mesq l("Give me a card and select another card of same class. I charge %d GP for simple exchanges.", 5000);
+ next;
+ if (Zeny < 5000)
+ break;
+
+ mes "##B" + l("Drag and drop an item from your inventory.") + "##b";
+ .@card = requestitem();
+ if (.@card <= 1) break;
+
+ @menuret = 0;
+ switch (.@card) {
+ case HeroCard:
+ case KnightCard:
+ case ClericCard:
+ case DruidCard:
+ case MageCard:
+ case NinjaCard:
+ case NatureCard:
+ case NecromancerCard:
+ menuint
+ "Sorry, I don't want to trade it.", 0,
+ getitemname(HeroCard), HeroCard,
+ getitemname(KnightCard), KnightCard,
+ getitemname(ClericCard), ClericCard,
+ getitemname(DruidCard), DruidCard,
+ getitemname(MageCard), MageCard,
+ getitemname(NinjaCard), NinjaCard,
+ getitemname(NatureCard), NatureCard,
+ getitemname(NecromancerCard), NecromancerCard;
+ mes "";
+ break;
+ case SpeedCard:
+ case ReflectCard:
+ case PowerCard:
+ case WallCard:
+ menuint
+ "Sorry, I don't want to trade it.", 0,
+ getitemname(SpeedCard), SpeedCard,
+ getitemname(ReflectCard), ReflectCard,
+ getitemname(PowerCard), PowerCard,
+ getitemname(WallCard), WallCard;
+ mes "";
+ break;
+ case HeroCardS:
+ case KnightCardS:
+ case ClericCardS:
+ case DruidCardS:
+ case MageCardS:
+ case NinjaCardS:
+ case NatureCardS:
+ case NecromancerCardS:
+ menuint
+ "Sorry, I don't want to trade it.", 0,
+ getitemname(HeroCardS), HeroCardS,
+ getitemname(KnightCardS), KnightCardS,
+ getitemname(ClericCardS), ClericCardS,
+ getitemname(DruidCardS), DruidCardS,
+ getitemname(MageCardS), MageCardS,
+ getitemname(NinjaCardS), NinjaCardS,
+ getitemname(NatureCardS), NatureCardS,
+ getitemname(NecromancerCardS), NecromancerCardS;
+ mes "";
+ break;
+ case SpeedCardS:
+ case ReflectCardS:
+ case PowerCardS:
+ case WallCardS:
+ menuint
+ "Sorry, I don't want to trade it.", 0,
+ getitemname(SpeedCardS), SpeedCardS,
+ getitemname(ReflectCardS), ReflectCardS,
+ getitemname(PowerCardS), PowerCardS,
+ getitemname(WallCardS), WallCardS;
+ mes "";
+ break;
+ case HeroCardX:
+ case KnightCardX:
+ case ClericCardX:
+ case DruidCardX:
+ case MageCardX:
+ case NinjaCardX:
+ case NatureCardX:
+ case NecromancerCardX:
+ menuint
+ "Sorry, I don't want to trade it.", 0,
+ getitemname(HeroCardX), HeroCardX,
+ getitemname(KnightCardX), KnightCardX,
+ getitemname(ClericCardX), ClericCardX,
+ getitemname(DruidCardX), DruidCardX,
+ getitemname(MageCardX), MageCardX,
+ getitemname(NinjaCardX), NinjaCardX,
+ getitemname(NatureCardX), NatureCardX,
+ getitemname(NecromancerCardX), NecromancerCardX;
+ mes "";
+ break;
+ case SpeedCardX:
+ case ReflectCardX:
+ case PowerCardX:
+ case WallCardX:
+ menuint
+ "Sorry, I don't want to trade it.", 0,
+ getitemname(SpeedCardX), SpeedCardX,
+ getitemname(ReflectCardX), ReflectCardX,
+ getitemname(PowerCardX), PowerCardX,
+ getitemname(WallCardX), WallCardX;
+ mes "";
+ break;
+ default:
+ mesn;
+ mesq l("Sorry, I only deal with Arcmage cards.");
+ break;
+ }
+ if (@menuret < 1)
+ break;
+ Zeny -= 5000;
+ delitem .@card, 1;
+ getitem @menuret, 1;
+ break;
+ // Evolve Card
+ case 2:
+ mesn;
+ mesq l("Give me %s copies of the same card and %s GP, and I'll improve its tier.", b(l("three")), fnum(25000));
+ mesc l("Normal Cards can be upgraded to S-Tier, and S Cards can be upgraded to X-Tier. X-Tier cards cannot be upgraded.");
+ next;
+ if (Zeny < 25000)
+ break;
+
+ mes "##B" + l("Drag and drop an item from your inventory.") + "##b";
+ .@card = requestitem();
+ if (.@card <= 1) break;
+ if (countitem(.@card) < 3) {
+ mesn;
+ mesq l("You don't have enough cards of this type to upgrade.");
+ next;
+ break;
+ }
+ switch (.@card) {
+ case HeroCard:
+ delitem .@card, 3; Zeny -= 25000;
+ getitem HeroCardS, 1;
+ break;
+ case KnightCard:
+ delitem .@card, 3; Zeny -= 25000;
+ getitem KnightCardS, 1;
+ break;
+ case ClericCard:
+ delitem .@card, 3; Zeny -= 25000;
+ getitem ClericCardS, 1;
+ break;
+ case DruidCard:
+ delitem .@card, 3; Zeny -= 25000;
+ getitem DruidCardS, 1;
+ break;
+ case MageCard:
+ delitem .@card, 3; Zeny -= 25000;
+ getitem MageCardS, 1;
+ break;
+ case NinjaCard:
+ delitem .@card, 3; Zeny -= 25000;
+ getitem NinjaCardS, 1;
+ break;
+ case NatureCard:
+ delitem .@card, 3; Zeny -= 25000;
+ getitem NatureCardS, 1;
+ break;
+ case NecromancerCard:
+ delitem .@card, 3; Zeny -= 25000;
+ getitem NecromancerCardS, 1;
+ break;
+ case SpeedCard:
+ delitem .@card, 3; Zeny -= 25000;
+ getitem SpeedCardS, 1;
+ break;
+ case ReflectCard:
+ delitem .@card, 3; Zeny -= 25000;
+ getitem ReflectCardS, 1;
+ break;
+ case PowerCard:
+ delitem .@card, 3; Zeny -= 25000;
+ getitem PowerCardS, 1;
+ break;
+ case WallCard:
+ delitem .@card, 3; Zeny -= 25000;
+ getitem WallCardS, 1;
+ break;
+
+
+ case HeroCardS:
+ delitem .@card, 3; Zeny -= 25000;
+ getitem HeroCardX, 1;
+ break;
+ case KnightCardS:
+ delitem .@card, 3; Zeny -= 25000;
+ getitem KnightCardX, 1;
+ break;
+ case ClericCardS:
+ delitem .@card, 3; Zeny -= 25000;
+ getitem ClericCardX, 1;
+ break;
+ case DruidCardS:
+ delitem .@card, 3; Zeny -= 25000;
+ getitem DruidCardX, 1;
+ break;
+ case MageCardS:
+ delitem .@card, 3; Zeny -= 25000;
+ getitem MageCardX, 1;
+ break;
+ case NinjaCardS:
+ delitem .@card, 3; Zeny -= 25000;
+ getitem NinjaCardX, 1;
+ break;
+ case NatureCardS:
+ delitem .@card, 3; Zeny -= 25000;
+ getitem NatureCardX, 1;
+ break;
+ case NecromancerCardS:
+ delitem .@card, 3; Zeny -= 25000;
+ getitem NecromancerCardX, 1;
+ break;
+ case SpeedCardS:
+ delitem .@card, 3; Zeny -= 25000;
+ getitem SpeedCardX, 1;
+ break;
+ case ReflectCardS:
+ delitem .@card, 3; Zeny -= 25000;
+ getitem ReflectCardX, 1;
+ break;
+ case PowerCardS:
+ delitem .@card, 3; Zeny -= 25000;
+ getitem PowerCardX, 1;
+ break;
+ case WallCardS:
+ delitem .@card, 3; Zeny -= 25000;
+ getitem WallCardX, 1;
+ break;
+
+ default:
+ mesn;
+ mesq l("Sorry, I only deal with Arcmage cards.");
+ break;
+ }
+ break;
+ // Remove a card
+ case 3:
+ mesc l("You can drag and drop an item to the NPC window or select an item through your inventory.");
+
+ delinventorylist();
+ getinventorylist();
+ .@item_index = requestitemindex();
+ .@item_id = @inventorylist_id[.@item_index];
+
+ mesn;
+ mesq l("Your mind is set? You will probably lose all the dyes and/or cards during on the item during this process. You're bleaching a %s by the way, and THERE ARE NO REFUNDS even if the item go ablaze.", getitemlink(.@item_id));
+
+ if (askyesno() == ASK_YES) {
+ mesn;
+ mesq l("Sure, I'll be done in a jiff.");
+ next;
+ successremovecardsindex(.@item_index); // *should* return the card
+ mesn;
+ mesq l("Here it is, clean like a whistle!");
+ } else {
+ mesn;
+ mesq l("Is it truly a hard choice to make?");
+ }
+ next;
+ break;
+ // Play minigame
+ case 4:
+ mesn;
+ mesq l("...Are you trying to troll me?");
+ next;
+ mesn;
+ mesq l("Well, I can't offer you an %s match, but do you want to play something else? I would charge %d GP for a match.", "[@@https://arcmage.org|Arcmage@@]", .price);
+ next;
+ if (askyesno() == ASK_NO) {
+ mesn;
+ mesq l("Suit yourself.");
+ next;
+ break;
+ }
+ gameinfo();
+ mesn;
+ mesq l("Ready to begin?");
+ if (askyesno() == ASK_YES) goto L_Start;
+ break;
+ // Leave
+ default:
+ closeclientdialog;
+ goodbye;
+ close;
+ break;
+ }
+ goto L_Main;
+
+function colorname {
+ switch (getarg(0)) {
+ case 1:
+ return "Green"; break;
+ case 2:
+ return "Blue"; break;
+ case 3:
+ return "Red"; break;
+ case 4:
+ return "Yellow"; break;
+ case 5:
+ return "Exit"; break;
+ default:
+ return l("ERROR: %d", getarg(0));
+ }
+}
+
+function gameinfo {
+ showavatar NPC_FLOPPED_NOBLEMAN;
+ mes "";
+ mesc l("Rules:");
+ mesc l("A color sequence will be displayed on the avatar frame.");
+ mesc l("You must then repeat the sequence at the board which will show.");
+ next;
+ mesc l("Prizes:");
+ mesc l("You'll get %d GP every time you finish the sequence.", .prize);
+ mesc l("If you finish %d sequences, you'll get a(n) %s!", 10, getitemlink(ArcmageBoxset));
+ next;
+ return;
+}
+
+L_Start:
+ showavatar AVATAR_SEQBOARD;
+ mesc l("Pay attention to the sequence!");
+ next;
+ Zeny -= .price;
+ deletearray(@sequence);
+ @streak=0;
+
+L_Sequence:
+ // Configure
+ setnpcdialogtitle l("Memorize the sequence!");
+ array_push(@sequence, 1+rand2(4));
+ sleep2(1000);
+
+ // Display
+ freeloop(true);
+ for (.@i=0;.@i < getarraysize(@sequence);.@i++) {
+ showavatar 1200+@sequence[.@i];
+ sleep2(1200-(@streak*20));
+ }
+ freeloop(false);
+
+ // Request
+ setnpcdialogtitle l("What was the sequence?");
+ showavatar AVATAR_SEQBOARD;
+ sleep2(500);
+
+ for (.@i=0;.@i < getarraysize(@sequence);.@i++) {
+ setskin "seqboard";
+ select
+ l("Green"),
+ l("Blue"),
+ l("Red"),
+ l("Yellow"),
+ l("Exit");
+ .@ans=@menu;
+ setskin "";
+ mes "";
+ mes l("%s", colorname(.@ans));
+ //next;
+ setnpcdialogtitle strnpcinfo(1);
+
+ // Exit
+ if (.@ans == 5)
+ goto L_Close;
+
+ // Wrong reply
+ if (.@ans != @sequence[.@i])
+ goto L_Wrong;
+ // Correct!
+ }
+ mes "";
+ showavatar AVATAR_SEQBOARD_WELL;
+
+ // Seems like everything is/was correct
+ mesn;
+ mesq l("Congratulations! Everything was correct!");
+ Zeny+=.prize;
+ @streak+=1;
+
+ // Winning Streak
+ if (@streak % 10 == 0)
+ getitem ArcmageBoxset, 1;
+ mesc l("Your current win streak is @@!", @streak);
+ next;
+ // Game over
+ if (@streak == 50)
+ goto L_Close;
+ // Otherwise, go ahead
+ mesn;
+ mesc l("Continue?"), 1;
+ next;
+ if (askyesno() == ASK_YES)
+ goto L_Sequence;
+ goto L_Close;
+
+L_Wrong:
+ showavatar AVATAR_SEQBOARD_FAIL;
+ mesn;
+ mesq l("Oh no... That is wrong! %%3");
+ next;
+ mesn;
+ mesq l("Better luck next time!");
+ next;
+ showavatar;
+ goto L_Main;
+
+L_Close:
+ showavatar;
+ mesn;
+ mesq l("Thanks for the match, it was fun!");
+ next;
+ goto L_Main;
+
+
+OnInit:
+ .@npcId = getnpcid(.name$);
+ setunitdata(.@npcId, UDT_HEADTOP, TopHat);
+ setunitdata(.@npcId, UDT_HEADMIDDLE, GoldenLightPlatemail);
+ setunitdata(.@npcId, UDT_HEADBOTTOM, LeatherTrousers);
+ setunitdata(.@npcId, UDT_WEAPON, ManaGloves);
+ setunitdata(.@npcId, UDT_HAIRSTYLE, 24);
+ setunitdata(.@npcId, UDT_HAIRCOLOR, 4);
+ npcsit;
+
+ .sex = G_MALE;
+ .distance = 4;
+ .price = 100;
+ .prize = 25;
+ end;
+
+}
+
diff --git a/npc/033-1/trainer.txt b/npc/033-1/trainer.txt
new file mode 100644
index 0000000..c4be75b
--- /dev/null
+++ b/npc/033-1/trainer.txt
@@ -0,0 +1,184 @@
+// TMW2 scripts.
+// Authors:
+// Jesusalva
+// Description:
+// Mercenary Trainer
+
+033-1,180,100,0 script Mercenary Trainer NPC_REDY_MALE_SWORD,{
+ mesn;
+ mesq l("Hello, I am a sword to hire, a Mercenary Trainer and Chief.");
+ next;
+ mesn;
+ mesq l("Do you want to hire a mercenary? Or perhaps get a card so you can invoke them later? I can even make them stronger if you wish.");
+ mesc l("With a discrete motion, you notice they also sell scrolls.");
+ next;
+ goto L_Main;
+
+L_Main:
+ select
+ l("Hire a mercenary"),
+ l("Buy a mercenary card"),
+ l("Evolve mercenaries"),
+ l("Bye.");
+ mes "";
+ switch (@menu) {
+ // Hire Card
+ case 1:
+ menuint
+ l("[%d GP] [Lv 1~25] Hire for one hour", 1000), 1,
+ l("[%d GP] [Lv 26~40] Hire for one hour", 3000), 2,
+ l("[%d GP] [Lv 41~60] Hire for one hour", 7500), 3,
+ l("[%d GP] [Lv 61~79] Hire for one hour", 15000), 4,
+ l("[%d GP] [Lv 80~100] Hire for one hour", 25000), 5,
+ l("I've changed my mind"), 0;
+ switch (@menuret) {
+ case 1:
+ .@gp=1000;
+ if (Zeny < .@gp) {
+ mesc l("You cannot pay."), 1;
+ next;
+ } else {
+ .@mid=merc_randid(0, 0, 0, 0, 1000);
+ mercenary_create(.@mid, 3600000);
+ POL_PlayerMoney(.@gp);
+ }
+ break;
+ case 2:
+ .@gp=3000;
+ if (Zeny < .@gp) {
+ mesc l("You cannot pay."), 1;
+ next;
+ } else {
+ .@mid=merc_randid(0, 0, 0, 1000, 0);
+ mercenary_create(.@mid, 3600000);
+ POL_PlayerMoney(.@gp);
+ }
+ break;
+ case 3:
+ .@gp=7500;
+ if (Zeny < .@gp) {
+ mesc l("You cannot pay."), 1;
+ next;
+ } else {
+ mercenary_create merc_randid(0, 0, 1000, 0, 0), 3600000;
+ POL_PlayerMoney(.@gp);
+ }
+ break;
+ case 4:
+ .@gp=15000;
+ if (Zeny < .@gp) {
+ mesc l("You cannot pay."), 1;
+ next;
+ } else {
+ mercenary_create merc_randid(0, 1000, 0, 0, 0), 3600000;
+ POL_PlayerMoney(.@gp);
+ }
+ break;
+ case 5:
+ .@gp=25000;
+ if (Zeny < .@gp) {
+ mesc l("You cannot pay."), 1;
+ next;
+ } else {
+ mercenary_create merc_randid(1000, 0, 0, 0, 0), 3600000;
+ POL_PlayerMoney(.@gp);
+ }
+ break;
+ default:
+ break;
+ }
+ break;
+ // Buy Card
+ case 2:
+ npcshopattach(.name$);
+ openshop;
+ closedialog;
+ close;
+ break;
+ // Evolve Card
+ case 3:
+ mesn;
+ mesq l("Give me %s cards of the same type, and I'll give you one card of a higher rarity. There is no cost, but the card is random.", b(l("three")));
+ next;
+ mes "##B" + l("Drag and drop an item from your inventory.") + "##b";
+
+ .@card = requestitem();
+ if (.@card <= 1) break;
+ if (countitem(.@card) < 3) {
+ mesc l("You need at least %d cards of same kind.", 3), 1;
+ break;
+ }
+ .@st = merc_getstar(.@card);
+ if (.@st < 1 || .@st >= 5) {
+ mesc l("This cannot be evolved."), 1;
+ break;
+ }
+ delitem .@card, 3;
+ merc_boxset(
+ (.@st == 4 ? 1000 : 0),
+ (.@st == 3 ? 1000 : 0),
+ (.@st == 2 ? 1000 : 0),
+ (.@st == 1 ? 1000 : 0),
+ 0);
+ mesn;
+ mesq l("Here you go! Wasn't this a sweet deal?");
+ break;
+ // Leave
+ default:
+ closeclientdialog;
+ goodbye;
+ close;
+ break;
+ }
+ goto L_Main;
+
+OnInit:
+ tradertype(NST_ZENY);
+ sellitem MercBoxEE, 25000;
+ sellitem MercBoxDD, 15000;
+ sellitem MercBoxCC, 7500;
+ sellitem MercBoxBB, 3750;
+ sellitem MercBoxAA, 1250;
+
+ sellitem ScrollSMaggot, 1000;
+ sellitem ScrollSCave, 1500;
+ sellitem ScrollSWolvern, 2000;
+ sellitem ScrollSYeti, 2500;
+ sellitem ScrollSTerranite, 3000;
+ sellitem ScrollSDragon, 3500;
+
+ sellitem SacredImmortalityPotion, 25000;
+
+ sellitem ScrollMagnusHealA, 500;
+ sellitem ScrollMagnusHealB,1000;
+ sellitem ScrollMagnusHealC,2000;
+
+ sellitem ScrollBattlePlansA, 400;
+ sellitem ScrollBattlePlansB,1000;
+ //sellitem ScrollBattlePlansC,1500;
+
+ sellitem ScrollDefenseBlessA, 400;
+ sellitem ScrollDefenseBlessB,1000;
+ //sellitem ScrollDefenseBlessC,1500;
+
+ sellitem ScrollCriticalFortuneA, 400;
+ sellitem ScrollCriticalFortuneB,1000;
+ //sellitem ScrollCriticalFortuneC,1500;
+
+ .distance=5;
+ .sex=G_MALE;
+ end;
+
+// Pay your taxes!
+OnBuyItem:
+ debugmes("Purchase confirmed");
+ PurchaseTaxes("Nival");
+ end;
+
+OnSellItem:
+ debugmes("Sale confirmed");
+ PurchaseTaxes("Nival");
+ end;
+
+}
+