In light of some of the other threads that have popped up since the Grimrock 2 forum has opened, I thought it might be nice to share some ideas specifically for the dungeon editor / the modding process. A lot will have changed since LOG1 anyway, but the things here are based around the knowledge that Grimrock 2 will use a component based system.
Hope that this post is not out of place and that some of the ideas here are useful / not already on your list.
Custom Races, Classes, Traits and Skills
While it would be very hard and unnecessary to allow the removal of pre-existing skills or to integrate new skills into built-in game systems. It would be cool to be able add new ones. New / custom skills wouldn't need to do anything to the underlying game systems (although, you could have 'weapon skills' for new classes of weapons perhaps), but my main thought is that mod scripts could read those skill values to enable other features / special attacks on weapons etc. Something like...
defineTrait{name = "manaSink", uiName = "Mana Sink", description = "You are unable to cast magic, but are highly resistance to magical effects.", onAddTrait = function(champion) champion:setMaxStat("mana", 0); ... end, onRemoveTrait = function(champion) ... end}.
defineRace{name = "hobgoblin", uiName = "Hobgoblin", description = "...", defaultStats = {strength = 10, ...}, availableTraits = {manaSink, dexterous, ...}}
defineSkill{name = "armourer", uiName = "Armourer", description = "The higher your armourer skill, the better weapons you can craft.", onAdvanceSkill = function(champion, value) ... end, onReduceSkill = function(champion, value) ... end}
defineClass{name = "monk", uiName = "Monk", description = "...", skills = {armourer, unarmed_combat, ...}
Custom Party / Monster Conditions
This could be a system where you could define a custom condition, with it's own onStart, onExtend, onEnd hooks. For instance;
defineChampionCondition{name = "drunk", uiName = "Drunk", onStart = function(champion, duration) champion:modStat("dexterity", -10); end, onEnd = function(champion) champion:modStat("dexterity", 10); end
defineMonsterCondition{name = "blind", uiName = "Blind", onStart = function(monster, duration) monster:setViewRange(0); end, onEnd = function(monster) monster:resetViewRange(); end
Then you could just do 'champion:setConditionCumulative("drunk", 20)' or 'monster:setConditionCumulative("blind", 20)'.
Additional / Symmetrical Hooks
It would be awesome if there were not only hooks on monsters for being hit, but also hooks on weapons for when the user attacks / lands a hit. Currently, if we want to have a weapon blind a monster for a few seconds say, we have to write the logic into every monster hook. This is just a bit fiddly when you then download a monster from someone else and a magic pack from someone else - as they cannot be made to work together automatically. This is particularly useful with the above conditions suggestion for applying monster conditions on a weapon hit to any monster. Ideas for additional hooks off the top of my head;
Alcove / Item Holder Component: onRemoveItem.
Door Component: onHit, onProjectileHit.
Item Component: onAttack, onHit, onProjectileHit, onCastSpell.
Change Individual Object Properties
It would be useful to change the properties on an instance of an object. For instance, after creating a dagger, you could throw it in a forge and give that same dagger '+1' damage. This is mostly useful for randomising loot!
Object Definition Offset and Material Aliases
A lot of mods have multiple copies of the same mesh. The most common reasons for this seems to be to (a) to offset the model or (b) to change a material name. Suggestion;
cloneObject{name = "high_wood_button", baseObject = "button", modelOffset = vec3(0, 0.5, 0), materialAliases = {stone = "wood_button"}}
Custom Entity Properties / User Data
Just a minor one, but when making custom spells etc, it would be useful if we could set inert user data on entities to read back later. For instance entity:setUserData("key", "value") and entity:getUserData("key"). This would allow us to keep track of how many times a monster has been hit say, without having to store that information in a random table elsewhere mapping IDs to our data (which is a pain to clean up when things die).
Allow Modding of Core Game Data
It would be nice if modders could extend / modify the core game in some ways. A suggested way of doing this is to have a 'mod_data' folder in the project. If there is an init.lua or dungeon.lua file in that folder then they are called after the init.lua/dungeon.lua files in the game. The modder's init.lua file could therefore redefine any objects in the game world (using objects in the mod_data folder) and dungeon.lua could alter things in the game world / spawn additional creatures etc. This could be a 'post-release' feature, and using it should definitely disable Steam achievements!
onGui Features
The biggest problem I came up against with the onGui methods was the inability to scale textures, which meant I had to provide multiple copies of the QuickBar graphics. It would be awesome to crop and scale textures in some way. For instance;
drawScaledImage(filename, srcX, srcY, srcWidth, srcHeight, destX, destY, destWidth = srcWidth, destHeight = srcHeight);
drawQuad(filename, x, y, width, height);
More Audio Control
It would be very useful to be able to get an id back from playSound() and then use stopSound(id) to stop a sound that was previously started with loop=true.