ZURSULUS L2

Saga of the Arcana Lord

ID
91
Название
Saga of the Arcana Lord
start_npcs_json
[]
npc_ids_json
[]
constants_json
{}
Статус разбора
metadata_only; dynamic Java conditions/rewards retained in source; unresolved starts: []
Источник
game/data/scripts/quests/Q00091_SagaOfTheArcanaLord/Q00091_SagaOfTheArcanaLord.java

NPC квеста

Записей нет.

Условия уровней: выражения из Java

if (player.getLevel() < 76)
if (player.getLevel() < 76)
if (player.getLevel() >= 76)

Выдача предметов, адены и опыта: выражения из Java

giveItems(player, _items[10], 1);
addExpAndSp(player, 2299404, 0);
giveAdena(player, 5000000, true);
giveItems(player, 6622, 1);
giveItems(player, _items[1], 1);
giveItems(player, _items[4], 1);
giveItems(player, _items[7], 1);
giveItems(player, _items[9], 1);
giveItems(player, _items[9], 1);
giveItems(player, _items[8], 1);
giveItems(player, _items[5], 1);
giveItems(player, _items[6], 1);
giveItems(player, _items[8], 1);
addExpAndSp(player, 2299404, 0);
giveAdena(player, 5000000, true);
giveItems(player, 6622, 1); // XXX rewardItems?
giveItems(player, _items[3], getRandom(1, 4));

Квесты содержат динамические условия Java. Выражения выдачи включают промежуточные предметы, варианты и случайные награды; это не гарантированная награда. Константы приведены выше. Полные условия — в исходнике.

Тексты квеста

