Two handed bonus mode additions and various skill fixes.

Contributed by gamelike85.
This commit is contained in:
MobiusDevelopment
2019-12-23 08:10:12 +00:00
parent 41d9f654cd
commit 1e93b99aec
170 changed files with 12868 additions and 1259 deletions

View File

@@ -29,7 +29,7 @@ import org.l2jmobius.gameserver.model.skills.Skill;
import org.l2jmobius.gameserver.model.stats.Stats;
/**
* @author Sdw
* @author Sdw, Mobius
*/
public class TwoHandedBluntBonus extends AbstractEffect
{
@@ -37,18 +37,72 @@ public class TwoHandedBluntBonus extends AbstractEffect
private static final Condition _slotCondition = new ConditionUsingSlotType(Item.SLOT_LR_HAND);
private final double _pAtkAmount;
private final StatModifierType _pAtkmode;
private final StatModifierType _pAtkMode;
private final double _accuracyAmount;
private final StatModifierType _accuracyMode;
private final double _mAtkAmount;
private final StatModifierType _mAtkMode;
private final double _pAtkSpeedAmount;
private final StatModifierType _pAtkSpeedMode;
private final double _mAtkSpeedAmount;
private final StatModifierType _mAtkSpeedMode;
private final double _pAccuracyAmount;
private final StatModifierType _pAccuracyMode;
private final double _mAccuracyAmount;
private final StatModifierType _mAccuracyMode;
private final double _pCritRateAmount;
private final StatModifierType _pCritRateMode;
private final double _mCritRateAmount;
private final StatModifierType _mCritRateMode;
private final double _pCritDamageAmount;
private final StatModifierType _pCritDamageMode;
private final double _mCritDamageAmount;
private final StatModifierType _mCritDamageMode;
private final double _speedAmount;
private final StatModifierType _speedMode;
public TwoHandedBluntBonus(StatsSet params)
{
_pAtkAmount = params.getDouble("pAtkAmount", 0);
_pAtkmode = params.getEnum("pAtkmode", StatModifierType.class, StatModifierType.DIFF);
_pAtkMode = params.getEnum("pAtkMode", StatModifierType.class, StatModifierType.DIFF);
_accuracyAmount = params.getDouble("accuracyAmount", 0);
_accuracyMode = params.getEnum("accuracyMode", StatModifierType.class, StatModifierType.DIFF);
_mAtkAmount = params.getDouble("mAtkAmount", 0);
_mAtkMode = params.getEnum("mAtkMode", StatModifierType.class, StatModifierType.DIFF);
_pAtkSpeedAmount = params.getDouble("pAtkSpeedAmount", 0);
_pAtkSpeedMode = params.getEnum("pAtkSpeedMode", StatModifierType.class, StatModifierType.DIFF);
_mAtkSpeedAmount = params.getDouble("mAtkSpeedAmount", 0);
_mAtkSpeedMode = params.getEnum("mAtkSpeedMode", StatModifierType.class, StatModifierType.DIFF);
_pAccuracyAmount = params.getDouble("pAccuracyAmount", 0);
_pAccuracyMode = params.getEnum("pAccuracyMode", StatModifierType.class, StatModifierType.DIFF);
_mAccuracyAmount = params.getDouble("mAccuracyAmount", 0);
_mAccuracyMode = params.getEnum("mAccuracyMode", StatModifierType.class, StatModifierType.DIFF);
_pCritRateAmount = params.getDouble("pCritRateAmount", 0);
_pCritRateMode = params.getEnum("pCritRateMode", StatModifierType.class, StatModifierType.DIFF);
_mCritRateAmount = params.getDouble("mCritRateAmount", 0);
_mCritRateMode = params.getEnum("mCritRateMode", StatModifierType.class, StatModifierType.DIFF);
_pCritDamageAmount = params.getDouble("pCritDamageAmount", 0);
_pCritDamageMode = params.getEnum("pCritDamageMode", StatModifierType.class, StatModifierType.DIFF);
_mCritDamageAmount = params.getDouble("mCritDamageAmount", 0);
_mCritDamageMode = params.getEnum("mCritDamageMode", StatModifierType.class, StatModifierType.DIFF);
_speedAmount = params.getDouble("speedAmount", 0);
_speedMode = params.getEnum("speedMode", StatModifierType.class, StatModifierType.DIFF);
}
@Override
@@ -56,7 +110,7 @@ public class TwoHandedBluntBonus extends AbstractEffect
{
if (_weaponTypeCondition.test(effected, effected, skill) && _slotCondition.test(effected, effected, skill))
{
switch (_pAtkmode)
switch (_pAtkMode)
{
case DIFF:
{
@@ -70,16 +124,268 @@ public class TwoHandedBluntBonus extends AbstractEffect
}
}
switch (_accuracyMode)
switch (_mAtkMode)
{
case DIFF:
{
effected.getStat().mergeAdd(Stats.ACCURACY_COMBAT, _accuracyAmount);
effected.getStat().mergeAdd(Stats.MAGIC_ATTACK, _mAtkAmount);
break;
}
case PER:
{
effected.getStat().mergeMul(Stats.ACCURACY_COMBAT, (_accuracyAmount / 100) + 1);
effected.getStat().mergeMul(Stats.MAGIC_ATTACK, (_mAtkAmount / 100) + 1);
break;
}
}
switch (_pAtkSpeedMode)
{
case DIFF:
{
effected.getStat().mergeAdd(Stats.PHYSICAL_ATTACK_SPEED, _pAtkSpeedAmount);
break;
}
case PER:
{
effected.getStat().mergeMul(Stats.PHYSICAL_ATTACK_SPEED, (_pAtkSpeedAmount / 100) + 1);
break;
}
}
switch (_mAtkSpeedMode)
{
case DIFF:
{
effected.getStat().mergeAdd(Stats.MAGIC_ATTACK_SPEED, _mAtkSpeedAmount);
break;
}
case PER:
{
effected.getStat().mergeMul(Stats.MAGIC_ATTACK_SPEED, (_mAtkSpeedAmount / 100) + 1);
break;
}
}
switch (_mAtkMode)
{
case DIFF:
{
effected.getStat().mergeAdd(Stats.MAGIC_ATTACK, _mAtkAmount);
break;
}
case PER:
{
effected.getStat().mergeMul(Stats.MAGIC_ATTACK, (_mAtkAmount / 100) + 1);
break;
}
}
switch (_pAtkSpeedMode)
{
case DIFF:
{
effected.getStat().mergeAdd(Stats.PHYSICAL_ATTACK_SPEED, _pAtkSpeedAmount);
break;
}
case PER:
{
effected.getStat().mergeMul(Stats.PHYSICAL_ATTACK_SPEED, (_pAtkSpeedAmount / 100) + 1);
break;
}
}
switch (_mAtkSpeedMode)
{
case DIFF:
{
effected.getStat().mergeAdd(Stats.MAGIC_ATTACK_SPEED, _mAtkSpeedAmount);
break;
}
case PER:
{
effected.getStat().mergeMul(Stats.MAGIC_ATTACK_SPEED, (_mAtkSpeedAmount / 100) + 1);
break;
}
}
switch (_pAccuracyMode)
{
case DIFF:
{
effected.getStat().mergeAdd(Stats.ACCURACY_COMBAT, _pAccuracyAmount);
break;
}
case PER:
{
effected.getStat().mergeMul(Stats.ACCURACY_COMBAT, (_pAccuracyAmount / 100) + 1);
break;
}
}
switch (_mAccuracyMode)
{
case DIFF:
{
effected.getStat().mergeAdd(Stats.ACCURACY_MAGIC, _mAccuracyAmount);
break;
}
case PER:
{
effected.getStat().mergeMul(Stats.ACCURACY_MAGIC, (_mAccuracyAmount / 100) + 1);
break;
}
}
switch (_pCritRateMode)
{
case DIFF:
{
effected.getStat().mergeAdd(Stats.CRITICAL_RATE, _pCritRateAmount);
break;
}
case PER:
{
effected.getStat().mergeMul(Stats.CRITICAL_RATE, (_pCritRateAmount / 100) + 1);
break;
}
}
switch (_mCritRateMode)
{
case DIFF:
{
effected.getStat().mergeAdd(Stats.MAGIC_CRITICAL_RATE, _mCritRateAmount);
break;
}
case PER:
{
effected.getStat().mergeMul(Stats.MAGIC_CRITICAL_RATE, (_mCritRateAmount / 100) + 1);
break;
}
}
switch (_pCritDamageMode)
{
case DIFF:
{
effected.getStat().mergeAdd(Stats.CRITICAL_DAMAGE_ADD, _pCritDamageAmount);
break;
}
case PER:
{
effected.getStat().mergeMul(Stats.CRITICAL_DAMAGE, (_pCritDamageAmount / 100) + 1);
break;
}
}
switch (_mCritDamageMode)
{
case DIFF:
{
effected.getStat().mergeAdd(Stats.MAGIC_CRITICAL_DAMAGE_ADD, _mCritDamageAmount);
break;
}
case PER:
{
effected.getStat().mergeMul(Stats.MAGIC_CRITICAL_DAMAGE, (_mCritDamageAmount / 100) + 1);
break;
}
}
switch (_speedMode)
{
case DIFF:
{
effected.getStat().mergeAdd(Stats.MOVE_SPEED, _speedAmount);
break;
}
case PER:
{
effected.getStat().mergeMul(Stats.MOVE_SPEED, (_speedAmount / 100) + 1);
break;
}
}
switch (_mAccuracyMode)
{
case DIFF:
{
effected.getStat().mergeAdd(Stats.ACCURACY_MAGIC, _mAccuracyAmount);
break;
}
case PER:
{
effected.getStat().mergeMul(Stats.ACCURACY_MAGIC, (_mAccuracyAmount / 100) + 1);
break;
}
}
switch (_pCritRateMode)
{
case DIFF:
{
effected.getStat().mergeAdd(Stats.CRITICAL_RATE, _pCritRateAmount);
break;
}
case PER:
{
effected.getStat().mergeMul(Stats.CRITICAL_RATE, (_pCritRateAmount / 100) + 1);
break;
}
}
switch (_mCritRateMode)
{
case DIFF:
{
effected.getStat().mergeAdd(Stats.MAGIC_CRITICAL_RATE, _mCritRateAmount);
break;
}
case PER:
{
effected.getStat().mergeMul(Stats.MAGIC_CRITICAL_RATE, (_mCritRateAmount / 100) + 1);
break;
}
}
switch (_pCritDamageMode)
{
case DIFF:
{
effected.getStat().mergeAdd(Stats.CRITICAL_DAMAGE_ADD, _pCritDamageAmount);
break;
}
case PER:
{
effected.getStat().mergeMul(Stats.CRITICAL_DAMAGE, (_pCritDamageAmount / 100) + 1);
break;
}
}
switch (_mCritDamageMode)
{
case DIFF:
{
effected.getStat().mergeAdd(Stats.MAGIC_CRITICAL_DAMAGE_ADD, _mCritDamageAmount);
break;
}
case PER:
{
effected.getStat().mergeMul(Stats.MAGIC_CRITICAL_DAMAGE, (_mCritDamageAmount / 100) + 1);
break;
}
}
switch (_speedMode)
{
case DIFF:
{
effected.getStat().mergeAdd(Stats.MOVE_SPEED, _speedAmount);
break;
}
case PER:
{
effected.getStat().mergeMul(Stats.MOVE_SPEED, (_speedAmount / 100) + 1);
break;
}
}

View File

@@ -29,7 +29,7 @@ import org.l2jmobius.gameserver.model.skills.Skill;
import org.l2jmobius.gameserver.model.stats.Stats;
/**
* @author Sdw
* @author Sdw, Mobius
*/
public class TwoHandedSwordBonus extends AbstractEffect
{
@@ -37,18 +37,72 @@ public class TwoHandedSwordBonus extends AbstractEffect
private static final Condition _slotCondition = new ConditionUsingSlotType(Item.SLOT_LR_HAND);
private final double _pAtkAmount;
private final StatModifierType _pAtkmode;
private final StatModifierType _pAtkMode;
private final double _accuracyAmount;
private final StatModifierType _accuracyMode;
private final double _mAtkAmount;
private final StatModifierType _mAtkMode;
private final double _pAtkSpeedAmount;
private final StatModifierType _pAtkSpeedMode;
private final double _mAtkSpeedAmount;
private final StatModifierType _mAtkSpeedMode;
private final double _pAccuracyAmount;
private final StatModifierType _pAccuracyMode;
private final double _mpAccuracyAmount;
private final StatModifierType _mpAccuracyMode;
private final double _pCritRateAmount;
private final StatModifierType _pCritRateMode;
private final double _mCritRateAmount;
private final StatModifierType _mCritRateMode;
private final double _pCritDamageAmount;
private final StatModifierType _pCritDamageMode;
private final double _mCritDamageAmount;
private final StatModifierType _mCritDamageMode;
private final double _speedAmount;
private final StatModifierType _speedMode;
public TwoHandedSwordBonus(StatsSet params)
{
_pAtkAmount = params.getDouble("pAtkAmount", 0);
_pAtkmode = params.getEnum("pAtkmode", StatModifierType.class, StatModifierType.DIFF);
_pAtkMode = params.getEnum("pAtkMode", StatModifierType.class, StatModifierType.DIFF);
_accuracyAmount = params.getDouble("accuracyAmount", 0);
_accuracyMode = params.getEnum("accuracyMode", StatModifierType.class, StatModifierType.DIFF);
_mAtkAmount = params.getDouble("mAtkAmount", 0);
_mAtkMode = params.getEnum("mAtkMode", StatModifierType.class, StatModifierType.DIFF);
_pAtkSpeedAmount = params.getDouble("pAtkSpeedAmount", 0);
_pAtkSpeedMode = params.getEnum("pAtkSpeedMode", StatModifierType.class, StatModifierType.DIFF);
_mAtkSpeedAmount = params.getDouble("mAtkSpeedAmount", 0);
_mAtkSpeedMode = params.getEnum("mAtkSpeedMode", StatModifierType.class, StatModifierType.DIFF);
_pAccuracyAmount = params.getDouble("pAccuracyAmount", 0);
_pAccuracyMode = params.getEnum("pAccuracyMode", StatModifierType.class, StatModifierType.DIFF);
_mpAccuracyAmount = params.getDouble("mpAccuracyAmount", 0);
_mpAccuracyMode = params.getEnum("mpAccuracyMode", StatModifierType.class, StatModifierType.DIFF);
_pCritRateAmount = params.getDouble("pCritRateAmount", 0);
_pCritRateMode = params.getEnum("pCritRateMode", StatModifierType.class, StatModifierType.DIFF);
_mCritRateAmount = params.getDouble("mCritRateAmount", 0);
_mCritRateMode = params.getEnum("mCritRateMode", StatModifierType.class, StatModifierType.DIFF);
_pCritDamageAmount = params.getDouble("pCritDamageAmount", 0);
_pCritDamageMode = params.getEnum("pCritDamageMode", StatModifierType.class, StatModifierType.DIFF);
_mCritDamageAmount = params.getDouble("mCritDamageAmount", 0);
_mCritDamageMode = params.getEnum("mCritDamageMode", StatModifierType.class, StatModifierType.DIFF);
_speedAmount = params.getDouble("speedAmount", 0);
_speedMode = params.getEnum("speedMode", StatModifierType.class, StatModifierType.DIFF);
}
@Override
@@ -56,7 +110,7 @@ public class TwoHandedSwordBonus extends AbstractEffect
{
if (_weaponTypeCondition.test(effected, effected, skill) && _slotCondition.test(effected, effected, skill))
{
switch (_pAtkmode)
switch (_pAtkMode)
{
case DIFF:
{
@@ -70,16 +124,268 @@ public class TwoHandedSwordBonus extends AbstractEffect
}
}
switch (_accuracyMode)
switch (_mAtkMode)
{
case DIFF:
{
effected.getStat().mergeAdd(Stats.ACCURACY_COMBAT, _accuracyAmount);
effected.getStat().mergeAdd(Stats.MAGIC_ATTACK, _mAtkAmount);
break;
}
case PER:
{
effected.getStat().mergeMul(Stats.ACCURACY_COMBAT, (_accuracyAmount / 100) + 1);
effected.getStat().mergeMul(Stats.MAGIC_ATTACK, (_mAtkAmount / 100) + 1);
break;
}
}
switch (_pAtkSpeedMode)
{
case DIFF:
{
effected.getStat().mergeAdd(Stats.PHYSICAL_ATTACK_SPEED, _pAtkSpeedAmount);
break;
}
case PER:
{
effected.getStat().mergeMul(Stats.PHYSICAL_ATTACK_SPEED, (_pAtkSpeedAmount / 100) + 1);
break;
}
}
switch (_mAtkSpeedMode)
{
case DIFF:
{
effected.getStat().mergeAdd(Stats.MAGIC_ATTACK_SPEED, _mAtkSpeedAmount);
break;
}
case PER:
{
effected.getStat().mergeMul(Stats.MAGIC_ATTACK_SPEED, (_mAtkSpeedAmount / 100) + 1);
break;
}
}
switch (_mAtkMode)
{
case DIFF:
{
effected.getStat().mergeAdd(Stats.MAGIC_ATTACK, _mAtkAmount);
break;
}
case PER:
{
effected.getStat().mergeMul(Stats.MAGIC_ATTACK, (_mAtkAmount / 100) + 1);
break;
}
}
switch (_pAtkSpeedMode)
{
case DIFF:
{
effected.getStat().mergeAdd(Stats.PHYSICAL_ATTACK_SPEED, _pAtkSpeedAmount);
break;
}
case PER:
{
effected.getStat().mergeMul(Stats.PHYSICAL_ATTACK_SPEED, (_pAtkSpeedAmount / 100) + 1);
break;
}
}
switch (_mAtkSpeedMode)
{
case DIFF:
{
effected.getStat().mergeAdd(Stats.MAGIC_ATTACK_SPEED, _mAtkSpeedAmount);
break;
}
case PER:
{
effected.getStat().mergeMul(Stats.MAGIC_ATTACK_SPEED, (_mAtkSpeedAmount / 100) + 1);
break;
}
}
switch (_pAccuracyMode)
{
case DIFF:
{
effected.getStat().mergeAdd(Stats.ACCURACY_COMBAT, _pAccuracyAmount);
break;
}
case PER:
{
effected.getStat().mergeMul(Stats.ACCURACY_COMBAT, (_pAccuracyAmount / 100) + 1);
break;
}
}
switch (_mpAccuracyMode)
{
case DIFF:
{
effected.getStat().mergeAdd(Stats.ACCURACY_MAGIC, _mpAccuracyAmount);
break;
}
case PER:
{
effected.getStat().mergeMul(Stats.ACCURACY_MAGIC, (_mpAccuracyAmount / 100) + 1);
break;
}
}
switch (_pCritRateMode)
{
case DIFF:
{
effected.getStat().mergeAdd(Stats.CRITICAL_RATE, _pCritRateAmount);
break;
}
case PER:
{
effected.getStat().mergeMul(Stats.CRITICAL_RATE, (_pCritRateAmount / 100) + 1);
break;
}
}
switch (_mCritRateMode)
{
case DIFF:
{
effected.getStat().mergeAdd(Stats.MAGIC_CRITICAL_RATE, _mCritRateAmount);
break;
}
case PER:
{
effected.getStat().mergeMul(Stats.MAGIC_CRITICAL_RATE, (_mCritRateAmount / 100) + 1);
break;
}
}
switch (_pCritDamageMode)
{
case DIFF:
{
effected.getStat().mergeAdd(Stats.CRITICAL_DAMAGE_ADD, _pCritDamageAmount);
break;
}
case PER:
{
effected.getStat().mergeMul(Stats.CRITICAL_DAMAGE, (_pCritDamageAmount / 100) + 1);
break;
}
}
switch (_mCritDamageMode)
{
case DIFF:
{
effected.getStat().mergeAdd(Stats.MAGIC_CRITICAL_DAMAGE_ADD, _mCritDamageAmount);
break;
}
case PER:
{
effected.getStat().mergeMul(Stats.MAGIC_CRITICAL_DAMAGE, (_mCritDamageAmount / 100) + 1);
break;
}
}
switch (_speedMode)
{
case DIFF:
{
effected.getStat().mergeAdd(Stats.MOVE_SPEED, _speedAmount);
break;
}
case PER:
{
effected.getStat().mergeMul(Stats.MOVE_SPEED, (_speedAmount / 100) + 1);
break;
}
}
switch (_mpAccuracyMode)
{
case DIFF:
{
effected.getStat().mergeAdd(Stats.ACCURACY_MAGIC, _mpAccuracyAmount);
break;
}
case PER:
{
effected.getStat().mergeMul(Stats.ACCURACY_MAGIC, (_mpAccuracyAmount / 100) + 1);
break;
}
}
switch (_pCritRateMode)
{
case DIFF:
{
effected.getStat().mergeAdd(Stats.CRITICAL_RATE, _pCritRateAmount);
break;
}
case PER:
{
effected.getStat().mergeMul(Stats.CRITICAL_RATE, (_pCritRateAmount / 100) + 1);
break;
}
}
switch (_mCritRateMode)
{
case DIFF:
{
effected.getStat().mergeAdd(Stats.MAGIC_CRITICAL_RATE, _mCritRateAmount);
break;
}
case PER:
{
effected.getStat().mergeMul(Stats.MAGIC_CRITICAL_RATE, (_mCritRateAmount / 100) + 1);
break;
}
}
switch (_pCritDamageMode)
{
case DIFF:
{
effected.getStat().mergeAdd(Stats.CRITICAL_DAMAGE_ADD, _pCritDamageAmount);
break;
}
case PER:
{
effected.getStat().mergeMul(Stats.CRITICAL_DAMAGE, (_pCritDamageAmount / 100) + 1);
break;
}
}
switch (_mCritDamageMode)
{
case DIFF:
{
effected.getStat().mergeAdd(Stats.MAGIC_CRITICAL_DAMAGE_ADD, _mCritDamageAmount);
break;
}
case PER:
{
effected.getStat().mergeMul(Stats.MAGIC_CRITICAL_DAMAGE, (_mCritDamageAmount / 100) + 1);
break;
}
}
switch (_speedMode)
{
case DIFF:
{
effected.getStat().mergeAdd(Stats.MOVE_SPEED, _speedAmount);
break;
}
case PER:
{
effected.getStat().mergeMul(Stats.MOVE_SPEED, (_speedAmount / 100) + 1);
break;
}
}

View File

@@ -7169,7 +7169,7 @@
<value level="6">10</value>
<value level="7">15</value>
</pAtkAmount>
<pAtkmode>PER</pAtkmode>
<pAtkMode>PER</pAtkMode>
</effect>
<effect name="TwoHandedBluntBonus">
<pAtkAmount>
@@ -7181,7 +7181,7 @@
<value level="6">10</value>
<value level="7">15</value>
</pAtkAmount>
<pAtkmode>PER</pAtkmode>
<pAtkMode>PER</pAtkMode>
</effect>
<effect name="PAtk">
<amount>15</amount>

View File

@@ -3125,13 +3125,13 @@
</effect>
<effect name="TwoHandedSwordBonus">
<pAtkAmount>10</pAtkAmount>
<pAtkmode>PER</pAtkmode>
<pAtkMode>PER</pAtkMode>
<accuracyAmount>8</accuracyAmount>
<accuracyMode>DIFF</accuracyMode>
</effect>
<effect name="TwoHandedBluntBonus">
<pAtkAmount>10</pAtkAmount>
<pAtkmode>PER</pAtkmode>
<pAtkMode>PER</pAtkMode>
<accuracyAmount>8</accuracyAmount>
<accuracyMode>DIFF</accuracyMode>
</effect>

View File

@@ -702,7 +702,7 @@
<value level="5">7.4</value>
<value level="6">8.3</value>
</pAtkAmount>
<pAtkmode>PER</pAtkmode>
<pAtkMode>PER</pAtkMode>
</effect>
<effect name="TwoHandedBluntBonus">
<pAtkAmount>
@@ -713,7 +713,7 @@
<value level="5">7.4</value>
<value level="6">8.3</value>
</pAtkAmount>
<pAtkmode>PER</pAtkmode>
<pAtkMode>PER</pAtkMode>
</effect>
<effect name="PAtk">
<amount>
@@ -1017,11 +1017,11 @@
</effect>
<effect name="TwoHandedSwordBonus">
<pAtkAmount>5</pAtkAmount>
<pAtkmode>DIFF</pAtkmode>
<pAtkMode>DIFF</pAtkMode>
</effect>
<effect name="TwoHandedBluntBonus">
<pAtkAmount>5</pAtkAmount>
<pAtkmode>DIFF</pAtkmode>
<pAtkMode>DIFF</pAtkMode>
</effect>
</effects>
</skill>

View File

@@ -701,22 +701,6 @@
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="pAtkAmount">
<xs:complexType mixed="true">
<xs:sequence minOccurs="0">
<xs:element maxOccurs="unbounded" name="value">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:decimal">
<xs:attribute name="level" type="xs:unsignedByte" use="required" />
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="pAtkmode" type="xs:string" />
<xs:element name="PLANT_WEAKNESS">
<xs:complexType mixed="true">
<xs:sequence minOccurs="0">
@@ -732,6 +716,166 @@
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="pAtkAmount">
<xs:complexType mixed="true">
<xs:sequence minOccurs="0">
<xs:element maxOccurs="unbounded" name="value">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:decimal">
<xs:attribute name="level" type="xs:unsignedByte" use="required" />
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="pAtkMode" type="xs:string" />
<xs:element name="mAtkAmount">
<xs:complexType mixed="true">
<xs:sequence minOccurs="0">
<xs:element maxOccurs="unbounded" name="value">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:decimal">
<xs:attribute name="level" type="xs:unsignedByte" use="required" />
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="mAtkMode" type="xs:string" />
<xs:element name="pAccuracyAmount">
<xs:complexType mixed="true">
<xs:sequence minOccurs="0">
<xs:element maxOccurs="unbounded" name="value">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:decimal">
<xs:attribute name="level" type="xs:unsignedByte" use="required" />
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="pAccuracyMode" type="xs:string" />
<xs:element name="mAccuracyAmount">
<xs:complexType mixed="true">
<xs:sequence minOccurs="0">
<xs:element maxOccurs="unbounded" name="value">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:decimal">
<xs:attribute name="level" type="xs:unsignedByte" use="required" />
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="mAccuracyMode" type="xs:string" />
<xs:element name="pAtkSpeedAmount">
<xs:complexType mixed="true">
<xs:sequence minOccurs="0">
<xs:element maxOccurs="unbounded" name="value">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:decimal">
<xs:attribute name="level" type="xs:unsignedByte" use="required" />
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="pAtkSpeedMode" type="xs:string" />
<xs:element name="mAtkSpeedAmount">
<xs:complexType mixed="true">
<xs:sequence minOccurs="0">
<xs:element maxOccurs="unbounded" name="value">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:decimal">
<xs:attribute name="level" type="xs:unsignedByte" use="required" />
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="mAtkSpeedMode" type="xs:string" />
<xs:element name="pCritDamageAmount">
<xs:complexType mixed="true">
<xs:sequence minOccurs="0">
<xs:element maxOccurs="unbounded" name="value">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:decimal">
<xs:attribute name="level" type="xs:unsignedByte" use="required" />
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="pCritDamageMode" type="xs:string" />
<xs:element name="pCritRateAmount">
<xs:complexType mixed="true">
<xs:sequence minOccurs="0">
<xs:element maxOccurs="unbounded" name="value">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:decimal">
<xs:attribute name="level" type="xs:unsignedByte" use="required" />
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="pCritRateMode" type="xs:string" />
<xs:element name="mCritDamageAmount">
<xs:complexType mixed="true">
<xs:sequence minOccurs="0">
<xs:element maxOccurs="unbounded" name="value">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:decimal">
<xs:attribute name="level" type="xs:unsignedByte" use="required" />
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="mpCritDamageMode" type="xs:string" />
<xs:element name="mCritRateAmount">
<xs:complexType mixed="true">
<xs:sequence minOccurs="0">
<xs:element maxOccurs="unbounded" name="value">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:decimal">
<xs:attribute name="level" type="xs:unsignedByte" use="required" />
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="mCritRateMode" type="xs:string" />
<xs:element name="HOLD">
<xs:complexType mixed="true">
<xs:sequence minOccurs="0">
@@ -1309,6 +1453,21 @@
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="DUALBLUNT">
<xs:complexType mixed="true">
<xs:sequence minOccurs="0">
<xs:element maxOccurs="unbounded" name="value">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:byte">
<xs:attribute name="level" type="xs:unsignedByte" use="required" />
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="DUAL">
<xs:complexType mixed="true">
<xs:sequence minOccurs="0">