[C++] Düz Vuruşlarda Delici Vuruş Şansı Düzenlemesi

  • Konuyu açan Konuyu açan Kaiser
  • Açılış Tarihi Açılış Tarihi
  • Yanıt Yanıt 18
  • Gösterim Gösterim 4K

Kaiser

Admin
Admin
Geliştirici
Yardımsever Üye
Mesaj
4.038
Çözümler
390
Beğeni
4.157
Puan
1.849
Ticaret Puanı
0
Merhaba, dün ufak çaplı kontroller yaparken bir sorun fark ettim. Kimine göre sorun, kimine göre de yetersizlik olabilir aslında.
Bu mevzu büyük ihtimalle sıfır altyapılarda daha çok vardır. Yinede burada anlattıklarımı uygulamadan önce kontrol edin ve gerçekten ihtiyaç duyuyorsanız uygulayın.

Sadece %15 Kritik Vuruş efsunu olan bir itemi giydiğimde --> Metine vurduğum düz vuruşlarda ara sıra kritik patlıyor.
(Bu normal, istenildiği takdirde düz vuruşlarda kritik kapatılabilir, her neyse. Bu bir sorun teşkil etmiyor.)

Fakat;

Sadece %15 Delici Vuruş Şansı olan bir itemi giydiğimde --> Metine ne kadar vurarsam vurayım hem doğru düzgün delici vurmuyor, hem de delicinin geldiğini belli eden efekt görünmüyor. Yani delici gelmiş mi gelmemiş mi belli değil. Aslında damage sayılarında belli oluyor, fakat benim için bu fark çok çok azdı. Yani düz vuruş 500 ise, delici ile beraber 700 falan oluyordu ve dediğim gibi herhangi bir efekt falan yoktu. Aşağıdaki görsellerde daha iyi anlayacaksınız.

Daha sonra char_battle.cpp dosyasında şu bloğa geldim;

