//===== rAthena Script =======================================
//= Vending Machine
//===== By: ==================================================
//= Celestria
//===== Current Version: =====================================
//= 2.4
//===== Compatible With: =====================================
//= rAthena SVN
//===== Description: =========================================
//= sells items to players; occasionally the machine will "jam" :P
//===== Additional Comments: =================================
//= 1.0 - Creted a script for selling numerous items that would occasionally jam on players.
//=     - Used numbered variables to allow for multiplacation of the script.
//= 1.1 - Fixed $jamplayer1 not being a string, thanks to Terces.
//=     - Changed random number that intiates jam to 1, to allow for faster modification of jam rates.
//= 2.0 - Completely redid the script using a call-function.
//=       Now all replica scripts can simply be a copy of Vending Machine,
//=       but with variables modified to suit it''s intended use.
//= 2.1 - Fixed an error where if one machine jammed on a menu item (say 3 for example),
//=       if another machine also jammed on the same menu item (3 in this case), the original
//=       machine to jam would be unjammed.
//=     - This fix only allows a machine to jam one item at a time. Will fix in the future.
//= 2.2 - Added in/Renamed some variables to allow a single machine to block on several
//=       items simultaneously. This fix also allows the two-item drop to work with every
//=       item the machine is jammed on.
//= 2.3 - Added in "Slam" feature, as well as admin ability to turn machine on and off.
//=     - Added admin menu. Allows GMs to put machines in/out of service, and to clear
//=       all jammed items.
//= 2.4 - Made optimizations according to suggestions made by erKURITA. Script is now significantly shorter.
//============================================================

p_track01,45,58,4	script	Vending Machine#1	910,{

	set @machine,1; //sets the unique number of this machine
	//DO NOT have two machines with the same number

	set @jamrate,1000; //Odds of machine jamming will be 1 in @jamrate

	set @slam,0; //set this to 0 to turn on the slam feature, any other setting disables it.
	set @fallrate,10; //Odds of machine falling on someone who hits it are 1 in @fallrate
	set @freerate,10000; //Odds of machine giving an item to someone who hits it are 1 in @freerate

	set @admin,99; //sets GM level needed to access Admin menu

	// the following sets the items for sale. Script currently only handles 10 items.
	setarray @item[0], 12143, 519, 565;
	setarray @price[0], 100, 50, 200;

	for (set @i,0; @i < 10; set @i,@i+1)
	set @itemn$[@i],getitemname(@item[@i]);

	set @menu$[0], @itemn$[0]+" - "+@price[0];
	set @menu$[1], @itemn$[1]+" - "+@price[1];
	set @menu$[2], @itemn$[2]+" - "+@price[2];
	set @menu$[3], "Cancel";
	set @menu$[4], "";
	set @menu$[5], "";
	set @menu$[6], "";
	set @menu$[7], "";
	set @menu$[8], "";
	set @menu$[9], "";
	set @menu$[10], ""; // "Cancel" only. Used if vending ten items.

	callfunc "F_Vend1";
}





//===============================================================================================
// Functions
//
// !!!DO NOT EDIT BELOW THIS LINE!!!
//
//===============================================================================================

function	script	F_Vend1	{

	if(getgmlevel() >= @admin) goto M_Admin;

M_Player:
	if($outorder[@machine]) goto M_Ooo;
	if(@slam) callfunc "F_Vend2";
	mes "You see a vending machine. What would you like to do?";
	next;
	menu "Buy an item",M_Vend,"Hit it",M_Hit;

M_Vend:
	callfunc "F_Vend2";
	end;

M_Hit:
	callfunc "F_Slam";
	end;

M_Admin:
	mes "[Admin Mode]";
	mes "What would you like to do?";
	next;
	menu "Player Mode",M_Player,"Post 'Out of Order'",M_Ooo2,"Remove 'Out of Order'",M_Ooo3,"Fix Jammed Items",M_Fix;

M_Ooo:
	mes "Out of Order";
	close;

M_Ooo2:
	set $outorder[@machine],1;
	mes "The machine is now Out of Service";
	close;

M_Ooo3:
	set $outorder[@machine],0;
	mes "The machine is now in service.";
	close;

M_Fix:
	for (set @i,0; @i < 10; set @i,@i+1)
	setd "$itemjam"+@i+"$[@machine]","";
	mes "All jammed items have been fixed.";
	close;
}

