Page 1 of 2

Please, help with scripting new traits

Posted: Fri Sep 09, 2016 2:59 am
by CainOrdamoth
Hello all. I've been recreating a lot of the skill trees from the ground up (mostly making new traits and moving about old ones to different skills) but I've run into some issues with certain traits.

Firstly, I've been trying to make the armor_expert trait (the one that halves the weight of equipped armours exclusive to knight) into a part of the armour skill tree but for some reason the game won't recognise this change. I thought this was down to it being a class trait, but I managed to change the shield_expert trait without any issues. Does anybody know why the armor_expert trait is so finicky? I've been having issues with the Dual Wield traits as well (all 3, the basic one, the improved one and the rogue one), no matter what I try with these they won't work outside of the default skill tree. I understand that a lot of things are hardcoded, but I've only been moving things to different skill trees, I've not been editing these skills at all, and everything I tried worked with the shield_expert trait, which is why its confusing it doesn't work with the others.

Failing that, I've been working on a sort of replacement trait for armor_expert if it doesn't work out. (Bit of blurb here about my reasons for the changes, feel free to ignore = In a nutshell, I wanted a greater distinction between 'tanky' characters and 'evasive' characters, and to do this I removed all means to acquire the heavy_armor_proficiency trait, and also removed the heavy_armor trait from all heavy armour sets, but instead heavy armour has a baseline evasion debuff, but with a protection buff to make up for the difference (this is why I added the armor_expert trait to this skill tree, as mentioned above). While I'm here, could I ask if this would be a good idea? How powerful is evasion compared to protection in general? I hope this all makes sense.)

For my replacement trait I tried to have it give an additional buff to protection if the champion has a piece of heavy armour equipped. This would ideally be a small buff for each piece say +5, but if you have a whole heavy armour set equipped it would be buffed to +25 protection (on top of the protection gained from the armour itself). Does this sound ok, or overpowered/underpowered? The reason I ask is I've not got the trait to work yet so I can't test it :P. I'm probably missing something obvious, so here's the script I have for the trait. Its probably junk, but I'm still learning...

Code: Select all

	onRecomputeStats = function(champion, level)
		if level > 0 then
			local item3 = champion:getItem(ItemSlot.Head)
			if item3 and item3:hasTrait("heavy_armour") then
				champion:addStatModifier("protection", 5)
			end
		end
	end,
Along the same lines, I've been trying to create another trait that decreases the cooldown on ONLY spells by 10%. But again I can't figure out how this script should be written, of if its even possible.

Code: Select all

	onComputeCooldown = function(champion, weapon, attack, attackType, level)
		if level > 0 and attackType == "castSpell" then return 0.9 end
	end,
Its tough wrapping my head around all this jargon, lol. Sorry for the lengthy post but I wanted to get a few questions in to avoid spamming the forum. Many thanks in advance.

Re: Please, help with scripting new traits

Posted: Mon Sep 12, 2016 3:29 am
by akroma222
The asset pack "hidden" Traits (armor_expert, hand_caster etc) will need to be redefined in your mod_assets - in order for them to be less finicky
Can you post up your definitions, not just the hooks??
Very simple to redefine them... ("just make sure hidden = true,)
SpoilerShow

Code: Select all

defineTrait{
	name = "hand_caster",
	uiName = "Hand Caster",
	iconAtlas = "mod_assets/textures/customSkills1.tga",
	icon = 0,
	charGen = false, 
	hidden = true,
	description = "", 
}
Imho - I dont think you need the extra Protection buff for Heavy Armours - points spent in Armour Skill and the armour itself will do this for you
However this is all flavour issues really ... and hard for anyone to say until they gauge the rest of your mod and it's changes
There is some v good info on Protection, Evasion etc in minmay's infoDump thread:
viewtopic.php?f=22&t=13948
(it is indeed a massive infodump - scary if you dont like jargon but there is heaps of valuable things)

In the same thread, minmay mentions that:
Currently (as of 2.2.4), suffers from a bug: onComputeCooldown hooks don't apply to CastSpellComponent cooldown.
It is reportedly a bug - will possibly be fixed by AH - so you could leave it and hope its sorted later?

regarding custom traits, racial traits and other traits selectable at character gen I never have a problem with - eg:
SpoilerShow

Code: Select all

defineTrait{
	name = "diplomatic",
	uiName = "Diplomatic",
	iconAtlas = "mod_assets/textures/legacy_custom_icons1.tga",
	icon = 43,
	charGen = true,
	hidden = false,
	requiredRace = "human",
	description = "......................",	
}

defineTrait{
	name = "evasive",
	uiName = "Evasive",
	icon = 9,
	charGen = true, 
	hidden = false,
	description = "..........................",
	onRecomputeStats = function(champion, level)
		if level > 0 then
			champion:addStatModifier("evasion", 10)
		end
	end,
}
But ive run into problems trying to give champions traits through the race or class definitions - eg:
SpoilerShow

Code: Select all

defineRace{
	name = "ratling",
	uiName = "Vermlin",
	--traits = {"shield_expert"},
	inventoryBackground = "assets/textures/gui/inventory_backgrounds/ratling.tga",
	skills = {alchemy = 1, dodge = 1}
}
It is also strongly recommended you DONT add traits through the onRecomputeStats hook ! :o

Personally, I run a script that checks the party's Races / Classes when the game starts - and then adds traits based on these checks

Also, you find this useful - TraitManager. It handles adding and removing traits correctly
(when for instance your champ has a trait "Aura" for example, then equips an item that gives them that same trait onEquip - but removes it onUnequip)
SpoilerShow

Code: Select all

TRAIT_LIST = {
athletic = true,
agile = true,
healthy = true,
strong_mind = true,
tough = true,
aura = true,
evasive = true,
aggressive = true,
leadership = true,
rage = true,}
-------------------------------
traits = {}
--------------------------------------------------------------addTrait(champion,trait,silent)
function addTrait(champion,trait,silent)
	if not TRAIT_LIST[trait] then
		print("warning: invalid trait: "..trait)
	end

	if traits[champion:getOrdinal()][trait] == 0 then
		champion:addTrait(trait,silent)
	end
	traits[champion:getOrdinal()][trait] = traits[champion:getOrdinal()][trait] + 1
end
--------------------------------------------------------------removeTrait(champion,trait)
function removeTrait(champion,trait)
	--local name = champion:getName() 
	if traits[champion:getOrdinal()][trait] == 1 then
		champion:removeTrait(trait)
		--hudPrint(""..name.." gained the agile trait.")
	end
	traits[champion:getOrdinal()][trait] = traits[champion:getOrdinal()][trait] - 1
end
--------------------------------------------------------------gatherInitialTraits()
function gatherInitialTraits()
	for i = 1, 4 do
		local champion = party.party:getChampion(i)
		traits[champion:getOrdinal()] = {}
		for trait,dummy in pairs(TRAIT_LIST) do
			if champion:hasTrait(trait) then
				traits[champion:getOrdinal()][trait] = 1
			else
				traits[champion:getOrdinal()][trait] = 0
			end
		end
	end
end

gatherInitialTraits()
Similarly, SkillManager handles the same issues except for Skill iincreases/decreases....
viewtopic.php?f=22&t=9024&p=88389&hilit ... ger#p88389

Hope this all helps!! :)

Re: Please, help with scripting new traits

Posted: Mon Sep 12, 2016 4:28 am
by CainOrdamoth
Wow, thanks for the massive reply. I may need to read it (and minmay's post) through several times to get a handle on it, lol.
Here's the script as it currently stands. The Juggernaut trait works... kinda. I started with the helm, but when I try to add the lines for the other pieces (chest, legs, etc) the helm starts adding on the extra protection from the other pieces (with the chest protection added, the helm gives +10 protection instead of just +5, for a total of +15 protection with the helm and chest). You're right that its about the flavour, I'm only really adding a new trait as something to replace the heavy armour proficiency trait, maybe its not necessary, but I always try to have something cool for the 5th level of any skill. Also, you may notice I spell armour with a 'u', I'm british, but I always make sure I drop the 'u' when scripting things in case it clashes with anything :P.
SpoilerShow

Code: Select all

-- new armour skill tree

defineSkill{
	name = "armors",
	uiName = "Armour Mastery",
	priority = 90,
	icon = 7,
	description = "blurb goes here \n- Level 2 - Light Armour Proficiency.\n- Level 5 - Juggernaut.",
	traits = { [2] = "light_armor_proficiency", [5] = "juggernaut" },
}

defineTrait{
	name = "light_armor_proficiency",
	uiName = "Light Armour Proficiency",
	icon = 57,
	description = "You can wear Light Armor without penalties.",
	-- hardcoded trait
}

--defineTrait{
--	name = "juggernaut",
--	uiName = "Juggernaut",
--	icon = 7,
--	description = "+5 Protection for each piece of heavy armour you wear.",
--	onRecomputeStats = function(champion, level)
--		if level > 0 then
--			for i=1,ItemSlot.Head do
--				local item = champion:getItem(i)
--				if item then
--					if item:hasTrait("heavy_armour") then
--						champion:addStatModifier("protection", 5)
--					end
--				end
--			end
--		end
--	end,
--}
Kinda sucks about that bug with spell cooldown, but its ok, I can work around it until there's a fix.
Here is the one that worked. I added the shield expert trait to the dodge skill, not sure if that's a good idea, but since I removed the knight class I figured I should use the trait somewhere.
SpoilerShow

Code: Select all

-- new dodge skill tree

defineSkill{
	name = "dodge",
	uiName = "Dodge",
	priority = 100,
	icon = 9,
	description = "Increases evasion by 3 for each skill point.\n- Level 2 - Uncanny Speed.\n- Level 4 - Shieldmaster.",
	onRecomputeStats = function(champion, level)
		champion:addStatModifier("evasion", level*3)
	end,
	traits = { [2] = "uncanny_speed", [4] = "shield_expert" },
}

defineTrait{
	name = "uncanny_speed",
	uiName = "Uncanny Speed",
	icon = 108,
	description = "Cooldowns of all your actions are sped up by 10%.",
	onComputeCooldown = function(champion, weapon, attack, attackType, level)
		if level > 0 then return 0.9 end
	end,
}

defineTrait{
	name = "shield_expert",
	uiName = "Shieldmaster",
	icon = 8,
	description = "Increases evasion bonus of equipped shields by 50%.",
	-- hardcoded trait
}
Actually, while here, I have also been reworking the starting traits as you have. No problems so far, but most of them are mainly just skill buffs, but I've been trying something new. Starting Gifts (Dark Souls style).
Last script, I promise. But I got it working without any issues, apart from 1 glaring issue. When the game starts, instead of spawning just 1 compass, it spawns a million of them on the floor. I think I know why this happens - the ??? below used to be from another script (probably onRecomputeStats, dunno why I thought this would work tbh), because the way I learn stuff is by copying existing scripts and just frankensteining them together and changing things until they work how I want, but it doesn't help me when I try to do new things that I've not seen other people do before. The script as I had it keeps spawning a new compass every millisecond and because the designated slot is full they drop on the floor. It amused me more than it probably should have, but its not exactly useful, lol. (Also I only chose the compass as a test subject, the gifts will be more useful in the final version, as effectively replacing a champion's whole trait for one should feel worth it.) How would I write it so that it only spawns 1 compass in the champion's inventory at the start and then stop spawning compasses or is this not possible? Thanks again.
SpoilerShow

Code: Select all

--defineTrait{
--	name = "compass_gift",
--	uiName = "Old Compass",
--	iconAtlas = "mod_assets/textures/gui/new_traits.dds",
--	icon = 6,
--	charGen = true,
--	description = "Your father's old compass. Its all you have of his, so you carry it with you wherever you go.",
--	??? = function(champion, level)
--		if champion:hasTrait("compass_gift") then
--			champion:insertItem(13,spawn("compass").item)
--		end
--	end,
--}
I will definitely try the things you posted, that trait manager looks like a God-send, lol. Thanks for the help. :)

Edit: Oh, actually, there was one more thing. Is there a way to prevent the viper roots monster from leaving a certain area? The scenario is this: you normally walk along a bridge to get somewhere, but if you drop off the bridge into the area below, you get attacked by viper roots (its on the same map, just 1 elevation below the bridge). The only issue is, when you climb out of the pit back onto the bridge, the roots follow you back up to the same elevation, but I want them to stay down in the pit and not follow the player around the whole area. I've tried blockers, and they work if you place them where you don't want the roots to follow, but I don't want to flood the entire map with blockers as this would mess up any other monster encounters. I'm rambling, sorry. In a nutshell, how do I contain the viper roots to a single area/elevation? Thanks again :).

Re: Please, help with scripting new traits

Posted: Mon Sep 12, 2016 4:59 am
by akroma222
Hehe Australian here - Armour is fine with me ;)

