Basic knowledge

Głównym obszarem modyfikacji będzie Database (.xml) oraz Scripts (.cs). Te pliki znajdują się w pod katalogach tego katalogu:

(Steam installation place)\Steam\steamapps\common\Master-Of-Magic\ExternalAssets

Do modyfikacji tych plików wystarczy dowolny program do edycji tekstu ale sugeruję jakieś narzędzie zadedykowane (naprzykład Notpad++).

### Data Base

Przykładowy wpis z DB. Pierwszy to kopia z DB a drugi zawiera komentarze:

```
 <SPELL-FIRE\_BOLT BattleCost="5">
 <ChangeableCost MaxMultipier="5" CostPerPoint="1" DesType ="DES\_CHANGEABLE\_COST\_DAMAGE"/>
 <DescriptionInfo Name="DES\_FIRE\_BOLT" Description="DES\_FIRE\_BOLT\_DES" Graphic="SpellFireBolt"/>
 <ResearchCost VALUE="60"/>
 <Realm VALUE="Chaos"/>
 <Rarity VALUE="Common"/>
 <TargetType VALUE="TARGET\_TYPE-UNIT\_ENEMY"/>
 <TargetingScript VALUE="STAR\_EnemyNoFireImmu\_Unit"/>
 <FIntData VALUE="5"/>
 <BattleScript VALUE="SBG\_FireBolt"/>
 <CastEffect VALUE="Effect\_FireBolt"/>
 <AudioEffect VALUE="SpellFireBolt"/>
 <InvalidTarget VALUE=""/>
 </SPELL-FIRE\_BOLT>

```

```
 <SPELL-FIRE\_BOLT BattleCost="5"> <!-- jest to koszt użycia spella podczas bitwy -->
 <ChangeableCost MaxMultipier="5" CostPerPoint="1" DesType ="DES\_CHANGEABLE\_COST\_DAMAGE"/> <!-- pozwala spell na zwiększenie fintData przez większenie ilości kosztu many. W tym przypadku to zwiększy obrażęnia spella. -->
 <DescriptionInfo Name="DES\_FIRE\_BOLT" Description="DES\_FIRE\_BOLT\_DES" Graphic="SpellFireBolt"/> <!-- odpowiada za nazwę spella, opis oraz grafikę -->
 <ResearchCost VALUE="60"/> <!-- odpowiada za koszt researcha-->
 <Realm VALUE="Chaos"/> <!-- odpowiada za zdefiniowanie Realm-a spella-->
 <Rarity VALUE="Common"/> <!-- odpowiada za to jak rzadki jest spell -->
 <TargetType VALUE="TARGET\_TYPE-UNIT\_ENEMY"/> <!-- jaka grupa targetów może zostać wybrana-->
 <TargetingScript VALUE="STAR\_EnemyNoFireImmu\_Unit"/> <!-- doprecyzowanie targetu spośród grupy (w tym przypadku przeciwnik bez odporności na ogień)-->
 <FIntData VALUE="5"/> <!-- ilość obrażeń -->
 <BattleScript VALUE="SBG\_FireBolt"/> <!-- w jaki sposób obrażenia są zadawane -->
 <CastEffect VALUE="Effect\_FireBolt"/> <!-- efekt wizualny -->
 <AudioEffect VALUE="SpellFireBolt"/> <!-- efekt dzwiękowy -->
 <InvalidTarget VALUE=""/> <!-- Informacja nadpisująca opis po kliknęciu w niewłaściwy target -->
 </SPELL-FIRE\_BOLT>

```

Powyższy wpis w DB jest jednym ze spelli magi chaosu. Każda z linijek między <SPELL-FIRE\_BOLT></SPELL-FIRE\_BOLT> odpowiada konkretnej funkcjonalności i należy tylko do danego spella. Między takimi symbolami :

