/*
 * Copyright (C) 2005-2008 L2J_JP / 2008-2013 L2J-SFJP
 * 
 * This file is part of L2J Server.
 * 
 * L2J Server is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 * 
 * L2J Server is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 * General Public License for more details.
 * 
 * You should have received a copy of the GNU General Public License
 * along with this program. If not, see <http://www.gnu.org/licenses/>.
 */
package events.SquashEvent;

import static com.l2jserver.gameserver.util.Util.*;

import java.util.Arrays;
import java.util.Comparator;

import com.l2jserver.gameserver.datatables.SkillData;
import com.l2jserver.gameserver.instancemanager.QuestManager;
import com.l2jserver.gameserver.model.L2Object;
import com.l2jserver.gameserver.model.actor.L2Npc;
import com.l2jserver.gameserver.model.actor.instance.L2ChronoMonsterInstance;
import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
import com.l2jserver.gameserver.model.event.LongTimeEvent;
import com.l2jserver.gameserver.model.items.L2Weapon;
import com.l2jserver.gameserver.model.quest.Quest;
import com.l2jserver.gameserver.model.quest.QuestState;
import com.l2jserver.gameserver.model.skills.Skill;
import com.l2jserver.gameserver.network.clientpackets.Say2;
import com.l2jserver.gameserver.network.serverpackets.NpcSay;
import com.l2jserver.gameserver.network.serverpackets.PlaySound;
import com.l2jserver.util.ConcurrentFastMap;
import com.l2jserver.util.Rnd;

/**
 * @author Gnacik
 * @version 1.0
 * Warning! Mostly that event is custom!
 * Java   By JOJO@L2J-SFJP 29-07-2010
 * Update By pmq@L2J-TW    04-09-2010
 * Update By JOJO@L2J-SFJP 04-12-2010
 */
public class SquashEvent extends LongTimeEvent
{
	private static final String qn = "SquashEvent";
/**
 * イベント進行役 ファス ザ キャット Npc ID (31860)
 */
	private static final int MANAGER = 31860;
/**
 * ネクター Skill ID (2005)
 */
	private static final int NECTAR_SKILL = 2005;

	private static final long DESPAWN_FIRST = 180000;
	private static final long DESPAWN_NEXT = 90000;

	private static final int DAMAGE_MAX = 12;
	private static final int DAMAGE_DEFAULT = 5;
/**
 * C1記念楽器 クロノ キタラ   Item ID (4202) * C2記念楽器 クロノ タンバリン Item ID (5133)
 * C3記念楽器 クロノ カンパナ Item ID (5817) * C4記念楽器 クロノ ダラブッカ Item ID (7058)
 * C5記念楽器 クロノ マラカス Item ID (8350)
 */
	private static final int[] CHRONO_LIST =
	{
		4202,5133,5817,7058,8350
	};
/**
 * 幼いポモナ       Mob ID (12774) * 良質なポモナ         Mob ID (12775) * 不良なポモナ       Mob ID (12776)
 * 幼い大きなポモナ Mob ID (12777) * 良質な大きなポモナ   Mob ID (12778) * 不良な大きなポモナ Mob ID (12779)
 * 超良質なポモナ   Mob ID (13016) * 超良質な大きなポモナ Mob ID (13017)
 */
	private static final int[] SQUASH_LIST =
	{
		12774,12775,12776,
		12777,12778,12779,
		13016,13017
	};

