Svět Might and Magic

Komunitní fórum stránek Svět Might and Magic

  • Srpen 06, 2020, 12:15:24
  • Vítejte, Host
Prosíme přihlašte se nebo zaregistrujte.

Přihlašte se svým uživatelským jménem a heslem.
Pokročilé vyhledávání -

Autor Téma: Modifikovatelnost datových souborů MMX  (Přečteno 4467 krát)

Elemir

  • Administrator
  • Zasloužilý člen
  • *
  • Příspěvků: 5952
Modifikovatelnost datových souborů MMX
« kdy: Únor 11, 2014, 17:49:49 »

Trochu mám obavy tu s podobným tématem začít, ale protože jsem dneska rozkódoval další kus závislostí, tak mě napadlo, že bych tenhle thread mohl rovnou použít jako zápisník pro poznámky :) Spíš bych se chtěl věnovat popisu, ale pokud se někdo rozhodne poznatky využít tak ...

... musím v první řadě upozornit, že jakákoliv modifikace datových souborů je jen na vlastní nebezpečí. Základem je vždy provádět zálohy originálních souborů, ať je k čemu se vracet. Upravit nějakou drobnost nemusí nutně znamenat v celkovém pohledu hry problém, ale u větších úprav můžete např. narazit na kolizi s budoucími oficiálními patchi. Co si budeme povídat, i Limbic v tom má bordel :D

Základem pro modifikace je herní adresář StaticData, který najdete pod Might and Magic X Legacy_Data -> StreamingAssets. Obsahuje sadu csv souborů s definicemi. K tomu se váže ještě lokalizační soubor loca.xml z příslušného podadresáře cz adresáře Localisation. Pro globální nastavení je třeba zmínit ještě konfigurační soubor config.txt, který je přímo v adresáři StreamingAssets.

csv soubory jsou ve své podstatě definice polí (klasický datový typ), nebo lépe řečeno, jedná se o databázové tabulky. Ve skutečnosti je opravdu velmi jednoduché obsažená data vzít, nasázet do databáze a klidně je využívat (např. naprogramovat MMX jako webbased aplikaci ;)). Základem je porozumět závislostem a umět z toho něco rozumného poskládat. Někdy je totiž třeba změnu provést ve více souborech, ostatně známý bug v Boji s obouručními zbraněmi je jen podobným způsobem přehlídnutá chyba.

A to se mi zrovna hodí k výše uvedenému varování - Limbic tuhle chybu určitě opraví, ale pokud jste to již udělali sami, budete se muset spolehnout, že jste zvolili stejnou cestu opravy, jinak vám to opět nepůjde korektně ;)
IP zaznamenána
This is the end ...

Elemir

  • Administrator
  • Zasloužilý člen
  • *
  • Příspěvků: 5952
Modifikovatelnost datových souborů MMX
« Odpověď #1 kdy: Únor 11, 2014, 17:50:03 »

config.txt
IP zaznamenána
This is the end ...

Elemir

  • Administrator
  • Zasloužilý člen
  • *
  • Příspěvků: 5952
Modifikovatelnost datových souborů MMX
« Odpověď #2 kdy: Únor 11, 2014, 17:50:23 »

StaticData, Dovednosti

Protože jsem dneska začal výpisem dovedností, předvedu pár věcí na csv souborech s jejich definicemi.

Základem dovedností jsou 2 soubory - Skills.csv a SkillEffects.csv. Ten první definuje všech 25 dovedností, jejich klíč pro název a popisek, obrázek (ikonku) a ID pro jednotlivé úrovně (Tier1Effects až Tier4Effects).

Např. pro Dýku platí:

1,SKILL_NAME_DAGGER,SKILL_DESC_DAGGER,SPL_skill_weapon_Dagger,"1,2",3,4,3,7,WEAPON

kde

1 ... ID položky (StaticID)
SKILL_NAME_DAGGER ... klíč pro popisek v souboru loca.xml (když to vyhledáte, získáte výraz Dýka ;))
SKILL_DESC_DAGGER ... klíč pro popisek v souboru loca.xml (popisek dovednosti)
SPL_skill_weapon_Dagger ... umístění ikonky v příslušném assetu
"1,2" ... ID pro normální úroveň (odpovídá StaticID 1 a 2 v souboru SkillEfects.csv)
3 ... ID pro expertní úroveň (odpovídá StaticID 3 v souboru SkillEfects.csv)
4 ... ID pro mistrovskou úroveň (odpovídá StaticID 4 v souboru SkillEfects.csv)
3 ... ID pro velmistrovskou úroveň (odpovídá StaticID 3 v souboru SkillEfects.csv)
7 ... nemám ponětí ;)
WEAPON ... kategorie dovednosti, tady zbraň (MMX zná jen 3, další dvě jsou MISC a MAGIC)

Díky tomuto znáte tedy propojení popiskových klíčů se souborem loca.xml a zároveň víte, kde hledat definice pro jednotlivé úrovně dovednosti. Pokud nyní koukneme do souboru SkillEffects.csv a vytáhneme si potřebná StaticID, získáme:

normální úroveň (Tier1Effects)

1,SKILL_EFFECT_DAGGER_ATTACK,SKILL_EFFECT_DAGGER_CURRENT_ATTACK,FALSE,TRUE,IS_EQUIPED              ,INCREASE_ATTACK_VALUE,2,PER_SKILL_LEVEL

expertní úroveň (Tier2Effects)

2,SKILL_EFFECT_DAGGER_DAMAGE,SKILL_EFFECT_DAGGER_CURRENT_DAMAGE,TRUE,TRUE,IS_EQUIPED,                    INCREASE_DAMAGE_SKILL_BONUS,0.04,PER_SKILL_LEVEL

mistrovská úroveň (Tier3Effects)

3,SKILL_EFFECT_DAGGER_STRIKE,,FALSE,TRUE,FOR_EACH_EQUIPMENT,ADDITIONAL_STRIKE,0,NONE

velmistrovská úroveň (Tier4Effects)

4,SKILL_EFFECT_DAGGER_CRIT_CHANCE,,TRUE,TRUE,FOR_EACH_EQUIPMENT,INCREASE_CRITICAL_HIT           _CHANCE,0.1,FIXED

a opět, velkými písmeny jsou uvedené popiskové klíče pro soubor loca.xml ... vlastně tu nic jiného ani nenajdeme. Takže si nejprve najdeme ještě patřičné klíče v souboru loca.xml, abychom tomu mohli lépe porozumnět:

