Nowy rodzaj broni i animacja do niego w Gothicu 2 NK 7336 16

O temacie

Autor pagi111

Zaczęty 21.12.2017 roku

Wyświetleń 7336

Odpowiedzi 16

pagi111

pagi111

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

Ostatnio postanowiłem się zająć tworzeniem animacji i wpadłem na pomysł, że fajnie by było dodać nowy styl walki. Chciałbym jednak, żeby ten nowy styl był dedykowany dla nowego rodzaju broni. Na razie myślałem o kosturach, a jeśli ogarnę jak się to robi i nie zajmie mi to wieczności to pomyślę też o innych. No i tu pojawiają się 2 pytania:

1) pierwsza i najważniejsza sprawa to kwestia tego w jakim pliku (i gdzie dokładnie) jest zapisana informacja o tym, która animacja jest odpowiednia do którego rodzaju broni. Tzn. skąd gra "wie", że do broni jednoręcznej ma odtwarzać animacje 1h a do broni dwuręcznej 2h. Patrząc na skrypty broni, zakładam, że zależy to od "flagi" przedmiotu. O ile pamiętam, to są już w Gothicu flagi mieczy 1h, 2h i toporów 1h i 2h, chociaż w grze topory i miecze niczym się nie różnią (chyba, że jest coś, czego nie widać na pierwszy rzut oka). Wyobrażam sobie, że powinien być jakiś plik, w którym jest zapisane, żeby Gothic dla flagi np. item_SWD odtwarzał animację broni jednoręcznej, a np. dla flagi item_2HD_AXE animację do broni dwuręcznej.

2) druga rzecz to w jaki sposób można dodać do Gothica nowy rodzaj broni? Znowu - zakładam, że chodzi tutaj o "flag". Pytanie brzmi czy da się zdefiniować jakąś nową flagę broni (zakładam, że JAKOŚ musi się dać), a jeśli tak, to w jakim pliku jest informacja o flagach (być może to ten sam plik, o który mi chodzi w pytaniu 1, chociaż różnie może być). Nawet jeśli nie dałoby się dodać nowej flagi (bo np. gra ma akurat limit maks. 4 flag), to mógłbym zmienić np. animację dla flagi toporów na inną niż dla mieczy, bo w wersji podstawowej niczym się one nie różnią.

Podsumowując, interesują mnie dwie kwestie: w jaki sposób dodać nowy rodzaj broni i w jaki sposób zdefiniować animację dla danego rodzaju broni.

Pozdrawiam  :lol2:
 

Bogdan Zwei

Bogdan Zwei

Użytkownicy
Wulgarny skurwiel pierdolony.
posty1864
Propsy541
Profesjabrak
  • Użytkownicy
  • Wulgarny skurwiel pierdolony.
1. Silnik.
2. Silnik.

Zapewne dałoby radę coś poczynić Ikarusami czy ASTami - tzn. da radę.
 
:ok: zachęca do dalszej pomocy. Nie zapominaj o tym!

Prywatne wiadomości typu "Ej, pomocy" kasuję od razu. Od tego jest forum, a nie PW.

To me, defeat in anything is merely temporary, and its punishment is but an urge for me to greater effort to achieve my goal. Defeat simply tells me that something is wrong in my doing; it is a path leading to success and truth.

In order to realize our true self we must be willing to live without being dependent upon the opinion of others.

TNTalib

TNTalib

Użytkownicy
posty17
Propsy10
ProfesjaSkrypter
  • Użytkownicy
Nie jestem pewny i nie chcę wprowadzać w błąd, ale kiedyś chyba jak się bawiłem animacjami to w skrypcie wybranej broni dopisywałem funkcję on_equip i dawałem ApplyOverlayMDS ze zmienioną animacją walki. Minusem jest to, że musisz dla każdej broni, w której chcesz inną animację dopisać ten element podmieniający domyślne animacje. Nowego typu broni tak łatwo niestety się nie dopisze;/
 


TNTalib

TNTalib

