Odnośnie mechaniki działania czarów i ich obrażeń 2266 3

O temacie

Autor Elligon

Zaczęty 24.06.2017 roku

Wyświetleń 2266

Odpowiedzi 3

Elligon

Elligon

Użytkownicy
posty38
Propsy18
Profesjabrak
  • Zbanowany
W skryptach wielu czarów Wody i Beliara nie ma podanego typu obrażeń jak w przypadku czarów Ognia, gdzie zazwyczaj jest to obrażenia od Magii (jak np. Kula Ognia i jej potężniejsza wersja), czy czasami od Powietrza (przyjmuję że o to chodzi w nazwie "DAM_FLY" w np. Pięści Wichru). W paru przypadkach było to błędne tłumaczenie (np. Lodowa Szpila i podpis o zwykłych obrażeniach, gdy w skrypcie czaru są obrażenia magiczne; tak samo z Wodną Pięścią) i te już sobie odpowiednio poprawiłem.

Ale w pozostałych przypadkach nie ma nic określającego ten rodzaj obrażeń, więc jak są one traktowane przez grę? Jako obrażenia od broni/pocisków wobec których ma zastosowanie ochrona przed brońmi/pociskami, czy jak? I czy ma ona podział na BLUNT/EDGE/POINT w tym przypadku?

----------------------------------

I jeszcze jedno małe pytanie: czy NPCe będą zyskiwać doświadczenie i poziomy jeśli do wielu zwykłych narzędzi, których wielu NPCów używa (motyka, grabie, piła, młotek itp.) zostanie dodany skrypt dający PDki? Albo czy z tego tytułu wyskoczą jakieś błędy po dłuższym czasie? Pamiętam, że w jednej z wcześniejszych wersji Returninga można było zyskać doświadczenie przez piłowanie drewna, ale potem ta opcja znikła...
 

Siemekk

Siemekk

Złote Wrota
Untersturmfuhrer
posty2143
Propsy1151
ProfesjaProgramista
  • Złote Wrota
  • Untersturmfuhrer
Nie chce mi się czytać, ale co do tego drugiego to w funkcji sprawdź czy npc jest graczem. Najprostsza metoda to użycie funkcji Npc_IsPlayer(self); i będzie git.
 

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

Bogdan Zwei

Bogdan Zwei

Użytkownicy
Wulgarny skurwiel pierdolony.
posty1864
Propsy541
Profesjabrak
  • Użytkownicy
  • Wulgarny skurwiel pierdolony.
Co do czarów; Czary mają swój prototyp wypełniony odpowiednio tak, żeby nie trzeba było tego przepisywać co czar. Default-owo, czary mają typ obrażeń jako magiczny (damagetype = DAM_MAGIC), lecz w większości przypadkach czary mają dodatkowo wpisywane to samo w swoich odpowiednich skryptach. Jeśli wejdziesz w Gothic 2\_Work\data\Scripts\Content\AI\Magic do pliku C_Spell_Proto.d, będziesz widział, że jest prototyp klasy C_SPELL. Każdy czar w grze wykorzystuje ten prototyp.

Co do damagetype i protection; silnik odczytuje te wartości w taki sposób:
Pobiera numer z damagetype.
Jeśli damagetype ma numer DAM_FLY, szuka protection, który ma ten sam numer.
Jako, że damagetype to numer DAM_FLY, a PROT_FLY (nie pamiętam jak dokładnie się to nazywa) ma ten sam numer, co DAM_FLY, to protection przyjmuje wartość PROT_FLY, co się równa DAM_FLY. W skrócie: jeśli damagetype wynosi 3, a 3 to DAM_FLY i PROT_FLY, to protection to też 3. Dzięki temu gra wie, że jeśli damagetype to DAM_FLY to protection to będzie PROT_FLY.

A co jeśli czar ma przypisane dwa damagetype? Nic trudnego; Jako, że DAM_* przyjmuje wartość bitową, to gra potrafi wyczytać, jakie typy obrażeń są w danym damagetype i odpowiednio odjąć/dodać wartości.
Przyjmijmy, że jakiś damagetype ma typy DAM_FIRE i DAM_EDGE (damagetype = DAM_FIRE | DAM_EDGE), DAM_FIRE to u nas będzie 1, a DAM_EDGE 2. 1 w bitach to 0001, zaś 2 to 0010. Teraz, gra odczytuje to w taki sposób:
damagetype = 0011, jako, że mamy przypisane dwa damagetype, to gra odczyta to w taki sposób:
damagetype = 0010 + 0001. Dlaczego? Binary dla damagetype i protection są przypisywane kolejno (1, 2, 3...) poprzez przesuwanie liczby w lewo. Czyli, pierwszy damagetype będzie miał zapis 1<<1, co będzie wynosiło 10 (1<<0 to 0001), albo 0010 jeśli chcesz widzieć to jako binarną liczbę, zaś drugi będzie miał zapis 1<<2 (nie 2<<1, bo to co innego), co będzie wynosiło 100 (albo 0100). W taki sposób, gra może bez najmniejszych problemów sprawdzić, co zawiera dana zmienna (w tym przypadku damagetype).