	// 種で幼い〜を召還したときの叫び
	private static final int[] SPAWN_TEXT =
	{
		99700,	//アタシのこと呼んだ？
		99701,	//こんにちは、アタシ、ポモナ！よろしくお願いしま〜す！
		99702,	//うふふっ、アタシのこと呼んだ？
		99703,	//みんなお待たせしました！ポモナ、来たわよ！これからどんどん育っちゃうんだから！
		99704,	//あら？アナタに会うのは初めてかしら？アタシ、ポモナ！よろしくね！
		99705,	//アタシ、アナタのことを愛せるようにがんばるから、いっぱい愛してね！
		99706,	//何か用かしら？エッ！こんなアタシに愛をくれるっていうの？
		99707,	//うふ。美しいアタシの姿、そんなに見たい〜？
		99708,	//アナタに呼ばれてここに来たのよ！早く愛をちょうだ〜い！
		99709,	//こんにちは、アタシ、ポモナ！ここに来たのは初めてかな？よろしくね！
	};
	// ネクターで成長したときの叫び
	private static final int[] GROWUP_TEXT =
	{
		99710,	//お待たせっ！それでは、変身の時間よ！
		99711,	//どう？アタシ、キレイになった？？キレイになったって言って！
		99712,	//成熟したわよ！さぁ、どこからでもいーよっ！
		99713,	//あっ．．．熱いものが全身を駆け巡るの！
		99714,	//アタシのこと、大切にしてくれないのね．．．ハズレちゃえ！
		99715,	//アナタにポモナ神の祝福があるように祈願してあげるっ！だから早く！
		99716,	//ご飯がいい？お風呂がいい？それとも、ア・タ・シ？えへへ、これ一度言ってみたかったんだ。
		99717,	//1千万アデナあげるから許してぇ！これってもう古い？
		99718,	//アタシの中に秘められたもの見てみたい？
		99719,	//アタシの今欲しいものわかる？わかってるでしょ？そうよ、もう一つの愛が欲しいの！
	};
	// ネクターがまずかったときの叫び
	private static final int[] POISON_TEXT =
	{
		99720,	//ねぇ、もう少しネクターをかけてっ！アタシへの愛ってそんなものじゃないでしょ？
		99721,	//あぁ、イイ感じ。気持ちよいわよ！もう少しちょうだい！
		99722,	//アナタの愛で満たされる感じ．．．もっと欲しいの！
		99723,	//もう！まともにできないの？こぼれてるじゃない！プンプン
		99724,	//や〜だ〜何か変よ！そうよ、アタシへの愛が足りていないのよ！
		99725,	//あぁ、すっごいいいかも．．．もっとちょうだい！
		99726,	//イヤッ！そこじゃないの！ヘタクソ！もう、嫌いになっちゃうよ！
		99727,	//ウワァーン！今のおいしくなかったよ〜．．．ねぇ、今の本当にネクターだったの？
		99728,	//ねぇ、しっかりしてよ！キレイに育てたいなら、ネクターをキレイにかけるのも大切よ！
		99729,	//愛に満ちたネクターが欲しいの！
	};
	// ネクターを与えないで放置したときの叫び
	private static final int[] HUNGRY_TEXT =
	{
	/*	99730,	//アンッ！アタシ今、顔を叩かれた〜顔は命なのっ！お願いだから顔だけはやめて！		*/
	/*	99731,	//アタシをいぢめないで〜やめてぇ！叩かないでぇ！アタシは、アナタの愛が欲しいの〜	*/
		99732,	//アナタの愛が感じられないの！これじゃ、アタシ萎えちゃうよ！
		99733,	//アタシとの愛を育てる気はないの？アタシは、アナタの愛のこもったネクターが今欲しいの！
		99734,	//まだ早いの！痛いのはやなの！ネクターが欲しいの！
		99735,	//このままじゃしおれちゃうの！もうアタシがどうなってもよいっていうの？
		99736,	//アタシがしおれたら、なにも残らないよ？そんなにアタシのこと嫌いなの？それともアナタの愛は終わってしまったの？
		99737,	//今、別のこと考えてたでしょ？そんなんじゃ、アナタの愛はアタシに伝わってこないの！もっと愛して！
		99738,	//ネェ、アタシを助けてよ〜ネクターを一度も飲めずにしおれるなんて、恋を知らずして死ぬのと一緒よ！
		99739,	//このままだとアタシ、生まれてきた意味もなく、しおれるしかないのね。すっごく悲しい．．．
	};
	// 時間切れのときの叫び
	private static final int[] TIMEUP_TEXT =
	{
		99745,	//今アタシね、アナタの未来のことを想像していたの。そしたらね、未来のアタシはアナタにいっぱい愛されていたの。また逢える日まで元気でいてねっ！きっとだよ！
		99746,	//愛って何なのかわかる？アナタにそれが理解できたら、もう一度逢えると思うの。また逢いましょうね！
		99747,	//つまんない！アタシ、もう帰る！そんなんじゃ、他のポモナにも嫌われるんだから！何が悪かったか反省しなさ〜い！
		99748,	//もう、お別れの時間なの。次に逢える日までに、アタシへの愛を育んでおいてね！
		99749,	//一方的な愛って、偏ってるっていうか．．．うん、それってダメだと思うの。ここまでしてくれたんだけど、もう行くね。本当にゴメンね。
	};
	// 大きなポモナをクロノ武器で攻撃したときの叫び
	private static final int[] CHRONO_TEXT =
	{
		99750,	//あぁ、すっごくいい音色ね！
		99751,	//ねぇ、ねぇ、一曲歌ってもいい？
		99752,	//愛ってすばらしいの！音色でも愛が伝わるものなのねっ！
		99753,	//いい気分になってきた〜もう少し聞かせてよ！
		99754,	//アタシのためだけに弾いてくれるの？うれしいっ！
		99755,	//ちょっと！音が変じゃない？アタシへの愛ってそんなものなの？
		99756,	//すっかりポモ肌！スゴくうれしいよっ！
		99757,	//ああ〜〜、身体がムズムズしてきたわ！いい曲を聞くと鳥肌が立つっていうけど、アタシの場合ポモ肌？多分そんな感じよね？
		99758,	//あっ、この和音！もう最高！もっと聞かせてなの！
		99759,	//これよ、これ！このサウンドが聴きたかったの！アナタ、ミュージシャンになれるわよっ！
	};
	// 大きなポモナを指定外の武器で攻撃したときの叫び
	private static final int[] NOCHRONO_TEXT =
	{
		99760,	//こんなんじゃダメ！いくら叩いても愛は育たないよ！
		99761,	//痛いのっ！アタシは音楽が聴きたいの！まじめにやってよ！
		99762,	//いいサウンドじゃなきゃ、アタシの心と身体には響かないの！
		99763,	//これじゃないの！あれよ、あれ！クロノの楽器！あれでやるの！
		99764,	//何で音楽がないの？アタシ、もう帰っていい？．．．いいの？本当に帰っちゃうよ？
		99765,	//こういうのは、いやっ！音の出る物でやってよ！
		99766,	//アタシは、音楽じゃなきゃダメなのぉ〜武器で叩くだけじゃ意味がないの！
		99767,	//楽器でやってよっ！こんな物じゃイヤ！楽器でするの！
		99768,	//アナタのアタックってスゴイのね〜でも、無駄無駄なのぉ〜音がないままなんてダメだよ！
		99769,	//刃物で脅しても無駄よ！アタシが欲しいのは音なの！
	};
	// 爆発時の叫び
	private static final int[] KILL_TEXT =
	{
		99770,	//ポモナとして、アナタに逢えてよかった。また生まれてきてもポモナでいたいな。アナタとだったらもう一度．．．
		99771,	//萎え萎え祈願！ハズレちゃえ！キャハハ
		99772,	//アタシとの思い出、大切にしてね〜
		99773,	//これがアナタとアタシの愛の結晶よ！
		99774,	//アナタの想い、受け取ったの。もう、サヨナラだね．．．
		99775,	//目が霞んでアナタの顔がもう見えないの．．．でもね、アナタの事は忘れない。また逢えるよね？
		99776,	//あ〜、すごくよかったの！満足なの〜、これでまた転生することができるかな？お礼としてこれあげるね。
		99777,	//アナタの愛、いっぱい受けとったの。でも、もうお別れだね。アナタのこと、忘れない！また逢おうね！
		99778,	//ポモナ、割れちゃったの！いいもの出た〜？出なかったとしても、もう一度おねがいね！
		99779,	//きゃっ！割れちゃったぁ！アタシの中の愛が〜〜〜〜
	};
	// 通常ポモナを攻撃したときの叫び
	private static final int[] ATTACK_TEXT =
	{
		99780,	//初めてなの！優しくしてね！
		99781,	//あぁ、これいいかな？
		99782,	//もっと！もっと愛が欲しいの！
		99783,	//アタシはアナタの愛で育つのよ！
		99784,	//それでめいいっぱいの愛なの？こんなんじゃアタシだめなの！
		99785,	//たったその程度で満足させられるとでも思ってるの？
		99786,	//すごいね。アタシ、そういうの好きよ。
		99787,	//そうよ、そこよっ！あーん、もう少し右っ！はふぅ
		99788,	//ちょっとぉ、アナタの愛ってその程度のものなの？
		99789,	//アタシのことだけを考えて！他のことを考えるなんてダメなの！もっと叩いて！
	};
	// ネクターが美味しかったときの叫び
	private static final int[] NECTAR_TEXT =
	{
		99790,	//ネクターが欲しいの！どうしてもネクターが欲しいの！
		99791,	//アタシね、ネクターをかけられると大きくなるのっ！
		99792,	//さあ早く、アナタの愛をいっぱい頂戴！上手くいけばアタシ、キレイに育つよ！
		99793,	//ねぇ、早く愛のこもったネクターをちょうだい！アタシの心とお腹はもうペコペコよっ！
		99794,	//早く、ネクターをいっぱいかけて！
		99795,	//ネクター．．．それってアタシへの愛の表現なの。だからアタシはそれをかけられて大きくなるの！
		99796,	//こんな未熟なうちに頂こうっていうの？少し気が早いの。もうすこし大きくなってからアタシを召上れ！
		99797,	//アナタに贈る歌を考えたの。聞いて！アナタに逢えてよかった〜アタシの愛を受け止めてくれるから〜もしアタシがダメになっても〜最後まで一緒に愛を育てよう．．．どう？ダメかな？
		99798,	//きっとアナタにもいいことがあると思うよ！アタシは、どんなことがあってもアナタの愛さえあればぜんぜん平気〜信じてるからね！
		99799,	//ねぇ、アタシを信じてネクターをかけてぇ！アタシが成熟したらきっといい事が訪れるよ！
	};
	// ドロップ リスト 【 ID モンスター , NO 確率 , ID アイテム, NO 数量 】
	private static final int[][] DROPLIST =
	{
		/**
		 * <DEL>must be sorted by npcId !</DEL>
		 * npcId, chance, itemId,qty [,itemId,qty...]
		 *
		 * Young Squash
		 * 幼いポモナ
		 */
		{ 12774,100,  6391,2 },		// Nectar
		/**
		 * Low Quality Squash
		 * 不良なポモナ
		 */
		{ 12776,100,  6391,50 },	// Nectar
		/**
		 * High Quality Squash
		 * 良質なポモナ
		 */
		{ 12775,100,  6391,100 },	// Nectar
		/**
		 * King Squash
		 * 超良質なポモナ
		 */
		{ 13016,100,  6391,150 },	// Nectar
		/**
		 * Large Young Squash
		 * 幼い大きなポモナ
		 */
		{ 12777,100, 14701,2,		//超強力瞬間体力回復剤
					 14700,2 },		//超強力体力回復剤
		/**
		 * Low Quality Large
		 * 不良な大きなポモナ
		 */
		{ 12779, 50,   729,4,		//武器強化スクロール：Aグレード
					   730,4,		//防具強化スクロール：Aグレード
					  6569,2,		//祝福された武器強化スクロール：Aグレード
					  6570,2 },		//祝福された防具強化スクロール：Aグレード
		{ 12779, 30,  6622,1 },		//下巨人の秘伝書
		{ 12779, 10,  8750,1 },		//上級 生命の石：レベル67
		{ 12779, 10,  8751,1 },		//上級 生命の石：レベル70
		{ 12779, 99, 14701,4,		//超強力瞬間体力回復剤
					 14700,4 },		//超強力体力回復剤
		{ 12779, 50,  1461,4 },		//クリスタル：Aグレード
		{ 12779, 30,  1462,3 },		//クリスタル：Sグレード
		{ 12779, 50,  2133,4 },		//ジェムストーン：Aグレード
		{ 12779, 30,  2134,3 },		//ジェムストーン：Sグレード
		/**
		 * High Quality Large
		 * 良質な大きなポモナ
		 */
		{ 12778,  7,  9570,1,		//レッド ソウル ストーン：ステップ14
					  9571,1,		//ブルー ソウル ストーン：ステップ14
					  9572,1,		//グリーン ソウル ストーン：ステップ14
					 10480,1,		//レッド ソウル ストーン：ステップ15
					 10481,1,		//ブルー ソウル ストーン：ステップ15
					 10482,1,		//グリーン ソウル ストーン：ステップ15
					 13071,1,		//レッド ソウル ストーン：ステップ16
					 13072,1,		//ブルー ソウル ストーン：ステップ16
					 13073,1 },		//グリーン ソウル ストーン：ステップ16
		{ 12778, 35,   729,4,		//武器強化スクロール：Aグレード
					   730,4,		//防具強化スクロール：Aグレード
					   959,3,		//武器強化スクロール：Sグレード
					   960,3,		//防具強化スクロール：Sグレード
					  6569,2,		//祝福された武器強化スクロール：Aグレード
					  6570,2,		//祝福された防具強化スクロール：Aグレード
					  6577,1,		//祝福された武器強化スクロール：Sグレード
					  6578,1 },		//祝福された防具強化スクロール：Sグレード
		{ 12778, 28,  6622,3,		//下巨人の秘伝書
					  9625,2,		//下巨人の秘伝書：忘却編
					  9626,2,		//下巨人の秘伝書：修練編
					  9627,2 },		//下巨人の秘伝書：熟練編
		{ 12778, 14,  8750,10 },	//上級 生命の石：レベル67
		{ 12778, 14,  8751,8 },		//上級 生命の石：レベル70
		{ 12778, 14,  8752,6 },		//上級 生命の石：レベル76
		{ 12778, 14,  9575,4 },		//上級 生命の石：レベル80
		{ 12778, 14, 10485,2 },		//上級 生命の石：レベル82
		{ 12778, 14, 14168,1 },		//上級生命の石：レベル84
		{ 12778, 21,  8760,1,		//最上級生命の石：レベル67
					  8761,1,		//最上級生命の石：レベル70
					  8762,1,		//最上級生命の石：レベル76
					  9576,1,		//最上級生命の石：レベル80
					 10486,1,		//最上級生命の石：レベル82
					 14169,1 },		//最上級生命の石：レベル84
		{ 12778, 21, 14683,1,		//強力生命の秘薬：Ｄグレード
					 14684,1,		//強力生命の秘薬：Cグレード
					 14685,1,		//強力生命の秘薬：Bグレード
					 14686,1,		//強力生命の秘薬：Aグレード
					 14687,1,		//強力生命の秘薬：Sグレード
					 14689,1,		//強力精神の秘薬：Ｄグレード
					 14690,1,		//強力精神の秘薬：Cグレード
					 14691,1,		//強力精神の秘薬：Bグレード
					 14692,1,		//強力精神の秘薬：Aグレード
					 14693,1,		//強力精神の秘薬：Sグレード
					 14695,1,		//強力闘志の秘薬：Ｄグレード
					 14696,1,		//強力闘志の秘薬：Cグレード
					 14697,1,		//強力闘志の秘薬：Bグレード
					 14698,1,		//強力闘志の秘薬：Aグレード
					 14699,1 },		//強力闘志の秘薬：Sグレード
		{ 12778, 99, 14701,9,		//超強力瞬間体力回復剤
					 14700,9 },		//超強力体力回復剤
		{ 12778, 63,  1461,8 },		//クリスタル：Aグレード
		{ 12778, 49,  1462,5 },		//クリスタル：Sグレード
		{ 12778, 63,  2133,6 },		//ジェムストーン：Aグレード
		{ 12778, 49,  2134,4 },		//ジェムストーン：Sグレード
		/**
		 * Emperor
		 * 超良質な大きなポモナ
		 */
		{ 13017, 10,  9570,1,		//レッド ソウル ストーン：ステップ14
					  9571,1,		//ブルー ソウル ストーン：ステップ14
					  9572,1,		//グリーン ソウル ストーン：ステップ14
					 10480,1,		//レッド ソウル ストーン：ステップ15
					 10481,1,		//ブルー ソウル ストーン：ステップ15
					 10482,1,		//グリーン ソウル ストーン：ステップ15
					 13071,1,		//レッド ソウル ストーン：ステップ16
					 13072,1,		//ブルー ソウル ストーン：ステップ16
					 13073,1 },		//グリーン ソウル ストーン：ステップ16
		{ 13017, 50,   729,4,		//武器強化スクロール：Aグレード
					   730,4,		//防具強化スクロール：Aグレード
					   959,3,		//武器強化スクロール：Sグレード
					   960,3,		//防具強化スクロール：Sグレード
					  6569,2,		//祝福された武器強化スクロール：Aグレード
					  6570,2,		//祝福された防具強化スクロール：Aグレード
					  6577,1,		//祝福された武器強化スクロール：Sグレード
					  6578,1 },		//祝福された防具強化スクロール：Sグレード
		{ 13017, 40,  6622,3,		//下巨人の秘伝書
					  9625,2,		//下巨人の秘伝書：忘却編
					  9626,2,		//下巨人の秘伝書：修練編
					  9627,2 },		//下巨人の秘伝書：熟練編
		{ 13017, 20,  8750,10 },	//上級 生命の石：レベル67
		{ 13017, 20,  8751,8 },		//上級 生命の石：レベル70
		{ 13017, 20,  8752,6 },		//上級 生命の石：レベル76
		{ 13017, 20,  9575,4 },		//上級 生命の石：レベル80
		{ 13017, 20, 10485,2 },		//上級 生命の石：レベル82
		{ 13017, 20, 14168,1 },		//上級生命の石：レベル84
		{ 13017, 30,  8760,1,		//最上級生命の石：レベル67
					  8761,1,		//最上級生命の石：レベル70
					  8762,1,		//最上級生命の石：レベル76
					  9576,1,		//最上級生命の石：レベル80
					 10486,1,		//最上級生命の石：レベル82
					 14169,1 },		//最上級生命の石：レベル84
		{ 13017, 30, 14683,1,		//強力生命の秘薬：Ｄグレード
					 14684,1,		//強力生命の秘薬：Cグレード
					 14685,1,		//強力生命の秘薬：Bグレード
					 14686,1,		//強力生命の秘薬：Aグレード
					 14687,1,		//強力生命の秘薬：Sグレード
					 14689,1,		//強力精神の秘薬：Ｄグレード
					 14690,1,		//強力精神の秘薬：Cグレード
					 14691,1,		//強力精神の秘薬：Bグレード
					 14692,1,		//強力精神の秘薬：Aグレード
					 14693,1,		//強力精神の秘薬：Sグレード
					 14695,1,		//強力闘志の秘薬：Ｄグレード
					 14696,1,		//強力闘志の秘薬：Cグレード
					 14697,1,		//強力闘志の秘薬：Bグレード
					 14698,1,		//強力闘志の秘薬：Aグレード
					 14699,1 },		//強力闘志の秘薬：Sグレード
		{ 13017, 99, 14701,12,		//超強力瞬間体力回復剤
					 14700,12 },	//超強力体力回復剤
		{ 13017, 90,  1461,8 },		//クリスタル：Aグレード
		{ 13017, 70,  1462,5 },		//クリスタル：Sグレード
		{ 13017, 90,  2133,6 },		//ジェムストーン：Aグレード
		{ 13017, 70,  2134,4 },		//ジェムストーン：Sグレード
	};