[0-01.htm] Chief Summoner Kinsley: Well..., shall we look at your records? You graduated from Einhovant's School of Magic, attained a Wizard''s license at Gludio Temple, passed the Test of the Summoner with flying colors and even received a Recommendation letter from Galatea! Your record is flawless! You shouldn't have any problem! I'm going to recommend you to be a candidate for Arcana Lord, the ultimate summoner! How about it? Will you take the test? "I'll do it." [0-010.htm] Chief Summoner Kinsley: You've gained the ultimate knowledge, but don't fully comprehend it yet. Like food, knowledge must be digested to become truth. You'll need more time. (Only a character of level 76 or above can transfer to the Elemental Master class. Don't abandon quest until class transfer is complete.) [0-02.htm] Chief Summoner Kinsley: Well..., shall we look at your records? You graduated from Einhovant's School of Magic, attained a Wizard''s license at Gludio Temple, passed the Test of the Summoner with flying colors and even received a Recommendation letter from Galatea! Your record is flawless! However, it's been pointed out that your research activities have been somewhat sluggish since you were promoted to Warlock. Please work harder. Eventually, I'm going to recommend you be a candidate for Arcana Lord, the ultimate summoner! (The quest may only be undertaken by a Warlock of level 76 or above.) [0-03.htm] Chief Summoner Kinsley: Ask Sparky the Cat, Keats's servitor, where his owner is. He's probably in Goddard Castle Town. It's pretty smart for a low-level spirit, so it should be helpful to you. Take this report with you. It's the document Keats was working on before he disappeared. It's about the spirit protecting one of the six tablets. Please read it, you'll be facing that monster one day soon! You'd better get going! Good luck! [0-04.htm] Chief Summoner Kinsley: Ask Sparky the Cat in Goddard Castle Town where his owner is. Make sure to read the report that I gave you! It will be crucial to the difficulty that you're going to face someday. Good luck! [0-05.htm] Chief Summoner Kinsley: No book or scroll speaks of the ultimate summoning spell. That information has always been restricted to the gods, far beyond the grasp of mere Humans. The secrets are supposedly written on six ancient tablets, in the language of the gods. The gods put these tablets in very out-of-the-way places, and stationed formidable beasts nearby to guard them. If you can learn the secrets of the six tablets, you will pass the test to become an Arcana Lord. Two people left to take this test before you, but Belinda sent me a letter saying that she wanted to give up, and I haven't heard from Keats for some time. He's a well-known playboy, and I'm worried that he's in trouble... You must meet them first. "Where can I find them?" [0-06.htm] Chief Summoner Kinsley: Welcome, pilgrim of vision! Chief Summoner Kinsley of the Ivory Tower humbly greets you. Congratulations on safely completing the pilgrimage of the six tablets and mastering the ultimate knowledge! Sparky's kept me apprised of your progress. I'm glad to hear that Keats and Belinda are safe. "Now what?" [0-07.htm] Chief Summoner Kinsley: You've obtained the sacred knowledge. I'm just a lowly magister whose sole purpose is to recognize those who have achieved knowledge. I hereby bestow upon you the title of Arcana Lord! Please take us to a higher level! Good luck! [0-08.htm] Chief Summoner Kinsley: You've obtained the sacred knowledge, but you haven't made it entirely your own. Like food, knowledge must be digested to become truth. To do so, you'll need more time. (Only a character of level 76 or above can transfer to the Elemental Master class. Don't abandon the quest until class transfer is complete.) [0-09.htm] Chief Summoner Kinsley: You've obtained the sacred knowledge. I'm just a lowly magister whose sole purpose is to recognize those who have achieved knowledge. I hereby bestow upon you the title of Arcana Lord! Please take us to a higher level! Good luck! [1-01.htm] Accursed Summoner Keats: Ribbit, ribbit, ribbit! "I heard what happened from Sparky. I'm here to help you." [1-02.htm] Accursed Summoner Keats: Ribbit! I've heard of a wonderful remedy called ice crystal that might lift this horrible curse! Chef Jeremy can tell you how to find some. Help me, please! I'll tell you how to become an Arcana Lord. Belinda's waiting for me but I can't propose to her looking like this! Sob... ...bit! [1-03.htm] Accursed Summoner Keats: Is it true, what I've heard about you? Ribbit! Did you actually kill Bumbalump? You're awesome! And this is the legendary ice crystal!? Oh, I pray it will lift this horrible curse! "Here it is." [1-04.htm] Accursed Summoner Keats: Take this letter to Sparky the Cat. I've told him to give you information on becoming an Arcana Lord. He's very smart! Good luck! [1-05.htm] Accursed Summoner Keats: Well, it's obviously no good to me in my current state... Ribbit! Oh, excuse me! How embarrassing! Ah, ha! You're trying to become an Arcana Lord, too, aren't you? Have you spoken with Sparky? I was following the same path, but due to my present condition, I've had to postpone my plans! Ribbit! Please help me lift this curse! In return, I'll tell you how to become an Arcana Lord. I've got much more important things that I must deal with now. I must confess my love for Belinda, the lady who captured my heart, and propose to her as soon as possible, but first I must free myself from this blasted curse! Dammit! I came to this hot springs area in search of Ice Crystals, a wonder drug that may lift the curse! Could you help me to find some? Help Chef Jeremy over there with his soy sauce and he'll tell you where to find ice crystals. Ribbit! [1-06.htm] Accursed Summoner Keats: Gulp~! Hmm... I'm not feeling anything... Am I? I guess it's not working, eh? Another failure! Sigh! But I'll never give up! I'll just find another way! Thank you so much! It didn't work, but it certainly boosted my confidence! I've decided to forget this stupid curse and go see Belinda as soon as possible! Now take this letter to Sparky the Cat. I've told him to tell you how to become an Arcana Lord. He's very smart! Good luck! [10-01.htm] Tablet of Vision: You can feel the presence of the Stone of Commune near the tablet. You feel you can find out its exact location if you lay your hands on the tablet. Lay hands on the tablet. [10-02.htm] Tablet of Vision: As you are about to lay your hands on the tablet, you can feel something behind you. And a new creature that you haven't seen before appears... [10-03.htm] Tablet of Vision: You need the Stone of Commune to decipher the hieroglyphs on the tablet. Speak with Sparky the Cat about the Stone of Commune. [10-04.htm] Tablet of Vision: Someone is already communing with the Tablet of Vision. Please try again later. [10-05.htm] Tablet of Vision: The tablet is inscribed with indecipherable hieroglyphs. The letters emit a dim light and the tablet seems to manifest strong magical powers. Use the Stone of Commune. [10-06.htm] Tablet of Vision: As you hold the Stone of Commune and concentrate on it, the tablet gets surrounded by bright light. You hear several hundred people simultaneously reading scriptures, and new knowledge starts to enter your mind. On one hand, you feel like you understand everything. On the other hand, you feel that you don't understand anything. You hear someone's low-pitched laughter. And you hear a man's voice. "You now have one more successor that you like." A blonde woman replies. "No, he's like a baby who just started walking. But he will no longer need his mother's protection..." All images disappear, and you start to recognize the surrounding environment. You are starting to understand the knowledge you have gained from the tablet little by little. The pilgrimage of the tablet seems to have ended. Return to Ivory Tower and see Head Summoner Kinsley. [10-07.htm] Tablet of Vision: Nothing happens any more even when you lay your hands on the tablet. Now that you have finished your pilgrimage of the tablet, return to Ivory Tower and see Head Summoner Kinsley. [11-01.htm] Summoner Belinda: I've been waiting for you. While you were away I did some research! I've located the fifth Stone of Commune, but unfortunately, it's already lost its power. You must've felt this Stone of Commune. Didn't it feel weaker than before? Fortunately, there are two more Stones of Commune like that one. One is in the Imperial Tomb and the other is at the Wall of Argos. If you go to the Imperial Tomb, look in the Four Sepulchers near the center. If you go to the Wall of Argos, enter the Shrine of the Loyal at the northeastern end of the wall. And... "And...?" [11-02.htm] Summoner Belinda: To get the fifth Stone of Commune, you must slay the Archon of Halisha. Find that devil in the Imperial Tomb or at the Wall of Argos. If you go to the Imperial Tomb, you'll find him in the Four Sepulchers. At the Shrine of the Loyal, the Archon will appear after you destroy many of his minions. His death is essential if you are to get the Stone of Commune. Good luck! [11-03.htm] Summoner Belinda: Wherever you find him, you must kill the Archon of Halisha if you are to get the fifth Stone of Commune. At the Imperial Tomb, you'll find him in the Four Sepulchers. At the Shrine of the Loyal, he'll appear after you destroy many of his minions. Please, get going! Good luck! [2-01.htm] Sparky the Cat: Meow. Kinsley sent you here, didn't he? Are you training to become an Arcana Lord just like my master? But my master...my master was... ...cursed and turned into a frog! Miss Belinda whom my master had loved for a long time put him under a curse by chanting an ancient spell! She turned him into a frog just because she couldn't accept his love~! Belinda was too cruel, Meow~!! Please, Meow~ Help me lift the curse, Meow! "Don't worry. I'll help you." [2-02.htm] Sparky the Cat: Meow! My master went to the hot spring area in Northern Goddard to find a cure for the curse himself~! Please go and help my master Summoner Keats! It will be easy to find him since he's in frog form, Meow! [2-03.htm] Sparky the Cat: Meow, even the remedy found in the hot spring region couldn't lift the curse. This is so sad, Meow! When will my master be transformed back into his regular form? Although the curse wasn't lifted, thank you very much for helping my master, Meow! My master has ordered me to help you! My master has already figured out a way to decipher the hieroglyphs on the 'Tablet of Vision!' My master is a great wizard who is well acknowledged by the elder statesmen of the Ivory Tower! This is not a problem for him! This is what my master told me: 'Sparky, the gods would actually prefer it if we did not master the highest level of magic. It's because human beings too easily fall into the trap of arrogance and self-righteousness. The gods remember all too well the Baium and Beres incidents. That's why they divided the tablet, which was originally used by the giants to teach magic. They created six pieces and changed the letters written on the tablet to match the letters of the gods.' So I asked my master, Meow! 'Master, does that mean that no one can obtain the knowledge contained in the tablets?' And my master replied, 'There is actually a way.' "What is it?" [2-04.htm] Sparky the Cat: Meow! The Stone of Commune you received! If you follow the Stone of Commune, you can find the first Tablet of Vision, Meow! Follow the Map if you are not sure! Good luck! [2-05.htm] Sparky the Cat: Meow! My master went to the hot spring area in Northern Goddard to find a cure for the curse himself~! Please go and help my master Summoner Keats! It will be easy to find him since he's in frog form, Meow! [2-06.htm] Sparky the Cat: This precious stone is the answer! This is what my master said, Meow! 'Sparky, this is a precious stone called the Stone of Commune. You can decipher the gods' letters on the Tablet of Vision if you use its power. Furthermore, you intuitively know where the tablet is hidden if you hold this stone in your hands.' So I asked my master, Meow! 'Master, who made this remarkable stone?' And my master said, 'Well, I'm not sure who made it...But one thing is for certain. Someone is helping us so that we, human beings, can gain the knowledge forbidden by the gods. I don't want to miss this great opportunity as someone who is searching for knowledge.' Meow! I'm going to entrust you with this Stone of Commune that my master used! You have to become Arcana Lord on behalf of my master, Meow! You can find the first Tablet of Vision if you follow the Stone of Commune! Good luck! [3-01.htm] Summoner Belinda: Sparky told me about you... you're that friend of Keats, aren't you? Poor Keats... He just wouldn't take no for an answer... I finally had to turn him into a frog! Did a good job of it, too! Even the Grand Magisters can't reverse the spell! Sigh... I tried everything, but the poor little fellow just hopped away in disgrace! I've got a marvelous idea! Why don't you become an Arcana Lord? Maybe then, you could reverse my wicked spell! "Where is the Stone of Commune?" [3-02.htm] Summoner Belinda: First, you must speak with Messenger Wahkan of the Ketra Orcs. They're hiring mercenaries, and this is a great opportunity to earn their trust! Soul Guide Asefa, the Chief Shaman of the Ketra Orcs, has something they call the Divine Stone of Wisdom. We must get it from them! If things don't go well with Asefa, try the Varka Silenos tribe. They have one too. Good luck! [3-03.htm] Summoner Belinda: First, you must speak with Messenger Naran Ashanuk of the Varka Silenos tribe. They've been hiring mercenaries, and this is a great opportunity to earn their trust! Soul Guide Udan Mardui, the Chief Shaman of the Varka Silenos, has something they call the Divine Stone of Wisdom. You must get it from them! If things don't go well with the Varka, you should try the Ketra Orc tribe. They also have one of the stones. Good luck! [3-04.htm] Summoner Belinda: To complete the fourth Stone of Commune, you must get the Divine Stone of Wisdom from the Ketra Orcs or the Varka Silenos. You'll need to gain their trust, and it won't be easy! Good luck! [3-05.htm] Summoner Belinda: Those idiotic barbarians worship the stone fragment, and call it their Divine Stone of Wisdom! It's actually a part of the Stone of Commune we need! If we can get it, I 'll join it with this other fragment I have to form the Stone of Commune! "Here it is. Join the fragments together." [3-06.htm] Summoner Belinda: Take the Stone of Commune to the fourth Tablet of Vision. The stone should guide you there. If not, just check out the Map! [3-07.htm] Summoner Belinda: The power that you felt comes from this small stone. It's the part of the fourth Stone of Commune. However, you must find the other fragments and put all of the fragments together to properly operate the Stone of Commune. The other fragments of the Stone of Commune are worshiped by the barbarians of this area as the 'Divine Stone of Wisdom'. As far as I know, Ketra Orcs and Varka Silenos have them. You must gain their trust first and attain the stone by some means or other. But, both tribes are notorious for being rough and belligerent. I don't know which tribe you should approach... "I'll go to the Ketra Orcs." "I'll go to Varka Silenos." [3-08.htm] Summoner Belinda: The two fragments fit together perfectly! Very well, here is the Stone of Commune! Take it to the fourth Tablet of Vision. You must quickly become an Arcana Lord and help me to reverse the spell I foolishly cast on Keats! I simply must restore his humanity! Please help me! [4-01.htm] Sparky the Cat: Meow~ I'll lose him! Meow~ Help me! Meow~ [4-010.htm] Sparky the Cat: Meow~ He left this. Meow~ I have to go to my master now and find how to remove the curse. Meow~ Then he and Belinda can get married! Meow~ I'll send you an invitation! "Wait a minute." [4-011.htm] Sparky the Cat: Meow~ He must have left this. Meow~ [4-02.htm] Sparky the Cat: Meow~ I'll lose him! Meow~ Help me!Meow~ [4-03.htm] Sparky the Cat: I lost him! Meow~ Better luck next time. Meow~ [4-04.htm] Sparky the Cat: I'll lose him! Meow~ Help me!Meow~ [4-05.htm] Sparky the Cat: Meow~ I'll lose him! Meow~ [4-06.htm] Sparky the Cat: Thanks for helping me. Meow~ That devil won't bother Belinda now! Meow~ "Your point?" [4-07.htm] Sparky the Cat: Meow~! "Cat got your tongue?" [4-08.htm] Sparky the Cat: Meow~ I'll lose him! Meow~ Don't you have the stone I gave you? Commune with the tablet! Meow~ [4-09.htm] Sparky the Cat: Don't you have the stone I gave you? Commune with the tablet! Meow~ [5-01.htm] Tablet of Vision: Hieroglyphics are engraved on the tablet. They emit a dim light, with a mysterious and powerful magic. Use the stone. [5-02.htm] Tablet of Vision: The Tablet of Vision becomes overwhelmed by bright lights. While you are holding the stone to work on it, you start to acquire a new sense of knowledge, with the voices of thousands of people reading scripture. You realize the truth of the world, yet understand nothing. One of the voices is a familiar female whisper. But it quickly disappears. Slowly, you begin to visualize where the next Stone of Commune is... in the valley of dust... you see a second Tablet of Vision... and a female warrior in platinum armor. She is holding the stone... She then unfolds her wings and flies away along with other female warriors...... In an instant, the images disappear and then the stone goes completely dark. [5-03.htm] Tablet of Vision: You visualize the stone once again when touching the Tablet. In the yellow-brown valley... you see a female warrior with platinum wings... She is holding the stone in her hand. You are compelled to go forth and find the stone right now! [6-01.htm] Tablet of Vision: You must have the Stone of Commune to access this Tablet of Vision. The stone is being held by one of the female warriors with platinum wings. [6-02.htm] Tablet of Vision: Hieroglyphics are engraved on the tablet. They emit a dim light, with a mysterious and powerful magic. Use the stone. [6-03.htm] Tablet of Vision: The Tablet of Vision becomes overwhelmed by bright lights. While you are holding the stone to work on it, you start to acquire a new sense of knowledge as you hear the voices of thousands reading scriptures in the background. You now realize the truth of the world and yet understand nothing. One of the voices is a familiar female whisper. But it quickly disappears. Slowly, you sense the Stone of Commune... You see the third Tablet of Vision... and an angel with two pairs of wings... She is holding the stone in her hand... In an instant, the images disappear and then the stone goes completely dark. [6-04.htm] Tablet of Vision: Your visions temporarily return, you again see the third Tablet of Vision... and an angel with two pairs of wings... She is holding the stone in her hand... You are compelled to go forth and find the stone right now! [7-01.htm] Tablet of Vision: The Stone of Commune exists near the tablet. Putting your hands on the tablet will reveal the location of the stone. Put your hands on the tablet. Patrol the area. [7-02.htm] Tablet of Vision: When putting your hands on the tablet, your entire body is knocked back by something powerful but invisible. Then, it begins to apprear. [7-03.htm] Tablet of Vision: The Tablet of Vision cannot be accessed without the Stone of Commune. Defeat Shakiel and take it from him [7-04.htm] Tablet of Vision: Someone else is currently communing with the Tablet of Vision. Come back later. [7-05.htm] Tablet of Vision: Ancient, indecipherable hieroglyphs are engraved upon the tablet. They emit a mysterious, dim light. There is something magical and powerful in the tablet. Commune with the Tablet of Vision. [7-06.htm] Tablet of Vision: When you hold the Stone of Commune in your hands and concentrate, the Tablet of Vision is slowly surrounded by bright light. Hundreds of voices begin pounding in your head... they seem to be reading some form of scripture, a scripture that reveals a great and horrible truth. Ah, the fundamental truth of all things is revealed! But wait, I can't understand any of it! Amid the voices, you recognize a whisper of a woman that you think you've heard before, but it fades quickly. You begin to understand where the next Stone of Commune is... a temple in Goddard Castle Town... an Elf lady with a petite body... she must be Summoner Belinda that Keats told you about. You feel the power of the Stone of Commune from her. The images fade and the light turns to darkness.. [7-07.htm] Tablet of Vision: Putting your hands on the tablet, the location of the Stone of Commune again becomes clear. Get the next Stone of Commune from Summoner Belinda in Goddard Castle Town. [8-01.htm] Tablet of Vision: Ancient, indecipherable hieroglyphs are engraved upon the tablet. They emit a mysterious, dim light. There is something magical and powerful in the tablet. Commune with the Tablet of Vision. [8-02.htm] Tablet of Vision: When you hold the Stone of Commune in your hands and concentrate, the Tablet of Vision is slowly surrounded by bright light. Hundreds of voices begin pounding in your head... they seem to be reading some form of scripture, a scripture that reveals a great and horrible truth. Ah, the fundamental truth of all things is revealed! But wait, I can't understand any of it! Before your eyes, a beautiful blonde lady and a knight wearing black armor show up, but quickly vanish. You begin to understand where the next Stone of Commune is... a temple in Goddard Castle Town... Summoner Belinda... she has the Stone of Commune in her hands. Unlike before, the light from the Stone of Commune shimmers very faintly. The images fade and the light turns to darkness.. [8-03.htm] Tablet of Vision: Putting your hands on the tablet, the location of the Stone of Commune again becomes clear. Summoner Belinda in the Goddard Castle Town has the fifth Stone of Commune. Go and get it from her! [9-01.htm] Tablet of Vision: To decode figures in the tablet, the Stone of Commune is needed. The fifth Stone of Commune is in the possession of the Archon of Halisha! You can find him at the Sepulchers or the Shrine of the Feudal Lords at the northeastern part of the Wall of Argos. [9-02.htm] Tablet of Vision: Ancient, indecipherable hieroglyphs are engraved upon the tablet. They emit a mysterious, dim light. There is something magical and powerful in the tablet. Commune with the Tablet of Vision. [9-03.htm] Tablet of Vision: The Tablet of Vision becomes overwhelmed by bright lights. While you are holding the stone to work on it, you start to acquire a new sense of knowledge as you hear the voices of thousands reading scriptures in the background. You now realize the truth of the world and yet understand nothing. There is a vision of a beautiful blonde woman and a knight with black armor. The vision disappears. Slowly, you begin to visualize where the next Stone of Commune is...A vision appears...A man-figure stands in front of the sixth Tablet of Vision hinded in the wilds...I can't see his face through the darkness, but his eyes burn with an otherworldly fire!...And, the Stone of Commune emits a dim light. In an instant, the images disappear and then the stone goes completely dark. [9-04.htm] Tablet of Vision: Putting your hands on the tablet, the location of the Stone of Commune again becomes clear. The sixth Stone of Commune is hidden in the wilds, and an ominous person is nearby. Go and get the Stone of Commune from that person!
Исходник условий и наград (Java)
/*
 * This file is part of the L2J Mobius project.
 * 
 * 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 quests.Q00091_SagaOfTheArcanaLord;

import quests.AbstractSagaQuest;

/**
 * @author Emperorc
 */