Again, its flavour - but I think you have removed the proficiency trait and replaced it with something that will tip it the other way too much
(... you did indeed say you wanted to make a distinction between Light and Heavy...) - I think you could achieve this in a more balanced way
We have gone diff ways with Skills - I have renamed it Armour & Shield (giving +10% evasion for shields per level) ...
I really cant see Evasion based champion builds (Rogue for example), holding a shield in off hand ... when they would be trying to dual wield?
again its all just flavour stuff! :)

The compass spawns every frame because the hook that you are using to spawn them is called every frame.
If you are looking to Gift Items at the start - just include this check in your other checks (for race/class - to give traits)
- spawn the items after you have assigned the extra traits. That is how you can give the party starting equipment.

Regarding Viper Roots changing elevation - its on my list of 'Dont know yet but soon will" things...
Im sure its doable, just couldnt say how off the top of my head :?

EDIT: curious... why remove the Knight? just curious

Re: Please, help with scripting new traits

Posted: Mon Sep 12, 2016 5:13 am
by akroma222
For Viper Roots I suspect that changing the monster elevation will prob be best done from the hooks onInit() and onBeginAction()
SpoilerShow

Code: Select all

{
			class = "Monster",
			meshName = "viper_root_mesh",
			hitSound = "viper_root_hit",
			dieSound = "viper_root_die",
			hitEffect = "hit_goo",
			capsuleHeight = 0.2,
			capsuleRadius = 0.7,
			health = 500,
			protection = 0,
			evasion = 0,
			exp = 250,
			immunities = { "sleep", "blinded", "knockback" },
			resistances = { ["fire"] = "weak" },
			onInit = function(self)
				local dir = getDirection(party.x - self.go.x, party.y - self.go.y)
				
				--alter elevation here???
				
				self.go:setPosition(self.go.x, self.go.y, dir, self.go.elevation, self.go.level)
				self:performAction("rise")
			end,
			headRotation = vec(90, 0, 0),
		},
		{
			class = "ViperRootBrain",
			name = "brain",
			sight = 5,
			morale = 100,	-- fearless
		},
		{
			class = "MonsterAttack",
			name = "rise",
			attackPower = 17,
			accuracy = 50,
			cooldown = 0,
			animation = "rise",
			--sound = "viper_root_attack",
			cameraShake = true,
			cameraShakeDuration = 0.8,
			onBeginAction = function(self)
			
				--alter elevation here???
			
				self.go:spawn("particle_system").particle:setParticleSystem("viper_root_rise")
			end,
		},

