QUAKE C GUIDE
Na začátek bych rád uvedl, že tento návod není zamýšlen jako přesná příručka, berte ho spíše jako můj pokus předat své vědomosti ostatním Quakerům.
No tak tedy do toho...



1. Co to vlastně je Quake-C

Quake C je programovací jazyk vyvinutý ID softwarem a využívá se pro vytváření různých modifikací Quaka. Je v podstatě identický s jazykem C, jenže se mu říká QuakeC, aby bylo každýmu jasný, že se používá v Quakovi. Takhle to alespoň chápu já.

Nejprve bychom si měli ujasnit, jakou úlohu QuakeC zastává v Quakovi jako v celku:

Vlastní hra Quake sestává ze tří prvků:

  • Strojový kód enginu Quaka..........quake.exe & spol. engine je zkrátka engine a s ním se zde nebudu vůbec zaobírat, zejména proto, že o enginech nic nevím.
  • Zkompilované QuakeC soubory....progs.dat Soubor "progs.dat" se nachází ve složce ID1 (jestli ho tam nevidíte, je to tím, že je zabalený v souboru "pak0.pak". Ze souboru "progs.dat" si engine bere informace typu rychlost chůze, účinek zbraní, rychlost střelby, jaký model má lékárnička, etc... "Progs.dat" vznikne zkompilováním souborů .QC, které se dají editovat v obyčejných textových editorech typu Notepad či MS DOS Edit. Tím bych se taky v následujících řádcích chtěl zaobírat.
  • Ostatní soubory jako mapy, modely, bitmapové obrázky, etc... -bez komentáře-

    Takže je zjevné, že QuakeC v podstatě říká enginu Quaka co má dělat. To je sice hodně nepřesné, ale pro představu to stačí.
    Myslím, že bude lepší dále pokračovat formou příkladu, než ubíjející všeobecnou teorií:




    2. Jak udělat svou vlastní QC modifikaci, aneb praktický příklad:

    Dejme tomu, že byste si rádi vyrobili takový malý cheat - brokovnici, která bude mít větší účinnost a bude střílet rychleji. Budu předpokládat, že nemáte nic než plnou verzi Quaka, Notepad či MS DOS Edit a přístup na Internet.




    2.1 - Co potřebujete...


    Stáhněte si následující věci:
  • QuakeC soubory
  • Kompilátor
  • QuArK, pokud si chcete programování trochu usnadnit. (nezapomeňte stáhnout také Mini-Python-Pack)



    2.2 - Příprava...
  • Vytvořte přímo v adresáři Quaka složku nazvanou např. "GUN" (nemusí to být "gun", můžete si ji pojmenovat jak chcete, maximálně však 8-mi písmeny.)
  • Vytvořte ve složce GUN další složku, nazvanou třeba "SRC" (jako "source" neboli zdroj).
  • Do ní rozbalte soubory QuakeC (*.qc) a kompilátor.
  • Nakonec by to mělo vypadat takto: Strom adresářů


    2.3 - Zkouška kompilátoru
  • Nyní spusťte kompilátor. Měl by začít kompilovat ".qc" soubory.
  • Až kompilace skončí, měl by se ve složce /../ (tedy v "GUN") vytvořit soubor "progs.dat". Jestli tomu tak je, znamená to, že je vše v pořádku a můžeme začít programovat.


    2.4 - Programování
  • Otevřte soubor "weapons.qc" v Notepadu. Pokud se vám místo formátovaného textu zobrazí nepřehledná změť písmen, buď restartujte počítač a zkuste to znova, nebo "weapons.qc" otevřete v nečem jiném (MS DOS Edit, WordPad, QuArK, ...).
  • Najeďte na řádek 262, na část označenou "W_Fire_Shotgun"
  • Toto je část QC kódu, ve které jsou zadány parametry brokovnice:
    
    /*
    ================
    W_FireShotgun
    ================
    */
    
    void() W_FireShotgun =
    	//název funkce
    {
    	local vector dir;
    
            sound (self, CHAN_WEAPON, "weapons/guncock.wav", 1, ATTN_NORM);
    	//zvuk výstřelu
    
    	self.punchangle_x = -2;
    	//zde je uvedeno, o kolik vás brokovnice nakopne
    
            self.currentammo = self.ammo_shells = self.ammo_shells - 1;	
    	//kolik ubude nábojů při jednom výstřelu
    
    	dir = aim (self, 100000);
    	//definice přímeho směru
    
    	FireBullets (6, dir, '0.04 0.04 0');
    	//počet a rozptyl vystřelených broků
    };
    
  • Veličiny v této funkci můžete modifikovat dle chuti (ale v racionálních mezích).

    Při výrobě naší rychlopalné brokovnici doporučuji:
    - Přepsat zvuk výstřelu z "weapons/guncock.wav" na "weapons/nail2.wav"
         (Pokud budete chtít použít svůj vlastní zvuk, buďto jej pojmenujte stejně jako originál quakovský, nebo v části "W_Precache" (úplně na začátku) přidejte nový řádek se svým zvukem. (precache_sound ("weapons/mujzvuk.wav");) To samé se dělá s modely, ale místo "precache_sound" se píše "precache_model")
    - Přepsat kolik ubude nábojů při výstřelu
    z self.currentammo = self.ammo_shells = self.ammo_shells - 1;
    na self.currentammo = self.ammo_shells = self.ammo_shells - 0.1;
    - Ostatní necháme nezměněné.

  • Po úpravě by měla funkce W_FireShotgun vypadat takto:
    
    /*
    ================
    W_FireShotgun
    ================
    */
    
    void() W_FireShotgun =
    {
    	local vector dir;
    
            sound (self, CHAN_WEAPON, "weapons/nail2.wav", 1, ATTN_NORM);
    	//zvuk výstřelu jsme změnili na zvuk supernailgunu
    
    	self.punchangle_x = -2;
    
            self.currentammo = self.ammo_shells = self.ammo_shells - 0.1;	
    	//při jednom výstřelu ubude 0.1 náboje
    
    	dir = aim (self, 100000);
    
    	FireBullets (6, dir, '0.04 0.04 0');
    };
    
  • Údaje o tom, jak rychle brokovnice střílí jsou uvedeny v jiné části.
    Zhruba kolem řádku 880 se nachází funkce "W_Attack".
    V ní se nachází část, která vypadá takto:

    
    
    	else if (self.weapon == IT_SHOTGUN)
    	//jestliže zbraň = brokovnice, tak ...
    	{
    		player_shot1 ();
    		//přehraj na modelu hráče animaci "střelba"
    		W_FireShotgun ();
    		//spusť funci W_FireShotgun (popsaná výše)
                    self.attack_finished = time + 0.6;
    		//další střelba možná za 0.6 sekundy
    	}
    
  • Tuto část modifikujte následovně:

    - self.attack_finished = time + 0.6; přepište na self.attack_finished = time + 0.1;
    - Dál už nic

  • Potom by to mělo vypadat následovně:
    
    	else if (self.weapon == IT_SHOTGUN)
    	{
    		player_shot1 ();
    		W_FireShotgun ();
                		self.attack_finished = time + 0.1;
    		//upravili jsme rychlost střelby na 0.1 s
    	}
    



    2.5 - Kompilace
  • Teď soubor "weapons.qc" uložte a spusťte kompilátor.
  • Nechte soubory zkompilovat
  • Pokud kompilátor hlásí nějakou chybu ve "weapons.qc", na řádku XXX, podívejte se na dotyčný řádek a zkuste najít a opravit onen zádrhel.
  • Pokud se vám chybu najít a opravit nepodaří, zde si stáhněte "weapons.qc", které jsou v pořádku.


    2.6 - Spuštění modifikace
  • Spusťte Quaka s parametrem "-game JMÉNO MODIFIKACE", tedy v našem případě :
      quake.exe -game GUN"
  • Nebo si vytvořte ve složce "GUN" batsoubor, do kterého uvedený příkaz zapíšete.
    (Jak se dělá batsoubor: klikni pravým ve složce - nový objekt textový dokument - pojmenovat "něco.bat" - kliknout na něj pravým - upravit)
  • Bavte se.


    2.7 - Ještě něco navíc
    Pokud se s tímto nespokojíte, tak ve funkci " W_FireShotgun" nahraďte část
    self.punchangle_x = -2;
    tímhle:
    self.punchangle_x = crandom()* 3;
    self.punchangle_y = crandom()* 2;
    self.punchangle_z = crandom()* 5;

    a na konec funkce připište:
    self.velocity = dir * -100;

  • Takže by to mělo vypadat takhle:
    
    /*
    ================
    W_FireShotgun
    ================
    */
    
    void() W_FireShotgun =
    {
    	local vector dir;
    
            sound (self, CHAN_WEAPON, "weapons/sgun1.wav", 1, ATTN_NORM); 
    
    	self.punchangle_x = crandom()* 3;
    	self.punchangle_y = crandom()* 2;
    	self.punchangle_z = crandom()* 5;
    	
            self.currentammo = self.ammo_shells = self.ammo_shells - 0.1;
    	dir = aim (self, 100000);
    	FireBullets (6, dir, '0.04 0.04 0');
    	self.velocity = dir * -100;
    };
    
  • Teď to zkompilujte a spusťte a valte oči.
  • Jestli se vám nelíbí "létající efekt brokovnice" tak na konec ještě přidejte self.velocity_z = 0;


    2.8 - The end...
    Tak, jak se vyrábí rychlopalná brokovnice bychom věděli. Tohle samozřejmě zdaleka není vše, co se s Quake-C dá dělat. Více znalostí získáte až praxí. K tomu můžu doporučit Quake-C tutorialy na stránkách:
    www.inside3d.com/qctut
    www.mdqnet.net/quakec
    Tutorialy na těchto stránkách jsou sice v angličtině, ale myslím, že jsou zpracovány dostatečně názorně, aby jim porozuměl i neangličinář.

    A na závěr bych rád poděkoval všem autorům tutorialů na Inside3D a MDQnetu za to, že jsem díky ním pronikl do tajů QC.



  •