C++:
Genişlet Daralt Kopyala
            if (iPenetratePct) // DİKKAT! BU İF SATIRINDAN 2 TANE VAR.
            {
              
                //°üÅëŸ°İ ÀúÇ× °ª Àû¿ë.
                iPenetratePct -= GetPoint(POINT_RESIST_PENETRATE);

                if (number(1, 100) <= iPenetratePct)
                {
                    IsPenetrate = true;

                    if (test_server)
                        ChatPacket(CHAT_TYPE_INFO, LC_TEXT("°üÅë Ãß°¡ µ¥¹ÌÁö %d"), GetPoint(POINT_DEF_GRADE) * (100 + GetPoint(POINT_DEF_BONUS)) / 100);
                    dam += GetPoint(POINT_DEF_GRADE) * (100 + GetPoint(POINT_DEF_BONUS)) / 100;
                }


Yukarıda bahsettiğim olaya sebep olan satır şurası;
C++:
Genişlet Daralt Kopyala
                    dam += GetPoint(POINT_DEF_GRADE) * (100 + GetPoint(POINT_DEF_BONUS)) / 100;

Şimdi komple bu kod bloğunun bu haliyle nasıl bir delici etkisi yarattığına bakalım:
(Karakterde sadece %15 Delici Vuruş Şansı var ve metin taşına bakarsanız hiç bir kritik/delici efektinin olmadığını görebilirsiniz.)

delici1.gif


Gördüğünüz gibi damagede ortalama +200 gibi ufak bir fark yaratıyor ve delicinin geldiğine dair efekte dair hiç bir şey yok. Bu değerler benim için çok çok az olduğu için düzenleme ihtiyacı duydum.
O yüzden şu satırı;

C++:
Genişlet Daralt Kopyala
                    dam += GetPoint(POINT_DEF_GRADE) * (100 + GetPoint(POINT_DEF_BONUS)) / 100;

Şu şekilde değiştirdim;
C++:
Genişlet Daralt Kopyala
    if (type == DAMAGE_TYPE_NORMAL || type == DAMAGE_TYPE_NORMAL_RANGE)
    {
        dam *= 1.4; // ---> örn: 900 civarı damageye karşılık = 1300 civarı damage gelecek
        EffectPacket(SE_CRITICAL);
        EffectPacket(SE_PENETRATE);
    }
    else
    {
        dam += GetPoint(POINT_DEF_GRADE) * (100 + GetPoint(POINT_DEF_BONUS)) / 100; //orjinal değerler
        EffectPacket(SE_PENETRATE);
    }

Bu kodun getirdiği sonuç ise şu şekilde;
(Karakterde sadece %15 Delici Vuruş Şansı var ve metin taşında efekte dikkat edin)

delicii.gif


Verdiğim koda göre kendin projenize uygun olacak şekilde arttırma yapabilirsiniz. Kodda verdiğim dam *= 1.4 kısmı, düz vuruşa eklenecek oranı temsil eder.
GIF de de gördüğünüz üzere düz vuruş 900 civarlarında ve üzerine binen damage +400 civarında. Elbette bu rakamlar nokta atışı değeri bizlere vermez. +50 yada +100 gibi değişkenlik gösterebilir ama sınır olarak bizim belirlediğimiz oranı baz alır.(1.4)

Başka bir örnekle: kodda verdiğim 1.4 oranı, düz 5k vuran bir karakter için delicinin de gelmesiyle beraber yaklaşık 7k vurması demektir.
Düz 10k vuran bir karakter için ise deliciyle beraber 14k vurması demektir.
Yani deliciden gelen hasar, düz hasar ile doğru orantılıdır(orjinalinde de böyledir ancak biz burada değeri kendimiz belirlemiş oluyoruz.)
Bu yüzden belirleyeceğiniz oranı dikkatli ve projenize uygun olarak belirlemelisiniz. Aksi takdirde ilerleyen zamanlarda absürd sonuçlarla karşılaşabilirsiniz.

Ek bilgi: Neden delici vuruşta kritik efekti kullanıyorsun? diye sorabilirsiniz. Pek bir numarası yok, ben öyle istedim :D Kritik efekti sesli ve daha belirgin olduğu için daha uygun geldi.

İyi çalışmalar.
 
Son düzenleme:
SE_PENETRATE

bunun karşılığı olması lazım clientte, sende olmadığı için efekt çıkmıyor. delici vuruş hasarı normalde arttırmaz, savunmaları yok sayar.

100 kılıç savunması olan bir karaktere normal 500 vuruyorsan kritik 1000 vurursun ancak delici ile karakterin kılıç savunması 0 olduğunda ne kadar vuruyorsan o kadar vurursun(defans puanına bağımlı).


kısacası delici sadece savunmaları yok sayar, kritik vuruş gibi kendiliğinden hasar arttırmaz.
 
SE_PENETRATE

bunun karşılığı olması lazım clientte, sende olmadığı için efekt çıkmıyor. delici vuruş hasarı normalde arttırmaz, savunmaları yok sayar.

100 kılıç savunması olan bir karaktere normal 500 vuruyorsan kritik 1000 vurursun ancak delici ile karakterin kılıç savunması 0 olduğunda ne kadar vuruyorsan o kadar vurursun(defans puanına bağımlı).


kısacası delici sadece savunmaları yok sayar, kritik vuruş gibi kendiliğinden hasar arttırmaz.
Clientte karşılığı var zaten o yönden bir sıkıntı yok. İlk verdiğim kodda SE_PENETRATE tanımı varsayılan olarak tanımlanmamış. Etki işliyor ama efekt tanımlanmamış yani. Düzenledikten sonraki halinde efekt de sorunsuz görünmeye başladı doğal olarak.
Ayrıca evet delicinin hasar arttırmaktan ziyade savunmayı "deldiği" bir gerçek. Ancak dediğim gibi, varsayılan değeri/niteliği benim projeme göre az geldiği için bu şekilde bir nevi değeri kendim belirlemek istedim.

Zaten bu yüzden konuyu "Fix" adı altında değil de, "Düzenleme" adı altında açmayı daha doğru buldum. İsteyen istediği gibi kullanabilir.
 
aslında bu karakterlere loldeki gibi kritik vurunca farklı bir vuruş animasyonu yapmak lazım yok mu modellemeden anlayan bir babayiğit ?
 
aslında bu karakterlere loldeki gibi kritik vurunca farklı bir vuruş animasyonu yapmak lazım yok mu modellemeden anlayan bir babayiğit ?
Lol hiç oynamadım, o yüzden orda nasıl bir animasyon yada kritik olayı vs. var bilmiyorum.
Ama metin2 için şunu söyleyebilirim, tek başına animasyonun(modellemenin) yeteceğini sanmıyorum.
Çünkü bilindiği üzere kritik vuruş dediğimiz olay, anlık gerçekleşen bir olay ve ayrıca sabit bir olay da değil. Yani 5 skilden 1inde de kritik gelebiliyor, 10 skilden 1inde de kritik gelebiliyor. Hatta bazen bu oranlar daha da genişliyor.

Bunu göz önüne aldığımızda aklıma gelen tek şey, animasyon ve modelden önce karakterin ne zaman kritik vuracağını önceden belirleyen ve bilen bir kodlama yapmak gerekiyor. Ve karakter kritik vuruş yapacağı zaman(yapmadan hemen önce) bu noktada animasyon olaya dahil olabilir.
Yani kritik vuracağı belli olduğu an, karakter bahsettiğimiz animasyonu kullanacak.
Bu da düşünüldüğü zaman pek kolay bir şey değil gibi görünüyor :) imkansız değil elbette ama baya bir uğraş gerektirir.
 