Użytkownicy
posty17
Propsy10
ProfesjaSkrypter
  • Użytkownicy
(...) Technicznie dalej będzie to broń 2h (...)

2h lub 1h, zależy typu w skrypcie :D Na upartego można próbować to udoskonalić dodając jakąś zmienną, która by odpowiadała za umiejętność walki taką bronią i potem w AssessDamage (jeśli się nie mylę :P) napisać jakiś modyfikator obrażeń, ale nadal bazowe obrażenia będą zależne od umiejętności walki 1h/2h. Ciekawą opcją byłoby dodanie funkcji bazowe_obrazenia + bazowe_obrazenia * procent_walki_nowa_bronia, na pierwszy rzut oka niby byłoby to marnowanie punktów umiejętności, ale później podwojone obrażenia to byłoby coś  :D
 

pagi111

pagi111

Użytkownicy
posty51
Propsy2
Profesjabrak
  • Użytkownicy
Dzięki za odpowiedzi :)

Zapewne dałoby radę coś poczynić Ikarusami czy ASTami - tzn. da radę.

Hmm, jeszcze nawet nie wiem co to są Ikarusy i ASTy. Zakładam, że to nie jest takie proste i nie ma gdzieś instrukcji krok po kroku jak to zrobić :P

Overlay MDS to zdecydowanie najlepsze rozwiązanie. Technicznie dalej będzie to broń 2h (obrażenia będą zależały od tego talentu), ale animacje będą nowe.

Mhm, to chyba dobre rozwiązanie, przynajmniej na początek. W sumie jeśli zostałbym przy kosturach, to miałoby nawet sens, gdyby one zależały od umiejętności 2H, tylko miały nową animację.

Tylko teraz tak: jak zrobić, żeby te kostury też miały 3 różne animacje, dla nowicjusza, wojownika i mistrza. Jest jakaś funkcja, która wprowadza warunek, że np. jeśli postać ma mniej niż 30% 2H, to animacja 1 (zielony), jeśli od 30 do 60 % to animacja 2 (wojownik), itd.?

można próbować to udoskonalić dodając jakąś zmienną, która by odpowiadała za umiejętność walki taką bronią

Wiesz może (albo ktoś) jak to zrobić? :)
W taki sposób dodaje się nowe umiejętności do gry? Na pewno jakoś da się dodać nową umiejętność, bo niektóre mody to robią (chociaż nie widziałem takiego, który by dodawał akurat nową um. WALKI - nie wiem czy to się czymś różni pod względem technicznym).

i potem w AssessDamage (jeśli się nie mylę :P) napisać jakiś modyfikator obrażeń (...) Ciekawą opcją byłoby dodanie funkcji bazowe_obrazenia + bazowe_obrazenia * procent_walki_nowa_bronia (...)

A gdzie jest ten AssessDamage? Wiecie jak dodać taką funkcję czy modyfikator?


Ogólnie pomysły ciekawe, może coś wykorzystam. A poza tym, to postaram się czegoś dowiedzieć o tych ASTach i Ikarusach - gdyby ktoś miał wskazówki, jak dokładnie można przy ich użyciu dodać nowy rodzaj broni, itd. to zachęcam do podzielenia się wiedzą  :cool:
 

TNTalib

TNTalib

Użytkownicy
posty17
Propsy10
ProfesjaSkrypter
  • Użytkownicy
https://themodders.org/index.php?topic=5900.0 - drugi post od góry autorstwa Oreca mówi o AssessDamage, wystarczy zrobić coś niemal identycznego tylko zamiast efektu czaru wystarczy zostawić i zmodyfikować opcję dodatkowych obrażeń.

https://themodders.org/index.php?topic=6753.0 - tutorial o dodaniu systemu reputacji, na takiej zasadzie można zrobić punkty umiejętności. Nie pamiętam czy wartość takiej zmiennej zapisywała się domyślnie podczas save gry, więc jeżeli po wczytaniu/ponownym uruchomieniu gry wartość się wyzeruje to pytaj kogoś jak to naprawić :D