public class Q00091_SagaOfTheArcanaLord extends AbstractSagaQuest
{
	public Q00091_SagaOfTheArcanaLord()
	{
		super(91, "Saga of the Arcana Lord");
		_npc = new int[]
		{
			31605,
			31622,
			31585,
			31608,
			31586,
			31646,
			31647,
			31651,
			31654,
			31655,
			31658,
			31608
		};
		_items = new int[]
		{
			7080,
			7604,
			7081,
			7506,
			7289,
			7320,
			7351,
			7382,
			7413,
			7444,
			7110,
			0
		};
		_mob = new int[]
		{
			27313,
			27240,
			27310
		};
		_classId = new int[]
		{
			96
		};
		_prevClass = new int[]
		{
			0x0e
		};
		_x = new int[]
		{
			119518,
			181215,
			181227
		};
		_y = new int[]
		{
			-28658,
			36676,
			36703
		};
		_z = new int[]
		{
			-3811,
			-4812,
			-4816
		};
		_text = new String[]
		{
			"PLAYERNAME! Pursued to here! However, I jumped out of the Banshouren boundaries! You look at the giant as the sign of power!",
			"... Oh ... good! So it was ... let's begin!",
			"I do not have the patience ..! I have been a giant force ...! Cough chatter ah ah ah!",
			"Paying homage to those who disrupt the orderly will be PLAYERNAME's death!",
			"Now, my soul freed from the shackles of the millennium, Halixia, to the back side I come ...",
			"Why do you interfere others' battles?",
			"This is a waste of time.. Say goodbye...!",
			"...That is the enemy",
			"...Goodness! PLAYERNAME you are still looking?",
			"PLAYERNAME ... Not just to whom the victory. Only personnel involved in the fighting are eligible to share in the victory.",
			"Your sword is not an ornament. Don't you think, PLAYERNAME?",
			"Goodness! I no longer sense a battle there now.",
			"let...",
			"Only engaged in the battle to bar their choice. Perhaps you should regret.",
			"The human nation was foolish to try and fight a giant's strength.",
			"Must...Retreat... Too...Strong.",
			"PLAYERNAME. Defeat...by...retaining...and...Mo...Hacker",
			"....! Fight...Defeat...It...Fight...Defeat...It..."
		};
		registerNPCs();
	}
}