Re: Please, help with scripting new traits

Posted: Mon Sep 12, 2016 6:15 pm
by CainOrdamoth
Hi, thanks again. The reason I put shield in with dodge is so that all the Evasion traits are in the same line and all the protection traits are in the same line. I figured, because of the way I redesigned the armour stats, heavy classes won't get much use from evasion so shields won't be as useful for them. The idea I had was to actually have 2 frontline builds, an evasion one (squishy, but can dodge most attacks), and protection builds (more likely to be hit, but can take a lot of punishment). I found in Grimrock 2 everyone just ran 2 full heavies on the frontline, and there was no real drawback as even heavy armour dudes can dodge attacks easily at high levels with the heavy armour proficiency trait. I wanted to make a bit more of a choice whether players want full frontline tank, full frontline evasion, or 1 of each. But you make a good point about evasion classes not wanting to use shields. Perhaps I could try to balance it so player can still make a hybrid if they like, but I'm probably just trying to make things too complicated for myself. I'll take some time to re-evaluate when my actual dungeon map reaches a point I can fully test out builds in the game itself, rather than in purely staged encounters in a test room, lol.
I removed the knight because of the way i restructured the classes. I made 2 of each "type" of character, that is to say I have 2 classes that favour heavy builds, Berserker which is basically the old barbarian, Warrior is a sort of hybrid between the old fighter and knight class. Rogue which is a lighter class that favours daggers and throwing weapons, ranger which is a more specialized class that is better at special attacks and missile weapons (and maybe as a secondary spellcaster if the player wants, natural magic and all that). Then I have the mage which is the best spellcaster, and a cleric which is a more tanky spellcaster and so could be used in place of the battle mage from the base game. The final class is the deprived, because Dark Souls is awesome :P. And also added as a blank canvass for players to make any build they wish, but is also harder to use at the start. Probably worth noting here that all the base classes are gone and replaced with the new ones, as they're all a bit more compact. I've sort of being working on all this from own ideas alone in my own little bubble, but if anyone has any feedback about these changes, please let me know.
There have also been changes to the traits that affect how the classes function. I've changed all of the racial traits so that they are either given to characters of a certain race by default, or made them into universal traits that players can select at the start regardless of race. As a few examples, Head Hunter I changed to Trophy Hunter and can be taken by any race (trophies are a new type of item acquired from bosses or from completing optional areas), while the Rage trait I made into a default trait for the Berserker class - every berserker gets Rage by default, and it can no longer be taken as a starting trait. I did edit a lot of each race's stats to compensate for this change, but please let me know if you disagree with anything or if you think I removed certain pieces of flavour, etc. My mod will be heavily lore-driven, so a lot of the changes I made make sense in-world, but I also did it to mix things up a bit. Base Grimrock 2 is great, but we've all played it a hundred times, so I thought new things set in a new world would help keep my mod interesting.
For the viper roots, I did try messing around with the onInit hook but tbh I really don't know what I am doing with regards to that, lol. I just tried replicating things from other scripts but nothing worked for it. Its a bit on the backburner for me now anyway as I'm focussing on getting all these traits and new spells finished off. I work very sporadically, basically focussing on what I feel like doing at the time, so my mod is a bit scattershot at the moment. I got about a 3rd of the actual dungeon laid out, fully tested and working, all the puzzles, encounters etc are great, but then I make 1 change to a mechanic and get new ideas for different traits etc, so I go back and start on them. Doesn't help that I choose to customize all my monsters from the base monsters and have already added in about 100 new items (mostly retextures with new stats, attacks, effects, etc). At this rate I'll never finish the damn thing XD. But I really enjoy modding, so about 90% of all my free time is devoted to it. I'm rambling again.
Anyway, thanks for the speedy replies. Hopefully I shed some light on my reasonings behind my changes. This is really the first time I've spoken about my mod to anyone who plays Grimrock, so I'd greatly appreciate the feedback. I may release a demo soon so everyone can see how things are shaping up and give constructive feedback on the dungeon itself, too, as well as all the customized assets I added (from other people as well as some I made from retextureing existing stuff). Cheers guys :).

