//===== rAthena Script ======================================= 
//= PvP NPCs
//===== By: ================================================== 
//= kobra_k88; L0ne_W0lf
//===== Current Version: ===================================== 
//= 1.5
//===== Compatible With: ===================================== 
//= rAthena SVN
//===== Description: ========================================= 
//= [Aegis Conversion]
//= PvP NPCs that are found in the Inns in major cities.
//= Includes Yoyo Mode, Nightmare Mode, and Event Mode
//=
//= Breakdown of function "F_PVPNarrator"
//= arg(0): Map to save player on
//= arg(1): X position on getarg(0) map to save player
//= arg(2): Y position on getarg(0) map to save player
//===== Additional Comments: ================================= 
//= 1.1 Fixed arena names for Nightmare mode.  Added room limit
//= 	check.[kobra_k88]
//= 1.2 Fixed the bug that you aways savepoint in geffen.[shadowlady]
//= 1.2a Added PvP Narrator function. Using args for Fight
//= 	Square Helpers. [kobra_k88]
//= 1.3 Rescripted to Aegis 10.3 standards. [L0ne_W0lf]
//=	Removed all receptioned for Yoyo mode, with the
//=	exception of the "Free for all" mode.
//=	Added PVP event NPCs.
//= 1.4 Corrected NPC names to fall within proper restrictions. [L0ne_W0lf]
//= 1.5 Duplicates now spawn from floating NPCs. [L0ne_W0lf]
//============================================================ 

// Floating NPC
//============================================================ 
-	script	Gate Keeper#dummy::PVPGateKeeper	-1,{
	mes "[Gate Keeper]";
	mes "Glad to be of service.";
	mes "I will open the PVP fight";
	mes "square for you! If you have";
	mes "any questions about the PVP";
	mes "modes or rules, Please ask";
	mes "the Narrator...";
	next;
	switch(select("^FF5533' PvP Nightmare Mode'^000000:^3355FF' PvP Yoyo Mode'^000000:^3355FF' PvP Event Mode'^000000:Quit")) {
	case 1:
		mes "[Gate Keeper]";
		mes "I am sorry, but currently the Nightmare mode service is not available.";
		mes "Please use the Yoyo mode instead. We apologize for the inconvenience.";
		close;
	case 2:
		mes "[Gate Keeper]";
		mes "The admission fee is 500 Zeny.";
		mes "Do you want to move";
		mes "to the Yoyo Mode";
		mes "fight square?";
		next;
		switch(select("Move:Cancel")) {
		case 1:
			if (Zeny > 499 && BaseLevel > 30) {
				set zeny,zeny-500;
				warp "pvp_y_room",51,23;
				end;
			}
			else {
				mes "[Gate Keeper]";
				mes "Excuse me, but";
				mes "did you not come prepared?";
				mes "Double check that you have the";
				mes "500 Zeny entrance fee, and";
				mes "that you are at least level 31!";
				close;
			}
		case 2:
			mes "[Gate Keeper]";
			mes "In this war between Monsters";
			mes "and Humans. This competition";
			mes "between people, The PVP Mode!";
			mes "Encourages us all to become";
			mes "stronger. Come again.";
			mes "We welcome your challenge!";
			close;
		}
	case 3:
		mes "[Gate Keeper]";
		mes "Welcome";
		mes "Please double check";
		mes "That you have the admission or viewing ticket!";
		next;
		if (countitem(7028) == 0 && countitem(7029) == 0) {
			mes "[Gate Keeper]";
			mes "Eh? You don't have it? Then I";
			mes "am sorry, this fight square is";
			mes "only for people who have";
			mes "admission or viewing tickets.";
			mes "You cannot come in without it.";
			close;
		}
		mes "[Gate Keeper]";
		mes "Yes, thank you for participating. Have fun!";
		close2;
		warp "pvp_room",51,23;
		end;
	case 4:
		mes "[Gate Keeper]";
		mes "In this war between Monsters";
		mes "and Humans. This competition";
		mes "between people, The PVP Mode!";
		mes "Encourages us all to become";
		mes "stronger. Come again.";
		mes "We welcome your challenge!";
		close;
	}
}

