/*
* 一、從封包轉成MonsterStatus的值:(範例都是以新版為主)
* X = 從封包知道他是第幾個MASK(舊的是倒著算,新的是正著算,因為新的把反向封包去掉了)
* 範例:(舊的0x800,MASK=2;新的MASK=0)
* MASK[0] [00 08 00 00]
* MASK[1] [00 04 00 00]
* MASK[2] [00 02 00 00]
* Y = 從封包找到你要的值例如:0x800[00 08 00 00],用小算盤先到16進制輸入800,然後按Rsh再按1,再按等於,然後一直按到變一為止,按等於的次數就是我們要的值
* (其實也可以轉成十進制去看他是2的幾次方,次方數就是Y)或 Y = (Math.log(0x800) / Math.log(2))
* MonsterStatus的值 = (31 - Y) + (X * 32)
*
* 二、從MonsterStatus的值轉成封包:(範例都是以新版為主)
* 用小算盤:拿37來當範例,輸入37 Mod 32,就會顯示 5,然後 31 - 5 顯示 26 ,再按1 Lsh 26就是 67108864(0x4000000),再來37 / 32,就會顯示 1
* 轉成封包就是:
* MASK[0] [00 00 00 00]
* MASK[1] [00 00 00 04]
* MASK[2] [00 00 00 00]
*
* 也可以用公式: 1 << (31 - (X % 32))
*
*※有寫完成的就代表已經確認過的
*/
package client;
import handling.Buffstat;
import java.io.Serializable;
/**
*
* @author o黯淡o
*/
public enum MonsterStatus implements Serializable, Buffstat {
// =========== MASK[0]
//物攻
WATK(0),
//物防
WDEF(1),
//魔攻
MATK(2),
//魔防
MDEF(3),
//命中
ACC(4),
//迴避
AVOID(5),
//速度[完成]
SPEED(6),
//暈眩
STUN(7),
//結冰、麻痺
FREEZE(8),
//中毒[完成]
POISON(9),
//封印、沉默
SEAL(10),
//黑暗
DARKNESS(11),
//物攻提升
WEAPON_ATTACK_UP(12),
//魔攻提升
MAGIC_ATTACK_UP(13),
//物防提升
WEAPON_DEFENSE_UP(14),
//魔防提升
MAGIC_DEFENSE_UP(15),
//死亡
DOOM(16),
//影網
SHADOW_WEB(17),
//攻擊免疫
WEAPON_IMMUNITY(18),
//魔法免疫
MAGIC_IMMUNITY(19),
//挑釁
SHOWDOWN(20),
//免疫傷害
DAMAGE_IMMUNITY(21),
//忍者伏擊
NINJA_AMBUSH(22),
//
DAMAGED_ELEM_ATTR(23),
//武器涂毒
VENOMOUS_WEAPON(24),
//致盲
BLIND(25),
//技能封印
SEAL_SKILL(26),
//燒毀
BURNED(27),
//心靈控制
HYPNOTIZE(28),
//反射物攻
WEAPON_DAMAGE_REFLECT(29),
//反射魔攻
MAGIC_DAMAGE_REFLECT(30),
//關閉
DISABLE(31),
// =========== MASK[1]
//痛苦提升
RISE_TOSS(32),
//抵銷
NEUTRALISE(33, true),
//弱點
IMPRINT(34, true),
//怪物炸彈
MONSTER_BOMB(35),
//魔法無效
MAGIC_CRASH(36),
//恢復攻擊
HEAL_DAMAGE(37),
MBS38(38),
MBS39(39),
MBS40(40),
MBS41(41),
MBS42(42),
MBS43(43),
MBS44(44),
//另一個咬擊[178-完成]
ANOTHER_BITE(45),
MBS46(46),
//三角進攻
TRIANGULATION(47),
//減益爆炸
STING_EXPLOSION(48),
MBS49(49),
MBS50(50),
MBS51(51),
MBS52(52),
MBS53(53),
MBS54(54),
MBS55(55),
MBS56(56, true),
MBS57(57),
MBS58(58, true),
MBS59(59),
//持續扣血 - 破滅之輪[178-完成]
BLEED(60, true),
MBS61(61, true),
MBS62(62, true),
MBS63(63, true),
MBS64(64, true),
// =========== MASK[2]
MBS65(65, true),
MBS66(66, true),
//召喚怪物
SUMMON(67, true),
MBS68(68, true),
MBS69(69, true),
MBS70(70, true),
MBS71(71, true),
MBS72(72, true),
;
static final long serialVersionUID = 0L;
private final int i;
private final int position;
private final boolean end;
private final int bitNumber;
private MonsterStatus(int i) {
this.i = 1 << (31 - (i % 32)); // 如果要變舊的,就把減31去掉,詳細請參考頂端說明
this.position = (int) Math.floor(i / 32);
this.end = false;
this.bitNumber = i;
}
private MonsterStatus(int i, boolean end) {
this.i = 1 << (31 - (i % 32)); // 如果要變舊的,就把減31去掉,詳細請參考頂端說明
this.position = (int) Math.floor(i / 32);
this.end = end;
this.bitNumber = i;
}
@Override
public int getPosition() {
return position;
}
public boolean isEmpty() {
return end;
}
public int getBitNumber() {
return bitNumber;
}
@Override
public int getValue() {
return i;
}
public static final MapleDisease getLinkedDisease(final MonsterStatus skill) {
switch (skill) {
case STUN:
case SHADOW_WEB:
return MapleDisease.STUN;
case POISON:
case VENOMOUS_WEAPON:
return MapleDisease.POISON;
case SEAL:
case MAGIC_CRASH:
return MapleDisease.SEAL;
case FREEZE:
return MapleDisease.FREEZE;
case DARKNESS:
return MapleDisease.DARKNESS;
case SPEED:
return MapleDisease.SLOW;
}
return null;
}
}