Re: Please, help with scripting new traits

Posted: Wed Sep 14, 2016 1:44 pm
by zimberzimber
Got you a fix for the Viper Roots:

Code: Select all

--
They will not go up elevations, but they will go down elevations. I may fiddle with them not going down later.

EDIT: Now they won't go down elevations: (replace the rise and descend actions with these)

Code: Select all

		{
			class = "ViperRootBrain",
			name = "brain",
			sight = 5,
			morale = 100,	-- fearless
			onThink = function(self)
				if party.elevation > self.go.elevation + 1 then
					self:performAction("idle")
				end
				if self.go.burrowed:getValue() == 1 and party.elevation <= self.go.elevation then
					self:performAction("idle")
				end
			end,
		},
		{
			class = "Counter",
			name = "burrowed",
			value = 0,
		},
		{
			class = "MonsterAction",
			name = "idle",
			animation = "idle",
		},
		{
			class = "MonsterAttack",
			name = "rise",
			attackPower = 17,
			accuracy = 50,
			cooldown = 0,
			animation = "rise",
			--sound = "viper_root_attack",
			cameraShake = true,
			cameraShakeDuration = 0.8,
			onBeginAction = function(self)
				self.go:spawn("particle_system").particle:setParticleSystem("viper_root_rise")
				self.go.burrowed:setValue(0)
			end,
		},
		{
			class = "MonsterAction",
			name = "descend",
			animation = "descend",
			onBeginAction = function(self)
				self.go:spawn("particle_system").particle:setParticleSystem("viper_root_descend")
			end,
			onEndAction = function(self)
				self.go:setPosition(self.go.x, self.go.y, self.go.facing, self.go.elevation - 1, self.go.level)
				self.go.burrowed:setValue(1)
			end,
		},
