Návod - jak na překlady

Moderátor: Moderátoři GOTHICZ.NET fóra

Sekce o překladech nebo již přeložených módech
Odpovědní moderátoři: tonyskate, Emperor
Příspěvekod Milhaus » sob 20. čer 2009 15:30:07 » Návod - jak na překlady
Rozhodl jsem se sepsat jemný návod, jak vytvořit překlad nějakého cizího módu. Nejedná se ovšem o jednoduchý proces a předpokládá to, že se vyznáte alespoň trochu ve skriptech. Bez jejich znalostí to bude přinejmenším nesnadné.

Taktéž nelze s jistotu tvrdit, že tento návod bude fungovat u všech módů. Autoři módů mohou udělat různé úpravy a změny, takže ne vše musí fungovat správně. Nemůžu tedy s jistotou tvrdit, že je to návod absolutní a taktéž i tento fakt bude vyžadovat do značné míry schopnosti být flexibilní vůči problémům a schopnost hledat případná řešení.

Základem je převod textů do formátu, který bude překladatelný.

Soubory módů
Každý mód by měl být složen ze souboru *.mod, který naleznete ve složce
Gothic2\data\modvdf\

a ze spouštěcího souboru *.ini, který naleznete
Gothic2\system

součástí módu může (ale taky nemusí) být soubor *.vdf v adresáři
gothic2\data

smysl souborů
*.ini - je soubor s nastavením. Používá ho gothicstarter na spouštění módů. Tento soubor je pokaždé stejný a obsahuje základní údaje, jako například který soubor *.mod se má použít - spustit. Který svět se má načíst jako první (*.zen), nebo třeba která postava se má použít jako hrdina ovládaná hráčem. Tento soubor obsahuje prostě mnoho věcí. Pokud by jste dělali případný překlad módu, zžejmě by jste jej příliš neupravovali. Maximálně by jste změnili položku Title, která nese informaci, jak se má mód jmenovat v gothicstarteru. (tedy pod jakým názvem se v gothicstarteru mód zobrazí)

*.mod - soubor mod obsahuje veškerá data a soubory, které se mají načíst při spuštění módu. Data v tomto souboru se použijí jen v případe, že hráč spustí mód přes gothicstarter. Tento soubor je tedy velmi vhodný zejména pro soubory se skripty, které mění hru a její dění. Ve většině případů ale obsahují všechny soubory, které mód používá a které jsou jiné, než v základní hře.

*.vdf - soubor vdf je totožný, jako soubor mod. Má naprosto stejnou strukturu a je stejným způsobem vytvořen. Rozdíl mezi nimi je v tom, že pokud existuje nějaký takový soubor ve složce Data, načítá se jeho obsah vždy při spuštění gothicu. (nezávisle na tom, jak hru spustíte). Pokud takový soubor obsahuje soubory, které jsou již v základních vdf souborech hry, nahradí je těmito. Tedy pokud by například mód obsahoval upravený svět *.zen, který by se jmenoval stejně, jako původní a tento soubor byl uložen v souboru novysvet.vdf, byl by vždy původní svět nahrazen upraveným (vždy po spuštění hry). Tyto soubory se tedy hodí jen pro takové soubory, které v původní hře nejsou, ale mód je používá. Je to vhodné proto, že například nově vytvořené textury, nově vytvořené světy, nové fonty atd mohou být v souboru vdf a i když takový to soubor hra načte vždy, nenahradí jimi žádné původní soubory. Pokud tedy uživatel spustí například klasický gothic2a, nevšimne si žádných změn. Pokud uživatel spustí mód, který na tyto soubory odkazuje a který je požívá, soubory budou k dispozici. Samotný soubor *.mod pak může obsahovat opravdu jen nejnutnější soubory, které by přepsali samotnou hru, jako je soubor se skriptama (který je vždy stejný). Díky tomu je pak možné udělat základní distribuci módu o velikosti 500MB, ale případné opravy, změny, nebo překlady módu už jen dělat v malých souborech po 8MB. Protože v takovém případě není nutné znovu dávat do instalace balík vdf, ale stačí jen vytvořit nový soubor *.mod s opravenými věcmi. Bohužel, většina autorů módu tento systém nevyužívá a vše dávají natvrdo do souboru *.mod. Z toho pak vyplývá nutnost vždy soubor se všemi daty. Pokud by jste tedy dělali překlad nějakého módu, který by měl veškerá data v souboru *.mod a tento mód by měl velikost 100MB, váš hotový překlad módu připravený pro distribuci by musel mít také 100MB. (tedy museli by jste do souboru mod vložit všechny soubory, které jsou tam původně obsaženy). Pokud by jste dělali překlad módu, který využívá jak soubor vdf, tak soubor mod, mohlo by vám stačit distibuovat pouze soubor *.mod s tím, že soubor vdf je nezměněn a uživatel si jej nainstaloval již při instalaci samotného módu.

Ať už je to jak chce, při překladu módu nás bude vždy zajímat soubor *.mod a při dokončení překladu musí váš soubor *.mod obsahovat vždy naprosto totéž, co ten původní.

Před jakoukoliv činností doporučuji celou složku gothic někam okopírovat jako záložní.

Pak nainstalujte mód, který chcete přeložit a podívejte se po souborech, které používá. Vytvořte si někde na disku složku Překlad, v ní složky system a data a ve složce data vytvořte složku modvdf. Nyní nalezněte ve složce s gothicem všechny soubory, které mód používá a nakopírujte je do vaších složek (raději si dodržujte strukturu dat).