	class TheInstance
	{
		int nectar;
		int success;
		long despawnTime;
	}
	private ConcurrentFastMap<L2ChronoMonsterInstance, TheInstance> _monsterInstances = new ConcurrentFastMap<>();
	private TheInstance create(L2ChronoMonsterInstance mob)
	{
		TheInstance mons = new TheInstance();
		_monsterInstances.put(mob, mons);
		return mons;
	}
	private TheInstance get(L2ChronoMonsterInstance mob)
	{
		return _monsterInstances.get(mob);
	}
	private void remove(L2ChronoMonsterInstance mob)
	{
		cancelQuestTimer("countdown", mob, null);
		cancelQuestTimer("despawn", mob, null);
		_monsterInstances.remove(mob);
	}

	@Override
	public String onAdvEvent(String event, L2Npc npc, L2PcInstance player)
	{
		if (event == "countdown")
		{
			final L2ChronoMonsterInstance mob = (L2ChronoMonsterInstance)npc;
			final TheInstance self = get(mob);
			int timeLeft = (int)((self.despawnTime - System.currentTimeMillis() + 500) / 1000);

			switch (timeLeft)
			{
			case 120:
				if (self.nectar == 0)
					autoChat(mob, 99743);	//ネクターをくれないなら、2分後に帰っちゃうよ！
				break;
			case 60:
				if (self.nectar == 0)
					autoChat(mob, 99744);	//ネクターをくれないなら、1分後にサヨナラなんだから！
				break;
			case 30:
				if (self.nectar == 0)
					autoChat(mob, 99740);	//じらし過ぎなの！だんだん飽きてきたの！30秒以内にくれないなら、もう帰っちゃうよ！
				break;
			case 20:
				autoChat(mob, 99741);	//あと20秒！アタシへの愛ってそんなもんだったの？
				break;
			case 10:
				autoChat(mob, 99742);	//あぁ、残り10秒！9．．．8．．．7．．．
				break;
			case 0:
				autoChat(mob, TIMEUP_TEXT);
				break;
			default:
				if ((timeLeft % 20) == 0)
					if (self.nectar == 0)
						autoChat(mob, HUNGRY_TEXT);
				break;
			}
		}
		else if (event == "despawn")
		{
			remove((L2ChronoMonsterInstance)npc);
			npc.deleteMe();
		}
		else if (event == "sound")
		{
			((L2ChronoMonsterInstance)npc).broadcastPacket(new PlaySound(0, "ItemSound3.sys_sow_success", 0, 0, 0, 0, 0));
		}
		else
			return super.onAdvEvent(event, npc, player);
		return null;
	}

