/*
 * This program 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.
 *
 * This program 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.Watermelon;

import static com.l2jserver.gameserver.util.EventNpcAligner.align;
import static com.l2jserver.gameserver.util.EventNpcAligner.getSpawns;
import static com.l2jserver.gameserver.util.Util.contains;

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

import javolution.util.FastMap;

import com.l2jserver.gameserver.datatables.SkillTable;
import com.l2jserver.gameserver.instancemanager.QuestManager;
import com.l2jserver.gameserver.model.L2Object;
import com.l2jserver.gameserver.model.L2Skill;
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.item.L2Weapon;
import com.l2jserver.gameserver.model.quest.Quest;
import com.l2jserver.gameserver.model.quest.QuestState;
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.Rnd;

/**
 * @author JOJO
 *
 * Original: "SquashEvent" Gnacik version 1.0
 * Java   By JOJO@L2J-SFJP 06-08-2010
 * Update By pmq@L2J-TW    04-09-2010
 * Update By JOJO@L2J-SFJP 03-12-2010
 */
public class Watermelon extends Quest
{
	private static final String qn = "Watermelon";
/**
 * イベント進行役 ファス ザ キャット Npc ID (31227) Original: ID (32727) For Freya New Npc
 */
	private static final int MANAGER = 31227;
/**
 * ネクター 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 (13271) * 良質な大きなスイカ       Mob ID (13273) * 不良な大きなスイカ     Mob ID (13272)
 * 幼い大きな甘いスイカ Mob ID (13275) * 良質な大きな甘いスイカ   Mob ID (13277) * 不良な大きな甘いスイカ Mob ID (13276)
 * 超良質な大きなスイカ Mob ID (13274) * 超良質な大きな甘いスイカ Mob ID (13278)
 */
	private static final int[] WATERMELON_LIST =
	{
		13271,13273,13272,
		13275,13277,13276,
		13274,13278
	};

