Larian Banner: Baldur's Gate Patch 9
Previous Thread
Next Thread
Print Thread
Joined: Jul 2014
K
stranger
OP Offline
stranger
K
Joined: Jul 2014
Hail.

The only gripe I have with EE is sneak changes. I'd like to revert them (allowing the player to decrease the cost of sneaking), but after digging through a file after file I couldn't find any way of altering it (not, say, adding recovery, just changing its cost with decrease per level).

If someone would nudge me in the right direction I'd be ever grateful.

Also would appreciate if someone could tell me where I can find Guerilla talent damage.

Joined: Sep 2015
A
addict
Offline
addict
A
Joined: Sep 2015
The effects of Attributes, Abilities, Talents and Traits can't be modded in D:OS 1 directly. That's one of the biggest limitations, unfortunately. Baardvark (author of the mod Scales) tried his best to make sneaking viable in EE. Reducing AP cost by the Sneaking talent is impossible.
You can download his mod from Nexus and have a look into the 'Base' char script (Data - Public - Shared - Scripts) and into the 'Potion' file (Data - Public - Shared - Stats - Generated - Data) which contains the sneaking buffs scripted in 'Base'.

We all want to sneak as we once did in recent times but, sadly, we can't... frown


My mods for DOS 1 EE: FasterAnimations - QuietDay - Samaritan
Joined: Aug 2014
old hand
Offline
old hand
Joined: Aug 2014
I think I've actually kind of figured out a way to artificially reduce the sneak AP cost (which should be in next version of Scales). Basically just make a skill with the AP cost you want that sets a blank status, and then add a script that makes you sneak on this status activating. Couldn't figure out how to directly tie a skill to sneaking, but this should work fine once I solve a particular issue. I'm not going to add sneak skills for every level, but I'll probably add 2 at different levels (probably level 2 and 5), with different costs and cooldowns. IMO, it's okay if you can't sneak for 1-2 AP every turn, but every few turns might be okay.

Joined: Sep 2015
A
addict
Offline
addict
A
Joined: Sep 2015
To make a last note on this for posterity:

Scripting potions for AP recovery* (and increasing AP max for this purpose), as Baardvark did, is really the only way to get at least something similar (regarding AP costs) to sneaking of Classic Version (but be aware that a specific potion can't be unconsumed by char script, only by Osiris, and permanent potions - "Duration" "-1" - can't be unconsumed at all, unless you apply a potion with reverted values).
* there's no way to refund AP for a character on active turn

I tried to apply the sneak status via script yesterday and, re-reading this thread, I see Baardvark already tried that months ago. That it never made it into Scales, I suppose, (only AP recovery potions to compensate the 5 AP sneak costs did) has the simple reason that even a scripted sneak status (via char script or Osiris) consumes 5 AP in combat.
I used an item (instead of a skill) to apply the sneak status via script (AP costs depending on the sneak ability level), for skills removing invisibility. Technically this works fine, but this doesn't prevent the engine from removing 5 AP when a character gets the sneak status in combat. This cannot be bypassed.

For interest how this would have looked like:

Code
INIT

INT:%APToUse

EVENTS

EVENT AddSneakItem
VARS
	INT:_SneakItemAdded = 0
ON
	OnInit()
ACTIONS
	IF "c1&c2"
		CharacterIsPlayer(__Me)
		IsEqual(_SneakItemAdded,0)
	THEN
		Set(_SneakItemAdded,1)
		CharacterAddToInventory(__Me,"Sneaking_Enable",1)
	ENDIF
	
EVENT ApplySneaking
VARS
	FLOAT:_AP
	FLOAT:_APCosts
	INT:_Sneaking
	ITEM:_Item
	ITEMTEMPLATE:_Template
	ITEMTEMPLATE:_SneakTemp = "Other_SneakingActivation_28043f27-fbe6-4d0f-96f5-db78d3ca5d90"
ON
	OnUseItem(__Me,_Item)
