Modding "Command & Conquer 3: Tiberium Wars" - Kodowanie broniSpis treści1) Cel i przygotowania
2) Modyfikacja istniejącej broni
3) Wskazówki, jak zakodować nową broń
4) Tworzenie moda i testowanie
Cel i przygotowaniaPoprzednim razem było o pancerzu, tym razem będzie o uzbrojeniu. Bronie podzielone są na kilka typów: GUN, SNIPER, CANNON, GRENADE itp. W zależności od typu broni są obliczane redukcje obrażeń w parametrach pancerza. Jednakże każdy z tych typów obejmuje kilka/kilkanaście rodzajów broni, zdefiniowanych dla każdej jednostki z osobna. Dziś zmodyfikujesz broń Scrinów. Dam ci też kilka wskazówek, jak zakodować zupełnie nową broń (choć zapewne sam się zorientujesz na zasadzie analogii)
.
Chciałoby się skopiować plik znajdujący się tutaj:
MOD SDK/CnC3Xml/GlobalData/Weapon.xml. Nie radzę. Gdy modyfikowałem ten plik, po odpaleniu
EALAModStudio wyskakują błędy krytyczne. Pewnie wielce szanowni państwo z EA musieli coś pomylić i nie wstawili jakiegoś znaku. Na szczęście mamy mod 'wzorcowy':
MOD SDK/Mods/SampleModWchodzimy tam, potem w folder
data i kopiujemy plik o nazwie
SampleUpdatedWeapons.xml. Wklejamy do
MOD SDK/Mods/TrainingMod/data/Global. Bleeeee, brzydka nazwa. Zmieniamy na
Weapon. Adresujemy plik w
mod.xml. Jeszcze skopiuj ten zepsuty plik od EA i wklej go na razie tam, gdzie ten właściwy (nadaj tej kopii nazwę
Weapon 2), będziesz potrzebować fragmentów kodu:
MOD SDK/CnC3Xml/GlobalData/Weapon.xmlAle spróbuj go zaadresować w
mod.xml, to nogi powyrywam. Super. Jedziemy.
Modyfikacja istniejącej broniWcześniej kombinowaliśmy z GDI, potem z Nod, czas na Scrinów. Otwórz Notatnikiem
Weapon. Wykasuj to wszystko:
<WeaponTemplate
id="ShadowMachineGunRangefinder"
Name="ShadowMachineGunRangefinder"
AttackRange="120"
LeechRangeWeapon="true"
AcceptableAimDelta="45d"
AntiMask="ANTI_GROUND"
CanFireWhileMoving="true"
FinishAttackOnceStarted="false"
>
<FiringDuration
MinSeconds="1.0s"
MaxSeconds="1.0s" />
</WeaponTemplate>
<WeaponTemplate
id="NODShadowMachinePistol"
Name="NODShadowMachinePistol"
AttackRange="100.0"
WeaponSpeed="999999.0"
RadiusDamageAffects="ALLIES ENEMIES NEUTRALS"
ClipSize="1"
FireSound="NOD_ShadowSquad_WeaponFirePistol"
FireFX="FX_NODRifleManFire"
FireVeteranFX="FX_GDIRifleManFireHeroic"
AcceptableAimDelta="10d"
CanFireWhileMoving="true"
>
<FiringDuration
MinSeconds="0.1s"
MaxSeconds="0.1s" />
<ClipReloadTime
MinSeconds="0.45s"
MaxSeconds="0.55s" />
<Nuggets>
<DamageNugget
Damage="30.0"
Radius="0.0"
DamageType="SNIPER"
DamageFXType="NOD_RIFLE"
DeathType="NORMAL">
</DamageNugget>
</Nuggets>
</WeaponTemplate>
<WeaponTemplate
id="GDIElfWarriorSword"
Name="GDIElfWarriorSword"
AttackRange="12.0"
MeleeWeapon="true">
<FiringDuration
MinSeconds="1.2s"
MaxSeconds="1.2s"
/>
<Nuggets>
<DamageNugget
Damage="1500.0"
Radius="0.0"
DamageType="MAGIC"
DamageFXType="ALIEN_BUZZER"
DeathType="NORMAL"
/>
</Nuggets>
</WeaponTemplate>
W
Weapon 2 znajdź
id="AlienBuzzerWeapon" (podstawowa broń najbardziej podstawowej jednostki Scrinów). Skopiuj cały fragment kodu od
<WeaponTemplate do
</WeaponTemplate>Tym razem nie powiem ci, na jakie wartości masz zmieniać, nie ma tak dobrze
Omówię tylko od czego są poszczególne linijki (inne bronie mogą mieć tego więcej, ale nie da się omówić absolutnie wszystkiego
):
a) id="AlienBuzzerWeapon"
Name="AlienBuzzerWeapon"
Identyfikator i nazwa broni. Aby unikać komplikacji i nie wdawać się w niuanse, lepiej żeby obie te wartości były zawsze identyczne, w żaden sposób cię to nie ogranicza.
b) AttackRange="30.0"
Zasięg ataku
c) AcceptableAimDelta="360d"
Pole rażenia broni. W tym przypadku jednostka nie musi się obracać, by strzelać w bok czy do tyłu. Jak zmienisz np. na 180d, to będzie mogła strzelać w przód i na boki, ale jeśli cokolwiek znajdzie się za nią (albo 'z boku, ale nieco z tyłu', kumasz?), jednostka musi się obrócić.
d) FireSound="ALI_Buzzers_WeaponFire"
Dźwięk wydawany podczas działania broni. Jak to zmieniać, opiszę innym razem.
e) CanFireWhileMoving="true"
Jednostka może się ruszać i strzelać jednocześnie. Jak zmienisz na
false, to będzie musiała się zatrzymać, by strzelać.
f) RadiusDamageAffects="ALLIES ENEMIES NEUTRALS"
Jeśli broń ma zakodowane, że powoduje efekt promieniowania (odłamków, rykoszetów, skażenia etc.) w określonym obszarze wokół trafienia (kilka linijek niżej), to jednostki w najbliższym otoczeniu też odnoszą obrażenia. Tutaj mamy sytuację, gdzie elementy neutralne, wrogowie, a nawet własne jednostki mogą być poszkodowane. Jeśli chcesz na przykład, by tylko wrogowie i neutralni byli na tę 'radiację' narażeni, wykasuj
ALLIES .
g) AntiMask="ANTI_GROUND ANTI_STRUCTURE" >
Nie, nie chodzi o maskowanie, tylko przeciw czemu jest ta broń: tutaj działa na jednostki naziemne oraz budynki. Poniżej przykład z innej jednostki:
AntiMask="ANTI_GROUND ANTI_AIRBORNE_VEHICLE ANTI_AIRBORNE_INFANTRY" -> czytaj: przeciw pojazdom naziemnym, pojazdom powietrznym, piechocie powietrznej (latająca za pomocą skrzydeł/plecaków rakietowych oraz spadochroniarze)
h) FiringDuration
Częstotliwość strzału w sekundach. Jeśli
MinSeconds i
MaxSeconds mają różne wartości, to gra za każdym razem losuje wartość 'pomiędzy' (Mam nadzieję, że nie muszę tłumaczyć, czemu pierwsza wartość nie możele być większa od drugiej).
Efekt uboczny takiego zabiegu: możliwy spadek wydajności przy 'spamowaniu' jednostkami.
i) DamageNugget
Od góry: wartość obrażeń, promień radiacji (już zostańmy przy tej nazwie) oraz typ broni. Pozycja
DamageFX zawiera odsyłacz do kodu, który ma odciążyć komputer od pewnych obliczeń w sytuacji, gdy kilka jednostek atakuje jedną i jednocześnie strzela. Wyjaśnienie po angielsku znajduje się na początku pliku
MOD SDK/CnC3Xml/GlobalData/DamageFX.xml. Lepiej w to nie ingeruj, chyba że naprawdę ci się nudzi i lubisz się denerwować... .
Wskazówki, jak zakodować nową broń.Kopiujesz kod istniejącej broni. Zmieniasz nazwę i identyfikator. Zmieniasz parametry tak jak podczas modyfikowania broni istniejącej. Nazwę broni wstawiasz do modyfikowanej / nowej jednostki (trzeba poszukać, najlepiej nazwą 'starej' broni)
Tworzenie moda i testowanieZbuduj moda (która to już wersja?) i standardowo odpal skirmisha.
UWAGA: Niech cię nie zdziwi sytuacja, w której zmienisz jakieś parametry broni, a po "wynalezieniu" ulepszenia będzie mniej skuteczna. Bronie 'zupgrade'owane' są kodowane OSOBNO i mają ODRĘBNY zapis - i w pliku
Weapon.xml, i w kodzie jednostki. Nie wspominając już o definiowaniu upgrade'ów, ale o tym innym razem. To samo dotyczy pancerzy.