<LocaData id="SKILL_NAME_DAGGER">Dýka</LocaData>
<LocaData id="SKILL_DESC_DAGGER">Jelikož jsou dýky lehké a malé, často jsou přehlíženy jako neúčinné zbraně. To je pravda, pokud je mají v rukách amatéři. V rukách skutečného mistra se však stávají smrtícími nástroji. Žádná zbraň není tak skvělá v opakovaných a přesných zásazích životně důležitých míst.</LocaData>
<LocaData id="SKILL_EFFECT_DAGGER_CURRENT_ATTACK">Zvyšuje {0}hodnotu útoku{1} o {2}.</LocaData>
<LocaData id="SKILL_EFFECT_DAGGER_CURRENT_DAMAGE">Zvyšuje {0}poškození{1} o {2} {0}%{1}.</LocaData>
<LocaData id="SKILL_EFFECT_DAGGER_ATTACK">Vaše {0}útočná hodnota{1} s dýkami se zvýší o {2} za {0}každou úroveň této dovednosti{1}.</LocaData>
<LocaData id="SKILL_EFFECT_DAGGER_DAMAGE">Vaše {0}poškození{1} s dýkami se zvýší o {2} {0}%{1} za každou {0}úroveň této dovednosti{1}.</LocaData>
<LocaData id="SKILL_EFFECT_DAGGER_STRIKE">Za každou drženou dýku získáte {0}jeden útok navíc{1}.</LocaData>
<LocaData id="SKILL_EFFECT_DAGGER_CRIT_CHANCE">Vaše {0}šance na kritický zásah{1} se zvýší o {2} {0}%{1} za každou drženou dýku.</LocaData>

Hezké, že? Nyní se můžeme vrátit k výpisu ze SkillEffects.csv. Vezmeme hned první položku:

1,SKILL_EFFECT_DAGGER_ATTACK,SKILL_EFFECT_DAGGER_CURRENT_ATTACK,FALSE,TRUE,IS_EQUIPED                    ,INCREASE_ATTACK_VALUE,2,PER_SKILL_LEVEL

a hledáme odpovídající klíč z loca.xml SKILL_EFFECT_DAGGER_ATTACK, SKILL_EFFECT_DAGGER_CURRENT_ATTACK. Klíče INCREASE_ATTACK_VALUE,2,PER_SKILL_LEVEL tu sice nenajdeme, ale jedná se o zápis hodnot (Type,Value,Mode) z čehož pro nás je důležitá ta číslovka 2 (zvyšuje hodnotu útoku o 2 za úroveň). Teď to spárujeme:

SKILL_EFFECT_DAGGER_ATTACK = Vaše {0}útočná hodnota{1} s dýkami se zvýší o {2} za {0}každou úroveň této dovednosti{1}.
SKILL_EFFECT_DAGGER_CURRENT_ATTACK = Zvyšuje {0}hodnotu útoku{1} o {2}.

Už je to čitelnější. Hodnoty v závorkách jsou tzv. masky, ve finále jsou nahrazeny konkrétními parametry. {0} a {1} jsou formátovací (tučně, modře). Důležitá je značka {2}, která se nahradí hodnotou definice dovednosti, tedy je to ona "2" ze zápisu INCREASE_ATTACK_VALUE,2,PER_SKILL_LEVEL (Type,Value,Mode). Podobně můžeme pokračovat dále.

Díky tomu můžeme předefinovat hodnoty útoku, pravděpodobnost kritického zásahu, nebo např. počet útoků v kole -> když např. v řetězci ADDITIONAL_STRIKE,0,NONE změníte 0 na 5, zvýší se počet útoků v expertní úrovni o 5, ve velmistrovské pak o dalších 5 (v Skills.csv  je totiž Tier2Effects roven Tier4Effects). Nebo si pro obě úrovně nadefinujeme jiné počty útoků, prostě jen změníme v Skills.csv patřičné ID (např.  Tier4Effects bude 200) a ve SkillEfects.csv přidáme patřičný řádek se StaticID 200 a doplníme jeho chování.

Jak vidno, není to zas tak složité :D
IP zaznamenána
This is the end ...

Elemir

  • Administrator
  • Zasloužilý člen
  • *
  • Příspěvků: 5952
Modifikovatelnost datových souborů MMX
« Odpověď #3 kdy: Únor 12, 2014, 14:29:49 »

StaticData, Magie

Pracovat s magií je už o kousek komplikovanější, protože je provázána většími závislostmi. Základním souborem definic je CharacterSpellsStaticData.csv, na který jsou potom navázány soubory PartyBuffs.csv (doplněk pro kouzla mající efekt na družinu, např. Ochrana proti ohni), MonsterBuffs.csv (doplněk pro kouzla mající efekt na monstra, např. Zapletení) a SummonStaticData.csv (doplněk pro kouzla s efektem vyvolávání, např. Cyklón).

Poznámka: soubor PartyBuffs.csv obsahuje také definice soch poskytujících bonusy.

CharacterSpellsStaticData.csv obsahuje hezkou řádku definic, které dokonale popisují každé kouzlo (název, popis, efekt/poškození, potřeba many apod.). Pro ilustraci přikládám definici kouzla Ohnivý šíp:

3,SPELL_FIRE_BOLT,SPELL_FIRE_BOLT_DESCRIPTION,NONE,NONE,NONE,SKILL_FIRE_MAGIC,NOVICE,    SPL_fire_FireBolt,
"FIRE,25,35",4,SINGLE_MONSTER,0,FX/FireBolt,20,0,NONE


3 ... klasicky StaticID
SPELL_FIRE_BOLT ... klíč pro jméno (loca.xml)
SPELL_FIRE_BOLT_DESCRIPTION ... klíč pro popis (loca.xml)
NONE ... podmínky zrišení kouzla
NONE ... efekt na družinu
NONE ... efekt na monstra
SKILL_FIRE_MAGIC ... potřebná dovednost
NOVICE ... potřebná úroveň dovednosti
SPL_fire_FireBolt ... umístění ikonky v assets
"FIRE,25,35" ... typ poškození, základ min. a max. damage (25-35)
4 ... dosah střely (4 čtverce)
SINGLE_MONSTER ... typ cíle (jedno monstrum)
0 ... ID pro soubor SummonStaticData.csv
FX/FireBolt ... identifikace animace
20 ... stojí many
0 ... základní cena kouzla (tady 0, protože Ohnivý šíp se dostává automaticky za naučení mgie ohně)
NONE ... je závislé na konkrétní třídě? (např. Paladin vs Přikládání rukou)

