Çözüldü Şimşek direnci efsununun yanlış çalışması

  • Konuyu açan Konuyu açan DeadLyEscaPe
  • Açılış Tarihi Açılış Tarihi
  • Yanıt Yanıt 2
  • Gösterim Gösterim 87
Bu konu çözüme ulaştırılmıştır. Çözüm için konuya yazılan tüm yorumları okumayı unutmayın. Eğer konudaki yorumlar sorununuzu çözmediyse yeni bir konu açabilirsiniz.
Durum
İçerik kilitlendiği için mesaj gönderimine kapatıldı.

DeadLyEscaPe

Yardımsever Üye
Yardımsever Üye
Üye
Mesaj
524
Çözümler
33
Beğeni
129
Puan
940
Ticaret Puanı
0
Merhabalar. Sürgün slotlarında ATT_ELEC ekli. Sorun şu; %1 şimşek direnci olsa bile slotlar hasar vuramıyor. 0'a indiğinde normal hasar veriyorlar. Oyunda maksimum %70-80 Şimşek Direnci elde edilebiliyor. Karakterin buna orantılı şekilde hasar yemesini istiyorum. Düzenleme yaptığım yerler aşağıda mevcut.



battle.cpp:
Genişlet Daralt Kopyala
int64_t CalcAttBonus(LPCHARACTER pkAttacker, LPCHARACTER pkVictim, int64_t iAtk)
{
    if (!pkVictim->IsPC())
        iAtk += pkAttacker->GetMarriageBonus(UNIQUE_ITEM_MARRIAGE_ATTACK_BONUS);

    if (!pkAttacker->IsPC())
    {
        int64_t iReduceDamagePct = pkVictim->GetMarriageBonus(UNIQUE_ITEM_MARRIAGE_TRANSFER_DAMAGE);
        iAtk = iAtk * (100 + iReduceDamagePct) / 100;
    }

    if (pkAttacker->IsNPC() && pkVictim->IsPC())
    {
        iAtk = (iAtk * CHARACTER_MANAGER::instance().GetMobDamageRate(pkAttacker)) / 100;
        iAtk -= (iAtk * 100 * pkVictim->GetPoint(POINT_RESIST_MONSTER)) / 10000;
    }

    if (pkVictim->IsNPC())
    {
        if (pkVictim->IsRaceFlag(RACE_FLAG_ANIMAL))
            iAtk += (iAtk * pkAttacker->GetPoint(POINT_ATTBONUS_ANIMAL)) / 100;
        if (pkVictim->IsRaceFlag(RACE_FLAG_UNDEAD))
            iAtk += (iAtk * pkAttacker->GetPoint(POINT_ATTBONUS_UNDEAD)) / 100;
        if (pkVictim->IsRaceFlag(RACE_FLAG_DEVIL))
            iAtk += (iAtk * pkAttacker->GetPoint(POINT_ATTBONUS_DEVIL)) / 100;
        if (pkVictim->IsRaceFlag(RACE_FLAG_HUMAN))
            iAtk += (iAtk * pkAttacker->GetPoint(POINT_ATTBONUS_HUMAN)) / 100;
        if (pkVictim->IsRaceFlag(RACE_FLAG_ORC))
            iAtk += (iAtk * pkAttacker->GetPoint(POINT_ATTBONUS_ORC)) / 100;
        if (pkVictim->IsRaceFlag(RACE_FLAG_MILGYO))
            iAtk += (iAtk * pkAttacker->GetPoint(POINT_ATTBONUS_MILGYO)) / 100;
        if (pkVictim->IsRaceFlag(RACE_FLAG_INSECT))
            iAtk += (iAtk * pkAttacker->GetPoint(POINT_ATTBONUS_INSECT)) / 100;
        if (pkVictim->IsRaceFlag(RACE_FLAG_FIRE))
            iAtk += (iAtk * pkAttacker->GetPoint(POINT_ATTBONUS_FIRE)) / 100;
        if (pkVictim->IsRaceFlag(RACE_FLAG_ICE))
            iAtk += (iAtk * pkAttacker->GetPoint(POINT_ATTBONUS_ICE)) / 100;
        if (pkVictim->IsRaceFlag(RACE_FLAG_DESERT))
            iAtk += (iAtk * pkAttacker->GetPoint(POINT_ATTBONUS_DESERT)) / 100;
        if (pkVictim->IsRaceFlag(RACE_FLAG_TREE))
            iAtk += (iAtk * pkAttacker->GetPoint(POINT_ATTBONUS_TREE)) / 100;
            
        if (pkVictim->IsRaceFlag(RACE_FLAG_ATT_ELEC))
            iAtk += (iAtk * pkAttacker->GetPoint(POINT_ENCHANT_ELEC)) / 100;
        if (pkVictim->IsRaceFlag(RACE_FLAG_FIRE) || pkVictim->IsRaceFlag(RACE_FLAG_ATT_FIRE))
            iAtk += (iAtk * pkAttacker->GetPoint(POINT_ENCHANT_FIRE)) / 100;
        if (pkVictim->IsRaceFlag(RACE_FLAG_ICE) || pkVictim->IsRaceFlag(RACE_FLAG_ATT_ICE))
            iAtk += (iAtk * pkAttacker->GetPoint(POINT_ENCHANT_ICE)) / 100;
        if (pkVictim->IsRaceFlag(RACE_FLAG_ATT_WIND))
            iAtk += (iAtk * pkAttacker->GetPoint(POINT_ENCHANT_WIND)) / 100;
        if (pkVictim->IsRaceFlag(RACE_FLAG_ATT_EARTH))
            iAtk += (iAtk * pkAttacker->GetPoint(POINT_ENCHANT_EARTH)) / 100;
        if (pkVictim->IsRaceFlag(RACE_FLAG_ATT_DARK))
            iAtk += (iAtk * pkAttacker->GetPoint(POINT_ENCHANT_DARK)) / 100;
            
        #ifdef ENABLE_BONUS_BOSS
        if (pkVictim->IsRaceFlag(RACE_FLAG_ATT_BOSS))
            iAtk += (iAtk * pkAttacker->GetPoint(POINT_ATTBONUS_BOSS)) *8 / 100;
        #endif
        #ifdef ENABLE_BONUS_STONE
        if (pkVictim->IsRaceFlag(RACE_FLAG_ATT_METIN))
            iAtk += (iAtk * pkAttacker->GetPoint(POINT_ATTBONUS_STONE)) *8 / 100;
        #endif
        
        iAtk += (iAtk * pkAttacker->GetPoint(POINT_ATTBONUS_MONSTER)) *4 / 100;
    }
    
    else if (pkVictim->IsPC())
    {
        iAtk += (iAtk * pkAttacker->GetPoint(POINT_ATTBONUS_HUMAN)) / 100;

        switch (pkVictim->GetJob())
        {
            case JOB_WARRIOR:
                iAtk += (iAtk * pkAttacker->GetPoint(POINT_ATTBONUS_WARRIOR)) / 100;
                break;

            case JOB_ASSASSIN:
                iAtk += (iAtk * pkAttacker->GetPoint(POINT_ATTBONUS_ASSASSIN)) / 100;
                break;

            case JOB_SURA:
                iAtk += (iAtk * pkAttacker->GetPoint(POINT_ATTBONUS_SURA)) / 100;
                break;

            case JOB_SHAMAN:
                iAtk += (iAtk * pkAttacker->GetPoint(POINT_ATTBONUS_SHAMAN)) / 100;
                break;
        }
    }

    if (pkAttacker->IsPC() == true)
    {
        switch (pkAttacker->GetJob())
        {
            case JOB_WARRIOR:
                iAtk -= (iAtk * pkVictim->GetPoint(POINT_RESIST_WARRIOR)) / 100;
                break;
                
            case JOB_ASSASSIN:
                iAtk -= (iAtk * pkVictim->GetPoint(POINT_RESIST_ASSASSIN)) / 100;
                break;
                
            case JOB_SURA:
                iAtk -= (iAtk * pkVictim->GetPoint(POINT_RESIST_SURA)) / 100;
                break;

            case JOB_SHAMAN:
                iAtk -= (iAtk * pkVictim->GetPoint(POINT_RESIST_SHAMAN)) / 100;
                break;
        }
    }


    if (pkAttacker->IsMonster() && pkVictim->IsPC())
    {
        if (pkAttacker->IsRaceFlag(RACE_FLAG_ATT_ELEC))
            iAtk -= (iAtk * 30 * pkVictim->GetPoint(POINT_RESIST_ELEC))        / 100;
        else if (pkAttacker->IsRaceFlag(RACE_FLAG_ATT_FIRE))
            iAtk -= (iAtk * 30 * pkVictim->GetPoint(POINT_RESIST_FIRE))        / 100;
        else if (pkAttacker->IsRaceFlag(RACE_FLAG_ATT_ICE))
            iAtk -= (iAtk * 30 * pkVictim->GetPoint(POINT_RESIST_ICE))        / 100;
        else if (pkAttacker->IsRaceFlag(RACE_FLAG_ATT_WIND))
            iAtk -= (iAtk * 30 * pkVictim->GetPoint(POINT_RESIST_WIND))        / 100;
        else if (pkAttacker->IsRaceFlag(RACE_FLAG_ATT_EARTH))
            iAtk -= (iAtk * 30 * pkVictim->GetPoint(POINT_RESIST_EARTH))    / 100;
        else if (pkAttacker->IsRaceFlag(RACE_FLAG_ATT_DARK))
            iAtk -= (iAtk * 30 * pkVictim->GetPoint(POINT_RESIST_DARK))        / 100;
    }
        
    return iAtk;
}