	@Override
	public String onAttack(L2Npc npc, L2PcInstance attacker, int damage, boolean isPet)
	{
		final L2ChronoMonsterInstance mob = (L2ChronoMonsterInstance)npc;
		L2Weapon weapon;
		final boolean isChronoAttack
			= !isPet
			&& (weapon = attacker.getActiveWeaponItem()) != null && contains(CHRONO_LIST, weapon.getId());
		switch (mob.getId())
		{
			case 12774:
			case 12775:
			case 12776:
			case 13016:
				if (Rnd.get(100) < 20)
					autoChat(mob, ATTACK_TEXT);
				break;
			case 12777:
			case 12778:
			case 12779:
			case 13017:
				if (isChronoAttack)
				{
					mob.setIsInvul(false);
					if (damage == 0)
						mob.getStatus().reduceHp(DAMAGE_DEFAULT, attacker);
					else if (damage > DAMAGE_MAX)
						mob.getStatus().setCurrentHp(mob.getStatus().getCurrentHp() + damage - DAMAGE_MAX);
					if (Rnd.get(100) < 20)
						autoChat(mob, CHRONO_TEXT);
				}
				else
				{
					mob.setIsInvul(true);
					mob.setCurrentHp(mob.getMaxHp());
					if (Rnd.get(100) < 20)
						autoChat(mob, NOCHRONO_TEXT);
				}
				break;
			default:
				throw new RuntimeException();
		}
		mob.getStatus().stopHpMpRegeneration();
		return super.onAttack(npc, attacker, damage, isPet);
	}