// Shared quest dependency: AbstractSagaQuest.java
/*
 * Copyright (c) 2013 L2jMobius
 * 
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 * 
 * The above copyright notice and this permission notice shall be
 * included in all copies or substantial portions of the Software.
 * 
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
 * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
 * IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 */
package quests;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.l2jmobius.gameserver.config.PlayerConfig;
import org.l2jmobius.gameserver.entity.World;
import org.l2jmobius.gameserver.entity.WorldObject;
import org.l2jmobius.gameserver.entity.actor.Creature;
import org.l2jmobius.gameserver.entity.actor.Npc;
import org.l2jmobius.gameserver.entity.actor.Player;
import org.l2jmobius.gameserver.entity.groups.Party;
import org.l2jmobius.gameserver.mechanics.script.Quest;
import org.l2jmobius.gameserver.mechanics.script.QuestState;
import org.l2jmobius.gameserver.mechanics.skill.Skill;
import org.l2jmobius.gameserver.network.enums.ChatType;
import org.l2jmobius.gameserver.network.serverpackets.MagicSkillUse;
import org.l2jmobius.gameserver.network.serverpackets.NpcSay;

public abstract class AbstractSagaQuest extends Quest
{
	protected int[] _npc = {};
	protected int[] _items = {};
	protected int[] _mob = {};
	protected int[] _classId = {};
	protected int[] _prevClass = {};
	protected int[] _x = {};
	protected int[] _y = {};
	protected int[] _z = {};
	protected String[] _text = {};
	private static final Map<Npc, Integer> SPAWN_LIST = new HashMap<>();
	// @formatter:off
	private static final int[][] QUEST_CLASSES =
	{
		{ 0x7f }, { 0x80, 0x81 }, { 0x82 }, { 0x05 }, { 0x14 }, { 0x15 },
		{ 0x02 }, { 0x03 }, { 0x2e }, { 0x30 }, { 0x33 }, { 0x34 }, { 0x08 },
		{ 0x17 }, { 0x24 }, { 0x09 }, { 0x18 }, { 0x25 }, { 0x10 }, { 0x11 },
		{ 0x1e }, { 0x0c }, { 0x1b }, { 0x28 }, { 0x0e }, { 0x1c }, { 0x29 },
		{ 0x0d }, { 0x06 }, { 0x22 }, { 0x21 }, { 0x2b }, { 0x37 }, { 0x39 }
	};
	// @formatter:on
	private static final int[] ARCHON_HALISHA_NORM =
	{
		18212,
		18214,
		18215,
		18216,
		18218
	};
	