Lol hiç oynamadım, o yüzden orda nasıl bir animasyon yada kritik olayı vs. var bilmiyorum.
Ama metin2 için şunu söyleyebilirim, tek başına animasyonun(modellemenin) yeteceğini sanmıyorum.
Çünkü bilindiği üzere kritik vuruş dediğimiz olay, anlık gerçekleşen bir olay ve ayrıca sabit bir olay da değil. Yani 5 skilden 1inde de kritik gelebiliyor, 10 skilden 1inde de kritik gelebiliyor. Hatta bazen bu oranlar daha da genişliyor.

Bunu göz önüne aldığımızda aklıma gelen tek şey, animasyon ve modelden önce karakterin ne zaman kritik vuracağını önceden belirleyen ve bilen bir kodlama yapmak gerekiyor. Ve karakter kritik vuruş yapacağı zaman(yapmadan hemen önce) bu noktada animasyon olaya dahil olabilir.
Yani kritik vuracağı belli olduğu an, karakter bahsettiğimiz animasyonu kullanacak.
Bu da düşünüldüğü zaman pek kolay bir şey değil gibi görünüyor :) imkansız değil elbette ama baya bir uğraş gerektirir.
kritik 100 üzerinden hesaplanıyor. karakter kritik vuruş yapacağı zaman normal vuruş animasyonundan farklı bir vuruş animasyonu kullanıyor(düz vuruşlar için sadece). metin2 de de düz vuruşlar 100 üzerinden hesaplanmıyor mu ? bunun için sourceye bir kontrol eklenmesi yeterli gibi sanki.
 
kritik 100 üzerinden hesaplanıyor. karakter kritik vuruş yapacağı zaman normal vuruş animasyonundan farklı bir vuruş animasyonu kullanıyor(düz vuruşlar için sadece). metin2 de de düz vuruşlar 100 üzerinden hesaplanmıyor mu ? bunun için sourceye bir kontrol eklenmesi yeterli gibi sanki.
Evet bir kontrol ile bu işlem yapılabilir kontrol tek başına ne kadar anlam ifade eder emin değili. Enine boyuna düşünmek lazım nasıl yapılacağı. Mesela harici bir skill animasyonu olarak tanımlanacaksa, client src ve pythona kadar uzanan kod yazmak lazım. Belki de yanlış düşünüyorumdur emin değilim ama genel animasyonların işleniş tarzını düşününce pek de kısa bir işlem değil gibi görünüyor.
 
Evet bir kontrol ile bu işlem yapılabilir kontrol tek başına ne kadar anlam ifade eder emin değili. Enine boyuna düşünmek lazım nasıl yapılacağı. Mesela harici bir skill animasyonu olarak tanımlanacaksa, client src ve pythona kadar uzanan kod yazmak lazım. Belki de yanlış düşünüyorumdur emin değilim ama genel animasyonların işleniş tarzını düşününce pek de kısa bir işlem değil gibi görünüyor.
skil animasyonu değil bak düz vuruş animasyonu skillerle alakası yok dediğimi anlatamıyorum sanırsam. düz vuruşlara kritik girdiğinde farklı bir animasyon verilicek o kadar yani combo muhabbetine ekleme yapılabilir.
 