```
<!-- -->

```
znajdują się komentarze, które nie wpływają na działanie DB czy skryptu. Ich zadaniem jest poprawa czytelności. Niemniej staraliśmy się by nazwy były self explanatory.
Można zwrócić uwagę, że są trzy różne rodzaje wpisów.

```
BattleCost="5"
<ChangeableCost MaxMultipier="5" CostPerPoint="1" DesType ="DES\_CHANGEABLE\_COST\_DAMAGE"/>
<FIntData VALUE="5"/>

```

Pomijając fakt, że dotyczą czegoś innego to tylko forma zapisu. Skupmy się na górnej linijce:

```
 (Wycięte tu zostały kluczowe informacje ze spella i takie działanie spowodowało by error
 w grze ale ułatwi spojrzenie na zmianę formy zapisu)

 W spellu został tylko BattleCost i jest to jego skrócony zapis:
 <SPELL-FIRE\_BOLT BattleCost="5">
 </SPELL-FIRE\_BOLT>

 Skrót można rozwinąć
 <SPELL-FIRE\_BOLT>
 <BattleCost VALUE="5"/>
 </SPELL-FIRE\_BOLT>

```
Oba te zapisy BattleCost są identyczne z punktu widzenia gry.
Teraz skupmy się na linijce ChangeableCost, ten wpis też można zapisać inaczej:

```
Ten spis można zapisać tak
<ChangeableCost MaxMultipier="5" CostPerPoint="1" DesType ="DES\_CHANGEABLE\_COST\_DAMAGE"/>
lub tak
<ChangeableCost >
 <MaxMultipier VALUE="5"/>
 <CostPerPoint VALUE="1"/>
 <DesType VALUE="DES\_CHANGEABLE\_COST\_DAMAGE"/>
</ChangeableCost>

```

Czyli ostatecznie nasz spell może wyglądać tak i nadal działać:

```
 <SPELL-FIRE\_BOLT>
 <BattleCost VALUE="5"/><ChangeableCost >
 <MaxMultipier VALUE="5"/>
 <CostPerPoint VALUE="1"/>
 <DesType VALUE="DES\_CHANGEABLE\_COST\_DAMAGE"/>
 </ChangeableCost>
 <DescriptionInfo Name="DES\_FIRE\_BOLT" Description="DES\_FIRE\_BOLT\_DES" Graphic="SpellFireBolt"/>
 <ResearchCost VALUE="60"/>
 <Realm VALUE="Chaos"/>
 <Rarity VALUE="Common"/>
 <TargetType VALUE="TARGET\_TYPE-UNIT\_ENEMY"/>
 <TargetingScript VALUE="STAR\_EnemyNoFireImmu\_Unit"/>
 <FIntData VALUE="5"/>
 <BattleScript VALUE="SBG\_FireBolt"/>
 <CastEffect VALUE="Effect\_FireBolt"/>
 <AudioEffect VALUE="SpellFireBolt"/>
 <InvalidTarget VALUE=""/>
 </SPELL-FIRE\_BOLT>

```
Spell, który edytowaliśmy jest jednym z elementów należących do DB\_SPELL. Zwróć uwagę na początek pliku i koniec pliku.iku.

```
<DB\_SPELL>
 <!-- here we can add additional spells-->
</DB\_SPELL>

```
Pierwsza linijka to otwarcie elementu (dokładnie root element ale o tym za chwilę) a ostatnia jest jego zamknięciem. Wszystko co znajduje się pomiędzy będzie zawartością elementu głównego.

#### Creating New DB Files

Jest jeden sposób, w jakie można stworzyć nowe pliki tak by były czytane przez DB. Należy stworzyć osobny plik dla każdego "Root Element", który będzie zawierał odpowiednie elementy. Ale czym jest u nas root element? Otóż jest to kategoria wpisów w db która jest definiowana przez prototyp (o tym dalej). Więc osobny plik tworzymy dla skilli, spelli, enchantmentów itd.