Jedná se o klasické útočné kouzlo bez speciálních požadavků. U Cyklónu by třeba bylo definováno i SummonID, odkud by se pak teprve dočetl patřičný efekt. Podobně u ochranných kouzel sesílaných na celou družinu. Ostatně si to hned můžeme ukázat na kouzle Ochrana před ohněm:

1
SPELL_FIRE_WARD
SPELL_FIRE_WARD_DESCRIPTION
NONE
FIRE_WARD ... klíč pro soubor PartyBuffs.csv
NONE
SKILL_FIRE_MAGIC
NOVICE
SPL_fire_FireWard
... u efektu není definována žádná hodnota, protože ta je odečtena právě ze souboru PartyBuffs.csv
1 ... dosah kouzla je jasný, jedná se přeci o družinu
PARTY ... typ cíle družina
0
FX/NoEffect
10
350
NONE

Když poté koukneme na klíč FIRE_WARD do souboru PartyBuffs.csv, uvidíme následující:

1,FIRE_WARD,PARTYBUFF_FIRE_WARD_NAME,PARTYBUFF_FIRE_WARD_DESCRIPTION,SPL_fire_FireWard,4,FALSE,TRUE,
0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,FALSE,FX/Buffs/WardBuffFX

První hodnoty jsou jasné (klíče pro loca.xml), číslo 4 určuje základní délku trvání kouzla a ta halda čísel dále je pak základní hodnota navýšení pro konkrétní atribut. V tomhle případě kouzlo trvá 4 kola a v základu zvyšuje odolnost proti magii ohně o 5.

Se závislostmi na souborech MonsterBuffs.csv a SummonStaticData.csv se pracuje obdobně. Za povšimnutí stojí poznámka, že mezi specifikacemi najdete i efekty z dovednosti Válečnictví, protože u nich se v principu opravdu jedná o typ magie.
IP zaznamenána
This is the end ...

Elemir

  • Administrator
  • Zasloužilý člen
  • *
  • Příspěvků: 5952
Modifikovatelnost datových souborů MMX
« Odpověď #4 kdy: Únor 14, 2014, 16:06:16 »

Pokračování Magie

Potřeboval jsem se nějakým elegantním způsobem dostat k možnosti učit se kouzla Magie temnoty a podívat se i na bonusy dovednosti Válečnictví, které se chovají taktéž jako kouzla. Jenomže v družině jsem neměl nikoho, kdo by to dokázal. Měl jsem proto dvě možnosti, buďto si sehnat save s patřičnými povoláními (případně hru rozehrát znovu s nimi), nebo to zkusit vyřešit předefinováním chování kouzel vs dovednosti. Asi nemusím dodávat, že jsem se rozhodl pro druhou možnost :D.

Rozhodně nejsem první, kdo se zkoumáním datových souborů hry zabývá a na oficiálním fóru jsem našel odkaz na Wiki jedné skupinky, kde byla popsána jednoduchá úprava bez známých vedlejších efektů. Když jsem seděl nad svým problémem, tak jsem si na to vzpomněl a rozhodl se zkusit podobný postup aplikovat i na bonusy Válečnictví, což představuje o stupeň více závislostí. Začnu ovšem od toho jednoduššího.

V principu se nejedná o nic převratného, opět platí, že i jednoduchý zásah může mít značný vliv. Vezmu jako příklad kouzlo Jiskry. V souboru CharacterSpellsStaticData.csv najdeme:

22,SPELL_AIR_SPARKS,SPELL_AIR_SPARKS_DESCRIPTION,
NONE,NONE,NONE,SKILL_AIR_MAGIC,
NOVICE,SPL_air_Sparks,"AIR,10,20",1,ALL_ADJACENT_MONSTERS,0,FX/Spark s,15,350,NONE

Podstatný je pro nás modře zvýrazněný klíč SKILL_AIR_MAGIC, který definuje příslušnost kouzla ke konkrétní škole magie. Pokud ho změním např. na SKILL_FIRE_MAGIC, bude se kouzlo Jiskry schopné naučit postava s patřičnou úrovní (NOVICE = normální) dovednosti Magie ohně. Kouzlo tak úplně vypadne ze školy Magie vzduchu.

Samozřejmě by šlo také pomocí nového StaticID kouzlo naklonovat a obě ID by se lišily akorát školou magie. Jen byste narazili na problém, že by kouzlo nebylo ve hře normálně dostupné - nenabízel by ho např. žádný učitel kouzel (pokud byste kouzlo nenadefinovaly rovnou jako bonus k odemčení školy magie). V takovém případě totiž musíte sáhnout i do souboru SpellOffers.csv, kde některému z učitelů doplníte do seznamu SaticID svého "nového" kouzla. Jak vidno, úprava jako taková je celkem triviální, ale zbytek kolem už je komplikovanější ;)

Poznámka: Teď si uvědomuju, že jsem celou dobu zamlčel jedno upozornění. Mě to přišlo jako samozřejmost, ale pro ty z vás, kdo se v databázích a spol. moc neorientují - "Každý datový soubor smí mít jen jedno unikátní StaticID!" Nelze mít vedle sebe dvě stejné hodnoty, protože by je hra nedokázala od sebe rozlišit a vedlo by to k problémům. Řádky, které začínají znakem # se berou jako komentáře a hra je nenačítá.

Přemapování Válečnictví

Pokud si budeme chtít troufnout i na takovou změnu, jako je přemapování bonusů Válečnictví na jinou dovednost, třeba právě jinou školu magie, pak musíme v první řadě předefinovat příslušnost všech bonusů do nově vybrané školy. Jedná se o následující položky ze souboru CharacterSpellsStaticData.csv:

