/*
* 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 .
*/
package net.sf.l2j.gameserver.model;
import java.util.List;
import javolution.util.FastTable;
import net.sf.l2j.gameserver.model.actor.instance.L2PcInstance;
/**
* This class ...
*
* @version $Revision: 1.2.4.2 $ $Date: 2005/03/27 15:29:33 $
*/
@SuppressWarnings("unchecked")
public final class L2EnchantSkillLearn
{
private final int _id;
private final int _baseLvl;
private List[] _enchantDetails = new List[0];
public L2EnchantSkillLearn(int id, int baseLvl)
{
_id = id;
_baseLvl = baseLvl;
}
/**
* @return Returns the id.
*/
public int getId()
{
return _id;
}
/**
* @return Returns the minLevel.
*/
public int getBaseLevel()
{
return _baseLvl;
}
public void addEnchantDetail(EnchantSkillDetail esd)
{
int enchantType = L2EnchantSkillLearn.getEnchantType(esd.getLevel());
if (enchantType < 0)
{
throw new IllegalArgumentException("Skill enchantments should have level higher then 100");
}
else
{
if (enchantType >= _enchantDetails.length)
{
List[] newArray = new List[enchantType+1];
System.arraycopy(_enchantDetails, 0, newArray, 0, _enchantDetails.length);
_enchantDetails = newArray;
_enchantDetails[enchantType] = new FastTable();
}
int index = L2EnchantSkillLearn.getEnchantIndex(esd.getLevel());
_enchantDetails[enchantType].add(index, esd);
}
}
public List[] getEnchantRoutes()
{
return _enchantDetails;
}
public EnchantSkillDetail getEnchantSkillDetail(int level)
{
int enchantType = L2EnchantSkillLearn.getEnchantType(level);
if (enchantType < 0 || enchantType >= _enchantDetails.length)
{
return null;
}
int index = L2EnchantSkillLearn.getEnchantIndex(level);
if (index < 0 || index >= _enchantDetails[enchantType].size())
{
return null;
}
return _enchantDetails[enchantType].get(index);
}
public static int getEnchantIndex(int level)
{
return (level % 100) - 1;
}
public static int getEnchantType(int level)
{
return ((level - 1) / 100) - 1;
}
public static class EnchantSkillDetail
{
// not needed, just for easier debug
private final String _name;
private final int _level;
private final int _spCost;
private final int _minSkillLevel;
private final int _exp;
private final byte _rate76;
private final byte _rate77;
private final byte _rate78;
public EnchantSkillDetail(int lvl, int minSkillLvl, String name, int cost, int exp, byte rate76, byte rate77, byte rate78)
{
_level = lvl;
_minSkillLevel = minSkillLvl;
_name = name.intern();
_spCost = cost;
_exp = exp;
_rate76 = rate76;
_rate77 = rate77;
_rate78 = rate78;
}
/**
* @return Returns the level.
*/
public int getLevel()
{
return _level;
}
/**
* @return Returns the minSkillLevel.
*/
public int getMinSkillLevel()
{
return _minSkillLevel;
}
/**
* @return Returns the name.
*/
public String getName()
{
return _name;
}
/**
* @return Returns the spCost.
*/
public int getSpCost()
{
return _spCost;
}
public int getExp()
{
return _exp;
}
public byte getRate(L2PcInstance ply)
{
byte result;
switch (ply.getLevel())
{
case 76:
result = _rate76;
break;
case 77:
result = _rate77;
break;
case 78:
result = _rate78;
break;
default:
result = _rate78;
break;
}
return result;
}
}
}