skil animasyonu değil bak düz vuruş animasyonu skillerle alakası yok dediğimi anlatamıyorum sanırsam. düz vuruşlara kritik girdiğinde farklı bir animasyon verilicek o kadar yani combo muhabbetine ekleme yapılabilir.
Demek istediğini anladım fakat söylediğin şeyin hiç bir farkı yokki. İster skil türünde olsun ister düz vuruş olsun ister duygulardaki animasyonlar gibi olsun. Dediğin gibi comboya eklenme yapılacak olsa bile animasyonların hepsi bir şekilde packet aracılığı ile çalışıyor ve hepsi client src+server src+python üçlüsü içinde çalışıyor. Eğer böyle bir şey yapılacaksa mecburen bu üçüne de girmek gerekiyor. Demek istediğim buydu.

Fakat fikri sevdim, elimde bir çok farklı metin2 animasyonları mevcut halihazırda. Müsait bir zamanda belki bunu bir deneyebilirim.
 
Demek istediğini anladım fakat söylediğin şeyin hiç bir farkı yokki. İster skil türünde olsun ister düz vuruş olsun ister duygulardaki animasyonlar gibi olsun. Dediğin gibi comboya eklenme yapılacak olsa bile animasyonların hepsi bir şekilde packet aracılığı ile çalışıyor ve hepsi client src+server src+python üçlüsü içinde çalışıyor. Eğer böyle bir şey yapılacaksa mecburen bu üçüne de girmek gerekiyor. Demek istediğim buydu.

Fakat fikri sevdim, elimde bir çok farklı metin2 animasyonları mevcut halihazırda. Müsait bir zamanda belki bunu bir deneyebilirim.
hayır sen skillere dedin ya bi ara ben onu kastetmemiştim. zaten skiller içinde olsa bu iş çok uğraştırıcı ve saçma olur fakat loldeki mantığı görmediğin için sana göstereyim.


 
hayır sen skillere dedin ya bi ara ben onu kastetmemiştim. zaten skiller içinde olsa bu iş çok uğraştırıcı ve saçma olur fakat loldeki mantığı görmediğin için sana göstereyim.



Anladım. Full çarlarda düz vuruşlarda kritik daha çok patladığı için bir çok kez animasyonun değişmesi gerekecek. Kombo gibi düşün yani.
Bu animasyonun da komboya çok benzer bir animasyon olması lazım, Ki düello esnasında atak hareketlerini olumsuz etkilemesin..
Dediğin olayı anladım, ama kodlama kısmı halledilse bile animasyonun uyumluluğu da çok önemli bir etken. Her türlü modelci bir arkadaş şart :D
 
Kritik vurunca zaten karakterin üstünde bir blow efekti olmuyor mu? Eğer kritik vurduğunda aynı düz vuruşun değişmesini istiyorsan karakterler genelde 4 kere attack yapıp bitiriyorlar (Kombo ve ninja hariç) o yüzden bu 4 vuruş esnasında göze farklı gelmeyecek ve vuruş mekaniğini etkilemeyecek bir ayrı animasyon bana mantıklı gelmedi, onun yerine blow efekti değiştirilebilir. Delici unsuru için de aynı şekilde delici efekti client kısmında var. Delici vurduğunuz zaman karşıdaki oyuncunun defansını yok sayıp hasara ekler. Basit olarak 200 savunmanız varsa ve karşı adam 1300 vurucaksa bu hasar 1100'e düşer. Lakin delici girerse 1300 hasarı görürsünüz. Ninjaların suralarla ws atma senaryosunu gözünüzde canlandırabilirsiniz.
aslında bu karakterlere loldeki gibi kritik vurunca farklı bir vuruş animasyonu yapmak lazım yok mu modellemeden anlayan bir babayiğit ?

