package module.character.constants;
import java.util.Map;
import java.util.Map.Entry;
import java.util.concurrent.ConcurrentHashMap;
import module.character.PlayerGroup;
import module.character.api.ICharacter;
import module.command.CommandServer;
public class CSpecialStatus {
public static enum specialStatus {
POISION("���r"), BLIND("����");
private String chineseName;
specialStatus(String name) {
this.chineseName = name;
}
}
private static String getName(specialStatus atr) {
return atr.chineseName;
}
public static String displaySingleSpecialStatus(specialStatus atr, int value) {
return String.format("%s: %d��|", getName(atr), value);
}
public static String displaySpecialStatus(ICharacter ch) {
ConcurrentHashMap<specialStatus, Integer> map = ch.getSpecialStatusMap();
String result = "|";
if (map.get(specialStatus.POISION) != null)
result += displaySingleSpecialStatus(specialStatus.POISION, map
.get(specialStatus.POISION));
if (map.get(specialStatus.BLIND) != null)
result += displaySingleSpecialStatus(specialStatus.BLIND, map
.get(specialStatus.BLIND));
return result;
}
// update special status by hours
public static void updateSpecialStatus(ICharacter ch, int timePass) {
ConcurrentHashMap<specialStatus, Integer> map = ch.getSpecialStatusMap();
int timeLeft;
boolean doneFlag = false;
// add the doneFlag to prevent the situation when an object is deleted
// but the entry still tries to get the next object
for (Entry<specialStatus, Integer> entry : map.entrySet()) {
timeLeft = entry.getValue();
timeLeft -= timePass;
entry.setValue(timeLeft);
}
while (!doneFlag) {
doneFlag = true;
for (Entry<specialStatus, Integer> entry : map.entrySet()) {
if (entry.getValue() <= 0){
removeSpecialStatus(ch, entry.getKey());
doneFlag = false;
break;
}
}
}
}
// remove a special status from a character
public static void removeSpecialStatus(ICharacter ch, specialStatus ss) {
ch.getSpecialStatusMap().remove(ss);
ch.getMyGroup().getAtRoom().informRoom(String.format("%s���A�q%s���W�����F�C\n",
ss.chineseName, ch.getChiName()));
}
// set specialstatus and update
public static void setSpecialStatus(ICharacter c, specialStatus ss, int time){
String output;
if (c.resistSpecialStatus(ss)){
output = c.getChiName() + "�ݰ_�ӵ��@�����v�T�C";
} else {
output = c.getChiName() + ss.chineseName + "�F!";
c.setSpecialStatus(ss, time);
}
c.getMyGroup().getAtRoom().informRoom(output + "\n");
if (c.getMyGroup() instanceof PlayerGroup){
PlayerGroup pg = (PlayerGroup) c.getMyGroup();
String out = "status:" + pg.showGroupStatus();
CommandServer.informGroup(pg, out);
}
}
public static double judgeHitRatioEffected(double hitRatio
, Map<specialStatus, Integer> specialStatusMap){
double result = hitRatio;
if (specialStatusMap.get(specialStatus.BLIND) != null) result *= 0.3;
return result;
}
public static double judgeDodgeRatioEffected(double dodgeRatio
, Map<specialStatus, Integer> specialStatusMap){
double result = dodgeRatio;
if (specialStatusMap.get(specialStatus.BLIND) != null) result *= 0.3;
return result;
}
}