71,WARFARE_CHALLENGE,WARFARE_CHALLENGE_DESCRIPTION,
NONE,NONE,PROVOKE,SKILL_WARFARE,
NOVICE,SPL_warfare_Challenge,,1,SINGLE_MONSTER,0,FX/NoEffect,5,0,NONE
72,WARFARE_SKULL_CRACK,WARFARE_SKULL_CRACK_DESCRIPTION,NONE,NONE,MEMORYGAP,
SKILL_WARFARE,EXPERT,
SPL_warfare_SkullCrack,,1,SINGLE_MONSTER,0,FX/NoEffect,10,0,NONE
73,WARFARE_UNSTOPPABLE_ASSAULT,WARFARE_UNSTOPPABLE_ASSAULT_DESCRIPTION,NONE,NONE,NONE              ,
SKILL_WARFARE,EXPERT,SPL_warfare_UnstoppableAssault,,1,SINGLE_MONSTER,0,FX/NoEffect,              10,0,NONE
74,WARFARE_INTERCEPT,WARFARE_INTERCEPT_DESCRIPTION,NONE,NONE,NONE,
SKILL_WARFARE,MASTER,SPL_warfare_Intercept,,1,SINGLE_PARTY_MEMBER,0,FX/NoEffect,15,0              ,NONE
75,WARFARE_FURIOUS_BLOW,WARFARE_FURIOUS_BLOW_DESCRIPTION,NONE,NONE,NONE,
SKILL_WARFARE,MASTER,SPL_warfare_FuriousBlow,,1,SINGLE_MONSTER,0,FX/NoEffect,0,0,NON              E
76,WARFARE_TAUNT,WARFARE_TAUNT_DESCRIPTION,NONE,NONE,PROVOKE,
SKILL_WARFARE,GRAND_MASTER,SPL_warfare_Taunt,,1,ALL_MONSTERS,0,FX/NoEffect,45,0,NONE              
77,WARFARE_FLAWLESS_ASSAULT,WARFARE_FLAWLESS_ASSAULT_DESCRIPTION,NONE,NONE,NONE,
SKILL_WARFARE,GRAND_MASTER,SPL_warfare_FlawlessAssault,,1,SINGLE_MONSTER,0,FX/NoEffe              ct,25,0,NONE90,WARFARE_SHATTER,WARFARE_SHATTER_DESCRIPTION,NONE,NONE,SUNDERING,
SKILL_WARFARE,NOVICE,SPL_warfare_Shatter,,1,SINGLE_MONSTER,0,FX/NoEffect,5,0,NONE

kde všechny klíče SKILL_WARFARE zaměníme např. za klíč SKILL_LIGHT_MAGIC. Tím určíme příslušnost těchto bonusů k Magii světla. Nyní už stačí jen provést přemapování hodnot Tier1Effects až Tier4Effects v souboru Skills.csv:

originální položky Válečnictví a Magie světla -

11,SKILL_NAME_WARFARE,SKILL_DESC_WARFARE,SPL_skill_misc_Warfare,"135,136,172","137,138","139,140","141,142",0,MISC
23,SKILL_NAME_LIGHT_MAGIC,SKILL_DESC_LIGHT_MAGIC,SPL_skill_magic_Light,"53,164",54,55,"110,56",1,MAGIC

Prostě jen vezmeme zeleně zvýrazněnou část a přepíšeme s ní tu modře zvýrazněnou. Tím hře řekneme, že k dovednosti Magie světla se vážnou válečnické bonusy

23,SKILL_NAME_LIGHT_MAGIC,SKILL_DESC_LIGHT_MAGIC,SPL_skill_magic_Light,
"135,136,172","137,138","139,140","141,142",1,MAGIC

... tedy následující řádky ze souboru SkillEffects.csv se přiřadí k Magii světla:

135,SKILL_EFFECT_WARFARE_MANA,SKILL_EFFECT_WARFARE_CURRENT_MANA,
FALSE,TRUE,NONE,INCR   EASE_MAXIMUM_MANA,2,PER_SKILL_LEVEL
136,SKILL_EFFECT_WARFARE_LEARN_CHALLENGE,,FALSE,TRUE,NONE,LEARN_SPELL,71,NONE
137,SKILL_EFFECT_WARFARE_LEARN_SKULL_CRACK,,FALSE,TRUE,NONE,LEARN_SPELL,72,NONE
138,SKILL_EFFECT_WARFARE_LEARN_UNSTOPPABLE_ASSAULT,,FALSE,TRUE,NONE,LEARN_SPELL,73,NONE
139,SKILL_EFFECT_WARFARE_LEARN_INTERCEPT,,FALSE,TRUE,NONE,LEARN_SPELL,74,NONE
140,SKILL_EFFECT_WARFARE_LEARN_FURIOUS_BLOW,,FALSE,TRUE,NONE,LEARN_SPELL,75,NONE
141,SKILL_EFFECT_WARFARE_LEARN_TAUNT,,FALSE,TRUE,NONE,LEARN_SPELL,76,NONE
142,SKILL_EFFECT_WARFARE_LEARN_FLAWLESS_ASSAULT,,FALSE,TRUE,NONE,LEARN_SPELL,77,NONE
172,SKILL_EFFECT_WARFARE_LEARN_SHATTER,,FALSE,TRUE,NONE,LEARN_SPELL,90,NONE

Červeně jsou zvýrazněny StaticID pro svázání s konkrétním bonusem ze souboru CharacterSpellsStaticData.csv. Pokud bychom bývali nepředefinovali dovednosti (školy magie) u jednotlivých bonusů v CharacterSpellsStaticData.csv, hra by nám sice pod Magií světla hlásila navázané bonusy, ale postava by je nedokázala odemknout, protože by nesouhlasila škola magie! (Prostě bychom na to neměli odbornost.) Ovšem takhle nám přiřazení bonusů k úrovni dovednosti Magie světla bude fungovat v pořádku. Např. odemčením Magie světla se postava automaticky naučí bonusy Výzva (StaticID 71) a Roztříštění (StaticID 90).

Edit: Samozřejmě nemusíte kvůli tomu hned rušit původní definici Magie světla, klidně je možné ji nechat v základu stejnou a jen ji o bonusy doplnit, např.

23,SKILL_NAME_LIGHT_MAGIC,SKILL_DESC_LIGHT_MAGIC,SPL_skill_magic_Light,
"53,164,136,172","54,137,138","55,139,140","110,56,141,142",1,MAGIC

zachová původní koncept, ale za každou úroveň postava ještě získá 2 válečnické bonusy. Samozřejmě stále platí, že všechny načítané válečnické bonusy musí být předefinované pro Magii světla.

\"valečnictví

Předefinování defaultního kouzla

Podobně funguje i provázání školy magie s defaultním kouzlem. Např. pro Magii vody najdeme ve Skills.csv záznam:

