Nauka umiejętności i atrybutów automatycznie podczas walki (jak w TES) 3717 6

O temacie

Autor pagi111

Zaczęty 25.07.2020 roku

Wyświetleń 3717

Odpowiedzi 6

pagi111

pagi111

Użytkownicy
posty51
Propsy2
Profesjabrak
  • Użytkownicy
Siemanko,

Chcę zrobić tak, żeby postać uczyła się skilli (np. 1h, bow, itp.) i atrybutów podczas walki. Czyli np. uderzę kogoś 50 razy, to dostaje +1 do 1h. Znalazłem ten wątek: https://themodders.org/index.php?topic=17761.0 , w którym Avallach proponował umieszczenie w funkcjach B_MM_AssessDamage i B_AssessDamage warunku if (C_BodyStateContains(hero, BS_HIT)) i po tym dodanie swojej funkcji. Tyle zrobiłem i wydaje się działać w porządku.

Problem polega na tym, że to jest tylko do walki w zwarciu, a nie wiem jaki jest warunek do walki dystansowej oraz używania magii.

Przejrzałem listę bodystates, ale nie widzę tam nic do walki dystansowej, a np. BS_CASTING nie działa przy rzucaniu czaru (więc w sumie nie wiem od czego to jest).
 

Siemekk

Siemekk

Złote Wrota
posty2143
Propsy1153
ProfesjaProgramista
  • Złote Wrota
W funkcji ZS_Dead sprawdzasz czy npct'a zabił gracz. Jeśli zabił, to sprawdzasz jego fightMode i za jego pomocą dodajesz do zmiennych odpowiednie wartości.
 

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

pagi111

pagi111

Użytkownicy
posty51
Propsy2
Profesjabrak
  • Użytkownicy
Dzięki. Przy czym to jest tylko w przypadku zabicia NPCa. Od biedy ujdzie, ale wolałbym zrobić tak, żeby bonus do skilla zliczał się nie przy zabiciu, tylko przy uderzeniu. Czyli tak jak jest w przypadku BS_HIT. Skoro jest coś takiego jak BS_HIT dotyczący walki w zwarciu, to chyba musi też być jakiś BS dotyczący walki na dystans i magii? :D No a jeśli nie BS to może jest jakiś inny sposób, żeby to zrobić przy uderzeniu/strzale/rzuceniu czaru (zwłaszcza, że niektóre czary nie są do zabijania :P), a nie zabiciu NPCa?
 

Khantor

Khantor

Użytkownicy
posty59
Propsy12
Profesjabrak
  • Użytkownicy
Najlepszym pomysłem jaki przychodzi mi do głowy to powsadzanie tych warunków do skryptu który wylicza zadawane obrażenia. Ma to też taką zaletę, że poza możliwością napisania własnych formuł obrażeń (np. nie proste obrażenia + siła - obrona tylko cokolwiek innego), możesz zrobić nabijanie statystyk tak jak to było np. w Returningu na Slash&Craft, czyli nie np. + 1 walki bronią po uderzeniu 50 razy, co można bardzo łatwo nadużywać, a np. + 1 do walki bronią po zadaniu nią określonej ilości obrażeń (i co poziom zwiększać wymagany próg tak jak jest to dla expa i lvla).
Potrzebny Ikarus i LeGo.

Podstawowy temat do zapoznania:
https://themodders.org/index.php?topic=23935.0
Wtedy do funkcji "DMG_OnDmg", zaraz przed "return dmg;" raczej wystarczyłoby wstawić to:

var c_item c_item_Weapon_Attack_Count_Damage; c_item_Weapon_Attack_Count_Damage = Npc_GetReadiedWeapon(attackerNpc);
var oCItem Weapon_Attack_Count_Damage; Weapon_Attack_Count_Damage = _^(MEM_InstToPtr(c_item_Weapon_Attack_Count_Damage));