soubor *.ini nás prozatím tedy nebude zajímat.
případný soubor *.vdf nás taktéž prozatím nebude zajímat.

Nyní si stahněte program gothicvdfs.exe. Tento program jsem kdysi přeložil do češtiny, takže je i česky. Současně je tam i český návod.
Tento program slouží k rozbalení a zabalení souborů *.mod a *.vdf.

Nyní tedy program zapněte, klikněte na tři tečky u položky Soubor a nalezněte soubor *.mod vašeho módů.
Nyní klikněte na tři tečky u položky Adresář a nastavte cestu do vaší složky Překlad

Nyní klikněte na Extrahovat soubory. Po dokončení práce by jste měli mít ve vaší složce složku _WORK, která bude obsahovat veškerá data, která obsahuje soubor *.mod.

Program GothicVdfs můžete již vypnout.

Struktura dat gothicu
Nyní je čas vysvětlit si strukturu dat gothicu. Tato struktura je velice důležitá aje velice důležité jí udržet. Tedy všude, i v souborech *.mod a *.vdf musí být struktura dat zachována.

Základní je tato:
Kód: Vybrat vše
_work\
   Data\
      Anims\
      Meshes\
      Music\
      Presets\
      Scripts\
      Sound\
      Textures\
      Video\
      Worlds\


Anims - animace
Meshes - modely
Music - hudba
Presets - objekty hry
Skripts - skripta
Sound - zvuk
Textures - textury
Video - videa
Worlds - světy

Každá tato složka ještě obsahuje podsložky, kde nejdůležitější podsložkou je složka
_compiled\
která vždy obsahuje kompilovaná data, tedy data, které využivá samotná hra.

Nás při překladu bude zajímat především složka Scripts a její podsložky, možná složka Video. Nicméně při rozbalení souboru *.mod nám zde vzniklo mnoho složek a při zpětném zabalení do souboru *.mod musíte všechny soubory ze všech složek nahrát pomocí souboru gothicvdfs s tím, že udržíte tuto strukturu složek. Proto zde uvádím všechny. Vámi překládaný mód ale nemusí obsahovat všechny složky, některé mohou chybět, protože mód nemusí obsahovat daný typ souboru (například nemusí do hry přidávat žádné nové zvuky, pak bude složka Sound chybět.)

Nyní nás budou zajímat především dva soubory. Gothic.dat a Ou.bin
Gothic.dat naleznete ve složce
_work\Scripts\_compiled\
a soubor ou.bin naleznete ve složce
_work\Scripts\Content\Cutscene\

Tyto dva soubory obsahují veškeré texty, které je třeba přeložit. Oba jsou kompilované. soubor gothic.dat obsahuje kompilovaná skripta, zatímco soubor OU.bin obsahuje kompilované titulky (tedy to, co se zobrazí při dialogu ve vrchní části obrazovky, současně obsahuje odkazy na zvukové soubory dabingu).

Nyní si stahněte program GothicSourcerV3_10. Tento program je velmi šikovnou pomůckou pro tvůrce módů do hry gothic1 a gothic2a.

My jej využijeme k dekompilaci souborů gothic.dat a ou.bin. Pomocí dekompilace nám tak vzniknou jednotlivé soubory skriptů *.d, které bude nutné přeložit. Program sám umí skripta i kompilovat do souborů gothic.dat a ou.bin. Což je velmi důležité a budeme to potřebovat. Bohužel program má vysoké nároky na správnost kódů. A pokud nalzene v kódu nějakou chybu, odmítá kopmipovat soubory. To, co by tedy přes kompilaci pomocí gothicstarteru prošlo, tady neprojde a musíte chybu opravit. Program chybu hlásí červeně, většinou se jedná o drobné chyby s návratovou hodnotu funkcí. Například fuknce je definována jako řetězec, ale vrací číslo, nebo nevrací nic. Všechny chyby v kódu je nutné spravit. Což může být pro člověka, který tomu nerozumí poněkud problém :). Jelikož samotná skripta od autorů hry, která lze stahnout s balíkem MDK a na kterých je pak založena většina módů obsahuje obrovzké množství těchto chyb, které přes kompilaci tohoto programu neprojdou, ale přes kompilaci pomocí programu GothicStarterMod ano.

My ale musíme použít tento program a ne GothicStarter, protože tento program kompiluje současně soubor Gothic.dat i OU.bin, kde titulky jsou načítány z poznámek ze souborů *.d. Pokud by jste soubory kompilovali přes gothicstarter, tak by jste kompilovali pouze soubor gothic.dat. Při takové metodě kompilace se používá na tvorbu titulků soubor OU.CSL a spacer, skrz který je moýné nekompilovaný soubor OU.CSL překompilovat na OU.BIN. To je sice pěkné, bohužel, nám k ničemu, protože při dekompilaci modu pomocí GothicSourcerV3_10 tento soubor nezískáme. (program jej nepotřebuje a tak jej nevytváří). Budem tedy při práci muset nalézti a opravit všechny chyby, které GothicSourcerV3_10 při kompilaci najde.