	public AbstractSagaQuest(int questId, String description)
	{
		super(questId, description);
	}
	
	public void registerNPCs()
	{
		addStartNpc(_npc[0]);
		addAttackId(_mob[2]);
		addAttackId(_mob[1]);
		addSkillSeeId(_mob[1]);
		addFirstTalkId(_npc[4]);
		addTalkId(_npc);
		addKillId(_mob);
		final int[] questItemIds = _items.clone();
		questItemIds[0] = 0;
		questItemIds[2] = 0; // remove Ice Crystal and Divine Stone of Wisdom
		registerQuestItems(questItemIds);
		for (int archonMinion = 21646; archonMinion < 21652; archonMinion++)
		{
			addKillId(archonMinion);
		}
		
		addKillId(ARCHON_HALISHA_NORM);
		for (int guardianAngel = 27214; guardianAngel < 27217; guardianAngel++)
		{
			addKillId(guardianAngel);
		}
	}
	
	@Override
	public String onEvent(String event, Npc npc, Player player)
	{
		final QuestState st = getQuestState(player, false);
		if (st == null)
		{
			return null;
		}
		
		String htmltext = null;
		switch (event)
		{
			case "0-011.htm":
			case "0-012.htm":
			case "0-013.htm":
			case "0-014.htm":
			case "0-015.htm":
			{
				htmltext = event;
				break;
			}
			case "accept":
			{
				st.startQuest();
				giveItems(player, _items[10], 1);
				htmltext = "0-03.htm";
				break;
			}
			case "0-1":
			{
				if (player.getLevel() < 76)
				{
					htmltext = "0-02.htm";
					if (st.isCreated())
					{
						st.exitQuest(true);
					}
				}
				else
				{
					htmltext = "0-05.htm";
				}
				break;
			}
			case "0-2":
			{
				if (player.getLevel() < 76)
				{
					takeItems(player, _items[10], -1);
					st.setCond(20, true);
					htmltext = "0-08.htm";
				}
				else
				{
					takeItems(player, _items[10], -1);
					addExpAndSp(player, 2299404, 0);
					giveAdena(player, 5000000, true);
					giveItems(player, 6622, 1);
					final int playerClass = getPlayerClass(player);
					final int prevClass = getPrevClass(player);
					player.setPlayerClass(playerClass);
					if (!player.isSubClassActive() && (player.getBaseClass() == prevClass))
					{
						player.setBaseClass(playerClass);
					}
					
					player.broadcastUserInfo();
					cast(npc, player, 4339, 1);
					st.exitQuest(false);
					htmltext = "0-07.htm";
				}
				break;
			}
			case "1-3":
			{
				st.setCond(3);
				htmltext = "1-05.htm";
				break;
			}
			case "1-4":
			{
				st.setCond(4);
				takeItems(player, _items[0], 1);
				if (_items[11] != 0)
				{
					takeItems(player, _items[11], 1);
				}
				
				giveItems(player, _items[1], 1);
				htmltext = "1-06.htm";
				break;
			}
			case "2-1":
			{
				st.setCond(2);
				htmltext = "2-05.htm";
				break;
			}
			case "2-2":
			{
				st.setCond(5);
				takeItems(player, _items[1], 1);
				giveItems(player, _items[4], 1);
				htmltext = "2-06.htm";
				break;
			}
			case "3-5":
			{
				htmltext = "3-07.htm";
				break;
			}
			case "3-6":
			{
				st.setCond(11);
				htmltext = "3-02.htm";
				break;
			}
			case "3-7":
			{
				st.setCond(12);
				htmltext = "3-03.htm";
				break;
			}
			case "3-8":
			{
				st.setCond(13);
				takeItems(player, _items[2], 1);
				giveItems(player, _items[7], 1);
				htmltext = "3-08.htm";
				break;
			}
			case "4-1":
			{
				htmltext = "4-010.htm";
				break;
			}
			case "4-2":
			{
				giveItems(player, _items[9], 1);
				st.setCond(18, true);
				htmltext = "4-011.htm";
				break;
			}
			case "4-3":
			{
				giveItems(player, _items[9], 1);
				st.setCond(18, true);
				autoChat(npc, _text[13].replace("PLAYERNAME", player.getName()));
				st.set("Quest0", "0");
				cancelQuestTimer("Mob_2 has despawned", npc, player);
				deleteSpawn(npc);
				return null;
			}
			case "5-1":
			{
				st.setCond(6, true);
				takeItems(player, _items[4], 1);
				cast(npc, player, 4546, 1);
				htmltext = "5-02.htm";
				break;
			}
			case "6-1":
			{
				st.setCond(8, true);
				st.set("spawned", "0");
				takeItems(player, _items[5], 1);
				cast(npc, player, 4546, 1);
				htmltext = "6-03.htm";
				break;
			}
			case "7-1":
			{
				if (st.getInt("spawned") == 1)
				{
					htmltext = "7-03.htm";
				}
				else if (st.getInt("spawned") == 0)
				{
					final Npc mob1 = addSpawn(_mob[0], _x[0], _y[0], _z[0], -1);
					st.set("spawned", "1");
					startQuestTimer("Mob_1 Timer 1", 500, mob1, player);
					startQuestTimer("Mob_1 has despawned", 300000, mob1, player);
					addSpawn(st, mob1);
					htmltext = "7-02.htm";
				}
				else
				{
					htmltext = "7-04.htm";
				}
				break;
			}
			case "7-2":
			{
				st.setCond(10, true);
				takeItems(player, _items[6], 1);
				cast(npc, player, 4546, 1);
				htmltext = "7-06.htm";
				break;
			}
			case "8-1":
			{
				st.setCond(14, true);
				takeItems(player, _items[7], 1);
				cast(npc, player, 4546, 1);
				htmltext = "8-02.htm";
				break;
			}
			case "9-1":
			{
				st.setCond(17, true);
				st.set("Quest0", "0");
				st.set("Tab", "0");
				takeItems(player, _items[8], 1);
				cast(npc, player, 4546, 1);
				htmltext = "9-03.htm";
				break;
			}
			case "10-1":
			{
				if (st.getInt("Quest0") == 0)
				{
					final Npc mob3 = addSpawn(_mob[2], _x[1], _y[1], _z[1], -1);
					final Npc mob2 = addSpawn(_npc[4], _x[2], _y[2], _z[2], -1);
					addSpawn(st, mob3);
					addSpawn(st, mob2);
					st.set("Mob_2", String.valueOf(mob2.getObjectId()));
					st.set("Quest0", "1");
					st.set("Quest1", "45");
					startQuestTimer("Mob_3 Timer 1", 500, mob3, player, true);
					startQuestTimer("Mob_3 has despawned", 59000, mob3, player);
					startQuestTimer("Mob_2 Timer 1", 500, mob2, player);
					startQuestTimer("Mob_2 has despawned", 60000, mob2, player);
					htmltext = "10-02.htm";
				}
				else if (st.getInt("Quest1") == 45)
				{
					htmltext = "10-03.htm";
				}
				else
				{
					htmltext = "10-04.htm";
				}
				break;
			}
			case "10-2":
			{
				st.setCond(19, true);
				takeItems(player, _items[9], 1);
				cast(npc, player, 4546, 1);
				htmltext = "10-06.htm";
				break;
			}
			case "11-9":
			{
				st.setCond(15);
				htmltext = "11-03.htm";
				break;
			}
			case "Mob_1 Timer 1":
			{
				autoChat(npc, _text[0].replace("PLAYERNAME", player.getName()));
				return null;
			}
			case "Mob_1 has despawned":
			{
				autoChat(npc, _text[1].replace("PLAYERNAME", player.getName()));
				st.set("spawned", "0");
				deleteSpawn(npc);
				return null;
			}
			case "Archon Hellisha has despawned":
			{
				autoChat(npc, _text[6].replace("PLAYERNAME", player.getName()));
				st.set("spawned", "0");
				deleteSpawn(npc);
				return null;
			}
			case "Mob_3 Timer 1":
			{
				final Npc mob2 = findSpawn(player, World.findObject(st.getInt("Mob_2")).asNpc());
				if ((World.getFirstVisibleObject(npc, Npc.class, it -> it == mob2) != null))
				{
					npc.asAttackable().addDamageHate(mob2, 0, 99999);
					npc.getAI().setIntentionAttack(mob2);
					mob2.getAI().setIntentionAttack(npc);
					autoChat(npc, _text[14].replace("PLAYERNAME", player.getName()));
					cancelQuestTimer("Mob_3 Timer 1", npc, player);
				}
				
				return null;
			}
			case "Mob_3 has despawned":
			{
				autoChat(npc, _text[15].replace("PLAYERNAME", player.getName()));
				st.set("Quest0", "2");
				deleteSpawn(npc);
				return null;
			}
			case "Mob_2 Timer 1":
			{
				autoChat(npc, _text[7].replace("PLAYERNAME", player.getName()));
				startQuestTimer("Mob_2 Timer 2", 1500, npc, player);
				if (st.getInt("Quest1") == 45)
				{
					st.set("Quest1", "0");
				}
				
				return null;
			}
			case "Mob_2 Timer 2":
			{
				autoChat(npc, _text[8].replace("PLAYERNAME", player.getName()));
				startQuestTimer("Mob_2 Timer 3", 10000, npc, player);
				return null;
			}
			case "Mob_2 Timer 3":
			{
				if (st.getInt("Quest0") == 0)
				{
					startQuestTimer("Mob_2 Timer 3", 13000, npc, player);
					if (getRandomBoolean())
					{
						autoChat(npc, _text[9].replace("PLAYERNAME", player.getName()));
					}
					else
					{
						autoChat(npc, _text[10].replace("PLAYERNAME", player.getName()));
					}
				}
				
				return null;
			}
			case "Mob_2 has despawned":
			{
				st.set("Quest1", String.valueOf(st.getInt("Quest1") + 1));
				if ((st.getInt("Quest0") == 1) || (st.getInt("Quest0") == 2) || (st.getInt("Quest1") > 3))
				{
					st.set("Quest0", "0");
					
					// TODO: This "if" will never be true.
					if (st.getInt("Quest0") == 1)
					{
						autoChat(npc, _text[11].replace("PLAYERNAME", player.getName()));
					}
					else
					{
						autoChat(npc, _text[12].replace("PLAYERNAME", player.getName()));
					}
					
					deleteSpawn(npc);
				}
				else
				{
					startQuestTimer("Mob_2 has despawned", 1000, npc, player);
				}
				
				return null;
			}
		}
		
		return htmltext;
	}
	
