Creating Mods for Mighty Dungeons

Welcome to the UGC section! I have tried to be very descriptive but if you think some content is missing from this section, shoot me an email and I will do my best to update it.

Firstly, thank you so much for purchasing my game. I put a lot of time into it since September 2012, and I'm glad that people are enjoying it. And I'm even happier to see that you like the game so much you actually want to contribute too.

Accessing the Games Files

You will need a copy of a desktop version of the game (PC/Mac). Unless you are using a mobile version of the game, the desktop versions are shipping without DRM or any kind of file protection, giving you direct and easy access to the game data files. That's on purpose! When I designed Mighty Dungeons, I was inspired by boardgames like HeroQuest, Warhammer Quest and video games like Diablo and Dungeon Master. Using these boardgame roots, I designed Mighty Dungeons from the ground-up to be easily extensible. It's very easy to add new monsters, weapons, heroes, quests and other items.

Editing the games files / Creating Mods

IMPORTANT Do not modify the game data files themselves. Any modification you make may be erased the next time you update the game. Instead use the /MightyDungeons/mods folder in your Documents folder (Mac: ~/Library/ApplicationSupport, Windows:C:\Users\USERNAME\Documents\).

First find a unique name for your mod, you should start with a number between 1000 and 9999 - ex: 1000yohanmod. This will be used to order the mods. Create a folder with the name of the mod in the mods folder (%MyDocuments%/MightyDungeons/mods/1000yohanmod). All your modifications should go into this mod folder. This is where you will download the workshop mods too.

The game data files are written in JSON format. They can be opened using any text editor. I personally use Sublime Text, but that's just my personal preference.

The base game data files are stored in the resources/common folder of the installed folder. The game campaigns (and quests) have their own folder in resources/CAMPAIGNID/ folder - ex: /resources/abaddon for the Abaddon campaign.

You should be able to copy and override any of the game files by recreating the folder structure in your mod and dropping the file and modifying it there.

For instance, if you wanted to modify the monster_gang_bonus from the misc_values.json file. In your 1000yohanmod folder, create a resources folder, drop the misc_values.json file. Open it and remove everything except

{

monsters_gang_bonus: 50

}

Make sure to remove the extra "comma" at the end of the monster_gang_bonus line and set the number that you want (in percentages) - ex:1000. Restart the game and the monsters will now have a super high gang up bonus.

Disabling Mods

You can easily disable a mod by creating a disabled.txt file into the root of that mod folder. Make sure you disable any mod that depends on it using the same method.

Updating Lists & Tables

Important If you want to add a value into a list (typically adding a hero to the list of heroes able to use a certain weapon), just use the name of the list and add only 1 value to it. The modding engine for the game always combine mod array lists.

{

"hero":["naruto"]

}

As for tables, the modding engine will override value by value. Ex using misc_values.json:

{

[...]

"default_price_per_q1" : {

"Weapon" : 12,

"Armor" : 5

},

[...]

}

Overriding the value for Armor only

{

"default_price_per_q1" : {

"Armor" : 12

}

}

Validating the JSON

You will NEED to validate the game data files before you can distribute them. Just to be sure that the JSON that you wrote is usable by the game. You can use the free online tool called JSONlint. Copy the content of the file to the site, click the "Validate" button and check the errors that it generates. Copy-paste and try again. When JSONLint is all green, you can add the file to the game :)

Sample Mod

You can download this file, put it in your documents /MightyDungeons/mods/ folder and you should see the new hero in Extra > Change Hero > New Hero list.

Creating and Updating the Shop

The shop is dynamically constructed using all the items from the resources and mods folder that have a price and are not tagged as "noshop:1". In quests, you can also create NPCs that are carrying a shop around by using the JSON structure below.

If you are creating a quest that includes a NPC carrying around a shop (great for refueling while in a quest), you need to copy that structure and add all the item classes that the NPC can offer.

{

"spells" :[

{"class":"acidwall"},

{"class":"pet_firedemon"}

],

"potions" :[

{"class":"health"}

],

"shield" :[

{"class":"shield_largemithril"}

],

"legs" :[

{"class":"legs_mithril"}

],

"body" :[

{"class":"body_mithrilarmor"}

],

"arms" :[

{"class":"arms_mithrilgauntlets"}

],

"head" :[

{"class":"head_mithrilhelmet"}

],

"pet" :[

{"class":"pet_mithrilgolem"}

],

"weapons" :[

{"class":"double_mithrilwarhammer"}

],

"articles" :[

{"class":"toolkit"}

]

}

Overriding values

You can override any of the shop item's default values in the shop. For instance, if you want to create a NPC that carries around a shop with health potions to be distributed in quests, but super expensive, you can do so by declaring the NPC in the quest, adding a the following shop JSON structure to it's properties:

{

"potions" :[

{"class":"health", "price":10000}

]

}

Games Values & Achievements

The file /resources/misc_values.json contains all the global values that the game uses from gang-up bonus for monsters, to list of achievements.

Misc Values

"tavern_meal_price": 80,

Max price of the meal at the Tavern. Actual price will be this value % remaining life left

"tavern_meal_price_min": 5,

Min price of the meal at the Tavern

"quest_redo_price": 1,

Default price to pay for redoing quests

"divine_intervention_price": 1,

DEPRECATED - the Divine Intervention feature has been deprecated (the provider for the web service I was using closed down...)

"default_price_per_q1": {

"Weapon": 12,

"Armor": 5

},

Default price for buying 1 item of each type

"equipment_upgrade": {

"Weapon": {

"attack_bonus_percent" : 20,

"defense_bonus_percent" : 10,

"defense_handicap_percent" : 10,

"cost_percent" : 40,

"price_bonus" : 10


},

"Armor": {

"defense_bonus_percent" : 15,

"attack_bonus_percent" : 10,

"attack_handicap_percent" : 10,

"cost_percent" : 40,

"price_bonus" : 10

}

},