Jak dekompilovat soubory Gothic.dat a OU.BIN:
- Spusťte program GothicSourcerV3_10
- Klikněte na položku File a zde na New Solution (nový projekt)
- Objeví se vám okno s více možnostmi. Do první kolonky - Solution name - napište jméno vašeho projektu (například JménoModu-CZ)
- Location nastavte do složky, kam chcete projekt vytvořit. Nejlépe asi do naší složky Překlad
- V položce Platforms nastavte, o jaký díl gothicu jde. Buď gothic1 nebo Gothic2. Záleží na tom, na který díl je mód určen.
- nyní jsou zde tři možnosti. První slouží k přímému načtení dat ze složky Gothic, za předpokladu, že v ní máte nainstalováný MDK kit. Tato možnost se hodí, pokud hodláte dělat mód nový, pro nás je momentálně na nic.
- druhá možnost umožňuje načíst projekt ze souborů SRC. (tyto soubory obsahují seznam všech souborů, které se mají kompilovat). I tato možnost se hodí spíše pro tvotbu nového módu.
-třetí možnost, která zajímá nás, je možnost načtení projektu ze souboru *.DAT. Tu tedy vyberte a klikněte na tři tečky pod ní. Nyní najděte cestu k souboru
překlad\_work\Scripts\_compiled\Gothic.dat

v případě, že budete optáni, nastavte i cestu k souboru OU.BIN
překlad\_work\Scripts\Content\Cutscene\OU.bin

Ovšem program by se vás neměl ptát, pokud je struktura dat v pořádku, neboť si najde soubor sám.

Tím máme sice projekt načtený, ale nic se nestalo :).
Nyní tedy klikněte v menu na Build a zde na Decompiled

Začne dekompilace souborů a současně i hledání chyb ve skriptech, to nás ale momentálně snad nemusí zajímat.

Po dokončení dekompilace se objeví ve vaší Překlad složka se soubory *.d (složka se jmenuje SolNazevprojektu)
Taktéž v samotném programu se na levé straně objeví seznam všech souborů. Ten budeme brzy potřebovat pro samotný překlad.

Než se ale pustíte do překladu, je potřeba opravit všechny chyby, které by vadili při kompilaci. Proto na zkoušku zkuste skripta kompilovat. Můžete zmačknout F7, nebo vybrat v menu Build - Compiled.

V dolní části programu je seznam s hlášením, ve které se vypisují všechny soubory. Pokud soubor obsahuje chybu, je červený a je u něj napsán důvod chyby. Pokud má soubor menší nedostatky, je modrý (je brán jako varování) a i zde je napsán důvod. Vy musíte dostat skripta do takového stavu, aby se neobjevila žádná chyba a program dokončil kompilaci a vytvořil opětovně soubory Gothic.dat a OU.bin.

Projeďte tedy celý tento seznam a klikněte dvakrát na řádek, který je červeně nebo modře. Ve většině případů je chyba v návratové hodnotě funkce
tj. Error: Funciton should return value
nebo Warning: Funciton should return value
Právě tyto chyby obsahují základní skrypta, která lze stahnout.
V podstatě jde o to, že určitá funkce je definována jako například řetězec (string), ale vrací číslo (int). Což je pochopitelně chyba. Nebo je definována jako procedura void, ale vrací jiný typ. Taktéž tato chyba může nastat (což je velmi časté), pokud fuknce nevrací žádnou hodnotu.

Například funkce obsahuje takové řádky:
Kód: Vybrat vše
func int C_ScCanUpgrateBeliarsWeapon()
{
   if(BeliarWeapCurrentLvL < BeliarWeapNextLvL)
   {
      return TRUE;
   };
};


zde vidíme, že funkce je definována jako int (číslo). Pokud je daná podmínka splněna, vrací RETURN true, což je v pořádku, protože slovo TRUE je konstanta obsahující 1. Takže až dosud je to OK. Problém nastává v případě, že podmínka není splněna. V takovém případě funkce končí, ale nic nevrací, což se kompilátoru programu GothicSoucer nelíbí. Proto je nutné doplnit kód na konci funkce o RETURN 0;, nebo RETURN FALSE;

tedy takto:
Kód: Vybrat vše
func int C_ScCanUpgrateBeliarsWeapon()
{
   if(BeliarWeapCurrentLvL < BeliarWeapNextLvL)
   {
      return TRUE;
   };
   return FALSE;
};


a uložit otevřený soubor.

Takový to zápis, který jsem uvedl by byl zobrazený modře. Protože funkce alespoň někdy vrací hodnotu. Pokud by ale funkce (tělo funkce) vůbec nic nevracelo, bylo by to bráno jako chyba a v seznamu by byl tento soubor označen červeně, tedy příklad funkce:

Kód: Vybrat vše
func int B_MM_DeSynchronize()
{
   var int msec;
   msec = Hlp_Random(1000);
   AI_Waitms(self,msec);
};


taková chyba neprojde vůbec a je třeba jí opravit. Víceméně by mělo být jedno, co funkce vrací, takže takovou funkci doplntě na konec těla o return 0;, což by mělo stačit.

tj:
Kód: Vybrat vše
func int B_MM_DeSynchronize()
{
   var int msec;
   msec = Hlp_Random(1000);
   AI_Waitms(self,msec);
   return 0;
};


a opět uložte a zavřete soubor.

Chyba typu:
Error:Unexpected return
Tato chyba je už poměrně závažná a měla by vliv na fungování hry. I přesto kompilátorem gothicstarteru projde. Značí, že slovo return chybí úplně, ačkoliv tam má být. příklad:
Kód: Vybrat vše
   if(spellType == SPL_LightningFlash)
   {
      if(C_NpcIsDown(self))
      {
         return COLL_DONOTHING;
      };
      if(C_BodyStateContains(self,BS_SWIM) || C_BodyStateContains(self,BS_DIVE))
      {
         COLL_APPLYDOUBLEDAMAGE;
      };
      return COLL_DOEVERYTHING;
   };