Yaptığınız düzenleme bir nevi doğru fakat yanlış noktalardan biri 1 damage type'ı için neden 2 efekt göndermek bunun yerine olan delici efektinin dosyasına bakıp dds'sini boyayıp güzel bir şey çıkartabikirsiniz ortaya. Ekstra olarak dam *= 1.4 yüksek damagelerde absürt hasarlara yol açabilir ama konuda da belirttiğin gibi tamamen senin oyun yapına kalmış bir şey.
 
Kritik vurunca zaten karakterin üstünde bir blow efekti olmuyor mu? Eğer kritik vurduğunda aynı düz vuruşun değişmesini istiyorsan karakterler genelde 4 kere attack yapıp bitiriyorlar (Kombo ve ninja hariç) o yüzden bu 4 vuruş esnasında göze farklı gelmeyecek ve vuruş mekaniğini etkilemeyecek bir ayrı animasyon bana mantıklı gelmedi, onun yerine blow efekti değiştirilebilir. Delici unsuru için de aynı şekilde delici efekti client kısmında var. Delici vurduğunuz zaman karşıdaki oyuncunun defansını yok sayıp hasara ekler. Basit olarak 200 savunmanız varsa ve karşı adam 1300 vurucaksa bu hasar 1100'e düşer. Lakin delici girerse 1300 hasarı görürsünüz. Ninjaların suralarla ws atma senaryosunu gözünüzde canlandırabilirsiniz.


Yaptığınız düzenleme bir nevi doğru fakat yanlış noktalardan biri 1 damage type'ı için neden 2 efekt göndermek bunun yerine olan delici efektinin dosyasına bakıp dds'sini boyayıp güzel bir şey çıkartabikirsiniz ortaya. Ekstra olarak dam *= 1.4 yüksek damagelerde absürt hasarlara yol açabilir ama konuda da belirttiğin gibi tamamen senin oyun yapına kalmış bir şey.
Kritik efektinde bir problem yoktu zaten. Benim eksiklik olarak gördüğüm şey delici efekti ve deliciden gelen hasarın az olmasıydı. Projemde efsun ve damage oranları normalin biraz üzerinde olacağı için bu oran bana az gelmişti ve böyle bir çözüm ürettim kendimce. Tabi 1.4 oranı şu an için sadece bir örnek, diğer düzenlemeler yapıldıktan sonra tekrar deneyip duruma göre değiştirebilirim elbet.

Damage type kısmında yaptığım efekt düzenlemesi de bir nevi opsiyonel. Yani tercihe kalmış bir durum. Delici efektinin varsayılan hali kritik efekti kadar göze çarpmadığı için şimdilik delici vuruşta da kritik efektini kullandım. Bu da daha sonra düzenlenebilir bir durum aslında. Ben sadece kaba taslak olarak konuyu ele alıp paylaşmak istedim, artık gerisi bu düzenlemeyi uygulayacak olanların tercihine kalmış :)
 
Arkadaşlar TR'deki gibi delici %100 ün üzerine çıkınca ek hasar sağlamayı nasıl yapabilirim? karakterin üzeridneki delici şansı atıyorum %130 sa aradaki farkın yani 30un 3te1ni ek hasar olarak vermesini istiyorum(normal delici hasarı üzerine) atıyorum 10.000 normal vuruyor delici %100deyken 11000 vuruyo olsun fakat %130 gibi değere çıktığında 11000+1000=12000 olsun istiyorum. TRde de yaklaşık böyle bir hasar artışı oluyor.
 