Default price/percentages to upgrade weapons at the Blacksmith

"monsters_gang_bonus": 50,

Percentage bonus for each monster in a gang

"magic_upgrade_percent": 10,

I use a non-linear curve for the magic strength based on the difference in level between spell and spellcaster.

Actual Equation:

(100 + magic_upgrade_percent * (mind_delta ^ ((11-(spell.mind*(mind_delta/(11-spell.mind+9))))/(11-spell.mind))) ) /100

Campaign Packages

This is where the game loads all campaigns shown on the Quests selection screen.

"packages": [

"skeltor",

"forbiddendungeons",

"abaddon",

"chaosgods",

"origins",

"hellgates",

"goblinking",

"blacksheep"

],

If you create a new campaign in a mod, the game will automatically add it to the list, you don't have to touch this field.

Achievements

Although you can add new ones (and modify existing ones) pretty easily, they will not be connected to Steam (if you are using Steam) as I need to register the achievements with Steam manually. Don't hesitate to submit your misc_values.json to me if you want me to add your achievements to Steam.


Creating & Updating Weapons

It is really easy to create weapons for Mighty Dungeons. What you need:

  • Cool name for your item: "Axe"

  • Unique ID for your item (that nobody else will use): "yohanaxe". Please pick a name with no space and special character (stick to [a-zA-Z0-9]).

  • 128x128 PNG image with transparent background of your item that will be shown in the store and inventory - yohan_axe.png

  • 48x48 PNG image with transparent background of your item that will be shown in the store and inventory - yohan_axe_icon.png (must end with "_icon")

  • Name and Description of your item translated in multiple languages (at least en, ru,de,pl,it,es,fr,hu). If you don't want to translate it you will not be able to sell it. You can use Google Translate as a basic translation tool to help you with that.

  • JSON file describing your item "yohan_axe.json"

Game Data File

Name of the item. Important for legendary "named" items (like Excalibur), you can just copy the name in all the languages

"name" : {

"en":"Axe",

"ru":"Топор",

"jp":"",

"cn":"",

"ko":"",

"de":"Axt",

"pl":"Topór",

"br":"",

"it":"Ascia",

"es":"Hacha",

"fr":"Hâche",

"hu":"Fejsze"

},

Description of the item translated in multiple languages

"description" : {

"en":"Forceful weapon to slash around. Heavy and cumbersome, makes it hard to defend.",

"ru":"Мощное оружие против близко подобравшихся врагов, но тяжелое и громоздкое.",

"jp":"",

"cn":"",

"ko":"",

"de":"Kraftvolle Waffe um gut auszuteilen! Massiv und schwerfällig, nicht einfach zum Verteidigen.",

"pl":"Potężna broń sieczna. Jej ciężar i nieporęczność utrudniają obronę.",

"br":"",

"it":"Potente arma da brandire. Pesante e ingombrante, rende difficile difendersi.",

"es":"Arma contundente. Pesada y engorrosa, complica la defensa.",

"fr":"De gros dégats aux ennemis qui se rapprochent trop près, mais lourd et encombrant.",

"hu":"Eroteljes fegyver a vagdalkozáshoz. Nehéz és ormótlan, a védekezés vele igen nehéz."

},

Define the stats of your item

// Number of attack dice rolled when using the weapon

"attack" : 35,


// Min HP damage the wepaon will make even if none of the rolled dice are a hit

"attack_min" : 10,


// Base number of attacks this weapon can make before breaking

// IMPORTANT: if you set 0 here it becomes an infinite weapon (like Mithril)

// AND upgradable by the Blacksmith!!!

"num_attack" : 100,


// Handicap in defense points when using the weapon (can be 0).

// Both handicap and bonus cannot be > 0

"defense_handicap" : 5,


// Bonus in defense points when using the weapon (can be 0).

// Both handicap and bonus cannot be > 0

"defense_bonus" : 0,


// Weight of the item (unit doesn't matter).

// This determines the amount of stamina consumed when wielding the item

// To set a proper weight, check how heavy it would be compared to other items

"weight" : 20,


// Range of the item. **This is not used by the game**

"range" : 1,


// Kind of item "melee" or "ranged"

"kind" : "melee",


// Base price of the weapon

"price" : 25000,


// Set to 1 to hide this item from the village store

noshop : 0

Define which heroes that can use that item. Just add a mod with the name with an empty heero list and add the id of your hero into the list

"hero":[

"beastmaster",

"barbarian",

"bandit",

"dwarf",

"sephirothkid",

"sephiroth",

"firedemon",

"waterdemon",

"stonegolem",

"skeleton",

"lizardman"

],

Define the sound the weapon makes when used. You can add new sounds to the resources/common/Common/sounds/ folder by dropping a ogg file with the name attack_XXX.ogg (replace XXX by the unique name of your sound - ex yohan_sword). You can see the list of sounds available in that same folder.

"sound_id" : "sword"

Define which skills are required to use that items.

"skills": ["sword", "mithril"]

Creating & Updating Armors

It is really easy to create a new Armor for Mighty Dungeons. What you need:

  • Cool name for your item: "Chainmail Gauntlets"

  • Unique ID for your item (that nobody else will use): "armsyohan_chainmail_gauntlets". Please pick a name with no space and special character (stick to [a-zA-Z0-9]). It will be prefixed with the kind of armor (see below).

  • 128x128 PNG image with transparent background of your item that will be shown in the store and inventory - arms_yohan_chainmail_gauntlets.png

  • 48x48 PNG image with transparent background of your item that will be shown in the store and inventory - arms_yohan_chainmail_gauntlets_icon.png (must end with "_icon")

  • Name and Description of your item translated in multiple languages (at least en, ru,de,pl,it,es,fr,hu). If you don't want to translate it you will not be able to sell it. You can use Google Translate as a basic translation tool to help you with that.

  • Pick a Kind of armor: "shield", "legs", "body", "arms", "head", "pet"

  • JSON file describing your item "arms_yohan_chainmail_gauntlets.json"