function	script	F_Vend2	{

	for (set @i,0; @i < 10; set @i,@i+1)
	if(strcharinfo(0)==getd("$itemjam"+@i+"$[@machine]")) goto B_StillJammed;
	set @jammed,rand(1,@jamrate);
	mes "You peek inside the vending machine to see what's available.";
	next;
	menu 	@menu$[0],M_Ite0, @menu$[1],M_Ite1, @menu$[2],M_Ite2, @menu$[3],M_Ite3, 
		@menu$[4],M_Ite4, @menu$[5],M_Ite5, @menu$[6],M_Ite6, @menu$[7],M_Ite7,
		@menu$[8],M_Ite8, @menu$[9],M_Ite9, @menu$[10],M_Ite10;

	M_Ite0:
		set @num, 0;
		goto B_Buy;
	M_Ite1:
		set @num, 1;
		goto B_Buy;
	M_Ite2:
		set @num, 2;
		goto B_Buy;
	M_Ite3:
		set @num, 3;
		goto B_Buy;
	M_Ite4:
		set @num, 4;
		goto B_Buy;
	M_Ite5:
		set @num, 5;
		goto B_Buy;
	M_Ite6:
		set @num, 6;
		goto B_Buy;
	M_Ite7:
		set @num, 7;
		goto B_Buy;
	M_Ite8:
		set @num, 8;
		goto B_Buy;
	M_Ite9:
		set @num, 9;
		goto B_Buy;
	M_Ite10:
		set @num, 10;
		goto B_Buy;


B_Cancel:
	mes "On second thoughts, you decide not to buy anything.";
	close;

B_StillJammed:
	mes "You shake and punch the vending machine, but it appears no matter how much energy you exert, the dang item isn't going to come loose.";
	next;
	mes "["+strcharinfo(0)+"]";
	mes "DANG VENDING MACHINES!";
	close;

B_Broke:
	mes "As you put your last zeny in, you realise you don't have enough to afford the product.";
	mes "Sadly you hit the refund button and pick up what little zeny you have.";
	close;

B_Buy:
	if (@menu$[@num] == "Cancel") goto B_Cancel;
		for (set @i,0; @i < 10; set @i,@i+1) 
		if(@num==@i) if(getd("$itemjam"+@i+"$[@machine]")) set @jammed,0;
	if(Zeny < @price[@num]) goto B_Broke;
	set Zeny,Zeny-@price[@num];
	if(@jammed == 1) goto B_Jamitem;
	mes "Vrrrrrrrr~";
	mes "*clunk*";
	next;
	if(@jammed == 0) goto B_Get2;
	getitem @item[@num],1;
	mes "A "+@itemn$[@num]+" pops out.";
	close;
B_Get2:
	getitem @item[@num],2;
	mes "What the!?";
	mes "Two "+@itemn$[@num]+"s popped out!";
	mes "It must be your lucky day.";
		for (set @i,0; @i < 10; set @i,@i+1)
		if(@num==@i) setd "$itemjam"+@i+"$[@machine]","";
	close;
B_Jamitem:
	mes "Vrrrrrrrr~";
	mes "*click*";
	next;
	mes "["+strcharinfo(0)+"]";
	mes "Dammit!";
	mes "I hate it when these damn things jam!";
		for (set @i,0; @i < 10; set @i,@i+1)
		if(@num==@i) setd "$itemjam"+@i+"$[@machine]",strcharinfo(0);
	close;
}

function	script	F_Slam	{

	set @fall,rand(1,@fallrate);
	set @free,rand(1,@freerate);
R_Item:
	set @num,rand(9);
	if(@item[@num]==0) goto R_Item;

	mes "You give the vending machine a good solid whack.";
	next;
	mes "...";
	next;
	if(@fall==1){
		mes "The machine shakes, and then falls directly on top of you.";
		close2;
		percentheal -100,-100;
		end;}
	if(@free==1){
		getitem @item[@num],1;
		mes "The machine shakes, and then drops an item.";
		close;}
	mes "The machine shakes, but nothing happens";
	close;
}