Ikarusy to już raczej wyższa szkoła jazdy, więc lepiej chyba najpierw poznać podstawowe skrypty w stopniu przynajmniej średnim niż od razu patrzeć na ikarusa, bo to może być dość masochistyczne :D
 

pagi111

pagi111

Użytkownicy
posty51
Propsy2
Profesjabrak
  • Użytkownicy
Super, dzięki ;)

Jeszcze jedna sprawa: na pewno widziałem w jakimś modzie (chyba którejś wersji L'Hivera), że dodany został nowy poziom umiejętności walki bronią: arcymistrz (zaczynał się bodajże od 90 %). Czy to jest do zrobienia w podstawowych skryptach (np. poprzez ten overlaymds), czy to już też wyższa szkoła jazdy?
 

TNTalib

TNTalib

Użytkownicy
posty17
Propsy10
ProfesjaSkrypter
  • Użytkownicy
To już pewnie też ikarusy itp. ale za pomocą overlaymds możesz zrobić ile chcesz poziomów (jeżeli poziom nauki broni jest przedstawiony jako zmienna do której jest dostęp z poziomu skryptu). po prostu napiszesz coś w stylu
if (umiejetnosc_walki >=10 && umiejetnosc_walki <=30)
     {
           funkcja overlaymds
     };
i dla takiego przedziału umiejętności będzie jakaś animacja, a takich if-ów możesz wstawiać ile chcesz
 

Siemekk

Siemekk

Złote Wrota
posty2143
Propsy1153
ProfesjaProgramista
  • Złote Wrota
Stworzenie nowej flagi jest możliwe - problemem jest to, że trzeba przepisać około 8 metod klas oCNpc i oCMsgWeapon.
 

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

inż. Avallach

inż. Avallach

Administrator
posty7661
Propsy5238
NagrodyV
ProfesjaProgramista
  • Administrator
Stworzenie nowej flagi jest możliwe - problemem jest to, że trzeba przepisać około 8 metod klas oCNpc i oCMsgWeapon.
To naprawdę piękne czasy kiedy na theModders pojawia się taka odpowiedź :) Ponad 10 lat czekaliśmy na możliwość zrobienia czegokolwiek sensownego z silnikiem w przystępny sposób. Teraz "problemem jest" z pomocą AST i podobnych toolsetów brzmi dla mnie jak "wystarczy tylko" ;)
Tylko teraz tak: jak zrobić, żeby te kostury też miały 3 różne animacje, dla nowicjusza, wojownika i mistrza. Jest jakaś funkcja, która wprowadza warunek, że np. jeśli postać ma mniej niż 30% 2H, to animacja 1 (zielony), jeśli od 30 do 60 % to animacja 2 (wojownik), itd.?
wki, jak dokładnie można przy ich użyciu dodać nowy rodzaj broni, itd. to zachęcam do podzielenia się wiedzą  :cool:
To proste - animacje wyższego poziomu walki bronią już teraz są zaimplementowane jako overlay mdsy! Wystarczy więc że znajdziesz miejsca w kodzie które ustawiają te animacje w zależności od poziomu umiejętności i dopiszesz kolejny poziom rozgałęzienia wśród warunków. Wymaga to jedynie podstawowych umiejętności programistycznych - znajomości działania zmiennych oraz bloków if, else if i else.

Siemekk

Siemekk

Złote Wrota
posty2143
Propsy1153
ProfesjaProgramista
  • Złote Wrota