Jak wygląda sprawdzanie? Gra sprawdza to warunkiem if (damagetype & DAM_FIRE), co znaczy "jeśli zmienna damagetype zawiera 0010 (DAM_FIRE)".
 
: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.

Elligon

Elligon

Użytkownicy
posty38
Propsy18
Profesjabrak
  • Zbanowany
Cytuj
Nie chce mi się czytać, ale co do tego drugiego to w funkcji sprawdź czy npc jest graczem. Najprostsza metoda to użycie funkcji Npc_IsPlayer(self); i będzie git.

Ekstra zajebiście! Już zaaplikowałem gdzie trzeba.

Co do czarów: czary mają swój prototyp wypełniony odpowiednio tak, żeby nie trzeba było tego przepisywać co czar. Defaultowo, czary mają typ obrażeń jako magiczny (damagetype = DAM_MAGIC), lecz w większości przypadkach czary mają dodatkowo wpisywane to samo w swoich odpowiednich skryptach. Jeśli wejdziesz w Gothic 2\_Work\data\Scripts\Content\AI\Magic do pliku C_Spell_Proto.d, będziesz widział, że jest prototyp klasy C_SPELL. Każdy czar w grze wykorzystuje ten prototyp.

Co do damagetype i protection; silnik odczytuje te wartości w taki sposób:
Pobiera numer z damagetype.
Jeśli damagetype ma numer DAM_FLY, szuka protection, który ma ten sam numer.
Jako, że damagetype to numer DAM_FLY, a PROT_FLY (nie pamiętam jak dokładnie się to nazywa) ma ten sam numer, co DAM_FLY, to protection przyjmuje wartość PROT_FLY, co się równa DAM_FLY. W skrócie: jeśli damagetype wynosi 3, a 3 to DAM_FLY i PROT_FLY, to protection to też 3. Dzięki temu gra wie, że jeśli damagetype to DAM_FLY to protection to będzie PROT_FLY.

A co jeśli czar ma przypisane dwa damagetype? Nic trudnego; Jako, że DAM_* przyjmuje wartość bitową, to gra potrafi wyczytać, jakie typy obrażeń są w danym damagetype i odpowiednio odjąć/dodać wartości.
Przyjmijmy, że jakiś damagetype ma typy DAM_FIRE i DAM_EDGE (damagetype = DAM_FIRE | DAM_EDGE), DAM_FIRE to u nas będzie 1, a DAM_EDGE 2. 1 w bitach to 0001, zaś 2 to 0010. Teraz, gra odczytuje to w taki sposób:
damagetype = 0011, jako, że mamy przypisane dwa damagetype, to gra odczyta to w taki sposób:
damagetype = 0010 + 0001. Dlaczego? Binary dla damagetype i protection są przypisywane kolejno (1, 2, 3...) poprzez przesuwanie liczby w lewo. Czyli, pierwszy damagetype będzie miał zapis 1<<1, co będzie wynosiło 10 (1<<0 to 0001), albo 0010 jeśli chcesz widzieć to jako binarną liczbę, zaś drugi będzie miał zapis 1<<2 (nie 2<<1, bo to co innego), co będzie wynosiło 100 (albo 0100). W taki sposób, gra może bez najmniejszych problemów sprawdzić, co zawiera dana zmienna (w tym przypadku damagetype).

Jak wygląda sprawdzanie? Gra sprawdza to warunkiem if (damagetype & DAM_FIRE), co znaczy "jeśli zmienna damagetype zawiera 0010 (DAM_FIRE)".

I teraz wszystko stało się klarowne. Rzeczywiście, w każdym czarze jest szablon (C_Spell_Proto). Przeszukałem skrypty oryginalnego GII:NK Notepadem++ i tylko smoki zadają obrażenia dwóch typów.

Zacne wyjaśnienie o tym jak silnik działa na systemie dwójkowym względem obrażeń i ich typów. Uczony z ciebie towarzysz.
 


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