	@Override
	public void onAttack(Npc npc, Player player, int damage, boolean isSummon)
	{
		final QuestState st2 = findRightState(npc);
		if (st2 != null)
		{
			final int cond = st2.getCond();
			final QuestState st = getQuestState(player, false);
			final int npcId = npc.getId();
			if ((npcId == _mob[2]) && (st == st2) && (cond == 17))
			{
				int quest0 = st.getInt("Quest0") + 1;
				if (quest0 == 1)
				{
					autoChat(npc, _text[16].replace("PLAYERNAME", player.getName()));
				}
				
				if (quest0 > 15)
				{
					quest0 = 1;
					autoChat(npc, _text[17].replace("PLAYERNAME", player.getName()));
					cancelQuestTimer("Mob_3 has despawned", npc, st2.getPlayer());
					st.set("Tab", "1");
					deleteSpawn(npc);
				}
				
				st.set("Quest0", Integer.toString(quest0));
			}
			else if ((npcId == _mob[1]) && (cond == 15) && ((st != st2) || player.isInParty()))
			{
				autoChat(npc, _text[5].replace("PLAYERNAME", player.getName()));
				cancelQuestTimer("Archon Hellisha has despawned", npc, st2.getPlayer());
				st2.set("spawned", "0");
				deleteSpawn(npc);
			}
		}
	}
	
	@Override
	public String onFirstTalk(Npc npc, Player player)
	{
		String htmltext = "";
		final QuestState st = getQuestState(player, false);
		final int npcId = npc.getId();
		if ((st != null) && (npcId == _npc[4]))
		{
			final int cond = st.getCond();
			if (cond == 17)
			{
				final QuestState st2 = findRightState(npc);
				if (st2 != null)
				{
					player.setLastQuestNpcObject(npc.getObjectId());
					final int tab = st.getInt("Tab");
					final int quest0 = st.getInt("Quest0");
					if (st == st2)
					{
						if (tab == 1)
						{
							if (quest0 == 0)
							{
								htmltext = "4-04.htm";
							}
							else if (quest0 == 1)
							{
								htmltext = "4-06.htm";
							}
						}
						else if (quest0 == 0)
						{
							htmltext = "4-01.htm";
						}
						else if (quest0 == 1)
						{
							htmltext = "4-03.htm";
						}
					}
					else if (tab == 1)
					{
						if (quest0 == 0)
						{
							htmltext = "4-05.htm";
						}
						else if (quest0 == 1)
						{
							htmltext = "4-07.htm";
						}
					}
					else if (quest0 == 0)
					{
						htmltext = "4-02.htm";
					}
				}
			}
			else if (cond == 18)
			{
				htmltext = "4-08.htm";
			}
		}
		
		if (htmltext.isEmpty())
		{
			npc.showChatWindow(player);
		}
		
		return htmltext;
	}
	