Jak vidíte, ve druhé podmínce je použita proměnná a počítáno s tím, že je funkcí vrácena, ale není použito return. A proto kompilátor hlásí chybu
správně tedy má být:
Kód: Vybrat vše
   if(spellType == SPL_LightningFlash)
   {
      if(C_NpcIsDown(self))
      {
         return COLL_DONOTHING;
      };
      if(C_BodyStateContains(self,BS_SWIM) || C_BodyStateContains(self,BS_DIVE))
      {
         return COLL_APPLYDOUBLEDAMAGE;
      };
      return COLL_DOEVERYTHING;
   };


Bohužel opravit tyto chyby ro člověka neznalého programování může být poněkud problém. Je to ovšem nutné (stejně je třeba se i pro překlad vyznat ve skriptech). Chyb může být pochopitelně i více a některé mohou udělat i samotní autoři módu. Proto je velmi obtížné říct, co vše po vás může kompilátor GothicSouceru chtít. Nicméně je pravda, že některé chyby obsažené už v základních skriptech, jsou opravdu značné.

ukázky dalších chyb:
Error: Unknown identifier: ELSE
- neznámá identifikátor ELSE, kde funkce vypadá takto:
Kód: Vybrat vše
func int C_TowerBanditsDead()
{
   var C_Npc TowerBandit1;
   var C_Npc TowerBandit2;
   var C_Npc TowerBandit3;
   TowerBandit1 = Hlp_GetNpc(BDT_10100_Addon_TowerBandit);
   TowerBandit2 = Hlp_GetNpc(BDT_10101_Addon_TowerBandit);
   TowerBandit3 = Hlp_GetNpc(BDT_10102_Addon_TowerBandit);
   if(Npc_IsDead(TowerBandit1) && Npc_IsDead(TowerBandit2) && Npc_IsDead(TowerBandit3))
   {
      return TRUE;
   };
   TowerBanditsDead = TRUE;
   else
   {
      return FALSE;
   };
};


zde je problém v poslední části, tedy zde:
Kód: Vybrat vše
   if(Npc_IsDead(TowerBandit1) && Npc_IsDead(TowerBandit2) && Npc_IsDead(TowerBandit3))
   {
      return TRUE;
   };
   TowerBanditsDead = TRUE;
   else
   {
      return FALSE;
   };

problém je v zápisu podmínky, která je definována jako
If (podminka) { příkazy pokud podmínka platí } else {příkazy pokud podmínka neplatí}

kde else není povinné. Zde u této funkce, kde je hlášena chyba je ovšem tělo podmínky uzavřeno, použit už jiný příkaz a až pak je použito else. Tedy skripta již počítají s tím, že else nebude použito.

If (podminka) { příkazy pokud podmínka platí } příkazy else {příkazy pokud podmínka neplatí}

což je nepřijatelné. Všechny příkazy v podmínce musí být buď uvnitř těla ANO, nebo pokud je použito ELSE uvnitř těla NE. Tedy správně by mělo asi být:
Kód: Vybrat vše
   if(Npc_IsDead(TowerBandit1) && Npc_IsDead(TowerBandit2) && Npc_IsDead(TowerBandit3))
   {
      return TRUE;
   }
   else
   {
      return FALSE;
   };
   TowerBanditsDead = TRUE;


nebo ještě lépe
Kód: Vybrat vše
   if(Npc_IsDead(TowerBandit1) && Npc_IsDead(TowerBandit2) && Npc_IsDead(TowerBandit3))
   {
      return TRUE;
   };
   TowerBanditsDead = TRUE;
   return FALSE;


ovšem ne vždy je tak jasné, co tím měli autoři na mysli a jak tedy opravit chybu správně.

Každopádně pro pokračování překladu je nutné všechny tyto chyby opravit.

Jakmile tedy projdete a opravíte všechny modré i červené řádky, zkuste opět kompilaci (F7). Pokud budou nalezeny chyby, opravujte. Pokud program nenalezne žádnou chybu, zeptá se vás na konci, kam má nahrát vytvořené soubory GOTHIC.DAT a OU.BIN. Díky tomu budeme vědět, že skripta jsou v pořádku a je možné je použít pro překlad. (soubory vytvářet prozatím není potřeba, takže operaci zrušte)

Nyní tedy konečně jak překládat. Musíte přeložit veškeré texty, jména nepojmenovaných postav, hlášení, předměty atd. Nejlépe je projít všechny soubory jeden po druhým a vše přeložit. Můžete použít případně již existující překlady. (názvy předmětů, které jsou v původní hře atd), nebo dialogy. Ale tak či onak je rozumné je předělávat raději postupně po jednom, protože tam mohou být rozdíly. (skripta pro češtinu do gothicu2a jsou na stažení na stránkách. Skripta pro gtohic1 s českého gothicu si můžete vytvořit touto metodou dekompilace)

Veškeré texty, které bude obsahovat gothic.dat jsou v uvozovkách "text". Veškeré titulky uložené v OU.BIN jsou za //titulek (jako poznámky)

Tedy pokud otevřete nějaký soubor a bude v něm takovéto řádky:
Kód: Vybrat vše
   AI_Output(self,other,"DIA_Rega_HALLO_17_05");   //Mach lieber, dass du hier wegkommst.
   AI_Output(other,self,"DIA_Rega_HALLO_15_06");   //Warum?
   AI_Output(self,other,"DIA_Rega_HALLO_17_07");   //Hier war es zwar früher nicht das Paradies, aber zumindest hatte man seine Ruhe, wenn man seine Arbeit für Sekob gemacht hat.
   AI_Output(self,other,"DIA_Rega_HALLO_17_08");   //Aber in letzter Zeit ist es unerträglich geworden.