if ((Hlp_GetInstanceID(attackerNpc) == Hlp_GetInstanceID(hero))
&& (victimNpc.aivar[AIV_VictoryXPGiven] == FALSE)) // <- żeby na raz pobitym NPC nie dało się farmić statystyk w nieskończoność.
{
if (dmg > 0)
{
if (Npc_IsInFightMode (hero, FMODE_MELEE))
{
attackerNpc.aivar[97] += 1;
}
else if (Npc_IsInFightMode (hero, FMODE_FAR))
{
attackerNpc.aivar[98] += 1;
}
else if (Npc_IsInFightMode (hero, FMODE_MAGIC))
{
attackerNpc.aivar[99] += 1;
};
};

if (attackerNpc.aivar[97] == 50)
{
if (Weapon_Attack_Count_Damage.flags & (ITEM_SWD | ITEM_AXE))
{
attackerNpc.hitChance[NPC_TALENT_1H] += 1;
attackerNpc.aivar[97] = 0;
}
else if (Weapon_Attack_Count_Damage.flags & (ITEM_2HD_SWD | ITEM_2HD_AXE))
{
attackerNpc.hitChance[NPC_TALENT_2H] += 1;
attackerNpc.aivar[97] = 0;
};
};

if (attackerNpc.aivar[98] == 50)
{
if (Weapon_Attack_Count_Damage.flags & (ITEM_BOW))
{
attackerNpc.hitChance[NPC_TALENT_BOW] += 1;
attackerNpc.aivar[98] = 0;
}
else if (Weapon_Attack_Count_Damage.flags & (ITEM_CROSSBOW))
{
attackerNpc.hitChance[NPC_TALENT_CROSSBOW] += 1;
attackerNpc.aivar[98] = 0;
};
};
};

Jeśli nie zależy ci na tym, żeby ilość zadanych uderzeń była przypisana do konkretnego NPC (czyli np. uderzenie kogoś 49 razy będąc PC_HERO a potem wcielenie się na marvinie przez "O" w innego NPC i uderzenie kogoś raz nie dałoby ci + 1 do walki, bo PC_HERO uderzył 49 razy a inny NPC 1 raz), to zamiast wstawionych przeze mnie aivarów możesz użyć zmiennych.

To dawałoby ci opisywany przez ciebie efekt. Rzecz jasna to co opisałeś to mega prosta wersja nabijania statystyk przez walkę, więc polecam się w to bardziej zagłębić i pokombinować chociażby z naliczaniem statystyk po zadaniu określonej ilości obrażeń, a nie od uderzeń.
 

Simon Said

Simon Said

Moderator
Nilfgaard
posty6473
Propsy3037
ProfesjaTester
  • Moderator
  • Nilfgaard
O ile mnie pamięć nie myli to w Gothic Wielka Wojna Demo taki system był zastosowany, ale nie wiem w sumie nawet, czy to działało czy po prostu zmieniało cyferkę xD W tym modzie takie rzeczy, by mnie nie zdziwiły.
 
http://chomikuj.pl/gothicwarrior

https://www.youtube.com/watch?v=UCMTYnPVyFu



pagi111

pagi111

Użytkownicy
posty51
Propsy2
Profesjabrak
  • Użytkownicy
Wow @Khantor. Szczerze mówiąc sam myślałem o tym DMG_OnDmg, ale pewnie nie byłbym w stanie tego do końca sam napisać, więc super dzięki za ten sposób ;) do tego fajnie, że pomyślałeś o tym, żeby na raz pobitym NPC nie dało się farmić.

Zresztą myślałem, że jest prostszy sposób, jak np z tym bs_hit, no ale koniec końców z funkcją DMG_OnDmg może to nawet działać lepiej, więc spoko.

Sprawdzę to pewnie jutro albo jakoś w tym tygodniu, ale myślę, że powinno to działać dobrze.

Jeszcze tylko kwestia co np z czarami, które nie zadają DMG :p Tak, żeby też dało się zwiększać manę czy cokolwiek na czarach typu przywołania czy nawet światło :D
 

Khantor

Khantor

Użytkownicy
posty59
Propsy12
Profesjabrak
  • Użytkownicy
Wchodzisz do "_Work/Data/Scripts/Content/AI/Magic/Spells" i otwierasz plik z interesującym cię czarem, np. światło (plik "Spell_Light_Alle.d"). Zjeżdżasz do linijki "Spell_Cast_Light" i przed "self.aivar[AIV_SelectSpell] += 1;" wstawiasz analogiczny warunek, np:

if (Hlp_GetInstanceID(self) == Hlp_GetInstanceID(hero))
{
   hero.aivar[96] += 1;
};

if (hero.aivar[96] == 50)
{
    hero.attribute[ATR_MANA_MAX] += 1;
    hero.attribute[ATR_MANA] += 1;
    hero.aivar[96] = 0;
};

Chociaż tych spelli nie zadających obrażeń jest na tyle dużo a wolnych aivarów tak mało, że zamiast aivarów wstaw tam zmienne, albo wszystkie zaklęcia nie zadające obrażeń wsadź do wspólnego aivara. Ogólnie jeśli chodzi o zaklęcia przywołania, to śmiało możesz w skrypcie obrażeń napisać, że obrażenia zadawane przez summony będą naliczane do twojej puli obrażeń i od obrażeń od summonów to tobie będą się naliczały statystyki.
 


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