	@Override
	public String onSkillSee(L2Npc npc, L2PcInstance caster, Skill skill, L2Object[] targets, boolean isPet)
	{
		if (skill.getId() == NECTAR_SKILL && targets[0] == npc)
		{
			final L2ChronoMonsterInstance mob = (L2ChronoMonsterInstance)npc;
			switch (mob.getId())
			{
				case 12774:
					randomSpawnYoung(12776, 12775, 13016, mob);
					break;
				case 12777:
					randomSpawnYoung(12779, 12778, 13017, mob);
					break;
				case 12775:
					randomSpawnHigh(13016, mob);
					break;
				case 12778:
					randomSpawnHigh(13017, mob);
					break;
				case 12776:
				case 12779:
					autoChat(mob, 99771);	//萎え萎え祈願！ハズレちゃえ！キャハハ
					break;
			}
		}
		return null;
	//	return super.onSkillSee(npc,caster,skill,targets,isPet);
	}

	@Override
	public String onKill(L2Npc npc, L2PcInstance killer, boolean isPet)
	{
		final L2ChronoMonsterInstance mob = (L2ChronoMonsterInstance)npc;
		remove(mob);
		autoChat(mob, KILL_TEXT);
		dropItem(mob, killer);
		return super.onKill(npc, killer, isPet);
	}