// Morroc
//============================================================ 
morocc_in,144,138,4	script	PVPNarrator#moc	84,{
	callfunc "F_PVPNarrator","morocc_in",141,139;
}

morocc_in,144,142,4	duplicate(PVPGateKeeper)	Gate Keeper#moc	83,{


// Alberta
//============================================================ 
alberta_in,22,146,4	script	PVP Narrator#alb	84,{
	callfunc "F_PVPNarrator","alberta_in",22,148;
}

alberta_in,26,146,4	duplicate(PVPGateKeeper)	Gate Keeper#alb	83

// Prontera
//============================================================ 
prt_in,56,140,4	script	PVPNarrator#prt	84,{
	callfunc "F_PVPNarrator","prt_in",54,137;
}

prt_in,52,140,4	duplicate(PVPGateKeeper)	Gate Keeper#prt	83

// Geffen
//============================================================ 
geffen_in,67,63,4	script	PVPNarrator#gef	84,{
	callfunc "F_PVPNarrator","geffen_in",70,59;
}

geffen_in,63,63,4	duplicate(PVPGateKeeper)	Gate Keeper#gef	83

// Payon
//============================================================ 
payon_in01,142,50,4	script	PVPNarrator#pay	84,{
	callfunc "F_PVPNarrator","payon_in01",142,46;
}

payon_in01,140,53,4	duplicate(PVPGateKeeper)	Gate Keeper#pay	83


// PVP Yoyo Mode Staff
//============================================================ 
pvp_y_room,86,85,4	script	Fight Square Reception#1	105,{
	set .@mapcount_1,getmapusers("pvp_y_8-1");
	set .@mapcount_2,getmapusers("pvp_y_8-2");
	set .@mapcount_3,getmapusers("pvp_y_8-3");
	set .@mapcount_4,getmapusers("pvp_y_8-4");
	set .@mapcount_5,getmapusers("pvp_y_8-5");
	while(1) {
		switch(select("Prontera [ "+.@mapcount_1+" / 128 ]:Izlude [ "+.@mapcount_2+" / 128 ]:Payon [ "+.@mapcount_3+" / 128 ]:Alberta [ "+.@mapcount_4+" / 128 ]:Morroc [ "+.@mapcount_5+" / 128 ]:Cancel")) {
		case 1:
			callsub S_CheckPVPRoom,.@mapcount_1,"pvp_y_8-1";
			break;
		case 2:
			callsub S_CheckPVPRoom,.@mapcount_2,"pvp_y_8-2";
			break;
		case 3:
			callsub S_CheckPVPRoom,.@mapcount_3,"pvp_y_8-3";
			break;
		case 4:
			callsub S_CheckPVPRoom,.@mapcount_4,"pvp_y_8-4";
			break;
		case 5:
			callsub S_CheckPVPRoom,.@mapcount_5,"pvp_y_8-5";
			break;
		case 6:
			close;
		}
	}

OnInit:
	waitingroom "Free For All",0;
	end;

S_CheckPVPRoom:
	if (getarg(0) >= 128) {
		mes "[PVP Fight Square Reception Staff]";
		mes "This map is currently full.";
		next;
		return;
	}
	else {
		warp getarg(1),0,0; 
		end;
	}
}