20,SKILL_NAME_WATER_MAGIC,SKILL_DESC_WATER_MAGIC,SPL_skill_magic_Water,
"41,153",42,43,"107,44",1,MAGIC

Zajímá nás v principu jen Tier1Effects, kde podle něj v souboru SkillEffects.csv najdeme řádek, který defijuje defaultní kouzlo:

153,SKILL_EFFECT_WATER_LEARN_SPELL_4,,FALSE,TRUE,NONE,LEARN_SPELL,34,NONE

... 34 je StaticID pro kouzlo Ledový šíp (CharacterSpellsStaticData.csv).

Pokud ho budeme chtít jen zaměnit např. za defaultní kouzlo Magie temnoty (Stínový plášť), pak jen změníme propojení v Tier1Effects, kde hodnotu 153 zaměníme za 168:

20,SKILL_NAME_WATER_MAGIC,SKILL_DESC_WATER_MAGIC,SPL_skill_magic_Water,
"41,168",42,43,"107,44",1,MAGIC

Ovšem aby to fungovalo, musíme zároveň u kouzla Stínový plášť změnit dovednost z Magie temnoty na Magii vody. Anebo to prostě celé provázat přes nové definice ID.
IP zaznamenána
This is the end ...

Elemir

  • Administrator
  • Zasloužilý člen
  • *
  • Příspěvků: 5952
Modifikovatelnost datových souborů MMX
« Odpověď #5 kdy: Únor 14, 2014, 22:11:56 »

Čistota modifikace vs chaos

Poznámka: Následující text berte spíše jen jako informaci, jak by se mělo s modifikacemi zacházet, ale jak to ke vší smůle nefunguje. Bohužel jsem se v tomto poněkud předběhl a nakonec se ukázalo, že nová StaticID není zas tak jednoduché definovat. Hra si to pravděpodobně hlídá ještě někde jinde, kam ale takto jednoduchý přístup nebude.

Vím, že jsem to psal prakticky do každého příspěvku, ale přeci jen si uvědomuju, že jsem to měl zdůraznit více :) O čem je řeč? O tvorbě nových ID. Jako vzorové ukázky je výše popsané hezké, ale naráží to na několik limitů. Tím hlavním je hrubý zásah do případných závislostí, tím vedlejším rozhození konfigurace. Všechny uvedené úpravy ve své podstatě zasahují do nastavení hry přímo, což není vždy žádoucí a je lepší jádro hry ponechat a modifikovat to jen jakoby zvenčí. Pokud se budu potřebovat vrátit k originálu, pořád ho díky tomu budu mít k dispozici a připravený k použití.

Začnu něčím jednoduchým. Namísto, abych přemapovával komplet kouzla Magie temnoty na jinou školu magie, zadefinuju raději kouzla znovu a rovnou s jinou školou. Díky tomu se nejenom zpřístupní kouzla Magie temnoty i pro tu novou školu, ale hlavně budou stále dostupná i v Magii temnoty. Hře to ve skutečnosti nebude činit problém. V souboru CharacterSpellsStaticData.csv si zkopíruju položky se StaticID 51-60, které definují všech 10 kouzel a umístím je na konec souboru.

Protože pravidlo o unikátnosti StaticID nám ukazuje duplicitu, je potřeba všechna StaticID přečíslovat. Poslední ID v souboru mám 90, takže nejjednodušší je přepsat 51-60 na 91-100. Dalším krokem bude nahradit klíč SKILL_DARK_MAGIC za SKILL_WATER_MAGIC (opět zvolím školu Magie vody).

91,SPELL_DARK_WARD,SPELL_DARK_WARD_DESCRIPTION,
NONE,DARKNESS_WARD,NONE,SKILL_WATER_MAGIC,NOVICE,SPL_dark_DarkWard,,1,PARTY,0,FX/NoEffect,10,350,NONE
92,SPELL_DARK_VISION,SPELL_DARK_VISION_DESCRIPTION,
NONE,DARK_VISION,NONE,SKILL_WATER_MAGIC,NOVICE,SPL_dark_DarkVision,,1,PARTY,0,FX/NoEffect,5,350,NONE
93,SPELL_DARK_SHADOW_CLOAK,SPELL_DARK_SHADOW_CLOAK_DESCRIPTION,
NONE,SHADOW_CLOAK,NON E,SKILL_WATER_MAGIC,NOVICE,SPL_dark_ShadowCloak,,1,PARTY,0,FX/NoEffect,15,0,NONE
94,SPELL_DARK_WHISPERING_SHADOWS,SPELL_DARK_WHISPERING_SHADOWS_DESCRIPTION,
NONE,WHIS PERING_SHADOWS,NONE,SKILL_WATER_MAGIC,NOVICE,SPL_dark_WhisperingShadows,,1,PARTY,0,FX/NoEffect,5,350,NON              E
95,SPELL_DARK_PURGE,SPELL_DARK_PURGE_DESCRIPTION,
NONE,NONE,NONE,SKILL_WATER_MAGIC,EXPERT,SPL_dark_Purge,,1,SINGLE_MONSTER,0,FX/Purge,15,700,NONE
96,SPELL_DARK_DRAIN_LIFE,SPELL_DARK_DRAIN_LIFE_DESCRIPTION,
NONE,NONE,NONE,SKILL_WATER_MAGIC,EXPERT,SPL_dark_DrainLife,"HEAL,5,6,DARK,12,20",1,SINGLE_MONSTER,0              ,FX/DrainLife,20,700,NONE
97,SPELL_DARK_SLEEP,SPELL_DARK_SLEEP_DESCRIPTION,
NONE,NONE,SLEEPING,SKILL_WATER_MAGIC,EXPERT,SPL_dark_Sleep,,1,SINGLE_MONSTER,0,FX/Sleep,25,700,NONE
98,SPELL_DARK_TERROR,SPELL_DARK_TERROR_DESCRIPTION,
NONE,NONE,TERROR,SKILL_WATER_MAGIC,MASTER,SPL_dark_Terror,,4,SINGLE_MONSTER,0,FX/Terror,20,2000,NONE
 
 
 
 
 
 
 
 
 
 
 