	@Override
	public String onSpawn(L2Npc npc)
	{
		if (npc.getId() == MANAGER)
		{
			npc.setTitle("ポモナイベント");
			return null;
		}
		
		assert npc instanceof L2ChronoMonsterInstance;
		
		final L2ChronoMonsterInstance mob = (L2ChronoMonsterInstance)npc;
		mob.setOnKillDelay(1500);	//Default 5000ms.
		final TheInstance self = create(mob);
		switch(mob.getId())
		{
			case 12774:
			case 12777:
				startQuestTimer("countdown", 10000, mob, null, true);
				startQuestTimer("despawn", DESPAWN_FIRST + 3333, mob, null);
				self.nectar = 0;
				self.despawnTime = System.currentTimeMillis() + DESPAWN_FIRST;
				autoChat(mob, SPAWN_TEXT);
				break;
			case 12775:
			case 12776:
			case 12778:
			case 12779:
			case 13016:
			case 13017:
				startQuestTimer("countdown", 10000, mob, null, true);
				startQuestTimer("despawn", DESPAWN_NEXT + 3333, mob, null);
				self.nectar = 5;
				self.despawnTime = System.currentTimeMillis() + DESPAWN_NEXT;
				autoChat(mob, GROWUP_TEXT);
				startQuestTimer("sound",3000, mob, null);
				break;
			default:
				throw new RuntimeException();
		}
		return null;
	}