// PVP Nightmare Mode Staff
//============================================================ 
pvp_n_room,30,85,4	script	Fight Square Reception#2	105,{
	set .@mapcount_1,getmapusers("pvp_n_8-1");
	set .@mapcount_2,getmapusers("pvp_n_8-2");
	set .@mapcount_3,getmapusers("pvp_n_8-3");
	set .@mapcount_4,getmapusers("pvp_n_8-4");
	set .@mapcount_5,getmapusers("pvp_n_8-5");
	while(1) {
		switch(select("Sandwich [ "+.@mapcount_1+" / 64 ]:Lock on [ "+.@mapcount_2+" / 32 ]:Four Room [ "+.@mapcount_3+" / 32 ]:Under cross [ "+.@mapcount_4+" / 32 ]:Compass Room [ "+.@mapcount_5+" / 32 ]:Cancel")) {
		case 1:
			callsub S_CheckPVPRoom,.@mapcount_1,"pvp_n_8-1",64;
			break;
		case 2:
			callsub S_CheckPVPRoom,.@mapcount_2,"pvp_n_8-2",32;
			break;
		case 3:
			callsub S_CheckPVPRoom,.@mapcount_3,"pvp_n_8-3",32;
			break;
		case 4:
			callsub S_CheckPVPRoom,.@mapcount_4,"pvp_n_8-4",32;
			break;
		case 5:
			callsub S_CheckPVPRoom,.@mapcount_5,"pvp_n_8-5",32;
			break;
		case 6:
			close;
		}
	}

OnInit:
	waitingroom "Free For All",0;
	end;

S_CheckPVPRoom:
	if (getarg(0) >= getarg(2)) {
		mes "[PVP Fight Square Reception Staff]";
		mes "This map is currently full.";
		next;
		return;
	}
	else {
		warp getarg(1),0,0; 
		end;
	}
}

// Function 
//============================================================ 
function	script	F_PVPNarrator	{
	mes "[PVP Narrator]";
	mes "Hello and welcome!";
	mes "I am in charge of";
	mes "explaining the PVP Mode.";
	mes "I am the PVP Narrator!";
	next;
	switch(select("What is PVP?:What are the PVP Modes?:What are the rules for PVP?:Save Position.:End Dialog.")) {
	case 1:
		mes "[PVP Narrator]";
		mes "In short form";
		mes "PVP means,";
		mes "' Player VS Player Mode '";
		mes "It's a unique place for people";
		mes "To duel with each other.";
		next;
		mes "[PVP Narrator]";
		mes "Just tell the";
		mes "^3355FFGate Keeper^000000";
		mes "That you want to try. He will";
		mes "let you into the PVP square.";
		next;
		mes "[PVP Narrator]";
		mes "But, You need to be at";
		mes "least level 31. And you";
		mes "must pay the 500 zeny";
		mes "entrance fee in order to";
		mes "To enter a PVP Fight Square.";
		close;
	case 2:
		mes "[PVP Narrator]";
		mes "When you are qualified, You";
		mes "can choose one of two Modes.";
		mes "Yoyo Mode, Or";
		mes "Nightmare Mode.";
		next;
		mes "[PVP Narrator]";
		mes "Yoyo Mode is risk free.";
		mes "You can experience PVP";
		mes "without any restriction or";
		mes "punishment. It is recommended";
		mes "that you practice your skills";
		mes "here before you move on.";
		next;
		mes "[PVP Narrator]";
		mes "Nightmare Mode is very";
		mes "dangerous! Please use caution.";
		mes "You will lose some of your real";
		mes "EXP when you are defeated. And";
		mes "There is a small chance that";
		mes "you will drop some equipment.";
		next;
		mes "[PVP Narrator]";
		mes "However, if you win, the";
		mes "rewards can be great!";
		mes "To avoid misunderstanding.";
		mes "You should think it over";
		mes "twice before you go there...";
		mes "Good Luck!";
		close;
	case 3:
		mes "[PVP Narrator]";
		mes "Each of the Fight squares";
		mes "have a row of Narrators to";
		mes "choose from based on your";
		mes "qualifications.";
		next;
		mes "[PVP Narrator]";
		mes "Each Narrator will ask";
		mes "which of the five PVP maps";
		mes "you wish to go to.";
		mes "Choose, and go in!";
		next;
		mes "[PVP Narrator]";
		mes "Each map has a limitation on";
		mes "the number of people who can";
		mes "participate. So you will see";
		mes "figures in the corner showing";
		mes "'Attendee/total'.";
		next;
		mes "[PVP Narrator]";
		mes "Also, there is a hidden EXP";
		mes "value in PVP mode. This EXP";
		mes "score will only apply inside";
		mes "of the PVP zone, so do not";
		mes "worry.";
		next;
		mes "[PVP Narrator]";
		mes "Every player's EXP at the";
		mes "beginning is usually 5 points.";
		mes "If you win, you will";
		mes "increse your EXP by 1 point";
		next;
		mes "[PVP Narrator]";
		mes "In the same way, when you";
		mes "lose... Your EXP will";
		mes "drop by 5 points.";
		mes "So be careful!";
		next;
		mes "[PVP Narrator]";
		mes "When you are defeated";
		mes "And your EXP is equal";
		mes "to or less than 0,";
		mes "You will be removed from PVP";
		mes "And your duel is finished!";
		next;
		mes "[PVP Narrator]";
		mes "However, If your EXP is more";
		mes "than 0. You can still get help";
		mes "Through other players healing...";
		mes "Do you get it?";
		next;
		mes "[PVP Narrator]";
		mes "The fighting commands inside of";
		mes "PVP Are the same as the normal.";
		mes "All the basic controls are the";
		mes "same.";
		next;
		mes "[PVP Narrator]";
		mes "However, there is one thing...";
		mes "Within the PVP fight square,";
		mes "And in the PVP fighting zones";
		mes "You cannot save your position.";
		mes "Remember well... These rules";
		mes "can help to ensure your victory.";
		close;
	case 4:
		mes "[PVP Narrator]";
		mes "Position saved...";
		mes "Successfully.";
		mes "Thank you very much, We";
		mes "will see you again soon.";
		close2;
		savepoint getarg(0),getarg(1),getarg(2);
		end;
	case 5:
		mes "[PVP Narrator]";
		mes "In this war between Monsters";
		mes "and Humans. This competition";
		mes "between people, The PVP Mode!";
		mes "Encourages us all to become";
		mes "stronger. Come again.";
		mes "We welcome your challenge!";
		close;
	}
}