99,SPELL_DARK_AGONY,SPELL_DARK_AGONY_DESCRIPTION,
NONE,NONE,AGONY,SKILL_WATER_MAGIC,MASTER,SPL_dark_Agony,,4,SINGLE_MONSTER,0,FX/NoEffect,30,2000,NONE              
100,SPELL_DARK_WEAKNESS,SPELL_DARK_WEAKNESS_DESCRIPTION,
NONE,NONE,WEAKNESS,SKILL_WATER_MAGIC,GRAND_MASTER,SPL_dark_Weakness,,1,ALL_ADJACENT_MONSTERS,0,FX/DarkW              eakness,45,6000,NONE

Kdo však četl minulý příspěvek pečlivě, tuší menší zradu ;) Máme tu nová ID a kdo nás tedy bude moci tyto "verze" kouzel naučit? Samozřejmě, že nikdo :D Budeme muset proto ještě upravit soubor SpellOffers.csv. Všude, kde uvidíme původní StaticID 51-60, doplníme na konec seznamu i nová StaticID 91-100 (je dobré dodržet dělení dle potřebných úrovní, viz komentáře v souboru). Např. pro Seahaven je pro Klášterní knihovnu definováno:

#,"Seahaven /  Luce ""Church Library""",
21,"1,2,4,11,13,14,21,22,23,31,32,33,41,42,44,51,52,54,61,63,64",all novice (except start spells)
22,"45,46,47,48,49,50","expert, master and grand master of light"
23,"25,26,27,28,29",expert and master of air
24,"55,56,57",expert of dark

Zajímají nás řádky s ID 21 a 24, které definují kouzla Magie temnoty (zeleně zvýrazněné). Samozřejmě je na vás, kam si je ve skutečnosti dáte, ale raději bych to nekomplikoval. Po doplnění to tedy bude vypadat následovně (doplňky jsou zvýrazněné červeně):

#,"Seahaven /  Luce ""Church Library""",
21,"1,2,4,11,13,14,21,22,23,31,32,33,41,42,44,51,52,54,61,63,64,91,92,94",all novice (except start spells)
22,"45,46,47,48,49,50","expert, master and grand master of light"
23,"25,26,27,28,29",expert and master of air
24,"55,56,57,95,96,97",expert of dark

Zdánlivě je tento postup zdlouhavější, ale také je mnohem čistší a přehlednější. Nikoho jsme o nic neošidili, jen jsme přidali možnost učit se kouzla Magie temnoty i znalcům v oboru Magie vody. Problém nastane jen v případě, že do obchodu napochodujete se svobodným mágem, který bude ovládat obě školy magie - budou mu totiž nabídnuty obě verze kouzel. Nicméně v popisku bude vidět, které kam patří.

Pokud bychom se chtěli znovu pustit do přemapování Válečnictví, byl by postup hodně podobný. Prostě bychom zadefinovali nová StaticID pro válečnické bonusy a nadefinovali jim požadovanou školu magie. Spolu s tím bychom museli vytvořit nové položky i ve SkillEffects.csv a celé to pak propojit s přílušným záznamem ve Skills.csv. Schematicky:

záznam ve Skills.csv bude načítat příslušné StaticID ze SkillEffects.csv, kde budou nově definovány odkazy na nově definované bonusy v CharacterSpellsStaticData.csv.

Není bezpodmínečně nutné předefinovat celý záznam Magie světla. Udělat lze i takovou věc, že se původní definice jen rozšíří o bonusy z Válečnictví. Třeba takový křižák se v tu chvíli dostane k ještě zajímavějším možnostem :D.

Když to vezmu až do extrému, tak díky LEARN_SPELL ve SkillEffects.csv lze snadno dodefinovat možnost automatického naučení jakéhokoliv kouzla, třeba celé desítky. Může to pak vypadat podobně, jako bonusy z Válečnictví. Např.:

153,SKILL_EFFECT_WATER_LEARN_SPELL_4,,FALSE,TRUE,NONE,LEARN_SPELL,34,NONE

definuje automatické naučení kouzla Ledový šíp - StaticID 34. Jedná se přitom o 4. kouzlo v pořadí kouzel Magie vody - SKILL_EFFECT_WATER_LEARN_SPELL_4.

Rázem by se tak změnil celý systém učení kouzel. Variací je opravdu hodně.

Na závěr musím zmínit ještě jeden problém. Když se nad celým postupem zamyslíte, začnete si všímat, že každá nová definice nám postupně zhoršuje možnost snadnější správy "jádra" hry. Vemte si hypotetickou možnost, kdy budete potřebovat upravit parametry kouzla Vysátí života. Namísto toho, abyste editovali jen jednu položku, musíte kvůli změně editovat i její kopii pro Magii vody. Bylo by hezké, kdyby se tu dala využívat dedičnost, ale musíme se bohužel bez ní obejít.
IP zaznamenána
This is the end ...

Elemir

  • Administrator
  • Zasloužilý člen
  • *
  • Příspěvků: 5952
Modifikovatelnost datových souborů MMX
« Odpověď #6 kdy: Únor 24, 2014, 18:26:10 »

Původně jsem myslel, že budu dále pokračovat předměty, ale protože jejich definice jsou poněkud komplikovanější, rozhodl jsem se věnovat něčemu jinému a tím jsou úkoly. Následující popis má spíše za úkol ukázat návaznost úkolů na datové soubory a porozumět těmto vztahům.

Definice úkolů

O úkoly se starají celkem 2 soubory QuestSteps.csv a QuestObjectives.csv, přičemž oba jsou logicky provázané i s lokalizačním souborem loca.xml a souborem pro definici NPC (NpcStaticData.csv). Soubor QuestSteps.csv definuje samotné úkoly a podmínky jejich splnění. Soubor QuestObjectives.csv je pak výčtem jednotlivých událostí, které se v ramci úkolů zaznamenávají (takové ty body, co se pak odškrtávají jako splněné).

Struktura souboru QuestSteps.csv je následující (místo otazníků si představte prázdnou hodnotu):

3,QUEST_TYPE_MAIN,QUEST_STEP_DARKNESS_LIGHTHOUSE_1_NAME,QUEST_STEP_DARKNESS_LIGHTHOUSE_1_FLAVOR,
QUEST_STEP_DARKNESS_LIGHTHOUSE_1_SHORT,24,"4,1",0,0,110,,,0,0,,0,,NONE,0,"0,0",0