Game Data file

Name of the item. Important for legendary "named" items (like Excalibur), you can just copy the name in all the languages

"name" : {

"en":"Chainmail Gauntlets",

"ru":"Кольчужные рукавицы",

"jp":"",

"cn":"",

"ko":"",

"de":"Kettenhandschuh",

"pl":"Rękawice Kolcze",

"br":"",

"it":"Guanti di Maglia",

"es":"Guanteletes de Malla",

"fr":"Gantelets de mailles",

"hu":"Lánckesztyuk"

},

Description of the item translated in multiple languages

"description" : {

"en":"Lightweight gauntlets, its flexible material makes it easy to handle weapons.",

"ru":"Легкие рукавицы из упругих материалов, которые позволяют легко управлять оружием.",

"jp":"",

"cn":"",

"ko":"",

"de":"Leichter Handschuh, sein bewegliches Material macht es einfach, Waffen zu halten",

"pl":"Lekkie rękawice, ich struktura ułatwia trzymanie broni.",

"br":"",

"it":"Guanti leggeri, il materiale flessibile permette di maneggiare facilmente le armi",

"es":"Guanteletes ligeros, su material flexible facilita el manejo de armas.",

"fr":"Gantelets légers en matériaux flexibles permettant de manipuler des armes.",

"hu":"Könnyü kesztyuk, rugalmas anyaga miatt könnyen használhatók viselése közben a fegyverek."

},

Define the Kind of armor: "shield", "legs", "body", "arms", "head", "pet".

"kind" : "arms",

Define the stats of your item

// Number of defense dice rolled when wearing the armor

"defense" : 35,


// Min HP damage the armor will block even if defense rolls have all failed

"defense_min" : 10,


// Base number of hits this armor can block before breaking

// IMPORTANT: if you set 0 here it becomes an infinite armor (like Mithril)

// AND upgradable by the Blacksmith!!!

"num_defense" : 100,


// Handicap in attack points when wearing the armor (can be 0).

// Both handicap and bonus cannot be > 0

"attack_handicap" : 5,


// Bonus in attack points when using the armor (can be 0).

// Both handicap and bonus cannot be > 0

"attack_bonus" : 0,


// Weight in Kilograms of the item. **This is not used by the game**

"weight" : 20,


// Base price of the item

"price" : 25000,


// Set to 1 to hide this item from the village store

noshop : 0

}

Define which heroes that can use that item. Just add a mod with the name with an empty heero list and add the id of your hero into the list

"hero":[

"beastmaster",

"barbarian",

"bandit",

"dwarf",

"sephirothkid",

"sephiroth",

"firedemon",

"waterdemon",

"stonegolem",

"skeleton",

"lizardman"

],

Define which skills are required to use that items. The skills are based on the kind of armor

"skills": ["plate", "mithril"]

Creating & Updating Potions

It is really easy to create potions for Mighty Dungeons. What you need:

  • Cool name for your item: "Potion of Regeneration"

  • Unique ID for your item (that nobody else will use): "yohanregeneration". Please pick a name with no space and special character (stick to [a-zA-Z0-9]).

  • 128x128 PNG image with transparent background of your item that will be shown in the store and inventory - yohan_regeneration.png

  • 48x48 PNG image with transparent background of your item that will be shown in the store and inventory - yohan_regeneration_icon.png (must end with "_icon")

  • Name and Description of your item translated in multiple languages (at least en, ru,de,pl,it,es,fr,hu). If you don't want to translate it you will not be able to sell it. You can use Google Translate as a basic translation tool to help you with that.

  • JSON file describing your item "yohan_regeneration.json"

Game Data File

Name of the item. Important for legendary "named" items (like Excalibur), you can just copy the name in all the languages

"name" : {

"en":"Potion of Regeneration",

"ru":"Зелье Восстановления",

"jp":"",

"cn":"",

"ko":"",

"de":"Trank der Regeneration",

"pl":"Mikstura Regeneracji",

"br":"",

"it":"Pozione di Rigenerazione",

"es":"Poción de Regeneración",

"fr":"Potion de Régéneration",

"hu":"A regeneráció fözete"

},

Description of the item translated in multiple languages

"description" : {

"en":"This is the ultimate healing potion, whoever drinks it will completely recover all lost body points.",

"ru":"Это лучшее целительное зелье, она полностью восстановит все потери.",

"jp":"",

"cn":"",

"ko":"",

"de":"Dies ist der ultimative Heiltrank, wer ihn zu sich nimmt, bekommt alle verlorenen Body pts. ersetzt.",

"pl":"Najpotężniejsza z mikstur leczniczych, kto ją wypije odzyska wszystkie punkty zdrowia.",

"br":"",

"it":"Pozione di salute finale, chiunque la beva recupererà tutta la salute persa.",

"es":"Quien quiera que la beba recuperará completamente todos sus puntos de vida perdidos.",

"fr":"C'est l'ultime potion de soins. Recouvrez tous vos points de vie perdus.",

"hu":"Ez a legerösebb gyógyfözet,amit ha bárki elfogyaszt, visszanyeri az összes elveszett életeröpontját."

},

Define the stats of your item


// Base price

"price" : 25000,


// Set to 1 to hide this item from the village store

noshop : 0

Note that you don't need to specify who can use the potions since anybody can drink a potion :)

Defining the Magic

You need to define the magic that the potion will trigger when a hero drinks it. Example:

"magic" : [{

"subject" : "Self",

"effect" : "body_all"

}

]

You only can use magic that can target "Self" (since you are drinking the potion and not throwing it at the enemy, maybe in a future release though :)

Here is the list of "self" magic effects that you can use

// recuperates all lost body points (up to body_max)

