public void SwapWeapon(int swapIndex, int nowIndex)
    {
        EquipValue equipValue = equipValues[nowIndex];

        equipValues[nowIndex]  = equipValues[swapIndex];
        equipValues[swapIndex] = equipValue;
        dirtyFlag = eDirtyState.Dirty;
    }
    public void SetEquipItem(CharaInfo.EquipItem item, int index)
    {
        if (object.ReferenceEquals(item, null))
        {
            if (index != -1)
            {
                equipValues[index] = null;
                dirtyFlag          = eDirtyState.Dirty;
            }
        }
        else
        {
            EquipItemTable.EquipItemData equipItemData = Singleton <EquipItemTable> .I.GetEquipItemData((uint)item.eId);

            if (!object.ReferenceEquals(equipItemData, null))
            {
                if (index == -1)
                {
                    switch (equipItemData.type)
                    {
                    default:
                        return;

                    case EQUIPMENT_TYPE.ONE_HAND_SWORD:
                    case EQUIPMENT_TYPE.TWO_HAND_SWORD:
                    case EQUIPMENT_TYPE.SPEAR:
                    case EQUIPMENT_TYPE.PAIR_SWORDS:
                    case EQUIPMENT_TYPE.ARROW:
                        index = 0 + setWeaponIndex;
                        setWeaponIndex++;
                        break;

                    case EQUIPMENT_TYPE.ARMOR:
                        index = 3;
                        break;

                    case EQUIPMENT_TYPE.HELM:
                        index = 4;
                        break;

                    case EQUIPMENT_TYPE.ARM:
                        index = 5;
                        break;

                    case EQUIPMENT_TYPE.LEG:
                        index = 6;
                        break;
                    }
                }
                EquipValue equipValue = new EquipValue();
                equipValue.Parse(item, equipItemData);
                equipValues[index] = equipValue;
                dirtyFlag          = eDirtyState.Dirty;
            }
        }
    }
    public StatusFactor GetStatusFactor(int weaponIndex)
    {
        if (weaponIndex < 0 || weaponIndex >= 3)
        {
            return(null);
        }
        if (weaponIndex == cachedWeaponIndex && dirtyFlag >= eDirtyState.CalcFactor)
        {
            return(cachedFactor);
        }
        cachedFactor.Reset();
        EQUIPMENT_TYPE weaponType   = EQUIPMENT_TYPE.NONE;
        SP_ATTACK_TYPE spAttackType = SP_ATTACK_TYPE.NONE;

        for (int i = 0; i < 7; i++)
        {
            if (!object.ReferenceEquals(equipValues[i], null))
            {
                EquipValue equipValue = equipValues[i];
                if (i < 3)
                {
                    if (i != weaponIndex)
                    {
                        continue;
                    }
                    weaponType   = equipValue.type;
                    spAttackType = equipValue.spAttackType;
                }
                cachedFactor.baseStatus.hp += equipValue.baseStatus.hp;
                cachedFactor.constHp       += equipValue.constHp;
                for (int j = 0; j < 7; j++)
                {
                    cachedFactor.baseStatus.attacks[j] += equipValue.baseStatus.attacks[j];
                    cachedFactor.constAtks[j]          += equipValue.constAtks[j];
                }
                cachedFactor.baseStatus.defences[0] += equipValue.baseStatus.defences[0];
                cachedFactor.constDefs[0]           += equipValue.constDefs[0];
                for (int k = 0; k < 6; k++)
                {
                    cachedFactor.baseStatus.tolerances[k] += equipValue.baseStatus.tolerances[k];
                    cachedFactor.constTols[k]             += equipValue.constTols[k];
                }
                _GetEnableSkillSupport(weaponType, spAttackType, equipValue);
            }
        }
        for (int l = 0; l < 6; l++)
        {
            cachedFactor.baseStatus.defences[l + 1] += cachedFactor.baseStatus.defences[0];
        }
        cachedFactor.CheckMinusRate();
        cachedWeaponIndex = weaponIndex;
        dirtyFlag         = eDirtyState.CalcFactor;
        return(cachedFactor);
    }
 private void _Reset()
 {
     for (int i = 0; i < 7; i++)
     {
         equipValues[i] = null;
     }
     cachedFinal.Reset();
     cachedFactor.Reset();
     cachedWeaponIndex = -1;
     cachedHp          = 0;
     cachedAtk         = 0;
     cachedDef         = 0;
     dirtyFlag         = eDirtyState.Dirty;
     setWeaponIndex    = 0;
 }
 public SimpleStatus GetFinalStatus(int weaponIndex, int userHp, int userAtk, int userDef)
 {
     if (weaponIndex == cachedWeaponIndex && userHp == cachedHp && userAtk == cachedAtk && userDef == cachedDef && dirtyFlag == eDirtyState.CalcFinal)
     {
         return(cachedFinal);
     }
     GetStatusFactor(weaponIndex);
     cachedFinal.Reset();
     cachedFinal.hp = (int)((float)(userHp + cachedFactor.baseStatus.hp) * cachedFactor.hpRate + (float)cachedFactor.constHp);
     if (cachedFinal.hp < 1)
     {
         cachedFinal.hp = 1;
     }
     for (int i = 0; i < 7; i++)
     {
         if (i == 0)
         {
             cachedFinal.attacks[i] = (int)((float)(userAtk + cachedFactor.baseStatus.attacks[i]) * cachedFactor.atkRate[i] + (float)cachedFactor.constAtks[i]);
         }
         else
         {
             cachedFinal.attacks[i] = (int)((float)cachedFactor.baseStatus.attacks[i] * cachedFactor.atkRate[i] + (float)cachedFactor.constAtks[i]);
         }
         if (cachedFinal.attacks[i] < 0)
         {
             cachedFinal.attacks[i] = 0;
         }
         cachedFinal.defences[i] = (int)((float)(userDef + cachedFactor.baseStatus.defences[i]) * cachedFactor.defRate[i] + (float)cachedFactor.constDefs[i]);
         if (cachedFinal.defences[i] < 0)
         {
             cachedFinal.defences[i] = 0;
         }
     }
     for (int j = 0; j < 6; j++)
     {
         cachedFinal.tolerances[j] = (int)((float)cachedFactor.baseStatus.tolerances[j] * cachedFactor.tolRate[j] + (float)cachedFactor.constTols[j]);
     }
     cachedHp  = userHp;
     cachedAtk = userAtk;
     cachedDef = userDef;
     dirtyFlag = eDirtyState.CalcFinal;
     return(cachedFinal);
 }