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)".