tak to, co je za // zeleně (tedy poznámka), bude použito pro vytvoření titulku v souboru OU.BIN. Při překládání do češtiny tedy musíte přeložit všechny tyto poznámky.
tj:
Kód: Vybrat vše
   AI_Output(self,other,"DIA_Rega_HALLO_17_05");   //Na tvém místę bych odsud pęknę rychle vypadla.
   AI_Output(other,self,"DIA_Rega_HALLO_15_06");   //Proč?
   AI_Output(self,other,"DIA_Rega_HALLO_17_07");   //Nikdy to tady nebyl žádný med, ale alespoŕ jsme męli klid po celou dobu, co dęláme pro Sekoba.
   AI_Output(self,other,"DIA_Rega_HALLO_17_08");   //Ale poslední dobu už je to nesnesitelné.


potom bude při kompilaci programem (F7) použit do souboru OU.BIN tento překlad. Pokud tyto poznámky nepřeložíte, titulky nebudou fungovat.

Pokud se jedná o překlad do gothic2a a chcete použít i české fonty, pak musíte společně s češtinou dávat i soubor cz.vdf (který je nainstalován při instalaci češtiny fo g2a). Tento soubor obsahuje fonty s háčky. Avšak je třeba používat jiné znaky (je to pozůstatek kryšpínovy češtiny):
ę-ě
Ę-Ě
ŕ-ň
Ŕ-Ň
â-ř
Â-Ř
ă-ť
Ă-Ť
ë-ď
Ë-Ď
nebo si můžete vytvořit svoje vlastní fonty.

Po dokončení překladu, nebo pro testování, musíte soubory kompilovat (F7). To ovšem samo o sobě nestačí. Jsou zde dvě možnosti, jak testovat hru. Buď si můžete nainstalovat kompletní balík MDK souborů, nainstalovat je. Následně pčekopírovat složku _work z vaší složky data do složky gothic2. Následně při kompilaci uvádět cestu do složky gothic2 tak, aby se přepsali soubory gothic.dat a OU.bin (cesty jsou uvedeny výše). Následně by tedy pro testování mělo stačit jen přímo spustit hru přes gothic2.exe

Druhou možností je kompilovat soubory gothic.dat a ou.bin tak, aby přepsali soubory ve vaší složce Překlad\_work\scripts\ atd. Následně použít gothicvdfs a vytvořit celý mód znovu (tedy vytvořit vlastí soubor *.mod). To bude zřejmě náročné při první tvorbě, ale tak či onak minimálně jednou to dělat budete (minimálně při konečné fázi), takže je to jedno. Jakmile se vám veškeré soubory podaří do programu naházet, nechte si uložit skript. (to uloží celý seznam všech souborů a příště jej stačí jen otevřít a nebude tak nutné tam dávat vše po jednom). Jak používat tento program pro tvorbu souboru *.mod je uvedeno v návodu po rozbalení (již jsem sem dával link). Stejně tak je tam uvedeno, jak upravit soubor ini.

prozatím všechno.
***
Uživatelský avatar
Milhaus
Zasloužilý člen fóra
 
Příspěvky: 5431
Registrován: čtv 30. srp 2007 10:35:05
Bydliště: Doma

Příspěvekod Greg » sob 20. čer 2009 18:55:25 » Re: Návod - jak na překlady
Mám problém...

Co s hláškou Error: Cannot convert from type int to instance ?
Kód: Vybrat vše
func void DIA_DiegoNW_HaveYourGold_Info()
{
   AI_Output(other,self,"DIA_DiegoNW_HaveYourGold_15_00");   //
   AI_Output(self,other,"DIA_DiegoNW_HaveYourGold_11_01");   //
   if(Npc_HasItems(other,ItSe_DiegosTreasure_Mis) >= 1)
   {
      B_GiveInvItems(other,self,ItSe_DiegosTreasure_Mis,1);
      b_diegonw_diegosrevenge();
      DiegosRevenge = TRUE;
   }
   else if(Npc_HasItems(other,ItMi_Gold < DiegosTreasure))
   {
      AI_Output(self,other,"DIA_DiegoNW_HaveYourGold_11_02");   //
      AI_Output(self,other,"DIA_DiegoNW_HaveYourGold_11_03");   //
      AI_Output(self,other,"DIA_DiegoNW_HaveYourGold_11_04");   //
   }
   else
   {
      B_GiveInvItems(other,self,ItMi_Gold,DiegosTreasure);
      b_diegonw_diegosrevenge();
      DiegosRevenge = TRUE;
   };
   if((Npc_IsDead(Gerbrandt) == FALSE) && (DiegosRevenge == TRUE))
   {
      AI_Output(self,other,"DIA_DiegoNW_HaveYourGold_11_06");   //
      AI_Output(self,other,"DIA_DiegoNW_HaveYourGold_11_07");   //
      AI_Output(self,other,"DIA_DiegoNW_HaveYourGold_11_08");   //
      CreateInvItems(self,ItWr_DiegosLetter_MIS,1);
      B_GiveInvItems(self,other,ItWr_DiegosLetter_MIS,1);
      B_StartOtherRoutine(Gerbrandt,"WaitForDiego");
      MIS_HelpDiegoNW = LOG_SUCCESS;
      MIS_DiegosResidence = LOG_Running;
      B_GivePlayerXP(XP_HelpDiegoNW);
      Log_CreateTopic(TOPIC_DiegosResidence,LOG_MISSION);
      Log_SetTopicStatus(TOPIC_DiegosResidence,LOG_Running);
      B_LogEntry(TOPIC_DiegosResidence,"Diego hat mir einen Brief für den Händler Gerbrandt gegeben.");
      AI_StopProcessInfos(self);
   };
};
Obrázek
Uživatelský avatar
Greg
Zasloužilý člen fóra
 