	@Override
	public void onKill(Npc npc, Player player, boolean isSummon)
	{
		final int npcId = npc.getId();
		QuestState st = getQuestState(player, false);
		for (int archonMinion = 21646; archonMinion < 21652; archonMinion++)
		{
			if (npcId == archonMinion)
			{
				final Party party = player.getParty();
				if (party != null)
				{
					final List<QuestState> partyQuestMembers = new ArrayList<>();
					for (Player player1 : party.getMembers())
					{
						final QuestState st1 = findQuest(player1);
						if ((st1 != null) && st1.isCond(15) && player1.isInsideRadius2D(player, PlayerConfig.ALT_PARTY_RANGE))
						{
							partyQuestMembers.add(st1);
						}
					}
					
					if (!partyQuestMembers.isEmpty())
					{
						final QuestState st2 = partyQuestMembers.get(getRandom(partyQuestMembers.size()));
						giveHalishaMark(st2);
					}
				}
				else
				{
					final QuestState st1 = findQuest(player);
					if ((st1 != null) && st1.isCond(15))
					{
						giveHalishaMark(st1);
					}
				}
				return;
			}
		}
		
		for (int element : ARCHON_HALISHA_NORM)
		{
			if (npcId == element)
			{
				final QuestState st1 = findQuest(player);
				if ((st1 != null) && st1.isCond(15))
				{
					// This is just a guess....not really sure what it actually says, if anything
					autoChat(npc, _text[4].replace("PLAYERNAME", st1.getPlayer().getName()));
					giveItems(player, _items[8], 1);
					takeItems(player, _items[3], -1);
					st1.setCond(16, true);
				}
				return;
			}
		}
		
		for (int guardianAngel = 27214; guardianAngel < 27217; guardianAngel++)
		{
			if (npcId == guardianAngel)
			{
				final QuestState st1 = findQuest(player);
				if ((st1 != null) && st1.isCond(6))
				{
					final int kills = st1.getInt("kills");
					if (kills < 9)
					{
						st1.set("kills", Integer.toString(kills + 1));
					}
					else
					{
						giveItems(player, _items[5], 1);
						st.setCond(7, true);
					}
				}
				return;
			}
		}
		
		if ((st != null) && (npcId != _mob[2]))
		{
			final QuestState st2 = findRightState(npc);
			if (st2 != null)
			{
				final int cond = st.getCond();
				if ((npcId == _mob[0]) && (cond == 8))
				{
					if (!player.isInParty() && (st == st2))
					{
						autoChat(npc, _text[12].replace("PLAYERNAME", player.getName()));
						giveItems(player, _items[6], 1);
						st.setCond(9, true);
					}
					
					cancelQuestTimer("Mob_1 has despawned", npc, st2.getPlayer());
					st2.set("spawned", "0");
					deleteSpawn(npc);
				}
				else if ((npcId == _mob[1]) && (cond == 15))
				{
					if (!player.isInParty())
					{
						if (st == st2)
						{
							autoChat(npc, _text[4].replace("PLAYERNAME", player.getName()));
							giveItems(player, _items[8], 1);
							takeItems(player, _items[3], -1);
							st.setCond(16, true);
						}
						else
						{
							autoChat(npc, _text[5].replace("PLAYERNAME", player.getName()));
						}
					}
					
					cancelQuestTimer("Archon Hellisha has despawned", npc, st2.getPlayer());
					st2.set("spawned", "0");
					deleteSpawn(npc);
				}
			}
		}
		else if (npcId == _mob[0])
		{
			st = findRightState(npc);
			if (st != null)
			{
				cancelQuestTimer("Mob_1 has despawned", npc, st.getPlayer());
				st.set("spawned", "0");
				deleteSpawn(npc);
			}
		}
		else if (npcId == _mob[1])
		{
			st = findRightState(npc);
			if (st != null)
			{
				cancelQuestTimer("Archon Hellisha has despawned", npc, st.getPlayer());
				st.set("spawned", "0");
				deleteSpawn(npc);
			}
		}
		else if (npcId == _mob[2])
		{
			st = findRightState(npc);
			if (st != null)
			{
				st.setCond(18, true);
				autoChat(npc, _text[13].replace("PLAYERNAME", player.getName()));
				st.set("Quest0", "0");
				cancelQuestTimer("Mob_2 has despawned", npc, player);
				deleteSpawn(npc);
			}
		}
	}
	
	@Override
	public void onSkillSee(Npc npc, Player player, Skill skill, List<WorldObject> targets, boolean isSummon)
	{
		if (SPAWN_LIST.containsKey(npc) && (SPAWN_LIST.get(npc) != player.getObjectId()))
		{
			final Player questPlayer = World.findObject(SPAWN_LIST.get(npc)).asPlayer();
			if (questPlayer == null)
			{
				return;
			}
			
			for (WorldObject obj : targets)
			{
				if ((obj == questPlayer) || (obj == npc))
				{
					final QuestState st2 = findRightState(npc);
					if (st2 == null)
					{
						return;
					}
					
					autoChat(npc, _text[5].replace("PLAYERNAME", player.getName()));
					cancelQuestTimer("Archon Hellisha has despawned", npc, st2.getPlayer());
					st2.set("spawned", "0");
					deleteSpawn(npc);
				}
			}
		}
	}
	