3 ... StaticID úkolu
QUEST_TYPE_MAIN ... typ úkolu (tady hlavní úkol)
QUEST_STEP_DARKNESS_LIGHTHOUSE_1_NAME ... jméno úkolu (klíč pro loca.xml)
QUEST_STEP_DARKNESS_LIGHTHOUSE_1_FLAVOR ... popisek úkolu (klíč pro loca.xml)
QUEST_STEP_DARKNESS_LIGHTHOUSE_1_SHORT ... podmínky splnění úkolu (klíč pro loca.xml)
24 ... NPC, které úkol zadává (pokud je tam 0, jedná se obvykle o navazující úkol), resp. je to StaticID pro soubor NpcStaticData.csv
"4,1" ... první číslo je StaticID pro událost v souboru QuestObjectives.csv
0 ... nastavení opakování úkolu (??)
0 ... zkušenosti za splnění (pokud je tu 0, jedná se obvykle o součást komplexnějšího úkolu, kde je odměna definována až v jednom z dalších úkolů)
110 ... StaticID navazujícího úkolu (0 by znamenala, že se nejedná o komplexní úkol a pak by o řádek výše byly uvedeny i zkušenosti)
? ... vztahuje se k lootu
? ... model předmětu z lootu
0 ... šance na získání předmětu (ostatně následující 4 položky se stále týkají předmětu - šance na očarování apod.)
0 ... PrefixChance
? ... PrefixProbabilities
0 ... SuffixChance
? ... SuffixProbabilities
NONE ... ItemSpecificationList
0 ... šance na peněžní odměnu
"0,0" ... množství zlatých
0 ... TokenID (ID záznamy do deníku apod., např. dokončení Act)

Pokud se podíváme na soubor QuestObjectives.csv, bude ideální kouknout rovnou na odkaz předchozího příspěvku, tedy hodnotu "4,1":

4,QUEST_OBJECTIVE_DARKNESS_LIGHTHOUSE_1_1,NONE,NONE,0,0,69,FALSE,FALSE,0,,AREA_NAME_TIRYA_BAY

4 ... StaticID
QUEST_OBJECTIVE_DARKNESS_LIGHTHOUSE_1_1 ... popisek údálosti (klíč pro loca.xml)
NONE ... KillMonsterClass
NONE ... KillMonsterType
0 ... KillMonsterStaticID
0 ... TokenID (identifikátor události pro záznam)
69 ... NpcID
FALSE ... IsReturn
FALSE ... IsMainObjective
0 ... DaysToPass
? ... StepsOnTerrain
AREA_NAME_TIRYA_BAY ... Location (ke které oblasti se vztahuje)

Jak vidíte, definice obsahuje řadu podmínek, ke kterým se může vztahovat, např. zabití konkrétního druhu monstra, typu monstra nebo navázání na určité NPC, stoupnutí na určitý terén apod.

Práce s tím je pak jednoduchá, jen se hledají vzájemné závislosti a podle to se úkol rekonstruuje do čitelné podoby. Význam to má třeba i v případě, že hledáte na mapě konkrétní místo, které se k úkolu vztahuje, protože to potom obsahuje identifikátor s hodnotou StaticID úkolu.
IP zaznamenána
This is the end ...

Elemir

  • Administrator
  • Zasloužilý člen
  • *
  • Příspěvků: 5952
Modifikovatelnost datových souborů MMX
« Odpověď #7 kdy: Duben 20, 2014, 23:55:15 »

Už jsem si dlouho nic do poznámek nenapsal, tak je čas to zase trochu změnit :) Shodou okolností to vyplynulo z dnešního ladění bestiáře pro DLC Sokol a Jednorožec. Mám tu zase hezky popsaný kus papíru a jak se znám, akorát riskuju, že se v tom po čase nevyznám. Takže

Bestiář a definice schopností monster

Na úvod jen v rychlosti poznamenám, že kompletovat to budu o trochu delší dobu. Zatím sem potřebuju připíchnout hlavně základní poznámky. Funkčnost, resp. provázanost příslušných datových souborů není příliš jasná. Engine hry si pravděpodobně přiřazuje k sobě určité klíče ještě podle dalších údajů, které už ovšem nejsou takto snadno dostupné. Příkladem je např. rozdíl v obsahu tooltipu kouzla Hodina spravedlnosti u rytířů. V herní obrazovce se údaje zobrazují v souladu s obsahem datového souboru, ale v bestiáři už se zobrazují data pro nižší level kouzla a není jasné, odkud se to vzalo. Svést to na konflikt patchů totiž nelze, protože rytíři se ve hře objevili až s aktuálním DLC (patchem 1.5).

Základním souborem definic pro bestiář je MonsterStaticData.csv. Najdete v něm prakticky vše o každé potvoře ve hře. Protože některé potvory umí kouzlit nebo ovládají bonusové schopnosti, jsou k základním definicím přidruženy ještě další tři soubory MonsterAbilitiesStaticData.csv (definice dovedností), MonsterSpellsStaticData.csv (definice kouzel) a MonsterBuffStaticData.csv (doplňuje definici kouzel).

Zkusíme malý příklad a ze souboru MonsterStaticData.csv vytáhneme definici Inkvizitora (StaticID 658):

658,Inquisitor,SMALL,37,Human/Imperial/Inquisitor,MONSTER_INQUISITOR,Prefabs/Creature    s/DLC_1/Inquisitor,MALE,FALSE,AVERAGE,CORE,HUMAN,INQUISITOR,"PASSABLE,WATER,ROUGH,FOR    EST",2,TRUE,
2,3,5,6,0,0,0,0,0,,,0,0,1,0.8,"1,35,2,2,1,38,1,1","Mass Heal, Pacification",15,0.75,1,1,49,122,126,,,0.1,0.5,"FOCUSED,1,MARTYR,1",
2048,125,10,1,0,0.5,"LIGHT,100,AIR,50,PRIMORDIAL,50,FIRE,25,EARTH,25,DARK,-25",70,
"POTION,5,1,1,0.15,POTION,10,1,1,0.15,POTION,11,1,1,0.01",
"4E,5,5A,1",0.06,"ARMOR,MELEE_WEAPON,SHIELD,RANGED_WEAPON,MAGIC_FOCUS",0,,0,,1,"45,60    ",0,TRUE,"1,2,5",TRUE,TRUE

... něco se mi objasnit ještě nepodařilo ...