They will still go up elevations, but its less likely to happen.

Re: Please, help with scripting new traits

Posted: Wed Sep 14, 2016 5:51 pm
by CainOrdamoth
Awesome, that seems to work like a charm. Thank you so much zimberzimber :)

Re: Please, help with scripting new traits

Posted: Thu Sep 15, 2016 1:27 am
by zimberzimber
Aaaaaaand fixed:

Code: Select all


		{
			class = "ViperRootBrain",
			name = "brain",
			sight = 5,
			morale = 100,   -- fearless
			onThink = function(self)
				local e = self.go.boundElevation:getValue()
				if party.elevation > e or party.elevation < e then
					if self.go.burrowed:getValue() == 0 then
						self:performAction("descend")
					else
						self:performAction("idle")
					end
				end
			end,
		},
		{
			class = "Counter",		-- Use this to bind the monster to an elevation
			name = "boundElevation",-- Will only attack if the player is on this elevation
			value = 0,				-- May sometimes linger to lower elevations while the party is falling, but will return to the bound one
		},
		{
			class = "Counter",		-- Checks if the monster is burrowed to prevent an exploit
			name = "burrowed",		-- Where it would stand near a higher elevation, allowed the player to fall on it and kill it
			value = 0,
		},
		{
			class = "MonsterAction",
			name = "idle",
			animation = "idleAction",
			animationSpeed = 15,
		},
		{
			class = "MonsterAttack",
			name = "rise",
			attackPower = 17,
			accuracy = 50,
			cooldown = 0,
			animation = "rise",
			--sound = "viper_root_attack",
			cameraShake = true,
			cameraShakeDuration = 0.8,
			onBeginAction = function(self)
				self.go:spawn("particle_system").particle:setParticleSystem("viper_root_rise")
				self.go.burrowed:setValue(0)
			end,
		},
		{
			class = "MonsterAction",
			name = "descend",
			animation = "descend",
			onBeginAction = function(self)
				self.go:spawn("particle_system").particle:setParticleSystem("viper_root_descend")
			end,
			onEndAction = function(self)
				self.go:setPosition(self.go.x, self.go.y, self.go.facing, self.go.elevation - 1, self.go.level)
				self.go.burrowed:setValue(1)
			end,
		},