	@Override
	public String onTalk(Npc npc, Player player)
	{
		final QuestState st = getQuestState(player, true);
		String htmltext = getNoQuestMsg(player);
		final int npcId = npc.getId();
		if ((npcId == _npc[0]) && st.isCompleted())
		{
			htmltext = getAlreadyCompletedMsg(player);
		}
		else if (player.getPlayerClass().getId() == getPrevClass(player))
		{
			switch (st.getCond())
			{
				case 0:
				{
					if (npcId == _npc[0])
					{
						htmltext = "0-01.htm";
					}
					break;
				}
				case 1:
				{
					if (npcId == _npc[0])
					{
						htmltext = "0-04.htm";
					}
					else if (npcId == _npc[2])
					{
						htmltext = "2-01.htm";
					}
					break;
				}
				case 2:
				{
					if (npcId == _npc[2])
					{
						htmltext = "2-02.htm";
					}
					else if (npcId == _npc[1])
					{
						htmltext = "1-01.htm";
					}
					break;
				}
				case 3:
				{
					if ((npcId == _npc[1]) && hasQuestItems(player, _items[0]))
					{
						if ((_items[11] == 0) || hasQuestItems(player, _items[11]))
						{
							htmltext = "1-03.htm";
						}
						else
						{
							htmltext = "1-02.htm";
						}
					}
					break;
				}
				case 4:
				{
					if (npcId == _npc[1])
					{
						htmltext = "1-04.htm";
					}
					else if (npcId == _npc[2])
					{
						htmltext = "2-03.htm";
					}
					break;
				}
				case 5:
				{
					if (npcId == _npc[2])
					{
						htmltext = "2-04.htm";
					}
					else if (npcId == _npc[5])
					{
						htmltext = "5-01.htm";
					}
					break;
				}
				case 6:
				{
					if (npcId == _npc[5])
					{
						htmltext = "5-03.htm";
					}
					else if (npcId == _npc[6])
					{
						htmltext = "6-01.htm";
					}
					break;
				}
				case 7:
				{
					if (npcId == _npc[6])
					{
						htmltext = "6-02.htm";
					}
					break;
				}
				case 8:
				{
					if (npcId == _npc[6])
					{
						htmltext = "6-04.htm";
					}
					else if (npcId == _npc[7])
					{
						htmltext = "7-01.htm";
					}
					break;
				}
				case 9:
				{
					if (npcId == _npc[7])
					{
						htmltext = "7-05.htm";
					}
					break;
				}
				case 10:
				{
					if (npcId == _npc[7])
					{
						htmltext = "7-07.htm";
					}
					else if (npcId == _npc[3])
					{
						htmltext = "3-01.htm";
					}
					break;
				}
				case 11:
				case 12:
				{
					if (npcId == _npc[3])
					{
						if (hasQuestItems(player, _items[2]))
						{
							htmltext = "3-05.htm";
						}
						else
						{
							htmltext = "3-04.htm";
						}
					}
					break;
				}
				case 13:
				{
					if (npcId == _npc[3])
					{
						htmltext = "3-06.htm";
					}
					else if (npcId == _npc[8])
					{
						htmltext = "8-01.htm";
					}
					break;
				}
				case 14:
				{
					if (npcId == _npc[8])
					{
						htmltext = "8-03.htm";
					}
					else if (npcId == _npc[11])
					{
						htmltext = "11-01.htm";
					}
					break;
				}
				case 15:
				{
					if (npcId == _npc[11])
					{
						htmltext = "11-02.htm";
					}
					else if (npcId == _npc[9])
					{
						htmltext = "9-01.htm";
					}
					break;
				}
				case 16:
				{
					if (npcId == _npc[9])
					{
						htmltext = "9-02.htm";
					}
					break;
				}
				case 17:
				{
					if (npcId == _npc[9])
					{
						htmltext = "9-04.htm";
					}
					else if (npcId == _npc[10])
					{
						htmltext = "10-01.htm";
					}
					break;
				}
				case 18:
				{
					if (npcId == _npc[10])
					{
						htmltext = "10-05.htm";
					}
					break;
				}
				case 19:
				{
					if (npcId == _npc[10])
					{
						htmltext = "10-07.htm";
					}
					else if (npcId == _npc[0])
					{
						htmltext = "0-06.htm";
					}
					break;
				}
				case 20:
				{
					if (npcId == _npc[0])
					{
						if (player.getLevel() >= 76)
						{
							htmltext = "0-09.htm";
							
							st.exitQuest(false);
							addExpAndSp(player, 2299404, 0);
							giveAdena(player, 5000000, true);
							giveItems(player, 6622, 1); // XXX rewardItems?
							final int playerClass = getPlayerClass(player);
							final int prevClass = getPrevClass(player);
							player.setPlayerClass(playerClass);
							if (!player.isSubClassActive() && (player.getBaseClass() == prevClass))
							{
								player.setBaseClass(playerClass);
							}
							
							player.broadcastUserInfo();
							cast(npc, player, 4339, 1);
						}
						else
						{
							htmltext = "0-010.htm";
						}
					}
					break;
				}
			}
		}
		
		return htmltext;
	}
	
	private QuestState findQuest(Player player)
	{
		final QuestState st = getQuestState(player, false);
		if (st != null)
		{
			if (getId() == 68)
			{
				for (int q = 0; q < 2; q++)
				{
					if (player.getPlayerClass().getId() == QUEST_CLASSES[1][q])
					{
						return st;
					}
				}
			}
			else if (player.getPlayerClass().getId() == QUEST_CLASSES[getId() - 67][0])
			{
				return st;
			}
		}
		
		return null;
	}
	
	private void autoChat(Npc npc, String text)
	{
		npc.broadcastPacket(new NpcSay(npc.getObjectId(), ChatType.GENERAL, npc.getId(), text));
	}
	
	private void cast(Npc npc, Creature target, int skillId, int level)
	{
		target.broadcastSkillPacket(new MagicSkillUse(target, target, skillId, level, 6000, 1), target);
		target.broadcastSkillPacket(new MagicSkillUse(npc, npc, skillId, level, 6000, 1), npc);
	}
	
	private void addSpawn(QuestState st, Npc mob)
	{
		SPAWN_LIST.put(mob, st.getPlayer().getObjectId());
	}
	
	private static Npc findSpawn(Player player, Npc npc)
	{
		if (SPAWN_LIST.containsKey(npc) && (SPAWN_LIST.get(npc) == player.getObjectId()))
		{
			return npc;
		}
		
		return null;
	}
	
	private void deleteSpawn(Npc npc)
	{
		if (SPAWN_LIST.remove(npc) != null)
		{
			npc.deleteMe();
		}
	}
	
	private QuestState findRightState(Npc npc)
	{
		Player player = null;
		QuestState st = null;
		final Integer spawned = SPAWN_LIST.get(npc);
		if (spawned != null)
		{
			player = World.getPlayer(spawned);
			if (player != null)
			{
				st = player.getQuestState(getName());
			}
		}
		
		return st;
	}
	
	private int getPlayerClass(Player player)
	{
		if (player.getPlayerClass().getId() == 0x81)
		{
			return _classId[1];
		}
		
		return _classId[0];
	}
	
	private int getPrevClass(Player player)
	{
		if (player.getPlayerClass().getId() == 0x81)
		{
			if (_prevClass.length == 1)
			{
				return -1;
			}
			
			return _prevClass[1];
		}
		
		return _prevClass[0];
	}
	
	private void giveHalishaMark(QuestState st)
	{
		if (st.getInt("spawned") == 0)
		{
			final Player player = st.getPlayer();
			if (getQuestItemsCount(player, _items[3]) >= 700)
			{
				takeItems(player, _items[3], 20);
				final int xx = st.getPlayer().getX();
				final int yy = st.getPlayer().getY();
				final int zz = st.getPlayer().getZ();
				final Npc archon = addSpawn(_mob[1], xx, yy, zz, -1);
				addSpawn(st, archon);
				st.set("spawned", "1");
				startQuestTimer("Archon Hellisha has despawned", 600000, archon, player);
				autoChat(archon, _text[13].replace("PLAYERNAME", st.getPlayer().getName()));
				archon.asAttackable().addDamageHate(st.getPlayer(), 0, 99999);
				archon.getAI().setIntentionAttack(st.getPlayer());
			}
			else
			{
				giveItems(player, _items[3], getRandom(1, 4));
			}
		}
	}
}