"body_all",


// loses all body points except 1

"body_1",


// set body value to X

// requires params: "quantity"

"body_set",


// Add body points (up to body_max)

// requires params: "quantity"

"body_plus",


// Loses body points

// requires params: "quantity"

"body_minus",


// increases body max points and refills all body points

// requires params: "quantity"

"body_max_plus",


// recuperates all lost mind points (up to body_max)

"mind_all",


// loses all mind points except 1

"mind_1",


// set mind value to X

// requires params: "quantity"

"mind_set",


// Add mind points (up to mind_max)

// requires params: "quantity"

"mind_plus",


// Removes mind points

// requires params: "quantity"

"mind_minus",


// Increases mind max points and refills all mind points

// Requires params: "quantity"

"mind_max_plus",


// increases attack points temporarily

// requires params: "quantity", "duration" (in seconds)

"attack_plus",


// decreases attack points temporarily

// requires params: "quantity", "duration" (in seconds)

"attack_minus",


// increases defense points temporarily

// requires params: "quantity", "duration" (in seconds)

"defense_plus",


// decreases defense points temporarily

// requires params: "quantity", "duration" (in seconds)

"defense_minus",


// increases attack speed (in percentage)

// requires params: "quantity",

// optional params: "duration" (in seconds)

"speed_plus",


// decreases attack speed (in percentage)

// requires params: "quantity"

// optional params: "duration" (in seconds)

"speed_minus",


// invincibility / cannot be hit

// requires params: "duration" (in seconds)

"invincibility",


// invisibility / cannot be seen (no attack, no follow)

// requires params: "duration" (in seconds)

"invisibility",


// immunity to magic effects (spells and potions)

// requires params: "duration" (in seconds)

"immunity_magic",


// Summon a pet

// requires params: "class","package",... of the pet

// optional params: "duration" (in seconds)

"summon_pet",


// Will resurrect to full body+mind if killed while the magic is in effect

// optional params: "duration" (in seconds)

"resurrect",


// Paralized, cannot attack

// requires params: "duration" (in seconds)

"paralize"

Creating & Updating Spells

It is really easy to create spells for Mighty Dungeons. What you need:

  • Cool name for your item: "Acid Bolts"

  • Unique ID for your item (that nobody else will use): "yohanacidbolts". Please pick a name with no space and special character (stick to [a-zA-Z0-9]).

  • 128x128 PNG image with transparent background of your item that will be shown in the store and inventory - yohan_acidbolts.png

  • 48x48 PNG image with transparent background of your item that will be shown in the store and inventory - yohan_acidbolts_icon.png (must end with "_icon")

  • Name and Description of your item translated in multiple languages (at least en, ru,de,pl,it,es,fr,hu). If you don't want to translate it you will not be able to sell it. You can use Google Translate as a basic translation tool to help you with that.

  • JSON file describing your item "yohan_acidbolts.json"

  • PEX file describing the particle effects of the spell "yohan_acidbolts.pex"

  • 72x72 PNG image with transparent background to be used by your particle script (PEX)

Game Data File

Name of the item. Important for legendary "named" items (like Excalibur), you can just copy the name in all the languages

"name" : {

"en":"Acid Bolts",

"ru":"Кислотные болты",

"jp":"",

"cn":"",

"ko":"",

"de":"Säurepfeile",

"pl":"Kwasowe Strzały",

"br":"",

"it":"Sfere di acido",

"es":"Rayo Ácido",

"fr":"Boules d'acide",

"hu":"Savlövedékek"

},

Description of the item translated in multiple languages

"description" : {

"en":"Will cast acid bolds towards the enemy inflicting 25 body pts, 10 defense pts and 5 attack pts damages.",

"ru":"Запустите кислотные болты в ваших врагов, они нанесут следующий урон: 25 пунктов здоровья, 10 пунктов защиты, 5 пунктов атаки",

"jp":"",

"cn":"",

"ko":"",

"de":"Schleudert Säurepfeile auf die Gegner, verursacht Schäden von -25 Körper pts., -10 Defense pts., -5 Attack pts.",

"pl":"Ciska kwasowe strzały we wroga zadając obrażenia o wartości 25 pkt życia, 10 pkt obrony i 5 pkt ataku.",

"br":"",

"it":"Evoca contro i nemici delle sfere di acido che causano danni per 25 punti, 10 punti di difesa e 5 punti di attacco.",

"es":"Invoca rayos ácidos contra el enemigo que causan daños por valor de 25 puntos de vida, 10 puntos de defensa y 5 puntos de ataque.",

"fr":"Invoque des boules d'acide vers vos ennemis infligeant 25 pts de dégâts, 10 pts de défense, 5 pts d'attaque de moins.",

"hu":"Savlövedékeket lö ki az ellenségre, 25 test, 10 védelmi és 5 támadáspontot sebezve."

},

Define the base stats of your item


// Base price of the item

"price" : 25000,


// Set to 1 to hide this item from the village store

noshop : 0

Define the required mind level to cast the spell

"mind" : 5,

Define which heroes that can use that item. Just add a mod with the name with an empty heero list and add the id of your hero into the list

"hero":[

"beastmaster",

"barbarian",

"bandit",

"dwarf",

"sephirothkid",

"sephiroth",

"firedemon",

"waterdemon",

"stonegolem",

"skeleton",

"lizardman"

],

Define the particle effect

// Number of particle bolts emitted. Up to 5

"num_bolts":4,


"particles":{

// Scale of the particles from monster to hero

"m>h":{"endScaleX":50,"endScaleY":50},


// Scale of the particles from hero to monster

"h>m":{"endScaleX":3.5,"endScaleY":3.5}

}

Define the school of magic this spell belongs to

"school": "necromancy"

Defining the Magic

You need to define the magic that the spell will trigger when a hero casts it. Example:

"magic" : [{

"subject" : "Self",

"effect" : "body_all"

}

]