mob_proto.txt:
Genişlet Daralt Kopyala
2401    "????"    "PAWN"    "MONSTER"    "MELEE"    87        "BERSERK"    0    "DEVIL, ATT_ELEC"    "SLOW,CURSE,TERROR"    0    "ch_footman"    0    107    53    80    26    197    231    30000    3    14    2500    10000    500000    67    110    130    110    2000    50    0    0    0    3    0    0    5    5    0    0    0    10    10    10    0    -70    30    0    0    "2"    0    5    0    0    0    0    0    0    0    0    0    0    0    30    0    0    0    0    0
2402    "????"    "PAWN"    "MONSTER"    "RANGE"    89        "GODSPEED"    0    "DEVIL, ATT_ELEC"    "SLOW,CURSE,TERROR"    0    "ch_bowman"    0    82    110    55    27    121    252    30000    5    14    2500    10000    500000    72    105    150    100    2000    650    0    0    0    0    0    0    5    5    20    20    0    0    0    -30    0    -70    10    0    0    "2"    0    5    0    0    0    0    0    0    0    0    0    0    0    0    0    30    0    0    0
2403    "????"    "S_PAWN"    "MONSTER"    "RANGE"    89        "REVIVE"    0    "DEVIL, ATT_ELEC"    "SLOW,CURSE,TERROR"    0    "ch_magician"    0    82    55    110    27    181    265    30000    5    14    2500    10000    500000    76    100    150    100    2000    700    0    0    0    0    10    10    0    0    10    10    25    -5    -5    30    0    -60    -30    0    0    "3"    0    10    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    30    0
2404    "????"    "S_PAWN"    "MONSTER"    "MELEE"    90        "STONESKIN"    0    "DEVIL, ATT_ELEC"    "SLOW,CURSE,TERROR"    0    "ch_officer"    0    111    83    55    28    202    265    30000    7    20    2500    10000    500000    79    110    130    100    2000    50    0    0    0    0    0    0    5    5    10    10    5    -5    -5    10    0    0    15    0    0    "4"    0    15    0    0    0    0    0    0    0    0    0    0    0    0    20    0    0    0    0
2411    "?????"    "S_PAWN"    "MONSTER"    "MELEE"    91        "BERSERK"    0    "DEVIL, ATT_ELEC"    "SLOW,CURSE,TERROR"    0    "ch_footman"    0    112    84    56    28    184    269    30000    3    14    2500    10000    500000    78    115    130    100    2000    50    0    0    0    5    0    0    6    3    10    0    15    30    25    15    0    -60    30    0    0    "2"    0    15    0    0    0    0    0    0    0    0    0    0    0    30    0    0    0    0    0
2412    "?????"    "KNIGHT"    "MONSTER"    "RANGE"    93        "GODSPEED"    0    "DEVIL, ATT_ELEC"    "SLOW,CURSE,TERROR"    0    "ch_bowman"    0    86    114    57    29    218    269    30000    3    14    2500    10000    500000    82    110    150    100    2000    700    0    0    0    0    3    3    6    6    30    25    10    0    10    5    0    -60    20    0    0    "2"    0    15    0    0    0    0    0    0    0    0    0    0    0    0    0    30    0    0    0
2413    "?????"    "KNIGHT"    "MONSTER"    "RANGE"    95        "REVIVE"    0    "DEVIL, ATT_ELEC"    "SLOW,CURSE,TERROR"    0    "ch_magician"    0    88    58    117    29    235    286    30000    4    14    2500    10000    500000    88    110    150    100    2000    700    0    0    0    10    0    10    2    2    30    40    5    30    25    0    0    -40    40    0    0    "3"    0    30    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    50    0
2414    "?????"    "S_KNIGHT"    "MONSTER"    "MELEE"    97        "STONESKIN"    0    "DEVIL, ATT_ELEC"    "SLOW,CURSE,TERROR"    0    "ch_officer"    0    119    89    60    30    252    303    30000    5    20    2500    10000    500000    95    105    130    100    2000    50    0    0    0    5    0    5    8    8    30    20    20    10    5    20    0    -60    -10    0    0    "3"    0    20    0    0    0    0    0    0    0    0    0    0    0    0    30    0    0    0    0
2431    "????"    "PAWN"    "MONSTER"    "MELEE"    80        "BERSERK"    0    "DEVIL, ATT_ELEC"    "SLOW,CURSE,TERROR"    0    "ch_footman"    0    107    53    80    26    163    277    30000    3    7    2500    10000    500000    67    110    130    110    2000    50    0    0    0    3    0    0    5    5    0    -10    0    -10    -10    50    0    -70    30    0    0    "2"    0    5    0    0    0    0    0    0    0    0    0    0    0    30    0    0    0    0    0
2432    "????"    "PAWN"    "MONSTER"    "RANGE"    82        "GODSPEED"    0    "DEVIL, ATT_ELEC"    "SLOW,CURSE,TERROR"    0    "ch_bowman"    0    82    110    55    27    166    282    30000    5    7    2500    10000    500000    72    105    150    100    2000    650    0    0    0    0    0    0    5    5    -5    -15    0    5    5    5    0    -60    15    0    0    "2"    0    5    0    0    0    0    0    0    0    0    0    0    0    0    0    30    0    0    0
2433    "????"    "S_PAWN"    "MONSTER"    "RANGE"    82        "REVIVE"    0    "DEVIL, ATT_ELEC"    "SLOW,CURSE,TERROR"    0    "ch_magician"    0    82    55    110    27    176    282    30000    5    7    2500    10000    500000    76    105    150    100    2000    650    0    0    0    0    10    10    0    0    10    10    5    -10    -10    10    0    -60    10    0    0    "3"    0    10    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    30    0
2434    "????"    "S_PAWN"    "MONSTER"    "MELEE"    83        "STONESKIN"    0    "DEVIL, ATT_ELEC"    "SLOW,CURSE,TERROR"    0    "ch_officer"    0    111    83    55    28    167    285    30000    7    10    2500    10000    500000    79    115    130    100    2000    50    0    0    0    0    0    0    5    5    -5    -15    -5    5    5    5    0    -60    15    0    0    "4"    0    15    0    0    0    0    0    0    0    0    0    0    0    0    20    0    0    0    0
2451    "?????"    "S_PAWN"    "MONSTER"    "MELEE"    84        "BERSERK"    0    "DEVIL, ATT_ELEC"    "SLOW,CURSE,TERROR"    0    "ch_footman"    0    112    84    56    28    169    287    30000    5    7    2500    10000    500000    67    135    130    100    2000    50    0    0    0    3    0    0    15    20    0    -10    0    -10    -10    50    0    -60    50    0    0    "3"    0    15    0    0    0    0    0    0    0    0    0    0    0    30    0    0    0    0    0
2452    "?????"    "KNIGHT"    "MONSTER"    "RANGE"    86        "GODSPEED"    0    "DEVIL, ATT_ELEC"    "SLOW,CURSE,TERROR"    0    "ch_bowman"    0    86    114    57    29    171    293    30000    5    7    2500    10000    500000    72    130    150    100    2000    700    0    0    0    0    0    0    15    20    -5    -15    0    5    5    5    0    -60    25    0    0    "4"    0    15    0    0    0    0    0    0    0    0    0    0    0    0    0    30    0    0    0
2453    "?????"    "KNIGHT"    "MONSTER"    "RANGE"    88        "REVIVE"    0    "DEVIL, ATT_ELEC"    "SLOW,CURSE,TERROR"    0    "ch_magician"    0    88    58    117    29    174    298    30000    7    7    2500    10000    500000    76    130    150    100    2000    700    0    0    0    0    10    10    5    15    10    10    5    -10    -10    10    0    -60    30    0    0    "4"    0    20    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    30    0
2454    "?????"    "S_KNIGHT"    "MONSTER"    "MELEE"    90        "STONESKIN"    0    "DEVIL, ATT_ELEC"    "SLOW,CURSE,TERROR"    0    "ch_officer"    0    119    89    60    30    177    303    30000    7    10    2500    10000    500000    79    140    130    100    2000    50    0    0    0    0    0    0    15    20    -5    -15    -5    5    5    5    0    -60    35    0    0    "6"    0    25    0    0    0    0    0    0    0    0    0    0    0    0    30    0    0    0    0
 