Příspěvky: 2016
Registrován: pon 25. úno 2008 7:20:59
Bydliště: Mezi piráty...

Příspěvekod Milhaus » sob 20. čer 2009 21:09:31 » Re: Návod - jak na překlady
taková úplně drobná chybička, kterou gothicstarter v pohodě pustí, je v tomto řádku:
Kód: Vybrat vše
else if(Npc_HasItems(other,ItMi_Gold < DiegosTreasure))


Npc_HasItems je funkce, která má dva parametry. Postavu a předmět. Vrací, kolik daná postava má danýh předmětů. Tedy zápis by měl být takový:
Kód: Vybrat vše
Npc_HasItems(other,ItMi_Gold)


podmínka je postavena na tom, že Jestli má postava méně peněz, než diego chce, pak udělej toto. Jenže zde je ono < součástí funkce. A v tom je ta chyba. Jinými slovy je špatně napsána závorka. Správně má být
Kód: Vybrat vše
else if(Npc_HasItems(other,ItMi_Gold) < DiegosTreasure)


někdy si říkám, jak je vůbec možné, že základní hra funguje, pokud jsou v ní takové chyby.
***
Uživatelský avatar
Milhaus
Zasloužilý člen fóra
 
Příspěvky: 5431
Registrován: čtv 30. srp 2007 10:35:05
Bydliště: Doma

Příspěvekod Greg » sob 20. čer 2009 21:26:01 » Re: Návod - jak na překlady
Aha díky. Už to žádný problémy nehlásí (a že jich bylo :evil: ). Ještě jedna otázka. Neznáš nějaký program, který v určité složce neprohledá jen názvy souborů, ale i jejich obsah? Zkusil jsem teda přeložit jeden mód (Fight Contest) a 3 německý slova prostě nemůžu najít...
Obrázek
Uživatelský avatar
Greg
Zasloužilý člen fóra
 
Příspěvky: 2016
Registrován: pon 25. úno 2008 7:20:59
Bydliště: Mezi piráty...

Příspěvekod Mithos » sob 20. čer 2009 21:29:19 » Re: Návod - jak na překlady
Také bych potřeboval help

mám tam napsáno error: expected

func int B_MM_DeSynchronize()
{
var int msec;
msec = Hlp_Random(1000);
AI_Waitms(self,msec);
return 0
(zde je šipka před místo této závorky)};
Obrázek
Uživatelský avatar
Mithos
Uživatel
 
Příspěvky: 258
Registrován: sob 16. kvě 2009 6:47:21

Příspěvekod Greg » sob 20. čer 2009 21:36:44 » Re: Návod - jak na překlady
Zkus tohle (return 0;):
Kód: Vybrat vše
func int B_MM_DeSynchronize()
{
   var int msec;
   msec = Hlp_Random(1000);
   AI_Waitms(self,msec);
   return 0;
};
Obrázek
Uživatelský avatar
Greg
Zasloužilý člen fóra
 
Příspěvky: 2016
Registrován: pon 25. úno 2008 7:20:59
Bydliště: Mezi piráty...

Příspěvekod Mithos » sob 20. čer 2009 21:55:18 » Re: Návod - jak na překlady
func int B_GhostSpecialDamage(var C_Npc oth,var C_Npc slf)
{
return 0`
};

teď mi to píše syntax error 0 poraďte pls.
Obrázek
Uživatelský avatar
Mithos
Uživatel
 
Příspěvky: 258
Registrován: sob 16. kvě 2009 6:47:21

Příspěvekod Milhaus » sob 20. čer 2009 23:14:45 » Re: Návod - jak na překlady
Greg píše:Aha díky. Už to žádný problémy nehlásí (a že jich bylo :evil: ). Ještě jedna otázka. Neznáš nějaký program, který v určité složce neprohledá jen názvy souborů, ale i jejich obsah? Zkusil jsem teda přeložit jeden mód (Fight Contest) a 3 německý slova prostě nemůžu najít...

total comander
***
Uživatelský avatar
Milhaus
Zasloužilý člen fóra
 
Příspěvky: 5431
Registrován: čtv 30. srp 2007 10:35:05
Bydliště: Doma

Příspěvekod Milhaus » sob 20. čer 2009 23:23:55 » Re: Návod - jak na překlady
Milten.Forever píše:func int B_GhostSpecialDamage(var C_Npc oth,var C_Npc slf)
{
return 0`
};

teď mi to píše syntax error 0 poraďte pls.

Kód: Vybrat vše
func int B_GhostSpecialDamage(var C_Npc oth,var C_Npc slf)
{
   return 0;
};


za každým příkazem musí být ;
Ten totiž odděluje řádky. Jedinou vyjímkou jsou příkazy if { příkazy pokud ano} else {příkazy pokud ne};

tak za závorku před else se ; nepíše.