Add this line to the animations used: (Had to call another animation so the idle animation wont be affected by the speed change in the idle action)

Code: Select all

idleAction = "assets/animations/monsters/viper_root/viper_root_idle.fbx",
I've encountered only two flaws with this:
1) May occasionally linger to lower elevations while the party is falling from (maybe even through) the bound elevation. Will still 'hunt' only on the bound elevation. (If it can see the player)
2) If it descended through the added onThink lines, once the party returns to the bound elevation it will descend again. Will return anyways.

Thats the best I could do. :D
Here's what it looks like underground while "idling"
Image

Re: Please, help with scripting new traits

Posted: Sat Sep 17, 2016 5:32 am
by akroma222
A great ramble indeed ;)
CainOrdamoth wrote:Hi, thanks again. The reason I put shield in with dodge is so that all the Evasion traits are in the same line and all the protection traits are in the same line. I figured, because of the way I redesigned the armour stats, heavy classes won't get much use from evasion so shields won't be as useful for them. The idea I had was to actually have 2 frontline builds, an evasion one (squishy, but can dodge most attacks), and protection builds (more likely to be hit, but can take a lot of punishment). I found in Grimrock 2 everyone just ran 2 full heavies on the frontline, and there was no real drawback as even heavy armour dudes can dodge attacks easily at high levels with the heavy armour proficiency trait. I wanted to make a bit more of a choice whether players want full frontline tank, full frontline evasion, or 1 of each. But you make a good point about evasion classes not wanting to use shields. Perhaps I could try to balance it so player can still make a hybrid if they like, but I'm probably just trying to make things too complicated for myself. I'll take some time to re-evaluate when my actual dungeon map reaches a point I can fully test out builds in the game itself, rather than in purely staged encounters in a test room, lol.
I hear you - perhaps, you could redefine you shields - make them add Protection instead of Evasion ?? (stranger things have happened - may help your grouping decisions)
CainOrdamoth wrote:I removed the knight because of the way i restructured the classes. I made 2 of each "type" of character, that is to say I have 2 classes that favour heavy builds, Berserker which is basically the old barbarian, Warrior is a sort of hybrid between the old fighter and knight class. Rogue which is a lighter class that favours daggers and throwing weapons, ranger which is a more specialized class that is better at special attacks and missile weapons (and maybe as a secondary spellcaster if the player wants, natural magic and all that). Then I have the mage which is the best spellcaster, and a cleric which is a more tanky spellcaster and so could be used in place of the battle mage from the base game. The final class is the deprived, because Dark Souls is awesome :P. And also added as a blank canvass for players to make any build they wish, but is also harder to use at the start. Probably worth noting here that all the base classes are gone and replaced with the new ones, as they're all a bit more compact. I've sort of being working on all this from own ideas alone in my own little bubble, but if anyone has any feedback about these changes, please let me know.
There have also been changes to the traits that affect how the classes function. I've changed all of the racial traits so that they are either given to characters of a certain race by default, or made them into universal traits that players can select at the start regardless of race. As a few examples, Head Hunter I changed to Trophy Hunter and can be taken by any race (trophies are a new type of item acquired from bosses or from completing optional areas), while the Rage trait I made into a default trait for the Berserker class - every berserker gets Rage by default, and it can no longer be taken as a starting trait. I did edit a lot of each race's stats to compensate for this change, but please let me know if you disagree with anything or if you think I removed certain pieces of flavour, etc. My mod will be heavily lore-driven, so a lot of the changes I made make sense in-world, but I also did it to mix things up a bit. Base Grimrock 2 is great, but we've all played it a hundred times, so I thought new things set in a new world would help keep my mod interesting.
Sounds very cool, Ive not heard of any restructures like this - although people seem quite close lipped about their Race Class changes... or just have made 1 or 2 minor changes (not a overhaul).
Its hard to give feedback without seeing the full definitions or tool tips (you may not want to share publicly which is understandable)

