// @unloadnpc invasions
// @loadnpc npc/amatsu/features/invasion.txt


-	script	invasions	HIDDEN_NPC,{

OnInit:

	bindatcmd("invasion",strnpcinfo(3) + "::OnSetup",0,99);
	.invasion = 0;
	setbattleflag("item_free_town", 0);
	.GM = 1;
	.server_name$ = "Simply Amatsu";
	setarray(.maps$[0],"geffen","izlude","aldebaran","payon","morocc","alberta","prontera");
	setarray(.mapnames$[0],"Geffen","Izlude","Aldebaran","Payon","Morocc","Alberta","Prontera");
	setarray(.mvps[0],1038,1039,1046,1059,1086,1087,1112,1115,1147,1150,1159,1190,1251,1252,1272,1312,1418,1373,1623,1751);
	setarray(.itemids[0],616,1,617,2,603,5,7179,2);
	
	// set default setting here:
	.Map$ = "geffen";		// Default Map	
	.mapname$ = "Geffen";		// Default Map Name
	.mvp = 1038;			// Default MvPID
	.r_itemid = 603;		// Default Reward ItemID
	.r_qty = 5;			// Default Reward Quantity
	.rpoints = 1;			// points quantity
	end;

OnSetup:
	mes("[^0000ffInvasion Manager^000000]");
	if (.invasion) {
		getmapxy(.@map$, @x, @y, 0);
		if (getmapflag(strcharinfo(3), mf_pvp) || getmapflag(strcharinfo(3), mf_nowarp) ) {
			mes("Sorry, you can't join invasion from this map");
			close();
		}
		if (spectator) {
			mes("Sorry, you can't join this event while you are at spectator mode.  use @bta and leave.");
			close();
		}
		if (.deadlock && !Hp) {
			mes("You may not use event when you are dead.");
			close();
		}
		mes("Status: ^28bf00Active^000000");
		mes("Map: ^28bf00"+.mapname$+"^000000");
		mes("MvP: ^28bf00"+getmonsterinfo(.mvp,0)+"^000000");
		mes("Kill Reward: ^28bf00"+.r_qty+"x "+getitemname(.r_itemid)+"^000000");
		mes("Normal Mob Reward: ^28bf00"+.rpoints+" Online Points^000000");

	} else {
		mes("Status: ^FF0000Inactive^000000");
	}	
	switch(select(
		 ((getgmlevel() < .GM)?":":" > ^FF0000Setup^000000:")+
		 ((.invasion && !estatus)?" > ^0055FFWarp to Event^000000:":":")+
		 ((estatus)?" > ^0055FFLeave Event^000000:":":")+
		 " > ^777777Close^000000"
	)) {
	case 1:
		while(1){
		switch(select(
			((!.invasion)?"Map [ ^28bf00"+.mapname$+"^000000 ]:":":")+
			((!.invasion)?"MvP [ ^28bf00"+getmonsterinfo(.mvp,0)+"^000000 ]:":":")+
			((!.invasion)?"MvP Reward [ ^28bf00"+.r_qty+"x "+getitemname(.r_itemid)+"^000000 ]:":":")+
	 		((!.invasion)?" > ^28bf00Start^000000 Invasion:":":")+
			((.invasion)?" > ^FF0000Stop^000000 Invasion:":":")+
			"- ^777777Close^000000"
		)) {
		case 1:
			.@menu$ = "";
			for( .@i = 0; .@i < getarraysize(.mapnames$); ++.@i )
				.@menu$ = .@menu$ + "^FF0000>^0000FF ["+.mapnames$[.@i]+"]:";
				.@select = select( .@menu$ ) - 1;
				.Map$ = .maps$[.@select];
				.mapname$ = .mapnames$[.@select];
				break;
		case 2: 
			.@menu$ = "";
			for( .@i = 0; .@i < getarraysize(.mvps); ++.@i )
				.@menu$ = .@menu$ + "^FF0000>^0000FF ["+getmonsterinfo(.mvps[.@i],0)+"]:";
				.@select = select( .@menu$ ) - 1;
				.mvp = .mvps[.@select];
				break;
		case 3:
			.@menu$ = "";
			for( .@i = 0; .@i < getarraysize(.itemids); .@i += 2 )
				.@menu$ = .@menu$ + "^FF0000>^0000FF ["+.itemids[.@i+1]+"x "+getitemname(.itemids[.@i])+"]:";
				.@select = select( .@menu$ ) - 1;
				.r_itemid = .itemids[.@select*2];
				.r_qty = .itemids[.@select*2+1];
				break;
		case 4:
			donpcevent ("invasions::OnStart");
			break;
		case 5:
			donpcevent ("invasions::OnStop");
			break;
		default:
			close();	
		}	
		}
		close();
	case 2:
		/* Save current state and location and warp to event area */
		getmapxy(.@map$, @x, @y, 0);
		elastmap$ = .@map$;
		elastx = @x;
		elasty = @y;
		estatus = 1;
		ehp = Hp;
		esp = Sp;
		percentheal(100, 100);
		warp(.Map$,0,0);
		break;
	case 3:
		estatus = 0;
		Hp = ehp;
		Sp = esp;
		warp(elastmap$,elastx,elasty);
		break;
	default:
		close();
	}
	end;

OnStart:
	if (.invasion) {
		donpcevent (strnpcinfo(3)+"::OnStop");
		end;
	}
	.invasion = 1;
	setbattleflag("item_free_town", 1);
	sleep2 1000;

	if (.mvp == 1038) {		// Osiris
		setarray(.@mobs[0],3384,20,3391,20,3399,20,1041,20,1036,20,1146,20,1029,20);
	}
	else if (.mvp == 1039) {	// Baphomet
		setarray(.@mobs[0],3384,20,3391,20,3399,20,1208,20,1163,20,1276,20,1061,20,1191,20,1132,20,1219,3);
	}
	else if (.mvp == 1046) {	// Doppelganger
		setarray(.@mobs[0],3384,20,3391,20,3399,20,1100,20,1130,20,1102,20,1143,20,1151,20,1061,20);
	}
	else if (.mvp == 1059) {	// Mistress
		setarray(.@mobs[0],3384,20,3391,20,3399,20,1004,20,1100,20,1139,20,1099,20,1096,1);
	}
	else if (.mvp == 1086) {	// Golden Thief Bug
		setarray(.@mobs[0],3384,20,3391,20,3399,20,1054,20,1053,20,1051,20,1005,20);
	}
	else if (.mvp == 1087) {	// Orc Hero
		setarray(.@mobs[0],3384,20,3391,20,3399,20,1273,20,1023,20,1189,20,1213,20);
	}
	else if (.mvp == 1112) {	// Drake
		setarray(.@mobs[0],3384,20,3391,20,3399,20,1279,20,1034,20,1068,20,1179,20,1191,20,1216,20,1071,20,1064,20,1143,20);
	}
	else if (.mvp == 1115) {	// Eddga
		setarray(.@mobs[0],3384,20,3391,20,3399,20,1060,20,1077,20,1116,20,1129,20,1026,20);
	}
	else if (.mvp == 1147) {	// Maya
		setarray(.@mobs[0],3384,20,3391,20,3399,20,1005,20,1095,20,1160,20,1105,20,1176,20,1121,20,1145,20);
	}
	else if (.mvp == 1150) {	// Moonlight Flower
		setarray(.@mobs[0],3384,20,3391,20,3399,20,1028,20,1016,20,1277,20,1170,20,1129,20,1020,20);
	}
	else if (.mvp == 1159) {	// Phreeoni
		setarray(.@mobs[0],3384,20,3391,20,3399,20,1005,20,1095,20,1160,20,1105,20,1176,20,1121,20,1145,20);
	}
	else if (.mvp == 1190) {	// Orc Lord
		setarray(.@mobs[0],3384,20,3391,20,3399,20,1011,20,1042,20,1005,20,1152,20,1189,20);
	}
	else if (.mvp == 1251) {	// Stormy Knight
		setarray(.@mobs[0],3384,20,3391,20,3399,20,1246,20,1248,20,1249,20,1120,1);
	}
	else if (.mvp == 1252) {	// Hatii
		setarray(.@mobs[0],3384,20,3391,20,3399,20,1242,40,1243,40);
	}
	else if (.mvp == 1272) {	// Dark Lord
		setarray(.@mobs[0],3384,20,3391,20,3399,20,1036,20,1015,20,1197,20,1196,20,1192,20,1191,20,1035,20);
	}
	else if (.mvp == 1312) {	// Turtle General
		setarray(.@mobs[0],3384,20,3391,20,3399,20,1208,20,1318,20,1315,20,1319,20,1314,20);
	}
	else if (.mvp == 1418) {	// Evil Snake
		setarray(.@mobs[0],3384,20,3391,20,3399,20,1412,20,1413,20,1416,20);
	}
	else if (.mvp == 1373) {	// Lord Of Death
		setarray(.@mobs[0],1507,20,1505,20,1506,30,1504,30);
	}
	else if (.mvp == 1623) {	// RSX
		setarray(.@mobs[0],3384,20,3391,20,3399,20,1614,20,1615,20,1617,30,1622,30);
	}
	else if (.mvp == 1751) {	// Valkyrie
		setarray(.@mobs[0],3384,20,3391,20,3399,20,1752,20,1753,20,1754,30,1693,30);
	}
	 else {

	}

	sleep2 1000;
	announce("[ Rune-Midgard Guard ]: We have trouble here in the town " + .mapname$ + "!", bc_all);

	sleep2 5000;
	announce("[ Rune-Midgard Guard ]: Everyone, we need your help to get rid of these mobs!", bc_all);

	.totalmob = 0; .mobs_left = 0;
	for ( .@i = 0; .@i < getarraysize(.@mobs); .@i += 2 ) {
		monster (.Map$,0,0,getmonsterinfo(.@mobs[.@i], 0 ),.@mobs[.@i], .@mobs[.@i+1],strnpcinfo(3)+"::OnMyMobDead");
		monster (.Map$,0,0,getmonsterinfo(.@mobs[.@i], 0 ),.@mobs[.@i], .@mobs[.@i+1],strnpcinfo(3)+"::OnMyMobDead2");
		.totalmob = .totalmob + (.@mobs[.@i+1]*2);
	}
	.mobs_left = .totalmob;
	end;

/* Announce every 5 minutes */
OnMinute00:
OnMinute05:
OnMinute10:
OnMinute15:
OnMinute20:
OnMinute25:
OnMinute30:
OnMinute35:
OnMinute40:
OnMinute45:
OnMinute50:
OnMinute55:
	if (.invasion) {
		announce("[ Rune-Midgard Guard ]: Invasion event is currently being held at " + .mapname$ + "!  Use @invasion to join.", bc_all);
	}
	end;

/* Kill normal mobs after 30 minutes */
OnTimer1805000:
	killmonster (.Map$,strnpcinfo(3)+"::OnMyMobDead");
	killmonster (.Map$,strnpcinfo(3)+"::OnMyMobDead2");
	.mobs_left = 0;
	end;

OnStop:
	if (.invasion) {
		if (.mobs_left) {
			killmonster (.Map$,"invasions::OnMyMobDead");
			killmonster (.Map$,"invasions::OnMyMobDead2");
			killmonster (.Map$,"invasions::OnSpecialMobDead");
			announce("It seems that Game Master has ended the Invasion!.  Please use @invasion and leave to return to your previous location.",bc_all);
			.mobs_left = 0;
			.invasion = 0;
			recovery(.Map$);	
			setbattleflag("item_free_town", 0);
		}
	}
	end;

OnMyMobDead:
	--.mobs_left;
	if (!.mobs_left) {
		setbattleflag("item_free_town", 0);
		announce("[ Rune-Midgard Guard ]: "+getmonsterinfo(.mvp,0)+" has spawned in " + .Map$ + "!", bc_all);
		monster (.Map$,0,0,getmonsterinfo(.mvp,0),.mvp,1,strnpcinfo(3)+"::OnSpecialMobDead");

	} else {
		specialeffect(248, AREA, playerattached());
		getitem Coupon,.rpoints;
		dispbottom ("Gained "+.rpoints+" "+getitemname(Coupon)); 
		announce("["+.mobs_left+"/"+.totalmob+"] Monster left before the main event.",bc_map);
	}
	end;

OnMyMobDead2:
	--.mobs_left;
	if (!.mobs_left) {
		setbattleflag("item_free_town", 0);
		announce("[ Rune-Midgard Guard ]: "+getmonsterinfo(.mvp,0)+" has spawned in " + .Map$ + "!", bc_all);
		monster (.Map$,0,0,getmonsterinfo(.mvp,0),.mvp,1,strnpcinfo(3)+"::OnSpecialMobDead");

	} else {
		announce("["+.mobs_left+"/"+.totalmob+"] Monster left before the main event.",bc_map);
	}
end;

OnSpecialMobDead:
	killmonster (.Map$,"invasions::OnMyMobDead");
	killmonster (.Map$,"invasions::OnMyMobDead2");
	killmonster (.Map$,"invasions::OnSpecialMobDead");
	recovery(.Map$);
	end;

OnMvPEvent:
	if (.invasion && strcharinfo(3) == .Map$) {
		specialeffect(EF_ANGEL, AREA, playerattached());
		getitem Coupon,.rpoints;
		dispbottom ("Gained "+.rpoints+" "+getitemname(Coupon));
		announce(strcharinfo(0)+" has fought off the "+ getmonsterinfo(.mvp,0) +" Invasion and has been awarded [ "+.r_qty+"x "+getitemname(.r_itemid)+" ] worthy prize!  Use @invasion and leave to return to your previous location.", bc_all);
		getitem (.r_itemid,.r_qty);
		killmonster (.Map$,"invasions::OnMyMobDead");
		killmonster (.Map$,"invasions::OnMyMobDead2");
		killmonster (.Map$,"invasions::OnSpecialMobDead");
		recovery(.Map$);
		.invasion = 0;
		setbattleflag("item_free_town", 0);
	}
	end;
}
