Problem z warunkiem w obrażeniach 2740 2

O temacie

Autor IceMan

Zaczęty 26.04.2020 roku

Wyświetleń 2740

Odpowiedzi 2

IceMan

IceMan

Użytkownicy
posty68
Propsy6
Profesjabrak
  • Użytkownicy
Witam  :)
Chciałem przerobić system obrażeń ten z G1 na ten z G2NK - jak wiadomo formuła ta w drugiej części to (Atrybut + dmg broni - armor - 1)/10 a kiedy uderzy kryt nie dzieli na 10. natomiast w G1 z tego co zauważyłem było jakoś tak: (Atrybut + dmg broni - armor) a kiedy krytyczny cios to: (atrybut + dmg broni * 2 - armor). I teraz tak mam już zrobiony skrypt. działa to z Hookiem, ale w samej funkcji mam problem z warunkiem:

func int DMG_OnDmg(var int victimPtr, var int attackerPtr, var int dmg)
{
var string concatText;
var c_npc slf;
slf = _^(attackerptr);
var c_npc oth;
oth = _^(victimPtr);
var int damage;

if(Npc_IsInFightMode(slf,FMODE_FIST))
{
dmg = (slf.attribute[ATR_STRENGTH] - oth.protection[PROT_BLUNT]);
PrintS_Ext("damage fist",RGBA(255,   255, 255,   255));
};
    if(dmg < MinimalDMG )
    {
    dmg = MinimalDMG ;
PrintS_Ext("minimalny dmg fist",RGBA(255,   255, 255,   255));
    };


if (Npc_HasReadiedWeapon(slf))
{
var c_item wpn;
wpn = Npc_GetReadiedWeapon(slf);
var int wpnDmg;
wpnDmg = wpn.damageTotal;
    var int armRes;
concatText = IntToString(wpn.flags);
PrintS_Ext(concatText,RGBA(255,   255, 255,   255));

If wpn.damagetype == DAM_EDGE
{
armRes = oth.protection[PROT_EDGE];
}
else if wpn.damagetype == DAM_BLUNT
{
armRes = oth.protection[PROT_BLUNT];
}
else if wpn.damagetype == DAM_POINT
{
armRes = oth.protection[PROT_POINT];
}
else if wpn.damagetype == DAM_FIRE
{
armRes = oth.protection[PROT_FIRE];
}
else if wpn.damagetype == DAM_MAGIC
{
armRes = oth.protection[PROT_MAGIC];
};

if ((ITEM_2HD_AXE || ITEM_2HD_SWD || ITEM_AXE ||ITEM_SWD) & wpn.flags) /////////////////nie działa
{
damage = (wpnDmg + slf.attribute[ATR_STRENGTH]);
PrintS_Ext("damage melee weapon",RGBA(255,   255, 255,   255));
}

if ((ITEM_BOW || ITEM_CROSSBOW) & wpn.flags) ////////////////////nie działa
{
damage = (wpnDmg + slf.attribute[ATR_DEXTERITY]);
};

damage = (damage -armRes)/10;
var int ChanceForCrit;
ChanceForCrit = 0;

if ((ITEM_2HD_AXE || ITEM_2HD_SWD) & wpn.flags) /////////////////nie działa
{
ChanceForCrit = Npc_GetTalentValue(slf,NPC_TALENT_2H);
};

if ((ITEM_AXE || ITEM_SWD) & wpn.flags) /////////////////nie działa
{
ChanceForCrit = Npc_GetTalentValue(slf,NPC_TALENT_1H);
};

if (ITEM_BOW & wpn.flags) /////////////////nie działa
{
ChanceForCrit = Npc_GetTalentValue(slf,NPC_TALENT_BOW);
};

if (ITEM_CROSSBOW & wpn.flags) /////////////////nie działa
{
ChanceForCrit = Npc_GetTalentValue(slf,NPC_TALENT_CROSSBOW);
};

if(Hlp_Random(100) < chanceForCrit){
    damage = damage * 10;
};


if (damage < 0)
{
damage = 5;
};
dmg = damage;

};

return dmg;
};

To co zaznaczyłem na czerwono po prostu się nie odpala w grze. Kiedy dałem zamiast tego np: if Npc_HasReadiedMeleeWeapon(slf)Wtedy odnajduje broń i wykonuje się wszystko perfect, ale nie mogę tego dać ze względu na cios krytyczny gdzie jest podział na 1H i 2H. Dawałem też warunki typu: if wpn.flags = ITEM_SWDAle nie przynosi to żadnego skutku.
Dodam, że potwory walczą za pomocą pięści i funkcja działa, kiedy dałem warunek z typami broni to czasami potwory mają dziwnie duże obrażenia, natomiast kiedy jest warunek z HasReadiedMeleeWeapon to już tego nie ma.

Czy ktoś wie gdzie został popełniony błąd? Staram się metodą prób i błędów ale bez efektów od dłuższego czasu :(
 

Siemekk

Siemekk

Złote Wrota
posty2143
Propsy1153
ProfesjaProgramista
  • Złote Wrota
Sprawdzanie flagi to operacja bitowa.
Należy ja sprawdzić tak if(if.flags & (ITM_SWD | ITM_AXE))
 

P.S A Splash w szafie i nie ma psychy by mi dać bana.

IceMan

IceMan

Użytkownicy
posty68
Propsy6
Profesjabrak
  • Użytkownicy
Dzięki wielkie, przez cały dzień siedząc nad tym nie pomyślałem...
Temat do zamknięcia.
 


0 użytkowników i 1 Gość przegląda ten wątek.
0 użytkowników
Do góry