Interesting - sounds like you have done away with being able to 'choose' racial traits - they are just given or can be chosen by all? Ive gone a different way - Racial traits drastically changing the Champion build - not to say there is any right way of course - and it all depends on what these traits do (very keen to sneak a peek at a few)
CainOrdamoth wrote:Its a bit on the backburner for me now anyway as I'm focussing on getting all these traits and new spells finished off. I work very sporadically, basically focussing on what I feel like doing at the time, so my mod is a bit scattershot at the moment. I got about a 3rd of the actual dungeon laid out, fully tested and working, all the puzzles, encounters etc are great, but then I make 1 change to a mechanic and get new ideas for different traits etc, so I go back and start on them. Doesn't help that I choose to customize all my monsters from the base monsters and have already added in about 100 new items (mostly retextures with new stats, attacks, effects, etc). At this rate I'll never finish the damn thing XD. But I really enjoy modding, so about 90% of all my free time is devoted to it. I'm rambling again.
Monster mods are on the backburner for me also - (probably for a lot of folk) .... and then there is Zimber!! 8-) :D Ill be playing around with those Roots later today.

Sounds very much like me atm - sporadic, focusing on whatever I feel like at the time. It is dangerous (well, tricky) adding things add hoc - whilst in the middle of building your dungeon. It is almost inevitably going to happen - but as you know - remember to change/alter all the things that 1 new mechanic will affect can be treacherous! I did this for Labyrinth of Lies - finished up the Horrus Mines - waiting for Phitts Mine wallset, creating new features and items - then adding them in here and there. It made for a lot of extra testing and fixing at the end. Then again, not everyone is as scatter brained and complicated as I notoriously am. (Luckily minmay saved me with his coding expertise and I was able to get the thing published, bug free, 2 days before LoG2 was released). So my message I guess would to be vigilant with documenting such late stage changes. And of course round up a bunch of testers! - which I am volunteering for, when you get there :D
CainOrdamoth wrote:Anyway, thanks for the speedy replies. Hopefully I shed some light on my reasonings behind my changes. This is really the first time I've spoken about my mod to anyone who plays Grimrock, so I'd greatly appreciate the feedback. I may release a demo soon so everyone can see how things are shaping up and give constructive feedback on the dungeon itself, too, as well as all the customized assets I added (from other people as well as some I made from retextureing existing stuff). Cheers guys :).
Definitely folk here who would be happy to help test run, advise, provide feedback, straight out fix & problem solve and generally chit chat about your mod.
All the best of luck good sir!
Akroma