	static {
		Arrays.sort(DROPLIST, new Comparator<int[]>() {
			@Override
			public int compare(int[] a, int[] b) { return a[0] - b[0]; }
		});
	}
	private static final void dropItem(L2ChronoMonsterInstance mob, L2PcInstance player)
	{
		final int npcId = mob.getId();
		for (int[] drop : DROPLIST)
		{
			/**
			 * npcId   = drop[0]
			 * chance  = drop[1]
			 * itemId  = drop[2,4,6,8...]
			 * itemQty = drop[3,5,7,9...]
			 */
			if (npcId == drop[0])
			{
				final int chance = Rnd.get(100);
				if (chance < drop[1])
				{
					int i = 2 + 2 * Rnd.get((drop.length - 2) / 2);
					int itemId = drop[i + 0];
					int itemQty = drop[i + 1];
					if (itemQty > 1) itemQty = Rnd.get(1, itemQty);
					mob.dropItem((L2PcInstance)mob.getSummoner(), itemId, itemQty);
					continue;
				}
			}
			if (npcId < drop[0])
				return; // not found
		}
	}

	private void randomSpawnYoung(int bad, int good, int king, L2ChronoMonsterInstance mob)
	{
		final TheInstance self = get(mob);
		++self.nectar;
		final int[] npcString;
		
		if (Rnd.get(100) < 50)
		{
			++self.success;
			mob.doCast(SkillData.getInstance().getSkill(4513, 1));
			npcString = NECTAR_TEXT;
		}
		else
		{
			mob.doCast(SkillData.getInstance().getSkill(4514, 1));
			npcString = POISON_TEXT;
		}
		
		if (self.nectar == 5)
		{
			if (self.success >= 5) 
				spawnNext(king, mob);	// [5..5] 1/6=16.6%: 幼い→超良質な
			else if (self.success >= 3) 
				spawnNext(good, mob);	// [3..4] 2/6=33.3%: 幼い→良質な
			else 
				spawnNext(bad, mob);	// [0..2] 3/6=49.9%: 幼い→不良な
		}
		else /*if (self.nectar < 5)*/
		{
			autoChat(mob, npcString);
		}
	}