ACTIONS
	IF "c1&c2"
		ItemGetTemplate(_Item,_Template)
		IsEqual(_Template,_SneakTemp)
	THEN
		IF "c1&c2"
			CharacterGetAbility(_Sneaking,__Me,Sneaking)
			CharacterGetStat(_AP,__Me,ActionPoints)
		THEN
			IF "c1"
				IsEqual(_Sneaking,0)
			THEN
				Set(_APCosts,5)
			ELIF "c1"
				IsEqual(_Sneaking,1)
			THEN
				Set(_APCosts,4)
			ELIF "c1"
				IsEqual(_Sneaking,2)
			THEN
				Set(_APCosts,3)
			ELIF "c1"
				IsEqual(_Sneaking,3)
			THEN
				Set(_APCosts,2)
			ELIF "c1"
				IsEqual(_Sneaking,4)
			THEN
				Set(_APCosts,1)
			ELIF "c1"
				IsEqual(_Sneaking,5)
			THEN
				Set(_APCosts,1)
			ELIF "c1"
				IsEqual(_Sneaking,6)
			THEN
				Set(_APCosts,0)
			ENDIF
			IF "!c1&!c2"
				IsLessThen(_AP,_APCosts)
				CharacterHasStatus(__Me,SNEAKING)
			THEN
				Cast(%APToUse,_APCosts)	
				CharacterApplyStatus(__Me,SNEAKING,-1)
				StartTimer("RemoveAP",1,0)
			ELSE
				DisplayText(__Me,"APTooLowOrSneakActive",2)
			ENDIF
		ENDIF	
	ENDIF
	
EVENT RemoveSneakingAP //a delayed sneak check before removing AP is necessary to ensure that the sneak status wasn't immediately removed after application, because of sneak spotters
ON
	OnTimer("RemoveAP") 
ACTIONS
	IF "c1"
		CharacterHasStatus(__Me,SNEAKING)
	THEN
		CharacterUseActionPoints(__Me,%APToUse)
	ELSE
		DisplayText(__Me,"SneakingFailed",2)
	ENDIF



My mods for DOS 1 EE: FasterAnimations - QuietDay - Samaritan
Joined: Jun 2015
F
enthusiast
Offline
enthusiast
F
Joined: Jun 2015
That's the thing, you can never decrease actual sneak cost, the only thing you could do is refund the AP. Does not help though if a character has less than 5 AP left, because there's no way the engine would let a character sneak, it prohibits it and no script would ever receive any events.

So the only solution is to find an alternative way to enter sneaking. Of course there would have to be the chance for any item or skill to cost only 1 AP or maybe 0 AP. Both is possible, stance skills for example have no AP cost, backpacks are an example for items not costing any AP. The downside is that both would require an additional quickslot when there are too few even without any additional skill or item. Casting from inventory or the skillbook is tedious.

Sneaking is a status so maybe it works to apply it to self (data "SkillType" "Shout" via data "SkillProperties" and data "TargetConditions" "self"). Never tested it, but it would have advantages to let the engine do it because the engine might immediately remove the status if the sneaking character is seen by an enemy or friendly NPC. Might be possible to enter a -1 for duration and let the engine remove the status if appropriate.

I made the experience that manipulating statuses via character scripts can cause a game crash, at least it happened when I tried to remove a status immediately after it was applied. Means that care has to be taken with status application and removal in character scripts.
Of course you would have to remove the appropriate AP in an OnSkillCast() handler, because the skill itself could only have the minimum cost. The skill's tooltip might show a wrong amount for the cost and you'd have to give many explanations why it was inaccurate. (Maybe, several hidden and empty and animation-less skills could be created that are 'cast' in the background when the Sneak skill is cast or they could be hidden in a PlayEffectAt(__Me,"Smoke_Something"). I don't know how well the engine works with script casted skills for non-engine controlled characters though. ;-)

If you change sneak cost be aware that the crafting recipes to put sneaking onto gear are still present in EE (void or shadow essences). With those recipes, Sneaking 5 is doable without putting a single point into Sneaking. To disable these recipes, a lot of changes would be required. (Well, not disable, because that's impossible, but you can make the recipes unreachable.)

Joined: Sep 2015
A
addict
Offline
addict
A
Joined: Sep 2015
Quote
So the only solution is to find an alternative way to enter sneaking.

But there doesn't seem to be any. CharacterApplyStatus(__Me,SNEAKING,-1) consumes 5 AP in combat. And Skills don't seem to accept Sneaking as Skill Property.

Quote
I made the experience that manipulating statuses via character scripts can cause a game crash, at least it happened when I tried to remove a status immediately after it was applied. Means that care has to be taken with status application and removal in character scripts.

Yeah, I always use a short timer in those cases.


My mods for DOS 1 EE: FasterAnimations - QuietDay - Samaritan
Joined: Jun 2015
F
enthusiast
Offline
enthusiast
F
Joined: Jun 2015
Well, a timer detaches one from the OnStatus() event. My crash might have something to do with removing the status in the handler that caught it ;-)


Link Copied to Clipboard
Powered by UBB.threads™ PHP Forum Software 7.7.5