Çözüm
battle.cpp:
Genişlet Daralt Kopyala
if (pkAttacker->IsRaceFlag(RACE_FLAG_ATT_ELEC))
        {
            int iResist = pkVictim->GetPoint(POINT_RESIST_ELEC);
            iResist = MIN(75, MAX(0, iResist));

            float fResist = iResist / 100.0f;
            float fMultiplier = 1.0f - pow(fResist, 1.2f);

            iAtk = static_cast<int>(iAtk * fMultiplier);
        }

Bu şekilde sorun düzeldi. Yapay zekaya sormak hiç aklıma gelmemişti. Teşekkürler.
Selamlar yapay zekadan aldığım cevap:

  • Bazı sürümlerde GetPoint(POINT_RESIST_ELEC) ekranda 1% görünse bile içeride 10 gibi bir değer döndürür (yani yüzde yerine “binde” ölçeğe yakın).
  • Bu durumda formül: iAtk -= iAtk * 30 * 10 / 100 = iAtk * 3 olur ve hasarı eksiye düşürür → oyun 0’a clamp ettiği için “%1 bile olsa slot vurmuyor” hatası görülür.
  • %70-80 dirence gelince zaten 30 * 70 = 2100% gibi absürt indirim yapar; tamamen sıfırlar.


// BEFORE
// iAtk -= (iAtk * 30 * pkVictim->GetPoint(POINT_RESIST_ELEC)) / 100;


// AFTER (tüm elementler için aynı mantık)
iAtk -= (iAtk * pkVictim->GetPoint(POINT_RESIST_ELEC)) / 100;
 
battle.cpp:
Genişlet Daralt Kopyala
if (pkAttacker->IsRaceFlag(RACE_FLAG_ATT_ELEC))
        {
            int iResist = pkVictim->GetPoint(POINT_RESIST_ELEC);
            iResist = MIN(75, MAX(0, iResist));

            float fResist = iResist / 100.0f;
            float fMultiplier = 1.0f - pow(fResist, 1.2f);

            iAtk = static_cast<int>(iAtk * fMultiplier);
        }

Bu şekilde sorun düzeldi. Yapay zekaya sormak hiç aklıma gelmemişti. Teşekkürler.
 
Çözüm
Durum
İçerik kilitlendiği için mesaj gönderimine kapatıldı.
Geri
Üst