Cytuj
Teraz "problemem jest" z pomocą AST i podobnych toolsetów brzmi dla mnie jak "wystarczy tylko" ;)
AST umożliwia przepisanie renderu gry :D Wystarczy wiedza.  Co do tarcz (nowe flagi) w AST wykonanie takiego kodu przy znajomości metod zajmuje z jedną godzinę - wystarczy wiedzieć co jak ma działać. Co do kosturów - można stworzyć także nowy slot na kostur np. ZS_STAFF, który można aktywować z poziomu AST. (Mniej więcej tak działają wszystkie sloty - są aktywowane za pomocą metody klasy oCNpc void CreateInvSlot(zSTRING)).
Mogę się podzielić funkcjami dzięki którym dodanie nowych slotów jest możliwe (Funkcje hookowane)
// 0x007323C0 public: void __thiscall oCNpc::EquipItem(class oCItem *) //Zakładanie kostura
// 0x007326C0 public: void __thiscall oCNpc::UnequipItem(class oCItem *) //Zdjęcie kostura
// 0x00749D80 public: void __thiscall oCNpc::PutInSlot(struct TNpcSlot *,class oCVob *,int) //Zmiana slotów
// 0x007375E0 public: void __thiscall oCNpc::DropAllInHand(void) //Wypadanie kostura po pobiciu

 

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

pagi111

pagi111

Użytkownicy
posty51
Propsy2
Profesjabrak
  • Użytkownicy
To proste - animacje wyższego poziomu walki bronią już teraz są zaimplementowane jako overlay mdsy! Wystarczy więc że znajdziesz miejsca w kodzie które ustawiają te animacje w zależności od poziomu umiejętności i dopiszesz kolejny poziom rozgałęzienia wśród warunków.

Mhm. A w jakim pliku są zdefiniowane te animacje? Przepatrzyłem pliki, w których się jako tako orientuję, ale nigdzie nie znalazłem tego typu informacji.

W przypadku tych kosturów, jeśli nie bawiłbym się w ASty, to i tak ustawiałbym ten overlaymds edytując po prostu skrypt poszczególnych broni osobno. Jednak jeśli chciałbym zmienić lub dodać jakąś nową animację do już istniejących broni typu miecze czy topory, to dobrze gdybym mógł to zrobić bez edytowania każdej z tych broni z osobna.

 


pagi111

pagi111

Użytkownicy
posty51
Propsy2
Profesjabrak
  • Użytkownicy
Skorzystałem z tego VS Code - dla pewności szukałem wyrazu "overlaymds". Niestety żadna z nich nie odnosiła się do animacji zSkorzystałem z tego VS Code - dla pewności szukałem wyrazu "overlaymds". Niestety żadna z nich nie odnosiła się do animacji związanej z walką. Wpisywałem też nazwy konkretnych mdsów albo animacji walki, ale żaden z wyników nie był powiązany z poziomem umiejętności. Może informacja o tym nie jest zapisana w tych normalnych skryptach tylko gdzieś "głębiej", gdzie potrzebny jest AST?

Ale znalazłem chyba dobry trop, tylko nie wiem co dalej :)