// Event Contestant Entrance
//============================================================ 
pvp_room,54,85,4	script	Registration Staff#1	105,{
	if (countitem(7028) == 0) {
		mes "[PVP Combat Square Register Staff]";
		mes "Eh? How did you get in here?";
		mes "This is the entrance for players only.";
		mes "For details about viewers please proceed to the Register Staff on your right.";
		close;
	}

	if (.pvp_close_n_room == 1 && .pvp_close_s_room == 1 && .pvp_close_w_room == 1 && .pvp_close_e_room == 1) {
		Set .pvp_close_n_room,0;
		Set .pvp_close_s_room,0;
		Set .pvp_close_w_room,0;
		Set .pvp_close_e_room,0;
	}

	if (select("Combat Square one :Cancel") == 1) {
		mes "[PVP Combat Square Register Staff]";
		mes "'"+ strcharinfo(0) +"'";
		mes "Are you ready?!";
		next;
		if (select("Yes!:No!") == 1) {
			mes "[PVP Combat Square Register Staff]";
			mes "OK! I will send you inside";
			mes "Good luck!";
			close2;
			delitem 7028,1; //Invite_For_Duel
			while(1) {
				switch(rand(1,4)) {
				case 1:
					if (.pvp_close_n_room == 0) {
						set .pvp_close_n_room,1;
						warp "pvp_2vs2",40,59;
						end;
					}
				case 2:
					if (.pvp_close_s_room == 0) {
						set .pvp_close_s_room,1;
						warp "pvp_2vs2",59,40;
						end;
					}
				case 3:
					if (.pvp_close_w_room == 0) {
						set .pvp_close_w_room,1;
						warp "pvp_2vs2",20,40;
						end;
					}
				case 4:
					if (.pvp_close_e_room == 0) {
						set .pvp_close_e_room,1;
						warp "pvp_2vs2",40,20;
						end;
					}
				}
			}
		}
		mes "[PVP Combat Square Register Staff]";
		mes "Come back anytime you are ready.";
		close;
	}
	close;

