Modding FAQ

Er… my english :frowning:
I ask in which contexts dice can be used and how this formula works.

It’s only used here, but I not exactly understand if this code actually doing anything:
github.com/vcmi/vcmi/blob/devel … or.cpp#L51

  1. Two rewards with same “dice” have same random value. This allows to create mutually exclusive and independent rewards.
  2. It is not used in any objects configuration yet.
  3. for now it actually may be used in mods only for new map objects for vcmi map format.

Ok, another question. I want to modify standard H3 creature banks. For example, I want to place in shipwrecks some Abyss creatures than Wights. I tried various ways, but I failed…
Like this:

{
	"core:creatureBank" : {
		"types" : {

			"core:shipwreck" : {
				"levels": 
					{
						"chance": 25,
						"guards": 
							{ "amount": 5, "type": "abyssSandCrab" },
							{ "amount": 5, "type": "abyssAbyssalCrab" },
							{ "amount": 5, "type": "abyssAbyssalCrab" },
							{ "amount": 5, "type": "abyssSandCrab" },
							{ "amount": 5, "type": "abyssAbyssalCrab" }
						],
						"combat_value": 31,
						"reward" : {
							"value": 2000,
							"resources":
							{
								"gold" : 2000
							}
						}
					},

Or this:

{
	"core:creatureBank" : {
		"types" : {

			"shipwreck" : {
				"levels": 
					{
						"chance": 25,
						"guards": 
							{ "amount": 5, "type": "abyssSandCrab" },
							{ "amount": 5, "type": "abyssAbyssalCrab" },
							{ "amount": 5, "type": "abyssAbyssalCrab" },
							{ "amount": 5, "type": "abyssSandCrab" },
							{ "amount": 5, "type": "abyssAbyssalCrab" }
						],
						"combat_value": 31,
						"reward" : {
							"value": 2000,
							"resources":
							{
								"gold" : 2000
							}
						}
					},

Or this:

{
	"creatureBank" : {
		"types" : {

			"core:shipwreck" : {
				"levels": 
					{
						"chance": 25,
						"guards": 
							{ "amount": 5, "type": "abyssSandCrab" },
							{ "amount": 5, "type": "abyssAbyssalCrab" },
							{ "amount": 5, "type": "abyssAbyssalCrab" },
							{ "amount": 5, "type": "abyssSandCrab" },
							{ "amount": 5, "type": "abyssAbyssalCrab" }
						],
						"combat_value": 31,
						"reward" : {
							"value": 2000,
							"resources":
							{
								"gold" : 2000
							}
						}
					},

I’m lack of ideas…

Strange…
I made test json for dwarven treasury:

{
	"core:creatureBank": {
		"types": {


			"dwarvenTreasury": {

				"levels": {
					"chance": 40,
					"guards": {
						"amount": 50,
						"type": "peasant"
					}, {
						"amount": 50,
						"type": "peasant"
					}, {
						"amount": 50,
						"type": "peasant"
					}, {
						"amount": 50,
						"type": "peasant"
					}, {
						"amount": 50,
						"type": "peasant"
					}],
					"combat_value": 300,
					"reward": {
						"resources": {

							"gold": 15000
						},
						"artefacts": {
							"class": "TREASURE"
						}, {
							"class": "MINOR"
						}, {
							"class": "TREASURE"
						}, {
							"class": "MINOR"
						}],
						"value": 17000
					}
				}, {
					"chance": 40,
					"guards": {
						"amount": 60,
						"type": "peasant"
					}, {
						"amount": 60,
						"type": "peasant"
					}, {
						"amount": 60,
						"type": "peasant"
					}, {
						"amount": 60,
						"type": "peasant"
					}, {
						"amount": 60,
						"type": "peasant"
					}],
					"combat_value": 350,
					"reward": {
						"value": 20000,
						"resources": {

							"gold": 17000
						},
						"artefacts": {
							"class": "MAJOR"
						}, {
							"class": "MINOR"
						}, {
							"class": "MINOR"
						}, {
							"class": "MINOR"
						}]

					}
				}, {
					"chance": 20,
					"guards": {
							"amount": 60,
							"type": "peasant"
						}, {
							"amount": 60,
							"type": "peasant"
						}, {
							"amount": 60,
							"type": "peasant"
						},

						{
							"amount": 60,
							"type": "peasant"
						}, {
							"amount": 60,
							"type": "peasant"
						}
					],
					"combat_value": 450,
					"reward": {
						"value": 26000,
						"resources": {

							"gold": 20000
						},
						"artefacts": {
							"class": "MAJOR"
						}, {
							"class": "MINOR"
						}, {
							"class": "MINOR"
						}, {
							"class": "MAJOR"
						}]

					}
				}]
			},
}

And it works, on visiting dwarven treasury I see peasants, many of them

File a bug report please, with logs for all cases.

Does your mod check is abyss mod is present?

    "depends" :
    
        "abyss"
    ],

Also try something like mod name prefx:

{ "amount": 5, "type": "abyss:abyssAbyssalCrab" } 

Thanks Marcon1 and Warmonger. I’ve tried all your solution but still wights on shipwrecks. That’s odd, because Macron’s peasants at Dwarven Treasury are present, but when I changed only “dwarvenTreasury” to “shipwreck” in this configuration, there’s no peasants in game, only wights!

Yes, I checked shipwreck in game, there are wights, because shipwreck is a object of type shipwreck, not of type creatureBank.
So code must be like this:

{
	"core:shipwreck": {
		"types": {


			"shipwreck": {

				"levels": {
					"chance": 40,
					"guards": {
						"amount": 50,
						"type": "peasant"
					}, {
						"amount": 50,
						"type": "peasant"
					}, {
						"amount": 50,
						"type": "peasant"
					}, {
						"amount": 50,
						"type": "peasant"
					}, {
						"amount": 50,
						"type": "peasant"
					}],
					"combat_value": 300,
					"reward": {
						"resources": {

							"gold": 15000
						},
						"artefacts": {
							"class": "TREASURE"
						}, {
							"class": "MINOR"
						}, {
							"class": "TREASURE"
						}, {
							"class": "MINOR"
						}],
						"value": 17000
					}
				}, {
					"chance": 40,
					"guards": {
						"amount": 60,
						"type": "peasant"
					}, {
						"amount": 60,
						"type": "peasant"
					}, {
						"amount": 60,
						"type": "peasant"
					}, {
						"amount": 60,
						"type": "peasant"
					}, {
						"amount": 60,
						"type": "peasant"
					}],
					"combat_value": 350,
					"reward": {
						"value": 20000,
						"resources": {

							"gold": 17000
						},
						"artefacts": {
							"class": "MAJOR"
						}, {
							"class": "MINOR"
						}, {
							"class": "MINOR"
						}, {
							"class": "MINOR"
						}]

					}
				}, {
					"chance": 20,
					"guards": {
							"amount": 60,
							"type": "peasant"
						}, {
							"amount": 60,
							"type": "peasant"
						}, {
							"amount": 60,
							"type": "peasant"
						},

						{
							"amount": 60,
							"type": "peasant"
						}, {
							"amount": 60,
							"type": "peasant"
						}
					],
					"combat_value": 450,
					"reward": {
						"value": 26000,
						"resources": {

							"gold": 20000
						},
						"artefacts": {
							"class": "MAJOR"
						}, {
							"class": "MINOR"
						}, {
							"class": "MINOR"
						}, {
							"class": "MAJOR"
						}]

					}
				}]
			},
}