You can target "Self" (being the hero or a monster), "Monster", "Hero".

Magic targeting the Hero/Monster/Self

// recuperates all lost body points (up to body_max)

"body_all",


// loses all body points except 1

"body_1",


// set body value to X

// requires params: "quantity"

"body_set",


// Add body points (up to body_max)

// requires params: "quantity"

"body_plus",


// Loses body points

// requires params: "quantity"

"body_minus",


// recuperates all lost mind points (up to body_max)

"mind_all",


// loses all mind points except 1

"mind_1",


// set mind value to X

// requires params: "quantity"

"mind_set",


// Add mind points (up to mind_max)

// requires params: "quantity"

"mind_plus",


// Removes mind points

// requires params: "quantity"

"mind_minus",


// Increases mind max points and refills all mind points

// Requires params: "quantity"

"mind_max_plus",


// increases attack points temporarily

// requires params: "quantity", "duration" (in seconds)

"attack_plus",


// decreases attack points temporarily

// requires params: "quantity", "duration" (in seconds)

"attack_minus",


// increases defense points temporarily

// requires params: "quantity", "duration" (in seconds)

"defense_plus",


// decreases defense points temporarily

// requires params: "quantity", "duration" (in seconds)

"defense_minus",


// increases attack speed (in percentage)

// requires params: "quantity",

// optional params: "duration" (in seconds)

"speed_plus",


// decreases attack speed (in percentage)

// requires params: "quantity"

// optional params: "duration" (in seconds)

"speed_minus",


// immunity to magic effects (spells and potions)

// requires params: "duration" (in seconds)

"immunity_magic",


// Summon a pet

// requires params: "class","package",... of the pet

// optional params: "duration" (in seconds)

"summon_pet",

Magic targeting the Hero Only


// increases body max points and refills all body points

// requires params: "quantity"

"body_max_plus",


// Increases mind max points and refills all mind points

// Requires params: "quantity"

"mind_max_plus",


// invincibility / cannot be hit

// requires params: "duration" (in seconds)

"invincibility",


// invisibility / cannot be seen (no attack, no follow)

// requires params: "duration" (in seconds)

"invisibility",

Magic targeting the Monster Only

Note that you can add the "classId" property (with the actual monster class) to each of the effects to restrict the effect to a certain class of monster


// instantly kill the monster, no loot (unless mandatory)

"kill",


// instantly scare the monster, force loot

"scare",

PEX Particle File

I will not go into details here, I recommend that you read tutorials about particle engines before you create your own PEX file. You can just rely on a PEX from one of your favorite existing spells for starters.

<particleEmitterConfig>

<texture name="yohan_acidbolts.png" />

<sourcePosition x="0" y="0" />

<!-- sourcePosition x="392.04" y="523.06" / -->

<sourcePositionVariance x="0.00" y="-0.00" />

<speed value="30.00" />

<speedVariance value="0.00" />

<particleLifeSpan value="0.5500" />

<particleLifespanVariance value="0.0000" />

<angle value="360.00" />

<angleVariance value="360.00" />

<gravity x="0.00" y="0.00" />

<radialAcceleration value="0.00" />

<tangentialAcceleration value="0.00" />

<radialAccelVariance value="0.00" />

<tangentialAccelVariance value="0.00" />

<startColor red="0.00" green="0.0" blue="0.20" alpha="1.00" />

<startColorVariance red="0.00" green="0.00" blue="0.00" alpha="0.50" />

<finishColor red="0.00" green="0.00" blue="1.00" alpha="0.40" />

<finishColorVariance red="0.00" green="0.00" blue="0.00" alpha="0.00" />

<maxParticles value="80" />

<startParticleSize value="60.00" />

<startParticleSizeVariance value="50.00" />

<finishParticleSize value="80.00" />

<FinishParticleSizeVariance value="0.00" />

<duration value="-1.00" />

<emitterType value="0" />

<maxRadius value="100.00" />

<maxRadiusVariance value="0.00" />

<minRadius value="0.00" />

<rotatePerSecond value="0.00" />

<rotatePerSecondVariance value="0.00" />

<blendFuncSource value="770" />

<blendFuncDestination value="1" />

<rotationStart value="0.00" />

<rotationStartVariance value="50.00" />

<rotationEnd value="0.00" />

<rotationEndVariance value="70.00" />

</particleEmitterConfig>

Creating & Updating Articles

It is really easy to create articles for Mighty Dungeons that you will be able to use in your quests. What you need:

  • Cool name for your Trap: "Eye of Divination".

  • Unique ID for your Trap (that nobody else will use): "yohaneye_divination". Please pick a name with no space and special character (stick to [a-zA-Z0-9]).

  • 128x128 PNG image with transparent background of your article that will be displayed in shop and inventory - yohan_eye_divination.png

  • 48x48 PNG square image with transparent background that will be displayed in shop and inventory - yohan_eye_divination.png (must end with "_icon")

  • Name and Description of your article translated in multiple languages (at least en, ru,de,pl,it,es,fr,hu). If you don't want to translate it you will not be able to sell it. You can use Google Translate as a basic translation tool to help you with that.

  • JSON file describing your item "yohan_eye_divination.json"

Game Data File

Name of the item. Important for legendary "named" items (like Excalibur), you can just copy the name in all the languages

"name" : {

"en":"Eye of Divination",

"ru":"глаза гадания",

"jp":"",

"cn":"",

"ko":"",

"de":"Auge der Weissagung",

"pl":"Oko Wróżb",

"br":"",

"it":"Occhio di divinazione",

"es":"Ojo de la Adivinación",

"fr":"Oeil de divination",

"hu":"Szem jóslás"

},

}

Description of the item translated in multiple languages