OnInit:
	Set .pvp_close_n_room,0;
	Set .pvp_close_s_room,0;
	Set .pvp_close_w_room,0;
	Set .pvp_close_e_room,0;
	waitingroom "Combat Square players entrance only",0;
	end;
}

// Spectator Entrance
//============================================================ 
-	script	Spectator's Entrance#dum::PVPSpectator	-1,{
	if (countitem(7029) == 0) {
		mes "[PVP Compete Square Register Staff]";
		mes "This is the entrance for viewers.";
		mes "For details about players entrance please proceed to the Register Staff on your left.";
		close;
	}

	if (select("Compete Square one:Cancel") == 1) {
		mes "[PVP Combat Square Register Staff]";
		mes "You got it, thanks for participating. Have fun!";
		close2;
		delitem 7029,1; //Admission_For_Duel
		switch(rand(1,4)) {
		case 1: warp "pvp_2vs2",39,7; end;
		case 2: warp "pvp_2vs2",39,73; end;
		case 3: warp "pvp_2vs2",7,39; end;
		case 4: warp "pvp_2vs2",73,39; end;
		}
	}
	close;

OnInit:
	waitingroom "Compete Square viewer's entrance",0;
	end;
}

pvp_room,62,85,4	duplicate(PVPSpectator)	Spectator's Entrance#1	105

pvp_room,70,85,4	duplicate(PVPSpectator)	Spectator's Entrance#2	105

pvp_room,78,85,4	duplicate(PVPSpectator)	Spectator's Entrance#3	105

pvp_room,86,85,4	duplicate(PVPSpectator)	Spectator's Entrance#4	105

// Spectator Warps
//============================================================ 
-	script	Combat Square Staff#dum::PVPSpecWarp	-1,{
OnTouch:
	mes "[Combat Square Staff]";
	mes "May I help you?";
	if (select("To the center viewer seat.:Leave Combat Square.") == 1) {
		warp "pvp_2vs2",38,38;
		end;
	}
	warp "pvp_room",84,39;
	end;
}

pvp_2vs2,5,4,0	duplicate(PVPSpecWarp)	Combat Square Staff#1	45,1,1,{

pvp_2vs2,5,74,0	duplicate(PVPSpecWarp)	Combat Square Staff#2	45,1,1

pvp_2vs2,74,74,0	duplicate(PVPSpecWarp)	Combat Square Staff#3	45,1,1

pvp_2vs2,74,5,0	duplicate(PVPSpecWarp)	Combat Square Staff#4	45,1,1

pvp_2vs2,40,40,0	script	Combat Square Staff#5	45,1,1,{
	set mapmove,0;
	mes "[Combat Square Staff]";
	mes "May I help you?";
	if (select("To the side viewer seat.:Leave Combat Square.") == 1) {
		switch(rand(1,4)) {
		case 1: warp "pvp_2vs2",39,7; end;
		case 2: warp "pvp_2vs2",39,73; end;
		case 3: warp "pvp_2vs2",7,39; end;
		case 4: warp "pvp_2vs2",73,39; end;
		}
	}
	warp "pvp_c_room",84,39;
	end;
}

// PVP Area Exit warp
//============================================================ 
pvp_room,51,19,0	script	out#eventpvp	45,4,2,{
OnTouch:
	mes "[Combat Square Staff]";
	mes "Did you have fun in Combat Square?";
	mes "May I ask where you want to go?";
	next;
	switch(select("prontera.:morocc.:geffen.:payon.:alberta.:Cancel.")) {
	case 1: warp "prontera",107,60; end;
	case 2: warp "morocc",157,96; end;
	case 3: warp "geffen",120,36; end;
	case 4: warp "payon",96,100; end;
	case 5: warp "alberta",41,243; end;
	case 6: close;
	}
}