You are right. Now, shiwrecks work as intended. Thank you gorgously :slight_smile:

How do I add new proper names for towns without replacing the pre-existing ones?

This is what I’ve got so far:

{
	"core:necropolis" :
	{
		"town" :
		{
			"names" : 
				// original names
				"Haunt's Wind",
				"Cessacioun",
				"Agony",
				"Sanctum",
				"Terminus",
				"Blackquarter",
				"Death's Gate",
				"Grave Raven",
				"Dark Cloud",
				"Coldsoul",
				"Coldreign",
				"Dark Eternal",
				"Ghostwind",
				"Blight",
				"Shadow Keep",
				"Worm Warren",
				// new names
				"Eljudnir", // The hall of Hel (the ruler of the dead in Norse mythology) in Niflheim; Source: Kevin Crossley-Holland, "The Norse Myths", 1980, p. 241.
				"Hvergelmir", // Spring in Niflheim from which the eleven rivers known as Elivagar flow; Source: Kevin Crossley-Holland, "The Norse Myths", 1980, p. 245.
				"Nastrond" // Place in Helheim (realm within Niflheim ruled by Hel) where a hall for evil-doers lies; Source: Kevin Crossley-Holland, "The Norse Myths", 1980, p. 248.
			],
		}
	}
}

This does the job, but isn’t optimal, since I have to repeat the original names. Is there a way to add new names to the “names” array instead of redefining it entirely?