závorky { } označují určitý blok, tělo. Například tělo funkce. Tělo je tedy to, co se má stát - co je součástí onoho bloku, tedy například oné fuknce. Blok může být také požít právě u podmínek if else, kde říkají, jaké příkazy se mají stát, nebo u cyklů for, kde říkají, které příkazy se mají opakovat.

Pokud tedy použiješ příkaz, například return,musí za ním být středník. Pokud to hlásí chybu se středíkem, znamená to, že buď středník na řádku chybí, nebo tam je a nemá tam být. Program označuje řádek, ve kterém je chyba červeným kolečkem na levé straně. Tedy pokud dvakrát klikneš na onu červenou hlášku, otevře se ti soubor, ve kterém byla nalezena chyba a označí se ti řádek, na kterém ta chyba je. (někdy může být v jednom souboru i více chyb).

Blbé na tom je to, že při každém překladu jakéhokoliv módu bude třeba jej takto opravovat. Protože většina módů je vytvořena pomocí skriptů z MDK, které ty chyby obsahují. Pokaždé je tedy budou obsahovat.


nicméně tu funkci, co tu uvádíš máš nějakou divnou. Já jí mám ve skriptech takovou:
Kód: Vybrat vše
func int B_GhostSpecialDamage(var C_Npc oth,var C_Npc slf)
{
   var C_Npc Quarho;
   var C_Npc Rhadem;
   var C_Npc her;
   Quarho = Hlp_GetNpc(NONE_ADDON_111_Quarhodron);
   Rhadem = Hlp_GetNpc(NONE_ADDON_112_Rhademes);
   her = Hlp_GetNpc(PC_Hero);
   if((Hlp_GetInstanceID(self) == Hlp_GetInstanceID(Quarho)) || (Hlp_GetInstanceID(self) == Hlp_GetInstanceID(Rhadem)))
   {
      Wld_PlayEffect("spellFX_BELIARSRAGE",oth,oth,0,0,0,FALSE);
      if(oth.flags != NPC_FLAG_IMMORTAL)
      {
         if(Hlp_GetInstanceID(oth) != Hlp_GetInstanceID(her))
         {
            Npc_ChangeAttribute(oth,ATR_HITPOINTS,-oth.attribute[ATR_HITPOINTS_MAX]);
         }
         else
         {
            GhostAttackWarn = GhostAttackWarn + 1;
            if(GhostAttackWarn < 3)
            {
               oth.attribute[ATR_HITPOINTS] = oth.attribute[ATR_HITPOINTS] / 2;
            }
            else if(Hlp_GetInstanceID(oth) == Hlp_GetInstanceID(her))
            {
               oth.attribute[ATR_HITPOINTS] = 0;
               AI_PlayAni(oth,"T_DEAD");
            };
         };
      };
      return FALSE;
   };
};


kde rozumná úprava by byla asi taková

Kód: Vybrat vše
func int B_GhostSpecialDamage(var C_Npc oth,var C_Npc slf)
{
   var C_Npc Quarho;
   var C_Npc Rhadem;
   var C_Npc her;
   Quarho = Hlp_GetNpc(NONE_ADDON_111_Quarhodron);
   Rhadem = Hlp_GetNpc(NONE_ADDON_112_Rhademes);
   her = Hlp_GetNpc(PC_Hero);
   if((Hlp_GetInstanceID(self) == Hlp_GetInstanceID(Quarho)) || (Hlp_GetInstanceID(self) == Hlp_GetInstanceID(Rhadem)))
   {
      Wld_PlayEffect("spellFX_BELIARSRAGE",oth,oth,0,0,0,FALSE);
      if(oth.flags != NPC_FLAG_IMMORTAL)
      {
         if(Hlp_GetInstanceID(oth) != Hlp_GetInstanceID(her))
         {
            Npc_ChangeAttribute(oth,ATR_HITPOINTS,-oth.attribute[ATR_HITPOINTS_MAX]);
         }
         else
         {
            GhostAttackWarn = GhostAttackWarn + 1;
            if(GhostAttackWarn < 3)
            {
               oth.attribute[ATR_HITPOINTS] = oth.attribute[ATR_HITPOINTS] / 2;
            }
            else if(Hlp_GetInstanceID(oth) == Hlp_GetInstanceID(her))
            {
               oth.attribute[ATR_HITPOINTS] = 0;
               AI_PlayAni(oth,"T_DEAD");
            };
         };
      };
      return FALSE;
   };
   return TRUE;
};


jelikož funkce během běhu vrací FALSE, měla by v případě nesplění podmínek vracet opak, tedy spíše TRUE.

Důležité je si uvědomit, že pokud je někde ve funkci příkaz return, znamená to, že provádění funkce se na daném místě ukončí. Tedy pokud skripta se dostanou ve fukci skrz podmíkny k příkazu return, už se nic jiného nebude provádět a funkce skončí.

Tedy v našem případě, pokud jsou kontrolovaní postavy Quarhon, nebo Rhadem (tedy pokud je to jedn, nebo druhý), pak funkce vždy dojde k příkazu return FALSE. Pokud se bude jednat o postavy jiné, nenarazí na žádný příkaz return. Proto je třeba jej tam umístit, ale zřejmě vrátit opačnou hodnotu než tu, kterou funkce již vrací, tedy v našem případě TRUE. Je třeba porozumět skriptům a umět v nich číst. Ona je totiž tato funkce volána někde jinde, v nějaké jiné funkci a pravděpodobně kontorluje to, co tato funkce vrací. Pokud by vždy vrátila nulu (tedy false), zachoval by se následný program vždy stejně, což by byla logicky chyba.
***
Uživatelský avatar
Milhaus
Zasloužilý člen fóra
 