"description" : {

"en":"Use this artifact to call on the gods in a dungeon and swing fate in your favor.",

"ru":"Используйте этот артефакт призывать богов в темницу и качели судьбы в вашу пользу.",

"jp":"",

"cn":"",

"ko":"",

"de":"Verwenden Sie dieses Artefakt auf die Götter in einem Verlies und Swing Schicksal in Ihren Gunsten nennen.",

"pl":"Użyj tego artefaktu w Lochu aby wezwać bogów i zmienić los na swoją korzyść.",

"br":"",

"it":"Utilizza questo manufatto per richiamare gli dei in un sotterraneo e volgere il destino a tuo favore.",

"es":"Utiliza este artefacto para invocar la ayuda de los dioses en una mazmorra e inclinar la balanza a tu favor.",

"fr":"Utilisez cet artéfact dans un donjon pour appeller les dieux et faire basculer le destin en votre faveur.",

"hu":"Ezzel a lelet, hogy hívja fel az istenek egy börtön, és swing sorsa az Ön javára."

},

Define the stats of your item

// Base price of that item in the store

"price" : 500,

// Set to 1 to hide this item from the village store

noshop : 0

Creating & Updating Traps

It is really easy to create a new Trap for Mighty Dungeons. What you need:

  • Cool name for your Trap: "Falling Blocks Trap".

  • Unique ID for your Trap (that nobody else will use): "yohanfalling_blocks". Please pick a name with no space and special character (stick to [a-zA-Z0-9]).

  • 160x160 PNG image with transparent background of your Trap that will be shown in popups - yohan_falling_blocks.png

  • 64x64 PNG square image with transparent background that will be used as token on the board - yohan_falling_blocks_icon.png (must end with "_icon"). Ideally it should be viewed from the top. The final size will depend on the size of the monster on the board, in multiple of 64.

  • Name and Description of your trap translated in multiple languages (at least en, ru,de,pl,it,es,fr,hu). If you don't want to translate it you will not be able to sell it. You can use Google Translate as a basic translation tool to help you with that.

  • JSON file describing your TRap "yohan_falling_blocks.json"

Game Data File

Name of the item. Important for legendary "named" items (like Excalibur), you can just copy the name in all the languages

"name" : {

"en":"Falling Blocks Trap",

"ru":"Камнепад",

"jp":"",

"cn":"",

"ko":"",

"de":"Steinschlagfalle",

"pl":"Spadający Gruz",

"br":"",

"it":"Frana",

"es":"Desprendimiento",

"fr":"Eboulement",

"hu":"Lehulló téglák csapda"

},

Description of the item translated in multiple languages

"description" : {

"en":"If you activate this trap you will feel the pain. You can try to jump over it, but disarming it remains the best option.",

"ru":"Если вы активируете эту ловушку, то почувствуете боль. Можно попробовать перепрыгнуть через нее, но лучший вариант - обезвредить ее.",

"jp":"",

"cn":"",

"ko":"",

"de":"Wenn du diese Falle aktivierst, spürst du den Schmerz. Überspringen wäre möglich, aber unschädlich machen ist die bessere Lösung.",

"pl":"Jeżeli uaktywnisz tę pułapkę - zaboli. Możesz spróbować ją przeskoczyć, jednak najlepsza opcją pozostaje rozbrojenie.",

"br":"",

"it":"Se attivate questa trappola sentirete il vero dolore. Puoi provare a saltarla, ma disarmarla è la migliore opzione.",

"es":"Si activas esta trampa te va a doler. Puedes intentar saltarla por encima, pero desmantelarla sigue siendo la mejor opción.",

"fr":"Si vous l'activez vous le sentirez passer. Essayez de sauter par dessus, mais le désarmer reste votre meilleure option.",

"hu":"ha aktiválod ezt a csapdát, megérezheted az igazi fájdalmat. Megpróbálhatod átugrani, de a legjobb választás a hatástalanítása."

},

Define the size of your trap on the board (number of squares x number of squares). Note that if you put anything else than 1x1 your token image (64x64) must match that size (x64 per side) - ex: for a size of [2,3] your icon image would be 128x192

"size" : [1,1],

Define the stats of your trap

// Trap can be jumped (1 or 0)

"can_jump" : 1,

// Trap can be disarmed (1 or 0)

"can_disarm" : 1,

// Monsters can jump the trap (1 or 0)

"monster_can_jump" : 1,

// Default damage this trap does if failed to jump or disarm

"damage" : 20,

Adding Traps to Quests

Besides defining the position of the item on the board, you need to define it's orientation

{

// Position of the item on the board

"tile":"4x12",

// UID/Class of the item

"class":"yohan_falling_blocks",

// Orientation of the item (combination of vertical and mirror)

"vertical":1,

"mirror":1,

// override any of the item property

"damage":15,

"can_jump":0

}

Creating & Updating Furniture

It is really easy to create furniture for Mighty Dungeons that you will be able to use in your quests. What you need:

  • Cool name for your item: "Tomb".

  • Unique ID for your item (that nobody else will use): "yohantomb_1". Please pick a name with no space and special character (stick to [a-zA-Z0-9]).

  • 160x160 PNG image with transparent background of your item that will be shown in popups - yohan_tomb_1.png

  • 64x64 PNG image with transparent background that will be used as token on the board - yohan_tomb_1_icon.png (must end with "_icon"). Ideally it should be viewed from the top. The final size will depend on the size of the monster on the board, in multiple of 64.

  • Name and Description of your item translated in multiple languages (at least en, ru,de,pl,it,es,fr,hu). If you don't want to translate it you will not be able to sell it. You can use Google Translate as a basic translation tool to help you with that.

  • JSON file describing your item "yohan_eye_divination.json"

Game Data file

Name of the item. Important for legendary "named" items (like Excalibur), you can just copy the name in all the languages

"name" : {

"en":"Tomb",

"ru":"Гробница",

"jp":"",

"cn":"",

"ko":"",

"de":"Grab",

"pl":"Krypta",

"br":"",

"it":"Tomba",

"es":"Tumba",

"fr":"Tombe",

"hu":"Sír"

},

}

