summaryrefslogtreecommitdiff
path: root/npc/custom/etc
diff options
context:
space:
mode:
Diffstat (limited to 'npc/custom/etc')
-rw-r--r--npc/custom/etc/airplane.txt442
-rw-r--r--npc/custom/etc/bank.txt119
-rw-r--r--npc/custom/etc/bank_kafra.txt116
-rw-r--r--npc/custom/etc/blackjack.txt347
-rw-r--r--npc/custom/etc/floating_rates.txt43
-rw-r--r--npc/custom/etc/lottery.txt454
-rw-r--r--npc/custom/etc/marriage.txt937
-rw-r--r--npc/custom/etc/monster_arena.txt897
-rw-r--r--npc/custom/etc/morroc_raceway.txt238
-rw-r--r--npc/custom/etc/mvp_arena.txt284
-rw-r--r--npc/custom/etc/penal_servitude.txt193
-rw-r--r--npc/custom/etc/quest_warper.txt1692
-rw-r--r--npc/custom/etc/rpsroulette.txt286
-rw-r--r--npc/custom/etc/shifty_assassin.txt199
-rw-r--r--npc/custom/etc/stock_market.txt791
15 files changed, 7038 insertions, 0 deletions
diff --git a/npc/custom/etc/airplane.txt b/npc/custom/etc/airplane.txt
new file mode 100644
index 000000000..2469b6a24
--- /dev/null
+++ b/npc/custom/etc/airplane.txt
@@ -0,0 +1,442 @@
+//===== rAthena Script =======================================
+//= elRO Airship
+//===== By: ==================================================
+//= Draike, Bluto, Hephaestus
+//===== Current Version: =====================================
+//= 2.2a
+//===== Compatible With: =====================================
+//= rAthena SVN
+//===== Description: =========================================
+//= It's the elRO airship. XD
+//===== Additional Comments: =================================
+//= ALWAYS HAVE AT LEAST TWELVE (12) LOCATIONS AS THE MINIMUM. This is unless you modify to OnMinutes and change the schedule around.
+//= If you have "airplane,103,72,0 warp airs02a 1,1,airplane,102,200" as a warp, remove it. Where it's supposed to go, I have no clue.
+//= 2.1 Removed Duplicates [Silent]
+//= 2.2 Added missing next;'s [Evera]
+//============================================================
+
+payon,153,43,5 script itinsetter -1,{
+ //This is just OnInit stuff to set the hourly intinerary.
+OnInit:
+ deletearray $locationsname$[0],500;
+ deletearray $locationsmap$[0],500;
+ deletearray $locationsx[0],500;
+ deletearray $locationsy[0],500;
+ deletearray $alreadygoneto[0],500;
+ setarray $locationsname$[0],"Airport";
+ setarray $locationsname$[1],"Prontera";
+ setarray $locationsname$[2],"Payon";
+ setarray $locationsname$[3],"Aldebaran";
+ setarray $locationsname$[4],"Alberta";
+ setarray $locationsname$[5],"Geffen";
+ setarray $locationsname$[6],"Morocc";
+ setarray $locationsname$[7],"Glast Heim";
+ setarray $locationsname$[8],"Umbala";
+ setarray $locationsname$[9],"Comodo";
+ setarray $locationsname$[10],"Amatsu";
+ setarray $locationsname$[11],"Niflheim";
+ setarray $locationsname$[12],"Lutie";
+ setarray $locationsname$[13],"Louyang";
+ setarray $locationsname$[14],"Gonryun";
+ setarray $locationsname$[15],"Yuno";
+ setarray $locationsname$[16],"Ant Hell";
+ setarray $locationsname$[17],"Jawaii";
+ setarray $locationsname$[18],"Orc Village";
+ setarray $locationsname$[19],"Mjolnir Coal Mines";
+ setarray $locationsname$[20],"Gefenia Ruins";
+ setarray $locationsname$[21],"Ayothaya";
+ setarray $locationsname$[22],"Lighthalzen";
+ setarray $locationsname$[23],"Juperos";
+ setarray $locationsmap$[0],"airport";
+ setarray $locationsmap$[1],"prt_fild08";
+ setarray $locationsmap$[2],"pay_fild08";
+ setarray $locationsmap$[3],"mjolnir_12";
+ setarray $locationsmap$[4],"pay_fild03";
+ setarray $locationsmap$[5],"gef_fild00";
+ setarray $locationsmap$[6],"moc_fild10";
+ setarray $locationsmap$[7],"glast_01";
+ setarray $locationsmap$[8],"umbala";
+ setarray $locationsmap$[9],"comodo";
+ setarray $locationsmap$[10],"amatsu";
+ setarray $locationsmap$[11],"niflheim";
+ setarray $locationsmap$[12],"xmas";
+ setarray $locationsmap$[13],"louyang";
+ setarray $locationsmap$[14],"gonryun";
+ setarray $locationsmap$[15],"yuno";
+ setarray $locationsmap$[16],"moc_fild04";
+ setarray $locationsmap$[17],"jawaii";
+ setarray $locationsmap$[18],"gef_fild10";
+ setarray $locationsmap$[19],"mjolnir_02";
+ setarray $locationsmap$[20],"gefenia01";
+ setarray $locationsmap$[21],"ayothaya";
+ setarray $locationsmap$[22],"lighthalzen";
+ setarray $locationsmap$[23],"jupe_gate";
+ setarray $locationsx[0],148;
+ setarray $locationsx[1],206;
+ setarray $locationsx[2],159;
+ setarray $locationsx[3],62;
+ setarray $locationsx[4],194;
+ setarray $locationsx[5],50;
+ setarray $locationsx[6],163;
+ setarray $locationsx[7],196;
+ setarray $locationsx[8],187;
+ setarray $locationsx[9],203;
+ setarray $locationsx[10],115;
+ setarray $locationsx[11],132;
+ setarray $locationsx[12],232;
+ setarray $locationsx[13],36;
+ setarray $locationsx[14],82;
+ setarray $locationsx[15],58;
+ setarray $locationsx[16],209;
+ setarray $locationsx[17],248;
+ setarray $locationsx[18],158;
+ setarray $locationsx[19],76;
+ setarray $locationsx[20],98;
+ setarray $locationsx[21],183;
+ setarray $locationsx[22],99;
+ setarray $locationsx[23],46;
+ setarray $locationsy[0],45;
+ setarray $locationsy[1],280;
+ setarray $locationsy[2],92;
+ setarray $locationsy[3],381;
+ setarray $locationsy[4],182;
+ setarray $locationsy[5],365;
+ setarray $locationsy[6],172;
+ setarray $locationsy[7],327;
+ setarray $locationsy[8],98;
+ setarray $locationsy[9],76;
+ setarray $locationsy[10],79;
+ setarray $locationsy[11],241;
+ setarray $locationsy[12],308;
+ setarray $locationsy[13],279;
+ setarray $locationsy[14],96;
+ setarray $locationsy[15],194;
+ setarray $locationsy[16],326;
+ setarray $locationsy[17],175;
+ setarray $locationsy[18],95;
+ setarray $locationsy[19],363;
+ setarray $locationsy[20],21;
+ setarray $locationsy[21],104;
+ setarray $locationsy[22],240;
+ setarray $locationsy[23],19;
+ goto resetgoneto;
+ end;
+
+setrandomitin:
+ set $@settervariable,$@settervariable + 1;
+ setarray $locationn[$@settervariable],rand(0,getarraysize($locationsname$) - 1);
+ if($alreadygoneto[$locationn[$@settervariable]]==1)set $@settervariable,$@settervariable - 1;
+ if($alreadygoneto[$locationn[$@settervariable]]==1)goto setrandomitin;
+ setarray $alreadygoneto[$locationn[$@settervariable]], 1;
+ if($@settervariable<12)goto setrandomitin;
+ end;
+
+resetgoneto:
+ deletearray $alreadygoneto[0], 500;
+ set $@currenttime, 0;
+ goto setrandomitin;
+
+OnMinute00:
+ set $@currenttime, 1;
+ callfunc "F_Itinreset",12,1,2;
+
+OnMinute03:
+ set $destination,250;
+ end;
+
+OnMinute05:
+ set $@currenttime, 2;
+ callfunc "F_Itinreset",1,2,3;
+
+OnMinute08:
+ set $destination,250;
+ end;
+
+OnMinute10:
+ set $@currenttime, 3;
+ callfunc "F_Itinreset",2,3,4;
+
+OnMinute13:
+ set $destination,250;
+ end;
+
+OnMinute15:
+ set $@currenttime, 4;
+ callfunc "F_Itinreset",3,4,5;
+
+OnMinute18:
+ set $destination,250;
+ end;
+
+OnMinute20:
+ set $@currenttime, 5;
+ callfunc "F_Itinreset",4,5,6;
+
+OnMinute23:
+ set $destination,250;
+ end;
+
+OnMinute25:
+ set $@currenttime, 6;
+ callfunc "F_Itinreset",5,6,7;
+
+OnMinute28:
+ set $destination,250;
+ end;
+
+OnMinute30:
+ set $@currenttime, 7;
+ callfunc "F_Itinreset",6,7,8;
+
+OnMinute33:
+ set $destination,250;
+ end;
+
+OnMinute35:
+ set $@currenttime, 8;
+ callfunc "F_Itinreset",7,8,9;
+
+OnMinute38:
+ set $destination,250;
+ end;
+
+OnMinute40:
+ set $@currenttime, 9;
+ callfunc "F_Itinreset",8,9,10;
+
+OnMinute43:
+ set $destination,250;
+ end;
+
+OnMinute45:
+ set $@currenttime, 10;
+ callfunc "F_Itinreset",9,10,11;
+
+OnMinute48:
+ set $destination,250;
+ end;
+
+OnMinute50:
+ set $@currenttime, 11;
+ callfunc "F_Itinreset",10,11,12;
+
+OnMinute53:
+ set $destination,250;
+ end;
+
+OnMinute55:
+ set $@currenttime, 12;
+ callfunc "F_Itinreset",11,12,1;
+
+OnMinute58:
+ set $destination,250;
+ end;
+}
+
+function script F_Porter {
+ if($destination==getarg(0))goto Board;
+ if($destination!=getarg(0))goto Notime;
+
+Board:
+ mes "^FF0000[Porter]^000000";
+ mes "The plane is currently ported. Would you like to board?";
+ next;
+ menu "Yes.",L_Yes,"No.",L_Nope,"View Hourly Itinerary.",Itin;
+
+L_Yes:
+ if($destination!=getarg(0))goto Notime;
+ warp "airplane", 105, 72;
+ specialeffect2 501;
+L_Nope:
+ mes "^FF0000[Porter]^000000";
+ mes "Have a good day. Thank you for traveling with Airship.";
+ close;
+
+Notime:
+ mes "^FF0000[Porter]^000000";
+ if(sex==0) mes "Sorry, ma'am, but the plane currently isn't ported. However, you can view the airplane's hourly itinerary.";
+ if(sex==1) mes "Sorry, sir, but the plane currently isn't ported. However, you can view the airplane's hourly itinerary.";
+ next;
+ menu "Yes, please.",Itin,"No thanks.",L_Nope;
+ close;
+ end;
+
+Itin:
+ mes "^FF0000[Porter]^000000";
+ callfunc "F_Itin";
+}
+
+airport,153,43,5 script Airport Porter 774,{
+ callfunc "F_Porter",0;
+}
+prt_fild08,206,279,5 script Porter#01 774,{
+ callfunc "F_Porter",1;
+}
+gef_fild00,50,364,5 script Porter#02 774,{
+ callfunc "F_Porter",5;
+}
+moc_fild10,163,173,5 script Porter#03 774,{
+ callfunc "F_Porter",6;
+}
+mjolnir_12,61,380,5 script Porter#04 774,{
+ callfunc "F_Porter",3;
+}
+pay_fild08,159,91,5 script Porter#05 774,{
+ callfunc "F_Porter",2;
+}
+pay_fild03,194,181,5 script Porter#06 774,{
+ callfunc "F_Porter",4;
+}
+glast_01,196,326,1 script Porter#07 774,{
+ callfunc "F_Porter",7;
+}
+umbala,188,98,3 script Porter#08 774,{
+ callfunc "F_Porter",8;
+}
+comodo,203,75,8 script Porter#09 774,{
+ callfunc "F_Porter",9;
+}
+amatsu,115,78,8 script Porter#10 774,{
+ callfunc "F_Porter",10;
+}
+niflheim,132,242,5 script Porter#11 774,{
+ callfunc "F_Porter",11;
+}
+xmas,232,309,5 script Porter#12 774,{
+ callfunc "F_Porter",12;
+}
+louyang,35,279,8 script Porter#13 774,{
+ callfunc "F_Porter",13;
+}
+gonryun,82,95,7 script Porter#14 774,{
+ callfunc "F_Porter",14;
+}
+yuno,58,195,4 script Porter#15 774,{
+ callfunc "F_Porter",15;
+}
+moc_fild04,210,326,2 script Porter#16 774,{
+ callfunc "F_Porter",16;
+}
+jawaii,247,174,7 script Porter#17 774,{
+ callfunc "F_Porter",17;
+}
+gef_fild10,159,95,2 script Porter#18 774,{
+ callfunc "F_Porter",18;
+}
+mjolnir_02,76,364,5 script Porter#19 774,{
+ callfunc "F_Porter",19;
+}
+gefenia01,97,22,6 script Porter#20 774,{
+ callfunc "F_Porter",20;
+}
+ayothaya,182,105,5 script Porter#21 774,{
+ callfunc "F_Porter",21;
+}
+lighthalzen,99,241,4 script Porter#22 774,{
+ callfunc "F_Porter",22;
+}
+jupe_gate,46,18,7 script Porter#23 774,{
+ callfunc "F_Porter",23;
+}
+airport,141,43,5 script Itinerary Schedule 837,{
+ mes "^FF0000[Itinerary]^000000";
+ callfunc "F_Itin";
+}
+
+airplane,102,68,5 script Docker 852,{
+ if($destination == 250) goto Nowhere;
+ mes "^FF0000[Airplane Attendant]^000000";
+ if($destination == 250)goto Notime;
+ set @dockky, $destination;
+ if($destination != 250)mes "We are currently docked at "+$locationsname$[$destination]+". Would you like to exit?";
+ next;
+ menu "Yes.",Lyes,"No.",Lnope;
+
+Lyes:
+ if($destination == 250)goto Notime;
+ if($destination != @dockky)goto Notime;
+ warp $locationsmap$[$destination], $locationsx[$destination], $locationsy[$destination];
+ specialeffect2 501;
+
+Lnope:
+ mes "^FF0000[Airplane Attendant]^000000";
+ mes "Have a good day. Thank you for traveling with us.";
+ close;
+
+Notime:
+ mes "^FF0000[Airplane Attendant]^000000";
+ if(sex==0) mes "Sorry, ma'am, but the plane currently isn't docked. Please wait.";
+ if(sex==1) mes "Sorry, sir, but the plane currently isn't docked. Please wait.";
+ close;
+
+Nowhere:
+ mes "^FF0000[Airplane Attendant]^000000";
+ mes "We're currently in air. Please wait until the pilot has announced that we have safely landed.";
+ close;
+}
+
+function script F_Itin {
+ //This is the itinerary's function. It should work well enough.
+ if($@currenttime==0)mes "Try again later. A recent server reboot or rehash has messed the itinerary up for a bit.";
+ if($@currenttime==0)close;
+ if($@currenttime==0)end;
+ set @tempo, 0;
+ set @tempo, $@currenttime - 1;
+ goto seta;
+ close;
+
+seta:
+ set @tempo, @tempo + 1;
+ set @time, gettime(3);
+ set @minutes, 5 * @tempo - 5;
+ set @minutess, 5 * @tempo - 2;
+ if(@minutes<10)set @minutes$, "0" + @minutes;
+ if(@minutes>9)set @minutes$, @minutes;
+ if(@minutess<10)set @minutess$, "0" + @minutess;
+ if(@minutess>9)set @minutess$, @minutess;
+ if(@time<12)set @time$,@time;
+ if(@time==12)set @time$,12;
+ if(@time>12)set @time$,@time - 12;
+ if(@time<12)mes @time$+":"+ @minutes$ + " A.M. - "+@time$+ ":"+ @minutess$ + " A.M. - "+"^FF0000"+$locationsname$[$locationn[@tempo]]+"^000000";
+ if(@time==12)mes @time$+":"+ @minutes$ + " P.M. - "+@time$+ ":"+ @minutess$ + " P.M. -"+"^FF0000 "+$locationsname$[$locationn[@tempo]]+"^000000";
+ if(@time>12 && time<24)mes @time$ +":"+ @minutes$ + " P.M. - "+@time$ + ":"+ @minutess$ + " P.M. -"+"^FF0000 "+$locationsname$[$locationn[@tempo]]+"^000000";
+ if(@time==24)mes @time$+":"+ @minutes$ + " A.M. - "+@time$+ ":"+ @minutess$ + " A.M. -"+"^FF0000 "+$locationsname$[$locationn[@tempo]]+"^000000";
+ if(@tempo<12)goto seta;
+ set @tempo, 0;
+ goto setb;
+
+setb:
+ if($@currenttime - 1==@tempo)goto setc;
+ set @tempo, @tempo + 1;
+ set @time, gettime(3) + 1;
+ set @minutes, 5 * @tempo - 5;
+ set @minutess, 5 * @tempo - 2;
+ if(@minutes<10)set @minutes$, "0" + @minutes;
+ if(@minutes>9)set @minutes$, @minutes;
+ if(@minutess<10)set @minutess$, "0" + @minutess;
+ if(@minutess>9)set @minutess$, @minutess;
+ if(@time<12)set @time$,@time;
+ if(@time==12)set @time$,12;
+ if(@time>12)set @time$,@time - 12;
+ if(@time<12)mes @time$+":"+ @minutes$ + " A.M. - "+@time$+ ":"+ @minutess$ + " A.M. - "+"^FF0000"+$locationsname$[$locationn[@tempo]]+"^000000";
+ if(@time==12)mes @time$+":"+ @minutes$ + " P.M. - "+@time$+ ":"+ @minutess$ + " P.M. -"+"^FF0000 "+$locationsname$[$locationn[@tempo]]+"^000000";
+ if(@time>12 && time<24)mes @time$ +":"+ @minutes$ + " P.M. - "+@time$+ ":"+ @minutess$ + " P.M. -"+"^FF0000 "+$locationsname$[$locationn[@tempo]]+"^000000";
+ if(@time==24)mes @time$+":"+ @minutes$ + " A.M. - "+@time$+ ":"+ @minutess$ + " A.M. -"+"^FF0000 "+$locationsname$[$locationn[@tempo]]+"^000000";
+ goto setb;
+
+setc:
+ close;
+ end;
+}
+
+function script F_Itinreset {
+ setarray $alreadygoneto[$locationn[getarg(0)]], 0;
+ goto sest;
+sest:
+ setarray $locationn[getarg(0)],rand(0,getarraysize($locationsname$) - 1);
+ if($alreadygoneto[$locationn[getarg(0)]]==1)goto sest;
+ setarray $alreadygoneto[$locationn[getarg(0)]], 1;
+ set $destination,$locationn[$@currenttime];
+ announce "Pilot: The plane has arrived at "+$locationsname$[$locationn[getarg(1)]]+". Departure to "+ $locationsname$[$locationn[getarg(2)]] + " is in 3 minutes.",16;
+ end;
+}
diff --git a/npc/custom/etc/bank.txt b/npc/custom/etc/bank.txt
new file mode 100644
index 000000000..ed514c901
--- /dev/null
+++ b/npc/custom/etc/bank.txt
@@ -0,0 +1,119 @@
+//===== rAthena Script =======================================
+//= Banker Script
+//===== By: ==================================================
+//= Syrus22 (1.0)
+//===== Current Version: =====================================
+//= 2.0
+//===== Compatible With: =====================================
+//= Any rAthena version with Account variables.
+//===== Description: =========================================
+//= An account wide Banker to store Zeny
+//===== Additional Comments: =================================
+//= Syrus22 - There's an optional transaction fee at the top of
+//= the script. To use it simply change the first set command
+//= to set the cost variable to whatever you want the fee to be.
+//= Version 2.0: Optimized and brought the script up to standard. [Jguy]
+//============================================================
+
+prontera,132,217,5 script Banker 109,{
+set @cost,500;
+mes "[Banker]";
+mes "Welcome to the First Bank of Prontera. How can I help you today?";
+next;
+switch(select("I'd like to make a deposit.:I'd like to make a withdrawl.:What's my current balance?:Cancel")) {
+ case 1:
+ mes "[Banker]";
+ mes "Very well... How much would you like to deposit? The maximum you can deposit at once is 999,999 Zeny.";
+ next;
+ if (@cost > 0) {
+ mes "[Banker]";
+ mes "Oh, and do realize there is a " +@cost + " Zeny charge on all transactions!";
+ next;
+ }
+ input @deposit;
+ if (@deposit < 1) {
+ mes "Make sure you ask me to deposit a real amount.";
+ close;
+ }
+ else if (@deposit > Zeny) {
+ mes "It does not appear like you have the amount of zeny you're trying to deposit!";
+ close;
+ }
+ else if (@deposit > (Zeny - @cost)) {
+ mes "You need " + @cost + " Zeny to cover the transaction fee!";
+ close;
+ }
+ else {
+ set Zeny,Zeny - @deposit;
+ set Zeny,Zeny - @cost;
+ set #bankstorage,#bankstorage + @deposit;
+ mes "[Banker]";
+ mes "Thank you very much... Your zeny is in good hands.";
+ close;
+ }
+
+ case 2:
+ mes "[Banker]";
+ mes "Very well... How much would you like to withdraw? The maximum you can withdraw at one time is 999,999 Zeny";
+ next;
+ if (@cost > 0) {
+ mes "[Banker]";
+ mes "Oh, and do realize there is a " +@cost + " Zeny charge on all transactions!";
+ next;
+ }
+ input @withdrawl;
+ if (@withdrawl < 1) {
+ mes "Please don't play games. I need a real amount to withdraw.";
+ close;
+ }
+ else if (@withdrawl > #bankstorage) {
+ mes "I show you only have ^00FF00" + #bankstorage +"^000000 zeny in your account!";
+ close;
+ }
+ else if ((@cost > Zeny) && ((Zeny + @withdrawl) > @cost)) {
+ mes "[Banker]";
+ mes "You don't have the Zeny for the transaction fee right now. Would you like me to take the fee directly from your withdrawl?";
+ next;
+ switch(select("Yes please.:No, Thanks")){
+ case 1:
+ mes "[Banker]";
+ mes "Removing " + @cost + " from your withdrawl to cover the deposit fee...";
+ set @withdrawl,@withdrawl - @cost;
+ set #bankstorage,#bankstorage - @cost;
+ set @cost,0;
+ next;
+ set Zeny,Zeny - @cost;
+ set Zeny,Zeny + @withdrawl;
+ set #bankstorage,#bankstorage - @withdrawl;
+ mes "[Banker]";
+ mes "There's your Zeny. Have a good day.";
+ close;
+ case 2:
+ mes "[Banker]";
+ mes "Very well... come again soon.";
+ close;
+ }
+ }
+ else {
+ set Zeny,Zeny - @cost;
+ set Zeny,Zeny + @withdrawl;
+ set #bankstorage,#bankstorage - @withdrawl;
+ mes "[Banker]";
+ mes "There's your Zeny. Have a good day.";
+ close;
+ }
+ case 3:
+ mes "[Banker]";
+ mes "Hmmmm let me check some paper work.";
+ next;
+ mes "*Rustle, Rustle*";
+ next;
+ mes "[Banker]";
+ mes "You currently have " + #bankstorage + " Zeny in your account.";
+ close;
+ case 4:
+ mes "[Banker]";
+ mes "Very well... come again soon.";
+ close;
+ }
+}
diff --git a/npc/custom/etc/bank_kafra.txt b/npc/custom/etc/bank_kafra.txt
new file mode 100644
index 000000000..734c129d5
--- /dev/null
+++ b/npc/custom/etc/bank_kafra.txt
@@ -0,0 +1,116 @@
+//===== rAthena Script =======================================
+//= The 2nd Bank of Prontera (with daily 0.01% income!)
+//===== By: ==================================================
+//= Lupus (1.0)
+//===== Current Version: =====================================
+//= 1.2a
+//===== Compatible With: =====================================
+//= rAthena SVN
+//===== Description: =========================================
+//= A bank which has an interest %
+//===== Additional Comments: =================================
+// Look for this formula and setup your Bank daily % interest
+// #kafrabank/1000 = 0.1% of interest per day
+// #kafrabank/100 = 1% of interest per day
+// #kafrabank/10 = 10% of interest per day
+//
+// 1.1 Added log of bank operation -> logmes "some info";
+// 1.2 Set max income to 100,000z. It would help to avoid
+// zeny exploits when you change DATE at your server
+// 1.2a Corrected bad duplicate names. (bugreport:921) [Samuray22]
+//============================================================
+
+- script Bank Clerk::bankg 833,{
+ mes"[Maniss]";
+ mes strcharinfo(0)+", welcome to the 2nd Bank of Prontera!";
+
+ set @kb_int,(gettime(6)*31)+gettime(5); //today's number
+ set @income,0;
+ //calculate %
+ if (#kafrabank<=0 || #kb_int>=@kb_int) goto L_NoIncomeToday;
+ set @income,(#kafrabank/1000)*(@kb_int-#kb_int); //@income == % of the sum
+ //max income constant:
+ if (@income>100000) set @income,100000;
+L_NoIncomeToday:
+ set #kb_int,@kb_int; //reset days timer
+
+ if(#kafrabank==0) mes "We could open you an account.";
+ if(@income>0) mes "Today's income: ^135445" + @income + "^000000 zeny.";
+ set #kafrabank,#kafrabank+@income;
+ if(#kafrabank>0) mes "Your account: ^135445" + #kafrabank + "^000000 zeny.";
+ mes "What would you like?";
+ next;
+ if(#kafrabank==0) menu "-Open an account",-,"-Quit",B_EXIT2;
+ if(#kafrabank>0) menu "-Deposit money",-,"-Withdraw money",M_WITHDRAW,"-Quit",B_EXIT2;
+
+ mes"[Maniss]";
+ mes "Please, tell me how much zeny you would like to deposit.";
+ next;
+ if(input(@kafrabank) == 1) goto L_TOO_BIG_AMOUNT;
+
+ if(@kafrabank<1000) goto L_LESS_1000;
+ if(@kafrabank>zeny) goto L_NOT_ENOUGH;
+ set zeny,zeny-@kafrabank;
+ set #kafrabank,#kafrabank+@kafrabank;
+ mes"[Maniss]";
+ mes "You've made a deposit of ^135445" + @kafrabank + "z^000000.";
+ //we log these zeny operations into the log db
+ logmes "Bank %: " + @income +"z, Deposit: "+ @kafrabank +"z, Final: "+ #kafrabank +"z";
+ goto B_EXIT;
+
+M_WITHDRAW:
+ if(#kafrabank==0) goto L_ZERO_ACCOUNT;
+ mes"[Maniss]";
+ mes "Your account: ^135445" + #kafrabank + "^000000 zeny.";
+ mes "How much zeny would you like to withdraw?";
+ next;
+ if(input(@kafrabank) == 1) goto L_TOO_BIG_AMOUNT;
+
+ if(@kafrabank<1) goto B_EXIT2;
+ if(@kafrabank>#kafrabank) goto L_NOT_ENOUGH;
+ set #kafrabank,#kafrabank-@kafrabank;
+ set zeny,zeny+@kafrabank;
+ mes"[Maniss]";
+ mes "Here is your ^135445" + @kafrabank + "z^000000, put your sign here...";
+ //we log these zeny operations into the log db
+ logmes "Bank %: " + @income +"z, Withdraw: "+ @kafrabank +"z, Final: "+ #kafrabank +"z";
+ goto B_EXIT;
+
+L_NOT_ENOUGH:
+ mes"[Maniss]";
+ mes "You don't have enough zeny for this operation.";
+ next;
+ goto B_EXIT2;
+
+L_ZERO_ACCOUNT:
+ mes"[Maniss]";
+ mes "You don't have any zeny on your account!";
+ next;
+ goto B_EXIT2;
+
+L_TOO_BIG_AMOUNT:
+ mes"[Maniss]";
+ mes "Sorry. The maximum deposit you can make on a time is 10,000,000 zeny.";
+ next;
+ goto B_EXIT2;
+
+L_LESS_1000:
+ mes"[Maniss]";
+ mes "We're sorry, the minimum amount of zeny you can deposit is 1,000 zeny.";
+ next;
+ goto B_EXIT2;
+
+B_EXIT:
+ mes "Very well... Come again soon!";
+ next;
+
+B_EXIT2:
+ mes"[Maniss]";
+ mes "Thank you for using our Bank Service. We hope to see you again soon.";
+ close;
+}
+
+prontera,131,190,1 duplicate(bankg) Bank Clerk#1-1 833
+geffen,125,73,3 duplicate(bankg) Bank Clerk#2-1 833
+izlude,145,107,1 duplicate(bankg) Bank Clerk#3-1 833
+morocc,147,84,7 duplicate(bankg) Bank Clerk#4-1 833
diff --git a/npc/custom/etc/blackjack.txt b/npc/custom/etc/blackjack.txt
new file mode 100644
index 000000000..951af3f68
--- /dev/null
+++ b/npc/custom/etc/blackjack.txt
@@ -0,0 +1,347 @@
+//===== rAthena Script =======================================
+//= Black Jack
+//===== By: ==================================================
+//= kobra_k88
+//===== Current Version: =====================================
+//= 1.0
+//===== Compatible With: =====================================
+//= rAthena SVN
+//===== Description: =========================================
+//= Black Jack card game. Gameplay based off standard casino
+//= black jack rules. Dealer must have at least 17 to stay and will
+//= automatically stay at 17 and up. Player must have at least
+//= 13 to stay. Aces counted as 11 or 1. Option to "Double Down".
+//= Currently does not allow for "insurance", or "splitting"
+//= of pairs.
+//===== Additional Comments: =================================
+//=
+//============================================================
+
+cmd_in02,188,89,1 script Black Jack Dealer 57,{
+ mes "[Dealer]";
+ mes "Hello there! Would you like to play a game of Black Jack?";
+M_Menu:
+ next;
+ menu "What are the rules?",M_0, "I want to play.",L_Play, "No thanks.",M_End;
+
+M_0:
+ mes "[Dealer]";
+ mes "What would you like to know?";
+sM_Menu0:
+ next;
+ menu "The basics.",sM_0a, "Winning and loosing.",sM_0b, "'Double Down'.",sM_0c,
+ "Ace value.",sM_0d, "Nothing.",M_Menu;
+
+sM_0a:
+ mes "[Dealer]";
+ mes "Black Jack is a card game in which the goal is to get 21, or as";
+ mes "close to 21 points as possible, without going over 21.";
+ next;
+ mes "[Dealer]";
+ mes "Before the game starts, the player must make a bet. Once the bet";
+ mes "has been made, both the dealer and the player are dealt 2 cards";
+ mes "each. Depending on what cards you have, you can choose to ^5533FF'stay'^000000,";
+ mes "or you can choose to ^5533FF'pull'^000000.";
+ next;
+ mes "[Dealer]";
+ mes "When you choose to 'stay', you are telling the dealer that you don't";
+ mes "need anymore cards. This allows the dealer to pull if he/she";
+ mes "wants to. In order to stay, you must have ^FF3355at least 13 points^000000. The";
+ mes "dealer can only stay when he/she has^FF3355 17 points or more^000000.";
+ next;
+ mes "[Dealer]";
+ mes "When you choose to 'pull', you are telling the dealer that you want";
+ mes "another card. By pulling more cards you can increase your point";
+ mes "total. As long has you have ^FF3355less than 21^000000 points you can pull a";
+ mes "card from the deck.";
+ goto sM_Menu0;
+sM_0b:
+ mes "[Dealer]";
+ mes "There are 3 ways to win and loose at Black Jack.";
+ next;
+ mes "[Dealer]";
+ mes "1.) At the end of a Black Jack round, if you have more points";
+ mes "than the dealer you will win the round. Conversely if you have";
+ mes "less points than the dealer you will loose.";
+ next;
+ mes "[Dealer]";
+ mes "2.) If you pull a card that makes your point total go over 21 you";
+ mes "will automatically loose the round. This is called a ^5533FF'bust'^000000. If";
+ mes "the dealer busts then you will win the round.";
+ next;
+ mes "[Dealer]";
+ mes "3.) If you have a point total of 21 with the first 2 cards, you";
+ mes "will automatically win the round. This is called a ^5533FF'Black Jack'^000000";
+ mes "and happens when you get an 'Ace' and a '10 valued' card. If the";
+ mes "dealer gets a Black Jack he/she will automatically win the round.";
+ next;
+ mes "[Dealer]";
+ mes "4.) Besides winning and loosing, you can tie with the dealer. If";
+ mes "both you and the dealer have the same point total at the end of a";
+ mes "round, this will result in a tie with no winner and no loss or gain";
+ mes "in money.";
+ next;
+ mes "[Dealer]";
+ mes "This is called a ^5533FF'push'^000000 with the dealer. This also";
+ mes "applies to both you and the dealer having Black Jack at the same";
+ mes "time.";
+ goto sM_Menu0;
+sM_0c:
+ mes "[Dealer]";
+ mes "The 'Double Down' option allows you to double your current bet,";
+ mes "but with the drawback that you will only be able to pull one";
+ mes "additional card. This option is only available at the beggining of";
+ mes "each round.";
+ next;
+ mes "[Dealer]";
+ mes "An example of when doubling down is useful, is when";
+ mes "your first 2 cards give you a point total of 11. You have a good";
+ mes "chance of getting 21 or 20 with the next card that you draw. This";
+ mes "would be a good hand to double down on.";
+ goto sM_Menu0;
+sM_0d:
+ mes "[Dealer]";
+ mes "The 'Ace' card is a unique card in the game of Black Jack because";
+ mes "it can have 2 values. An Ace can be counted as either 11 points,";
+ mes "or just 1 point. For example if you had an Ace and a 4, that would";
+ mes "give you either 15 or 5 points.";
+ next;
+ mes "[Dealer]";
+ mes "If you decided to stay, the Ace would automatically be counted as";
+ mes "11 points to give you 15 points total.";
+ next;
+ mes "[Dealer]";
+ mes "If you had decided to pull and received a 9, the ace would";
+ mes "automatically be counted as 1 point to give you a total of 14";
+ mes "points. If the Ace was counted as 11 points, you would have a";
+ mes "point total over 21 and would have lost.";
+ next;
+ mes "[Dealer]";
+ mes "It is because of the flexibilty you have with the 'Ace' that makes";
+ mes "it the most powerfull card in the game.";
+ goto sM_Menu0;
+M_End:
+ mes "[Dealer]";
+ mes "Feel free to come back anytime";
+ close;
+
+//================
+L_Play:
+ mes "[Dealer]";
+ mes "Please place your bets...";
+ next;
+ menu "2z",M_1a, "10z",M_1b, "20z",M_1c, "100z",M_1d, "Too rich for my blood....",M_End;
+
+M_1a:
+ if(Zeny < 2) goto sL_NotEnuf;
+ set @bet, 2;
+ goto L_Cont0;
+M_1b:
+ if(Zeny < 10) goto sL_NotEnuf;
+ set @bet, 10;
+ goto L_Cont0;
+M_1c:
+ if(Zeny < 20) goto sL_NotEnuf;
+ set @bet, 20;
+ goto L_Cont0;
+M_1d:
+ if(Zeny < 100) goto sL_NotEnuf;
+ set @bet, 100;
+ goto L_Cont0;
+
+sL_NotEnuf:
+ mes "[Dealer]";
+ mes "I'm sorry but you don't have enough zeny to make that bet.";
+ close;
+
+L_Cont0:
+ mes "(the cards are being dealt)";
+ next;
+ deletearray $@card[0],13;
+ set @dealerTurn, 0;
+ set @numP, 0;
+ set @numD, 0;
+ set @pAce, 0;
+ set @dAce, 0;
+ callsub sF_GetCards, @numP, @playCard[@numP], @playCard$[@numP], @pAce;
+ callsub sF_GetCards, @numP, @playCard[@numP], @playCard$[@numP], @pAce;
+ callsub sF_GetCards, @numD, @dealCard[@numD], @dealCard$[@numD], @dAce;
+ callsub sF_GetCards, @numD, @dealCard[@numD], @dealCard$[@numD], @dAce;
+
+//==============
+L_Start:
+ callsub sF_GetTot;
+
+ mes "- Here are the ^FF5533DEALER'S^000000 cards:";
+ if (@numD==2) callsub sF_D2cards;
+ if (@numD==3) callsub sF_D3cards;
+ if (@numD==4) callsub sF_D4cards;
+ if (@numD==5) callsub sF_D5cards;
+ mes " The DEALER has: ^FF5533"+@dealTot+"^000000";
+ mes " ";
+ mes "- Here are ^5533FFYOUR^000000 cards:";
+ if (@numP==2) callsub sF_P2cards;
+ if (@numP==3) callsub sF_P3cards;
+ if (@numP==4) callsub sF_P4cards;
+ if (@numP==5) callsub sF_P5cards;
+ if(@pAce != 1 || @playTot == 21) mes " YOU have: ^5533FF" +@playTot+ "^000000";
+ if(@pAce == 1 && @playTot != 21) mes " You have: ^5533FF" +@playTot+ "^000000, or ^5533FF" +(@playTot-10)+ "^000000";
+ next;
+ if(@playTot==21 && @dealTot==21) goto sL_Push;
+ if(@numP==2 && @playTot == 21) goto sL_Win;
+ if(@numD==2 && @dealTot == 21) goto sL_Lose;
+ if(@playTot > 21) goto sL_Lose;
+ if(@dealTot > 21) goto sL_Win;
+ if(@numP==2 && @dealerTurn==0) menu "Hit me(pull)",M_Hit, "Stay",M_Stay, "Double Down",M_Double;
+ if(@dealerTurn == 0) menu "Hit me(pull)",M_Hit, "Stay",M_Stay;
+
+M_Stay:
+ mes "[Dealer]";
+ if(@playTot < 13) goto sL_PlayToLow;
+ if(@dealTot > 16) mes "The Dealer stays.";
+ if(@dealTot > 16 || @numD == 5) goto L_Check;
+ mes "The Dealer is going to pull";
+ next;
+ callsub sF_GetCards, @numD, @dealCard[@numD], @dealCard$[@numD], @dAce;
+ set @dealerTurn, 1;
+ goto L_Start;
+
+sL_PlayToLow:
+ mes "I'm sorry but you do not have a high enough total to stay. You must pull.";
+ next;
+ goto M_Hit;
+
+M_Hit:
+ if(@numP == 5) goto M_Stay;
+ callsub sF_GetCards, @numP, @playCard[@numP], @playCard$[@numP], @pAce;
+ goto L_Start;
+M_Double:
+ mes "[Dealer]";
+ mes "Player has chosen to Double Down. You're current bet will be";
+ mes "doubled, and you will only be able to pull 1 extra card.";
+ next;
+ set @dealerTurn, 1;
+ set @bet, @bet*2;
+ callsub sF_GetCards, @numP, @playCard[@numP], @playCard$[@numP], @pAce;
+ goto L_Start;
+
+//=============
+L_Check:
+ next;
+ if(@playTot < @dealTot) goto sL_Lose;
+ if(@playTot == @dealTot) goto sL_Push;
+
+sL_Win:
+ mes "[Dealer]";
+ mes "Congratulations, you've won!";
+ next;
+ set Zeny, Zeny + @bet;
+ goto L_Play;
+sL_Lose:
+ mes "[Dealer]";
+ mes "I'm sorry but you've lost.";
+ set Zeny, Zeny - @bet;
+ next;
+ goto L_Play;
+sL_Push:
+ mes "[Dealer]";
+ mes "Its a push. You tied with the Dealer.";
+ next;
+ goto L_Play;
+
+
+//==================================
+ // Sub function for dealing/pulling the cards
+sF_GetCards:
+ set @rnd, rand(1,13);
+ if($@card[@rnd] == 4) goto sF_GetCards;
+ set $@card[@rnd], $@card[@rnd] + 1;
+ set getarg(1), @rnd;
+ if(getarg(1) > 10) set getarg(1), 10;
+ if(getarg(1) == 1 && getarg(3) < 1) set getarg(1), 11;
+ if(getarg(1) == 11) set getarg(3), 1;
+ set getarg(2), " " + getarg(1) + " ";
+ if(@rnd == 10) set getarg(2), getarg(1);
+ if(@rnd == 1) set getarg(2), " A ";
+ if(@rnd == 11) set getarg(2), " J ";
+ if(@rnd == 12) set getarg(2), " Q ";
+ if(@rnd == 13) set getarg(2), " K ";
+ set getarg(0), getarg(0) + 1;
+ return;
+
+//==================================
+ // Sub function for getting the total score for each hand
+sF_GetTot:
+ set @i, 0;
+ set @dealTot, 0;
+ set @playTot, 0;
+
+GetDealTot:
+ set @dealTot, @dealTot + @dealCard[@i];
+ set @i, @i + 1;
+ if(@i < @numD) goto GetDealTot;
+ if(@dAce == 1 && @dealTot > 21) set @dealTot, @dealTot - 10;
+ set @i, 0;
+GetPlayTot:
+ set @playTot, @playTot + @playCard[@i];
+ set @i, @i + 1;
+ if(@i < @numP) goto GetPlayTot;
+ if(@pAce == 1 && @playTot > 21) set @pAce, 2;
+ if(@pAce > 0 && @playTot > 21) set @playTot, @playTot - 10;
+ return;
+
+//=======================================
+ // Sub function for displaying the Cards
+sF_D2cards:
+ mes " .-----. .-----. ";
+ mes " | "+@dealCard$[0]+" | | "+@dealCard$[1]+" | ";
+ mes " '-----' '-----' ";
+ return;
+sF_P2cards:
+ mes " .-----. .-----. ";
+ mes " | "+@playCard$[0]+" | | "+@playCard$[1]+" | ";
+ mes " '-----' '-----' ";
+ return;
+sF_D3cards:
+ mes " .-----. .-----. .-----. ";
+ mes " | "+@dealCard$[0]+" | | "+@dealCard$[1]+" | | "+@dealCard$[2]+" | ";
+ mes " '-----' '-----' '-----' ";
+ return;
+sF_P3cards:
+ mes " .-----. .-----. .-----. ";
+ mes " | "+@playCard$[0]+" | | "+@playCard$[1]+" | | "+@playCard$[2]+" | ";
+ mes " '-----' '-----' '-----' ";
+ return;
+sF_D4cards:
+ mes " .-----. .-----. .-----. ";
+ mes " | "+@dealCard$[0]+" | | "+@dealCard$[1]+" | | "+@dealCard$[2]+" | ";
+ mes " '-----' '-----' '-----' ";
+ mes " .-----. ";
+ mes " | "+@dealCard$[3]+" |";
+ mes " '-----' ";
+ return;
+sF_P4cards:
+ mes " .-----. .-----. .-----. ";
+ mes " | "+@playCard$[0]+" | | "+@playCard$[1]+" | | "+@playCard$[2]+" |";
+ mes " '-----' '-----' '-----' ";
+ mes " .-----. ";
+ mes " | "+@playCard$[3]+" |";
+ mes " '-----' ";
+ return;
+sF_D5cards:
+ mes " .-----. .-----. .-----. ";
+ mes " | "+@dealCard$[0]+" | | "+@dealCard$[1]+" | | "+@dealCard$[2]+" | ";
+ mes " '-----' '-----' '-----' ";
+ mes " .-----. .-----. ";
+ mes " | "+@dealCard$[3]+" | | "+@dealCard$[4]+" | ";
+ mes " '-----' '-----' ";
+ return;
+sF_P5cards:
+ mes " .-----. .-----. .-----. ";
+ mes " | "+@playCard$[0]+" | | "+@playCard$[1]+" | | "+@playCard$[2]+" | ";
+ mes " '-----' '-----' '-----' ";
+ mes " .-----. .-----. ";
+ mes " | "+@playCard$[3]+" | | "+@playCard$[4]+" | ";
+ mes " '-----' '-----' ";
+ return;
+}
diff --git a/npc/custom/etc/floating_rates.txt b/npc/custom/etc/floating_rates.txt
new file mode 100644
index 000000000..daa11878e
--- /dev/null
+++ b/npc/custom/etc/floating_rates.txt
@@ -0,0 +1,43 @@
+//===== rAthena Script =======================================
+//= Floating Server Rates
+//===== By: ==================================================
+//= Lupus
+//===== Current Version: =====================================
+//= 1.0
+//===== Compatible With: =====================================
+//= rAthena SVN
+//===== Description: =========================================
+//= It's a simply example of setbattleflag
+//= This script will change your server rates from 1x to 1.5x every 6 hours
+//= Note: It doesn't affect Card granted drops, MVP & Treasure Chests drops ^_-
+//= It also doesn't affect CARD drops, because they are just 0.01%
+//===== Additional Comments: =================================
+//= You can make incredible scripts with 'setbattleflag'!
+//============================================================
+
+- script FloatingRates -1,{
+OnInit:
+//add any other HOURS
+OnHour00:
+OnHour06:
+OnHour12:
+OnHour18:
+//-------------------
+ set $@brate,rand(100,150);
+ set $@jrate,rand(100,150);
+ set $@drate,rand(100,150);
+ //Base exp
+ setbattleflag("base_exp_rate",$@brate);
+ //Job exp
+ setbattleflag("job_exp_rate",$@jrate);
+ //Drops
+ setbattleflag("item_rate_common",$@drate);
+ setbattleflag("item_rate_heal",$@drate);
+ setbattleflag("item_rate_use",$@drate);
+ setbattleflag("item_rate_equip",$@drate);
+ //we don't change card drops rate, because these values won't change them anyway
+ atcommand "@reloadmobdb";
+
+ announce "Current Rune-Midgard rates are: 1."+($@brate-100)+"x 1."+($@jrate-100)+"x 1."+($@drate-100)+"x",bc_all,0xFF6060;
+ end;
+}
diff --git a/npc/custom/etc/lottery.txt b/npc/custom/etc/lottery.txt
new file mode 100644
index 000000000..7cc9a53f1
--- /dev/null
+++ b/npc/custom/etc/lottery.txt
@@ -0,0 +1,454 @@
+//===== rAthena Script =======================================
+//= Lottery
+//===== By: ==================================================
+//= acky
+//===== Current Version: =====================================
+//= 1.2.1a
+//===== Compatible With: =====================================
+//= rAthena SVN
+//===== Description: =========================================
+//= Daily lottery draw
+//===== Additional Comments: =================================
+//= Numbers drawn daily (Time is configured line 29)
+//= *Added GM-Riggability
+//= *Ability to renew ticket
+//= *Improved interface
+//= *Fixed minor bug where first load didn't work.
+//= 1.2.1a fix due to new script engine
+//============================================================
+
+- script lotterygenerator -1,{
+OnInit:
+ set $L_TicketPrice,4750; // TICKET COST
+ set $L_Prize_Money,5000000; // JACKPOT AMOUNT
+ set $L_Prize_Money_Small,1000000; // SECONDARY PRIZE
+ if ($LID == 0) goto L_GenID;
+ end;
+
+ //Modify for own time
+OnClock2045:
+ // CHECKS IF LOTTERY IS RIGGED
+ if ($L_Rigged == 1) goto L_Rigged_Draw;
+ // GENERATES RANDOM NUMBERS 1-40
+Pick1:
+ set $LW1,rand (1,40);
+
+Pick2:
+ set $LW2,rand (1,40);
+ if ($LW2 == $LW1) goto Pick2;
+
+Pick3:
+ set $LW3,rand (1,40);
+ if ($LW3 == $LW2) goto Pick3;
+ if ($LW3 == $LW1) goto Pick3;
+
+Pick4:
+ set $LW4,rand (1,40);
+ if ($LW4 == $LW2) goto Pick4;
+ if ($LW4 == $LW1) goto Pick4;
+ if ($LW4 == $LW3) goto Pick4;
+
+Pick5:
+ set $LW5,rand (1,40);
+ if ($LW5 == $LW1) goto Pick5;
+ if ($LW5 == $LW2) goto Pick5;
+ if ($LW5 == $LW3) goto Pick5;
+ if ($LW5 == $LW4) goto Pick5;
+
+Pick6:
+ set $LW6,rand (1,40);
+ if ($LW6 == $LW1) goto Pick6;
+ if ($LW6 == $LW2) goto Pick6;
+ if ($LW6 == $LW3) goto Pick6;
+ if ($LW6 == $LW4) goto Pick6;
+ if ($LW6 == $LW5) goto Pick6;
+
+ // BROADCASTS DRAW
+L_Broadcast:
+ Announce "Lottery: Welcome to tonight's lotto draw!",8;
+ Announce "The numbers are as follows: [" + $LW1 + "] [" + $LW2 + "] [" + $LW3 + "] [" + $LW4 + "] [" + $LW5 + "] [" + $LW6 + "]",8;
+ Announce "Congratulations to the winners of tonight!",8;
+
+ // GENERATES DRAW ID CODE
+L_GenID:
+ set $LID2,$LID;
+ // SETS TOMORROW'S ID NUMBER
+ set $LID,rand (100000,999999);
+ end;
+
+ // SETS DRAW TO RIGGED NUMBERS
+L_Rigged_Draw:
+ set $LW1,$LR1;
+ set $LW2,$LR2;
+ set $LW3,$LR3;
+ set $LW4,$LR4;
+ set $LW5,$LR5;
+ set $LW6,$LR6;
+ set $L_Rigged,0;
+ goto L_Broadcast;
+}
+
+prontera,141,182,5 script Lottery 76,{
+L_Begin:
+ mes "[Lottery]";
+ mes "Winning Lotto Numbers ("+$LID2+"):";
+ mes "^0000FF[" + $LW1 + "] [" + $LW2 + "] [" + $LW3 + "] [" + $LW4 + "] [" + $LW5 + "] [" + $LW6 + "]^000000";
+ if ($LID > 99999) mes "Your Ticket ("+#LID+"):";
+ if ($LID > 99999) mes "^FF0000[" + #LW1 + "] [" + #LW2 + "] [" + #LW3 + "] [" + #LW4 + "] [" + #LW5 + "] [" + #LW6 + "]^000000";
+ mes "Next Draw-ID: ^FF0000" + $LID + "^000000.";
+ next;
+ if (getgmlevel() > 90) goto L_GM;
+ menu "Claim Prize",L_Claim,"Buy New Ticket",L_Buy,"Cancel",L_Cancel;
+
+// PURCHASE TICKET
+L_Buy:
+ if (#LID == $LID && #L1 != 0) goto L_DoubleTicket;
+ mes "[Lottery]";
+ mes "Tickets cost ^0000FF" + $L_TicketPrice + "z^000000.";
+ mes "The Jackpot is ^FF0000" + $L_Prize_Money + "z^000000.";
+ next;
+ menu "Buy Ticket",-,"Cancel",L_Cancel;
+ if (zeny < $L_TicketPrice) goto L_NoZeny;
+ set zeny,zeny-$L_TicketPrice;
+ mes "[Lottery]";
+ mes "Would you like your numbers hand picked or computer generated?";
+ next;
+ menu "Computer Generated",L_ComputerGen,"Hand Picked",L_HandPick,"Renew Ticket",L_Renew;
+
+// RENEW LAST TICKET
+L_Renew:
+ if ($LID < 99999) goto L_Invalid;
+ set #LID,$LID;
+ goto L_Confirm2;
+
+L_ComputerGen:
+// SELECTS RANDOM NUMBERS
+ set @L1,0;
+ set @L2,0;
+ set @L3,0;
+ set @L4,0;
+ set @L5,0;
+ set @L6,0;
+Pick1:
+ set @L1,rand (1,40);
+Pick2:
+ set @L2,rand (1,40);
+ if (@L2 == @L1) goto Pick2;
+Pick3:
+ set @L3,rand (1,40);
+ if (@L3 == @L2) goto Pick3;
+ if (@L3 == @L1) goto Pick3;
+Pick4:
+ set @L4,rand (1,40);
+ if (@L4 == @L2) goto Pick4;
+ if (@L4 == @L1) goto Pick4;
+ if (@L4 == @L3) goto Pick4;
+Pick5:
+ set @L5,rand (1,40);
+ if (@L5 == @L1) goto Pick5;
+ if (@L5 == @L2) goto Pick5;
+ if (@L5 == @L3) goto Pick5;
+ if (@L5 == @L4) goto Pick5;
+Pick6:
+ set @L6,rand (1,40);
+ if (@L6 == @L1) goto Pick6;
+ if (@L6 == @L2) goto Pick6;
+ if (@L6 == @L3) goto Pick6;
+ if (@L6 == @L4) goto Pick6;
+ if (@L6 == @L5) goto Pick6;
+ mes "[Lottery]";
+ mes "The computer has selected the following numbers:";
+ mes "^0000FF" + @L1 + " " + @L2 + " " + @L3 + " " + @L4 + " " + @L5 + " " + @L6 + "^000000";
+ next;
+ menu "Confirm",L_Confirm,"Re-Generate",L_ComputerGen;
+
+// HAND PICK LOTTERY NUMBERS
+L_HandPick:
+ mes "[Lottery]";
+ mes "Please pick your numbers (1-40):";
+ set @L1,0;
+ set @L2,0;
+ set @L3,0;
+ set @L4,0;
+ set @L5,0;
+ set @L6,0;
+Input1:
+ input @L1;
+ if (@L1 < 1 || @L1 > 40) goto Input1;
+ mes @L1;
+Input2:
+ input @L2;
+ if (@L2 < 1 || @L2 > 40) goto Input2;
+ if (@L2 == @L1) goto Input2;
+ mes @L2;
+Input3:
+ input @L3;
+ if (@L3 < 1 || @L3 > 40) goto Input3;
+ if (@L3 == @L1) goto Input3;
+ if (@L3 == @L2) goto Input3;
+ mes @L3;
+Input4:
+ input @L4;
+ if (@L4 < 1 || @L4 > 40) goto Input4;
+ if (@L4 == @L1) goto Input4;
+ if (@L4 == @L2) goto Input4;
+ if (@L4 == @L3) goto Input4;
+ mes @L4;
+Input5:
+ input @L5;
+ if (@L5 < 1 || @L5 > 40) goto Input5;
+ if (@L5 == @L1) goto Input5;
+ if (@L5 == @L2) goto Input5;
+ if (@L5 == @L3) goto Input5;
+ if (@L5 == @L4) goto Input5;
+ mes @L5;
+Input6:
+ input @L6;
+ if (@L6 < 1 || @L6 > 40) goto Input6;
+ if (@L6 == @L1) goto Input6;
+ if (@L6 == @L2) goto Input6;
+ if (@L6 == @L3) goto Input6;
+ if (@L6 == @L4) goto Input6;
+ if (@L6 == @L5) goto Input6;
+ mes @L6;
+ next;
+ mes "[Lottery]";
+ mes "Your numbers are:";
+ mes "^0000FF" + @L1 + " " + @L2 + " " + @L3 + " " + @L4 + " " + @L5 + " " + @L6 + "^000000";
+ next;
+ menu "Confirm",L_Confirm,"Re-Pick",L_HandPick;
+
+L_Confirm:
+ set #LW1,@L1;
+ set #LW2,@L2;
+ set #LW3,@L3;
+ set #LW4,@L4;
+ set #LW5,@L5;
+ set #LW6,@L6;
+ set #LID,$LID;
+L_Confirm2:
+ mes "[Lottery]";
+ mes "The live broadcasted draw is at 9pm.";
+ mes "You can claim your ticket between then and the next draw.";
+ next;
+ mes "[Lottery]";
+ mes "Good luck!";
+ close;
+
+L_Claim:
+ // CHECKS TICKET VALIDILITY
+ if (#LID != $LID2) goto L_Invalid;
+ // CHECKS HOW MANY NUMBERS MATCHED
+ set @LPrize,0;
+ if (#LW1 == $LW1) set @LPrize,@LPrize+1;
+ if (#LW1 == $LW2) set @LPrize,@LPrize+1;
+ if (#LW1 == $LW3) set @LPrize,@LPrize+1;
+ if (#LW1 == $LW4) set @LPrize,@LPrize+1;
+ if (#LW1 == $LW5) set @LPrize,@LPrize+1;
+ if (#LW1 == $LW6) set @LPrize,@LPrize+1;
+ if (#LW2 == $LW1) set @LPrize,@LPrize+1;
+ if (#LW2 == $LW2) set @LPrize,@LPrize+1;
+ if (#LW2 == $LW3) set @LPrize,@LPrize+1;
+ if (#LW2 == $LW4) set @LPrize,@LPrize+1;
+ if (#LW2 == $LW5) set @LPrize,@LPrize+1;
+ if (#LW2 == $LW6) set @LPrize,@LPrize+1;
+ if (#LW3 == $LW1) set @LPrize,@LPrize+1;
+ if (#LW3 == $LW2) set @LPrize,@LPrize+1;
+ if (#LW3 == $LW3) set @LPrize,@LPrize+1;
+ if (#LW3 == $LW4) set @LPrize,@LPrize+1;
+ if (#LW3 == $LW5) set @LPrize,@LPrize+1;
+ if (#LW3 == $LW6) set @LPrize,@LPrize+1;
+ if (#LW4 == $LW1) set @LPrize,@LPrize+1;
+ if (#LW4 == $LW2) set @LPrize,@LPrize+1;
+ if (#LW4 == $LW3) set @LPrize,@LPrize+1;
+ if (#LW4 == $LW4) set @LPrize,@LPrize+1;
+ if (#LW4 == $LW5) set @LPrize,@LPrize+1;
+ if (#LW4 == $LW6) set @LPrize,@LPrize+1;
+ if (#LW5 == $LW1) set @LPrize,@LPrize+1;
+ if (#LW5 == $LW2) set @LPrize,@LPrize+1;
+ if (#LW5 == $LW3) set @LPrize,@LPrize+1;
+ if (#LW5 == $LW4) set @LPrize,@LPrize+1;
+ if (#LW5 == $LW5) set @LPrize,@LPrize+1;
+ if (#LW5 == $LW6) set @LPrize,@LPrize+1;
+ if (#LW6 == $LW1) set @LPrize,@LPrize+1;
+ if (#LW6 == $LW2) set @LPrize,@LPrize+1;
+ if (#LW6 == $LW3) set @LPrize,@LPrize+1;
+ if (#LW6 == $LW4) set @LPrize,@LPrize+1;
+ if (#LW6 == $LW5) set @LPrize,@LPrize+1;
+ if (#LW6 == $LW6) set @LPrize,@LPrize+1;
+
+ if (@LPrize == 6) goto LWinBig;
+ if (@LPrize > 3 && @LPrize < 6) goto LWinSmall;
+
+// NO WINNER
+ mes "[Lottery]";
+ mes "Bad luck, it appears you do not hold a winning ticket.";
+ next;
+ mes "[Lottery]";
+ mes "Better luck next time!.";
+ close;
+
+// MATCHED ALL SIX
+LWinBig:
+ mes "[Lottery]";
+ mes "You have matched all six numbers!";
+ mes "Jackpot!";
+ mes "You've won ^0000FF" + $L_Prize_Money + "z^000000.";
+ set zeny,zeny+$L_Prize_Money;
+ Announce "Lottery: " + strcharinfo(0) + " has won the JACKPOT of " + $L_Prize_Money + "z!",8;
+ set #LID,0;
+ close;
+
+// MATCHED AT LEAST 4
+LWinSmall:
+ mes "[Lottery]";
+ mes "You have matched at least 4 numbers!";
+ mes "You've won ^0000FF" + $L_Prize_Money_Small + "z^000000.";
+ set zeny,zeny+$L_Prize_Money_Small;
+ Announce "Lottery: " + strcharinfo(0) + " has won a prize of " + $L_Prize_Money_Small + "z!",8;
+ set #LID,0;
+ close;
+
+// NO ZENY
+L_NoZeny:
+ mes "[Lottery]";
+ mes "You can't afford a lottery ticket.";
+ close;
+
+// INVALID TICKET
+L_Invalid:
+ mes "[Lottery]";
+ mes "I'm sorry but it appears that you have an invalid ticket.";
+ close;
+
+// DOUBLE TICKET
+L_DoubleTicket:
+ mes "[Lottery]";
+ mes "It appears that you already have a ticket for today.";
+ mes "You may only purchase one ticket per draw.";
+ close;
+
+L_Cancel:
+ mes "[Lottery]";
+ mes "Come back soon!";
+ close;
+
+// GM MENU (Lets you manually do draws)
+L_GM:
+ menu "Claim Prize",L_Claim,"Buy New Ticket",L_Buy,"[GM]Do Draw Now",-,"[GM]Rig the Lottery",L_GM_Rig,"Cancel",L_Cancel;
+
+ // CHECKS IF LOTTERY IS RIGGED
+ if ($L_Rigged == 1) goto L_Rigged_Draw;
+ // GENERATES RANDOM NUMBERS 1-40
+GMPick1:
+ set $LW1,rand (1,40);
+
+GMPick2:
+ set $LW2,rand (1,40);
+ if ($LW2 == $LW1) goto GMPick2;
+
+GMPick3:
+ set $LW3,rand (1,40);
+ if ($LW3 == $LW2) goto GMPick3;
+ if ($LW3 == $LW1) goto GMPick3;
+
+GMPick4:
+ set $LW4,rand (1,40);
+ if ($LW4 == $LW2) goto GMPick4;
+ if ($LW4 == $LW1) goto GMPick4;
+ if ($LW4 == $LW3) goto GMPick4;
+
+GMPick5:
+ set $LW5,rand (1,40);
+ if ($LW5 == $LW1) goto GMPick5;
+ if ($LW5 == $LW2) goto GMPick5;
+ if ($LW5 == $LW3) goto GMPick5;
+ if ($LW5 == $LW4) goto GMPick5;
+
+GMPick6:
+ set $LW6,rand (1,40);
+ if ($LW6 == $LW1) goto GMPick6;
+ if ($LW6 == $LW2) goto GMPick6;
+ if ($LW6 == $LW3) goto GMPick6;
+ if ($LW6 == $LW4) goto GMPick6;
+ if ($LW6 == $LW5) goto GMPick6;
+
+// BROADCASTS DRAW
+L_Broadcast:
+ Announce "Lottery: Welcome to the special GM's lotto draw!",8;
+ Announce "The numbers are as follows: [" + $LW1 + "] [" + $LW2 + "] [" + $LW3 + "] [" + $LW4 + "] [" + $LW5 + "] [" + $LW6 + "]",8;
+ Announce "Congratulations to the winners!",8;
+
+// GENERATES DRAW ID CODE
+L_GenID:
+ set $LID2,$LID;
+ // SETS TOMORROW'S ID NUMBER
+ set $LID,rand (100000,999999);
+ close;
+
+// SETS DRAW TO RIGGED NUMBERS
+L_Rigged_Draw:
+ set $LW1,$LR1;
+ set $LW2,$LR2;
+ set $LW3,$LR3;
+ set $LW4,$LR4;
+ set $LW5,$LR5;
+ set $LW6,$LR6;
+ set $L_Rigged,0;
+ goto L_Broadcast;
+
+// ALLOWS GM TO DO A RIGGED DRAW
+L_GM_Rig:
+ mes "[Lottery]";
+ mes "Please pick your numbers (1-40):";
+ set $LR1,0;
+ set $LR2,0;
+ set $LR3,0;
+ set $LR4,0;
+ set $LR5,0;
+ set $LR6,0;
+GMInput1:
+ Input $LR1;
+ if ($LR1 < 1 || $LR1 > 40) goto GMInput1;
+ mes $LR1;
+GMInput2:
+ Input $LR2;
+ if ($LR2 < 1 || $LR2 > 40) goto GMInput2;
+ if ($LR2 == $LR1) goto GMInput2;
+ mes $LR2;
+GMInput3:
+ Input $LR3;
+ if ($LR3 < 1 || $LR3 > 40) goto GMInput3;
+ if ($LR3 == $LR1) goto GMInput3;
+ if ($LR3 == $LR2) goto GMInput3;
+ mes $LR3;
+GMInput4:
+ Input $LR4;
+ if ($LR4 < 1 || $LR4 > 40) goto GMInput4;
+ if ($LR4 == $LR1) goto GMInput4;
+ if ($LR4 == $LR2) goto GMInput4;
+ if ($LR4 == $LR3) goto GMInput4;
+ mes $LR4;
+GMInput5:
+ Input $LR5;
+ if ($LR5 < 1 || $LR5 > 40) goto GMInput5;
+ if ($LR5 == $LR1) goto GMInput5;
+ if ($LR5 == $LR2) goto GMInput5;
+ if ($LR5 == $LR3) goto GMInput5;
+ if ($LR5 == $LR4) goto GMInput5;
+ mes $LR5;
+GMInput6:
+ Input $LR6;
+ if ($LR6 < 1 || $LR6 > 40) goto GMInput6;
+ if ($LR6 == $LR1) goto GMInput6;
+ if ($LR6 == $LR2) goto GMInput6;
+ if ($LR6 == $LR3) goto GMInput6;
+ if ($LR6 == $LR4) goto GMInput6;
+ if ($LR6 == $LR5) goto GMInput6;
+ mes $LR6;
+ next;
+ mes "[Lottery]";
+ mes "Lottery rigged for next draw.";
+ set $L_Rigged,1;
+ close;
+}
diff --git a/npc/custom/etc/marriage.txt b/npc/custom/etc/marriage.txt
new file mode 100644
index 000000000..0f21c46e7
--- /dev/null
+++ b/npc/custom/etc/marriage.txt
@@ -0,0 +1,937 @@
+//===== rAthena Script =======================================
+//= Wedding Script
+//===== By: ==================================================
+//= AppleGirl, Evera
+//===== Current Version: =====================================
+//= 2.9
+//===== Compatible With: =====================================
+//= rAthena SVN
+//===== Description: =========================================
+//= Fully working wedding script for all kind of weddings
+//===== Additional Comments: =================================
+// 1.1 Lesbian and Gay Weddings [ShadowLady]
+// 2.0 Complete Rewrite [Skotlex]
+// 2.9 Somewhat iRO-official NPC names [DracoRPG]
+//============================================================
+
+// Configuration Variables:
+- script marriage_init -1,{
+OnInit:
+ set $@wed_allow, 0; //If 1, allows same sex marriages.
+ set $@wed_veil, 0; //Set to 0 to disable veil check on the bride
+
+//Id of the item that is traded for the wedding ring (use 0 to disable):
+ set $@wed_ring, 2613;
+
+ set $@wed_groom_reg, 1300000; //Registration cost for the Groom
+ set $@wed_bride_reg, 1200000; //Registration cost for the Bride
+ set $@wed_divorce_fee, 50000; //Divorcing fee
+ set $@wedding_effect, 1; //On who to display the FX: 0: Priest, 1: Bride, 2: Groom
+ end;
+}
+
+// Other Configuration:
+// Line 61,62: Priest location, sprite and name.
+// Line 437,438: Registration location, sprite and name.
+// Line 813,814: Divorcing location, sprite and name.
+
+// Variable Notes:
+// $wed_progress Signals that there is a wedding in progress
+// $wed_groom$ - Groom's name storage
+// $wed_groom_sex - Groom's gender (for same marriage ring giving)
+// $wed_bride$ - Bride's name storage
+// $wed_bride_sex - Groom's gender (for same marriage ring giving)
+// $wed_groom_progress - Notes the progress on the groom's part
+// $wed_bride_progress - Notes the progress on the bride's part
+// 0: Not registered. 1: Registered. 2: Accepted the partner. 3: Ready to
+// Retrieve the ring. 4: Retrieved the ring. 5: All set to be wed. 6: Already
+// a couple.
+// ceremony.
+// $wedding_effect_id - When wedding_effect is enabled, sets the ID of the
+// player to show the effect on.
+// $divorce_progress signals that there is a divorce in progress
+// $@divorcer$ name of the person who requested divorce
+// $@divorcee id of the partner, who has to accept the divorce and pay.
+
+//The Priest - official iRO sprite & in-dialog name (on-map name not confirmed)
+prt_church,100,123,4 script Vomars 60,{
+ set @name$,"Vomars";
+
+ function SF_wed_end;
+ function SF_equip_check;
+ function SF_Groom;
+ function SF_Bride;
+ function SF_AcceptGroom;
+ function SF_AcceptBride;
+ function SF_RetrieveRingM;
+ function SF_RetrieveRingF;
+ function SF_RingsAccepted;
+ function SF_StartCeremony;
+
+ if (getpartnerid() > 0) {
+ mes "["+@name$+"]";
+ mes "You have my blessings, have a wonderful married life.";
+ close;
+ }
+ if ($wed_progress == 0) { // Official iRO dialog
+ mes "["+@name$+"]";
+ mes "You must apply for";
+ mes "marriage with Happy Marry";
+ mes "before you can get married.";
+ mes "Happy Marry will let you know";
+ mes "what else you'll need to do";
+ mes "to prepare for marriage";
+ close;
+ } // End official iRO dialog
+
+ if (strcharinfo(0) == $wed_groom$) {
+ SF_Groom();
+ end;
+ }
+ if (strcharinfo(0) == $wed_bride$) {
+ SF_Bride();
+ end;
+ }
+ mes "["+@name$+"]";
+ if ($wed_groom_progress == 0 || $wed_bride_progress == 0) {
+ mes "There is a wedding being planned. I would appreciate it if you would not interrupt me.";
+ close;
+ }
+ if ($wed_groom_progress == 6) {
+ mes "I am wedding "+$wed_groom$+" and "+$wed_bride$+", and it's already too late to object. Please let me continue.";
+ close;
+ }
+ mes "I am going to wed "+$wed_groom$+" and "+$wed_bride$+", do you have an objection to it?";
+ if (select("Sorry, please go on.","Yes, I actually do.") == 2) {
+ //Abort
+ npctalk "Ladies and gentlemen, "+strcharinfo(0)+" has an objection to the wedding!";
+ SF_wed_end();
+ mes "Why should they not be wed?";
+ input $@msg$;
+ npctalk strcharinfo(0)+"'s objection is: "+$@msg$;
+ emotion e_sob;
+ mes "I see...";
+ } else
+ mes "Very well, go sit and enjoy the ceremony.";
+ close;
+
+function SF_Groom {
+ if ($wed_bride_progress == 0) {
+ mes "["+@name$+"]";
+ mes "Looks like your bride has yet to arrive and register.";
+ close;
+ }
+ if (SF_equip_check() == 0)
+ close;
+
+ switch($wed_groom_progress) {
+ case 1:
+ SF_AcceptBride();
+ break;
+ case 2:
+ mes "["+@name$+"]";
+ mes "I am waiting for your partner to accept you to start the ceremony.";
+ close;
+ case 3:
+ SF_RetrieveRingM();
+ break;
+ case 4:
+ mes "["+@name$+"]";
+ mes "Your partner's wedding ring hasn't been retrieved yet. The ceremony will start as soon as you both have claimed your rings.";
+ close;
+ case 5:
+ mes "["+@name$+"]";
+ SF_StartCeremony();
+ break;
+ default:
+ mes "["+@name$+"]";
+ mes "Please don't interrupt me now.";
+ close;
+ }
+}
+
+function SF_Bride {
+ if ($wed_groom_progress == 0) {
+ mes "["+@name$+"]";
+ mes "Looks like your groom has yet to arrive and register.";
+ close;
+ }
+
+ if (SF_equip_check() == 0)
+ close;
+
+ switch ($wed_bride_progress) {
+ case 1:
+ SF_AcceptGroom();
+ break;
+ case 2:
+ mes "["+@name$+"]";
+ mes "I am waiting for your partner to accept you to start the ceremony.";
+ close;
+ case 3:
+ SF_RetrieveRingF();
+ break;
+ case 4:
+ mes "["+@name$+"]";
+ mes "Your partner's wedding ring hasn't been retrieved yet. The ceremony will start as soon as you both have claimed your rings.";
+ close;
+ case 5:
+ mes "["+@name$+"]";
+ SF_StartCeremony();
+ break;
+ default:
+ mes "["+@name$+"]";
+ mes "Please don't interrupt me now.";
+ close;
+ }
+}
+
+function SF_AcceptGroom {
+ mes "["+@name$+"]";
+ mes $wed_bride$+", "+$wed_groom$+" has requested to be your husband for the rest of your life. Do you accept?";
+ next;
+ switch(select("I need time to think about it.","No, I don't!","Yes, I do!")) {
+ case 1:
+ mes "["+@name$+"]";
+ mes "You what!?";
+ mes "err.. *cough* *cough* very well... come back after you've made up your mind.";
+ emotion e_ag;
+ close;
+ case 2:
+ mes "["+@name$+"]";
+ mes "!!";
+ mes "Ah... err... ehm... okay. You two seem to have some differences to settle first.";
+ close2;
+ emotion e_omg;
+ npctalk "Ladies and gentlemen, "+$wed_bride$+" has rejected to marry "+$wed_groom$+"!";
+ SF_wed_end();
+ break;
+ case 3:
+ set $wed_bride_progress,2;
+ if ($wed_groom_progress == 2) {
+ SF_RingsAccepted();
+ break;
+ }
+ emotion e_ok;
+ mes "["+@name$+"]";
+ mes "After your groom approves, you will be given your rings, the ceremony will begin and you will be officially married.";
+ close;
+ }
+}
+
+function SF_AcceptBride {
+ mes "["+@name$+"]";
+ mes $wed_groom$+", "+$wed_bride$+" has requested to be your wife for the rest of your life. Do you accept?";
+ next;
+ switch(select("I need time to think about it.","No, I don't!","Yes, I do!")) {
+ case 1:
+ mes "["+@name$+"]";
+ mes "You what!?";
+ mes "err.. *cough* *cough* very well... come back after you've made up your mind.";
+ emotion e_ag;
+ close;
+ case 2:
+ mes "["+@name$+"]";
+ mes "!!";
+ mes "Ah... err... ehm... okay. You two seem to have some differences to settle first.";
+ emotion e_omg;
+ close2;
+ npctalk "Ladies and gentlemen, "+$wed_groom$+" has rejected to marry "+$wed_bride$+"!";
+ SF_wed_end();
+ break;
+ case 3:
+ set $wed_groom_progress,2;
+ if ($wed_bride_progress == 2) {
+ SF_RingsAccepted();
+ break;
+ }
+ emotion e_ok;
+ mes "["+@name$+"]";
+ mes "After your bride approves, you will be given your rings, the ceremony will begin and you will be officially married.";
+ close;
+ }
+}
+
+function SF_RingsAccepted {
+ mes "["+@name$+"]";
+ mes "Now that you both have accepted, the wedding will begin. Please come forth, you and your partner, to retrieve your rings.";
+ set $wed_bride_progress,3;
+ set $wed_groom_progress,3;
+ announce $wed_groom$+" and "+$wed_bride$+"'s wedding ceremony will be held at the church!",8;
+ close2;
+ emotion e_lv;
+ npctalk "May the groom and bride please step forward and retrieve their rings?";
+}
+
+function SF_RetrieveRingM {
+ mes "["+@name$+"]";
+ if ($@wed_ring && countitem($@wed_ring) < 1) {
+ mes "What happened to your "+getitemname($@wed_ring)+"? You didn't lose it... did you? We need it to continue with the ceremony!";
+ close;
+ }
+ if ($wed_bride_sex)
+ set @item, 2634; //Groom's wedding ring
+ else
+ set @item, 2635; //Bride's wedding ring
+ if (getnameditem(@item,$wed_groom$) == 0) {
+ mes "You don't seem to have enough space to carry the ring... go free up some space and come back to reclaim your partner's ring.";
+ close;
+ }
+ mes "Here's the wedding ring for your bride.";
+ if ($@wed_ring) delitem $@wed_ring,1;
+ set $wed_groom_progress,4;
+
+ if ($wed_bride_progress == 4)
+ SF_StartCeremony();
+ else {
+ mes "Once your bride retrieves the ring, the ceremony will begin.";
+ close;
+ }
+}
+
+function SF_RetrieveRingF {
+ mes "["+@name$+"]";
+ if ($@wed_ring && countitem($@wed_ring) < 1) {
+ mes "What happened to your "+getitemname($@wed_ring)+"? You didn't lose it... did you? We need it to continue with the ceremony!";
+ close;
+ }
+ if ($wed_groom_sex)
+ set @item, 2634; //Groom's wedding ring
+ else
+ set @item, 2635; //Bride's wedding ring
+
+ if (getnameditem(@item,$wed_bride$) == 0) {
+ mes "You don't seem to have enough space to carry the ring... go free up some space and come back to reclaim your partner's ring.";
+ close;
+ }
+ mes "Here's the wedding ring for your groom.";
+ if ($@wed_ring) delitem $@wed_ring,1;
+ set $wed_bride_progress,4;
+
+ if ($wed_groom_progress == 4)
+ SF_StartCeremony();
+ else {
+ mes "Once your groom retrieves the ring, the ceremony will begin.";
+ close;
+ }
+}
+
+function SF_StartCeremony {
+ mes "I will now start the wedding ceremony, and you will be declared forth husband and wife.";
+ set $wed_bride_progress,5;
+ set $wed_groom_progress,5;
+ set $@msg$,$wed_groom$;
+ if (strcharinfo(0) == $wed_groom$)
+ set $@msg$,$wed_bride$;
+ if (marriage($@msg$) == 0) {
+ next;
+ mes "["+@name$+"]";
+ mes "Where is "+$@msg$+"?? I can't marry you both if one is missing...";
+ close;
+ }
+ set $wed_bride_progress,6;
+ set $wed_groom_progress,6;
+ initnpctimer;
+ close;
+}
+
+OnTimer1000:
+ npctalk "Ladies and Gentlemen, We will now join in holy matrimony these two lovers.";
+ end;
+
+OnTimer5000:
+ npctalk "Now more than ever, will both of your lives be entwined together as so will be your souls.";
+ end;
+
+OnTimer10000:
+ npctalk "You will both honor and cherish each other through the best and worst of times.";
+ end;
+
+OnTimer15000:
+ npctalk "The safety and well being of your other will now also be your responsibility.";
+ end;
+
+OnTimer20000:
+ npctalk "May in sickness or good health, your love burn bright like no force can extinguish it.";
+ end;
+
+OnTimer25000:
+ npctalk "Those here stand witness to these vows bestowed upon you, you must act accordingly to them.";
+ end;
+
+OnTimer30000:
+ npctalk "Understanding that, we are nothing more but mortals on this earth, but this is our triumph.";
+ end;
+
+OnTimer35000:
+ npctalk "We here will now join these two mortal entities, and create an immortal love.";
+ end;
+
+OnTimer40000:
+ npctalk $wed_groom$+", you have accepted to take "+$wed_bride$+" as your lawfully wedded wife,";
+ end;
+
+OnTimer45000:
+ npctalk "and you, "+$wed_bride$+", have accepted take "+$wed_groom$+" as your lawfully wedded husband.";
+ end;
+
+OnTimer50000:
+ npctalk "And as such, now, by the powers vested in me...";
+ end;
+
+OnTimer55000:
+ npctalk "I pronounce you Husband and Wife, you may kiss the bride and exchange rings.";
+ if ($wedding_effect_id && isloggedin($wedding_effect_id))
+ {
+ attachrid($wedding_effect_id);
+ wedding;
+ detachrid;
+ } else
+ wedding;
+ SF_wed_end();
+ stopnpctimer;
+ end;
+
+//Subfunction: Checks that the groom/bride is still wearing their stuff.
+function SF_equip_check {
+ if (sex && getequipid(2) != 7170) {
+ mes "["+@name$+"]";
+ mes "Child, what did you do with your "+getitemname(7170)+"?";
+ emotion e_dots;
+ return 0;
+ }
+ if (sex == 0 && getequipid(2) != 2338) {
+ mes "["+@name$+"]";
+ mes "Child, you are supposed to wear a "+getitemname(2338)+" at all times during the ceremony...";
+ emotion e_dots;
+ return 0;
+ }
+ if (sex == 0 && $@wed_veil && getequipid(1) != 2206) {
+ mes "["+@name$+"]";
+ mes "Child, you can't take off your "+getitemname(2206)+" yet....";
+ emotion e_dots;
+ return 0;
+ }
+ return 1;
+}
+
+//Subfunction: Resets wedding variables.
+function SF_wed_end {
+ set $wed_groom$,"";
+ set $wed_groom_sex, 0;
+ set $wed_bride$,"";
+ set $wed_bride_sex, 0;
+ set $wed_groom_progress,0;
+ set $wed_bride_progress,0;
+ set $wed_progress,0;
+ set $wedding_effect_id,0;
+}
+
+OnInit:
+ if ($wed_groom_progress==6) {
+ SF_wed_end();
+ }
+ end;
+}
+
+//Registration & Status
+prt_church,106,99,3 script Happy Marry 67,{
+ set @name$,"Marry";
+ if (getpartnerid() > 0) {
+ mes "["+@name$+"]";
+ mes "Isn't marriage beautiful?";
+ close;
+ }
+
+ function SF_WedProgress;
+ function SF_Principles;
+ function SF_Procedure;
+ function SF_Register;
+ function SF_TryRegister;
+
+ if ($wed_progress) {
+ SF_WedProgress();
+ end;
+ }
+
+ do {
+ mes "["+@name$+"]";
+ mes "Marriage... is such a beautiful thing.";
+ mes "Would you like to get married with someone?";
+ next;
+ set @menu, select(
+ "I'll be single forever!",
+ "Explain the principles of marriage.",
+ "Explain the marriage procedure.",
+ "I want to get married with someone."
+ );
+ switch (@menu) {
+ case 1: //Quit
+ mes "["+@name$+"]";
+ mes "In that case, enjoy your bachelor's life.";
+ close;
+ case 2: //Principles
+ SF_Principles();
+ break;
+ case 3: //Procedure
+ SF_Procedure();
+ break;
+ case 4: //Register
+ SF_Register();
+ break;
+ }
+ } while (@menu > 1);
+ end;
+
+function SF_Register {
+ if ($@wed_allow) { //Role select
+ mes "["+@name$+"]";
+ mes "Very well, whom would you like to register as?";
+ next;
+ set @submenu, select("Groom","Bride","Cancel");
+ } else if (sex) { //Groom
+ mes "["+@name$+"]";
+ mes "Very well, will you register as the Groom?";
+ next;
+ if (select("Yes","I've changed my mind.")==1)
+ set @submenu, 1;
+ else
+ set @submenu, 3;
+ } else { //Bride
+ mes "["+@name$+"]";
+ mes "Very well, will you register as the Bride?";
+ next;
+ if (select("Yes","I've changed my mind.")==1)
+ set @submenu, 2;
+ else
+ set @submenu, 3;
+ }
+ switch (@submenu) {
+ case 1: //Groom
+ SF_TryRegister(0);
+ set $wed_progress,1;
+ mes "["+@name$+"]";
+ mes "You are now registered as the groom.";
+ mes "Tell your bride to register as soon as possible.";
+ emotion e_hmm;
+ initnpctimer;
+ close;
+ case 2: //Bride
+ SF_TryRegister(1);
+ set $wed_progress,1;
+ mes "["+@name$+"]";
+ mes "You are now registered as the bride.";
+ mes "Tell your groom to register as soon as possible.";
+ emotion e_hmm;
+ initnpctimer;
+ close;
+ default: //Cancel
+ mes "["+@name$+"]";
+ mes "Come back when you are ready.";
+ close;
+ }
+}
+
+function SF_WedProgress {
+ if (strcharinfo(0) == $wed_groom$) {
+ mes "["+@name$+"]";
+ if ($wed_bride_progress > 0)
+ mes "The Priest will handle the rest of the ceremony.";
+ else
+ mes "Tell your bride to register, what is taking so long? Time is running out.";
+ close;
+ }
+ if (strcharinfo(0) == $wed_bride$) {
+ mes "["+@name$+"]";
+ if ($wed_groom_progress > 0)
+ mes "The Priest will handle the rest of the ceremony.";
+ else
+ mes "Tell your groom to register, what is taking so long? Time is running out.";
+ close;
+ }
+ if (($wed_groom_progress == 0) && (sex == 1 || $@wed_allow == 1)) {
+ mes "["+@name$+"]";
+ mes $wed_bride$+" is waiting for the groom to register. Are you the one who came to register as groom?";
+ next;
+ if (select("Yes, I am.","Sorry, you got the wrong person.") == 1) {
+ SF_TryRegister(0);
+ stopnpctimer;
+ set $wed_groom_progress,1;
+ mes "["+@name$+"]";
+ mes "Very well, now go to the Priest to reaffirm your vows and the ceremony will begin.";
+ emotion e_no1;
+ close2;
+ npctalk "Registration finished. "+$wed_groom$+" and "+$wed_bride$+", please reaffirm your vows with the Priest.";
+ emotion e_no1;
+ end;
+ } else {
+ mes "["+@name$+"]";
+ mes "I see. Sorry to have bothered you then.";
+ close;
+ }
+
+ }
+ if (($wed_bride_progress == 0) && (sex == 0 || $@wed_allow == 1)) {
+ mes "["+@name$+"]";
+ mes $wed_groom$+" is waiting for the bride to register. Are you the one who came to register as the bride?";
+ next;
+ if(select("Yes, I am.","Sorry, you got the wrong person.") == 1) {
+ SF_TryRegister(1);
+ stopnpctimer;
+ mes "["+@name$+"]";
+ mes "Very well, now go to the Priest to reaffirm your vows and the ceremony will begin.";
+ emotion e_no1;
+ close2;
+ npctalk "Registration finished. "+$wed_groom$+" and "+$wed_bride$+", please reaffirm your vows with the Priest.";
+ emotion e_no1;
+ end;
+ } else {
+ mes "["+@name$+"]";
+ mes "I see. Sorry to have bothered you then.";
+ close;
+ }
+ }
+ mes "["+@name$+"]";
+ mes "There is a wedding in progress.";
+ mes "Would you like to know the progress of said wedding?";
+ next;
+ if (select("Yes","No") != 1) {
+ mes "["+@name$+"]";
+ mes "Enjoy the wedding.";
+ close;
+ }
+ //Display Progress
+ mes "["+@name$+"]";
+ switch ($wed_groom_progress) {
+ case 0:
+ mes "The groom has not registered yet.";
+ break;
+ case 1:
+ mes "The groom, "+$wed_groom$+", has yet to accept the bride.";
+ break;
+ case 2:
+ mes "The groom, "+$wed_groom$+", is waiting for the bride's acceptance.";
+ break;
+ case 3:
+ mes "The groom, "+$wed_groom$+", has yet to retrieve the ring.";
+ break;
+ case 4:
+ mes "The groom, "+$wed_groom$+", is waiting for the bride to retrieve the ring.";
+ break;
+ }
+ switch ($wed_bride_progress) {
+ case 0:
+ mes "The bride has not registered yet.";
+ break;
+ case 1:
+ mes "The bride, "+$wed_bride$+", has yet to confirm the groom.";
+ break;
+ case 2:
+ mes "The bride, "+$wed_bride$+", is waiting for the groom's acceptance.";
+ break;
+ case 3:
+ mes "The bride, "+$wed_bride$+", has yet to retrieve the ring.";
+ break;
+ case 4:
+ mes "The bride, "+$wed_bride$+", is waiting for the groom to retrieve the ring.";
+ break;
+ case 5:
+ mes "We are just waiting for both "+$wed_groom$+" and "+$wed_bride$+" to be together to marry them.";
+ break;
+ case 6:
+ mes $wed_groom$+" and "+$wed_bride$+"'s wedding ceremony is already well on it's way.";
+ break;
+ }
+ mes "Enjoy the remaining of the wedding.";
+ close;
+}
+
+OnInit:
+ if ($wed_groom_progress + $wed_bride_progress == 1)
+ initnpctimer;
+ end;
+
+OnTimer60000:
+ //Registration failed.
+ if ($wed_bride_progress == 1)
+ set $@msg$, $wed_bride$;
+ else
+ set $@msg$, $wed_groom$;
+
+ npctalk "Registration timed out. Is it that noone wants to marry "+$@msg$+"..?";
+ emotion e_hmm;
+
+ set $wed_groom$,"";
+ set $wed_groom_sex, 0;
+ set $wed_bride$,"";
+ set $wed_bride_sex, 0;
+ set $wed_groom_progress,0;
+ set $wed_bride_progress,0;
+ set $wed_progress,0;
+ stopnpctimer;
+ end;
+
+//Subfunction SF_TryRegister (int bride)
+function SF_TryRegister {
+ set @bride, getarg(0);
+ set @type$, "groom";
+ if (@bride)
+ set @type$, "bride";
+
+ mes "["+@name$+"]";
+ mes "Before registering as "+@type$+", let me check if you meet all the requirements...";
+ next;
+ if (Upper == 2) {
+ mes "["+@name$+"]";
+ mes "Oh dear, you are too young to be thinking of marriage!";
+ emotion e_gasp;
+ close;
+ }
+ if (sex)
+ set @item, 7170;
+ else
+ set @item, 2338;
+
+ if (getequipid(2) != @item) {
+ mes "["+@name$+"]";
+ mes "You should be wearing a "+getitemname(@item)+" if you want to get married.";
+ close;
+ }
+ if (sex == 0 && $@wed_veil && getequipid(1) != 2206) {
+ mes "["+@name$+"]";
+ mes "Where is your "+getitemname(2206)+"? It's a necessary complement to your dress.";
+ close;
+ }
+ if ($@wed_ring && countitem($@wed_ring) < 1) {
+ mes "["+@name$+"]";
+ mes "Where's the ring? You need a "+getitemname($@wed_ring)+" for the ring exchange, dear.";
+ close;
+ }
+ if (@bride)
+ set @cost, $@wed_bride_reg;
+ else
+ set @cost, $@wed_groom_reg;
+
+ if (Zeny < @cost) {
+ mes "["+@name$+"]";
+ mes "I am sorry, but you don't have enough to pay for the registration fee.";
+ mes "Come back once you have collected "+@cost+"z.";
+ close;
+ }
+ set Zeny,Zeny-@cost;
+ sc_start SC_Wedding,3600000000,1; //Start Wedding Effect (SC_WEDDING)
+ if (@bride) {
+ set $wed_bride_progress,1;
+ set $wed_bride$,strcharinfo(0);
+ set $wed_bride_sex, sex;
+ if ($@wedding_effect == 1) //Store account id for effect.
+ set $wedding_effect_id, getcharid(3);
+ } else {
+ set $wed_groom_progress,1;
+ set $wed_groom$,strcharinfo(0);
+ set $wed_groom_sex, sex;
+ if ($@wedding_effect == 2) //Store account id for effect.
+ set $wedding_effect_id, getcharid(3);
+ }
+}
+
+//Explain wedding principles...
+function SF_Principles {
+ mes "["+@name$+"]";
+ mes "Weddings are performed by our local Priest with the intent of promoting love and peace among the loving couples.";
+ next;
+ mes "["+@name$+"]";
+ mes "The proposal must be done with prudence and courtesy, once the wedlocks have been made, they cannot be undone.";
+ next;
+ mes "["+@name$+"]";
+ mes "The two who have been joined by marriage must remain together forever until the day death do them apart.";
+ next;
+ mes "["+@name$+"]";
+ if ($@wed_allow == 1)
+ mes "Altough normally only males can wed females (and viceversa), our local Priest is more open-minded than that and he permits all pairings regardless of gender.";
+ else
+ mes "Males may only wed with females, and females only with males, the church will not consent any other kind of partnerships.";
+ next;
+ mes "["+@name$+"]";
+ mes "If there is a significant other with whom you want to spend the rest of your life with, then don't be shy to propose.";
+ next;
+ mes "["+@name$+"]";
+ mes "I wish for many blessings upon couples who wish to live happily ever after...";
+ next;
+}
+
+//Explain the wedding procedure...
+function SF_Procedure {
+ mes "["+@name$+"]";
+ mes "First of all, both groom and bride must register with me.";
+ next;
+ if ($@wed_allow == 1) {
+ mes "["+@name$+"]";
+ mes "The registration requirements are:";
+ mes "- Males must be wearing a "+getitemname(7170)+".";
+ mes "- Females must be wearing a "+getitemname(2338)+".";
+ if ($@wed_veil) mes "- Females must also wear a "+getitemname(2206)+".";
+ if ($@wed_ring) mes "- Both must own a "+getitemname($@wed_ring)+" each.";
+ if ($@wed_groom_reg > 0) mes "- The registration fee for the groom is "+$@wed_groom_reg+"z.";
+ if ($@wed_bride_reg > 0) mes "- The registration fee for the bride is "+$@wed_bride_reg+"z.";
+ } else {
+ mes "["+@name$+"]";
+ mes "The registration requirements for the groom are:";
+ mes "- To be wearing a "+getitemname(7170)+".";
+ if ($@wed_ring) mes "- To own a "+getitemname($@wed_ring)+".";
+ if ($@wed_groom_reg > 0) mes "- Pay a Registration fee of "+$@wed_groom_reg+"z.";
+ next;
+ mes "["+@name$+"]";
+ mes "The registration requirements for the bride are:";
+ mes "- To be wearing a "+getitemname(2338)+".";
+ if ($@wed_veil) mes "- To be wearing a "+getitemname(2206)+".";
+ if ($@wed_ring) mes "- To own a "+getitemname($@wed_ring)+".";
+ if ($@wed_bride_reg > 0) mes "- Pay a Registration fee of "+$@wed_bride_reg+"z.";
+ }
+ next;
+ mes "["+@name$+"]";
+ mes "I shouldn't need to mention this, but adopted kids are too young to get married.";
+ mes "Both groom and bride must register within a minute of each other, or the wedding will be cancelled. So be sure you both are ready and meet the registration requirements beforehand.";
+ next;
+ mes "["+@name$+"]";
+ mes "After both have registered with me, you have to go pledge your vows to the Priest and accept your registered partner. If for some reason you reject your registered partner, the wedding will be cancelled...";
+ next;
+ mes "["+@name$+"]";
+ mes "If you both accept each other, then the wedding has been decided and the ceremony will begin.";
+ if ($@wed_ring) {
+ mes "But first, you need to get your rings ready.";
+ next;
+ mes "["+@name$+"]";
+ mes "Talk to the priest once more, and he will exchange your "+getitemname($@wed_ring)+" for a wedding ring. After you both have claimed the rings for exchanging, the ceremony will begin.";
+ }
+ next;
+ mes "["+@name$+"]";
+ mes "If there are various couples who desire to marry, you should keep in order, for the Priest can only handle one wedding at a time.";
+ next;
+}
+}
+
+prt_church,94,99,4 script Sister Lisa 79,{
+ set @name$,"Lisa";
+
+ function SF_DivorceEnd;
+ function SF_InProgress;
+
+ if ($@divorce_progress==1) {
+ goto SF_InProgress;
+ end;
+ }
+
+ do {
+ mes "["+@name$+"]";
+ mes "Divorcing can be such a sad event...";
+ if (getpartnerid() == 0) {
+ mes "People shouldn't make shallow vows to others, don't you think?";
+ close;
+ }
+ mes "You wouldn't want to divorce, by any chance?";
+ next;
+ set @menu, select(
+ "I am happy as I am, thank you.",
+ "Explain the divorce.",
+ "Explain Requirements.",
+ "I want to divorce."
+ );
+ switch (@menu) {
+ case 1:
+ mes "["+@name$+"]";
+ mes "Good to hear.";
+ close;
+ case 2: //Explanation
+ mes "["+@name$+"]";
+ mes "Even though it is said that once the wedlocks have been made they cannot be undone, sometimes it is necessary to undo our mistakes from the past..";
+ next;
+ mes "["+@name$+"]";
+ mes "It is sad, but true. If you happen to have married the wrong person, it is possible to divorce, rather than spend the rest of your life with the wrong one.";
+ next;
+ break;
+ case 3: //Requirement
+ mes "["+@name$+"]";
+ mes "In order to file for divorce, I need you both to agree to it.";
+ mes "After you file in for divorce, your spouse has one minute to agree, and then you will both be divorced.";
+ if ($@wed_divorce_fee > 0) mes "The fee is of "+$@wed_divorce_fee+"z and is paid by the person who confirms the divorce, so plan ahead of time how you will divide the costs.";
+ next;
+ break;
+ case 4: //Divorce
+ mes "["+@name$+"]";
+ mes "You should not regret the choices you've made in life.";
+ mes "Are you positively sure about getting divorced?";
+ next;
+ if (select("Wait... I need to think about it.","Absolutely") != 2) {
+ mes "["+@name$+"]";
+ mes "You should think this through.";
+ close;
+ }
+ mes "["+@name$+"]";
+ set $@divorcee,getpartnerid();
+ set $@divorcer$,strcharinfo(0);
+ set $@divorce_progress,1;
+ initnpctimer;
+ mes "Very well, get your partner to confirm, and I will collect the fee for filing the divorce then.";
+ close;
+ }
+ } while (@menu > 1);
+end;
+
+function SF_InProgress {
+ if (strcharinfo(0) == $@divorcer$) {
+ mes "["+@name$+"]";
+ mes "...I am still waiting for your partner to confirm the divorce procedure.";
+ close;
+ }
+ if (getcharid(0) != $@divorcee) {
+ mes "["+@name$+"]";
+ mes "I am in the progress of divorcing "+$@divorcer$+".";
+ mes "Do you know who the spouse is?";
+ close;
+ }
+ //Confirm...
+ mes "["+@name$+"]";
+ mes $@divorcer$+" has asked to divorce you. If you accept, and have the fee of "+$@wed_divorce_fee+"z at hand, I will proceed to divorce you two.";
+ mes "So, should I proceed with the divorce?";
+ next;
+ if (select("I don't want to divorce....","Yes, we have agreed to this.")!=2) {
+ mes "["+@name$+"]";
+ mes "I hope you can work things out.";
+ emotion e_pat;
+ goto SF_DivorceEnd;
+ close;
+ }
+ if (Zeny < $@wed_divorce_fee) {
+ mes "["+@name$+"]";
+ mes "Well, I can't file your divorce because you don't have enough for the fee. Get your partner to lend you some?";
+ close;
+ }
+ if (!(divorce())) {
+ mes "["+@name$+"]";
+ mes "Where has "+$@divorcer$+" gone to? I can't divorce you unless you both are here...";
+ emotion e_swt2;
+ close;
+ }
+ set Zeny,Zeny-$@wed_divorce_fee;
+ announce $@divorcer$+" has just divorced "+strcharinfo(0)+"...", 8;
+ mes "["+@name$+"]";
+ mes "Your divorce has been filed. You are no longer wed.";
+ emotion e_sob;
+ goto SF_DivorceEnd;
+ close;
+}
+
+function SF_DivorceEnd {
+ stopnpctimer;
+ set $@divorce_progress,0;
+ set $@divorcee,0;
+ set $@divorcer$,"";
+}
+
+OnTimer60000:
+ npctalk "Divorce confirmation time's is up. Where did "+$@divorcer$+"'s spouse go...";
+ emotion e_what;
+ SF_DivorceEnd();
+ end;
+}
diff --git a/npc/custom/etc/monster_arena.txt b/npc/custom/etc/monster_arena.txt
new file mode 100644
index 000000000..0b6b1cc96
--- /dev/null
+++ b/npc/custom/etc/monster_arena.txt
@@ -0,0 +1,897 @@
+//===== rAthena Script =======================================
+//= Monster vs Monster
+//===== By: ==================================================
+//= acky
+//===== Current Version: =====================================
+//= 1.2
+//===== Compatible With: =====================================
+//= rAthena SVN
+//===== Description: =========================================
+//= Players train monsters and battle other players.
+//= Experience can be earned and monsters upgraded.
+//===== Additional Comments: =================================
+//= To add monsters, add lines after the commends labled:
+//= '// #. ---Change to Add Monsters--- //'
+//= There are 6 steps to add a monster at the moment.
+//= Added Duel Room
+//= ---------------------------------------------------------
+//= Script is messy! Be careful!
+//= 1.1.2 Changed all gmcommand to atcommand as Poki#3 suggested. [Vicious]
+//= 1.1.3 Removed Duplicate Names [Silent]
+//= 1.1.4 Fixed SummonPad syntax. [KarLaeda]
+//= 1.1.5 Some cleanup & optimization [KarLaeda]
+//= 1.2 Replaced effect numerics with constants. [Samuray22]
+//============================================================
+
+// Entrance //
+prontera,158,193,6 script Monster Arena 702,{
+ mes "[Monster Arena]";
+ mes "Would you like to enter the Monster Arena?";
+ mes "Currently ^FF0000" + getmapusers("gon_test") + "^000000 players";
+ mes "^FF0000Note:^000000 Pecos, Falcons and Carts will be lost on entry.";
+L_Menu:
+ next;
+ menu "Enter",-,"Information",L_Info,"Cancel",L_Exit;
+
+ set @marena,1;
+ savepoint "gon_test",56,99;
+ set @battle,0;
+ warp "gon_test",57,99;
+ close;
+
+L_Exit:
+ mes "[Monster Arena]";
+ mes "Come back any time.";
+ close;
+
+L_Info:
+ mes "[Monster Arena]";
+ mes "You must purchase a pet from the Monster Tamer to start fighting.";
+ next;
+ mes "[Monster Arena]";
+ mes "Then talk to the Usher and tell him you would like to compete.";
+ next;
+ mes "[Monster Arena]";
+ mes "Talk to the referee to summon your monster.";
+ mes "Once your monster has fought, you must talk to the Usher again and choose to spectate.";
+ next;
+ mes "[Monster Arena]";
+ mes "Talk to the Monster Trainer, he will ask you to heal your pet.";
+ next;
+ mes "[Monster Arena]";
+ mes "To do this, click the Nurse repearedly until it says your pet is healed.";
+ next;
+ mes "[Monster Arena]";
+ mes "The more monsters you kill, the more exp you get and the quicker you can upgrade.";
+ next;
+ mes "[Monster Arena]";
+ mes "The stronger your monster is, the longer it will take to summon again.";
+
+ goto L_Menu;
+}
+
+// Monster Summon Function //
+function script monstersummon {
+ // 1. ---Change to Add Monsters--- //
+ if (#monster == 10) summon strcharinfo(0) + "'s Poring",1002, "OnPoringKilled";
+ if (#monster == 20) summon strcharinfo(0) + "'s Fabre",1007, "OnFaberKilled";
+ if (#monster == 30) summon strcharinfo(0) + "'s Lunatic",1063, "OnLunaticKilled";
+ if (#monster == 31) summon strcharinfo(0) + "'s Drops",1113, "OnDropsKilled";
+ if (#monster == 32) summon strcharinfo(0) + "'s Picky",1049, "OnPickyKilled";
+ if (#monster == 40) summon strcharinfo(0) + "'s ChonChon",1011, "OnChonChonKilled";
+ if (#monster == 41) summon strcharinfo(0) + "'s Super Picky",1050, "OnSPickyKilled";
+ if (#monster == 42) summon strcharinfo(0) + "'s Willow",1010, "OnWillowKilled";
+ if (#monster == 50) summon strcharinfo(0) + "'s Roda Frog",1012, "OnRodaKilled";
+ if (#monster == 51) summon strcharinfo(0) + "'s Condor",1009, "OnCondorKilled";
+ if (#monster == 60) summon strcharinfo(0) + "'s Thief Bug Larva",1051, "OnThiefKilled";
+ if (#monster == 70) summon strcharinfo(0) + "'s Savage Babe",1167, "OnSavageKilled";
+ if (#monster == 80) summon strcharinfo(0) + "'s Familiar",1005, "OnFamiliarKilled";
+ if (#monster == 81) summon strcharinfo(0) + "'s Hornet",1004, "OnHornetKilled";
+ if (#monster == 90) summon strcharinfo(0) + "'s Desert Wolf Puppy",1107, "OnPuppyKilled";
+ if (#monster == 91) summon strcharinfo(0) + "'s Spore",1014, "OnSporeKilled";
+ if (#monster == 92) summon strcharinfo(0) + "'s Rocker",1052, "OnRockerKilled";
+ if (#monster == 100) summon strcharinfo(0) + "'s Skeleton",1076, "OnSkeletonKilled";
+ if (#monster == 101) summon strcharinfo(0) + "'s Plankton",1161, "OnPlanktonKilled";
+ if (#monster == 102) summon strcharinfo(0) + "'s Antonio",1247, "OnAntonioKilled";
+ if (#monster == 103) summon strcharinfo(0) + "'s Thief Bug Female",1053, "OnThiefFemaleKilled";
+ close;
+}
+
+// Referee //
+- script monsterreferee 61,{
+ if (@fighting == 1) end;
+ if (@battle == 1) goto L_Start;
+ end;
+
+L_Start:
+ mes "[Referee]";
+ mes "Your monster is:";
+
+ // 2. ---Change to Add Monsters--- //
+ if (#monster == 10) mes "Poring";
+ if (#monster == 20) mes "Faber";
+ if (#monster == 30) mes "Lunatic";
+ if (#monster == 31) mes "Drops";
+ if (#monster == 32) mes "Picky";
+ if (#monster == 40) mes "ChonChon";
+ if (#monster == 41) mes "Super Picky";
+ if (#monster == 42) mes "Willow";
+ if (#monster == 50) mes "Roda Frog";
+ if (#monster == 51) mes "Condor";
+ if (#monster == 60) mes "Thief Bug Larva";
+ if (#monster == 70) mes "Savage Babe";
+ if (#monster == 80) mes "Familiar";
+ if (#monster == 81) mes "Hornet";
+ if (#monster == 90) mes "Desert Wolf Puppy";
+ if (#monster == 91) mes "Spore";
+ if (#monster == 92) mes "Rocker";
+ if (#monster == 100) mes "Skeleton";
+ if (#monster == 101) mes "Plankton";
+ if (#monster == 102) mes "Antonio";
+ if (#monster == 103) mes "Thief Bug Female";
+
+ mes "Would you like to fight?";
+ next;
+ menu "Fight",-,"Cancel",L_Exit;
+
+ set @fighting,1;
+ set #heal,1;
+ set @special,rand (100); // Chance of special summon
+ if (@special == 1) goto Special1;
+ if (@special == 2) goto Special2;
+ if (@special == 3) goto Special3;
+ if (@special == 4) goto Special4;
+ if (@special == 5) goto Special5;
+
+ callfunc "monstersummon";
+ close;
+
+ // Special Summons //
+Special1:
+ summon strcharinfo(0) + "'s Assault Team",1002, "OnPoringKilled";
+ summon strcharinfo(0) + "'s Assault Team",1002, "OnPoringKilled";
+ summon strcharinfo(0) + "'s Assault Team",1002, "OnPoringKilled";
+ summon strcharinfo(0) + "'s Assault Team",1002, "OnPoringKilled";
+ summon strcharinfo(0) + "'s Assault Team",1002, "OnPoringKilled";
+ summon strcharinfo(0) + "'s Assault Team",1002, "OnPoringKilled";
+ summon strcharinfo(0) + "'s Assault Team",1002, "OnPoringKilled";
+ summon strcharinfo(0) + "'s Assault Team",1002, "OnPoringKilled";
+ summon strcharinfo(0) + "'s Assault Team",1002, "OnPoringKilled";
+ summon strcharinfo(0) + "'s Assault Team",1002, "OnPoringKilled";
+ summon strcharinfo(0) + "'s Assault Team",1002, "OnPoringKilled";
+ summon strcharinfo(0) + "'s Assault Team",1002, "OnPoringKilled";
+ summon strcharinfo(0) + "'s Assault Team",1002, "OnPoringKilled";
+ summon strcharinfo(0) + "'s Assault Team",1002, "OnPoringKilled";
+ summon strcharinfo(0) + "'s Assault Team",1002, "OnPoringKilled";
+ summon strcharinfo(0) + "'s Assault Team",1002, "OnPoringKilled";
+ summon strcharinfo(0) + "'s Assault Team",1002, "OnPoringKilled";
+ summon strcharinfo(0) + "'s Assault Team",1002, "OnPoringKilled";
+ summon strcharinfo(0) + "'s Assault Team",1002, "OnPoringKilled";
+ summon strcharinfo(0) + "'s Assault Team",1002, "OnPoringKilled";
+ summon strcharinfo(0) + "'s Assault Team",1002, "OnPoringKilled";
+ summon strcharinfo(0) + "'s Assault Team",1002, "OnPoringKilled";
+ summon strcharinfo(0) + "'s Assault Team",1002, "OnPoringKilled";
+ summon strcharinfo(0) + "'s Assault Team",1002, "OnPoringKilled";
+ close;
+
+Special2:
+ summon strcharinfo(0) + "'s Mastering",1090, "OnSpecialKilled";
+ close;
+
+Special3:
+ summon strcharinfo(0) + "'s Eclipse",1093, "OnSpecialKilled";
+ close;
+
+Special4:
+ summon strcharinfo(0) + "'s Dragon Fly",1091, "OnSpecialKilled";
+ close;
+
+Special5:
+ summon strcharinfo(0) + "'s Toad",1089, "OnSpecialKilled";
+ close;
+
+L_Exit:
+ mes "[Referee]";
+ mes "Alright";
+ close;
+}
+gon_test,56,91,6 duplicate(monsterreferee) Referee#01 61
+
+
+// Usher //
+gon_test,58,94,6 script Usher 86,{
+ set @marena,1;
+ mes "[Usher]";
+ mes "What would you like to do?";
+ next;
+ menu "^0000FFSpectate",L_Spec,"^FF0000Compete^000000",-,"Return to Town",L_Exit,"Cancel",L_Cancel;
+
+ if (#monster == 0) goto L_NoMon;
+ if (#heal == 1) goto L_Heal;
+
+ if (#monster < 40) goto L_Low;
+ if (#monster > 30 && #monster < 80) goto L_Med;
+ if (#monster > 70) goto L_High;
+
+L_Low:
+ menu "Level 1-3",L_1to3,"^FF0000All Levels",L_High;
+ close;
+
+L_Med:
+ menu "Level 4-7",L_4to6,"^FF0000All Levels",L_High;
+ close;
+
+L_High:
+ close2;
+ savepoint "gon_test",56,99;
+ set @battle,1;
+ atcommand strcharinfo(0) + "@option 64 0 64";
+ warp "gon_test",72,87;
+ end;
+
+L_4to6:
+ close2;
+ savepoint "gon_test",56,99;
+ set @battle,1;
+ atcommand strcharinfo(0) + "@option 64 0 64";
+ warp "gon_test",57,86;
+ end;
+
+L_1to3:
+ close2;
+ savepoint "gon_test",56,99;
+ set @battle,1;
+ atcommand strcharinfo(0) + "@option 64 0 64";
+ warp "gon_test",43,87;
+ end;
+
+L_Exit:
+ close2;
+ savepoint "prontera",149,186;
+ set @battle,0;
+ atcommand strcharinfo(0) + "@option 0 0 0";
+ warp "prontera",149,186;
+ end;
+
+L_Spec:
+ close2;
+ savepoint "gon_test",56,99;
+ set @battle,0;
+ atcommand strcharinfo(0) + "@option 0 0 0";
+ warp "gon_test",57,99;
+ end;
+
+L_NoMon:
+ mes "[Usher]";
+ mes "You haven't got a monster, you can only spectate.";
+ close;
+
+L_Heal:
+ mes "[Usher]";
+ mes "You have to heal your monster before you can fight again.";
+ close;
+
+L_Cancel:
+ close;
+}
+
+// Monster Trainer //
+gon_test,52,103,6 script Monster Trainer 87,{
+ mes "[Monster Trainer]";
+ if (#monster != 0) goto L_Mon;
+
+ mes "Welcome to the monster arena, would you like to start training?";
+ next;
+ menu "Yes",-,"No",L_Exit;
+
+ mes "[Monster Trainer]";
+ mes "New trainers may only start with Porings.";
+ mes "They cost 1000z, Would you like to buy one?";
+ next;
+ menu "Yes",-,"No",L_Exit;
+
+ if (zeny < 1000) goto L_NoZeny;
+ set zeny,zeny-1000;
+ set #monster,10;
+ mes "[Monster Trainer]";
+ mes "Congratulations!";
+ mes "When your Poring earns enough experience, talk to me to upgrade.";
+ close;
+
+L_Mon:
+ mes "Welcome back, " + strcharinfo(0) + ".";
+ mes "Your monster has " + #monpoints + " exp points.";
+ next;
+ if (@fighting == 1) goto L_Heal;
+ menu "Upgrade Monster",L_Upgrade,"Sell Experience",L_Sell,"^FF0000Abandon Monster^000000",L_Abandon,"Cancel",L_Exit;
+
+L_Abandon:
+ mes "[Monster Trainer]";
+ mes "Are you sure you want to abandon your monster?";
+ next;
+ menu "Yes",-,"No",L_Exit;
+ set #monster,0;
+ set #monpoints,0;
+ mes "[Monster Trainer]";
+ mes "Monster released into the wild.";
+ close;
+
+L_Sell:
+ mes "[Monster Trainer]";
+ mes "You can sell your monster's experience for 100z each.";
+ next;
+ menu "Sell",-,"Cancel",L_Exit;
+ mes "[Monster Trainer]";
+ mes "You have: ^FF0000" + #monpoints + "^000000 experience points";
+ mes "How many would you like to sell?";
+ next;
+ input @sellexp;
+ if (@sellexp > #monpoints) goto L_NoExp;
+ set #monpoints,#monpoints-@sellexp;
+ set @sellearn,100*@sellexp; // Price of exp
+ set zeny,zeny+@sellearn;
+ mes "[Monster Trainer]";
+ mes "You earned ^0000FF" + @sellearn + "^000000z.";
+ close;
+
+
+L_NoExp:
+ mes "[Monster Trainer]";
+ mes "You do not have enough experience.";
+ next;
+ goto L_Exit;
+
+ // Monster Upgrades //
+L_Upgrade:
+ mes "[Monster Trainer]";
+ // 3. ---Change to Add Monsters - May not be required--- //
+ if (#monster > 1 && #monster < 20) mes "You need 10 exp points to upgrade your monster.";
+ if (#monster > 19 && #monster < 30) mes "You need 20 exp points to upgrade your monster.";
+ if (#monster > 29 && #monster < 40) mes "You need 40 exp points to upgrade your monster.";
+ if (#monster > 39 && #monster < 50) mes "You need 80 exp points to upgrade your monster.";
+ if (#monster > 49 && #monster < 60) mes "You need 160 exp points to upgrade your monster.";
+ if (#monster > 59 && #monster < 70) mes "You need 320 exp points to upgrade your monster.";
+ if (#monster > 69 && #monster < 80) mes "You need 640 exp points to upgrade your monster.";
+ if (#monster > 79 && #monster < 90) mes "You need 1280 exp points to upgrade your monster.";
+ if (#monster > 89 && #monster < 100) mes "You need 2560 exp points to upgrade your monster.";
+ next;
+ menu "Continue",-,"Cancel",L_Exit;
+ mes "[Monster Trainer]";
+
+ // 4. ---Change to Add Monsters - May not be required--- //
+ if (#monster > 1 && #monster < 20 && #monpoints > 9) goto L_Up1;
+ if (#monster > 19 && #monster < 30 && #monpoints > 19) goto L_Up2;
+ if (#monster > 29 && #monster < 40 && #monpoints > 39) goto L_Up3;
+ if (#monster > 39 && #monster < 50 && #monpoints > 79) goto L_Up4;
+ if (#monster > 49 && #monster < 60 && #monpoints > 159) goto L_Up5;
+ if (#monster > 59 && #monster < 70 && #monpoints > 319) goto L_Up6;
+ if (#monster > 69 && #monster < 80 && #monpoints > 639) goto L_Up7;
+ if (#monster > 79 && #monster < 90 && #monpoints > 1279) goto L_Up8;
+ if (#monster > 89 && #monster < 100 && #monpoints > 2559) goto L_Up9;
+
+ mes "Unable to upgrade.";
+ close;
+
+ // 5. ---Change to Add Monsters--- //
+L_Up1:
+ set #monster,20;
+ set #monpoints,#monpoints-10;
+ mes "Upgraded to Fabre!";
+ close;
+
+L_Up2:
+ mes "Which monster would you like to upgrade to?";
+ next;
+ menu "Lunatic",U_Lunatic,"Drops",U_Drops,"Picky",U_Picky;
+
+U_Drops:
+ set #monster,31;
+ set #monpoints,#monpoints-20;
+ mes "[Monster Trainer]";
+ mes "Upgraded to Drops!";
+ close;
+
+U_Picky:
+ set #monster,32;
+ set #monpoints,#monpoints-20;
+ mes "[Monster Trainer]";
+ mes "Upgraded to Picky!";
+ close;
+
+U_Lunatic:
+ set #monster,30;
+ set #monpoints,#monpoints-20;
+ mes "[Monster Trainer]";
+ mes "Upgraded to Lunatic!";
+ close;
+
+L_Up3:
+ mes "Which monster would you like to upgrade to?";
+ next;
+ menu "ChonChon",U_ChonChon,"Super Picky",U_SPicky,"Willow",U_Willow;
+
+U_ChonChon:
+ set #monster,40;
+ set #monpoints,#monpoints-40;
+ mes "[Monster Trainer]";
+ mes "Upgraded to ChonChon!";
+ close;
+
+U_SPicky:
+ set #monster,41;
+ set #monpoints,#monpoints-40;
+ mes "[Monster Trainer]";
+ mes "Upgraded to Super Picky!";
+ close;
+
+U_Willow:
+ set #monster,42;
+ set #monpoints,#monpoints-40;
+ mes "[Monster Trainer]";
+ mes "Upgraded to Willow!";
+ close;
+
+L_Up4:
+ mes "Which monster would you like to upgrade to?";
+ next;
+ menu "Condor",U_Condor,"Roda Frog",U_Roda;
+
+U_Condor:
+ set #monster,51;
+ set #monpoints,#monpoints-80;
+ mes "[Monster Trainer]";
+ mes "Upgraded to Condor!";
+ close;
+
+U_Roda:
+ set #monster,50;
+ set #monpoints,#monpoints-80;
+ mes "[Monster Trainer]";
+ mes "Upgraded to Roda Frog!";
+ close;
+
+L_Up5:
+ set #monster,60;
+ set #monpoints,#monpoints-160;
+ mes "Upgraded to Thief Bug Larva!";
+ close;
+
+L_Up6:
+ set #monster,70;
+ set #monpoints,#monpoints-320;
+ mes "Upgraded to Savage Babe!";
+ close;
+
+L_Up7:
+ mes "Which monster would you like to upgrade to?";
+ next;
+ menu "Familiar",U_Familiar,"Hornet",U_Hornet;
+
+U_Hornet:
+ set #monster,81;
+ set #monpoints,#monpoints-640;
+ mes "[Monster Trainer]";
+ mes "Upgraded to Hornet!";
+ close;
+
+U_Familiar:
+ set #monster,80;
+ set #monpoints,#monpoints-640;
+ mes "[Monster Trainer]";
+ mes "Upgraded to Familiar!";
+ close;
+
+L_Up8:
+ mes "[Monster Trainer]";
+ mes "Which monster would you like to upgrade to?";
+ next;
+ menu "Desert Wolf Puppy",U_Puppy,"Spore",U_Spore,"Rocker",U_Rocker;
+
+U_Spore:
+ set #monster,91;
+ set #monpoints,#monpoints-1280;
+ mes "[Monster Trainer]";
+ mes "Upgraded to Spore!";
+ close;
+
+U_Rocker:
+ set #monster,92;
+ set #monpoints,#monpoints-1280;
+ mes "[Monster Trainer]";
+ mes "Upgraded to Rocker!";
+ close;
+
+U_Puppy:
+ set #monster,90;
+ set #monpoints,#monpoints-1280;
+ mes "[Monster Trainer]";
+ mes "Upgraded to Desert Wolf Puppy!";
+ close;
+
+L_Up9:
+ mes "Which monster would you like to upgrade to?";
+ next;
+ menu "Skeleton",U_Skeleton,"Antonio",U_Antonio,"Plankton",U_Plankton,"Thief Bug Female",U_ThiefFemale;
+
+U_Plankton:
+ set #monster,101;
+ set #monpoints,#monpoints-2560;
+ mes "[Monster Trainer]";
+ mes "Upgraded to Plankton!";
+ close;
+
+U_Antonio:
+ set #monster,102;
+ set #monpoints,#monpoints-2560;
+ mes "[Monster Trainer]";
+ mes "Upgraded to Antonio!";
+ close;
+
+U_ThiefFemale:
+ set #monster,103;
+ set #monpoints,#monpoints-2560;
+ mes "[Monster Trainer]";
+ mes "Upgraded to Thief Bug Female!";
+ close;
+
+U_Skeleton:
+ set #monster,100;
+ set #monpoints,#monpoints-2560;
+ mes "[Monster Trainer]";
+ mes "Upgraded to Skeleton!";
+ close;
+
+L_NoZeny:
+ mes "[Monster Trainer]";
+ mes "You don't have enough zeny!";
+ close;
+
+L_Exit:
+ mes "[Monster Trainer]";
+ mes "Goodbye.";
+ close;
+
+L_Heal:
+ mes "[Monster Trainer]";
+ mes "Your monster needs to heal.";
+ mes "It will heal faster if you click the nurse faster.";
+ set #heal,1;
+ close;
+}
+
+// Kill Trigger //
+// 6/Final. ---Change to Add Monsters--- //
+gon_test,56,91,6 script OnPoringKilled -1,{
+ if (@marena == 0) callfunc "illegalkill";
+ set #monpoints,#monpoints+1;
+ announce "You killed a Poring - Gained 1 exp",19;
+ callfunc "duelkill";
+}
+
+gon_test,56,91,6 script OnFaberKilled -1,{
+ if (@marena == 0) callfunc "illegalkill";
+ set #monpoints,#monpoints+2;
+ announce "You killed a Faber - Gained 2 exp",19;
+ callfunc "duelkill";
+}
+
+gon_test,56,91,6 script OnLunaticKilled -1,{
+ if (@marena == 0) callfunc "illegalkill";
+ set #monpoints,#monpoints+4;
+ announce "You killed a Lunatic - Gained 4 exp",19;
+ callfunc "duelkill";
+}
+
+gon_test,56,91,6 script OnDropsKilled -1,{
+ if (@marena == 0) callfunc "illegalkill";
+ set #monpoints,#monpoints+4;
+ announce "You killed a Drops - Gained 4 exp",19;
+ callfunc "duelkill";
+}
+
+gon_test,56,91,6 script OnPickyKilled -1,{
+ if (@marena == 0) callfunc "illegalkill";
+ set #monpoints,#monpoints+4;
+ announce "You killed a Picky - Gained 4 exp",19;
+ callfunc "duelkill";
+}
+
+gon_test,56,91,6 script OnChonChonKilled -1,{
+ if (@marena == 0) callfunc "illegalkill";
+ set #monpoints,#monpoints+8;
+ announce "You killed a ChonChon - Gained 8 exp",19;
+ callfunc "duelkill";
+}
+
+gon_test,56,91,6 script OnSPickyKilled -1,{
+ if (@marena == 0) callfunc "illegalkill";
+ set #monpoints,#monpoints+8;
+ announce "You killed a Super Picky - Gained 8 exp",19;
+ callfunc "duelkill";
+}
+
+gon_test,56,91,6 script OnWillowKilled -1,{
+ if (@marena == 0) callfunc "illegalkill";
+ set #monpoints,#monpoints+8;
+ announce "You killed a Willow - Gained 8 exp",19;
+ callfunc "duelkill";
+}
+
+gon_test,56,91,6 script OnRodaKilled -1,{
+ if (@marena == 0) callfunc "illegalkill";
+ set #monpoints,#monpoints+16;
+ announce "You killed a Roda Frog - Gained 16 exp",19;
+ callfunc "duelkill";
+}
+
+gon_test,56,91,6 script OnCondorKilled -1,{
+ if (@marena == 0) callfunc "illegalkill";
+ set #monpoints,#monpoints+16;
+ announce "You killed a Condor - Gained 16 exp",19;
+ callfunc "duelkill";
+}
+
+gon_test,56,91,6 script OnThiefKilled -1,{
+ if (@marena == 0) callfunc "illegalkill";
+ set #monpoints,#monpoints+32;
+ announce "You killed a Theif Bug Larva - Gained 32 exp",19;
+ callfunc "duelkill";
+}
+
+gon_test,56,91,6 script OnSavageKilled -1,{
+ if (@marena == 0) callfunc "illegalkill";
+ set #monpoints,#monpoints+64;
+ announce "You killed a Savage Babe - Gained 64 exp",19;
+ callfunc "duelkill";
+}
+
+gon_test,56,91,6 script OnFamiliarKilled -1,{
+ if (@marena == 0) callfunc "illegalkill";
+ set #monpoints,#monpoints+128;
+ announce "You killed a Familiar - Gained 128 exp",19;
+ callfunc "duelkill";
+}
+
+gon_test,56,91,6 script OnHornetKilled -1,{
+ if (@marena == 0) callfunc "illegalkill";
+ set #monpoints,#monpoints+128;
+ announce "You killed a Hornet - Gained 128 exp",19;
+ callfunc "duelkill";
+}
+
+gon_test,56,91,6 script OnPuppyKilled -1,{
+ if (@marena == 0) callfunc "illegalkill";
+ set #monpoints,#monpoints+256;
+ announce "You killed a Desert Wolf Puppy - Gained 256 exp",19;
+ callfunc "duelkill";
+}
+
+gon_test,56,91,6 script OnRockerKilled -1,{
+ if (@marena == 0) callfunc "illegalkill";
+ set #monpoints,#monpoints+256;
+ announce "You killed a Rocker - Gained 256 exp",19;
+ callfunc "duelkill";
+}
+
+gon_test,56,91,6 script OnSporeKilled -1,{
+ if (@marena == 0) callfunc "illegalkill";
+ set #monpoints,#monpoints+256;
+ announce "You killed a Spore - Gained 256 exp",19;
+ callfunc "duelkill";
+}
+
+gon_test,56,91,6 script OnSkeletonKilled -1,{
+ if (@marena == 0) callfunc "illegalkill";
+ set #monpoints,#monpoints+512;
+ announce "You killed a Skeleton - Gained 512 exp",19;
+ callfunc "duelkill";
+}
+
+gon_test,56,91,6 script OnPlanktonKilled -1,{
+ if (@marena == 0) callfunc "illegalkill";
+ set #monpoints,#monpoints+512;
+ announce "You killed a Plankton - Gained 512 exp",19;
+ callfunc "duelkill";
+}
+
+gon_test,56,91,6 script OnAntonioKilled -1,{
+ if (@marena == 0) callfunc "illegalkill";
+ set #monpoints,#monpoints+512;
+ announce "You killed an Antonio - Gained 512 exp",19;
+ callfunc "duelkill";
+}
+
+gon_test,56,91,6 script OnThiefFemaleKilled -1,{
+ if (@marena == 0) callfunc "illegalkill";
+ set #monpoints,#monpoints+512;
+ announce "You killed a Thief Bug Female - Gained 512 exp",19;
+ callfunc "duelkill";
+}
+
+gon_test,56,91,6 script OnSpecialKilled -1,{
+ if (@marena == 0) callfunc "illegalkill";
+ set #monpoints,#monpoints+512;
+ announce "You killed a Special Monster - Gained 1024 exp",19;
+ callfunc "duelkill";
+}
+
+function script duelkill {
+ if (strcharinfo(0) == $@duelist1$ || strcharinfo(0) == $@duelist2$) goto L_Heal;
+ end;
+L_Heal:
+ announce strcharinfo(0) + " won the Duel",1;
+ set @fighting,0;
+ set #heal,0;
+ set @healing,0;
+ end;
+}
+
+function script illegalkill {
+ announce "Illegal Kill by " + strcharinfo(0) + " Detected",1;
+ percentheal -100,-100;
+ end;
+}
+
+// Healer //
+gon_test,55,103,6 script Nurse 90,{
+ if (@battle == 1 || #heal == 0) goto L_NoHeal;
+ if (#heal == 1 && @healing < 100) goto L_Heal; //Total healing required
+ set @fighting,0;
+ set #heal,0;
+ set @healing,0;
+ specialeffect2 EF_VALLENTINE2;
+ announce "Your monster has healed.",19;
+ end;
+
+L_Heal:
+ set @healrate,140 / #monster; //Rate of heal per click
+ set @healing,@healing + @healrate;
+ end;
+
+L_NoHeal:
+ announce "Your monster does not need healing yet.",19;
+ end;
+}
+
+// Warps players //
+gon_test,57,86,5 script Summon Pad 1::SummonPad 111,2,2,{
+ end;
+OnTouch:
+ set @marena,1;
+ warp "gon_test",57,99;
+}
+gon_test,43,87,5 duplicate(SummonPad) Summon Pad 2 111,2,2
+gon_test,72,87,5 duplicate(SummonPad) Summon Pad 3 111,2,2
+
+
+
+// Skill Disabler //
+gon_test mapflag noskill
+
+// Duel Arena //
+gon_test,58,103,5 script Duel Master#01 92,{
+ if ($@duelist1$ == "") set @duel,0;
+ if ($@monster1 == "") set @duel,0;
+ set @marena,1;
+ if (#monster == 0) goto L_NoMon;
+ mes "[Duel Master]";
+ if ($@duel == 1) goto L_Waiting;
+ if ($@duel == 2) goto L_Dueling;
+
+ mes "There are currently no players dueling.";
+ next;
+ menu "Join",-,"Spectate",L_Spec,"Cancel",L_Exit;
+
+ // Player 1 Enters Duel Area //
+ if (#heal == 1) goto L_NeedHeal;
+ if ($@duel == 1) goto L_Duel2;
+ set $@duel,1;
+ if (#monster > 1 && #monster < 20) set $@monster1,1;
+ if (#monster > 19 && #monster < 30) set $@monster1,2;
+ if (#monster > 29 && #monster < 40) set $@monster1,3;
+ if (#monster > 39 && #monster < 50) set $@monster1,4;
+ if (#monster > 49 && #monster < 60) set $@monster1,5;
+ if (#monster > 59 && #monster < 70) set $@monster1,6;
+ if (#monster > 69 && #monster < 80) set $@monster1,7;
+ if (#monster > 79 && #monster < 90) set $@monster1,8;
+ if (#monster > 89 && #monster < 100) set $@monster1,9;
+ if (#monster > 99 && #monster < 110) set $@monster1,10;
+ set $@duelist1$,strcharinfo(0);
+ set @battle,1;
+ announce strcharinfo(0) + " [Monster Level: " + $@monster1 + "] is waiting for a duel",1;
+ atcommand strcharinfo(0) + "@option 64 0 64";
+ warp "gon_test",49,5;
+ close;
+
+L_Waiting:
+ mes "^0000FF " + $@duelist1$ + "^000000 [Monster Level: ^FF0000" + $@monster1 + "^000000]";
+ mes "Is waiting for an opponent";
+ next;
+ menu "Join",-,"Spectate",L_Spec,"Cancel",L_Exit;
+
+ // Player 2 Enters Duel Area //
+ if (#heal == 1) goto L_NeedHeal;
+L_Duel2:
+ if ($@duel == 2) goto L_Spec;
+ set $@duel,2;
+ if (#monster > 1 && #monster < 20) set $@monster2,1;
+ if (#monster > 19 && #monster < 30) set $@monster2,2;
+ if (#monster > 29 && #monster < 40) set $@monster2,3;
+ if (#monster > 39 && #monster < 50) set $@monster2,4;
+ if (#monster > 49 && #monster < 60) set $@monster2,5;
+ if (#monster > 59 && #monster < 70) set $@monster2,6;
+ if (#monster > 69 && #monster < 80) set $@monster2,7;
+ if (#monster > 79 && #monster < 90) set $@monster2,8;
+ if (#monster > 89 && #monster < 100) set $@monster2,9;
+ if (#monster > 99 && #monster < 110) set $@monster2,10;
+ set $@duelist2$,strcharinfo(0);
+ set @battle,1;
+ announce strcharinfo(0) + " [Monster Level: " + $@monster2 + "] has joined the duel",1;
+ atcommand strcharinfo(0) + "@option 64 0 64";
+ warp "gon_test",49,5;
+ close;
+
+L_Dueling:
+ mes "^0000FF" + $@duelist1$ + "^000000 [Monster Level: ^0000FF" + $@monster1 + "^000000]";
+ mes " VS.";
+ mes "^FF0000" + $@duelist2$ + "^000000 [Monster Level: ^FF0000" + $@monster2 + "^000000]";
+ next;
+ menu "Spectate",L_Spec,"Cancel",L_Exit;
+
+L_Spec:
+ set @battle,0;
+ atcommand strcharinfo(0) + "@option 64 0 64";
+ warp "gon_test",49,5;
+ close;
+
+L_Exit:
+ mes "[Duel Master]";
+ mes "Goodbye.";
+ close;
+
+L_NoMon:
+ mes "[Duel Master]";
+ mes "You haven't got a monster, you can't participate.";
+ close;
+
+L_NeedHeal:
+ mes "[Duel Master]";
+ mes "You need to heal before you can join.";
+ close;
+}
+
+// Duel Exit //
+gon_test,42,8,5 script Duel Master#02 92,{
+ mes "[Duel Master]";
+ mes "Would you like to return?";
+ menu "Yes",L_Leave,"No",-;
+ mes "Alright";
+ close;
+
+L_Leave:
+ if ($@duelist1$ == strcharinfo(0)) goto L_Leave1;
+ if ($@duelist2$ == strcharinfo(0)) goto L_Leave2;
+
+L_Leave3:
+ atcommand strcharinfo(0) + "@option 0 0 0";
+ set @battle,0;
+ warp "gon_test",57,99;
+ close;
+
+L_Leave1:
+ set $@duelist1$,$@duelist2$;
+ set $@monster1,$@monster2;
+ set $@duel,$@duel-1;
+ announce strcharinfo(0) + " stopped dueling",1;
+ goto L_Leave3;
+
+L_Leave2:
+ set $@duelist2$,"";
+ set $@monster2,0;
+ set $@duel,$@duel-1;
+ announce strcharinfo(0) + " stopped dueling",1;
+ goto L_Leave3;
+}
+
+gon_test,49,5,5 duplicate(SummonPad) Summon Pad 4 111,2,2
+gon_test,55,8,6 duplicate(monsterreferee) Referee#02 61
diff --git a/npc/custom/etc/morroc_raceway.txt b/npc/custom/etc/morroc_raceway.txt
new file mode 100644
index 000000000..768084173
--- /dev/null
+++ b/npc/custom/etc/morroc_raceway.txt
@@ -0,0 +1,238 @@
+//===== rAthena Script =======================================
+//= Morroc Raceway
+//===== By: ==================================================
+//= acky
+//===== Current Version: =====================================
+//= 1.3
+//===== Compatible With: =====================================
+//= rAthena SVN
+//===== Description: =========================================
+//= Lets players race around Morroc (pvp_y_1-5)
+//===== Additional Comments: =================================
+//= If there are more than 3 players, at least 3 people
+//= must finish before a new race can be started.
+//=
+//= If there are less than 3 players, at least 1 person
+//= must finish before a new race can be started.
+//=
+//= Removed permanent global variables
+//= 1.2 Removed Duplicates [Silent]
+//= 1.3 Replaced effect numerics with constants. [Samuray22]
+//============================================================
+
+//Warps you into race way
+morocc,166,105,6 script Race Girl#01 116,{
+ mes "[Race Girl]";
+ mes "Would you like to visit ^0000FFMorroc Raceway^000000?";
+ next;
+ menu "Yes",L_Warp,"No",-;
+ mes "[Race Girl]";
+ mes "Alright, talk to me again when you want to go.";
+ close;
+L_Warp:
+ warp "pvp_y_1-5",165,256;
+ close;
+}
+
+//Warps you out of raceway
+pvp_y_1-5,169,265,5 script Race Girl#02 116,{
+ mes "[Race Girl]";
+ mes "Welcome to Morroc Raceway!";
+ next;
+ menu "Information",-,"Leave",L_Warp,"Cancel",L_Cancel;
+ mes "[Race Girl]";
+ mes "Someone must click on the Starter NPC to start the race.";
+ next;
+ mes "[Race Girl]";
+ mes "Once the race is started, run around Morroc anti-clockwise.";
+ next;
+ mes "[Race Girl]";
+ mes "You must reach all the checkpoints - No cheating!";
+ close;
+L_Warp:
+ warp "morocc",165,101;
+L_Cancel:
+ mes "[Race Girl]";
+ mes "Come again soon!";
+ close;
+}
+
+//Counts down and starts race
+pvp_y_1-5,145,269,5 script Starter 733,{
+ if ($@race != 0) goto L_Started;
+ if ($@counting != 0) goto L_Started;
+ if ($@racecount == 1) goto L_Started;
+L_Menu:
+ mes "[Race Starter]";
+ mes "Please stay on the Eastern side of me.";
+ menu "Start Race",L_Count,"Cancel",-;
+ close;
+L_Count:
+ set $@counting,1;
+ mes "Counting down...";
+ addtimer 1000, "Starter::OnCount1000";
+ addtimer 2000, "Starter::OnCount2000";
+ addtimer 3000, "Starter::OnCount3000";
+ addtimer 4000, "Starter::OnCount4000";
+ announce strcharinfo(0) + "Started a countdown",1;
+ announce "Get ready to race!",1;
+ close;
+
+OnCount1000:
+ announce "[3]",1;
+ end;
+OnCount2000:
+ announce "[2]",1;
+ end;
+OnCount3000:
+ announce "[1]",1;
+ end;
+OnCount4000:
+ emotion 27;
+ specialeffect EF_CHIMTO;
+ announce "[GO!]",1;
+ set $@race,1;
+ set $@position,0;
+ set $@counting,0;
+ set $@raceid,rand(100000,999999);
+ end;
+
+L_Started:
+ if ((getmapusers("pvp_y_1-5") < 3) && ($@position > 0)) goto L_Menu;
+ if ($@position > 2) goto L_Menu;
+ mes "[Starter]";
+ mes "Race in progress";
+ close;
+
+OnInit:
+ set $@race,0;
+ set $@position,0;
+ set $@racecount,0;
+ end;
+}
+
+//Checkpoint 1
+pvp_y_1-5,144,262,5 script Check Point 1 111,0,5,{
+ end;
+OnTouch:
+ if (@raceid != $@raceid) goto L_Started;
+ if (@race == 6) goto L_Finished;
+ if ($@race == 1) goto L_Started;
+ mes "The race has not started, please move back.";
+ close;
+L_Started:
+ set @race,1;
+ set @raceid,$@raceid;
+ end;
+L_Finished:
+ mes "You have already completed the race.";
+ close;
+}
+
+//Checkpoint 2
+pvp_y_1-5,73,247,5 script Check Point 2 111,6,6,{
+ end;
+OnTouch:
+ if (@race != 1) goto L_Miss;
+ set @race,2;
+ announce "[" + strcharinfo(0) +"] has reached Checkpoint [1]",1;
+ end;
+L_Miss:
+ mes "You have missed a Checkpoint. Please go back.";
+ close;
+}
+
+//Checkpoint 3
+pvp_y_1-5,77,44,5 script Check Point 3 111,6,6,{
+ end;
+OnTouch:
+ if (@race != 2) goto L_Miss;
+ set @race,3;
+ announce "[" + strcharinfo(0) +"] has reached Checkpoint [2]",1;
+ end;
+L_Miss:
+ mes "You have missed a Checkpoint. Please go back.";
+ close;
+}
+
+//Checkpoint 3
+pvp_y_1-5,249,60,5 script Check Point 4 111,6,6,{
+ end;
+OnTouch:
+ if (@race != 3) goto L_Miss;
+ set @race,4;
+ announce "[" + strcharinfo(0) +"] has reached Checkpoint [3]",1;
+ end;
+L_Miss:
+ mes "You have missed a Checkpoint. Please go back.";
+ close;
+}
+
+//Checkpoint 4
+pvp_y_1-5,255,256,5 script Check Point 5 111,6,6,{
+ end;
+OnTouch:
+ if (@race != 4) goto L_Miss;
+ set @race,5;
+ announce "[" + strcharinfo(0) +"] has reached Checkpoint [4]",1;
+ end;
+L_Miss:
+ mes "You have missed a Checkpoint. Please go back.";
+ close;
+}
+
+//Finish Line
+pvp_y_1-5,174,244,5 script Finish Line 111,6,6,{
+ end;
+OnTouch:
+ if (@raceid != $@raceid) goto L_WrongRace;
+ if (@race != 5) goto L_Miss;
+ set @race,6;
+ set $@position,$@position+1;
+ announce "[" + strcharinfo(0) +"] has reached The Finish line! [Position: " + $@position + "]",1;
+ end;
+L_Miss:
+ mes "You have missed a Checkpoint. Please go back.";
+ close;
+L_WrongRace:
+ mes "You are not in this race.";
+ close;
+}
+
+//Check Point Marker Flags
+pvp_y_1-5,144,267,4 script Check Point 1#01 722,{
+ end;
+}
+pvp_y_1-5,144,257,4 script Check Point 1#02 722,{
+ end;
+}
+pvp_y_1-5,70,252,3 script Check Point 2#01 722,{
+ end;
+}
+pvp_y_1-5,77,243,3 script Check Point 2#02 722,{
+ end;
+}
+pvp_y_1-5,81,48,1 script Check Point 3#01 722,{
+ end;
+}
+pvp_y_1-5,72,40,1 script Check Point 3#02 722,{
+ end;
+}
+pvp_y_1-5,244,65,7 script Check Point 4#01 722,{
+ end;
+}
+pvp_y_1-5,252,57,7 script Check Point 4#02 722,{
+ end;
+}
+pvp_y_1-5,259,260,5 script Check Point 5#01 722,{
+ end;
+}
+pvp_y_1-5,251,252,5 script Check Point 5#02 722,{
+ end;
+}
+pvp_y_1-5,174,249,4 script Finish Line#01 722,{
+ end;
+}
+pvp_y_1-5,174,238,4 script Finish Line#02 722,{
+ end;
+}
diff --git a/npc/custom/etc/mvp_arena.txt b/npc/custom/etc/mvp_arena.txt
new file mode 100644
index 000000000..277895d6c
--- /dev/null
+++ b/npc/custom/etc/mvp_arena.txt
@@ -0,0 +1,284 @@
+//===== rAthena Script =======================================
+//= MVP Arena
+//===== By: ==================================================
+//= Darkchild
+//===== Current Version: =====================================
+//= 1.4
+//===== Compatible With: =====================================
+//= rAthena SVN
+//===== Description: =========================================
+//= Rooms containing 16 different MVPs
+//===== Additional Comments: =================================
+//= 1.0 - First version of script
+//= 1.1 - Optimised The MVP arena [massdriller]
+//= 1.2 - NPC in prontera [Silent]
+//= 1.3 - Removed Duplicates
+//= 1.4 - Optimized, text edited [Euphy]
+//============================================================
+
+// Entrance
+prontera,154,197,3 script MVP Warper 768,{
+ mes "[ ^0065DFMVP Warper^000000 ]";
+ mes "Would you like to enter";
+ mes "the MVP Arena?";
+ if (select("Yes!","No thanks.") == 2) close;
+ warp "quiz_00",50,24;
+ close;
+}
+
+// Information
+quiz_00,49,31,4 script MVP Arena Guide 778,{
+ mes "[ ^0065DFMVP Arena Guide^000000 ]";
+ mes "Welcome and behold this sacred place. Here you will find out if you truly have what it takes to call yourself a warrior.";
+ next;
+ switch(select("Information","Heal me!","Return to Prontera","Cancel")) {
+ case 1:
+ mes "[ ^0065DFMVP Arena Guide^000000 ]";
+ mes "There are four Keepers, and each can spawn four different MVPs.";
+ mes "There are eight rooms per Keeper, and sixteen MVPs in total.";
+ close;
+ case 2:
+ specialeffect2 313;
+ percentheal 100,100;
+ close;
+ case 3:
+ warp "prontera",156,179;
+ close;
+ case 4:
+ close;
+ }
+}
+
+// Keepers
+function script Keeper {
+ mes "[ ^0065DF"+strnpcinfo(1)+"^000000 ]";
+ mes "Which arena would you";
+ mes "like to enter?";
+ set .@menu$,"";
+ for(set .@i,1; .@i<9; set .@i,.@i+1)
+ set .@menu$, .@menu$+"Arena "+.@i+" ["+getmapusers("pvp_n_"+.@i+"-"+getarg(0))+"/20]:";
+ set .@i, select(.@menu$);
+ if (getmapusers("pvp_n_"+.@i+"-"+getarg(0))>19) {
+ mes "[ ^0065DF"+strnpcinfo(1)+"^000000 ]";
+ mes "Sorry, this arena is full!";
+ close;
+ }
+ warp "pvp_n_"+.@i+"-"+getarg(0),102,102;
+ close;
+}
+quiz_00,56,31,4 script Alpha MVP 770,{ callfunc "Keeper",2; }
+quiz_00,58,31,4 script Beta MVP 773,{ callfunc "Keeper",3; }
+quiz_00,60,31,4 script Theta MVP 774,{ callfunc "Keeper",4; }
+quiz_00,62,31,4 script Epsilon MVP 776,{ callfunc "Keeper",5; }
+
+// Protectors
+function script Protector {
+ switch(select(""+((getarg(0)=="")?"":"Harder Monsters")+":Heal:Exit")) {
+ case 1:
+ warp getarg(0),102,102;
+ close;
+ case 2:
+ specialeffect2 313;
+ percentheal 100,100;
+ close;
+ case 3:
+ warp "prontera",156,179;
+ close;
+ }
+}
+pvp_n_1-2,100,100,4 script MVP-Protector#01 727,{ callfunc "Protector","pvp_n_2-2"; }
+pvp_n_2-2,100,100,4 script MVP-Protector#02 727,{ callfunc "Protector","pvp_n_3-2"; }
+pvp_n_3-2,100,100,4 script MVP-Protector#03 727,{ callfunc "Protector","pvp_n_4-2"; }
+pvp_n_4-2,100,100,4 script MVP-Protector#04 727,{ callfunc "Protector","pvp_n_5-2"; }
+pvp_n_5-2,100,100,4 script MVP-Protector#05 727,{ callfunc "Protector","pvp_n_6-2"; }
+pvp_n_6-2,100,100,4 script MVP-Protector#06 727,{ callfunc "Protector","pvp_n_7-2"; }
+pvp_n_7-2,100,100,4 script MVP-Protector#07 727,{ callfunc "Protector","pvp_n_8-2"; }
+pvp_n_8-2,100,100,4 script MVP-Protector#08 727,{ callfunc "Protector",""; }
+pvp_n_1-3,100,100,4 script MVP-Protector#09 727,{ callfunc "Protector","pvp_n_2-3"; }
+pvp_n_2-3,100,100,4 script MVP-Protector#10 727,{ callfunc "Protector","pvp_n_3-3"; }
+pvp_n_3-3,100,100,4 script MVP-Protector#11 727,{ callfunc "Protector","pvp_n_4-3"; }
+pvp_n_4-3,100,100,4 script MVP-Protector#12 727,{ callfunc "Protector","pvp_n_5-3"; }
+pvp_n_5-3,100,100,4 script MVP-Protector#13 727,{ callfunc "Protector","pvp_n_6-3"; }
+pvp_n_6-3,100,100,4 script MVP-Protector#14 727,{ callfunc "Protector","pvp_n_7-3"; }
+pvp_n_7-3,100,100,4 script MVP-Protector#15 727,{ callfunc "Protector","pvp_n_8-3"; }
+pvp_n_8-3,100,100,4 script MVP-Protector#16 727,{ callfunc "Protector",""; }
+pvp_n_1-4,100,100,4 script MVP-Protector#17 727,{ callfunc "Protector","pvp_n_2-4"; }
+pvp_n_2-4,100,100,4 script MVP-Protector#18 727,{ callfunc "Protector","pvp_n_3-4"; }
+pvp_n_3-4,100,100,4 script MVP-Protector#19 727,{ callfunc "Protector","pvp_n_4-4"; }
+pvp_n_4-4,100,100,4 script MVP-Protector#20 727,{ callfunc "Protector","pvp_n_5-4"; }
+pvp_n_5-4,100,100,4 script MVP-Protector#21 727,{ callfunc "Protector","pvp_n_6-4"; }
+pvp_n_6-4,100,100,4 script MVP-Protector#22 727,{ callfunc "Protector","pvp_n_7-4"; }
+pvp_n_7-4,100,100,4 script MVP-Protector#23 727,{ callfunc "Protector","pvp_n_8-4"; }
+pvp_n_8-4,100,100,4 script MVP-Protector#24 727,{ callfunc "Protector",""; }
+pvp_n_1-5,100,100,4 script MVP-Protector#25 727,{ callfunc "Protector","pvp_n_2-5"; }
+pvp_n_2-5,100,100,4 script MVP-Protector#26 727,{ callfunc "Protector","pvp_n_3-5"; }
+pvp_n_3-5,100,100,4 script MVP-Protector#27 727,{ callfunc "Protector","pvp_n_4-5"; }
+pvp_n_4-5,100,100,4 script MVP-Protector#28 727,{ callfunc "Protector","pvp_n_5-5"; }
+pvp_n_5-5,100,100,4 script MVP-Protector#29 727,{ callfunc "Protector","pvp_n_6-5"; }
+pvp_n_6-5,100,100,4 script MVP-Protector#30 727,{ callfunc "Protector","pvp_n_7-5"; }
+pvp_n_7-5,100,100,4 script MVP-Protector#31 727,{ callfunc "Protector","pvp_n_8-5"; }
+pvp_n_8-5,100,100,4 script MVP-Protector#32 727,{ callfunc "Protector",""; }
+
+// Alpha
+pvp_n_1-2,0,0,0,0 monster Eddga 1115,3,60000,66000
+pvp_n_1-2,0,0,0,0 monster Mistress 1059,1,60000,66000
+pvp_n_2-2,0,0,0,0 monster Mistress 1059,3,60000,66000
+pvp_n_2-2,0,0,0,0 monster Moonlight 1150,1,60000,66000
+pvp_n_3-2,0,0,0,0 monster Mistress 1059,1,60000,66000
+pvp_n_3-2,0,0,0,0 monster Moonlight 1150,2,60000,66000
+pvp_n_3-2,0,0,0,0 monster Maya 1147,1,60000,66000
+pvp_n_4-2,0,0,0,0 monster Eddga 1115,1,60000,66000
+pvp_n_4-2,0,0,0,0 monster Mistress 1059,1,60000,66000
+pvp_n_4-2,0,0,0,0 monster Moonlight 1150,1,60000,66000
+pvp_n_4-2,0,0,0,0 monster Maya 1147,1,60000,66000
+pvp_n_5-2,0,0,0,0 monster Eddga 1115,1,60000,66000
+pvp_n_5-2,0,0,0,0 monster Mistress 1059,2,60000,66000
+pvp_n_5-2,0,0,0,0 monster Moonlight 1150,1,60000,66000
+pvp_n_5-2,0,0,0,0 monster Maya 1147,2,60000,66000
+pvp_n_6-2,0,0,0,0 monster Eddga 1115,2,60000,66000
+pvp_n_6-2,0,0,0,0 monster Mistress 1059,3,60000,66000
+pvp_n_6-2,0,0,0,0 monster Moonlight 1150,1,60000,66000
+pvp_n_6-2,0,0,0,0 monster Maya 1147,2,60000,66000
+pvp_n_7-2,0,0,0,0 monster Eddga 1115,3,60000,66000
+pvp_n_7-2,0,0,0,0 monster Mistress 1059,3,60000,66000
+pvp_n_7-2,0,0,0,0 monster Moonlight 1150,2,60000,66000
+pvp_n_7-2,0,0,0,0 monster Maya 1147,2,60000,66000
+pvp_n_8-2,0,0,0,0 monster Eddga 1115,3,60000,66000
+pvp_n_8-2,0,0,0,0 monster Mistress 1059,3,60000,66000
+pvp_n_8-2,0,0,0,0 monster Moonlight 1150,3,60000,66000
+pvp_n_8-2,0,0,0,0 monster Maya 1147,3,60000,66000
+
+// Beta
+pvp_n_1-3,0,0,0,0 monster Phreeoni 1159,3,60000,66000
+pvp_n_1-3,0,0,0,0 monster Turtle General 1312,1,60000,66000
+pvp_n_2-3,0,0,0,0 monster Phreeoni 1159,2,60000,66000
+pvp_n_2-3,0,0,0,0 monster Turtle General 1312,1,60000,66000
+pvp_n_2-3,0,0,0,0 monster Orc Hero 1087,1,60000,66000
+pvp_n_3-3,0,0,0,0 monster Phreeoni 1159,1,60000,66000
+pvp_n_3-3,0,0,0,0 monster Turtle General 1312,1,60000,66000
+pvp_n_3-3,0,0,0,0 monster Orc Hero 1087,1,60000,66000
+pvp_n_3-3,0,0,0,0 monster Orc Lord 1190,1,60000,66000
+pvp_n_4-3,0,0,0,0 monster Phreeoni 1159,2,60000,66000
+pvp_n_4-3,0,0,0,0 monster Turtle General 1312,1,60000,66000
+pvp_n_4-3,0,0,0,0 monster Orc Hero 1087,1,60000,66000
+pvp_n_4-3,0,0,0,0 monster Orc Lord 1190,1,60000,66000
+pvp_n_5-3,0,0,0,0 monster Phreeoni 1159,1,60000,66000
+pvp_n_5-3,0,0,0,0 monster Turtle General 1312,2,60000,66000
+pvp_n_5-3,0,0,0,0 monster Orc Hero 1087,2,60000,66000
+pvp_n_5-3,0,0,0,0 monster Orc Lord 1190,1,60000,66000
+pvp_n_6-3,0,0,0,0 monster Phreeoni 1159,2,60000,66000
+pvp_n_6-3,0,0,0,0 monster Turtle General 1312,1,60000,66000
+pvp_n_6-3,0,0,0,0 monster Orc Hero 1087,2,60000,66000
+pvp_n_6-3,0,0,0,0 monster Orc Lord 1190,2,60000,66000
+pvp_n_7-3,0,0,0,0 monster Phreeoni 1159,3,60000,66000
+pvp_n_7-3,0,0,0,0 monster Turtle General 1312,1,60000,66000
+pvp_n_7-3,0,0,0,0 monster Orc Hero 1087,2,60000,66000
+pvp_n_7-3,0,0,0,0 monster Orc Lord 1190,3,60000,66000
+pvp_n_8-3,0,0,0,0 monster Phreeoni 1159,3,60000,66000
+pvp_n_8-3,0,0,0,0 monster Turtle General 1312,3,60000,66000
+pvp_n_8-3,0,0,0,0 monster Orc Hero 1087,3,60000,66000
+pvp_n_8-3,0,0,0,0 monster Orc Lord 1190,3,60000,66000
+
+// Theta
+pvp_n_1-4,0,0,0,0 monster Drake 1112,3,60000,66000
+pvp_n_1-4,0,0,0,0 monster Osiris 1038,1,60000,66000
+pvp_n_2-4,0,0,0,0 monster Drake 1112,2,60000,66000
+pvp_n_2-4,0,0,0,0 monster Osiris 1038,1,60000,66000
+pvp_n_2-4,0,0,0,0 monster Doppelganger 1046,1,60000,66000
+pvp_n_3-4,0,0,0,0 monster Drake 1112,1,60000,66000
+pvp_n_3-4,0,0,0,0 monster Osiris 1038,1,60000,66000
+pvp_n_3-4,0,0,0,0 monster Doppelganger 1046,1,60000,66000
+pvp_n_3-4,0,0,0,0 monster Lord of Death 1373,1,60000,66000
+pvp_n_4-4,0,0,0,0 monster Drake 1112,2,60000,66000
+pvp_n_4-4,0,0,0,0 monster Osiris 1038,1,60000,66000
+pvp_n_4-4,0,0,0,0 monster Doppelganger 1046,2,60000,66000
+pvp_n_4-4,0,0,0,0 monster Lord of Death 1373,1,60000,66000
+pvp_n_5-4,0,0,0,0 monster Drake 1112,3,60000,66000
+pvp_n_5-4,0,0,0,0 monster Osiris 1038,2,60000,66000
+pvp_n_5-4,0,0,0,0 monster Doppelganger 1046,2,60000,66000
+pvp_n_5-4,0,0,0,0 monster Lord of Death 1373,1,60000,66000
+pvp_n_6-4,0,0,0,0 monster Drake 1112,3,60000,66000
+pvp_n_6-4,0,0,0,0 monster Osiris 1038,2,60000,66000
+pvp_n_6-4,0,0,0,0 monster Doppelganger 1046,2,60000,66000
+pvp_n_6-4,0,0,0,0 monster Lord of Death 1373,2,60000,66000
+pvp_n_7-4,0,0,0,0 monster Drake 1112,3,60000,66000
+pvp_n_7-4,0,0,0,0 monster Osiris 1038,2,60000,66000
+pvp_n_7-4,0,0,0,0 monster Doppelganger 1046,3,60000,66000
+pvp_n_7-4,0,0,0,0 monster Lord of Death 1373,2,60000,66000
+pvp_n_8-4,0,0,0,0 monster Drake 1112,3,60000,66000
+pvp_n_8-4,0,0,0,0 monster Osiris 1038,3,60000,66000
+pvp_n_8-4,0,0,0,0 monster Doppelganger 1046,3,60000,66000
+pvp_n_8-4,0,0,0,0 monster Lord of Death 1373,3,60000,66000
+
+// Epsilon
+pvp_n_1-5,0,0,0,0 monster Incantation Samurai 1492,3,60000,66000
+pvp_n_1-5,0,0,0,0 monster Pharoh 1157,1,60000,66000
+pvp_n_2-5,0,0,0,0 monster Incantation Samurai 1492,2,60000,66000
+pvp_n_2-5,0,0,0,0 monster Pharoh 1157,1,60000,66000
+pvp_n_2-5,0,0,0,0 monster Dark Lord 1272,1,60000,66000
+pvp_n_3-5,0,0,0,0 monster Incantation Samurai 1492,1,60000,66000
+pvp_n_3-5,0,0,0,0 monster Pharoh 1157,1,60000,66000
+pvp_n_3-5,0,0,0,0 monster Dark Lord 1272,1,60000,66000
+pvp_n_3-5,0,0,0,0 monster Baphomet 1039,1,60000,66000
+pvp_n_4-5,0,0,0,0 monster Incantation Samurai 1492,3,60000,66000
+pvp_n_4-5,0,0,0,0 monster Pharoh 1157,1,60000,66000
+pvp_n_4-5,0,0,0,0 monster Dark Lord 1272,1,60000,66000
+pvp_n_4-5,0,0,0,0 monster Baphomet 1039,1,60000,66000
+pvp_n_5-5,0,0,0,0 monster Incantation Samurai 1492,2,60000,66000
+pvp_n_5-5,0,0,0,0 monster Pharoh 1157,2,60000,66000
+pvp_n_5-5,0,0,0,0 monster Dark Lord 1272,2,60000,66000
+pvp_n_5-5,0,0,0,0 monster Baphomet 1039,1,60000,66000
+pvp_n_6-5,0,0,0,0 monster Incantation Samurai 1492,2,60000,66000
+pvp_n_6-5,0,0,0,0 monster Pharoh 1157,2,60000,66000
+pvp_n_6-5,0,0,0,0 monster Dark Lord 1272,2,60000,66000
+pvp_n_6-5,0,0,0,0 monster Baphomet 1039,1,60000,66000
+pvp_n_7-5,0,0,0,0 monster Incantation Samurai 1492,2,60000,66000
+pvp_n_7-5,0,0,0,0 monster Pharoh 1157,2,60000,66000
+pvp_n_7-5,0,0,0,0 monster Dark Lord 1272,2,60000,66000
+pvp_n_7-5,0,0,0,0 monster Baphomet 1039,2,60000,66000
+pvp_n_8-5,0,0,0,0 monster Incantation Samurai 1492,3,60000,66000
+pvp_n_8-5,0,0,0,0 monster Pharoh 1157,2,60000,66000
+pvp_n_8-5,0,0,0,0 monster Dark Lord 1272,2,60000,66000
+pvp_n_8-5,0,0,0,0 monster Baphomet 1039,2,60000,66000
+
+// Mapflags
+pvp_n_1-1 mapflag pvp_nightmaredrop off
+pvp_n_2-1 mapflag pvp_nightmaredrop off
+pvp_n_3-1 mapflag pvp_nightmaredrop off
+pvp_n_4-1 mapflag pvp_nightmaredrop off
+pvp_n_5-1 mapflag pvp_nightmaredrop off
+pvp_n_6-1 mapflag pvp_nightmaredrop off
+pvp_n_7-1 mapflag pvp_nightmaredrop off
+pvp_n_8-1 mapflag pvp_nightmaredrop off
+pvp_n_1-2 mapflag pvp_nightmaredrop off
+pvp_n_2-2 mapflag pvp_nightmaredrop off
+pvp_n_3-2 mapflag pvp_nightmaredrop off
+pvp_n_4-2 mapflag pvp_nightmaredrop off
+pvp_n_5-2 mapflag pvp_nightmaredrop off
+pvp_n_6-2 mapflag pvp_nightmaredrop off
+pvp_n_7-2 mapflag pvp_nightmaredrop off
+pvp_n_8-2 mapflag pvp_nightmaredrop off
+pvp_n_1-3 mapflag pvp_nightmaredrop off
+pvp_n_2-3 mapflag pvp_nightmaredrop off
+pvp_n_3-3 mapflag pvp_nightmaredrop off
+pvp_n_4-3 mapflag pvp_nightmaredrop off
+pvp_n_5-3 mapflag pvp_nightmaredrop off
+pvp_n_6-3 mapflag pvp_nightmaredrop off
+pvp_n_7-3 mapflag pvp_nightmaredrop off
+pvp_n_8-3 mapflag pvp_nightmaredrop off
+pvp_n_1-4 mapflag pvp_nightmaredrop off
+pvp_n_2-4 mapflag pvp_nightmaredrop off
+pvp_n_3-4 mapflag pvp_nightmaredrop off
+pvp_n_4-4 mapflag pvp_nightmaredrop off
+pvp_n_5-4 mapflag pvp_nightmaredrop off
+pvp_n_6-4 mapflag pvp_nightmaredrop off
+pvp_n_7-4 mapflag pvp_nightmaredrop off
+pvp_n_8-4 mapflag pvp_nightmaredrop off
+pvp_n_1-5 mapflag pvp_nightmaredrop off
+pvp_n_2-5 mapflag pvp_nightmaredrop off
+pvp_n_3-5 mapflag pvp_nightmaredrop off
+pvp_n_4-5 mapflag pvp_nightmaredrop off
+pvp_n_5-5 mapflag pvp_nightmaredrop off
+pvp_n_6-5 mapflag pvp_nightmaredrop off
+pvp_n_7-5 mapflag pvp_nightmaredrop off
+pvp_n_8-5 mapflag pvp_nightmaredrop off
diff --git a/npc/custom/etc/penal_servitude.txt b/npc/custom/etc/penal_servitude.txt
new file mode 100644
index 000000000..bfbd39c63
--- /dev/null
+++ b/npc/custom/etc/penal_servitude.txt
@@ -0,0 +1,193 @@
+//===== rAthena Script =======================================
+//= Penal Servitude
+//===== By: ==================================================
+//= Lupus
+//===== Current Version: =====================================
+//= 1.2
+//===== Compatible With: =====================================
+//= rAthena SVN
+//===== Description: =========================================
+//= A simple Penal Servitude Script.
+//= It could cheer up your prisoners a bit.
+//===== Additional Comments: =================================
+// This script uses CHEQUES of the 2nd KAFRA_BANK.TXT
+// var PRISON - it counts number of your imprisonments.
+// 1.1 English translation
+// 1.2 Stricted the conditions a bit
+//============================================================
+
+sec_pri,36,58,1 script Chief Warder 105,{
+ mes "[Saddeus]";
+ emotion 1;
+ if(sex) {
+ mes "Mr. Prisoner #"+BaseLevel+JobLevel+",";
+ } else {
+ mes "Ms. Prisoner #"+BaseLevel+JobLevel+",";
+ }
+ mes "what's the noise over there?";
+ next;
+ menu "Let me free, I'll pay!",-, "Let me to work off my freedom!",M_Q1, "Nothing",M_NO_THANKS;
+
+M_PAY:
+ mes "[Saddeus]";
+ set @MUSTPAY,(PRISON+1)*1000000;
+ if (@MUSTPAY<1000000) set @MUSTPAY,1000000;
+ if (@MUSTPAY>100000000) set @MUSTPAY,100000000;
+ if (PRISON==1) mes "I can't remember you. Is it your 1st time?";
+ if (PRISON>1) mes "You again? Sombody hasn't grown wiser from the very first visit...";
+ mes "OK, we could release you for ^FF0000"+@MUSTPAY+"z^000000.";
+ next;
+ menu "I pay cash!",M_PAYCASH,"Do you accept cheques?",M_PAYBANK,"I've changed my mind.",-;
+
+ mes "[Saddeus]";
+ mes "You've got some time to think about...";
+ close;
+
+M_PAYCASH:
+ if (@MUSTPAY>Zeny) goto L_NOCASH;
+ set Zeny,Zeny-@MUSTPAY;
+ mes "[Saddeus]";
+ mes "OK, sing here and there.";
+ goto L_RELEASE;
+
+L_NOCASH:
+ mes "[Saddeus]";
+ mes "What's this? It's not enough!";
+ close;
+
+M_PAYBANK:
+ if (@MUSTPAY>#kafrabank) goto L_NOBANK;
+ set #kafrabank,#kafrabank-@MUSTPAY;
+ mes "[Saddeus]";
+ mes "OK, sign your cheque. And put down your name in my book.";
+ goto L_RELEASE;
+
+L_NOBANK:
+ mes "[Saddeus]";
+ if (#kafrabank==0) mes "Your case says nothing about your bank accounts.";
+ if (#kafrabank!=0) mes "Alas, there's your bank account info... ^FF0000"+#kafrabank+"z^000000... in the case. It's not enough.";
+ mes "Stop your silly games now!";
+ close;
+
+L_RELEASE:
+ set PRISON,PRISON+1;
+ next;
+ mes "[Saddeus]";
+ mes "You are free now!";
+ next;
+ savepoint "izlude",105,112;
+ warp "izlude",105,112;
+ close;
+
+M_Q1:
+ mes "[Saddeus]";
+ mes "Our stocks are short of toadstools. Remember your morning's skilly? What about some work at our sponsored mushroom farm?";
+ next;
+ menu "OK, I'll work off!",-, "I love this prison!",M_NO_THANKS;
+
+ mes "[Saddeus]";
+ if(checkcart() || checkfalcon() || checkriding()){
+ emotion e_hmm;
+ mes "I'm sorry, you should release your Cart, PecoPeco or Falcon!";
+ close;
+ }
+ mes "Talk to our overseer, Oliver.";
+ next;
+
+ nude;
+
+ set @rw,rand(1,4);
+ if (@rw==2) goto L_W2;
+ if (@rw==3) goto L_W3;
+ if (@rw==4) goto L_W4;
+
+L_W1:
+ savepoint "sec_in02",179,76;
+ warp "sec_in02",179,76;
+ close;
+
+L_W2:
+ savepoint "sec_in02",139,32;
+ warp "sec_in02",139,32;
+ close;
+
+L_W3:
+ savepoint "sec_in02",100,28;
+ warp "sec_in02",100,28;
+ close;
+
+L_W4:
+ savepoint "sec_in02",107,75;
+ warp "sec_in02",107,75;
+ close;
+
+M_NO_THANKS:
+ mes "[Saddeus]";
+ if (rand(2)) mes "Is today X-Mas time, huh?";
+ mes "Now shut up and back off!";
+ if (rand(2)) emotion 23;
+ close;
+}
+
+sec_in02,137,57,1 script Overseer 708,{
+ mes "[Oliver]";
+
+ delitem 4002,countitem(4002);//Items: Fabre_Card,
+ delitem 4009,countitem(4009);//Items: Chonchon_Card,
+ delitem 4022,countitem(4022);//Items: Spore_Card,
+ delitem 4048,countitem(4048);//Items: Poison_Spore_Card,
+
+ if (PRISON_Q <= 0 ) goto L_GET_Q;
+
+ mes "I want you to gather ^FF0000"+PRISON_Q+" Orange Net Mushroom^000000.";
+ if ( countitem(1069)<PRISON_Q ) close;//Items: Orange_Net_Mushroom,
+ mes "OK... hand me all the shrooms...";
+ mes "Let me see... "+countitem(1069)+" of almost eadible ones...";//Items: Orange_Net_Mushroom,
+ mes "And "+countitem(1070)+" useless deadly ones.";//Items: Orange_Gooey_Mushroom_,
+ next;
+ mes "[Oliver]";
+ mes "Thank you. You are free!";
+ set PRISON_Q,0;
+ delitem 1069,countitem(1069);//Items: Orange_Net_Mushroom,
+ delitem 1070,countitem(1070);//Items: Orange_Gooey_Mushroom_,
+ next;
+ savepoint "izlude",105,112;
+ warp "izlude",105,112;
+ close;
+
+L_GET_Q:
+ set PRISON,PRISON+1;
+ if (PRISON > 1) mes "Hmm... You've been here already... Well-well...";
+
+ if ( countitem(1069) || countitem(1070) ) mes "Drop these mushrooms!! They are poisonous!";//Items: Orange_Net_Mushroom, Orange_Gooey_Mushroom_,
+ delitem 1069,countitem(1069);//Items: Orange_Net_Mushroom,
+ delitem 1070,countitem(1070);//Items: Orange_Gooey_Mushroom_,
+
+ set PRISON_Q, PRISON*3 + BaseLevel/3;
+ set PRISON_Q, PRISON_Q * (readparam(bAspd)/55 + 1);
+ set PRISON_Q, PRISON_Q+rand(50,60);
+ mes "OK, you must bring me ^FF0000"+PRISON_Q+"^000000 edible ^FF0000Orange Net Mushroom^000000 toadstoo.. shrooms.";
+ if(readparam(bAspd)>=100) mes "You're a fast fella! You'll have to get more shrooms, then.";
+ if (rand(10)<4) mes "And you may eat the deadly ones for breakfast.";
+ close;
+}
+
+
+sec_in02 mapflag nomemo
+sec_in02 mapflag nosave SavePoint
+sec_in02 mapflag noteleport
+sec_in02 mapflag nobranch
+sec_in02 mapflag nowarp
+sec_in02 mapflag nowarpto
+sec_in02 mapflag noexp
+sec_in02 mapflag noskill
+//sec_in02 mapflag pvp
+//sec_in02 mapflag pvp_noparty
+//sec_in02 mapflag gvg
+sec_in02 mapflag pvp_nightmaredrop random,all,300
+
+sec_in02,138,55,100,100 monster Toadstool 1182,30,10000,10000,1
+sec_in02,138,55,100,100 monster Fabre 1184,10,20000,20000
+sec_in02,138,55,100,100 monster Chonchon 1183,11,20000,20000
+sec_in02,138,55,100,100 monster Spore 1014,12,20000,20000
+sec_in02,138,55,100,100 monster Poison Spore 1077,3,20000,20000
diff --git a/npc/custom/etc/quest_warper.txt b/npc/custom/etc/quest_warper.txt
new file mode 100644
index 000000000..2c2d31083
--- /dev/null
+++ b/npc/custom/etc/quest_warper.txt
@@ -0,0 +1,1692 @@
+//===== rAthena Script ============================================
+//= Quest Warper Script
+//===== By: =======================================================
+//= DZeroX, Darkchild, Neouni
+//===== Current Version: ==========================================
+//= 2.3
+//===== Compatible With: ==========================================
+//= rAthena SVN
+//===== Description: ==============================================
+//= Warper that works only after locations are unlocked.
+//===== Additional Comments: ======================================
+//= 1.0 - NPCs created
+//= 1.1 - Add Dungeons by sturm
+//= 1.2 - Add All char in account unlocked by ace_killer
+//= 1.3 - Add new 7 towns and 7 dungeons by escoteiro
+// - Correct bug jawaii town by escoteiro
+// - Remove some excessive warpras by escoteiro
+//= 1.4 - Rewrite of the Warpa system [Neouni]
+// - Corrected some bugs caused by autoconverting the old script
+//= 1.4a - Rewrite of menu to be custom for each player [Neouni]
+// - Dungeon listing rewrite
+// - Town listing rewrite
+// - GameMaster can Customise Main menu
+//= 1.4b - Pricing round [Neouni]
+// - GM menu added for pricing
+// - Town Warp pricing tags added
+// - Dungeon Warp pricing tags added
+//= 1.5 - storage functions pricing [Neouni]
+// - storage pricing added
+// - kafra points setting added
+// - kafra storage code security added
+// - Healing scripts pricing added
+// - Heal Part script added
+//= 1.6 - Dungeon warp [Neouni] (beta only)
+// - added option to add a extra fee for going down deeper into dungeon
+// partly by rebuilding the dungeon warping into variable menu's
+//= 1.6a - alot of fixes for beta release [Neouni] (public release)
+// - fixed syntax problems
+// - fixed missing pyramid gats in @DGat$ array
+// - removed the culver level 5 that didn't exist
+//= 1.7 - Readability of Dungeon menu building increased [Neouni]
+// - Thanatos Tower & Louyang Dungeon added
+//= 1.8 - changed around unlock variables [Neouni]
+// - Moved warp variables to mark what you have unlocked to an binary array in login based permanent variable
+// (warp variables are saved in login database, so all charservers have these unlocked)
+// - Town Warp unlock array max 21/(unknown max) items used instead of max account #variables 32 !
+// - Dungeon Warp unlock array 28/(unknown max) items used instead of max account #variables 32 !
+// - (max login ##variables = 16, i used 3)
+// - old variables are cleared on next save
+// - Extra Variable clear added for every character, just in case (request by Terces)
+//= 1.8a - Show amount of users on map [Neouni]
+//= 1.8b - Small typo fixed in stampcard script [Neouni]
+//= 1.9 - Making it more edit friendly [Neouni]
+// - Made Dungeon warp arrays more readable & editable (QWS_Darray)
+// - Made town warp arrays more readable & editable (QWS_Tarray)
+//= 2.0 - Special Warp menu added [Neouni]
+// - when all towns and dungeons are collected a new option on the main menu will show
+// - it will only show when you setup the mapname of the warp !
+//= 2.0a - Dungeon Level Limit & Split dungeon fees
+// - Limits dungeon based on Depth, access special setup menu thru GM-Menu
+// - Dungeon fees split up based on Basic , Advanced & Overseas
+// - Old Dungeon fee system removed, all dungeon fees now set to 0
+//= 2.0b - Special warpname menu option name bug fixed
+//= 2.1 - Updated names to fall within retrictions. [L0ne_W0lf]
+//= 2.2 - #kafra_code is now stored as is. [brianluau]
+//= 2.3 - Added new town maps, cleanup, and removed pre-1.8 backwards fix. [Euphy]
+//=================================================================
+
+//========================Function=&=Script========================
+
+function script Q_Warpra {
+ mes "[Warpra]";
+ mes "Hello,";
+ mes "I can warp you to any town or dungeon, but you need to unlock them first by visiting us.";
+ mes "What do you need?";
+
+ if(getarg(0) == 0) callfunc "QWS_MMarray",0;
+ if(getarg(0) == 1) callfunc "QWS_MMarray",1;
+
+ set @MMenu,select(@Mmenulist$[0],@Mmenulist$[1],@Mmenulist$[2],@Mmenulist$[3],@Mmenulist$[4],@Mmenulist$[5],@Mmenulist$[6],@Mmenulist$[7],@Mmenulist$[8],@Mmenulist$[9],@Mmenulist$[10],@Mmenulist$[11]);
+
+ switch(@Mmenuref[@MMenu-1]+1){
+ case 1: goto GM_Menu;
+ case 2:
+ warp $QW_SP_WarpMap$, $QW_SP_WarpX, $QW_SP_WarpY;
+ close2;
+ debugmes "Please check your special warp menu settings on the Warpra.";
+ end;
+ case 3: goto L_town;
+ case 4: goto L_dungeon;
+ case 5: goto L_FewWarps;
+ case 6: goto L_NoUnlock;
+ case 7: goto L_heal_Full;
+ case 8: goto L_heal_Part;
+ case 9: goto L_Storage;
+ case 10: goto L_GStorage;
+ case 11:
+ default:
+ goto L_end;
+ }
+
+//=====================GM-Menu=Functions===========================
+
+GM_Menu:
+ next;
+ mes "Town warping = "+(($QW_TW_OFF)?"^FF0000 Off":"^00FF00 On")+"^000000";
+ mes "Dungeon warping = "+(($QW_DW_OFF)?"^FF0000 Off":"^00FF00 On")+"^000000";
+ mes "Dungeon Depth limit is "+(($QW_DL)?"^00FF00 On":"^FF0000 Off")+"^000000";
+ mes "If on Dungeon Depth limit is set to ^0000FF"+$QW_DDL+"^000000";
+ mes "Show Map Users = "+(($QW_MapUserShow)?"^00FF00 On":"^FF0000 Off")+"^000000";
+
+ if ($QW_HF) mes "Healing full = ^00FF00 On ^000000";
+ if ($QW_HP) mes "Healing partly = ^00FF00 On ^000000";
+ if (!$QW_HF && !$QW_HP) mes "Healing = ^FF0000 Off ^000000";
+
+ mes "Storage = "+(($QW_Stor)?"^00FF00 On":"^FF0000 Off")+"^000000";
+ mes "Guild Storage = "+(($QW_GStor)?"^00FF00 On":"^FF0000 Off")+"^000000";
+ mes "Kafra points collect = "+(($QW_KPoint)?"^00FF00 On":"^FF0000 Off")+"^000000";
+
+ switch(select("Town Warping","Dungeon Warping","Dungeon Level Limit","Show Map Users","Healing full","Healing partly","Storage","Guild Storage","Kafra points collect","Set Prices","Special Warp","Exit")) {
+ case 1: set $QW_TW_OFF,($QW_TW_OFF)?0:1; goto GM_Menu;
+ case 2: set $QW_DW_OFF,($QW_DW_OFF)?0:1; goto GM_Menu;
+ case 3: goto DungeonLevelLimit;
+ case 4: set $QW_MapUserShow,($QW_MapUserShow)?0:1; goto GM_Menu;
+ case 5:
+ if ($QW_HF == 0) {
+ set $QW_HF,1;
+ set $QW_HP,0;
+ }
+ else set $QW_HF,0;
+ goto GM_Menu;
+ case 6:
+ if ($QW_HP == 0) {
+ set $QW_HP,1;
+ set $QW_HF,0;
+ }
+ else set $QW_HP,0;
+ goto GM_Menu;
+ case 7: set $QW_Stor,($QW_Stor)?0:1; goto GM_Menu;
+ case 8: set $QW_GStor,($QW_GStor)?0:1; goto GM_Menu;
+ case 9: set $QW_KPoint,($QW_KPoint)?0:1; goto GM_Menu;
+ case 10: goto Setprice;
+ case 11: goto SpecialWarpMenu;
+ default:
+ close;
+ end;
+ }
+
+//======================GM-Menu=Pricing============================
+
+Setprice:
+ if ($QW_DW_FEE != 0) set $QW_DW_FEE,0;
+ next;
+ mes "Scroll through the list to see all the options.";
+
+ mes "Basic - Warps are = "+(($QW_BW_PRICE)?"^00FF00"+$QW_BW_PRICE:"^FF0000Free")+"^000000";
+ mes "Advanced - Warps are = "+(($QW_AW_PRICE)?"^00FF00"+$QW_AW_PRICE:"^FF0000Free")+"^000000";
+ mes "Overseas - Warps are = "+(($QW_OW_PRICE)?"^00FF00"+$QW_OW_PRICE:"^FF0000Free")+"^000000";
+
+ mes "Basic Dungeon level warp fee = "+(($QW_BW_FEE)?"^00FF00"+$QW_BW_FEE:"^FF0000NO")+"^000000 zeny per level";
+ mes "Advanced Dungeon level warp fee = "+(($QW_AW_FEE)?"^00FF00"+$QW_AW_FEE:"^FF0000NO")+"^000000 zeny per level";
+ mes "Overseas Dungeon level warp fee = "+(($QW_OW_FEE)?"^00FF00"+$QW_OW_FEE:"^FF0000NO")+"^000000 zeny per level";
+
+ mes "Full Healing = "+(($QW_HF_PRICE)?"^00FF00"+$QW_HF_PRICE:"^FF0000Free")+"^000000";
+ mes "^FF0000HP ^000000Part Healing = "+(($QW_HP_H_PRICE)?"^00FF00"+$QW_HP_H_PRICE+"^000000 a point":"^FF0000Free^000000");
+ mes "^FF0000SP ^000000Part Healing = "+(($QW_HP_S_PRICE)?"^00FF00"+$QW_HP_S_PRICE+"^000000 a point":"^FF0000Free^000000");
+
+ if ($QW_S_PRICE && $QW_S_PRICE != 60) mes "Storage = ^00FF00 "+$QW_S_PRICE+" ^000000";
+ if (!$QW_S_PRICE) mes "Storage = ^FF0000 Free ^000000";
+ if ($QW_S_PRICE == 60) mes "Storage = ^0000FF Kafra Mode ^000000";
+ mes "Guild Storage = "+(($QW_GS_PRICE)?"^00FF00"+$QW_GS_PRICE:"^FF0000Free")+"^000000";
+
+ switch(select("Basic - Warps","Advanced - Warps","Overseas - Warps","Basic Dungeon warp fee","Advanced Dungeon warp fee","Overseas Dungeon warp fee","Full Healing","Part Healing","Storage","Guild Storage","Back","Exit")) {
+ case 1:
+ next;
+ mes "Basic - Warps are = "+(($QW_BW_PRICE)?"^00FF00"+$QW_BW_PRICE:"^FF0000Free")+"^000000";
+ mes "Basic - Warps are starter towns and related dungeons.";
+ input $QW_BW_PRICE;
+ goto Setprice;
+ case 2:
+ next;
+ mes "Advanced - Warps are = "+(($QW_AW_PRICE)?"^00FF00"+$QW_AW_PRICE:"^FF0000Free")+"^000000";
+ mes "Advanced - Warps are towns and dungeons on the same island but not close to any starter town.";
+ input $QW_AW_PRICE;
+ goto Setprice;
+ case 3:
+ next;
+ mes "Overseas - Warps are = "+(($QW_OW_PRICE)?"^00FF00"+$QW_OW_PRICE:"^FF0000Free")+"^000000";
+ mes "Overseas - Warps are towns and dungeons overseas reachable by boat from Alberta.";
+ input $QW_OW_PRICE;
+ goto Setprice;
+ case 4:
+ next;
+ mes "Basic Dungeon level warp fee = "+(($QW_BW_FEE)?"^00FF00"+$QW_BW_FEE:"^FF0000NO")+"^000000 zeny per level";
+ mes "Basic - Warps are starter town related dungeons.";
+ mes "Dungeon warp fees are calculated by maps away from entrance of the dungeon times Dungeon warp fee.";
+ mes "These costs are on top of the regular Warp costs.";
+ input $QW_BW_FEE;
+ goto Setprice;
+ case 5:
+ next;
+ mes "Advanced Dungeon level warp fee = "+(($QW_AW_FEE)?"^00FF00"+$QW_AW_FEE:"^FF0000NO")+"^000000 zeny per level";
+ mes "Advanced - Warps are dungeons not close to any starter town.";
+ mes "Dungeon warp fees are calculated by maps away from entrance of the dungeon times Dungeon warp fee.";
+ mes "These costs are on top of the regular Warp costs.";
+ input $QW_AW_FEE;
+ goto Setprice;
+ case 6:
+ next;
+ mes "Overseas Dungeon level warp fee = "+(($QW_OW_FEE)?"^00FF00"+$QW_OW_FEE:"^FF0000NO")+"^000000 zeny per level";
+ mes "Overseas - Warps are dungeons related to towns overseas reachable by boat from Alberta.";
+ mes "Dungeon warp fees are calculated by maps away from entrance of the dungeon times Dungeon warp fee.";
+ mes "These costs are on top of the regular Warp costs.";
+ input $QW_OW_FEE;
+ goto Setprice;
+ case 7:
+ next;
+ mes "Full Healing = "+(($QW_HF_PRICE)?"^00FF00"+$QW_HF_PRICE:"^FF0000Free")+"^000000";
+ mes "Instant full healing 1 price.";
+ input $QW_HF_PRICE;
+ goto Setprice;
+ case 8:
+ next;
+ mes "^FF0000HP ^000000Part Healing = "+(($QW_HP_H_PRICE)?"^00FF00"+$QW_HP_H_PRICE+"^000000 a point":"^FF0000Free^000000");
+ mes "^FF0000SP ^000000Part Healing = "+(($QW_HP_S_PRICE)?"^00FF00"+$QW_HP_S_PRICE+"^000000 a point":"^FF0000Free^000000");
+ mes "Healing price per 1 HP.";
+ mes "Healing price per 1 SP.";
+ mes "2 inputs, first HP then SP.";
+ input $QW_HP_H_PRICE;
+ input $QW_HP_S_PRICE;
+ goto Setprice;
+ case 9:
+ next;
+ if ($QW_S_PRICE && $QW_S_PRICE != 60) mes "Storage = ^00FF00 "+$QW_S_PRICE+" ^000000";
+ if (!$QW_S_PRICE) mes "Storage = ^FF0000 Free ^000000";
+ if ($QW_S_PRICE == 60) mes "Storage = ^0000FF Kafra Mode ^000000";
+ mes "Storage cost, if set to 60 Kafra pricing will be handled.";
+ input $QW_S_PRICE;
+ goto Setprice;
+ case 10:
+ next;
+ mes "Guild Storage = "+(($QW_GS_PRICE)?"^00FF00"+$QW_GS_PRICE:"^FF0000Free")+"^000000";
+ mes "Guild Storage, free on Guild Kafras.";
+ input $QW_GS_PRICE;
+ goto Setprice;
+ case 11:
+ goto GM_Menu;
+ default:
+ close;
+ end;
+ }
+
+//======================Special=Warp=Menu==========================
+
+SpecialWarpMenu:
+ if ($QW_SP_Warpname$ == "") set $QW_SP_Warpname$,"Special Warp";
+ next;
+ mes "Scroll down to see all the information";
+ mes "The Special warp menu option will show in the main menu when all towns & dungeons are unlocked";
+ mes "And when the map for special warping has been set";
+ mes "menu option name set to ^0000FF"+$QW_SP_Warpname$+"^000000";
+ if ($QW_SP_WarpMap$ == "") mes "map is currently ^FF0000not^000000 set, and Special warp menu is off";
+ if ($QW_SP_WarpMap$ != "") mes "map is currently set to ^0000FF"+$QW_SP_WarpMap$+"^000000 and Special Warp menu is on";
+ mes "coords are set to ^0000FF"+$QW_SP_WarpX+","+$QW_SP_WarpY+"^000000";
+ switch(select("Set Special Warp name to show in menu", "Set WarpMap","Set Coords","Go Back to GM_Menu","Exit")){
+ case 1:
+ next;
+ mes "Set the name to show in the menu as option.";
+ input $QW_SP_Warpname$;
+ goto SpecialWarpMenu;
+ case 2:
+ next;
+ mes "Set the map in the ^0000FFmapname^000000 format.";
+ mes "When this warpmap is set the option for players will show once they meet the requirments.";
+ mes "To disable Special Warp Menu option, clear this!";
+ input $QW_SP_WarpMap$;
+ goto SpecialWarpMenu;
+ case 3:
+ next;
+ mes "First input = Xcoord";
+ mes "Second input = Ycoord";
+ input $QW_SP_WarpX;
+ input $QW_SP_WarpY;
+ goto SpecialWarpMenu;
+ case 4:
+ goto GM_Menu;
+ default:
+ close;
+ end;
+ }
+
+//======================Dungeon=Level=Limit========================
+
+DungeonLevelLimit:
+ next;
+ mes "Dungeon Depth limit is "+(($QW_DL)?"^00FF00On":"^FF0000Off")+"^000000";
+ mes "If^00FF00 On ^000000Dungeon Depth limit is set to ^0000FF"+$QW_DDL+"^000000";
+
+ switch(select("Toggle Dungeon Depth Limit","Set Dungeon Depth Limit","Go Back to GM_Menu","Exit")){
+ case 1: set $QW_DL,($QW_DL)?0:1; goto DungeonLevelLimit;
+ case 2:
+ next;
+ mes "Set limit of Dungeon Depth 0 = entrance";
+ mes "Depth 1 is a map connected to 0 and so on";
+ mes "Shortest Route to map counts as depth";
+ input $QW_DDL;
+ goto DungeonLevelLimit;
+ case 3: goto GM_Menu;
+ default:
+ close;
+ end;
+ }
+
+//===========================Towns=================================
+
+L_town:
+ callfunc "QWS_Tarray";
+ freeloop(1);
+ set .@menu$,"";
+ for(set .@i,0; .@i<35; set .@i,.@i+1) // Expected maximum is 35
+ set .@menu$,.@menu$+@Tmenulist$[.@i]+":";
+ freeloop(0);
+ set @TWMenu,select(.@menu$);
+
+ if (@Tmenuref[@TWMenu-1] == 57005) goto L_end; // 57005='dead' in hex
+
+ if(Zeny<@pTprice[@Tmenuref[@TWMenu-1]]) callsub L_Short_on_zeny,0;
+ set Zeny, Zeny-@pTprice[@Tmenuref[@TWMenu-1]];
+ if ($QW_KPoint == 1) set RESRVPTS, RESRVPTS + (@pTprice[@Tmenuref[@TWMenu-1]]/16);
+ warp @pTmap$[@Tmenuref[@TWMenu-1]],@pTXcoords[@Tmenuref[@TWMenu-1]],@pTYcoords[@Tmenuref[@TWMenu-1]];
+ close2;
+ set Zeny, Zeny+@pTprice[@Tmenuref[@TWMenu-1]];
+ end;
+
+//=========================Dungeons================================
+
+L_dungeon:
+ callfunc "QWS_Darray";
+ freeloop(1);
+ set .@menu$,"";
+ for(set .@i,0; .@i<35; set .@i,.@i+1) // Expected maximum is 35
+ set .@menu$,.@menu$+@Dmenulist$[.@i]+":";
+ freeloop(0);
+ set @DWMenu,select(.@menu$);
+
+ if (@Dmenuref[@DWMenu-1] == 57005) goto L_end; // 57005='dead' in hex
+ set @DwarpMenu, (@Dmenuref[@DWMenu-1]);
+ callfunc "QWS_DLarray";
+
+ next;
+ mes "[Warpra]";
+ mes "Please select where you want to go:";
+ freeloop(1);
+ set .@menu$,"";
+ for(set .@i,0; .@i<18; set .@i,.@i+1) // Expected maximum is 18
+ set .@menu$,.@menu$+@DWLmenulist$[.@i]+":";
+ freeloop(0);
+ set @DWLMenu,select(.@menu$);
+
+ if (@DWLmenuref[@DWLMenu-1] == 57005) goto L_end; // 57005='dead' in hex
+
+ set @Darrayref, @DWLmenuref[@DWLMenu-1];
+ set @warpprice, @pDprice[@Dmenuref[@DWMenu-1]]+(getd(@pDfee$[@Dmenuref[@DWMenu-1]])*(@DDepth[@Darrayref]));
+
+ if(Zeny<@warpprice) callsub L_Short_on_zeny,1;
+ set Zeny, Zeny-(@warpprice);
+ if ($QW_KPoint == 1) set RESRVPTS, RESRVPTS + (@warpprice/16);
+ warp @DGat$[@Darrayref],@DXcoords[@Darrayref],@DYcoords[@Darrayref];
+ close2;
+ set Zeny, Zeny+@pTprice[@Tmenuref[@DWMenu-1]];
+ end;
+
+//=============================Healing=============================
+
+L_heal_Full:
+ set @healfee, $QW_HF_PRICE;
+ if(Zeny<@healfee) callsub L_Short_on_zeny,4;
+ set Zeny, Zeny-@healfee;
+ if ($QW_KPoint == 1) set RESRVPTS, RESRVPTS + (@healfee/500);
+ next;
+ mes "[Warpra]";
+ mes "Close this window and I will heal you.";
+ close2;
+ percentheal 100,100;
+ end;
+
+L_heal_Part:
+ set @healchoice,select("Full heal","Health Points only","Skill Points only","Exit");
+ if (@healchoice == 1) callsub PHeal,1,1;
+ if (@healchoice == 2) callsub PHeal,1,0;
+ if (@healchoice == 3) callsub PHeal,0,1;
+ goto L_end;
+
+PHeal:
+ next;
+ set @Hp, MaxHp-Hp;
+ set @Sp, MaxSp-Sp;
+ set @HpPrice, @hp*$QW_HP_H_PRICE;
+ set @SpPrice, @sp*$QW_HP_S_PRICE;
+ mes "[Warpra]";
+ if(getarg(0) == 1) mes ""+@HpPrice+" Zeny for "+@Hp+" health points";
+ if(getarg(1) == 1) mes ""+@SpPrice+" Zeny for "+@Sp+" skill points";
+ set @total, @HpPrice+@SpPrice;
+ mes "for a total of "+@total+" zeny";
+ if (select("Heal me","Let me see the choices again")==2) goto L_heal_Part;
+
+ if(getarg(0) == 1)set @HpPrice, (MaxHp-Hp)*$QW_HP_H_PRICE;
+ if(getarg(1) == 1)set @SpPrice, (MaxSp-Sp)*$QW_HP_S_PRICE;
+ set @healfee, @HpPrice+@SpPrice;
+ if (getarg(0) == 1)&&(getarg(1) == 1)&&(Zeny<@healfee) goto Zeny_Short_Both;
+ if (getarg(0) == 1)&&(Zeny<@healfee) goto Zeny_short_HP;
+ if (getarg(1) == 1)&&(Zeny<@healfee) goto Zeny_short_SP;
+ set Zeny, Zeny-@healfee;
+ if (getarg(0) == 1)&&(getarg(1) == 1) percentheal 100,100;
+ if (getarg(0) == 1) percentheal 100,0;
+ if (getarg(1) == 1) percentheal 0,100;
+ close;
+ end;
+
+Zeny_Short_Both:
+ mes "[Warpra]";
+ mes "Choose another option, you can afford both.";
+ mes "I can heal as much as you can afford, too.";
+ if (select("OK","Exit") == 2) goto L_end;
+ goto PHeal;
+
+Zeny_short_HP:
+ mes "[Warpra]";
+ mes "Do you want me to partly heal your HP?";
+ if (select("Yes","No") == 2) goto L_end;
+ set @Hp, Zeny/$QW_HP_H_PRICE;
+ set @HpPrice, @Hp*$QW_HP_H_PRICE;
+ if (@Hp == 1) mes "You're not worth the effort.";
+ if (@Hp == 1) goto L_end;
+ set Zeny, Zeny-@HpPrice;
+ heal @Hp,0;
+ close;
+ end;
+
+Zeny_short_SP:
+ mes "[Warpra]";
+ mes "Do you want me to partly heal your SP?";
+ if (select("Yes","No") == 2) goto L_end;
+ set @Sp, Zeny/$QW_HP_S_PRICE;
+ set @SpPrice, @Sp*$QW_HP_S_PRICE;
+ if (@Sp == 1) mes "You're not worth the effort.";
+ if (@Sp == 1) goto L_end;
+ set Zeny, Zeny-@SpPrice;
+ heal 0,@Sp;
+ close;
+ end;
+
+//=============================Storage=============================
+
+L_Storage:
+ next;
+ if(basicskillcheck() > 0 && getskilllv("NV_BASIC") < 6) goto L_StorageJBlow;
+ set @fee, $QW_S_PRICE;
+ if ($QW_S_PRICE == 60)&&(BaseJob == Job_Novice) set @fee, 30;
+ if ($QW_S_PRICE == 60)&&(BaseJob != Job_Novice) set @fee, 60;
+ if(Zeny<@fee) callsub L_Short_on_zeny,2;
+ set Zeny, Zeny-@fee;
+ if ($QW_KPoint == 1) set RESRVPTS, RESRVPTS + (@fee/5);
+
+ mes "[Warpra]";
+ if(#kafra_code) {
+ mes "Enter your storage password:";
+ set @code_,0;
+ input @code_;
+ if(@code_ != #kafra_code) {
+ dispbottom "Wrong storage password.";
+ close;
+ }
+ set @kafcode_try,0;
+ set @code_,0;
+ }
+ mes "Close this window and I will open your storage.";
+ close2;
+ openstorage;
+ end;
+
+L_StorageJBlow:
+ mes "[Warpra]";
+ mes "I am sorry but you have to be at least Novice level 6 if you want to use the storage.";
+ return;
+
+L_GStorage:
+ if (!@GID) {
+ next;
+ mes "[Warpra]";
+ mes "You are not a part of a guild I can't help you.";
+ close;
+ end;
+ }
+ if (Zeny<$QW_GS_PRICE) callsub L_Short_on_zeny,3;
+ set Zeny, Zeny-$QW_GS_PRICE;
+ if ($QW_KPoint == 1) set RESRVPTS, RESRVPTS + ($QW_GS_PRICE/5);
+ next;
+ mes "[Warpra]";
+ mes "Close this window and I will open the ^5533FF" + GetGuildName(@GID) + "^000000 storage.";
+ close2;
+ guildopenstorage;
+ end;
+
+L_end:
+ close;
+ end;
+
+//============================Few=Warp=============================
+L_FewWarps:
+ next;
+ mes "[Warpra]";
+ mes "You need to unlock locations before they come available to you.";
+ mes "To unlock a location talk to my colleagues all over the world.";
+ mes "Each account has its own stamp card.";
+ mes "Want me to check what stamps you have collected so far?";
+ if (select("Yes","No")==1) callsub stampcard;
+ close;
+ end;
+
+//============================No=Unlock============================
+L_NoUnlock:
+ next;
+ mes "[Warpra]";
+ mes "I don't unlock this location, my assistant deeper in the dungeon will unlock this place.";
+ close;
+ end;
+
+//=========================Short=On=Zeny===========================
+L_Short_on_zeny:
+ next;
+ switch(getarg(0)) {
+ case 0: mes "You don't seem to have "+@pTprice[@Tmenuref[@TWMenu-1]]+" zeny to pay for the warp to "+@pTmenuitems$[@Tmenuref[@TWMenu-1]]+"."; break;
+ case 1: mes "You don't seem to have "+@warpprice+" zeny to pay for the warp to "+@DLevelName$[@DWLmenuref[@DWLMenu-1]]+" at "+@pDmenuitems$[@Dmenuref[@DWMenu-1]]+"."; break;
+ case 2: mes "You don't seem to have "+@fee+" zeny to pay the storage fee."; break;
+ case 3: mes "You don't seem to have "+$QW_GS_PRICE+" zeny to pay the guild storage fee."; break;
+ case 4: mes "You don't seem to have "+@healfee+" zeny to pay for your healing."; break;
+ }
+ close;
+ end;
+
+//===========================Stamp=Card============================
+stampcard:
+// Counting of the ammount of places you have unlocked
+ next;
+ mes "Let me check what Towns you have.";
+ callfunc "QWS_TownStamps";
+ mes "You collected^00FF00 "+@Tstamp+" of "+@MaxTstamp+" ^000000Towns.";
+ if (@Tstamp == 15) mes "They say there is an island you can only get to when married...";
+ if (@Tstamp == 15) emotion 18;
+ next;
+ mes "Let me check what dungeons you have.";
+ callfunc "QWS_DungeonStamps";
+ mes "You collected^00FF00 "+@Dstamp+" of "+@MaxDstamp+" ^000000Dungeons.";
+ mes "To unlock a dungeon, search for my colleagues.";
+ mes "You can usually find them near the middle or end of the dungeon.";
+ return;
+}
+
+function script QWS_TownStamps {
+ set @Tstamp,0;
+ set @MaxTstamp,30; //maximum number of towns
+ set @binvalue,1;
+ set @Tstamploop,0;
+ do {
+ if ((@binvalue & ##QWS_T_Unlock) == @binvalue) set @Tstamp,@Tstamp+1;
+ set @binvalue, @binvalue *2;
+ set @Tstamploop, @Tstamploop + 1;
+ } while (@Tstamploop < @MaxTstamp);
+ return;
+}
+
+function script QWS_DungeonStamps {
+ set @Dstamp,0;
+ set @MaxDstamp,29; //maximum number of dungeons
+ set @binvalue,1;
+ set @Dstamploop,0;
+ do {
+ if ((@binvalue & ##QWS_D_Unlock) == @binvalue) set @Dstamp,@Dstamp+1;
+ set @binvalue, @binvalue *2;
+ set @Dstamploop, @Dstamploop + 1;
+ } while (@Dstamploop < @MaxDstamp);
+ return;
+}
+
+//======================Main=Menu=Array============================
+
+function script QWS_MMarray {
+
+ // Currently 9 items
+ setarray @pMmenuitems$[0], "GameMaster Menu", $QW_SP_Warpname$, "Warp to Towns", "Warp to Dungeons", "Why so few warps?", "Why don't you unlock this location?", "Heal", "Heal", "Storage", "Guild Storage", "Cancel";
+ set @Mi,0; // loop counter
+ set @Mj,0; // menu line counter
+
+//----------------GameMaster-Menu
+ if (getgmlevel()>= 80) {
+ set @Mmenulist$[@Mj],@pMmenuitems$[@Mi];
+ set @Mmenuref[@Mj],@Mi;
+ set @Mj,@Mj+1;
+ }
+ set @Mi,@Mi+1;
+//----------------Special-Warp
+ callfunc "QWS_TownStamps";
+ callfunc "QWS_DungeonStamps";
+ if (@Tstamp == @MaxTstamp)&&(@Dstamp == @MaxDstamp)&&($QW_SP_WarpMap$ != "") {
+ set @Mmenulist$[@Mj],@pMmenuitems$[@Mi];
+ set @Mmenuref[@Mj],@Mi;
+ set @Mj,@Mj+1;
+ }
+ set @Mi,@Mi+1;
+//----------------Town-Warp
+ if ($QW_TW_OFF == 0) {
+ set @Mmenulist$[@Mj],@pMmenuitems$[@Mi];
+ set @Mmenuref[@Mj],@Mi;
+ set @Mj,@Mj+1;
+ }
+ set @Mi,@Mi+1;
+//----------------Dungeon-Warp
+ if ($QW_DW_OFF == 0) {
+ set @Mmenulist$[@Mj],@pMmenuitems$[@Mi];
+ set @Mmenuref[@Mj],@Mi;
+ set @Mj,@Mj+1;
+ }
+ set @Mi,@Mi+1;
+//----------------Why-So-Few-Warps
+ set @Mmenulist$[@Mj],@pMmenuitems$[@Mi];
+ set @Mmenuref[@Mj],@Mi;
+ set @Mj,@Mj+1;
+ set @Mi,@Mi+1;
+//----------------No-Unlock
+ if (getarg(0) == 1) {
+ set @Mmenulist$[@Mj],@pMmenuitems$[@Mi];
+ set @Mmenuref[@Mj],@Mi;
+ set @Mj,@Mj+1;
+ }
+ set @Mi,@Mi+1;
+//----------------Healfull
+ if ($QW_HF == 1) {
+ set @Mmenulist$[@Mj],@pMmenuitems$[@Mi];
+ set @Mmenuref[@Mj],@Mi;
+ set @Mj,@Mj+1;
+ }
+ set @Mi,@Mi+1;
+//----------------Healpart
+ if ($QW_HP == 1) {
+ set @Mmenulist$[@Mj],@pMmenuitems$[@Mi];
+ set @Mmenuref[@Mj],@Mi;
+ set @Mj,@Mj+1;
+ }
+ set @Mi,@Mi+1;
+//----------------Storage
+ if ($QW_Stor == 1) {
+ set @Mmenulist$[@Mj],@pMmenuitems$[@Mi];
+ set @Mmenuref[@Mj],@Mi;
+ set @Mj,@Mj+1;
+ }
+ set @Mi,@Mi+1;
+//----------------GuildStorage
+ if ($QW_GStor == 1) {
+ set @Mmenulist$[@Mj],@pMmenuitems$[@Mi];
+ set @Mmenuref[@Mj],@Mi;
+ set @Mj,@Mj+1;
+ }
+ set @Mi,@Mi+1;
+//----------------Cancel
+ set @Mmenulist$[@Mj],@pMmenuitems$[@Mi];
+ set @Mmenuref[@Mj],@Mi;
+ return;
+}
+
+//======================Town=Menu=Array============================
+// Adding a town:
+// setarray @pTmenuitems$[@Ti], "Prontera";// Name of Town shown in Town select Menu
+// setarray @pTprice[@Ti], $QW_BW_PRICE; // Warp prices: Basic ($QW_BW_PRICE), Advanced ($QW_AW_PRICE), Overseas ($QW_OW_PRICE)
+//
+// setarray @pTmap$[@Ti], "prontera"; // Map name
+// setarray @pTXcoords[@Ti], 156; // X warp coords
+// setarray @pTYcoords[@Ti], 187; // Y warp coords
+//
+// QWS_Make_Town_Menu 0; // Use a free number (last used is 30, Eclage)
+//
+// Adding a warpra:
+// map,x,y,facing script Warpra#example 113,{
+// callfunc "QWS_Town_Warpra",<town number>,"Your Town";
+// close;
+// }
+// Town number is the same as "QWS_Make_Town_Menu".
+//==================================================================
+
+function script QWS_Tarray {
+ function QWS_Make_Town_Menu;
+
+ set @Ti,0; // loop counter
+ set @Tj,0; // menu lines counter
+
+//----------------Prontera
+ setarray @pTmenuitems$[@Ti], "Prontera";
+ setarray @pTprice[@Ti], $QW_BW_PRICE;
+
+ setarray @pTmap$[@Ti], "prontera";
+ setarray @pTXcoords[@Ti], 156;
+ setarray @pTYcoords[@Ti], 187;
+
+ QWS_Make_Town_Menu 0;
+//----------------Alberta
+ setarray @pTmenuitems$[@Ti], "Alberta";
+ setarray @pTprice[@Ti], $QW_BW_PRICE;
+
+ setarray @pTmap$[@Ti], "alberta";
+ setarray @pTXcoords[@Ti], 27;
+ setarray @pTYcoords[@Ti], 236;
+
+ QWS_Make_Town_Menu 1;
+//----------------Aldebaran
+ setarray @pTmenuitems$[@Ti], "Aldebaran";
+ setarray @pTprice[@Ti], $QW_AW_PRICE;
+
+ setarray @pTmap$[@Ti], "aldebaran";
+ setarray @pTXcoords[@Ti], 145;
+ setarray @pTYcoords[@Ti], 120;
+
+ QWS_Make_Town_Menu 2;
+//----------------Amatsu:
+ setarray @pTmenuitems$[@Ti], "Amatsu";
+ setarray @pTprice[@Ti], $QW_OW_PRICE;
+
+ setarray @pTmap$[@Ti], "amatsu";
+ setarray @pTXcoords[@Ti], 197;
+ setarray @pTYcoords[@Ti], 86;
+
+ QWS_Make_Town_Menu 3;
+//----------------Ayothaya:
+ setarray @pTmenuitems$[@Ti], "Ayothaya";
+ setarray @pTprice[@Ti], $QW_OW_PRICE;
+
+ setarray @pTmap$[@Ti], "ayothaya";
+ setarray @pTXcoords[@Ti], 150;
+ setarray @pTYcoords[@Ti], 57;
+
+ QWS_Make_Town_Menu 4;
+//----------------Brasilis:
+ setarray @pTmenuitems$[@Ti], "Brasilis";
+ setarray @pTprice[@Ti], $QW_OW_PRICE;
+
+ setarray @pTmap$[@Ti], "brasilis";
+ setarray @pTXcoords[@Ti], 195;
+ setarray @pTYcoords[@Ti], 220;
+
+ QWS_Make_Town_Menu 21;
+//----------------Comodo:
+ setarray @pTmenuitems$[@Ti], "Comodo";
+ setarray @pTprice[@Ti], $QW_AW_PRICE;
+
+ setarray @pTmap$[@Ti], "comodo";
+ setarray @pTXcoords[@Ti], 188;
+ setarray @pTYcoords[@Ti], 161;
+
+ QWS_Make_Town_Menu 5;
+//----------------Dewata:
+ setarray @pTmenuitems$[@Ti], "Dewata";
+ setarray @pTprice[@Ti], $QW_OW_PRICE;
+
+ setarray @pTmap$[@Ti], "dewata";
+ setarray @pTXcoords[@Ti], 199;
+ setarray @pTYcoords[@Ti], 179;
+
+ QWS_Make_Town_Menu 29;
+//----------------Eclage:
+ setarray @pTmenuitems$[@Ti], "Eclage";
+ setarray @pTprice[@Ti], $QW_OW_PRICE;
+
+ setarray @pTmap$[@Ti], "eclage";
+ setarray @pTXcoords[@Ti], 111;
+ setarray @pTYcoords[@Ti], 39;
+
+ QWS_Make_Town_Menu 30;
+//----------------Einbech:
+ setarray @pTmenuitems$[@Ti], "Einbech";
+ setarray @pTprice[@Ti], $QW_AW_PRICE;
+
+ setarray @pTmap$[@Ti], "einbech";
+ setarray @pTXcoords[@Ti], 172;
+ setarray @pTYcoords[@Ti], 126;
+
+ QWS_Make_Town_Menu 6;
+//----------------Einbroch:
+ setarray @pTmenuitems$[@Ti], "Einbroch";
+ setarray @pTprice[@Ti], $QW_AW_PRICE;
+
+ setarray @pTmap$[@Ti], "einbroch";
+ setarray @pTXcoords[@Ti], 230;
+ setarray @pTYcoords[@Ti], 191;
+
+ QWS_Make_Town_Menu 7;
+//----------------El Dicastes:
+ setarray @pTmenuitems$[@Ti], "El Dicastes";
+ setarray @pTprice[@Ti], $QW_OW_PRICE;
+
+ setarray @pTmap$[@Ti], "dicastes01";
+ setarray @pTXcoords[@Ti], 197;
+ setarray @pTYcoords[@Ti], 187;
+
+ QWS_Make_Town_Menu 22;
+//----------------Geffen:
+ setarray @pTmenuitems$[@Ti], "Geffen";
+ setarray @pTprice[@Ti], $QW_BW_PRICE;
+
+ setarray @pTmap$[@Ti], "geffen";
+ setarray @pTXcoords[@Ti], 119;
+ setarray @pTYcoords[@Ti], 66;
+
+ QWS_Make_Town_Menu 8;
+//----------------Gonryun:
+ setarray @pTmenuitems$[@Ti], "Gonryun";
+ setarray @pTprice[@Ti], $QW_OW_PRICE;
+
+ setarray @pTmap$[@Ti], "gonryun";
+ setarray @pTXcoords[@Ti], 150;
+ setarray @pTYcoords[@Ti], 130;
+
+ QWS_Make_Town_Menu 9;
+//----------------Hugel:
+ setarray @pTmenuitems$[@Ti], "Hugel";
+ setarray @pTprice[@Ti], $QW_AW_PRICE;
+
+ setarray @pTmap$[@Ti], "hugel";
+ setarray @pTXcoords[@Ti], 95;
+ setarray @pTYcoords[@Ti], 121;
+
+ QWS_Make_Town_Menu 10;
+//----------------Izlude:
+ setarray @pTmenuitems$[@Ti], "Izlude";
+ setarray @pTprice[@Ti], $QW_BW_PRICE;
+
+ setarray @pTmap$[@Ti], "izlude";
+ setarray @pTXcoords[@Ti], 128;
+ setarray @pTYcoords[@Ti], 111;
+
+ QWS_Make_Town_Menu 11;
+//----------------Jawaii:
+ setarray @pTmenuitems$[@Ti], "Jawaii";
+ setarray @pTprice[@Ti], $QW_AW_PRICE;
+
+ setarray @pTmap$[@Ti], "jawaii";
+ setarray @pTXcoords[@Ti], 243;
+ setarray @pTYcoords[@Ti], 115;
+
+ QWS_Make_Town_Menu 12;
+//----------------Lighthalzen:
+ setarray @pTmenuitems$[@Ti], "Lighthalzen";
+ setarray @pTprice[@Ti], $QW_AW_PRICE;
+
+ setarray @pTmap$[@Ti], "lighthalzen";
+ setarray @pTXcoords[@Ti], 158;
+ setarray @pTYcoords[@Ti], 110;
+
+ QWS_Make_Town_Menu 13;
+//----------------Louyang:
+ setarray @pTmenuitems$[@Ti], "Louyang";
+ setarray @pTprice[@Ti], $QW_OW_PRICE;
+
+ setarray @pTmap$[@Ti], "louyang";
+ setarray @pTXcoords[@Ti], 210;
+ setarray @pTYcoords[@Ti], 108;
+
+ QWS_Make_Town_Menu 14;
+//----------------Lutie
+ setarray @pTmenuitems$[@Ti], "Lutie";
+ setarray @pTprice[@Ti], $QW_AW_PRICE;
+
+ setarray @pTmap$[@Ti], "xmas";
+ setarray @pTXcoords[@Ti], 148;
+ setarray @pTYcoords[@Ti], 131;
+
+ QWS_Make_Town_Menu 15;
+//----------------Manuk
+ setarray @pTmenuitems$[@Ti], "Manuk";
+ setarray @pTprice[@Ti], $QW_OW_PRICE;
+
+ setarray @pTmap$[@Ti], "manuk";
+ setarray @pTXcoords[@Ti], 260;
+ setarray @pTYcoords[@Ti], 175;
+
+ QWS_Make_Town_Menu 23;
+//----------------Mora
+ setarray @pTmenuitems$[@Ti], "Mora";
+ setarray @pTprice[@Ti], $QW_OW_PRICE;
+
+ setarray @pTmap$[@Ti], "mora";
+ setarray @pTXcoords[@Ti], 111;
+ setarray @pTYcoords[@Ti], 97;
+
+ QWS_Make_Town_Menu 24;
+//----------------Morroc:
+ setarray @pTmenuitems$[@Ti], "Morroc";
+ setarray @pTprice[@Ti], $QW_BW_PRICE;
+
+ setarray @pTmap$[@Ti], "morocc";
+ setarray @pTXcoords[@Ti], 159;
+ setarray @pTYcoords[@Ti], 93;
+
+ QWS_Make_Town_Menu 16;
+//----------------Moscovia
+ setarray @pTmenuitems$[@Ti], "Moscovia";
+ setarray @pTprice[@Ti], $QW_OW_PRICE;
+
+ setarray @pTmap$[@Ti], "moscovia";
+ setarray @pTXcoords[@Ti], 219;
+ setarray @pTYcoords[@Ti], 193;
+
+ QWS_Make_Town_Menu 25;
+//----------------Niflheim:
+ setarray @pTmenuitems$[@Ti], "Niflheim";
+ setarray @pTprice[@Ti], $QW_AW_PRICE;
+
+ setarray @pTmap$[@Ti], "niflheim";
+ setarray @pTXcoords[@Ti], 195;
+ setarray @pTYcoords[@Ti], 186;
+
+ QWS_Make_Town_Menu 17;
+//----------------Payon:
+ setarray @pTmenuitems$[@Ti], "Payon";
+ setarray @pTprice[@Ti], $QW_BW_PRICE;
+
+ setarray @pTmap$[@Ti], "payon";
+ setarray @pTXcoords[@Ti], 152;
+ setarray @pTYcoords[@Ti], 75;
+
+ QWS_Make_Town_Menu 18;
+//----------------Rachel
+ setarray @pTmenuitems$[@Ti], "Rachel";
+ setarray @pTprice[@Ti], $QW_AW_PRICE;
+
+ setarray @pTmap$[@Ti], "rachel";
+ setarray @pTXcoords[@Ti], 130;
+ setarray @pTYcoords[@Ti], 111;
+
+ QWS_Make_Town_Menu 26;
+//----------------Splendide
+ setarray @pTmenuitems$[@Ti], "Splendide";
+ setarray @pTprice[@Ti], $QW_OW_PRICE;
+
+ setarray @pTmap$[@Ti], "splendide";
+ setarray @pTXcoords[@Ti], 200;
+ setarray @pTYcoords[@Ti], 153;
+
+ QWS_Make_Town_Menu 27;
+//----------------Umbala:
+ setarray @pTmenuitems$[@Ti], "Umbala";
+ setarray @pTprice[@Ti], $QW_AW_PRICE;
+
+ setarray @pTmap$[@Ti], "umbala";
+ setarray @pTXcoords[@Ti], 130;
+ setarray @pTYcoords[@Ti], 130;
+
+ QWS_Make_Town_Menu 19;
+//----------------Veins
+ setarray @pTmenuitems$[@Ti], "Veins";
+ setarray @pTprice[@Ti], $QW_OW_PRICE;
+
+ setarray @pTmap$[@Ti], "veins";
+ setarray @pTXcoords[@Ti], 216;
+ setarray @pTYcoords[@Ti], 123;
+
+ QWS_Make_Town_Menu 28;
+//----------------Yuno:
+ setarray @pTmenuitems$[@Ti], "Yuno";
+ setarray @pTprice[@Ti], $QW_AW_PRICE;
+
+ setarray @pTmap$[@Ti], "yuno";
+ setarray @pTXcoords[@Ti], 160;
+ setarray @pTYcoords[@Ti], 168;
+
+ QWS_Make_Town_Menu 20;
+//----------------Cancel
+ setarray @pTmenuitems$[@Ti], "Cancel";
+ setarray @pTprice[@Ti], 0;
+
+ set @Tmenulist$[@Tj],@pTmenuitems$[@Ti];
+ set @Tmenuref[@Tj],57005; // 57005='dead' in hex
+ return;
+
+
+//----------------Make Town Menu Function
+
+function QWS_Make_Town_Menu {
+ set @temptownmenubin,1;
+ if (getarg(0) == 0) goto menu_item;
+ set @templooptownmenu,0;
+ do {
+ set @temptownmenubin, @temptownmenubin * 2;
+ set @templooptownmenu, @templooptownmenu + 1;
+ }while (getarg(0) > @templooptownmenu);
+// check marker and make menu item
+menu_item:
+ if ((@temptownmenubin & ##QWS_T_Unlock) != @temptownmenubin) {
+ set @Ti,@Ti+1;
+ return;
+ }
+ if (@pTprice[@Ti] != 0)&&($QW_MapUserShow == 0) set @Tmenulist$[@Tj], @pTmenuitems$[@Ti]+" -> "+@pTprice[@Ti];
+ if (@pTprice[@Ti] == 0)&&($QW_MapUserShow == 0) set @Tmenulist$[@Tj], @pTmenuitems$[@Ti];
+ if (@pTprice[@Ti] != 0)&&($QW_MapUserShow == 1) set @Tmenulist$[@Tj], @pTmenuitems$[@Ti]+" ["+getmapusers(@pTmap$[@Ti])+"]"+" -> "+@pTprice[@Ti];
+ if (@pTprice[@Ti] == 0)&&($QW_MapUserShow == 1) set @Tmenulist$[@Tj], @pTmenuitems$[@Ti]+" ["+getmapusers(@pTmap$[@Ti])+"]";
+ set @Tmenuref[@Tj],@Ti;
+ set @Tj,@Tj+1;
+ set @Ti,@Ti+1;
+ return;
+}
+}
+
+//====================Dungeon=Menu=Arrays==========================
+// Adding a dungeon:
+// setarray @pDmenuitems$[@Di], "Abyss Lake"; // Name of Dungeon shown in Dungeon select Menu
+// setarray @pDprice[@Di], $QW_AW_PRICE; // Warp prices: Basic ($QW_BW_PRICE), Advanced ($QW_AW_PRICE), Overseas ($QW_OW_PRICE)
+// setarray @pDfee$[@Di], "$QW_AW_FEE"; // Identifier for fee caluclation: Basic ("$QW_BW_FEE"), Advanced ("$QW_AW_FEE"), Overseas ("$QW_OW_FEE")
+// setarray @DLevels[@Di], 3; // Number of levels in dungeon
+//
+// setarray @DGat$[@Dref], "abyss_01", "abyss_02", "abyss_03"; // Map names of dungeon levels
+// setarray @DLevelName$[@Dref], "Level 1", "Level 2", "Level 3"; // Name of dungeon levels shown in Menu
+// setarray @DXcoords[@Dref], 265, 275, 116; // X warp coords
+// setarray @DYcoords[@Dref], 273, 270, 27; // Y warp coords
+// setarray @DDepth[@Dref], 0, 1, 2; // Relative depth to entrance, to calculate extra warp fee
+//
+// QWS_Make_Dungeon_Menu 0; // Use a free number (last used is 28, Kiel Dungeon)
+//
+// Adding a warpra:
+// map,x,y,facing script Warpra Helper#example 112,{
+// callfunc "QWS_Dungeon_Warpra",<dungeon number>,"Your Dungeon";
+// close;
+// }
+// Dungeon number is the same as "QWS_Make_Dungeon_Menu".
+//==================================================================
+
+function script QWS_Darray {
+ function QWS_Make_Dungeon_Menu;
+
+ set @Di,0;
+ set @Dj,0;
+ set @Dref,0;
+
+//----------------ABYSS LAKE
+ setarray @pDmenuitems$[@Di], "Abyss Lake";
+ setarray @pDprice[@Di], $QW_AW_PRICE;
+ setarray @pDfee$[@Di], "$QW_AW_FEE";
+ setarray @DLevels[@Di], 3;
+
+ setarray @DGat$[@Dref], "abyss_01", "abyss_02", "abyss_03";
+ setarray @DLevelName$[@Dref], "Level 1", "Level 2", "Level 3";
+ setarray @DXcoords[@Dref], 265, 275, 116;
+ setarray @DYcoords[@Dref], 273, 270, 27;
+ setarray @DDepth[@Dref], 0, 1, 2;
+
+ QWS_Make_Dungeon_Menu 0;
+
+//----------------AMATSU DUNGEON
+ setarray @pDmenuitems$[@Di], "Amatsu Dungeon";
+ setarray @pDprice[@Di], $QW_OW_PRICE;
+ setarray @pDfee$[@Di], "$QW_OW_FEE";
+ setarray @DLevels[@Di], 3;
+
+ setarray @DGat$[@Dref], "ama_dun01", "ama_dun02", "ama_dun03";
+ setarray @DLevelName$[@Dref], "Level 1", "Level 2", "Level 3";
+ setarray @DXcoords[@Dref], 227, 32, 119;
+ setarray @DYcoords[@Dref], 10, 43, 15;
+ setarray @DDepth[@Dref], 0, 1, 2;
+
+ QWS_Make_Dungeon_Menu 1;
+
+//----------------ANT HELL
+ setarray @pDmenuitems$[@Di], "Ant Hell Dungeon";
+ setarray @pDprice[@Di], $QW_BW_PRICE;
+ setarray @pDfee$[@Di], "$QW_BW_FEE";
+ setarray @DLevels[2], 2;
+
+ setarray @DGat$[@Dref], "anthell01", "anthell02";
+ setarray @DLevelName$[@Dref], "Level 1", "Level 2";
+ setarray @DXcoords[@Dref], 32, 34;
+ setarray @DYcoords[@Dref], 262, 263;
+ setarray @DDepth[@Dref], 0, 1;
+
+ QWS_Make_Dungeon_Menu 2;
+
+//----------------AYOTAYA
+ setarray @pDmenuitems$[@Di], "Ayotaya Dungeon";
+ setarray @pDprice[@Di], $QW_OW_PRICE;
+ setarray @pDfee$[@Di], "$QW_OW_FEE";
+ setarray @DLevels[3], 2;
+
+ setarray @DGat$[@Dref], "ayo_dun01", "ayo_dun02";
+ setarray @DLevelName$[@Dref], "Level 1", "Level 2";
+ setarray @DXcoords[@Dref], 275, 150;
+ setarray @DYcoords[@Dref], 17, 13;
+ setarray @DDepth[@Dref], 0, 1;
+
+ QWS_Make_Dungeon_Menu 3;
+
+//----------------BYALAN
+ setarray @pDmenuitems$[@Di], "Byalan Dungeon";
+ setarray @pDprice[@Di], $QW_BW_PRICE;
+ setarray @pDfee$[@Di], "$QW_BW_FEE";
+ setarray @DLevels[4], 5;
+
+ setarray @DGat$[@Dref], "iz_dun00", "iz_dun01", "iz_dun02", "iz_dun03", "iz_dun04";
+ setarray @DLevelName$[@Dref], "Level 1", "Level 2", "Level 3", "Level 4", "Level 5";
+ setarray @DXcoords[@Dref], 168, 41, 236, 32, 26;
+ setarray @DYcoords[@Dref], 168, 37, 204, 63, 27;
+ setarray @DDepth[@Dref], 0, 1, 2, 3, 4;
+
+ QWS_Make_Dungeon_Menu 4;
+
+//----------------CLOCK TOWER
+ setarray @pDmenuitems$[@Di], "Clock Tower Dungeon";
+ setarray @pDprice[@Di], $QW_AW_PRICE;
+ setarray @pDfee$[@Di], "$QW_AW_FEE";
+ setarray @DLevels[5], 8;
+
+ setarray @DGat$[@Dref], "c_tower1", "c_tower2", "c_tower3", "c_tower4", "alde_dun01", "alde_dun02", "alde_dun03", "alde_dun04";
+ setarray @DLevelName$[@Dref], "Clock Tower Level 1", "Clock Tower Level 2", "Clock Tower Level 3", "Clock Tower Level 4", "Basement 1F", "Basement 2F", "Basement 3F", "Basement 4F";
+ setarray @DXcoords[@Dref], 200, 268, 64, 32, 197, 262, 276, 122;
+ setarray @DYcoords[@Dref], 163, 26, 148, 63, 25, 41, 53, 125;
+ setarray @DDepth[@Dref], 0, 1, 2, 3, 1, 2, 3, 4;
+
+ QWS_Make_Dungeon_Menu 5;
+
+//----------------COAL MINE
+ setarray @pDmenuitems$[@Di], "Coal Mine Dungeon";
+ setarray @pDprice[@Di], $QW_AW_PRICE;
+ setarray @pDfee$[@Di], "$QW_AW_FEE";
+ setarray @DLevels[6], 3;
+
+ setarray @DGat$[@Dref], "mjo_dun01", "mjo_dun02", "mjo_dun03";
+ setarray @DLevelName$[@Dref], "Level 1", "Level 2", "Level 3";
+ setarray @DXcoords[@Dref], 52, 381, 302;
+ setarray @DYcoords[@Dref], 17, 343, 261;
+ setarray @DDepth[@Dref], 0, 1, 2;
+
+ QWS_Make_Dungeon_Menu 6;
+
+//----------------CULVERT
+ setarray @pDmenuitems$[@Di], "Culvert Dungeon";
+ setarray @pDprice[@Di], $QW_BW_PRICE;
+ setarray @pDfee$[@Di], "$QW_BW_FEE";
+ setarray @DLevels[7], 4;
+
+ setarray @DGat$[@Dref], "prt_sewb1", "prt_sewb2", "prt_sewb3", "prt_sewb4";
+ setarray @DLevelName$[@Dref], "Level 1", "Level 2", "Level 3", "Level 4";
+ setarray @DXcoords[@Dref], 132, 19, 180, 100;
+ setarray @DYcoords[@Dref], 248, 19, 169, 92;
+ setarray @DDepth[@Dref], 0, 1, 2, 3;
+
+ QWS_Make_Dungeon_Menu 7;
+
+//----------------EINBECH DUNGEON
+ setarray @pDmenuitems$[@Di], "Einbech Dungeon";
+ setarray @pDprice[@Di], $QW_AW_PRICE;
+ setarray @pDfee$[@Di], "$QW_AW_FEE";
+ setarray @DLevels[8], 2;
+
+ setarray @DGat$[@Dref], "ein_dun01", "ein_dun02";
+ setarray @DLevelName$[@Dref], "Level 1", "Level 2";
+ setarray @DXcoords[@Dref], 22, 292;
+ setarray @DYcoords[@Dref], 14, 290;
+ setarray @DDepth[@Dref], 0, 1;
+
+ QWS_Make_Dungeon_Menu 8;
+
+//----------------GEFENIA DUNGEON
+ setarray @pDmenuitems$[@Di], "Gefenia Dungeon";
+ setarray @pDprice[@Di], $QW_BW_PRICE;
+ setarray @pDfee$[@Di], "$QW_BW_FEE";
+ setarray @DLevels[9], 4;
+
+ setarray @DGat$[@Dref], "gefenia01", "gefenia02", "gefenia03", "gefenia04";
+ setarray @DLevelName$[@Dref], "Level 1", "Level 2", "Level 3", "Level 4";
+ setarray @DXcoords[@Dref], 59, 201, 264, 33;
+ setarray @DYcoords[@Dref], 167, 35, 236, 270;
+ setarray @DDepth[@Dref], 0, 1, 2, 3;
+
+ QWS_Make_Dungeon_Menu 9;
+
+//----------------GEFFEN DUNGEON
+ setarray @pDmenuitems$[@Di], "Geffen Dungeon";
+ setarray @pDprice[@Di], $QW_BW_PRICE;
+ setarray @pDfee$[@Di], "$QW_BW_FEE";
+ setarray @DLevels[@Di], 4;
+
+ setarray @DGat$[@Dref], "gef_dun00", "gef_dun01", "gef_dun02", "gef_dun03";
+ setarray @DLevelName$[@Dref], "Level 1", "Level 2", "Level 3", "Level 4";
+ setarray @DXcoords[@Dref], 104, 115, 106, 203;
+ setarray @DYcoords[@Dref], 100, 236, 132, 200;
+ setarray @DDepth[@Dref], 0, 1, 2, 3;
+
+ QWS_Make_Dungeon_Menu 10;
+
+//----------------GLAST HEIM
+ setarray @pDmenuitems$[@Di], "Glast Heim Dungeon";
+ setarray @pDprice[@Di], $QW_BW_PRICE;
+ setarray @pDfee$[@Di], "$QW_BW_FEE";
+ setarray @DLevels[@Di], 17;
+
+ setarray @DGat$[@Dref], "glast_01", "gl_church", "gl_chyard", "gl_in01", "gl_cas01", "gl_cas02", "gl_knt01", "gl_knt02", "gl_prison", "gl_prison1", "gl_step", "gl_sew01", "gl_sew02", "gl_sew03", "gl_sew04", "gl_dun01", "gl_dun02";
+ setarray @DLevelName$[@Dref], "Glast Heim Entrance", "St. Abbey", "Churchyard", "Inside Glast Heim", "Castle 1", "Castle 2", "Chivalry 1", "Chivalry 2", "Prison 1", "Prison 2", "Steps", "Sewers 1", "Sewers 2", "Sewers 3", "Sewers 4", "Lowest Cave 1", "Lowest Cave 2";
+ setarray @DXcoords[@Dref], 370, 156, 147, 121, 199, 104, 150, 157, 14, 150, 117, 258, 108, 171, 68, 133, 224;
+ setarray @DYcoords[@Dref], 300, 8, 15, 59, 29, 25, 10, 287, 70, 14, 124, 255, 291, 273, 277, 271, 274;
+ setarray @DDepth[@Dref], 0, 1, 2, 1, 1, 2, 1, 2, 2, 3, 1, 4, 2, 3, 4, 5, 6;
+
+ QWS_Make_Dungeon_Menu 11;
+
+//----------------GONRYUN DUNGEON
+ setarray @pDmenuitems$[@Di], "Gonryun Dungeon";
+ setarray @pDprice[@Di], $QW_OW_PRICE;
+ setarray @pDfee$[@Di], "$QW_OW_FEE";
+ setarray @DLevels[@Di], 3;
+
+ setarray @DGat$[@Dref], "gon_dun01", "gon_dun02", "gon_dun03";
+ setarray @DLevelName$[@Dref], "Level 1", "Level 2", "Level 3";
+ setarray @DXcoords[@Dref], 143, 17, 68;
+ setarray @DYcoords[@Dref], 59, 114, 9;
+ setarray @DDepth[@Dref], 0, 1, 2;
+
+ QWS_Make_Dungeon_Menu 12;
+
+//----------------HIDDEN DUNGEON
+ setarray @pDmenuitems$[@Di], "Hidden Dungeon";
+ setarray @pDprice[@Di], $QW_BW_PRICE;
+ setarray @pDfee$[@Di], "$QW_BW_FEE";
+ setarray @DLevels[@Di], 3;
+
+ setarray @DGat$[@Dref], "prt_maze01", "prt_maze02", "prt_maze03";
+ setarray @DLevelName$[@Dref], "Level 1", "Level 2", "Level 3";
+ setarray @DXcoords[@Dref], 176, 94, 23;
+ setarray @DYcoords[@Dref], 6, 19, 8;
+ setarray @DDepth[@Dref], 0, 1, 2;
+
+ QWS_Make_Dungeon_Menu 13;
+
+//----------------JUPEROS CAVE
+ setarray @pDmenuitems$[@Di], "Juperos Cave";
+ setarray @pDprice[@Di], $QW_AW_PRICE;
+ setarray @pDfee$[@Di], "$QW_AW_FEE";
+ setarray @DLevels[@Di], 2;
+
+ setarray @DGat$[@Dref], "juperos_01", "juperos_02";
+ setarray @DLevelName$[@Dref], "Level 1", "Level 2";
+ setarray @DXcoords[@Dref], 53, 36;
+ setarray @DYcoords[@Dref], 247, 60;
+ setarray @DDepth[@Dref], 0, 1;
+
+ QWS_Make_Dungeon_Menu 14;
+
+//----------------KIEL DUNGEON
+ setarray @pDmenuitems$[@Di], "Kiel Dungeon";
+ setarray @pDprice[@Di], $QW_AW_PRICE;
+ setarray @pDfee$[@Di], "$QW_AW_FEE";
+ setarray @DLevels[@Di], 2;
+
+ setarray @DGat$[@Dref], "kh_dun01", "kh_dun02";
+ setarray @DLevelName$[@Dref], "1st Floor", "2nd Floor";
+ setarray @DXcoords[@Dref], 63, 42;
+ setarray @DYcoords[@Dref], 10, 197;
+ setarray @DDepth[@Dref], 0, 1;
+
+ QWS_Make_Dungeon_Menu 28;
+
+//----------------LIGHTHALZEN BIO LAB
+ setarray @pDmenuitems$[@Di], "Lighthalzen Bio Lab";
+ setarray @pDprice[@Di], $QW_AW_PRICE;
+ setarray @pDfee$[@Di], "$QW_AW_FEE";
+ setarray @DLevels[@Di], 3;
+
+ setarray @DGat$[@Dref], "lhz_dun01", "lhz_dun02", "lhz_dun03";
+ setarray @DLevelName$[@Dref], "Level 1", "Level 2", "Level 3";
+ setarray @DXcoords[@Dref], 150, 150, 140;
+ setarray @DYcoords[@Dref], 287, 18, 137;
+ setarray @DDepth[@Dref], 0, 1, 2;
+
+ QWS_Make_Dungeon_Menu 15;
+
+//----------------LOUYANG DUNGEON
+ setarray @pDmenuitems$[@Di], "Louyang Dungeon";
+ setarray @pDprice[@Di], $QW_OW_PRICE;
+ setarray @pDfee$[@Di], "$QW_OW_FEE";
+ setarray @DLevels[@Di], 2;
+
+ setarray @DGat$[@Dref], "lou_dun02", "lou_dun03";
+ setarray @DLevelName$[@Dref], "Royal Tomb Level 1", "Royal Tomb Level 2";
+ setarray @DXcoords[@Dref], 282, 165;
+ setarray @DYcoords[@Dref], 20, 38;
+ setarray @DDepth[@Dref], 0, 1;
+
+ QWS_Make_Dungeon_Menu 16;
+
+//----------------MAGMA DUNGEON
+ setarray @pDmenuitems$[@Di], "Magma Dungeon";
+ setarray @pDprice[@Di], $QW_AW_PRICE;
+ setarray @pDfee$[@Di], "$QW_AW_FEE";
+ setarray @DLevels[@Di], 2;
+
+ setarray @DGat$[@Dref], "mag_dun01", "mag_dun02";
+ setarray @DLevelName$[@Dref], "Level 1", "Level 2";
+ setarray @DXcoords[@Dref], 126, 47;
+ setarray @DYcoords[@Dref], 69, 32;
+ setarray @DDepth[@Dref], 0, 1;
+
+ QWS_Make_Dungeon_Menu 17;
+
+//----------------ODIN TEMPLE
+ setarray @pDmenuitems$[@Di], "Odin Temple";
+ setarray @pDprice[@Di], $QW_AW_PRICE;
+ setarray @pDfee$[@Di], "$QW_AW_FEE";
+ setarray @DLevels[@Di], 1;
+
+ setarray @DGat$[@Dref], "odin_tem01";
+ setarray @DLevelName$[@Dref], "Level 1";
+ setarray @DXcoords[@Dref], 96;
+ setarray @DYcoords[@Dref], 145;
+ setarray @DDepth[@Dref], 0;
+
+ QWS_Make_Dungeon_Menu 18;
+
+//----------------ORC DUNGEON
+ setarray @pDmenuitems$[@Di], "Orc Dungeon";
+ setarray @pDprice[@Di], $QW_BW_PRICE;
+ setarray @pDfee$[@Di], "$QW_BW_FEE";
+ setarray @DLevels[@Di], 2;
+
+ setarray @DGat$[@Dref], "orcsdun01", "orcsdun02";
+ setarray @DLevelName$[@Dref], "Level 1", "Level 2";
+ setarray @DXcoords[@Dref], 32, 21;
+ setarray @DYcoords[@Dref], 169, 185;
+ setarray @DDepth[@Dref], 0, 1;
+
+ QWS_Make_Dungeon_Menu 19;
+
+//----------------PAYON DUNGEON
+ setarray @pDmenuitems$[@Di], "Payon Dungeon";
+ setarray @pDprice[@Di], $QW_BW_PRICE;
+ setarray @pDfee$[@Di], "$QW_BW_FEE";
+ setarray @DLevels[@Di], 5;
+
+ setarray @DGat$[@Dref], "pay_dun00", "pay_dun01", "pay_dun02", "pay_dun03", "pay_dun04";
+ setarray @DLevelName$[@Dref], "Level 1", "Level 2", "Level 3", "Level 4", "Level 5";
+ setarray @DXcoords[@Dref], 22, 19, 19, 155, 201;
+ setarray @DYcoords[@Dref], 180, 33, 63, 159, 204;
+ setarray @DDepth[@Dref], 0, 1, 2, 3, 4;
+
+ QWS_Make_Dungeon_Menu 20;
+
+//----------------PYRAMIDS
+ setarray @pDmenuitems$[@Di], "Pyramids Dungeon";
+ setarray @pDprice[@Di], $QW_BW_PRICE;
+ setarray @pDfee$[@Di], "$QW_BW_FEE";
+ setarray @DLevels[@Di], 6;
+
+ setarray @DGat$[@Dref], "moc_pryd01", "moc_pryd02", "moc_pryd03", "moc_pryd04", "moc_pryd05", "moc_pryd06";
+ setarray @DLevelName$[@Dref], "Level 1", "Level 2", "Level 3", "Level 4", "Basement 1", "Basement 2";
+ setarray @DXcoords[@Dref], 192, 10, 100, 181, 94, 192;
+ setarray @DYcoords[@Dref], 9, 192, 92, 11, 96, 8;
+ setarray @DDepth[@Dref], 0, 1, 2, 3, 1, 2;
+
+ QWS_Make_Dungeon_Menu 21;
+
+//----------------SPHINX
+ setarray @pDmenuitems$[@Di], "Sphinx Dungeon";
+ setarray @pDprice[@Di], $QW_BW_PRICE;
+ setarray @pDfee$[@Di], "$QW_BW_FEE";
+ setarray @DLevels[@Di], 5;
+
+ setarray @DGat$[@Dref], "in_sphinx1", "in_sphinx2", "in_sphinx3", "in_sphinx4", "in_sphinx5";
+ setarray @DLevelName$[@Dref], "Level 1", "Level 2", "Level 3", "Level 4", "Level 5";
+ setarray @DXcoords[@Dref], 192, 149, 210, 10, 100;
+ setarray @DYcoords[@Dref], 9, 81, 54, 222, 99;
+ setarray @DDepth[@Dref], 0, 1, 2, 3, 4;
+
+ QWS_Make_Dungeon_Menu 22;
+
+//----------------SUNKEN SHIP
+ setarray @pDmenuitems$[@Di], "Sunken Ship Dungeon";
+ setarray @pDprice[@Di], $QW_BW_PRICE;
+ setarray @pDfee$[@Di], "$QW_BW_FEE";
+ setarray @DLevels[@Di], 2;
+
+ setarray @DGat$[@Dref], "treasure01", "treasure02";
+ setarray @DLevelName$[@Dref], "Level 1", "Level 2";
+ setarray @DXcoords[@Dref], 69, 102;
+ setarray @DYcoords[@Dref], 24, 27;
+ setarray @DDepth[@Dref], 0, 1;
+
+ QWS_Make_Dungeon_Menu 23;
+
+//----------------THANATOS TOWER
+ setarray @pDmenuitems$[@Di], "Thanatos Tower";
+ setarray @pDprice[@Di], $QW_AW_PRICE;
+ setarray @pDfee$[@Di], "$QW_AW_FEE";
+ setarray @DLevels[@Di], 13;
+
+ setarray @DGat$[@Dref], "tha_t01", "tha_t02", "tha_t03", "tha_t04", "tha_t05", "tha_t06", "tha_t07", "tha_t08", "tha_t09", "tha_t10", "tha_t11", "tha_t12", "thana_boss";
+ setarray @DLevelName$[@Dref], "Level 1", "Level 2", "Level 3", "Level 4", "Level 5", "Level 6", "Level 7", "Level 8", "Level 9", "Level 10", "Level 11", "Level 12", "Thanatos Boss";
+ setarray @DXcoords[@Dref], 150, 150, 220, 59, 62, 206, 35, 105, 88, 168, 90, 129, 85;
+ setarray @DYcoords[@Dref], 35, 136, 158, 143, 11, 8, 166, 44, 145, 138, 36, 83, 76;
+ setarray @DDepth[@Dref], 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12;
+
+ QWS_Make_Dungeon_Menu 24;
+
+//----------------TOY FACTORY
+ setarray @pDmenuitems$[@Di], "Toy Factory Dungeon";
+ setarray @pDprice[@Di], $QW_AW_PRICE;
+ setarray @pDfee$[@Di], "$QW_AW_FEE";
+ setarray @DLevels[@Di], 2;
+
+ setarray @DGat$[@Dref], "xmas_dun01", "xmas_dun02";
+ setarray @DLevelName$[@Dref], "Factory Warehouse", "Classifying Room";
+ setarray @DXcoords[@Dref], 205, 129;
+ setarray @DYcoords[@Dref], 16, 133;
+ setarray @DDepth[@Dref], 0, 1;
+
+ QWS_Make_Dungeon_Menu 25;
+
+//----------------TURTLE ISTLAND
+ setarray @pDmenuitems$[@Di], "Turtle Island Dungeon";
+ setarray @pDprice[@Di], $QW_AW_PRICE;
+ setarray @pDfee$[@Di], "$QW_AW_FEE";
+ setarray @DLevels[@Di], 4;
+
+ setarray @DGat$[@Dref], "tur_dun01", "tur_dun02", "tur_dun03", "tur_dun04";
+ setarray @DLevelName$[@Dref], "Outside", "Level 1", "Level 2", "Level 3";
+ setarray @DXcoords[@Dref], 161, 148, 132, 100;
+ setarray @DYcoords[@Dref], 34, 256, 190, 192;
+ setarray @DDepth[@Dref], 0, 0, 1, 2;
+
+ QWS_Make_Dungeon_Menu 26;
+
+//----------------UMBALA
+ setarray @pDmenuitems$[@Di], "Umbala Dungeon";
+ setarray @pDprice[@Di], $QW_OW_PRICE;
+ setarray @pDfee$[@Di], "$QW_OW_FEE";
+ setarray @DLevels[@Di], 3;
+
+ setarray @DGat$[@Dref], "um_dun01", "um_dun02", "yggdrasil01";
+ setarray @DLevelName$[@Dref], "Carpenter's Shop in The Tree", "Passage to a Foreign World", "Hvergelmir's Fountain";
+ setarray @DXcoords[@Dref], 205, 48, 40;
+ setarray @DYcoords[@Dref], 26, 30, 63;
+ setarray @DDepth[@Dref], 0, 1, 2;
+
+ QWS_Make_Dungeon_Menu 27;
+
+//----------------Cancel
+ setarray @pDmenuitems$[@Di], "Cancel";
+ setarray @pDprice[@Di], 0;
+
+ set @Dmenulist$[@Dj],@pDmenuitems$[@Di];
+ set @Dmenuref[@Dj],57005; // 57005='dead' in hex
+ return;
+
+
+//----------------Make Dungeon Menu Function
+
+function QWS_Make_Dungeon_Menu {
+ set @tempdungeonmenubin,1;
+ if (getarg(0) == 0) goto menu_item;
+ set @temploopdungeonmenu,0;
+ do {
+ set @tempdungeonmenubin, @tempdungeonmenubin * 2;
+ set @temploopdungeonmenu, @temploopdungeonmenu + 1;
+ }while (getarg(0) > @temploopdungeonmenu);
+// check marker and make menu item
+menu_item:
+ if ((@tempdungeonmenubin & ##QWS_D_Unlock) != @tempdungeonmenubin) {
+ setarray @DLocRef[@Di], @Dref;
+ set @Dref, @Dref+@DLevels[@Di];
+ set @Di,@Di+1;
+ return;
+ }
+ if ($QW_MapUserShow == 1) {
+ set @tempmapusers,0;
+ set @mapusersloop,0;
+ do {
+ set @tempmapusers,(getmapusers(@DGat$[@Dref+@mapusersloop]) + @tempmapusers);
+ set @mapusersloop, (@mapusersloop + 1);
+ } while (@DLevels[@Di] > @mapusersloop);
+ if (@pDprice[@Di] != 0) set @Dmenulist$[@Dj], @pDmenuitems$[@Di]+" ["+@tempmapusers+"] -> "+@pDprice[@Di];
+ if (@pDprice[@Di] == 0) set @Dmenulist$[@Dj], @pDmenuitems$[@Di]+" ["+@tempmapusers+"]";
+ set @Dmenuref[@Dj],@Di;
+ set @Dj,@Dj+1;
+ setarray @DLocRef[@Di], @Dref;
+ set @Dref, @Dref+@DLevels[@Di];
+ set @Di,@Di+1;
+ return;
+ }
+ if (@pDprice[@Di] != 0) set @Dmenulist$[@Dj], @pDmenuitems$[@Di]+" -> "+@pDprice[@Di];
+ if (@pDprice[@Di] == 0) set @Dmenulist$[@Dj], @pDmenuitems$[@Di];
+ set @Dmenuref[@Dj],@Di;
+ set @Dj,@Dj+1;
+ setarray @DLocRef[@Di], @Dref;
+ set @Dref, @Dref+@DLevels[@Di];
+ set @Di,@Di+1;
+ return;
+}
+}
+
+function script QWS_DLarray {
+//----------------Start building Menu
+ set @DWref,@DLocRef[@DwarpMenu]; // reference to the arrays with leveldata
+ set @DWi,0; // loop counter
+ set @DWj,0; // menu lines counter
+ cleararray @DWLmenulist$[0],"",20; // Clearing the array to get rid off ghost items in menu
+ do {
+ if ($QW_DL == 0)||($QW_DDL >= @DDepth[@DWref]) {
+ set @warpprice, (@pDprice[@DwarpMenu]+ (getd(@pDfee$[@DwarpMenu])*@DDepth[@DWref]));
+ if (@warpprice != 0)&&($QW_MapUserShow == 0) set @DWLmenulist$[@DWj], @DLevelName$[@DWref]+" -> "+@warpprice;
+ if (@warpprice == 0)&&($QW_MapUserShow == 0) set @DWLmenulist$[@DWj], @DLevelName$[@DWref];
+ if (@warpprice != 0)&&($QW_MapUserShow == 1) set @DWLmenulist$[@DWj], @DLevelName$[@DWref]+" ["+getmapusers(@DGat$[@DWref])+"] -> "+@warpprice;
+ if (@warpprice == 0)&&($QW_MapUserShow == 1) set @DWLmenulist$[@DWj], @DLevelName$[@DWref]+" ["+getmapusers(@DGat$[@DWref])+"]";
+ set @DWLmenuref[@DWj],@DWref;
+ set @DWj,@DWj+1;
+ }
+ set @DWref, @DWref+1;
+ set @DWi,@DWi+1;
+ } while (@DWi < @DLevels[@DwarpMenu]);
+ set @DWLmenulist$[@DWj], "Exit";
+ set @DWLmenuref[@DWj],57005; // 57005='dead' in hex
+ return;
+}
+
+//================Dungeon=Warpras=That=Only=Unlock=================
+
+function script QWS_Dungeon_Warpra {
+ function QWS_D_getbin;
+ function QWS_D_setbin;
+
+ if ((QWS_D_getbin(getarg(0)) == 0) && (getarg(1) != "")) {
+ mes "[Warpra]";
+ mes getarg(1)+" unlocked!";
+ QWS_D_setbin(getarg(0));
+ return;
+ } else if (QWS_D_getbin(getarg(0)) == 1) {
+ mes "[Warpra]";
+ mes "Sorry, I can only unlock this location.";
+ } else
+ debugmes "QWS_Dungeon_Warpra error, improper syntax?";
+ return;
+
+
+function QWS_D_setbin {
+ set @tempsetbindata,1;
+ if (getarg(0) == 0) goto binset;
+ set @temploopsetbin,0;
+ do {
+ set @tempsetbindata, @tempsetbindata * 2;
+ set @temploopsetbin, @temploopsetbin + 1;
+ } while (getarg(0) > @temploopsetbin);
+binset:
+ set ##QWS_D_Unlock,(##QWS_D_Unlock | @tempsetbindata);
+ return;
+}
+
+function QWS_D_getbin {
+ set @tempgetbindata,1;
+ if (getarg(0) == 0) goto binget;
+ set @temploopgetbin,0;
+ do {
+ set @tempgetbindata, @tempgetbindata * 2;
+ set @temploopgetbin, @temploopgetbin + 1;
+ } while (getarg(0) > @temploopgetbin);
+binget:
+ if ((@tempgetbindata & ##QWS_D_Unlock) == @tempgetbindata) return 1;
+ return 0;
+}
+}
+
+//==========================Town=Warpras===========================
+
+function script QWS_Town_Warpra {
+ function QWS_T_getbin;
+ function QWS_T_setbin;
+
+ if ((QWS_T_getbin(getarg(0)) == 0) && (getarg(1) != "")) {
+ mes "[Warpra]";
+ mes getarg(1)+" unlocked!";
+ QWS_T_setbin(getarg(0));
+ return;
+ } else if (QWS_T_getbin(getarg(0)) == 1) {
+ callfunc "Q_Warpra",0;
+ } else
+ debugmes "QWS_Town_Warpra error, improper syntax ?";
+ return;
+
+function QWS_T_setbin {
+ set @tempsetbindata,1;
+ if (getarg(0) == 0) goto binset;
+ set @temploopsetbin,0;
+ do {
+ set @tempsetbindata, @tempsetbindata * 2;
+ set @temploopsetbin, @temploopsetbin + 1;
+ } while (getarg(0) > @temploopsetbin);
+binset:
+ set ##QWS_T_Unlock,(##QWS_T_Unlock | @tempsetbindata);
+ return;
+}
+
+function QWS_T_getbin {
+ set @tempgetbindata,1;
+ if (getarg(0) == 0) goto binget;
+ set @temploopgetbin,0;
+ do {
+ set @tempgetbindata, @tempgetbindata * 2;
+ set @temploopgetbin, @temploopgetbin + 1;
+ } while (getarg(0) > @temploopgetbin);
+binget:
+ if ((@tempgetbindata & ##QWS_T_Unlock) == @tempgetbindata) return 1;
+ return 0;
+}
+}
+//============================Warpras==============================
+
+- script Warpra#0 -1,{ callfunc "Q_Warpra",1; }
+alb2trea,73,101,4 duplicate(Warpra#0) Warpra#1 113
+ama_fild01,178,325,1 duplicate(Warpra#0) Warpra#2 113
+gef_fild10,71,339,4 duplicate(Warpra#0) Warpra#3 113
+izlu2dun,104,82,4 duplicate(Warpra#0) Warpra#4 113
+mjolnir_02,85,363,4 duplicate(Warpra#0) Warpra#5 113
+moc_fild04,207,331,4 duplicate(Warpra#0) Warpra#6 113
+moc_fild19,106,97,4 duplicate(Warpra#0) Warpra#7 113
+moc_ruins,64,166,4 duplicate(Warpra#0) Warpra#8 113
+niflheim,197,192,3 duplicate(Warpra#0) Warpra#9 113
+pay_arche,39,135,4 duplicate(Warpra#0) Warpra#10 113
+prt_fild05,273,215,4 duplicate(Warpra#0) Warpra#11 113
+tur_dun01,148,239,4 duplicate(Warpra#0) Warpra#12 113
+valkyrie,48,35,8 duplicate(Warpra#0) Warpra#13 113
+yuno_fild03,37,135,4 duplicate(Warpra#0) Warpra#14 113
+
+alberta,32,240,4 script Warpra#15 113,{ callfunc "QWS_Town_Warpra",1,"Alberta Town"; close; }
+aldebaran,146,118,4 script Warpra#16 113,{ callfunc "QWS_Town_Warpra",2,"Aldebaran Town"; close; }
+ayothaya,216,171,5 script Warpra#17 113,{ callfunc "QWS_Town_Warpra",4,"Ayotaya Town"; close; }
+amatsu,193,81,1 script Warpra#18 113,{ callfunc "QWS_Town_Warpra",3,"Amatsu Town"; close; }
+comodo,195,158,4 script Warpra#19 113,{ callfunc "QWS_Town_Warpra",5,"Comodo Town"; close; }
+einbroch,229,196,5 script Warpra#20 113,{ callfunc "QWS_Town_Warpra",7,"Einbroch Town"; close; }
+einbech,173,131,5 script Warpra#21 113,{ callfunc "QWS_Town_Warpra",6,"Einbech Town"; close; }
+geffen,116,66,4 script Warpra#22 113,{ callfunc "QWS_Town_Warpra",8,"Geffen Town"; close; }
+gonryun,152,130,4 script Warpra#23 113,{ callfunc "QWS_Town_Warpra",9,"Gonryun Town"; close; }
+hugel,90,127,5 script Warpra#24 113,{ callfunc "QWS_Town_Warpra",10,"Hugel Town"; close; }
+jawaii,107,182,5 script Warpra#25 113,{ callfunc "QWS_Town_Warpra",12,"Jawaii Town"; close; }
+izlude,132,116,4 script Warpra#26 113,{ callfunc "QWS_Town_Warpra",11,"Izlude Town"; close; }
+lighthalzen,153,100,5 script Warpra#27 113,{ callfunc "QWS_Town_Warpra",13,"Lighthalzen Town"; close; }
+louyang,211,106,4 script Warpra#28 113,{ callfunc "QWS_Town_Warpra",14,"Louyang Town"; close; }
+morocc,157,95,4 script Warpra#29 113,{ callfunc "QWS_Town_Warpra",16,"Morroc Town"; close; }
+nif_fild01,319,77,1 script Warpra#30 113,{ callfunc "QWS_Town_Warpra",17,"Niflheim Town"; close; }
+payon,183,110,4 script Warpra#31 113,{ callfunc "QWS_Town_Warpra",18,"Payon Town"; close; }
+prontera,147,172,5 script Warpra#32 113,{ callfunc "QWS_Town_Warpra",0,"Prontera Town"; close; }
+umbala,133,130,4 script Warpra#33 113,{ callfunc "QWS_Town_Warpra",19,"Umbala Town"; close; }
+xmas,151,136,4 script Warpra#34 113,{ callfunc "QWS_Town_Warpra",15,"Lutie Town"; close; }
+yuno,138,162,4 script Warpra#35 113,{ callfunc "QWS_Town_Warpra",20,"Yuno Town"; close; }
+brasilis,201,222,4 script Warpra#36 113,{ callfunc "QWS_Town_Warpra",21,"Brasilis Town"; close; }
+dicastes01,194,194,6 script Warpra#37 113,{ callfunc "QWS_Town_Warpra",22,"El Dicastes Town"; close; }
+manuk,262,177,4 script Warpra#38 113,{ callfunc "QWS_Town_Warpra",23,"Manuk Town"; close; }
+mora,110,100,4 script Warpra#39 113,{ callfunc "QWS_Town_Warpra",24,"Mora Town"; close; }
+moscovia,216,196,6 script Warpra#40 113,{ callfunc "QWS_Town_Warpra",25,"Moscovia Town"; close; }
+rachel,135,116,4 script Warpra#41 113,{ callfunc "QWS_Town_Warpra",26,"Rachel Town"; close; }
+splendide,205,153,4 script Warpra#42 113,{ callfunc "QWS_Town_Warpra",27,"Splendide Town"; close; }
+veins,214,123,4 script Warpra#43 113,{ callfunc "QWS_Town_Warpra",28,"Veins Town"; close; }
+dewata,194,178,6 script Warpra#44 113,{ callfunc "QWS_Town_Warpra",29,"Dewata Town"; close; }
+eclage,107,37,4 script Warpra#45 113,{ callfunc "QWS_Town_Warpra",30,"Eclage Town"; close; }
+
+abyss_02,274,266,1 script Warpra Helper#0 112,{ callfunc "QWS_Dungeon_Warpra",0,"Abyss Lake"; close; }
+ama_dun02,192,118,5 script Warpra Helper#1 112,{ callfunc "QWS_Dungeon_Warpra",1,"Amatsu Dungeon"; close; }
+anthell02,170,165,3 script Warpra Helper#2 112,{ callfunc "QWS_Dungeon_Warpra",2,"Ant Hell Dungeon"; close; }
+ayo_dun02,258,193,5 script Warpra Helper#3 112,{ callfunc "QWS_Dungeon_Warpra",3,"Ayotaya Dungeon"; close; }
+ein_dun02,292,282,1 script Warpra Helper#4 112,{ callfunc "QWS_Dungeon_Warpra",8,"Einbech Dungeon"; close; }
+iz_dun03,202,47,2 script Warpra Helper#5 112,{ callfunc "QWS_Dungeon_Warpra",4,"Byalan Dungeon"; close; }
+c_tower3,129,106,4 script Warpra Helper#6 112,{ callfunc "QWS_Dungeon_Warpra",5,"Clock Tower Dungeon"; close; }
+mjo_dun02,39,25,4 script Warpra Helper#7 112,{ callfunc "QWS_Dungeon_Warpra",6,"Coal Mine Dungeon"; close; }
+prt_sewb2,176,30,3 script Warpra Helper#8 112,{ callfunc "QWS_Dungeon_Warpra",7,"Culvert Dungeon"; close; }
+gefenia03,137,34,0 script Warpra Helper#9 112,{ callfunc "QWS_Dungeon_Warpra",9,"Gefenia Dungeon"; close; }
+gef_dun02,218,61,2 script Warpra Helper#10 112,{ callfunc "QWS_Dungeon_Warpra",10,"Gefen Dungeon"; close; }
+glast_01,371,308,3 script Warpra Helper#11 112,{ callfunc "QWS_Dungeon_Warpra",11,"Glast Heim Dungeon"; close; }
+gon_dun01,167,273,4 script Warpra Helper#12 112,{ callfunc "QWS_Dungeon_Warpra",12,"Gonryun Dungeon"; close; }
+juperos_02,127,154,5 script Warpra Helper#13 112,{ callfunc "QWS_Dungeon_Warpra",14,"Juperos Cave"; close; }
+kh_dun01,14,224,3 script Warpra Helper#14 112,{ callfunc "QWS_Dungeon_Warpra",28,"Kiel Dungeon"; close; }
+lhz_dun02,156,151,5 script Warpra Helper#15 112,{ callfunc "QWS_Dungeon_Warpra",15,"Lighthalzen Bio Lab"; close; }
+lou_dun02,168,264,4 script Warpra Helper#16 112,{ callfunc "QWS_Dungeon_Warpra",16,"Louyang Dungeon"; close; }
+mag_dun02,46,41,3 script Warpra Helper#17 112,{ callfunc "QWS_Dungeon_Warpra",17,"Magma Dungeon"; close; }
+odin_tem01,115,148,3 script Warpra Helper#18 112,{ callfunc "QWS_Dungeon_Warpra",18,"Odin Temple"; close; }
+orcsdun01,185,11,3 script Warpra Helper#19 112,{ callfunc "QWS_Dungeon_Warpra",19,"Orc Dungeon"; close; }
+pay_dun03,162,143,3 script Warpra Helper#20 112,{ callfunc "QWS_Dungeon_Warpra",20,"Payon Dungeon"; close; }
+moc_pryd02,101,95,3 script Warpra Helper#21 112,{ callfunc "QWS_Dungeon_Warpra",21,"Pyramides Dungeon"; close; }
+in_sphinx2,274,268,1 script Warpra Helper#22 112,{ callfunc "QWS_Dungeon_Warpra",22,"Sphinx Dungeon"; close; }
+tha_t07,111,162,3 script Warpra Helper#23 112,{ callfunc "QWS_Dungeon_Warpra",24,"Thanatos Tower"; close; }
+treasure02,104,40,3 script Warpra Helper#24 112,{ callfunc "QWS_Dungeon_Warpra",23,"Sunken Ship Dungeon"; close; }
+xmas_dun02,124,131,3 script Warpra Helper#25 112,{ callfunc "QWS_Dungeon_Warpra",25,"Toy Factory Dungeon"; close; }
+um_dun02,44,28,3 script Warpra Helper#26 112,{ callfunc "QWS_Dungeon_Warpra",27,"Umbala Dungeon"; close; }
+tur_dun02,162,23,3 script Warpra Helper#27 112,{ callfunc "QWS_Dungeon_Warpra",26,"Turtle Island Dungeon"; close; }
+prt_maze02,102,69,4 script Warpra Helper#28 112,{ callfunc "QWS_Dungeon_Warpra",13,"Hidden Dungeon"; close; } \ No newline at end of file
diff --git a/npc/custom/etc/rpsroulette.txt b/npc/custom/etc/rpsroulette.txt
new file mode 100644
index 000000000..8e3d04a3e
--- /dev/null
+++ b/npc/custom/etc/rpsroulette.txt
@@ -0,0 +1,286 @@
+//===== rAthena Script =======================================
+//= Rock Scissors Roulette
+//===== By: ==================================================
+//= acky
+//===== Current Version: =====================================
+//= 1.2
+//===== Compatible With: =====================================
+//= rAthena SVN
+//===== Description: =========================================
+//= Plays a hybrid Russian Roulette Rock Scissors Paper game.
+//===== Additional Comments: =================================
+//= Prizes customizable, Added emotions.
+//= 1.2 Fixes by Blackthunder and me [Poki#3]
+//============================================================
+
+cmd_in02,182,126,2 script Crazy Boris 85,{
+ mes "Crazy Boris";
+ set @counter,1;
+ mes "Hey you! Up for Rock Scissors Roulette?";
+ next;
+ menu "Let me play.",PLAY,"Explain the rules.",RULES,"Leave",LEAVE;
+ SAME:
+ mes "Draw! Again!";
+ next;
+ goto PLAY;
+
+WIN:
+ mes "Damnit, You Win!";
+ emotion 19;
+ next;
+ goto OPPPULL;
+
+LOSE:
+ emotion 18;
+ mes "Boorah! You Lose!";
+ next;
+ goto YOUPULL;
+
+PLAY:
+ mes "Rock... Paper...";
+ set @opp,rand (1,3);
+ menu "^0000FFROCK!",ROCK,"^FF0000SCISSORS!",SCISSORS,"^00FF00PAPER!^000000",PAPER;
+
+ROCK:
+ if (@lastchoice == 1) set @opp,rand (1,3);
+ if (@opp == 1) emotion 11;
+ if (@opp == 2) emotion 10;
+ if (@opp == 3) emotion 12;
+ set @lastchoice,1;
+ if (@opp == 1) goto SAME;
+ if (@opp == 2) goto WIN;
+ if (@opp == 3) goto LOSE;
+
+SCISSORS:
+ if (@lastchoice == 2) set @opp,rand (1,2);
+ if (@opp == 1) emotion 11;
+ if (@opp == 2) emotion 10;
+ if (@opp == 3) emotion 12;
+ set @lastchoice,2;
+ if (@opp == 1) goto LOSE;
+ if (@opp == 2) goto SAME;
+ if (@opp == 3) goto WIN;
+
+PAPER:
+ if (@lastchoice == 3) set @opp,rand (2,3);
+ if (@opp == 1) emotion 11;
+ if (@opp == 2) emotion 10;
+ if (@opp == 3) emotion 12;
+ set @lastchoice,3;
+ if (@opp == 1) goto WIN;
+ if (@opp == 2) goto LOSE;
+ if (@opp == 3) goto SAME;
+
+YOUPULL:
+ if (@counter == 1) goto ONE;
+ if (@counter == 2) goto TWO;
+ if (@counter == 3) goto THREE;
+ if (@counter == 4) goto FOUR;
+ if (@counter == 5) goto FIVE;
+ if (@counter == 6) goto SIX;
+
+OPPPULL:
+ if (@counter == 1) goto ONEa;
+ if (@counter == 2) goto TWOa;
+ if (@counter == 3) goto THREEa;
+ if (@counter == 4) goto FOURa;
+ if (@counter == 5) goto FIVEa;
+ if (@counter == 6) goto SIXa;
+
+ONE:
+ set @counter,2;
+ mes "1 of 6";
+ set @pull,rand (1,6);
+ next;
+ if (@pull == 1) goto DIE;
+ if (@pull != 1) goto SAFE;
+
+TWO:
+ set @counter,3;
+ mes "2 of 6";
+ set @pull,rand (1,5);
+ next;
+ if (@pull == 1) goto DIE;
+ if (@pull != 1) goto SAFE;
+
+THREE:
+ set @counter,4;
+ mes "3 of 6";
+ set @pull,rand (1,4);
+ next;
+ if (@pull == 1) goto DIE;
+ if (@pull != 1) goto SAFE;
+
+FOUR:
+ set @counter,5;
+ mes "4 of 6";
+ set @pull,rand (1,3);
+ next;
+ if (@pull == 1) goto DIE;
+ if (@pull != 1) goto SAFE;
+
+FIVE:
+ set @counter,6;
+ mes "5 of 6";
+ set @pull,rand (1,2);
+ if (@pull == 1) set @pull,rand (1,2);
+ next;
+ if (@pull == 1) goto DIE;
+ if (@pull != 1) goto SAFE;
+
+SIX:
+ mes "6 of 6";
+ mes "Say your prayers";
+ set @pull,1;
+ next;
+ if (@pull == 1) goto DIE;
+ if (@pull != 1) goto SAFE;
+
+ONEa:
+ set @counter,2;
+ mes "1 of 6";
+ set @pull,rand (1,6);
+ next;
+ if (@pull == 1) goto KILL;
+ if (@pull != 1) goto SAFE;
+
+TWOa:
+ set @counter,3;
+ mes "2 of 6";
+ set @pull,rand (1,5);
+ next;
+ if (@pull == 1) goto KILL;
+ if (@pull != 1) goto SAFE;
+
+THREEa:
+ set @counter,4;
+ mes "3 of 6";
+ set @pull,rand (1,4);
+ next;
+ if (@pull == 1) goto KILL;
+ if (@pull != 1) goto SAFE;
+
+FOURa:
+ set @counter,5;
+ mes "4 of 6";
+ set @pull,rand (1,3);
+ next;
+ if (@pull == 1) goto KILL;
+ if (@pull != 1) goto SAFE;
+
+FIVEa:
+ set @counter,6;
+ mes "5 of 6";
+ set @pull,rand (1,2);
+ next;
+ if (@pull == 1) goto KILL;
+ if (@pull != 1) goto SAFE;
+
+SIXa:
+ mes "6 of 6";
+ mes "Say your prayers";
+ set @pull,1;
+ next;
+ if (@pull == 1) goto KILL;
+ if (@pull != 1) goto SAFE;
+
+SAFE:
+ emotion 32;
+ mes "*^0000FFClick^000000* whew...";
+ goto PLAY;
+
+DIE:
+ specialeffect2 183;
+ emotion 29;
+ percentheal -100,-100;
+ mes "*^0000FFClick^000000* *^FF0000BANG^000000*";
+ mes "You're dead!";
+ close;
+
+KILL:
+ specialeffect 183;
+ emotion 23;
+ mes "*^0000FFClick^000000* *^FF0000BANG^000000*";
+ mes "OWWW @#$%^!! THAT HURT LIKE HELL!!";
+ next;
+ goto PRIZE;
+
+RULES:
+ mes "Ok here are the rules:";
+ mes "I have with me a ^FF00006^000000 chamber pistol with ^FF00001^000000 round. First we play ^FF0000Scissors ^00FF00Paper ^0000FFRock^000000. The loser pulls the trigger. The winner is whoever comes out best.";
+ mes "Beat me to win a prize.";
+ menu "Let me play.",CONT,"No thanks.",LEAVE;
+
+CONT:
+ mes "Ok here we go...";
+ next;
+ goto PLAY;
+
+PRIZE:
+ mes "Congratulations! You have won...";
+ set @prize,rand (1,10);
+ if (@prize == 1) goto P1;
+ if (@prize == 2) goto P2;
+ if (@prize == 3) goto P3;
+ if (@prize == 4) goto P4;
+ if (@prize == 5) goto P5;
+ if (@prize == 6) goto P6;
+ if (@prize == 7) goto P7;
+ if (@prize == 8) goto P8;
+ if (@prize == 9) goto P9;
+ if (@prize == 10) goto P10;
+
+P1:
+ mes "10x Oridicon!";
+ getitem 984,10;
+ close;
+
+P2:
+ mes "10x Elunium!";
+ getitem 985,10;
+ close;
+
+P3:
+ mes "100x Fly Wings!";
+ getitem 601,100;
+ close;
+
+P4:
+ mes "8x Old Blue Box!";
+ getitem 603,8;
+ close;
+
+P5:
+ mes "4x Old Violet Box!";
+ getitem 617,4;
+ close;
+
+P6:
+ mes "1x Old Card Album!";
+ getitem 616,1;
+ close;
+
+P7:
+ mes "10x Dead Branch!";
+ getitem 604,10;
+ close;
+
+P8:
+ mes "3x Gold!";
+ getitem 969,3;
+ close;
+
+P9:
+ mes "10x Elunium!";
+ getitem 985,10;
+ close;
+
+P10:
+ mes "20x Blue Potion!";
+ getitem 505,20;
+ close;
+
+LEAVE:
+ mes "Pansy.";
+ close;
+}
diff --git a/npc/custom/etc/shifty_assassin.txt b/npc/custom/etc/shifty_assassin.txt
new file mode 100644
index 000000000..46d3aab07
--- /dev/null
+++ b/npc/custom/etc/shifty_assassin.txt
@@ -0,0 +1,199 @@
+//===== rAthena Script =======================================
+//= Shifty Assassin
+//===== By: ==================================================
+//= acky
+//===== Current Version: =====================================
+//= 1.1.2
+//===== Compatible With: =====================================
+//= rAthena SVN
+//===== Description: =========================================
+//= Players buy ninjas to assassinate other players
+//===== Additional Comments: =================================
+//= 1.1.1 Changed all gmcommand to atcommand as Poki#3 suggested. [Vicious]
+//= 1.1.2 Updated WoE Check. [Paradox924X]
+//============================================================
+
+morocc,148,86,5 script Shifty Assassin 725,{
+ set $ninja_price,250000;
+
+ // STARTS THE MENU //
+M_Start:
+ mes "[Shifty Assassin]";
+ mes "What do you want?";
+ next;
+ if (getgmlevel() > 90) goto M_GM;
+ menu "Buy Ninjas",M_Buy,"Assassinate somebody",M_Kill,"Check your Ninjas",M_Check,"Cancel",M_Exit;
+M_GM:
+ menu "Buy Ninjas",M_Buy,"Assassinate somebody",M_Kill,"Check your Ninjas",M_Check,"Add Ninjas",M_Add,"Cancel",M_Exit;
+
+ // GM MENU TO ADD NINJAS //
+M_Add:
+ mes "[Shifty Assassin]";
+ mes "How many ninjas do you want to make available?";
+ next;
+ set @add,0;
+ input @add;
+ set $ninja_avail,$ninja_avail+@add;
+ mes @add + " ninjas added.";
+ close;
+
+ // BUY NINJAS //
+M_Buy:
+ mes "[Shifty Assassin]";
+ mes "How many ninjas do you want buy?";
+ mes "There are ^0000FF" + $ninja_avail + "^000000 ninjas available.";
+ mes "They cost ^0000FF" + $ninja_price + " zeny ^000000each.";
+
+ set @buy,0;
+ input @buy;
+ next;
+ if ($ninja_avail < 1) goto NoNinjas;
+ if ($ninja_avail < @buy) goto NotEnoughNinjas;
+ set @price,@buy*$ninja_price;
+ if (zeny < @price ) goto NoZeny;
+
+ mes "[Shifty Assassin]";
+ mes "That will cost you ^0000FF" + @price + " zeny^000000.";
+ next;
+ menu "Continue",-,"Cancel",M_Exit;
+
+ set zeny,zeny-@price;
+ set #ninjas,#ninjas+@buy;
+ set $ninja_avail,$ninja_avail-@buy;
+
+ mes "[Shifty Assassin]";
+ mes "Thank you.";
+ close;
+
+ // ASSASSINATE SOMEBODY //
+M_Kill:
+ if (agitcheck()) goto M_Busy;
+ mes "[Shifty Assassin]";
+ mes "Enter the name of the target.";
+ mes "^FF0000Type the name exactly, otherwise I won't be able to find the victim.^000000";
+ next;
+ menu "Continue",-,"Cancel",M_Exit;
+ set @name$,"0";
+ input @name$;
+ next;
+ mes "[Shifty Assassin]";
+ mes "Active Ninjas: "+#ninjas;
+ mes "Resting Ninjas: "+#ninjasr;
+ mes "How many do you want to send?";
+ set @number,0;
+ input @number;
+ if (@number < 1) goto NoNinjasSent;
+ if (@number > #ninjas) goto NotEnoughNinjas1;
+ if (@number > 10) goto TooManyNinjas;
+ set @chance,rand (1,12);
+ set #ninjas,#ninjas-@number;
+ set #ninjas,#ninjas+#ninjasr;
+ set #ninjasr,0;
+ if (@number < @chance) goto M_Failure;
+
+ // SUCCESSFUL ATTACK //
+ mes "Sending ninjas now.";
+ next;
+ mes "[Shifty Assassin]";
+ set @ninjasurvived,rand (1,@number);
+ set #ninjasr,@number-@ninjasurvived;
+ mes "Your attack succeeded but only ^FF0000" + #ninjasr + "^000000 Ninjas survived.";
+
+ atcommand strcharinfo(0) + "@kill "+@name$;
+ announce @name$+" has been assassinated by " + strcharinfo(0) +"'s Ninjas.",bc_npc;
+ close;
+
+ // FAILED ATTACK //
+M_Failure:
+ mes "Sending ninjas now.";
+ next;
+ mes "[Shifty Assassin]";
+ set @ninjasurvived,rand (1,@number);
+ set #ninjasr,@number-@ninjasurvived;
+ mes "Your attack failed and only ^FF0000" + #ninjasr + "^000000 Ninjas survived.";
+
+ announce @name$+" has survived " + strcharinfo(0) +"'s Ninja attack.",8;
+ close;
+
+ // NINJAS BUSY FOR WOE //
+M_Busy:
+ mes "[Shifty Assassin]";
+ mes "Sorry, all my ninjas are busy doing War of Emperium.";
+ close;
+
+ // CHECK YOUR NINJAS //
+M_Check:
+ mes "[Shifty Assassin]";
+ mes "You have:";
+ mes "^FF0000" + #ninjas + "^000000 Active Ninjas.";
+ mes "^0000FF" + #ninjasr + "^000000 Resting Ninjas.";
+ next;
+ goto M_Start;
+
+
+ // LIMIT //
+NoNinjasSent:
+ mes "[Shifty Assassin]";
+ mes "You can't kill anyone without ninjas.";
+ next;
+ goto M_Start;
+
+TooManyNinjas:
+ mes "[Shifty Assassin]";
+ mes "You can only send 10 ninjas max.";
+ next;
+ goto M_Start;
+
+NoZeny:
+ mes "[Shifty Assassin]";
+ mes "You do not have enough zeny.";
+ close;
+
+NotEnoughNinjas:
+ mes "[Shifty Assassin]";
+ mes "There aren't that many ninjas to buy.";
+ next;
+ goto M_Start;
+
+NoNinjas:
+ mes "[Shifty Assassin]";
+ mes "There are no ninjas left to buy.";
+ close;
+
+NotEnoughNinjas1:
+ mes "[Shifty Assassin]";
+ mes "You do not have that many ninjas.";
+ next;
+ goto M_Start;
+
+M_Exit:
+ mes "[Shifty Assassin]";
+ mes "Goodbye.";
+ close;
+
+// TIMER DELAY NINJA ADDER //
+OnClock0600:
+ set $ninja_avail,$ninja_avail+2;
+ end;
+OnClock1200:
+ set $ninja_avail,$ninja_avail+2;
+ end;
+OnClock1500:
+ set $ninja_avail,$ninja_avail+2;
+ end;
+OnClock1800:
+ set $ninja_avail,$ninja_avail+3;
+ end;
+OnClock1900:
+ set $ninja_avail,$ninja_avail+2;
+ end;
+OnClock2000:
+ set $ninja_avail,$ninja_avail+2;
+ end;
+OnClock0000:
+ set $ninja_avail,$ninja_avail+2;
+ end;
+OnInit:
+ set $ninja_avail,$ninja_avail+1;
+ end;
+}
diff --git a/npc/custom/etc/stock_market.txt b/npc/custom/etc/stock_market.txt
new file mode 100644
index 000000000..6f90bcaef
--- /dev/null
+++ b/npc/custom/etc/stock_market.txt
@@ -0,0 +1,791 @@
+//===== rAthena Script =======================================
+//= Stock Market Game
+//===== By: ==================================================
+//= acky
+//===== Current Version: =====================================
+//= 1.3.1
+//===== Compatible With: =====================================
+//= rAthena SVN
+//===== Description: =========================================
+//= NPC for a stock market game.
+//===== Additional Comments: =================================
+//= GM Must activate the NPC before use.
+//= Fixed MAJOR exploit. - players could buy for free
+//= Low prices likely to rise, High prices likely to drop
+//= Small fix by Galeon
+//= Lupus: This script lets players make 40,000,000z a day
+//= so use it on your own risk
+//============================================================
+
+- script sharenames -1,{
+ end;
+OnInit:
+ // Sets the names of the shares //
+ set $S1N$,"JIN";
+ set $S2N$,"VNG";
+ set $S3N$,"SHA";
+ set $S4N$,"RGC";
+ set $S5N$,"PSC";
+ set $S6N$,"GNG";
+ set $S7N$,"XRO";
+ set $S8N$,"GRM";
+ set $S9N$,"DOP";
+ set $S10N$,"POR";
+
+ // Transaction fee //
+ set $S_Trans,1500;
+
+ // Min & Max buyable //
+ set $S_BuyMin,1;
+ set $S_BuyMax,1000000;
+ end;
+
+ // Average Price (Your start prices) //
+ set $S_Avg,100;
+
+ // Set times of fluctuation //
+OnClock1100:
+ set $S_LastUpd$,"12:00";
+ goto S_Fluc;
+ end;
+
+OnClock0000:
+ set $S_LastUpd$,"00:00";
+ goto S_Fluc;
+ end;
+
+OnClock0600:
+ set $S_LastUpd$,"06:00";
+ goto S_Fluc;
+ end;
+
+OnClock1800:
+ set $S_LastUpd$,"18:00";
+ goto S_Fluc;
+ end;
+
+OnClock2100:
+ set $S_LastUpd$,"21:00";
+ goto S_Fluc;
+ end;
+
+OnClock0900:
+ set $S_LastUpd$,"09:00";
+ goto S_Fluc;
+ end;
+
+OnClock1500:
+ set $S_LastUpd$,"15:00";
+ goto S_Fluc;
+ end;
+
+S_Fluc:
+ set $fluc,rand (-6,6);
+ set $S1B,$S1;
+ set $S1,$S1+$fluc;
+ if ($S1 < 25) set $S1,$S1+3;
+ if ($S1 < 50) set $S1,$S1+2;
+ if ($S1 > 150) set $S1,$S1-2;
+ if ($S1 > 175) set $S1,$S1-3;
+ if ($S1 < 1) set $S1,1;
+
+ set $fluc,rand (-6,6);
+ set $S2B,$S2;
+ set $S2,$S2+$fluc;
+ if ($S2 < 25) set $S2,$S2+3;
+ if ($S2 < 50) set $S2,$S2+2;
+ if ($S2 > 150) set $S2,$S2-2;
+ if ($S2 > 175) set $S2,$S2-3;
+ if ($S2 < 1) set $S2,1;
+
+ set $fluc,rand (-6,6);
+ set $S3B,$S3;
+ set $S3,$S3+$fluc;
+ if ($S3 < 25) set $S3,$S3+3;
+ if ($S3 < 50) set $S3,$S3+2;
+ if ($S3 > 150) set $S3,$S3-2;
+ if ($S3 > 175) set $S3,$S3-3;
+ if ($S3 < 1) set $S3,1;
+
+ set $fluc,rand (-6,6);
+ set $S4B,$S4;
+ set $S4,$S4+$fluc;
+ if ($S4 < 25) set $S4,$S4+3;
+ if ($S4 < 50) set $S4,$S4+2;
+ if ($S4 > 150) set $S4,$S4-2;
+ if ($S4 > 175) set $S4,$S4-3;
+ if ($S4 < 1) set $S4,1;
+
+ set $fluc,rand (-6,6);
+ set $S5B,$S5;
+ set $S5,$S5+$fluc;
+ if ($S5 < 25) set $S5,$S5+3;
+ if ($S5 < 50) set $S5,$S5+2;
+ if ($S5 > 150) set $S5,$S5-2;
+ if ($S5 > 175) set $S5,$S5-3;
+ if ($S5 < 1) set $S5,1;
+
+ set $fluc,rand (-6,6);
+ set $S6B,$S6;
+ set $S6,$S6+$fluc;
+ if ($S6 < 25) set $S6,$S6+3;
+ if ($S6 < 50) set $S6,$S6+2;
+ if ($S6 > 150) set $S6,$S6-2;
+ if ($S6 > 175) set $S6,$S6-3;
+ if ($S6 < 1) set $S6,1;
+
+ set $fluc,rand (-6,6);
+ set $S7B,$S7;
+ set $S7,$S7+$fluc;
+ if ($S7 < 25) set $S7,$S7+3;
+ if ($S7 < 50) set $S7,$S7+2;
+ if ($S7 > 150) set $S7,$S7-2;
+ if ($S7 > 175) set $S7,$S7-3;
+ if ($S7 < 1) set $S7,1;
+
+ set $fluc,rand (-6,6);
+ set $S8B,$S8;
+ set $S8,$S8+$fluc;
+ if ($S8 < 25) set $S8,$S8+3;
+ if ($S8 < 50) set $S8,$S8+2;
+ if ($S8 > 150) set $S8,$S8-2;
+ if ($S8 > 175) set $S8,$S8-3;
+ if ($S8 < 1) set $S8,1;
+
+ set $fluc,rand (-6,6);
+ set $S9B,$S9;
+ set $S9,$S9+$fluc;
+ if ($S9 < 25) set $S9,$S9+3;
+ if ($S9 < 50) set $S9,$S9+2;
+ if ($S9 > 150) set $S9,$S9-2;
+ if ($S9 > 175) set $S9,$S9-3;
+ if ($S9 < 1) set $S9,1;
+
+ set $fluc,rand (-6,6);
+ set $S10B,$S10;
+ set $S10,$S10+$fluc;
+ if ($S10 < 25) set $S10,$S10+3;
+ if ($S10 < 50) set $S10,$S10+2;
+ if ($S10 > 150) set $S10,$S10-2;
+ if ($S10 > 175) set $S10,$S10-3;
+ if ($S10 < 1) set $S10,1;
+ end;
+}
+
+prontera,140,181,5 script Stock Market::stockmarket 109,{
+ // Ensures no trading when default prices have not been set //
+ set @stotal,$S1+$S2+$S3+$S4+$S5+$S6+$S7+$S8+$S9+$S10;
+ if (@stotal > 0) goto S_Start;
+ mes "[Stock Market]";
+ mes "Trading is currently closed.";
+ if (getgmlevel() > 90) goto GM_Open;
+ close;
+
+ // Begining of interface //
+S_Start:
+ mes "[Stock Market]";
+ mes "Last fluctuation: " + $S_LastUpd$;
+
+ // Loss/Gain in price //
+ set @S1Update,$S1-$S1B;
+ set @S2Update,$S2-$S2B;
+ set @S3Update,$S3-$S3B;
+ set @S4Update,$S4-$S4B;
+ set @S5Update,$S5-$S5B;
+ set @S6Update,$S6-$S6B;
+ set @S7Update,$S7-$S7B;
+ set @S8Update,$S8-$S8B;
+ set @S9Update,$S9-$S9B;
+ set @S10Update,$S10-$S10B;
+
+ // Makes Loss/Gain Red/Green //
+ if (@S1Update < 0) set @S1Update$,"^FF0000"+@S1Update+"^000000";
+ if (@S1Update > 0) set @S1Update$,"^00FF00+"+@S1Update+"^000000";
+ if (@S1Update == 0) set @S1Update$,@S1Update;
+
+ if (@S2Update < 0) set @S2Update$,"^FF0000"+@S2Update+"^000000";
+ if (@S2Update > 0) set @S2Update$,"^00FF00+"+@S2Update+"^000000";
+ if (@S2Update == 0) set @S2Update$,@S2Update;
+
+ if (@S3Update < 0) set @S3Update$,"^FF0000"+@S3Update+"^000000";
+ if (@S3Update > 0) set @S3Update$,"^00FF00+"+@S3Update+"^000000";
+ if (@S3Update == 0) set @S3Update$,@S3Update;
+
+ if (@S4Update < 0) set @S4Update$,"^FF0000"+@S4Update+"^000000";
+ if (@S4Update > 0) set @S4Update$,"^00FF00+"+@S4Update+"^000000";
+ if (@S4Update == 0) set @S4Update$,@S4Update;
+
+ if (@S5Update < 0) set @S5Update$,"^FF0000"+@S5Update+"^000000";
+ if (@S5Update > 0) set @S5Update$,"^00FF00+"+@S5Update+"^000000";
+ if (@S5Update == 0) set @S5Update$,@S5Update;
+
+ if (@S6Update < 0) set @S6Update$,"^FF0000"+@S6Update+"^000000";
+ if (@S6Update > 0) set @S6Update$,"^00FF00+"+@S6Update+"^000000";
+ if (@S6Update == 0) set @S6Update$,@S6Update;
+
+ if (@S7Update < 0) set @S7Update$,"^FF0000"+@S7Update+"^000000";
+ if (@S7Update > 0) set @S7Update$,"^00FF00+"+@S7Update+"^000000";
+ if (@S7Update == 0) set @S7Update$,@S7Update;
+
+ if (@S8Update < 0) set @S8Update$,"^FF0000"+@S8Update+"^000000";
+ if (@S8Update > 0) set @S8Update$,"^00FF00+"+@S8Update+"^000000";
+ if (@S8Update == 0) set @S8Update$,@S8Update;
+
+ if (@S9Update < 0) set @S9Update$,"^FF0000"+@S9Update+"^000000";
+ if (@S9Update > 0) set @S9Update$,"^00FF00+"+@S9Update+"^000000";
+ if (@S9Update == 0) set @S9Update$,@S9Update;
+
+ if (@S10Update < 0) set @S10Update$,"^FF0000"+@S10Update+"^000000";
+ if (@S10Update > 0) set @S10Update$,"^00FF00+"+@S10Update+"^000000";
+ if (@S10Update == 0) set @S10Update$,@S10Update;
+
+ // Displays shares & prices //
+ mes "^21698F"+$S1N$+"^000000" + " " + $S1 + "z (" + @S1Update$ + ")";
+ mes "^21698F"+$S2N$+"^000000" + " " + $S2 + "z (" + @S2Update$ + ")";
+ mes "^21698F"+$S3N$+"^000000" + " " + $S3 + "z (" + @S3Update$ + ")";
+ mes "^21698F"+$S4N$+"^000000" + " " + $S4 + "z (" + @S4Update$ + ")";
+ mes "^21698F"+$S5N$+"^000000" + " " + $S5 + "z (" + @S5Update$ + ")";
+ mes "^21698F"+$S6N$+"^000000" + " " + $S6 + "z (" + @S6Update$ + ")";
+ mes "^21698F"+$S7N$+"^000000" + " " + $S7 + "z (" + @S7Update$ + ")";
+ mes "^21698F"+$S8N$+"^000000" + " " + $S8 + "z (" + @S8Update$ + ")";
+ mes "^21698F"+$S9N$+"^000000" + " " + $S9 + "z (" + @S9Update$ + ")";
+ mes "^21698F"+$S10N$+"^000000" + " " + $S10 + "z (" + @S10Update$ + ")";
+ next;
+
+ // GM Menu link //
+ if (getgmlevel() > 90) goto GM_subMenu;
+ menu "Portfolio",S_Port,"Buy Shares",S_Buy,"Sell Shares",S_Sell,"Cancel",S_Quit;
+
+GM_subMenu:
+ menu "Portfolio",S_Port,"Buy Shares",S_Buy,"Sell Shares",S_Sell,"GM Menu",GM_Menu,"Cancel",S_Quit;
+
+ // Selling Shares //
+S_Sell:
+ mes "[Stock Market]";
+ mes "Enter the name of the share you wish to sell.";
+ mes "Transaction fee of ^FF0000" + $S_Trans + "z^000000 will apply.";
+ if (#S1 > 0) mes "^0000FF"+$S1N$+"^FF0000" + " x " + #S1 + " [" + $S1 + "z]";
+ if (#S2 > 0) mes "^0000FF"+$S2N$+"^FF0000" + " x " + #S2 + " [" + $S2 + "z]";
+ if (#S3 > 0) mes "^0000FF"+$S3N$+"^FF0000" + " x " + #S3 + " [" + $S3 + "z]";
+ if (#S4 > 0) mes "^0000FF"+$S4N$+"^FF0000" + " x " + #S4 + " [" + $S4 + "z]";
+ if (#S5 > 0) mes "^0000FF"+$S5N$+"^FF0000" + " x " + #S5 + " [" + $S5 + "z]";
+ if (#S6 > 0) mes "^0000FF"+$S6N$+"^FF0000" + " x " + #S6 + " [" + $S6 + "z]";
+ if (#S7 > 0) mes "^0000FF"+$S7N$+"^FF0000" + " x " + #S7 + " [" + $S7 + "z]";
+ if (#S8 > 0) mes "^0000FF"+$S8N$+"^FF0000" + " x " + #S8 + " [" + $S8 + "z]";
+ if (#S9 > 0) mes "^0000FF"+$S9N$+"^FF0000" + " x " + #S9 + " [" + $S9 + "z]";
+ if (#S10 > 0) mes "^0000FF"+$S10N$+"^FF0000" + " x " + #S10 + " [" + $S10 + "z]";
+ set @sellname$,"0";
+ input @sellname$;
+ set @sellamount,0;
+ input @sellamount;
+ if (@sellamount < 1) goto S_SellInv;
+ if (zeny < $S_Trans) goto S_NoZeny;
+ set zeny,zeny-$S_Trans;
+
+SELLS1:
+ if (@sellname$ != $S1N$) goto SELLS2;
+ if (@sellamount > #S1) goto S_SellTooHigh;
+ set @price,@sellamount*$S1;
+ set #S1,#S1-@sellamount;
+ set zeny,zeny+@price;
+ next;
+ mes "Sold " + @sellamount + " " + $S1N$ + " shares.";
+ mes "Earned ^0000FF"+@price+"z^000000.";
+ next;
+ goto S_Start;
+
+SELLS2:
+ if (@sellname$ != $S2N$) goto SELLS3;
+ if (@sellamount > #S2) goto S_SellTooHigh;
+ set @price,@sellamount*$S2;
+ set #S2,#S2-@sellamount;
+ set zeny,zeny+@price;
+ next;
+ mes "Sold " + @sellamount + " " + $S2N$ + " shares.";
+ mes "Earned ^0000FF"+@price+"z^000000.";
+ next;
+ goto S_Start;
+
+SELLS3:
+ if (@sellname$ != $S3N$) goto SELLS4;
+ if (@sellamount > #S3) goto S_SellTooHigh;
+ set @price,@sellamount*$S3;
+ set #S3,#S3-@sellamount;
+ set zeny,zeny+@price;
+ next;
+ mes "Sold " + @sellamount + " " + $S3N$ + " shares.";
+ mes "Earned ^0000FF"+@price+"z^000000.";
+ next;
+ goto S_Start;
+
+SELLS4:
+ if (@sellname$ != $S4N$) goto SELLS5;
+ if (@sellamount > #S4) goto S_SellTooHigh;
+ set @price,@sellamount*$S4;
+ set #S4,#S4-@sellamount;
+ set zeny,zeny+@price;
+ next;
+ mes "Sold " + @sellamount + " " + $S4N$ + " shares.";
+ mes "Earned ^0000FF"+@price+"z^000000.";
+ next;
+ goto S_Start;
+
+SELLS5:
+ if (@sellname$ != $S5N$) goto SELLS6;
+ if (@sellamount > #S5) goto S_SellTooHigh;
+ set @price,@sellamount*$S5;
+ set #S5,#S5-@sellamount;
+ set zeny,zeny+@price;
+ next;
+ mes "Sold " + @sellamount + " " + $S5N$ + " shares.";
+ mes "Earned ^0000FF"+@price+"z^000000.";
+ next;
+ goto S_Start;
+
+SELLS6:
+ if (@sellname$ != $S6N$) goto SELLS7;
+ if (@sellamount > #S6) goto S_SellTooHigh;
+ set @price,@sellamount*$S6;
+ set #S6,#S6-@sellamount;
+ set zeny,zeny+@price;
+ next;
+ mes "Sold " + @sellamount + " " + $S6N$ + " shares.";
+ mes "Earned ^0000FF"+@price+"z^000000.";
+ next;
+ goto S_Start;
+
+SELLS7:
+ if (@sellname$ != $S7N$) goto SELLS8;
+ if (@sellamount > #S7) goto S_SellTooHigh;
+ set @price,@sellamount*$S7;
+ set #S7,#S7-@sellamount;
+ set zeny,zeny+@price;
+ next;
+ mes "Sold " + @sellamount + " " + $S7N$ + " shares.";
+ mes "Earned ^0000FF"+@price+"z^000000.";
+ next;
+ goto S_Start;
+
+SELLS8:
+ if (@sellname$ != $S8N$) goto SELLS9;
+ if (@sellamount > #S8) goto S_SellTooHigh;
+ set @price,@sellamount*$S8;
+ set #S8,#S8-@sellamount;
+ set zeny,zeny+@price;
+ next;
+ mes "Sold " + @sellamount + " " + $S8N$ + " shares.";
+ mes "Earned ^0000FF"+@price+"z^000000.";
+ next;
+ goto S_Start;
+
+SELLS9:
+ if (@sellname$ != $S9N$) goto SELLS10;
+ if (@sellamount > #S9) goto S_SellTooHigh;
+ set @price,@sellamount*$S9;
+ set #S9,#S9-@sellamount;
+ set zeny,zeny+@price;
+ next;
+ mes "Sold " + @sellamount + " " + $S9N$ + " shares.";
+ mes "Earned ^0000FF"+@price+"z^000000.";
+ next;
+ goto S_Start;
+
+SELLS10:
+ if (@sellname$ != $S10N$) goto SELLS11;
+ if (@sellamount > #S10) goto S_SellTooHigh;
+ set @price,@sellamount*$S10;
+ set #S10,#S10-@sellamount;
+ set zeny,zeny+@price;
+ next;
+ mes "Sold " + @sellamount + " " + $S10N$ + " shares.";
+ mes "Earned ^0000FF"+@price+"z^000000.";
+ next;
+ goto S_Start;
+
+SELLS11:
+ mes "^FF0000Invalid Share Name.^000000";
+ next;
+ goto S_Start;
+
+S_SellTooHigh:
+ mes "^FF0000You don't have that many shares.^000000";
+ next;
+ goto S_Start;
+
+S_SellInv:
+ mes "^FF0000Invalid integer.^000000";
+ next;
+ goto S_Start;
+
+ // Buying Shares //
+S_Buy:
+ mes "[Stock Market]";
+ mes "Available shares:";
+ mes $S1N$;
+ mes $S2N$;
+ mes $S3N$;
+ mes $S4N$;
+ mes $S5N$;
+ mes $S6N$;
+ mes $S7N$;
+ mes $S8N$;
+ mes $S9N$;
+ mes $S10N$;
+ next;
+ menu "Continue",-,"Cancel",S_Start;
+
+ mes "Enter the name of the share company";
+ mes "Transaction fee of ^FF0000" + $S_Trans + "z^000000 will apply.";
+ set @buyname$,"0";
+ input @buyname$;
+
+ set @buyamount,0;
+ input @buyamount;
+ // Checks valid number //
+ if (@buyamount < $S_BuyMin) goto S_TooLow;
+ if (@buyamount > $S_BuyMax) goto S_TooHigh;
+ if (zeny < $S_Trans) goto S_NoZeny;
+ set zeny,zeny-$S_Trans;
+
+ // Purchases the shares //
+
+PURS1:
+ if (@buyname$ != $S1N$) goto PURS2;
+ set @price,@buyamount*$S1;
+ if (zeny < @price) goto S_NoZeny;
+ set #S1,#S1+@buyamount;
+ set @price,@buyamount*$S1;
+ set zeny,zeny-@price;
+ mes "Bought " + @buyamount + " " + $S1N$ + " shares.";
+ mes "Lost ^0000FF"+@price+"z^000000.";
+ next;
+ goto S_Start;
+
+PURS2:
+ if (@buyname$ != $S2N$) goto PURS3;
+ set @price,@buyamount*$S2;
+ if (zeny < @price) goto S_NoZeny;
+ set #S2,#S2+@buyamount;
+ set zeny,zeny-@price;
+ mes "Bought " + @buyamount + " " + $S2N$ + " shares.";
+ mes "Lost ^0000FF"+@price+"z^000000.";
+ next;
+ goto S_Start;
+
+PURS3:
+ if (@buyname$ != $S3N$) goto PURS4;
+ set @price,@buyamount*$S3;
+ if (zeny < @price) goto S_NoZeny;
+ set #S3,#S3+@buyamount;
+ set zeny,zeny-@price;
+ mes "Bought " + @buyamount + " " + $S3N$ + " shares.";
+ mes "Lost ^0000FF"+@price+"z^000000.";
+ next;
+ goto S_Start;
+
+PURS4:
+ if (@buyname$ != $S4N$) goto PURS5;
+ set @price,@buyamount*$S4;
+ if (zeny < @price) goto S_NoZeny;
+ set #S4,#S4+@buyamount;
+ set zeny,zeny-@price;
+ mes "Bought " + @buyamount + " " + $S4N$ + " shares.";
+ mes "Lost ^0000FF"+@price+"z^000000.";
+ next;
+ goto S_Start;
+
+PURS5:
+ if (@buyname$ != $S5N$) goto PURS6;
+ set @price,@buyamount*$S5;
+ if (zeny < @price) goto S_NoZeny;
+ set #S5,#S5+@buyamount;
+ set zeny,zeny-@price;
+ mes "Bought " + @buyamount + " " + $S5N$ + " shares.";
+ mes "Lost ^0000FF"+@price+"z^000000.";
+ next;
+ goto S_Start;
+
+PURS6:
+ if (@buyname$ != $S6N$) goto PURS7;
+ set @price,@buyamount*$S6;
+ if (zeny < @price) goto S_NoZeny;
+ set #S6,#S6+@buyamount;
+ set zeny,zeny-@price;
+ mes "Bought " + @buyamount + " " + $S6N$ + " shares.";
+ mes "Lost ^0000FF"+@price+"z^000000.";
+ next;
+ goto S_Start;
+
+PURS7:
+ if (@buyname$ != $S7N$) goto PURS8;
+ set @price,@buyamount*$S7;
+ if (zeny < @price) goto S_NoZeny;
+ set #S7,#S7+@buyamount;
+ set zeny,zeny-@price;
+ mes "Bought " + @buyamount + " " + $S7N$ + " shares.";
+ mes "Lost ^0000FF"+@price+"z^000000.";
+ next;
+ goto S_Start;
+
+PURS8:
+ if (@buyname$ != $S8N$) goto PURS9;
+ set @price,@buyamount*$S8;
+ if (zeny < @price) goto S_NoZeny;
+ set #S8,#S8+@buyamount;
+ set zeny,zeny-@price;
+ mes "Bought " + @buyamount + " " + $S8N$ + " shares.";
+ mes "Lost ^0000FF"+@price+"z^000000.";
+ next;
+ goto S_Start;
+
+PURS9:
+ if (@buyname$ != $S9N$) goto PURS10;
+ set @price,@buyamount*$S9;
+ if (zeny < @price) goto S_NoZeny;
+ set #S9,#S9+@buyamount;
+ set zeny,zeny-@price;
+ mes "Bought " + @buyamount + " " + $S9N$ + " shares.";
+ mes "Lost ^0000FF"+@price+"z^000000.";
+ next;
+ goto S_Start;
+
+PURS10:
+ if (@buyname$ != $S10N$) goto PURS11;
+ set @price,@buyamount*$S10;
+ if (zeny < @price) goto S_NoZeny;
+ set #S10,#S10+@buyamount;
+ set zeny,zeny-@price;
+ mes "Bought " + @buyamount + " " + $S10N$ + " shares.";
+ mes "Lost ^0000FF"+@price+"z^000000.";
+ next;
+ goto S_Start;
+
+PURS11:
+ goto S_InvName;
+
+ // Number too low //
+S_TooLow:
+ mes "^FF0000Minimum of " + $S_BuyMin + " shares can be bought at a time.^000000";
+ next;
+ goto S_Start;
+
+ // Number too high //
+S_TooHigh:
+ mes "^FF0000Maximum number of " + $S_BuyMax + " shares can be bought at a time.^000000";
+ next;
+ goto S_Start;
+
+S_NoZeny:
+ mes "^FF0000You do not have enough zeny.^000000";
+ next;
+ goto S_Start;
+
+ // Sends user to start if name invalid //
+S_InvName:
+ mes "^FF0000Invalid share name.^000000";
+ next;
+ goto S_Start;
+
+ // Displays your total amount //
+S_Port:
+ mes "[Stock Market]";
+
+ACCS1:
+ if (#S1 < 1) goto ACCS2;
+ set @S1,#S1*$S1;
+ mes $S1N$ + ": " + #S1 + " x " + $S1 + "z = " + @S1 + "z";
+
+ACCS2:
+ if (#S2 < 1) goto ACCS3;
+ set @S2,#S2*$S2;
+ mes $S2N$ + ": " + #S2 + " x " + $S2 + "z = " + @S2 + "z";
+
+ACCS3:
+ if (#S3 < 1) goto ACCS4;
+ set @S3,#S3*$S3;
+ mes $S3N$ + ": " + #S3 + " x " + $S3 + "z = " + @S3 + "z";
+
+ACCS4:
+ if (#S4 < 1) goto ACCS5;
+ set @S4,#S4*$S4;
+ mes $S4N$ + ": " + #S4 + " x " + $S4 + "z = " + @S4 + "z";
+
+ACCS5:
+ if (#S5 < 1) goto ACCS6;
+ set @S5,#S5*$S5;
+ mes $S5N$ + ": " + #S5 + " x " + $S5 + "z = " + @S5 + "z";
+
+ACCS6:
+ if (#S6 < 1) goto ACCS7;
+ set @S6,#S6*$S6;
+ mes $S6N$ + ": " + #S6 + " x " + $S6 + "z = " + @S6 + "z";
+
+ACCS7:
+ if (#S7 < 1) goto ACCS8;
+ set @S7,#S7*$S7;
+ mes $S7N$ + ": " + #S7 + " x " + $S7 + "z = " + @S7 + "z";
+
+ACCS8:
+ if (#S8 < 1) goto ACCS9;
+ set @S8,#S8*$S8;
+ mes $S8N$ + ": " + #S8 + " x " + $S8 + "z = " + @S8 + "z";
+
+ACCS9:
+ if (#S9 < 1) goto ACCS10;
+ set @S9,#S9*$S9;
+ mes $S9N$ + ": " + #S9 + " x " + $S9 + "z = " + @S9 + "z";
+
+ACCS10:
+ if (#S10 < 1) goto ACCS11;
+ set @S10,#S10*$S10;
+ mes $S10N$ + ": " + #S10 + " x " + $S10 + "z = " + @S10 + "z";
+
+ // Total //
+ACCS11:
+ set @total,@S1 + @S2 + @S3 + @S4 + @S5 + @S6 + @S7 + @S8 + @S9 + @S10;
+ mes "Total value: "+@total+"z";
+ next;
+ goto S_Start;
+
+
+ // GM MENU //
+GM_Menu:
+ mes "[Stock Market]";
+ mes "Master, do you require anything?";
+ menu "Fluctuate Market",S_Fluc,"Reset Prices",GM_Open,"Nothing",S_Start;
+
+S_Fluc:
+ set $fluc,rand (-6,6);
+ set $S1B,$S1;
+ set $S1,$S1+$fluc;
+ if ($S1 < 25) set $S1,$S1+3;
+ if ($S1 < 50) set $S1,$S1+2;
+ if ($S1 > 150) set $S1,$S1-2;
+ if ($S1 > 175) set $S1,$S1-3;
+ if ($S1 < 1) set $S1,1;
+
+ set $fluc,rand (-6,6);
+ set $S2B,$S2;
+ set $S2,$S2+$fluc;
+ if ($S2 < 25) set $S2,$S2+3;
+ if ($S2 < 50) set $S2,$S2+2;
+ if ($S2 > 150) set $S2,$S2-2;
+ if ($S2 > 175) set $S2,$S2-3;
+ if ($S2 < 2) set $S2,1;
+
+ set $fluc,rand (-6,6);
+ set $S3B,$S3;
+ set $S3,$S3+$fluc;
+ if ($S3 < 25) set $S3,$S3+3;
+ if ($S3 < 50) set $S3,$S3+2;
+ if ($S3 > 150) set $S3,$S3-2;
+ if ($S3 > 175) set $S3,$S3-3;
+ if ($S3 < 1) set $S3,1;
+
+ set $fluc,rand (-6,6);
+ set $S4B,$S4;
+ set $S4,$S4+$fluc;
+ if ($S4 < 25) set $S4,$S4+3;
+ if ($S4 < 50) set $S4,$S4+2;
+ if ($S4 > 150) set $S4,$S4-2;
+ if ($S4 > 175) set $S4,$S4-3;
+ if ($S4 < 1) set $S4,1;
+
+ set $fluc,rand (-6,6);
+ set $S5B,$S5;
+ set $S5,$S5+$fluc;
+ if ($S5 < 25) set $S5,$S5+3;
+ if ($S5 < 50) set $S5,$S5+2;
+ if ($S5 > 150) set $S5,$S5-2;
+ if ($S5 > 175) set $S5,$S5-3;
+ if ($S5 < 1) set $S5,1;
+
+ set $fluc,rand (-6,6);
+ set $S6B,$S6;
+ set $S6,$S6+$fluc;
+ if ($S6 < 25) set $S6,$S6+3;
+ if ($S6 < 50) set $S6,$S6+2;
+ if ($S6 > 150) set $S6,$S6-2;
+ if ($S6 > 175) set $S6,$S6-3;
+ if ($S6 < 1) set $S6,1;
+
+ set $fluc,rand (-6,6);
+ set $S7B,$S7;
+ set $S7,$S7+$fluc;
+ if ($S7 < 25) set $S7,$S7+3;
+ if ($S7 < 50) set $S7,$S7+2;
+ if ($S7 > 150) set $S7,$S7-2;
+ if ($S7 > 175) set $S7,$S7-3;
+ if ($S7 < 1) set $S7,1;
+
+ set $fluc,rand (-6,6);
+ set $S8B,$S8;
+ set $S8,$S8+$fluc;
+ if ($S8 < 25) set $S8,$S8+3;
+ if ($S8 < 50) set $S8,$S8+2;
+ if ($S8 > 150) set $S8,$S8-2;
+ if ($S8 > 175) set $S8,$S8-3;
+ if ($S8 < 1) set $S8,1;
+
+ set $fluc,rand (-6,6);
+ set $S9B,$S9;
+ set $S9,$S9+$fluc;
+ if ($S9 < 25) set $S9,$S9+3;
+ if ($S9 < 50) set $S9,$S9+2;
+ if ($S9 > 150) set $S9,$S9-2;
+ if ($S9 > 175) set $S9,$S9-3;
+ if ($S9 < 1) set $S9,1;
+
+ set $fluc,rand (-6,6);
+ set $S10B,$S10;
+ set $S10,$S10+$fluc;
+ if ($S10 < 25) set $S10,$S10+3;
+ if ($S10 < 50) set $S10,$S10+2;
+ if ($S10 > 150) set $S10,$S10-2;
+ if ($S10 > 175) set $S10,$S10-3;
+ if ($S10 < 1) set $S10,1;
+
+ set $S_LastUpd$,"GM Fluctuation";
+ mes "Market fluctuated.";
+ close;
+
+GM_Open:
+ menu "Set prices to...",GM_Set,"Cancel",-;
+ mes "Farewell.";
+ close;
+
+GM_Set:
+ mes "Are you sure you want to reset?";
+ mes "^FF0000All share values will become the same.^000000";
+ next;
+ menu "Yes",-,"No",GM_Menu;
+ set @gmset,0;
+ input @gmset;
+ set $S1,@gmset;
+ set $S2,@gmset;
+ set $S3,@gmset;
+ set $S4,@gmset;
+ set $S5,@gmset;
+ set $S6,@gmset;
+ set $S7,@gmset;
+ set $S8,@gmset;
+ set $S9,@gmset;
+ set $S10,@gmset;
+ set $S1B,@gmset;
+ set $S2B,@gmset;
+ set $S3B,@gmset;
+ set $S4B,@gmset;
+ set $S5B,@gmset;
+ set $S6B,@gmset;
+ set $S7B,@gmset;
+ set $S8B,@gmset;
+ set $S9B,@gmset;
+ set $S10B,@gmset;
+ mes "All prices changed to " + @gmset + "z.";
+ close;
+
+S_Quit:
+ mes "[Stock Market]";
+ mes "Goodbye.";
+ close;
+}