About this mod
Allows the player to pacify enemy NPCs, Fallout 4 style, with custom (possibly voiced!) sentences based on user-specified conditions. Includes pacifying, inciting, intimidating, and taunting enemies, with either targeted or area of effect speechcraft powers.
- Requirements
- Permissions and credits
In vanilla Skyrim the speech skill is mainly used for barter (which is pretty useless due to Skyrim's broken economy) and persuasion (which I feel is somewhat inconsequential). I liked the intimidation system from Fallout 4, so I took a stab at trying to bring a more expanded version of it to Skyrim. If you ever felt that the speech skill in Skyrim is a bit lackluster then this mod is for you!
In F4's intimidation system, the player can intimidate enemy NPCs, which makes the player character say a sentence from a limited selection, that with a 40% chance successfully intimidates/commands the target. This mod can be viewed as an expanded version of that, with the following key differences:
Following the "silent protagonist" line of thought, the sentences are not voiced.Since version 0.3 there is now an option for voiced sentences. Read more at the end of this page.- Success chance is not fixed, but depends on 1) your speechcraft level, and 2) level difference between your character and the enemy.
- Includes options to either pacify (calm), intimidate (fear), or taunt (rapidly drain magicka & stamina) the enemy, affecting either a single target or an area.
- There is a large & customizable selection of sentences the player character can say, based on custom conditions.
To expand more on the last point, I felt like it was great opportunity for roleplaying your character. In F4, the sentences changed based on which faction you are trying to intimidate. In this mod, each speechcraft power (pacify, intimidate or taunt) has a separate file which includes a list of all the possible sentences the player character can say. These sentences are attached to conditional expressions, in somewhat similar fashion to DAR or OAR, which allows the sentence to be eligible for being randomly selected from the list only if the conditional expression is satisfied. There is also a macro system to make the conditions more readable.
Currently, the mod explores some of the possibilities of using custom conditions. Just to give some examples, there are special sentences if the player is a Dunmer, if the player is a stormcloak & the enemy an imperial legionary, if the player has a daedric artifact, if the enemy is of a specific race and the player isn't of this race, if the player has a shout equipped, or if the player has completed some quest, such as becoming the harbinger of the companions.
In addition, there is support for multiple profiles, which can be selected from the MCM. As an example, I provided a "Khajiit" profile which converts the default sentences from 1st person to 3rd person, as Khajiit are known to refer to themselves in this way (the player's name is dynamically substituted into the sentence). Consequently, beyond editing the default sentences, this mod provides an option for additional custom profiles.
Unfortunately, I am not much of a writer, but I plan to expand and tweak the default sentences (they are far from complete at the moment). I feel there are still many fun possibilities with this mod. For example, additional profiles for the player character if they are a necromancer or a Vigilant of Stendarr, or, alternatively, a mega-racist Nord or Dunmer. Another idea is to provide additional sentences when the player finishes a quest, or have different sentences depending on the player's speechcraft level (this can already be accommodated using the current conditional expression system, so, say, as the player becomes more proficient in speechcraft, more eloquent sentences begin to appear). Since I will be updating the default sentences, you might want to backup your own, maybe in a different profile.
Voices
I will be maintaining the default AI voices for the default sentences. This might create complications for people who want to make their own sentences, because their new sentence will not be voiced. I think it is not too bad, I don't play with voices myself, and I added voices to provide people with the most options.
Regarding the sample voices that come together with this mod, I consider them to be around low-medium level quality (see the video). I used Coqui.ai TTS with the model "tts_models/en/vctk/vits" (and converted WAV to FUZ using Yakitori). If you have access to high quality AI or voice acting, and can pick up the gauntlet, that would be great. For how to add your own voices, read more at the end of this page.
Voice packs
- Ciri Voice Pack - by MidnaLeFay
A guide by MidnaLeFay on how to create voice files using ElevenLabs can be found here.
Compatibility
As this mod does not touch any vanilla records, it should be compatible with all mods by default. The mod simply applies custom illusion spells on enemies, and the sentence display is handled by the DLL.
Furthermore, this mod only depends on speechcraft level and not perks. Thus, it should work great together with mods such as Adamant or Ordinator. In addition, mods such as Become a Bard are fun.
This mod was tested on Skyrim AE 1.6.64. I don't know if it works on other versions of the game, but since I used CommonLibSSE-NG it should.
Requirements
SKSE
SkyUI
Address Library
Mechanics
To start using the speechcraft powers, you need to do one of two things. Either learn the lesser powers from the MCM:
Or bind two hotkeys in the MCM. One hotkey to select the speechcraft to be used:
and another hotkey to actually use the selected power.
Warning: Skyrim's 3rd person crosshair points to the incorrect location unless the player's weapons are unsheathed, so take this into consideration if you want to play in 3rd person when using targeted speechcraft powers.
There are 6 speechcraft powers (they affect only humanoid NPCs):
- Pacify Target - Attempt to pacify the target in the crosshair (range is a bit longer than the "flames" spell). By default the chance of success is (speech level) + 3*(level difference), capped at 80%. If successful, the target is calmed for a duration, and there is a 50% chance (default) the target will instead be incited to attack the player's enemies (in similar fashion to the Bend Will shout). If a pacify attempt was made on a target, regardless of success, the target will have a cooldown which makes them immune to speechcraft power effects for 120 seconds (default).
- Pacify Area - The same as pacify target, but instead applies to all targets in a radius of 250ft (same as master illusion spells). By default, the chance of success is the same as the target spell, multiplied by 0.8. In addition, by default, Area of Effect speechcraft powers can only be used once per combat, but they don't provide the targets with immunity from speechcraft power effects (so you can use a targeted power right after attempting an AoE power on a group of enemies).
- Intimidate Target - The same as Pacify Target, but instead of calming, the target is feared and flees from combat for the duration.
- Intimidate Area - The same as Pacify Area, but with the intimidate effect.
- Taunt Target - The same as Pacify Target, but instead of calming, the target "becomes angry" and rapidly loses 100 stamina and magicka per second for the duration.
- Taunt Area - The same as Pacify Area, but with the taunt effect.
Note that for AoE effects, the chance of success is calculated per target individually. Only Intimidate Target and Taunt Target can affect friendly NPCs, all other powers ignore them.
In addition, in case of success, the duration of the speechcraft power effect on the target depends on the speechcraft level. By default it is 20 +0.4*(speech level) seconds.
XP Gain
By default, for each success, the player gains XP equals to (vanilla speech check XP)*0.5*(1-chance/100). The reason for the last term is so that easier speech checks reward less XP, as they happen more frequently.
By default, for each failure, the player gains XP equals to the success XP, multiplied by 0.1.
MCM Settings
Below is a list of all things that can be changed via the MCM:
- Hotkeys
- Speechcraft power success chances. There are individual values for pacify, intimidate, and taunt
- XP gain multipliers
- Speechcraft power effect duration and cooldown duration
- AoE effects being allowed only once per combat, and whether they apply a cooldown
- Sentence subtitles display time
- Sentence no repeat counter - this option makes sure that the X last sentences said by the player do not repeat
- Visual effects - can be disabled for "immersion"
- Player animation
Sentences
The list of profiles is visible in the MCM. After opening a profile you can view the sentences associated with each of the 6 powers, and edit the relative probability weight of a sentence (to disable the sentence, set the weight to 0). If this is all you want, you don't need to read any further.
Warning: I didn't implement pages in the MCM yet, so you will only see the first 60 sentences or so. If you have more sentences in a file you will need to edit the file directly.
To add/change profiles and edit the sentences themselves, you will need to know the file structure of this mod. The sentence profiles are stored in the folder:
Data\CombatSpeechcraft\Profiles
with the sentences of some profile <profile> for all 6 powers being in the txt files:
Data\CombatSpeechcraft\Profiles\<profile>\PacifyTarget.txt
Data\CombatSpeechcraft\Profiles\<profile>\PacifyArea.txt
Data\CombatSpeechcraft\Profiles\<profile>\IntimidateTarget.txt
Data\CombatSpeechcraft\Profiles\<profile>\IntimidateArea.txt
Data\CombatSpeechcraft\Profiles\<profile>\TauntTarget.txt
Data\CombatSpeechcraft\Profiles\<profile>\TauntArea.txt
Sentence file structure
Here are a few lines from 'Data\CombatSpeechcraft\Profiles\Default\TauntTarget.txt':
1;You're a bumbling fool in battle!
1;Your fashion sense offends the gods!;EnemyIsBandit()
1;Thalmor, deluded elves clinging to false superiority!;!PlayerIsAltmer()&EnemyIsThalmor()
1;You swing your weapon like a milk-drinker. It's almost adorable.;EnemyUsesBlade()|EnemyUsesBlunt()
The integer value "1" stands for the weight of the sentence. It is the relative probability this sentence get selected. So an integer value "2" means the sentence is twice as likely to be randomly selected from the list of eligible sentences, compared to a sentence with weight "1". In addition, a value of "0" effectively means this sentence is disabled. In the current iteration of the mod all weights are "1", but higher weights are recommended for sentences with more rare conditions.
Between the two semicolons there is the sentence itself, whose contents you can edit (don't put a semicolon in the sentence itself).
After the second semicolon, there is the conditional expression of the sentence. The sentence is eligible to be selected from the list only if the conditional expression is satisfied (if the second semicolon is absent, it is understood that sentence is always eligible). In general, this conditional expression has the following structure
!func(args)&!func(args)&...&!func(args)|func(args)&func(args)&...&func(args)|...|func(args)&func(args)&...&func(args)
where func is a condition function with arguments args, "!" is a logical NOT, which can optionally appear before every condition function, "&" is a logical AND and "|" is a logical OR. There are no parentheses in these expressions, but the logical ANDs are calculated before the logical ORs. This way, the conditional expression is "an OR of ANDs". In more formal terms, the conditional expression is given in Disjunctive Normal Form, which I think is more intuitive than how DAR or Creation Kit do it (they use a CNF, i.e an "AND of ORs").
Warning: please don't use whitespaces or parentheses in the conditional expressions.
Regarding the condition functions themselves (such as PlayerIsAltmer()), they can be either "basic" condition functions, or macros. The former are similar to the conditions in DAR. An example of a "basic" condition function could be
PlayerIsRace(Skyrim.esm,0x13744)
which checks if the player is an imperial. For the latter, in fact, PlayerIsAltmer() is an example of a macro. This macro is defined in a macro file as
PlayerIsAltmer()=PlayerIsRace(Skyrim.esm,0x00013743)|PlayerIsRace(Skyrim.esm,0x00088840)
Note: Because macros themselves are given in DNF form, using macros also allows to evaluate logical expressions with more complexity than DNF or CNF.
These two options will be further elaborated in the following.
Basic condition functions
The basic conditions are mostly the same ones that appear in DAR. Unlike DAR, here there is a distinction whether the condition function is computed on the player character actor or a targeted enemy actor. Furthermore, note that for AoE powers there is no meaning to use enemy-oriented condition functions, as there could be multiple different enemies affected. Therefore, AoE powers (pacify area, intimidate area, taunt area) only support non-enemy-oriented condition functions.
Here is the full list of basic condition functions:
EnemyHasKeyword(<esp/esm/esl file>,<form id>)
EnemyHasMagicEffect(<esp/esm/esl file>,<form id>)
EnemyHasMagicEffectWithKeyword(<esp/esm/esl file>,<form id>)
EnemyHasPerk(<esp/esm/esl file>,<form id>)
EnemyHasSpell(<esp/esm/esl file>,<form id>)
EnemyIsActorValueBaseEqualTo(<actor value name>,<value>)
EnemyIsActorValueBaseLessThan(<actor value name>,<value>)
EnemyIsActorValueEqualTo(<actor value name>,<value>)
EnemyIsActorValueLessThan(<actor value name>,<value>>)
EnemyIsActorValueMaxEqualTo(<actor value name>,<value>)
EnemyIsActorValueMaxLessThan(<actor value name>,<value>)
EnemyIsActorValuePercentageEqualTo(<actor value name>,<percentage>)
EnemyIsActorValuePercentageLessThan(<actor value name>,<percentage>)
EnemyIsEquippedLeft(<esp/esm/esl file>,<form id>)
EnemyIsEquippedLeftHasKeyword(<esp/esm/esl file>,<form id>)
EnemyIsEquippedLeftType(<type>)
EnemyIsEquippedRight(<esp/esm/esl file>,<form id>)
EnemyIsEquippedRightHasKeyword(<esp/esm/esl file>,<form id>)
EnemyIsEquippedRightType(<type>)
EnemyIsEquippedShout(<esp/esm/esl file>,<form id>)
EnemyIsFemale()
EnemyIsInFaction(<esp/esm/esl file>,<form id>)
EnemyIsLevelEqualTo(<num>)
EnemyIsLevelEqualToPlayer()
EnemyIsLevelLessThan(<num>)
EnemyIsLevelLessThanPlayer()
EnemyIsRace(<esp/esm/esl file>,<form id>)
EnemyIsUnique()
EnemyIsWorn(<esp/esm/esl file>,<form id>)
EnemyIsWornHasKeyword(<esp/esm/esl file>,<form id>)
EnemyLevelDiffWithPlayerAtleast(<num>)
EnemyUsesShout()
IsQuestComplete(<esp/esm/esl file>,<form id>)
PlayerHasKeyword(<esp/esm/esl file>,<form id>)
PlayerHasMagicEffect(<esp/esm/esl file>,<form id>)
PlayerHasMagicEffectWithKeyword(<esp/esm/esl file>,<form id>)
PlayerHasPerk(<esp/esm/esl file>,<form id>)
PlayerHasSpell(<esp/esm/esl file>,<form id>)
PlayerIsActorValueBaseEqualTo(<actor value name>,<value>)
PlayerIsActorValueBaseLessThan(<actor value name>,<value>)
PlayerIsActorValueEqualTo(<actor value name>,<value>)
PlayerIsActorValueLessThan(<actor value name>,<value>)
PlayerIsActorValueMaxEqualTo(<actor value name>,<value>)
PlayerIsActorValueMaxLessThan(<actor value name>,<value>)
PlayerIsActorValuePercentageEqualTo(<actor value name>,<percentage>)
PlayerIsActorValuePercentageLessThan(<actor value name>,<percentage>)
PlayerIsEquippedLeft(<esp/esm/esl file>,<form id>)
PlayerIsEquippedLeftHasKeyword(<esp/esm/esl file>,<form id>)
PlayerIsEquippedLeftType(<type>)
PlayerIsEquippedRight(<esp/esm/esl file>,<form id>)
PlayerIsEquippedRightHasKeyword(<esp/esm/esl file>,<form id>)
PlayerIsEquippedRightType(<type>)
PlayerIsEquippedShout(<esp/esm/esl file>,<form id>)
PlayerIsFemale()
PlayerIsInFaction(<esp/esm/esl file>,<form id>)
PlayerIsLevelEqualTo(<num>)
PlayerIsLevelLessThan(<num>)
PlayerIsRace(<esp/esm/esl file>,<form id>)
PlayerIsWorn(<esp/esm/esl file>,<form id>)
PlayerIsWornHasKeyword(<esp/esm/esl file>,<form id>)
PlayerUsesShout()
Weapon types are as in DAR:
And the <actor value name> is given by name, for example, "health" or "stamina". Here is the full list:
https://www.creationkit.com/index.php?title=Actor_Value_List#List_of_Actor_Values
Macros
Macro files are stored in txt files in the following directory:
Data\CombatSpeechcraft\Macros
Macro definitions have the following format:
MacroFunc()=conditional expression
Currently, condition functions defined by macros do not accept parameters. However, the condition functions in the conditional expression have their own parameters, and can even be other macros (beware of defining macros with circular references).
Here are examples of some macros:
PlayerIsExpertDestruction()=!PlayerIsActorValueLessThan(Destruction,75)
PlayerUsesDagger()=PlayerIsEquippedRightType(2)
PlayerUsesBlade()=PlayerIsEquippedRightType(1)|PlayerUsesDagger()|PlayerIsEquippedRightType(5)
Voices
A guide by MidnaLeFay on how to create voice files using ElevenLabs can be found here.
The voiced sentences of voice pack <voice> are stored in the folder:
Data\Sound\CombatSpeechcraft\<voice>\
The voice packs themselves are disconnected from profiles. Each voice pack simply has a list of all sentences it can say (so a voice pack could potentially support multiple profiles). For example, "sample male" has a voiced line for the sentences:
Are you a frost spell? 'Cause you're not hot at all!
(enemy), there's still time to make the right choice.
which are stored in the FUZ files:
Data\Sound\CombatSpeechcraft\sample male\Are you a frost spell@ 'Cause you're not hot at all!.fuz
Data\Sound\CombatSpeechcraft\sample male\(enemy), there's still time to make the right choice..fuz
Note that the file name is identical to the sentence text (plus ".fuz"), with the exception that you have to replace "?" by "@", because windows doesn't support question marks in file names.
Thus, in this way you can add new voice packs. Even if new sentences are added it will not break compatibility, it will simply mean new sentences will not be voiced until a fuz file is provided for them.