I think it’s logical. You want to add names and the end of the existing list, so you you must copy/paste previous names and add yours at the end. On contrary - if you want to change third name for example, you copy entire list and change only this third name.

This is how json files are interpreted - named items (in quotation marks) replace the old ones. This way you can for instance clear entire list :wink:

All we could do here is to change town format so that every name would be separate item, without the list.

Ah, I see :frowning: Thanks for the explanation though!

The thing is that I wanted to make my mod 100% open-source.

Each name being a separate item sounds too cumbersome - how about adding a “new_names” array instead, which would add names to the “names” array instead of replacing the whole thing?

I hope vcmi team will keep the changes to modding format to minimum, only adding new fields :mrgreen:

Than change all names, rewriting standart names written in proprietary lods:-)

From few reasons I’m looking a way to add my creature +1 attack per turn during battle (so atack is +1 to base in first turn, +2 to base in second, +3 in third and so on…). I thought it’s possible only via new special spell.
So I wrote such creature ability:

			"casts" :
			{
				"type" : "CASTS",
				"val" : 20
			},
			"attackBooster":
			{
			"type" : "ENCHANTER",
			"subtype" : "spell.attackBooster",
			"val" : 1,
			"addInfo" : 1
			}

And here’s my spell atackBooster:

		"levels":
		{
			"base":
			{
				"power": 10,
				"aiValue": 20,
				"range": "0",
				"targetModifier":
				{
					"smart": false
				}
			},
			"none":
			{
				"description": "Attack",
	 
				"cost": 0,
				"effects":
				{
					"plusOneAttack":
					{
						"type": "PRIMARY_SKILL",
						"duration": "N_TURNS"],
						"val" : 1,
						"subtype" : "primSkill.attack",
						"valueType" : "ADDITIVE_VALUE"
					}
				}
			},
			"basic":
			{
				"description": "Attack",	 
				"cost": 0,
	 
				"effects":
				{
					"plusOneAttack":
					{
						"type": "PRIMARY_SKILL",
						"duration": "N_TURNS"],
						"val" : 1,
						"subtype" : "primSkill.attack",
						"valueType" : "ADDITIVE_VALUE"
					}
				}
			},
			"advanced":
			{
				"description": "Attack",
	 
				"cost": 0,
	 
				"effects":
				{
					"plusOneAttack":
					{
						"type": "PRIMARY_SKILL",
						"duration": "N_TURNS"],
						"val" : 1,
						"subtype" : "primSkill.attack",
						"valueType" : "ADDITIVE_VALUE"
					}
				}
			},
			"expert":
			{
				"description": "Attack",
	 
				"cost": 0,

				"effects":
				{
					"plusOneAttack":
					{
						"type": "PRIMARY_SKILL",
						"duration": "N_TURNS"],
						"val" : 1,
						"subtype" : "primSkill.attack",
						"valueType" : "ADDITIVE_VALUE"
					}
				}
			}

But, +1 attack is granted only fist turn, which is lame, becaure I can give my creature +1 attack permament. Is there any way to give prograssive +1 attack per turn?

Hmm, change duration from “N_TURNS” to “PERMANENT”? The disruption ray spell works quite similar.

Doesn’t work either :frowning:

I’ll leave it here to not left it just on slack: DISRUPTING_RAY is heavily hardcoded.
For now VCMI can’t handle duplicate bonuses.

Reasonable amount of work would be needed to make it work.

By the way, I have a question.
If i’ll set

{
"type":"SPELL_IMMUNITY",
"subtype":"spell.visions"
}

to hero, will it be immune to Visions spell?