package org.reunionemu.jreunion.game.items.equipment;
import org.reunionemu.jcommon.ParsedItem;
import org.reunionemu.jreunion.game.Item;
import org.reunionemu.jreunion.game.Player;
import org.reunionemu.jreunion.game.PlayerItem;
import org.reunionemu.jreunion.server.Reference;
import org.reunionemu.jreunion.server.Server;
import org.reunionemu.jreunion.server.World;
/**
* @author Aidamina
* @license http://reunion.googlecode.com/svn/trunk/license.txt
*/
public abstract class Weapon extends PlayerItem {
private int speed; // 0 - Very Fast; 1 - Fast; 2 - Normal; 3 - Slow;
// 4 - Very Slow
private float minDamge;
private float maxDamage;
private int position; // -1 - Empty; 3 - Shoulder Mount; 9 - Weapon
private int race; // -1 - Common; 0 - Bulkan; 1 - Kailipton; 2 - Aidia;
// 3 - Human; 4 - Hybrider
private int handed; // 1 - One handed; 2 - Two handed
private float magicDmg; // value in %
public Weapon(int id) {
super(id);
loadFromReference(id);
}
/****** Handle the consumn of the weapon, if exists.
* @return TODO******/
public abstract boolean use(Player player);
public int getHanded() {
return handed;
}
public float getMaxDamage(Item<?> item) {
int gradeLevel = item.getGradeLevel();
if(gradeLevel == 0)
return maxDamage;
if(getLevel() < 181){
//return (int)(maxDamage * ((((.12f * gradeLevel) + ((gradeLevel * gradeLevel-1))))+1));
return maxDamage * ((gradeLevel==1?0.12f:0)+(gradeLevel==2?0.26f:0)+
(gradeLevel==3?0.44f:0)+(gradeLevel==4?0.68f:0)+
(gradeLevel==5?1f:0)+1);
} else {
return maxDamage * ((gradeLevel * 0.1f)+1);
}
}
public float getMinDamage(Item<?> item) {
int gradeLevel = item.getGradeLevel();
if(gradeLevel == 0)
return minDamge;
if(getLevel() < 181){
//return (int)(minDamge * ((((.12f * gradeLevel) + ((gradeLevel * gradeLevel-1) + 2)))+1));
return minDamge * ((gradeLevel==1?0.12f:0)+(gradeLevel==2?0.26f:0)+
(gradeLevel==3?0.44f:0)+(gradeLevel==4?0.68f:0)+
(gradeLevel==5?1f:0)+1);
} else {
return minDamge * ((gradeLevel * 0.1f)+1);
}
}
public int getPosition() {
return position;
}
public int getRace() {
return race;
}
public int getSpeed() {
return speed;
}
public float getMagicDmg(Item<?> item) {
int gradeLevel = item.getGradeLevel();
if(gradeLevel == 0)
return magicDmg;
if(getLevel() < 181){
return magicDmg * ((gradeLevel==1?0.12f:0)+(gradeLevel==2?0.26f:0)+
(gradeLevel==3?0.44f:0)+(gradeLevel==4?0.68f:0)+
(gradeLevel==5?1f:0)+1);
} else {
return magicDmg * ((gradeLevel * 0.1f)+1);
}
}
@Override
public void loadFromReference(int id) {
super.loadFromReference(id);
ParsedItem item = Reference.getInstance().getItemReference()
.getItemById(id);
if (item == null) {
// cant find Item in the reference continue to load defaults:
setLevel(1);
setHanded(2);
setSpeed(4);
setMinDamage(1);
setMaxDamage(1);
setReqStr(0);
setReqInt(0);
setReqDex(0);
setPosition(9);
setRace(-1);
setMagicDmg(0);
} else {
if (item.checkMembers(new String[] { "Level" })) {
// use member from file
setLevel(Integer.parseInt(item.getMemberValue("Level")));
} else {
// use default
setLevel(1);
}
if (item.checkMembers(new String[] { "Handed" })) {
// use member from file
setHanded(Integer.parseInt(item.getMemberValue("Handed")));
} else {
// use default
setHanded(2);
}
if (item.checkMembers(new String[] { "Speed" })) {
// use member from file
setSpeed(Integer.parseInt(item.getMemberValue("Speed")));
} else {
// use default
setSpeed(4);
}
if (item.checkMembers(new String[] { "MinDmg" })) {
// use member from file
setMinDamage(Integer.parseInt(item.getMemberValue("MinDmg")));
} else {
// use default
setMinDamage(1);
}
if (item.checkMembers(new String[] { "MaxDmg" })) {
// use member from file
setMaxDamage(Integer.parseInt(item.getMemberValue("MaxDmg")));
} else {
// use default
setMaxDamage(1);
}
if (item.checkMembers(new String[] { "ReqStr" })) {
// use member from file
setReqStr(Integer.parseInt(item.getMemberValue("ReqStr")));
} else {
// use default
setReqStr(0);
}
if (item.checkMembers(new String[] { "ReqInt" })) {
// use member from file
setReqInt(Integer.parseInt(item.getMemberValue("ReqInt")));
} else {
// use default
setReqInt(0);
}
if (item.checkMembers(new String[] { "ReqDex" })) {
// use member from file
setReqDex(Integer.parseInt(item.getMemberValue("ReqDex")));
} else {
// use default
setReqDex(0);
}
if (item.checkMembers(new String[] { "Position" })) {
// use member from file
setPosition(Integer.parseInt(item.getMemberValue("Position")));
} else {
// use default
setPosition(9);
}
if (item.checkMembers(new String[] { "Race" })) {
// use member from file
setRace(Integer.parseInt(item.getMemberValue("Race")));
} else {
// use default
setRace(-1);
}
if (item.checkMembers(new String[] { "MagicDmg" })) {
// use member from file
setMagicDmg(Float.parseFloat(item.getMemberValue("MagicDmg")));
} else {
// use default
setMagicDmg(0);
}
}
}
public void setHanded(int handed) {
if (handed > 1) {
handed = 2;
} else {
handed = 1;
}
}
public void setMaxDamage(float maxDamage) {
this.maxDamage = maxDamage;
}
public void setMinDamage(float minDamge) {
this.minDamge = minDamge;
}
public void setPosition(int position) {
this.position = position;
}
public void setRace(int race) {
this.race = race;
}
public void setSpeed(int speed) {
this.speed = speed;
}
public void setMagicDmg(float magicDmg) {
this.magicDmg = magicDmg;
}
public long getDamage(Item<?> item){
return (long)(getMinDamage(item) + ((getMaxDamage(item)-getMinDamage(item))*Server.getRand().nextDouble()));
}
public float getCritical(){
return (float)Server.getRand().nextFloat() < World.serverSetings.getCriticalChance() ?
World.serverSetings.getCriticalMultiplier() : 0;
}
}