	// 種で幼い〜を召還したときの叫び
	private static final int[] SPAWN_TEXT =
	{
		1800903,	//ここはどこや！俺を呼んだのは誰や！
		1800904,	//じゃーん！俺、スイカやでっ！
		1800905,	//俺のこと、呼んだ？
		1800906,	//スイカの登場やでっ！これからどんどん育つでっ！
		1800907,	//へえ、ひさしぶりやん！
		1800908,	//大きいスイカにな〜れ！やっぱり夏はスイカやもんねぇ。
		1800909,	//俺のこと、呼んだ？そろそろ何か出るって思ってるんとちゃうの？
		1800910,	//立派に育った俺の姿、見たいやろ？
		1800911,	//へへへっ！一緒にやろう！
		1800912,	//うまいこと育てたらビッグスイカ、失敗したら出来損ないやでっ！
	};
	// ネクターで成長したときの叫び
	private static final int[] GROWUP_TEXT =
	{
		1800913,	//じゃーん！変身したでっ！
		1800914,	//さーて、良質な大きなスイカやろかな？不良な大きなスイカやろかな？
		1800915,	//大きくなってもうたがな〜さあ、かかれっ！
		1800916,	//大きくなるぅ〜強くなるぅ〜願いを言うてみ！
		1800917,	//出来損ないにな〜れ！って、もう育ちまくりやんっ！
		1800918,	//超でかいスイカにな〜れ！はよ起こしてよ！
		1800919,	//育ってもうたがな〜ほな、逃げるでっ！
		1800920,	//1000万アデナやるから、俺を見逃してくれっ！
		1800921,	//さ〜て、俺の中には何が詰まってるかなっ？
		1800922,	//よっしゃ、よっしゃ！ほんなら、何をしたらええのかわかってるやろ？
	};
	// ネクターがまずかったときの叫び
	private static final int[] POISON_TEXT =
	{
		1800923,	//ちゃんとせえよ！こぼしてるやん！ほんまにもったいない．．．
		1800924,	//ああ、ええ気持ちやっ！もっとかけて！
		1800925,	//むっちゃ気持ちええやん！もっとないの？
		1800926,	//この下手くそ！はずしまくりやん！
		1800927,	//げっ！何やねん、これ！賞味期限切れてるんちゃうか？
		1800928,	//ええがな、ええがな。もっとがんがんかけてや！
		1800929,	//そこ、ちゃうっちゅ〜ねん！ここ、ここ！この、ヘタクソ！
		1800930,	//げっ！さっきの何やねん！ネクターちゃうんとちゃうの？
		1800931,	//ちゃんとやってえな！うまいことかけへんかったら、育つもんも育たんでっ！
		1800932,	//ほんまにネクターはスイカネクターが最高やなっ！はははっ！
	};
	// ネクターを与えないで放置したときの叫び
	private static final int[] HUNGRY_TEXT =
	{
	/*	1800933,	//ええがな、ええがな！もっとがんがんどついてや〜			*/
	/*	1800934,	//なんでどつくねん！暴力ハンタ〜イ！もっとネクターくれよ！	*/
		1800935,	//割れたらどないすんねんっ！
		1800936,	//育ってもおらんのに食うんかいっ！勝手にせえ！
		1800937,	//どんどんどついてや〜ネクターもほしいねん！
		1800938,	//しおれてもうたらどないすんねん！責任取ってや〜
		1800939,	//しおれてもうたら、骨折り損のくたびれ儲けやでっ！そんなに俺が嫌いなんか？
		1800940,	//おいおい、もっとがんばれよ〜
		1800941,	//俺はネクターも飲まんと死んでまうんや。恋を知らんと死ぬようなもんや！助けてくれっ！
		1800942,	//ああ、俺はもう死ぬんや．．．悲しい．．．
	};
	// 時間切れのときの叫び
	private static final int[] TIMEUP_TEXT =
	{
		1800948,	//俺、帰るわ。ほな、さいなら！
		1800949,	//残念やな。ビックスイカとはこれでおさらばや。
		1800950,	//遅いねんっ！ほな、さいなら！
		1800951,	//俺、もう行かなあかんねん。次を楽しみにしてるでっ！
		1800952,	//残念やな。もうちょっとやったのに。
	};
	// 甘いスイカをクロノ武器で攻撃したときの叫び
	private static final int[] CHRONO_TEXT =
	{
		1800953,	//へえ、ええ音色やな。
		1800954,	//なあ、なあ、一曲歌ってもええか？
		1800955,	//ええ曲っちゅうのは果物にも伝わるねん。
		1800956,	//ええアンバイやぁ〜もっと聞かせてえなぁ！
		1800957,	//俺のためだけに弾いてくれるんか？うれしいなあ！
		1800958,	//なあ、何か音おかしいんとちゃう？
		1800959,	//ええがな、ええがな！
		1800960,	//ああ〜、何か身体がムズムズしてきたわ！
		1800961,	//あっ、この和音！もう最高やな！もっと聞かせてえなぁ！
		1800962,	//これやがな！このサウンドが聴きたかってん！アンタ、ミュージシャンになれるんとちゃう？
	};
	// 甘いスイカを指定外の武器で攻撃したときの叫び
	private static final int[] NOCHRONO_TEXT =
	{
		1800963,	//こんなんちゃう！どつくんやったら、もっとちゃんとせえよ！
		1800964,	//痛いっちゅ〜ねん！俺は音楽が聴きたいねん！ちゃんとせえよ！
		1800965,	//俺の心と身体に響くような、ええサウンドで頼むでっ！
		1800966,	//これちゃうがな！あれや、あれ！クロノの楽器！あれでやれよ！
		1800967,	//ああ、ヒマや。音楽ないから、ヒマでしゃ〜ない。俺、もう帰るでっ。
		1800968,	//こんなん、俺好かんねん！音の出るやつで頼むわ！
		1800969,	//大きいスイカは音楽だけでも開くねんで。武器でどつきたおしてもあかん。
		1800970,	//楽器で頼むわ！こんなん、俺好かんねん！楽器でな！
		1800971,	//むちゃすごいアタックやな！せやけど音がないんやったら無駄やでっ！
		1800972,	//それはモンスター用やっちゅ〜ねん！俺がクロノがええねん！
	};
	// 爆発時の叫び
	private static final int[] KILL_TEXT =
	{
		1800973,	//割れるでっ！
		1800974,	//できそこないを何をそないに大事にしてるねん！
		1800975,	//どないや、俺とのひと時、楽しかったやろ？
		1800976,	//ビッグスイカになりますようにっ！
		1800977,	//あかん！俺はもう死ぬ！
		1800978,	//うわっ！何じゃ、こりゃ〜っ！
		1800979,	//これで仕舞いやっ！
		1800980,	//く、くやしいっ！
		1800981,	//スイカ、割れるでっ！アイテムが出るでっ！
		1800982,	//割れてもうたがなっ！中身がどくどく出てるやん！
	};
	// 通常スイカを攻撃したときの叫び
	private static final int[] ATTACK_TEXT =
	{
		1800983,	//ほな、優しく頼むでっ！
		1800984,	//へえ、なかなかの腕やん！
		1800985,	//おらおら、ちゃんとどつかんかいっちゅ〜ねん！
		1800986,	//俺はドMやねん。もっとどついてくれよ！
		1800987,	//がんばらんかいな！時間、あれへんがな。
		1800988,	//そんなんで割れる思ってんのちゃうやろな？
		1800989,	//ええがな、ええがな！そんなんで引き続き頼むわ。
		1800990,	//せやせや、そこそこ！ちゃうちゃう！もっと右や！
		1800991,	//なんや、そのネコパンチみたいなんは？お前はあかん！
		1800992,	//考えるより叩くが易し、っちゅ〜やっちゃな。
	};
	// ネクターが美味しかったときの叫び
	private static final int[] NECTAR_TEXT =
	{
		1800993,	//頼む、もっとネクターくれ！
		1800994,	//ネクターなかったら育たへんやん！
		1800995,	//がんばって育てろよ！うまいこと育てたらビッグスイカ、失敗したら出来損ないやでっ！
		1800996,	//腹減った〜ネクター飲ませえ！腹減った〜ネクター飲ませえ！この歌、知らんか？
		1800997,	//ネクターや、ネクターをよこせ！ネクタイ、ちゃうで！さぶっ！
		1800998,	//ネクターくれたらどんどん育つでっ！
		1800999,	//俺はまだ未熟やねん！もうほんまにイラチやなぁ〜もうちょっと待てよ！
		1801000,	//俺はなあ、将来大物になるねん！ちゃんと育ててくれさえしたらな。
		1801001,	//ビッグなスイカがほしいんか？俺は出来損ないでもええ。
		1801002,	//俺を信じてネクターをくれたらええねん！ほんなら、ビッグなスイカになったるでっ！
	};
	// ドロップ リスト 【 ID モンスター , NO 確率 , ID アイテム, NO 数量 】
	private static final int[][] DROPLIST =
	{
		/**
		 * <DEL>must be sorted by npcId !</DEL>
		 * npcId, chance, itemId,qty [,itemId,qty...]
		 *
		 * Young Watermelon
		 * 幼い大きなスイカ
		 */
		{ 13271,100,  6391,2 },		// Nectar
		/**
		 * Defective Watermelon
		 * 不良な大きなスイカ
		 */
		{ 13272,100,  6391,50 },	// Nectar
		/**
		 * Rain Watermelon
		 * 良質な大きなスイカ
		 */
		{ 13273,100,  6391,100 },	// Nectar
		/**
		 * Large Rain Watermelon
		 * 超良質な大きなスイカ
		 */
		{ 13274,100,  6391,150 },	// Nectar
		/**
		 * Young Honey Watermelon
		 * 幼い大きな甘いスイカ
		 */
		{ 13275,100, 14701,2,		//超強力瞬間体力回復剤
		             14700,2 },		//超強力体力回復剤
		/**
		 * Defective Honey Watermelon
		 * 不良な大きな甘いスイカ
		 */
		{ 13276, 50,   729,4,		//武器強化スクロール：Aグレード
		               730,4,		//防具強化スクロール：Aグレード
		              6569,2,		//祝福された武器強化スクロール：Aグレード
		              6570,2 },		//祝福された防具強化スクロール：Aグレード
		{ 13276, 30,  6622,1 },		//下巨人の秘伝書
		{ 13276, 10,  8750,1 },		//上級 生命の石：レベル67
		{ 13276, 10,  8751,1 },		//上級 生命の石：レベル70
		{ 13276, 99, 14701,4,		//超強力瞬間体力回復剤
		             14700,4 },		//超強力体力回復剤
		{ 13276, 50,  1461,4 },		//クリスタル：Aグレード
		{ 13276, 30,  1462,3 },		//クリスタル：Sグレード
		{ 13276, 50,  2133,4 },		//ジェムストーン：Aグレード
		{ 13276, 30,  2134,3 },		//ジェムストーン：Sグレード
		/**
		 * Rain Honey Watermelon
		 * 良質な大きな甘いスイカ
		 */
		{ 13277,  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
		{ 13277, 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グレード
		{ 13277, 28,  6622,3,		//下巨人の秘伝書
		              9625,2,		//下巨人の秘伝書：忘却編
		              9626,2,		//下巨人の秘伝書：修練編
		              9627,2 },		//下巨人の秘伝書：熟練編
		{ 13277, 14,  8750,10 },	//上級 生命の石：レベル67
		{ 13277, 14,  8751,8 },		//上級 生命の石：レベル70
		{ 13277, 14,  8752,6 },		//上級 生命の石：レベル76
		{ 13277, 14,  9575,4 },		//上級 生命の石：レベル80
		{ 13277, 14, 10485,2 },		//上級 生命の石：レベル82
		{ 13277, 14, 14168,1 },		//上級生命の石：レベル84
		{ 13277, 21,  8760,1,		//最上級生命の石：レベル67
		              8761,1,		//最上級生命の石：レベル70
		              8762,1,		//最上級生命の石：レベル76
		              9576,1,		//最上級生命の石：レベル80
		             10486,1,		//最上級生命の石：レベル82
		             14169,1 },		//最上級生命の石：レベル84
		{ 13277, 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グレード
		{ 13277, 99, 14701,9,		//超強力瞬間体力回復剤
		             14700,9 },		//超強力体力回復剤
		{ 13277, 63,  1461,8 },		//クリスタル：Aグレード
		{ 13277, 49,  1462,5 },		//クリスタル：Sグレード
		{ 13277, 63,  2133,6 },		//ジェムストーン：Aグレード
		{ 13277, 49,  2134,4 },		//ジェムストーン：Sグレード
		/**
		 * Large Rain Honey Watermelon
		 * 超良質な大きな甘いスイカ
		 */
		{ 13278, 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
		{ 13278, 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グレード
		{ 13278, 40,  6622,3,		//下巨人の秘伝書
		              9625,2,		//下巨人の秘伝書：忘却編
		              9626,2,		//下巨人の秘伝書：修練編
		              9627,2 },		//下巨人の秘伝書：熟練編
		{ 13278, 20,  8750,10 },	//上級 生命の石：レベル67
		{ 13278, 20,  8751,8 },		//上級 生命の石：レベル70
		{ 13278, 20,  8752,6 },		//上級 生命の石：レベル76
		{ 13278, 20,  9575,4 },		//上級 生命の石：レベル80
		{ 13278, 20, 10485,2 },		//上級 生命の石：レベル82
		{ 13278, 20, 14168,1 },		//上級生命の石：レベル84
		{ 13278, 30,  8760,1,		//最上級生命の石：レベル67
		              8761,1,		//最上級生命の石：レベル70
		              8762,1,		//最上級生命の石：レベル76
		              9576,1,		//最上級生命の石：レベル80
		             10486,1,		//最上級生命の石：レベル82
		             14169,1 },		//最上級生命の石：レベル84
		{ 13278, 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グレード
		{ 13278, 99, 14701,12,		//超強力瞬間体力回復剤
		             14700,12 },	//超強力体力回復剤
		{ 13278, 90,  1461,8 },		//クリスタル：Aグレード
		{ 13278, 70,  1462,5 },		//クリスタル：Sグレード
		{ 13278, 90,  2133,6 },		//ジェムストーン：Aグレード
		{ 13278, 70,  2134,4 },		//ジェムストーン：Sグレード
	};

	class TheInstance
	{
		int nectar;
		int success;
		long despawnTime;
	}
	private FastMap<L2ChronoMonsterInstance, TheInstance> _monsterInstances = new FastMap<L2ChronoMonsterInstance, TheInstance>().shared();
	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, 1800946);	//ネクターをくれへんかったら、2分後に帰るでっ！
				break;
			case 60:
				if (self.nectar == 0)
					autoChat(mob, 1800947);	//ネクターをくれへんかったら、1分後に帰るでっ！
				break;
			case 30:
				if (self.nectar == 0)
					autoChat(mob, 1800943);	//じらし過ぎやねん！もう飽きたわ！30秒以内にくれへんかったら、帰るでっ！
				break;
			case 20:
				autoChat(mob, 1800944);	//もう20秒しかないでっ！
				break;
			case 10:
				autoChat(mob, 1800945);	//あぁ、残り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.getItemId());
		switch (mob.getNpcId())
		{
			case 13271:
			case 13273:
			case 13272:
			case 13274:
				if (Rnd.get(100) < 20)
					autoChat(mob, ATTACK_TEXT);
				break;
			case 13275:
			case 13277:
			case 13276:
			case 13278:
				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, L2Skill skill, L2Object[] targets, boolean isPet)
	{
		if (skill.getId() == NECTAR_SKILL && targets[0] == npc)
		{
			final L2ChronoMonsterInstance mob = (L2ChronoMonsterInstance)npc;
			switch(mob.getNpcId())
			{
				case 13271:
					randomSpawnYoung(13272, 13273, 13274, mob);
					break;
				case 13275:
					randomSpawnYoung(13276, 13277, 13278, mob);
					break;
				case 13273:
					randomSpawnHigh(13274, mob);
					break;
				case 13277:
					randomSpawnHigh(13278, mob);
					break;
				case 13272:
				case 13276:
					autoChat(mob, 1800974);	//できそこないを何をそないに大事にしてるねん！
					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)
	{
		assert npc instanceof L2ChronoMonsterInstance;
		
		final L2ChronoMonsterInstance mob = (L2ChronoMonsterInstance)npc;
		mob.setOnKillDelay(1500);	//Default 5000ms.
		final TheInstance self = create(mob);
		switch(mob.getNpcId())
		{
			case 13271:
			case 13275:
				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 13272:
			case 13273:
			case 13274:
			case 13276:
			case 13277:
			case 13278:
				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[]>() {
			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.getNpcId();
		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(mob.getOwner(), 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(SkillTable.getInstance().getInfo(4513, 1));
			npcString = NECTAR_TEXT;
		}
		else
		{
			mob.doCast(SkillTable.getInstance().getInfo(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(SkillTable.getInstance().getInfo(4513, 1));
			spawnNext(king, mob);
		}
		else
		{
			mob.doCast(SkillTable.getInstance().getInfo(4514, 1));
			autoChat(mob, POISON_TEXT);
		}
	}

	private void autoChat(L2ChronoMonsterInstance mob, int npcString)
	{
		mob.broadcastPacket(new NpcSay(mob.getObjectId(), Say2.ALL, mob.getNpcId(), 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);
		newMob.setOwner(oldMob.getOwner());
		newMob.setTitle(oldMob.getTitle());
		oldMob.deleteMe();
	}

	private Watermelon(int questId, String name, String descr)
	{
		super(questId, name, descr);

		for (int mob : WATERMELON_LIST)
		{
			addAttackId(mob);
			addKillId(mob);
			addSpawnId(mob);
			addSkillSeeId(mob);
		}

		addStartNpc(MANAGER);
		addFirstTalkId(MANAGER);
		addTalkId(MANAGER);
		
		for (int[] spawn : getSpawns())
			align(addSpawn(MANAGER, spawn[0], spawn[1], spawn[2], spawn[3], false, 0))
			.setTitle("スイカイベント");
	}

	@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.getNpcId())
		{
			case MANAGER: return "31227.htm";
		}
		throw new RuntimeException();
	}

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

	public static void main(String[] args)
	{
		new Watermelon(-1, qn, "events");
	}
}