Description of the item translated in multiple languages

"description" : {

"en":"Some dungeon masters like to keep their ancestors around, in spirit or in flesh.",

"ru":"Некоторые Мастера Подземелий любят, чтобы их предки оставались неподалеку, духом или телом.",

"jp":"",

"cn":"",

"ko":"",

"de":"Einige Dungeon Masters bewahren ihre Vasallen dort auf, lebendig oder (un)tot.",

"pl":"Niektórzy władcy lochów lubią mieć swoich przodków pod ręką, duchem lub ciałem",

"br":"",

"it":"Ad alcuni dungeon master piace circondarsi dei propri antenati, in spirito o in carne.",

"es":"A algunos dueños de las mazmorras les gusta tener a sus ancestros a mano, ya sea en espíritu o de cuerpo presente.",

"fr":"Le maître des lieux aime garder ses ancêtres près de lui, en esprit ou en chair.",

"hu":"Néhány kriptamester szereti maga mellett tudni az öseit, lélekben vagy testi valójában."

},

Define the size of your furniture on the board (number of squares x number of squares). Note that if you put anything else than 1x1 your token image (64x64) must match that size (x64 per side) - ex: for a size of [2,3] your icon image would be 128x192

"size" : [1,1],

Adding Furniture to Quests

Besides defining the position of the item on the board, you need to define it's orientation

{

// Position of the item on the board

"tile":"4x12",

// UID/Class of the item

"class":"chest_1",

// Orientation of the item (combination of vertical and mirror)

"vertical":1,

"mirror":1,

// Loot (see full section below)

"loot":{"potions":[{"class":"healing_small","quantity":5}]},

// Set to 1 and suddenly your item will ALWAYS drop loot.

// It will actually drop everything that you listed in the loot section.

"always_loot":1

}

Defining Loot in Quests

You can define the default loot of your item in the game data file, or define it in the JSON properties when adding it to quests. It can be overriden if needed. The item may or may not drop any loot when activated. If it does, the game engine will pick one of the items from the loot JSON property.

"loot" : {

// Max amount of gold

"gold":100,

// Min amount of gold (can be 0)

"gold_min":10,

// Pick one of these weapons - minimum required properties are class and maybe the num_attack value

"weapons":[

{"class":"shortbow","num_attack":20},

{"class":"spear","num_attack":10},

{"class":"longsword","num_attack":10},

{"class":"staff","num_attack":10}

],

// Pick one of these armors - minimum rrequired properties are class and maybe the num_defense value

"armors":[

{"class":"head_hornhelmet","num_defense":100},

{"class":"body_leather","num_defense":100},

{"class":"shield_viking","num_defense":100}

],

// Key - IMPORTANT if you add a key to the loot, the item will ALWAYS loot that key. So don't add it unless you need that key in your quest

"key":"gold",

// Same for "potions", "spells", "articles"

[...]

}

Creating & Updating NPC

It is really easy to create NPCs for Mighty Dungeons. What you need:

  • Cool name for your NPC: "Drusila". Note that the name can be changed in the quests.

  • Unique ID for your NPC (that nobody else will use): "yohandrusila". Please pick a name with no space and special character (stick to [a-zA-Z0-9]).

  • 160x160 PNG image with transparent background of your NPC that will be shown in popups - yohan_drusila.png

  • 64x64 PNG round image with transparent background that will be used as token on the board - yohan_drusila_icon.png (must end with "_icon")

  • JSON file describing your NPC "yohan_drusila.json"

Game Data File

Name and Description of the NPC. Just put any name here, copy it for every language. It will probably be modified on a quest by quest basis.

"name" : {

"en":"Drusila",

"ru":"Drusila",

"jp":"Drusila",

"cn":"Drusila",

"ko":"Drusila",

"de":"Drusila",

"pl":"Drusila",

"br":"Drusila",

"it":"Drusila",

"es":"Drusila",

"fr":"Drusila",

"hu":"Drusila"

},

"description" : {

"en":"Drusila",

"ru":"Drusila",

"jp":"Drusila",

"cn":"Drusila",

"ko":"Drusila",

"de":"Drusila",

"pl":"Drusila",

"br":"Drusila",

"it":"Drusila",

"es":"Drusila",

"fr":"Drusila",

"hu":"Drusila"

},

NPCs don't do anything until you add them to quests. For each quest you will be able to define what the NPC says, gives, sells.

Define the sound the NPC makes when talking to the hero. You can add new sounds to the resources/common/Common/sounds/ folder by dropping a ogg file with the name talk_XXX.ogg (replace XXX by the unique name of your sound - ex yohan_chat). You can see the list of sounds available in that same folder.

"sound_id" : "npc"

Integrating NPC to Quests

When integrating a NPC to a quest you need to define the position of the NPC on the board. You can then override any of the NPC values like the name and description.

You need to decide if the NPC will say something besides introducing himself. And also what the NPC will give the Hero (or open the Shop) when talked to.