	private void randomSpawnHigh(int king, L2ChronoMonsterInstance mob)
	{
		final TheInstance self = get(mob);
		if (++self.nectar > 5 && self.nectar <= 15 && Rnd.get(100) < 15 - self.nectar)	// 10% 良質な→超良質な
		{
		//	mob.doCast(SkillData.getInstance().getSkill(4513, 1));
			spawnNext(king, mob);
		}
		else
		{
			mob.doCast(SkillData.getInstance().getSkill(4514, 1));
			autoChat(mob, POISON_TEXT);
		}
	}

	private void autoChat(L2ChronoMonsterInstance mob, int npcString)
	{
		mob.broadcastPacket(new NpcSay(mob.getObjectId(), Say2.ALL, mob.getId(), npcString));
	}
	private void autoChat(L2ChronoMonsterInstance mob, int[] npcString)
	{
		autoChat(mob, npcString[Rnd.get(npcString.length)]);
	}

	private void spawnNext(int npcId, L2ChronoMonsterInstance oldMob)
	{
		remove(oldMob);
		L2ChronoMonsterInstance newMob = (L2ChronoMonsterInstance)addSpawn(npcId, oldMob.getX(), oldMob.getY(), oldMob.getZ(), oldMob.getHeading(), false, 0, false, oldMob.getInstanceId());
		newMob.setSummoner(oldMob.getSummoner());
		newMob.setTitle(oldMob.getTitle());
		oldMob.deleteMe();
	}

	private SquashEvent()
	{
		super(qn, "events");

		addAttackId(SQUASH_LIST);
		addKillId(SQUASH_LIST);
		addSpawnId(SQUASH_LIST);
		addSkillSeeId(SQUASH_LIST);

		addStartNpc(MANAGER);
		addFirstTalkId(MANAGER);
		addTalkId(MANAGER);
		addSpawnId(MANAGER);
	}

	@Override
	public String onFirstTalk(L2Npc npc, L2PcInstance player)
	{
//		String htmltext = "";
		QuestState st = player.getQuestState(getName());
		if (st == null)
		{
			Quest q = QuestManager.getInstance().getQuest(getName());
			st = q.newQuestState(player);
		}
		switch (npc.getId())
		{
			case MANAGER: return "31860.htm";
		}
		throw new RuntimeException();
	}

	@Override
	public String onEvent(String event, QuestState qs)
	{
		// 31860-1.htm
		return event;
	}

	public static void main(String[] args)
	{
		new SquashEvent();
	}
}