package module.character;
import java.util.HashSet;
import java.util.concurrent.ConcurrentHashMap;
import module.character.api.ICharacter;
import module.character.api.IntPair;
import module.character.constants.CAttribute;
import module.character.constants.CAttribute.attribute;
import module.character.constants.CSpecialStatus;
import module.character.constants.CSpecialStatus.specialStatus;
import module.character.constants.CStatus.status;
import module.item.api.IEquipment;
import module.server.PlayerServer;
import module.utility.NpcActionUtil;
import module.utility.NpcBattleActionUtil;
public abstract class AbstractCharacter implements ICharacter{
/**
*
*/
private static final long serialVersionUID = -4972134458071665612L;
protected ConcurrentHashMap<attribute, IntPair> attributeMap = null;
private ConcurrentHashMap<specialStatus, Integer> specialStatusMap = null;
protected ConcurrentHashMap<status, Integer> statusMap = null;
protected ConcurrentHashMap<IEquipment.EquipType, IEquipment> equipMap = null;
protected HashSet<specialStatus> resistSpecialStatusSet = null;
protected String[] bodyPartList = null;
private int level = 1;
private boolean hostile = true;
protected int timeCount = 0;
protected int updateCount = 0;
private String chiName = null;
private String engName = null;
private String description = null;
private Group myGroup = null;
public AbstractCharacter(String chiName, String engName) {
this.chiName = chiName;
this.engName = engName;
attributeMap = new ConcurrentHashMap<attribute, IntPair>();
addAttribute(attribute.HP, 50);
specialStatusMap = new ConcurrentHashMap<specialStatus, Integer>();
statusMap = new ConcurrentHashMap<status, Integer>();
resistSpecialStatusSet = new HashSet<specialStatus>();
// default character body attribute
statusMap.put(status.SPEED, 4000);
statusMap.put(status.STRENGTH, 25);
statusMap.put(status.CONSTITUTION, 5);
equipMap = new ConcurrentHashMap<IEquipment.EquipType, IEquipment>();
}
@Override
public void addAttribute(attribute atr, int MaxValue) {
attributeMap.put(atr, new IntPair(MaxValue, MaxValue));
}
@Override
public ConcurrentHashMap<attribute, IntPair> getAttributeMap() {
return attributeMap;
}
@Override
public String getChiName() {
return chiName;
}
@Override
public int getCurrentAttribute(attribute atr) {
return attributeMap.get(atr).getCurrent();
}
@Override
public String getEngName() {
return engName;
}
@Override
public int getMaxAttribute(attribute atr) {
return attributeMap.get(atr).getMax();
}
@Override
public Group getMyGroup() {
return myGroup;
}
@Override
public int getSpecialStatus(specialStatus ss) {
return specialStatusMap.get(ss);
}
@Override
public ConcurrentHashMap<specialStatus, Integer> getSpecialStatusMap() {
return specialStatusMap;
}
@Override
public int getStatus(status s) {
return statusMap.get(s);
}
@Override
public ConcurrentHashMap<status, Integer> getStatusMap() {
return statusMap;
}
@Override
public void removeAttribute(attribute atr) {
attributeMap.remove(atr);
}
@Override
public void setAttributeMap(ConcurrentHashMap<attribute, IntPair> map) {
this.attributeMap = map;
}
@Override
public void setChiName(String name) {
this.chiName = name;
}
@Override
public void setCurrentAttribute(attribute atr, int value) {
attributeMap.get(atr).setCurrent(value);
}
@Override
public void setEngName(String name) {
this.engName = name;
}
@Override
public void setMaxAttribute(attribute atr, int value) {
attributeMap.get(atr).setMax(value);
}
@Override
public void setMyGroup(Group g) {
this.myGroup = g;
}
@Override
public void setSpecialStatus(specialStatus ss, int time) {
this.specialStatusMap.put(ss, time);
}
@Override
public void setSpecialStatusMap(
ConcurrentHashMap<specialStatus, Integer> map) {
this.specialStatusMap = map;
}
@Override
public void setStatus(status s, int value) {
this.statusMap.put(s, value);
}
@Override
public void setStatusMap(ConcurrentHashMap<status, Integer> map) {
this.statusMap = map;
}
@Override
public boolean isDown() {
if (attributeMap.get(attribute.HP).getCurrent() <= 0)
return true;
return false;
}
@Override
public String showStatus() {
StringBuilder buffer = new StringBuilder();
buffer.append(String.format("%s/%s ", this.chiName, this.engName));
buffer.append(CAttribute.displayAttribute(this));
// TODO: add the show special status method
if (this.specialStatusMap.size() > 0){
buffer.append(" " + CSpecialStatus.displaySpecialStatus(this));
}
return buffer.toString();
}
@Override
public void normalAction() {
// TODO: define the normal behavior
this.timeCount++;
if (timeCount % 3 == 0){
if (PlayerServer.getRandom().nextBoolean())
NpcActionUtil.randomGet(this);
}
if ((timeCount + 1) % 3 == 0){
if (PlayerServer.getRandom().nextBoolean())
NpcActionUtil.randomDrop(this);
}
if (timeCount == 10) {
int ddd = PlayerServer.getRandom().nextInt(10);
if (ddd < 7) NpcActionUtil.randomMove(this.getMyGroup());
timeCount = 0;
}
// auto attack player group
if (this.getHostile()){
int ddd = PlayerServer.getRandom().nextInt(10);
if (ddd < 7) NpcActionUtil.attackRandomPlayerGroup(this);
}
}
@Override
public void updateTime() {
if (this.updateCount < 5) {
this.updateCount++;
} else {
this.updateCount = 0;
// TODO: define the recover method
IntPair pair = this.attributeMap.get(attribute.HP);
int value = pair.getCurrent() + (int) (pair.getMax() * 0.02) + 1;
if (value > pair.getMax())
value = pair.getMax();
pair.setCurrent(value);
}
// TODO: define special status recover mechanism
if (this.specialStatusMap.size() > 0){
CSpecialStatus.updateSpecialStatus(this, 1);
}
}
@Override
public void onTalk(PlayerGroup g){
g.getAtRoom().informRoom(String.format("%s���խn�M%s��͡A��%s�ݨӤ��Q�z�L�C\n",
g.list.get(0).charList.get(0).getChiName(), this.getChiName(), this.getChiName()));
}
@Override
public int getLevel(){
return this.level;
}
@Override
public void setLevel(int level){
this.level = level;
}
@Override
public void setEquipment(ConcurrentHashMap<IEquipment.EquipType, IEquipment> map){
this.equipMap = map;
}
@Override
public ConcurrentHashMap<IEquipment.EquipType, IEquipment> getEquipment(){
return this.equipMap;
}
@Override
public void looting(){
// default drop nothing
}
@Override
public void setHostile(boolean value){
this.hostile = value;
}
@Override
public boolean getHostile(){
return hostile;
}
@Override
public void setDesc(String description) {
this.description = description;
}
@Override
public String getDesc() {
return this.description;
}
@Override
public boolean battleAction(GroupList enemyGroup) {
NpcBattleActionUtil.randomAttack(this, enemyGroup);
return true;
}
@Override
public void doEventWhenGroupDown(PlayerGroup pg){
// do nothing default
return;
}
@Override
public String getRandomBodyPart(){
int choose = PlayerServer.getRandom().nextInt(this.bodyPartList.length);
return this.bodyPartList[choose];
}
@Override
public void setSpecialStatusResistance(CSpecialStatus.specialStatus ss){
this.resistSpecialStatusSet.add(ss);
}
@Override
public boolean removeSpecialStatusResistance(CSpecialStatus.specialStatus ss){
return this.removeSpecialStatusResistance(ss);
}
@Override
public boolean resistSpecialStatus(CSpecialStatus.specialStatus ss){
return this.resistSpecialStatusSet.contains(ss);
}
}