Arkadaşlar TR'deki gibi delici %100 ün üzerine çıkınca ek hasar sağlamayı nasıl yapabilirim? karakterin üzeridneki delici şansı atıyorum %130 sa aradaki farkın yani 30un 3te1ni ek hasar olarak vermesini istiyorum(normal delici hasarı üzerine) atıyorum 10.000 normal vuruyor delici %100deyken 11000 vuruyo olsun fakat %130 gibi değere çıktığında 11000+1000=12000 olsun istiyorum. TRde de yaklaşık böyle bir hasar artışı oluyor.
Damage bonusunu savunmasına ekleyip çarptırdım hesaplamasını doğru bir şekilde yapabilirseniz mantık bu.
C++:
Genişlet Daralt Kopyala
                    //char_battle.cpp
                   //ara
                    dam += GetPoint(POINT_DEF_GRADE) * (100 + GetPoint(POINT_DEF_BONUS)) / 100;
                   // değiş
                    if (iPenetratePct > 100)
                    {
                        int iDamBonus = iPenetratePct % 100;
                        dam += (GetPoint(POINT_DEF_GRADE) + iDamBonus)* (100 + GetPoint(POINT_DEF_BONUS)) / 100;
                    }
                    else
                    {
                        dam += GetPoint(POINT_DEF_GRADE) * (100 + GetPoint(POINT_DEF_BONUS)) / 100;
                    }
 
Damage bonusunu savunmasına ekleyip çarptırdım hesaplamasını doğru bir şekilde yapabilirseniz mantık bu.
C++:
Genişlet Daralt Kopyala
                    //char_battle.cpp
                   //ara
                    dam += GetPoint(POINT_DEF_GRADE) * (100 + GetPoint(POINT_DEF_BONUS)) / 100;
                   // değiş
                    if (iPenetratePct > 100)
                    {
                        int iDamBonus = iPenetratePct % 100;
                        dam += (GetPoint(POINT_DEF_GRADE) + iDamBonus)* (100 + GetPoint(POINT_DEF_BONUS)) / 100;
                    }
                    else
                    {
                        dam += GetPoint(POINT_DEF_GRADE) * (100 + GetPoint(POINT_DEF_BONUS)) / 100;
                    }
hocam if'in içini şöyle yapsak mantıksal olarak doğru yapmış olur muyum:
C++:
Genişlet Daralt Kopyala
                    if (iPenetratePct > 100)
                    {
                        int iDamBonus = (iPenetratePct -100)/3;
                        dam += GetPoint(POINT_DEF_GRADE) * (100 + GetPoint(POINT_DEF_BONUS)) / 100 +dam*iDamBonus ;

editledim.
 
Son düzenleme:
hocam if'in içini şöyle yapsak mantıksal olarak doğru yapmış olur muyum:
C++:
Genişlet Daralt Kopyala
                    if (iPenetratePct > 100)
                    {
                        int iDamBonus = iPenetratePct % 100;
                        dam += GetPoint(POINT_DEF_GRADE) * (100 + GetPoint(POINT_DEF_BONUS)) / 100 + (GetPoint(POINT_DEF_GRADE) * (100 + GetPoint(POINT_DEF_BONUS)) / 100)*iDamBonus ;
Tam olarak 100den sonraki kısım nasıl işliyor bilmediğim için hesaplamasında kesin bir şey söylemem mümkün değil. İşlem önceliklerine dikkat edip oyunda deneyebilirsiniz.
 
Tam olarak 100den sonraki kısım nasıl işliyor bilmediğim için hesaplamasında kesin bir şey söylemem mümkün değil. İşlem önceliklerine dikkat edip oyunda deneyebilirsiniz.
Metin2'nin belki yabancı wikilerinde hesaplanışı anlatılıyordur, fakat yapmak istediğim 100 üzerindeki delici değeri d, düz hasar x, 100 ve 100'ün altındaki delici hasar y, 100 üzeri delici hasarı z olsun olmasını istediğim şey hocam: z=x*(d-100)/3 + y denkleminde olması yukarıda verdiğim if'in içi algorithmik olarak buna çıkıyor mu
eskisini editledim"
 
Metin2'nin belki yabancı wikilerinde hesaplanışı anlatılıyordur, fakat yapmak istediğim 100 üzerindeki delici değeri d, düz hasar x, 100 ve 100'ün altındaki delici hasar y, 100 üzeri delici hasarı z olsun olmasını istediğim şey hocam: z=x*(d-100)/3 + y denkleminde olması yukarıda verdiğim if'in içi algorithmik olarak buna çıkıyor mu
eskisini editledim"
Bi oyunda deneyin delici değerlerini 150-200'e çıkartın kendi düzenlediğiniz şekliyle, çünkü yukarıda verdiğiniz z ='li denklemi inceleyince bir şey anlamadım.
 
Geri
Üst