Jest kilka istotnych informacji o których trzeba pamiętać. Wymagane jest by plik, który stworzymy znajdował się tam gdzie reszta DB. Nazwa pliku nie jest istotna. Istotna jest zawartość pliku oraz *root element.* To on definiuje gdzie należy przypisać występujące w nim wpisy i sprawdza prototyp.

```
<DB\_SKILL> <!-- Root Element starts here-->
 <SKILL-SPREAD>
 <DescriptionInfo Name="DES\_SPREAD" Description="DES\_SPREAD\_DES" Graphic="SkillSpread"/>
 <Script TriggerType="BattleAttack" Priority="0"
 TriggerScript="ATRI\_NormalAttack"
 ActivatorMainScript="ACT\_ProduceNormalDamage"
 ActivatorSecondaryScript="ACT\_ApplyAttack"/>
 </SKILL-SPREAD>
</DB\_SKILL><!-- Root Element ends here-->

```
Powyższy przykład doda SKILL-SPREAD do listy skill, które występują w grze. (Nic w grze na tym etapie go nie używa więc nie zobaczymy go nigdzie ale zmienimy to w kolejnych krokach).

#### VALUE and Value difference

"VALUE" is a value of TaxMultiplier for example. "Value" is parameter of RaceTension for example.

Examples:

```
<TOWN-BARBARIANS>

        <TaxMultiplier VALUE="1"/>

        <RaceTension Race="RACE-BARBARIANS" Value="0"/>

</TOWN-BARBARIANS>

```
We can change example to:

```
<TOWN-BARBARIANS TaxMultiplier="1">

        <RaceTension Race="RACE-BARBARIANS" Value="0"/>

</TOWN-BARBARIANS>

```

#### DataBase - Prototype

W katalofu \Database znajduje się katalog Prototype. Jest to katalog zawierający templaty do każdego elementu DB. Zawiera sporo komentarzy, które mogą wyjaśnić działanie konkretnych mechaniznów oraz dziedziczenie.

```
<PROTOTYPE\_SUBRACE>
 <E\_WEAPON\_SLOT Type="enum" Name="EWeaponSlot">
 <None/>
 <Melee/>
 <Ranged/>
 <SpellCaster/>
 <Melee\_SpellCaster/>
 <Armour/>
 <Miscellaneous/>
 </E\_WEAPON\_SLOT>
 <SUBRACE\_AUDIO Name="SubraceAudio">
 <Move Name="move" Type="string" Required="FALSE"/>
 <AttackMelee Name="attackMelee" Type="string" Required="FALSE"/>
 <AttackRanged Name="attackRanged" Type="string" Required="FALSE"/>
 <AttackRangedHit Name="attackRangedHit" Type="string" Required="FALSE"/>
 <GetHit Name="getHit" Type="string" Required="FALSE"/>
 <Die Name="die" Type="string" Required="FALSE"/>
 <Build Name="build" Type="string" Required="FALSE"/>
 </SUBRACE\_AUDIO>
 <SUBRACE Name="Subrace">
 <DescriptionInfo Name="descriptionInfo" Type="DESCRIPTION\_INFO" Required="FALSE"/>
 <!-- optional model name, variable allowing to decouple 2d art name stored in description infor from 3d model name for modding purposes -->
 <OptionalModel3dName Name="model3d" Type="string" Required="FALSE"/>
 <Race Name="race" Type="RACE" Required="TRUE"/>
 <OriginalScaleValue Name="originalScaleValue" Type="int" Required="FALSE"/>
 <Marker Name="marker" Type="string" Required="FALSE"/>

 <Tags Name="tags" Type="ArrayCOUNTED\_TAG" Required="FALSE"/>

 <NaturalHealing Name="naturalHealing" Type="bool" Required="FALSE"/>
 <GainsXP Name="gainsXP" Type="bool" Required="FALSE"/>
 <Skills Name="skills" Type="ArraySKILL" Required="FALSE"/>
 <SpellPack Name="spellPack" Type="ArraySPELL\_PACK" Required="FALSE"/>
 <Audio Name="audio" Type="SUBRACE\_AUDIO" Required="FALSE"/>
 <Dlc Name="dlc" Type="string" Required="FALSE"/>
 </SUBRACE>

 <UNIT Name="Unit" Extends="Subrace">
 <Figures Name="figures" Type="int" Required="TRUE"/>
 <RequiredBuildings Name="requiredBuildings" Type="ArrayBUILDING" Required="FALSE"/>
 <ConstructionCost Name="constructionCost" Type="int" Required="FALSE"/>
 </UNIT>

 <HERO Name="Hero" Extends="Subrace">
 <AlterName Name="alterName" Type="Arraystring" Required="FALSE"/>
 <Champion Name="champion" Type="bool" Required="FALSE"/>
 <RecruitmentCost Name="recruitmentCost" Type="int" Required="TRUE"/>
 <RecruitmentMinFame Name="recruitmentMinFame" Type="int" Required="TRUE"/>
 <RecruitmentMinBooks Name="recruitmentMinBooks" Type="ArrayCOUNTED\_TAG" Required="FALSE"/>
 <SkillPacks Name="skillPacks" Type="ArraySKILL\_PACK" Required="FALSE"/>
 <EquipmentSlot Name="equipmentSlot" Type="ArrayARTEFACT\_SLOT" Required="TRUE"/>
 </HERO>
</PROTOTYPE\_SUBRACE>

```
Na przykład z tego pliku możemy dowiedzieć się, że HERO Extends="Subrace". Co oznacza, że HERO jest SUBRACE, jest też nią UNIT. To zasada dziedziczenia właśnie. Dzięki niej wyszukując w skrypcie SUBRACE odnajdziesz i HERO i SUBRACE.