{

// Position of the NPC on the board

"tile":"18x24",

// Class of the NPC

"class":"gorgio",

// Overriding the name of the NPC

"name":{

"en":"Mayor",

"ru":"Mэр",

"jp":"",

"cn":"",

"ko":"",

"de":"Bürgermeister",

"pl":"Burmistrz",

"br":"",

"it":"Sindaco",

"es":"Alcalde",

"fr":"Maire",

"hu":"Polgármester"

},

// Overriding the description

"description":{

"en":"Thank you so much for rescuing me and my village!",

"ru":"Ты спас мне жизнь героя! Пожалуйста, примите это!",

"jp":"",

"cn":"",

"ko":"",

"de":"Sie hat mein Leben gerettet Held! Bitte beachten Sie dies!",

"pl":"Uratowałeś mi życie bohatera! Proszę wziąć to!",

"br":"",

"it":"Mi hai salvato la vita eroe! Si prega di prendere questo!",

"es":"Me has salvado la vida del héroe! Por favor, toma esto!",

"fr":"Vous avez sauvé ma vie héros! S'il vous plaît accepter cela!",

"hu":"Megmentette az életem hös! Kérjük, fogadja el ezt!"

},

// Set to 1 if the NPC has nothing to say and the hero can just accept his gift (if any)

// The gifts will be defined in the "loot" section. If the NPC has nothing to loot

// it will not show any action button

"notalk":1,


// Label of the action button

"action_label_talk":{

"en":"Accept",

"ru":"Принимать",

"jp":"",

"cn":"",

"ko":"",

"de":"Akzeptieren",

"pl":"Przyjąć",

"br":"",

"it":"Accettare",

"es":"Aceptar",

"fr":"Accepter",

"hu":"Elfogad"

},

// What the NPC will give to the hero

"loot":{"gold":10000}

}

Creating & Updating Monsters

It is really easy to create monsters for Mighty Dungeons. What you need:

  • Cool name for your monster's race: "Arachnolith"

  • Unique ID for your monster (that nobody else will use): "yohanarachnolith". Please pick a name with no space and special character (stick to [a-zA-Z0-9]).

  • 256x256 PNG image with transparent background of your monster that will be shown in the fight screen - yohan_arachnolith_full.png (must end with "_full")

  • 64x64 PNG image with transparent background of your monster, token that will be shown on the board - yohan_arachnolith_board.png (must end with "_board"). The final size will depend on the size of the monster on the board, in multiple of 64.

  • 64x64 PNG image with transparent background of your monster, medallion that will be shown on the fight and stats screens - yohan_arachnolith_medallion.png (must end with "_medallion")

  • Race of your monster translated in multiple languages (at least en, ru,de,pl,it,es,fr,hu). If you don't want to translate it you will not be able to sell it. You can use Google Translate as a basic translation tool to help you with that.

  • JSON file describing your item "yohan_arachnolith.json"

Game Data File

Race of the monster

"race" : {

"en":"Arachnolith",

"ru":"Арахнолит",

"jp":"Arachnolith",

"cn":"Arachnolith",

"ko":"Arachnolith",

"de":"Arachnolith",

"pl":"Arachnolith",

"br":"Arachnolith",

"it":"Arachnolith",

"es":"Arachnolith",

"fr":"Arachnolith",

"hu":"Arachnolith"

},

Pick the difficulty class of your monster from 1 - 6. Used specifically for the training Arena, not in the quests & dungeons engine.

"difficulty_class":2,

Give names to your monster [optional]. When the "show monster names" option is activated in the Extras, it will pick one of the names at random. These names do not have to be translated.

"names":["Alwan","Anje","Azibo","Ajin","Ekon","Erasto","Haijen","Hamedi","Hokima"],

Define the size of your monster on the board (number of squares x number of squares). Note that if you put anything else than 1x1 your token image (64x64) must match that size (x64 per side) - ex: for a size of [2,3] your icon image would be 128x192.

IMPORTANT any monster bigger than 1x1 will not be able to move

"size" : [1,1],

Define the base stats of your monster

// Health Points

"body" : 60,

// Mind Points

// This determines which spells the monsters has access to

// EXCEPT for healing spells which have to be manually defined (see below)

"mind" : 0,

// Number of Attack points

"attack" : 60,

// Attack speed (in percentages) - default = 100

"attack_speed" : 100,

// Number of Defense points

"defense" : 60,

// Field of Vision - how far (in board squares) can the monster see

"fov" : 3,

// Not used YET but must be defined

"attack_range" : 1,

"movement" : 1,

Define the sounds of the monster. You can add new sounds to the resources/common/Common/sounds/ folder by dropping a ogg file with the name damaged_XXX.ogg and die_XXX.ogg (replace XXX by the unique name of your sound - ex yohan_ouch). You can see the list of sounds available in that same folder.

"sound_ids" : {

"attack" : "",

"defend" : "",

"die" : "die_zombie",

"damaged" : "damaged_zombie"

},

Defining the Magic

You have to explicitely define which potions your monster can use during a fight. The game will not attribute potions automatically to the monster. You can define default potions in your monster file [not recommended] - or you can define it in the quest file itself when adding the monsters to the board.

Simply add a similar json structure to the monster properties:

"potions" : [

{"class":"healing_full","quantity":5}

],

As for spells, you only need to define the healing spells the monster can use during a fight. If you give the monster a mind value higher than 0, the monster will pseudo-randomly pick spells from the list of spells available in the game that he will be able to cast, EXCEPT for healing spells: it would skew the balance of the game very quickly if monsters could freely regenerate during fights.

Simply add a similar json structure to the monster properties:

"spells" : [

{"class":"healing_full","quantity":5}

],

Adding Monsters to Quests

Define the position of the monster on the board

{

// Position of the monster on the board

"tile":"4x12",

// UID/Class of the monster

"class":"yohan_arachnolith",

// Loot (see full section below)

"loot":{"potions":[{"class":"healing_small","quantity":5}]},

// Set to 1 and suddenly your monster will ALWAYS drop loot.

// It will actually drop everything that you listed in the loot section.

"always_loot":1

}

Defining Loot in Quests

You can define the default loot of your monster in the game data file, or define it in the JSON properties when adding it to quests. It can be overriden if needed. The monster may or may not drop any loot when activated. If it does, the game engine will pick one of the items from the loot JSON property.

"loot" : {

// Max amount of gold

"gold":100,

// Min amount of gold (can be 0)

"gold_min":10,

// Pick one of these weapons - minimum required properties are the class and maybe the num_attack value

"weapons":[

{"class":"shortbow","num_attack":20},

{"class":"spear","num_attack":