Plik B_AddFightSkill, który znajduje się w C:\GRY\Gothic II\_Work\data\Scripts\Content\Story\B_Story najwyraźniej określa odpowiednią animację zależnie od procenta posługiwania się daną bronią. Aczkolwiek nie ma bezpośrednio w tym pliku żadnego overlaymds ani mowy o konkretnych plikach animacji. O ile dobrze zrozumiałem, ustawia on za to NPC_TALENT_1H na wartość 0, 1 albo 2 i ta wartość decyduje o animacji (chyba :P). Jednak nigdzie już nie znalazłem pliku, który by przypisywał tym wartościom konkretne animacje. Ehh, czemu to nie może być takie proste, żeby wszystko było w jednym pliku, tylko za każdym razem gdzieś trzeba czegoś szukać...  ;(

Tak wygląda fragment pliku B_AddFightSkill odnoszący się do broni 1H:
// ******************************************************************
// B_AddFightSkill
// ---------------
// setzt die Kampftalent-Ani abhängig von TrefferChance%
// (ab 30% und ab 60%)
// wird aus NPC_SetFightSkills aufgerufen (um FightSkill in NSC-Instanzen zu setzen)
// und aus B_TeachFightTalentPercent (um Player-Skill zu erhöhen)
// ******************************************************************

func void B_AddFightSkill (var C_NPC slf, var int talent, var int percent)
{
if (talent == NPC_TALENT_1H)
{
slf.HitChance[NPC_TALENT_1H] = slf.HitChance[NPC_TALENT_1H] + percent;

if (slf.HitChance[NPC_TALENT_1H] >=0) { Npc_SetTalentSkill (slf, NPC_TALENT_1H, 0); };
if (slf.HitChance[NPC_TALENT_1H] >=30) { Npc_SetTalentSkill (slf, NPC_TALENT_1H, 1); };
if (slf.HitChance[NPC_TALENT_1H] >=60) { Npc_SetTalentSkill (slf, NPC_TALENT_1H, 2); };
};

No i na razie stanąłem na tym etapie. Jakieś wskazówki co dalej? :)
 

inż. Avallach

inż. Avallach

Administrator
posty7661
Propsy5238
NagrodyV
ProfesjaProgramista
  • Administrator
Niestety z mojej strony nie. Może tego jednak nie ma w skryptach - w tym wypadku musisz podjąć inną drogą. W funkcji OnEquip przy ustawianiu overlaymdsa na ten specjalny rodzaj broni, dodaj warunek który sprawdza jaki jest poziom skilla (tak jak w skrypcie który znalazłeś) i zależnie od tego ustawia inny mds.

Mikotsune

Mikotsune

Czas Honoru
posty365
Propsy289
Profesjabrak
  • Czas Honoru
Za dużo roboty. Trzeba będzie dodawać to do każdej broni w której chcesz zmienić animacje.
Prościej będzie edytować B_AddFightSkill

Przykład dwuręcznej broni:
if(talent == NPC_TALENT_2H)
{
self.hitchance[NPC_TALENT_2H] = self.hitchance[NPC_TALENT_2H] + percent;

if(self.hitchance[NPC_TALENT_2H] > 100)
{
self.hitchance[NPC_TALENT_2H] = 100;
};

if(self.hitchance[NPC_TALENT_2H] >= 75)
{
if(Hlp_GetInstanceID(self) == Hlp_GetInstanceID(hero))
{
Npc_SetTalentSkill(self,NPC_TALENT_2H,3);
};
Mdl_ApplyOverlayMds(self,"humans_2hST3.mds");
Mdl_RemoveOverlayMds(self,"humans_2hST1.MDS");
Mdl_RemoveOverlayMds(self,"humans_2hST2.MDS");
};

if((self.hitchance[NPC_TALENT_2H] >= 50) && (self.hitchance[NPC_TALENT_2H] < 75))
{
if(Hlp_GetInstanceID(self) == Hlp_GetInstanceID(hero))
{
Npc_SetTalentSkill(self,NPC_TALENT_2H,2);
};
Mdl_ApplyOverlayMds(self,"humans_2hST2.mds");
Mdl_RemoveOverlayMds(self,"humans_2hST1.MDS");
Mdl_RemoveOverlayMds(self,"humans_2hST3.MDS");
};

if((self.hitchance[NPC_TALENT_2H] >= 25) && (self.hitchance[NPC_TALENT_2H] < 50))
{
if(Hlp_GetInstanceID(self) == Hlp_GetInstanceID(hero))
{
Npc_SetTalentSkill(self,NPC_TALENT_2H,1);
};
Mdl_ApplyOverlayMds(self,"humans_2hST1.mds");
Mdl_RemoveOverlayMds(self,"humans_2hST2.MDS");
Mdl_RemoveOverlayMds(self,"humans_2hST3.MDS");
};

if(self.hitchance[NPC_TALENT_2H] < 25)
{
if(Hlp_GetInstanceID(self) == Hlp_GetInstanceID(hero))
{
Npc_SetTalentSkill(self,NPC_TALENT_2H,0);
};
Mdl_RemoveOverlayMds(self,"humans_2hST1.MDS");
Mdl_RemoveOverlayMds(self,"humans_2hST2.MDS");
Mdl_RemoveOverlayMds(self,"humans_2hST3.MDS");
};
};
 
How can I see roses... and only feel thorns...


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