658 ... StaticID
Inquisitor ... jméno
SMALL ... velikost
37 ... ??? (Par)
Human/Imperial/Inquisitor ...
MONSTER_INQUISITOR ... klíč pro soubor loca.xml
Prefabs/Creatures/DLC_1/Inquisitor ... cesta k modelu
MALE ... pohlaví
FALSE ... bojová hudba
AVERAGE ... AIBehaviour
CORE ... úroveň monstra (CORE - základní, ELITE - elitní, CHAMPION - šampión, BOSS - boss)
HUMAN ... třída monster (lidé)
INQUISITOR ... typ monstra (inkvizitor ... patří sem obyčejný inkvizitor, elitní inkvizitor apod.)
"PASSABLE,WATER,ROUGH,FOREST" ... smí se pohybovat přes ...
2 ... priorita pohybu
TRUE ... AlwaysTriggerAggro
2 ... rozsah seskupení (počet inkvizitorů na čtverci?) (AggroRange) Hear Outdoor
3 ... rozsah seskupení v dungeonech (AggroRangeDungeon) Hear Indoor
5 ... viditelnost venku
6 ... viditelnost uvnitř (dungeonu)
0 ... AttackRange
0 ... množství střel
0 ... útok zdálky
0 ... poškození z dálky - min
0 ... poškození z dálky - max
, ... elementární poškození zdálky
, ... DamageShare
0 ... šance na kritický zásah zdálky
0 ... kritický zásah zdálky (%)
1 ... dosah kouzla
0.8 ... šance na seslání kouzla
"1,35,2,2,1,38,1,1" ... seznam kouzel
"Mass Heal, Pacification" ... jména kouzel
15 ... magická síla
0.75 ... šance na kritický zásah kouzlem
1 ... kritický zásah kouzlem (%)
1 ... počet útoků zblízka
49 ... útok zblízka
122 ... poškození zblízka - min
126 ... poškození zblízka - max
, ... elementární útok zblízka
, ... DamageShares
0.1 ... šance na kritický zásah zblízka
0.5 ... kritický zásah zblízka (%)
"FOCUSED,1,MARTYR,1" ... speciální schobnosti (Ability)
2048 ... množství zdraví
125 ... hodnota uhýbání
10 ... hodnota zbroje
1 ... počet bloků zblízka za kolo (MeleeBlockAttemptsPerTurn)
0 ... celkový počet bloků (GeneralBlockAttemptsPerTurn)
0.5 ... šance na blok (%)
"LIGHT,100,AIR,50,PRIMORDIAL,50,FIRE,25,EARTH,25,DARK,-25" ... magické odolnosti
70 ... zkušenosti za zabití
"POTION,5,1,1,0.15,POTION,10,1,1,0.15,POTION,11,1,1,0.01" ... loot (SteadyLoot - stabilní loot, vypadne vždy)
"4E,5,5A,1" ... model předmětů (z lootu)
0.06 ... šanci na vypadnutí dalších předmětů do lootu
"ARMOR,MELEE_WEAPON,SHIELD,RANGED_WEAPON,MAGIC_FOCUS" ... specifikace takových předmětů
0 ... šance na očarování itemu (prefix)
0 ... PrefixProbabilities
, ... šance na očarování itemu (suffix)
, ... SuffixProbabilities
1 ... šance na získání zlata (%)
"45,60" ... množství zlata (min-max)
0 ... TokenID (vztah události na postavu, např. provázanost s úkolem)
TRUE ... povolení zápisu do bestiáře
"1,2,5" ... BestiaryThresholds (aktualizace záznamů bestiáře - postupné odkrývání údajů dle počtu zabitých monster)
TRUE ... ShowActionLog
TRUE ... může umřít (ano)

Někoho by mohlo překvapit, jak je datový výpis souboro oproti hernímu bestiáři rozsáhlý. Ovšem je potřeba to brát tak, že v herním bestiáři nalezneme opravdu to nejdůležitější a zbytkem se nás vývojáři rozhodli nezatěžovat.

Za povšimnutí stojí fakt, že některé hodnoty jsou zadány ve formě polí, např. seznam kouzel, odolnosti, schopnosti apod. Dekódovat některé z těchto polí nebylo úplně triviální, ale poté už mi to přišlo logické. Nejjednodušší jsou odolnosti, kde slovo představuje typ odolnosti a číslo za ním hodnotu. Např. LIGHT,100 je odolnosti proti světlu 100.

U schopností už je to o trochu složitější, viz "FOCUSED,1,MARTYR,1". FOCUSED a MARTYR jsou klíče pro soubor MonsterAbilitiesStaticData.csv, čísla za nimi představují level dovednosti. Pro MARTYR jsou definovány tři úrovně, ale všechny s hodnotou 0. Ovšem efekt MARTYRu (Mučedník) spočívá ve vyvolání buffu Hodina spravedlnosti. Koukneme tedy do souboru MonsterBuffStaticData.csv na ID 28. Hodnotě 1 u MARTYR odpovídá pole BuffValues1 a Duration1.

Nejkomplikovanějším z těch užitečných polí je ovšem seznam kouzel, viz "1,35,2,2,1,38,1,1". Obsah pole je potřeba si nejprve rozdělit po čtveřicích čísel, čímž získáme nastavení jednotlivých kouzel - 1,35,2,2 a 1,38,1,1. Inkvizitor tedy ovládá kouzla 2 (ostatně o tom víme i díky poli jména kouzel "Mass Heal, Pacification". První číslo představuje typ animace, druhé číslo je ID pro soubor MonsterSpellsStaticData.csv, třetí číslo určuje prioritu používání kouzla (čím vyšší číslo, tím raději ho protivník sesílá) a poslední (čtvrté) číslo udává level kouzla.
IP zaznamenána
This is the end ...

Albeoris

  • Host
Re:Modifikovatelnost datových souborů MMX
« Odpověď #8 kdy: Prosinec 17, 2017, 14:33:52 »

Hi! Sorry for necropos.
I finished rewriting the MMX engine. If you are still interested in the modification of the game - welcome!
https://www.nexusmods.com/mightandmagicx/mods/6
https://github.com/Albeoris/MMXLegacy
IP zaznamenána

Elemir

  • Administrator
  • Zasloužilý člen
  • *
  • Příspěvků: 5952
Re:Modifikovatelnost datových souborů MMX
« Odpověď #9 kdy: Prosinec 17, 2017, 19:20:19 »

Hi Albeoris, thanks for information.
IP zaznamenána
This is the end ...