Příspěvky: 5431
Registrován: čtv 30. srp 2007 10:35:05
Bydliště: Doma

Příspěvekod tonyskate » ned 21. čer 2009 7:16:44 » Re: Návod - jak na překlady
Možná by si někteří měli uvědomit, že se to týká překladů a ne jiných zásahů do skript. Stejně se případně nedá dohromady skupinka lidí, která by se do překladu eventuelně pustila.

Tady řešíte jakési problémy, které jsem nikdy teda neměl. Prostě sem vytáhl skripta ze souborů, přeložil co bylo potřeba a pak se zase kompilovalo zpět.
tonyskate
Moderátor GOTHICZ.NET fóra
 
Příspěvky: 451
Registrován: pát 04. led 2008 23:03:09

Příspěvekod Greg » ned 21. čer 2009 8:47:11 » Re: Návod - jak na překlady
Tak to máš kliku. Mě to vyhodilo přes 300 hlášek :shock: . Navíc se chová trochu divně. opravím všechny hlášky až na jednu. Při dalším pokusu o kompilaci mě to vyhodilo pouze jednu chybu. Tu jsem opravil a při další kompilaci jsem tam měl chyb sedum. Tak nevím jestli jsem tím jedním scriptem poškodil další nebo co. Možna sem uploadnu CZ opravený scripta...
Naposledy upravil Greg dne ned 21. čer 2009 12:31:22, celkově upraveno 1
Obrázek
Uživatelský avatar
Greg
Zasloužilý člen fóra
 
Příspěvky: 2016
Registrován: pon 25. úno 2008 7:20:59
Bydliště: Mezi piráty...

Příspěvekod tonyskate » ned 21. čer 2009 8:54:05 » Re: Návod - jak na překlady
Uploadovat opravený CZ skripta nemá cenu, když Milhaus který se na češtině podílel, skripta samozřejmě má.
tonyskate
Moderátor GOTHICZ.NET fóra
 
Příspěvky: 451
Registrován: pát 04. led 2008 23:03:09

Příspěvekod Milhaus » ned 21. čer 2009 16:32:58 » Re: Návod - jak na překlady
Greg píše:Tak to máš kliku. Mě to vyhodilo přes 300 hlášek :shock: . Navíc se chová trochu divně. opravím všechny hlášky až na jednu. Při dalším pokusu o kompilaci mě to vyhodilo pouze jednu chybu. Tu jsem opravil a při další kompilaci jsem tam měl chyb sedum. Tak nevím jestli jsem tím jedním scriptem poškodil další nebo co. Možna sem uploadnu CZ opravený scripta...

ono se to na některých kritických chybách zřejmě zastaví. Když tu chybu opravíš, kontrola jde dál a proto najde jiné chyby.

co se týče cz skript opravených, tak já je již opravené také mám, jenže to ti nepomůže. Při překladu dalšího módu budeš muset stejně opravovat veškerá skripta znovu, pokud bude onen mód založen na těch původních chybných. Budou to pravděpodobně pořád ty stejné chyby, nicméně jinak to nejde a nemůžes si dovolit překopírovat některé soubory jinými, protože nevíš, jestli je autoři módu nezměnili. Pokud by si tam tedy nahrál některé soubory z původních skript, nemuselo by pak v módu fungovat některé věci.
***
Uživatelský avatar
Milhaus
Zasloužilý člen fóra
 
Příspěvky: 5431
Registrován: čtv 30. srp 2007 10:35:05
Bydliště: Doma

Příspěvekod Milhaus » ned 21. čer 2009 16:34:44 » Re: Návod - jak na překlady
tonyskate píše:Tady řešíte jakési problémy, které jsem nikdy teda neměl. Prostě sem vytáhl skripta ze souborů, přeložil co bylo potřeba a pak se zase kompilovalo zpět.


no, ona otázka je, jaksi si ty skripta vytáhl. Zde je možnost dekompilovat jakékoliv skripta z jakéhokoliv módu. Tu jsi pokud vím nikdy neměl. Akorát je třeba opravit veškeré chyby, jelikož jinak by neproběhla kompilace.
***
Uživatelský avatar
Milhaus
Zasloužilý člen fóra
 
Příspěvky: 5431
Registrován: čtv 30. srp 2007 10:35:05
Bydliště: Doma

Příspěvekod tonyskate » ned 21. čer 2009 16:42:15 » Re: Návod - jak na překlady
Milhaus píše:
tonyskate píše:Tady řešíte jakési problémy, které jsem nikdy teda neměl. Prostě sem vytáhl skripta ze souborů, přeložil co bylo potřeba a pak se zase kompilovalo zpět.


no, ona otázka je, jaksi si ty skripta vytáhl. Zde je možnost dekompilovat jakékoliv skripta z jakéhokoliv módu. Tu jsi pokud vím nikdy neměl. Akorát je třeba opravit veškeré chyby, jelikož jinak by neproběhla kompilace.


Vytahoval jsem to tak z 20 módu a asi jen dva házeli výrazné chyby. A tu možnost jsem měl, jen když jsem se o tom s tebou před rokem bavil, tak sem v tom nebyl tak zběhlý.

A bacha na double-posty ;-).
tonyskate
Moderátor GOTHICZ.NET fóra
 
Příspěvky: 451
Registrován: pát 04. led 2008 23:03:09

Další

Kdo je online

Uživatelé procházející toto fórum: Žádní registrovaní uživatelé