Tags

Skills

#### Overrides (do poprawy kopia z T2)

Database files - xml files with various definitions. If an xml file contained in a mod has the exact same file name as the one delivered with the base game, it will be loaded immediately after the original. Any records that have the same name ID will overwrite the original (but if you create a record with a different name, then it will simply be added and will not overwrite anything). If a database with a new file name is created, it will be loaded after all original database files. Bear in mind that if you create entries referencing other entries, the referenced ones need to be loaded first or you will get an error.

Events - xml files containing stories. Any file included in the mod that has the same name as a file delivered with the base game will replace the original.

Localization for events - txt files. Localization will be applied to an event of the same name.

Character portraits, event art, various icons - this can be either jpg or png.

if a module file contained in the mod has the same name as the one delivered with the base game, the one from the mod will be used.

Gameplay scripts - .cs files with scripts, that should be contained within a class.

## DevMenu

jest to ukryty panel, którego zadaniem jest ułatwienie testowania gry. By dostać się do niego wciśnij L.control+shift+f1. Nie jest to idealne narzędzie i ma swoje problemy (jak choćby spawn jednostek przeciwnika czy neutralnych) ale na pewno ułatwi testowanie.

* Wszystkie pozycje z numerem 1abcd odpowiadają za włączenie możliwość odpalenia eventa
* Ta funkcjonalność daje graczowi co ture masę zasobów
* 3/4/5/7/9/10/12 dodaje do pierwszego miasta lub naszego wizarda określone bonusy.
* 6 rzuca na gracza wybrany spell
* 8/13/16 przyzywa jednostkę przeciwnego wizarda lub neutralna lub town. Bierze ostatnie pozycje kliknięcia więc pojawią się oni gdzieś w prawym górnym rogu
* 11 dodaje graczowi wszystkie spelle z gry
* 14 kończy grę przez pokonanie naszego wizarda
* 15 pokonuje przeciwnego wizarda (można użyć kilka razy)
* 17 walka w stolicy
* 18 odrywa wszyskich wizardów. Część spelli można używać dopiero jak poznamy wizardów
* 19 Każdemu wizardowi daje tylko jeden spell. Nadal mogą oni wymyślać spelle.