Page 2 of 2

Re: Samuel - Master of Dark Arts (WIP)

Posted: Thu Jan 05, 2023 7:45 pm
by smr1957
Definitely some very nice shots! And the mod really looks impressive! :sn-2:
As does Albert's! :sn-37:

Re: Samuel - Master of Dark Arts (WIP)

Posted: Thu Jan 05, 2023 10:00 pm
by Selene310187
I edited the second paragraph of main post of the thread and added the fact that I totally forgot that I had another character between Samuel and Alice. Scalez is actually my fourth Skyrim character. The character I forgot was Nephis, a test character for a custom race for Oldrim that I never finished. I just checked my external harddrive and the project files are still there after all those years. The name of the unfinished race is Nova Race. This could be an idea for a future project for the Special Edition. As you may know, I have a lot of things in the backlog for various games due to several problems (time management, problems with prioritization, etc.). So I don't know when and if I continue the work on the Nova Race.

Altbert wrote: Thu Jan 05, 2023 12:05 pmNice shots! Last one even on the island! Once the first two quests are completed there's an unlimited source of food and drinks!
Thanks :sn-2:. I took the first screenshot on the floating island as well just as some other screenshots which I will show you with the release of the finished mod. I spontaneously decided to take the screenshots there because Scalez and Samuel didn't want to leave this place for the time being :D.

smr1957 wrote: Thu Jan 05, 2023 7:45 pmDefinitely some very nice shots! And the mod really looks impressive! :sn-2:
Thank you :sn-2:.
smr1957 wrote: Thu Jan 05, 2023 7:45 pmAs does Albert's! :sn-37:
Yes, definitely. I will play it more extensively (i.e. the quests) when I have finished the follower mod.

Re: Samuel - Master of Dark Arts (WIP)

Posted: Mon Jan 09, 2023 11:59 pm
by Selene310187
Samuel's signature spell is done. It does 25 points of damage to the target's health and there is a 33 % chance that one of the following additional effects is applied to the target:
  • pushes the target away
  • paralysis the target for 10 seconds
  • depletes all magicka of the target for 10 seconds
I did my best to make the spell not too powerful by adding the 33 % chance, limiting the damage to 25 points only, and that the three additional effects cannot occur simultaneously. If you find that the spell is still too powerful you can exchange it with one of the default Apprentice Destruction spells (Firebolt, Ice Spike or Lightning Bolt) via the settings menu.


I also finished the assignation of the different combat styles (Mage, Spellsword, Two-Handed and Missile aka Archer) which happens automatically when the follower equips the corresponding weapon. So if Samuel equips a one-handed sword, his combat style changes to Spellsword, and if you remove the weapon from his inventory, the combat style changes back to Mage which is his default combat style. And he equips any weapon that you put in his inventory instantly.

Edit:
I will make the combat style auto-assignation and the auto-equip weapon feature both toggleable. If you prefer the combat style handling of AFT for example, you can turn the combat style auto-assignation off anytime.




Papyrus code snippets for those who are interested in the technical details

Equip weapon and ammo automatically and execute the UpdateCombatSkills function:

Code: Select all

Actor Property Samuel Auto
Actor Property PlayerRef Auto


Event OnItemAdded(Form akBaseItem, int aiItemCount, ObjectReference akItemReference, ObjectReference akSourceContainer)
	if akSourceContainer == PlayerRef 
		if (akBaseItem as Weapon) || (akBaseItem as Ammo)    		
			Samuel.equipitem(akBaseItem)
		endif
		UpdateCombatSkills()
	endif
EndEvent

Execute the UpdateCombatSkills function when a weapon is removed:

Code: Select all

Event OnItemRemoved(Form akBaseItem, int aiItemCount, ObjectReference akItemReference, ObjectReference akDestContainer)
	if akDestContainer == PlayerRef 
		if (akBaseItem as Weapon)
			UpdateCombatSkills()
		endif
		
	endif
EndEvent

The UpdateCombatSkills function modifies the combat skills according to the type of the equipped weapons (GetEquippedItemType):

Code: Select all

GlobalVariable Property CombatSpellGlobal Auto
GlobalVariable Property CombatStyleGlobal Auto
Spell Property SpellSignature Auto
Spell Property SpellFire Auto
Spell Property SpellFrost Auto
Spell Property SpellShock Auto


Function UpdateCombatSkills()
	
		
	int CombatSpellInt = CombatSpellGlobal.getvalueint()
		Samuel.removespell(SpellSignature)
		Samuel.removespell(SpellFire)
		Samuel.removespell(SpellFrost)
		Samuel.removespell(SpellShock)


	;=== setting the appropriate combat styles, spells and skills
	if Samuel.GetEquippedItemType(0) == 0 && Samuel.GetEquippedItemType(1) == 0
		;debug.notification("no weapon")
		Samuel.forceav("destruction", Samuel.getbaseav("destruction"))
		Samuel.forceav("destruction", Samuel.getbaseav("destruction") + 50)
		Samuel.forceav("onehanded", Samuel.getbaseav("onehanded"))
		Samuel.forceav("onehanded", Samuel.getbaseav("onehanded") - Samuel.getbaseav("onehanded") * 0.5)
		Samuel.forceav("twohanded", Samuel.getbaseav("twohanded"))
		Samuel.forceav("twohanded", Samuel.getbaseav("twohanded") - Samuel.getbaseav("twohanded") * 0.5)
		Samuel.forceav("marksman", Samuel.getbaseav("marksman"))
		Samuel.forceav("marksman", Samuel.getbaseav("marksman") - Samuel.getbaseav("marksman") * 0.5)
		CombatStyleGlobal.setvalue(0)
		; signature spell
		if CombatSpellInt == 1
			Samuel.AddSpell(SpellSignature)
		; fire spell
		elseif CombatSpellInt == 2			
			Samuel.AddSpell(SpellFire)						
		; frost spell
		elseif CombatSpellInt == 3			
			Samuel.AddSpell(SpellFrost)	
		; shock spell
		elseif CombatSpellInt == 4
			Samuel.AddSpell(SpellShock)				
		endif
;---	one-handed swords, daggers, axes and maces
	elseif (Samuel.GetEquippedItemType(1) > 0 &&  Samuel.GetEquippedItemType(1) < 5) 		
		;debug.notification("one-handed")
		Samuel.forceav("destruction", Samuel.getbaseav("destruction"))
		Samuel.forceav("destruction", Samuel.getbaseav("destruction") + 25)			
		Samuel.forceav("onehanded", Samuel.getbaseav("onehanded"))
		Samuel.forceav("onehanded", Samuel.getbaseav("onehanded") +50)
		Samuel.forceav("twohanded", Samuel.getbaseav("twohanded"))
		Samuel.forceav("twohanded", Samuel.getbaseav("twohanded") - Samuel.getbaseav("twohanded") * 0.5)
		Samuel.forceav("marksman", Samuel.getbaseav("marksman"))
		Samuel.forceav("marksman", Samuel.getbaseav("marksman") - Samuel.getbaseav("marksman") * 0.5)
		CombatStyleGlobal.setvalue(1)
		; signature spell
		if CombatSpellInt == 1
			Samuel.AddSpell(SpellSignature)
		; fire spell
		elseif CombatSpellInt == 2			
			Samuel.AddSpell(SpellFire)						
		; frost spell
		elseif CombatSpellInt == 3			
			Samuel.AddSpell(SpellFrost)	
		; shock spell
		elseif CombatSpellInt == 4
			Samuel.AddSpell(SpellShock)				
		endif
;--- two-handed swords and axes/maces		
	elseif Samuel.GetEquippedItemType(1) > 4 &&  Samuel.GetEquippedItemType(1) < 7 		
		;debug.notification("two-handed")
		Samuel.forceav("twohanded", Samuel.getbaseav("twohanded"))
		Samuel.forceav("twohanded", Samuel.getbaseav("twohanded") +50)
		Samuel.forceav("marksman", Samuel.getbaseav("marksman"))
		Samuel.forceav("marksman", Samuel.getbaseav("marksman") - Samuel.getbaseav("marksman") * 0.5)
		Samuel.forceav("onehanded", Samuel.getbaseav("onehanded"))
		Samuel.forceav("onehanded", Samuel.getbaseav("onehanded") - Samuel.getbaseav("onehanded") * 0.5)
		CombatStyleGlobal.setvalue(2)
;---	bows
	elseif Samuel.GetEquippedItemType(0) == 7													
		;debug.notification("bow")
		Samuel.forceav("marksman", Samuel.getbaseav("marksman"))		
		Samuel.forceav("marksman", Samuel.getbaseav("marksman") +50)
		Samuel.forceav("onehanded", Samuel.getbaseav("onehanded"))
		Samuel.forceav("onehanded", Samuel.getbaseav("onehanded") - Samuel.getbaseav("onehanded") * 0.5)
		Samuel.forceav("twohanded", Samuel.getbaseav("twohanded"))
		Samuel.forceav("twohanded", Samuel.getbaseav("twohanded") - Samuel.getbaseav("twohanded") * 0.5)
		CombatStyleGlobal.setvalue(3)
;--- staffs
	elseif Samuel.GetEquippedItemType(1) == 8 ||  Samuel.GetEquippedItemType(0) == 8
		;debug.notification("staffs")
		Samuel.forceav("destruction", Samuel.getbaseav("destruction"))
		Samuel.forceav("destruction", Samuel.getbaseav("destruction") + 25)
		Samuel.forceav("onehanded", Samuel.getbaseav("onehanded"))
		Samuel.forceav("onehanded", Samuel.getbaseav("onehanded") +50)
		Samuel.forceav("twohanded", Samuel.getbaseav("twohanded"))
		Samuel.forceav("twohanded", Samuel.getbaseav("twohanded") - Samuel.getbaseav("twohanded") * 0.5)
		Samuel.forceav("marksman", Samuel.getbaseav("marksman"))
		Samuel.forceav("marksman", Samuel.getbaseav("marksman") - Samuel.getbaseav("marksman") * 0.5)
		CombatStyleGlobal.setvalue(1)
		; signature spell
		if CombatSpellInt == 1
			Samuel.AddSpell(SpellSignature)
		; fire spell
		elseif CombatSpellInt == 2			
			Samuel.AddSpell(SpellFire)						
		; frost spell
		elseif CombatSpellInt == 3			
			Samuel.AddSpell(SpellFrost)	
		; shock spell
		elseif CombatSpellInt == 4
			Samuel.AddSpell(SpellShock)				
		endif
;---	crossbows		
	elseif Samuel.GetEquippedItemType(1) == 12 ||  Samuel.GetEquippedItemType(0) == 12
		;debug.notification("crossbows")			
		Samuel.forceav("marksman", Samuel.getbaseav("marksman"))
		Samuel.forceav("marksman", Samuel.getbaseav("marksman") +50)
		Samuel.forceav("onehanded", Samuel.getbaseav("onehanded"))
		Samuel.forceav("onehanded", Samuel.getbaseav("onehanded") - Samuel.getbaseav("onehanded") * 0.5)
		Samuel.forceav("twohanded", Samuel.getbaseav("twohanded"))
		Samuel.forceav("twohanded", Samuel.getbaseav("twohanded") - Samuel.getbaseav("twohanded") * 0.5)
		CombatStyleGlobal.setvalue(3)
	endif	
EndFunction
The CombatStyleGlobal is used as a condition for each combat package (which is set to "Interrupt Override: Combat"; Template: Hold Position; Location: near package start location; Radius: 2500; and the Combat Style of your choice). The packages are part of a formlist which is assigned as Combat Override Package list to the ReferenceAlias of Samuel (see Quest Alias Tab).

Re: Samuel - Master of Dark Arts (WIP)

Posted: Wed Jan 18, 2023 6:22 pm
by Selene310187
Preview of Samuel's Signature Spell




Newest additions:
  • healing options: "When summoned", "Uses spell", or "Off"
  • alternative combat spells (fire, shock, frost) plus the option to turn the use of combat spells off
  • ability to toggle off the combat style auto-assignation and the auto-equip weapon feature if you prefer AFT's combat style and equipment handling for example

These are the things that I want to integrate before I call the mod finished:
  • change the combat style assignation part of the script to take shields into account and create a knight combat style (Edit: done)
  • in-game manual (I put that off to another day)
  • option to disable the dialogue menu (so that you only see the quick menu when you interact with Samuel and don't need to close the dialogue menu manually each time) (Edit: done)
  • option to disable idle chatter (the occasional comments he gives you when he's following you around like "Still here" or "I'm right behind you") (Edit: done)

Previous additions:
  • scripting the toggling of the modular parts of Samuel's outfit and the custom outfit part creating Samuel's dark destruction spell aka "Samuel's
    Signature Spell'
  • creating Samuel's dark destruction spell aka "Samuel's Signature Spell"
  • combat behavior settings

Re: Samuel - Master of Dark Arts (WIP)

Posted: Wed Jan 18, 2023 10:31 pm
by Altbert
Looks good! But actually not really my cup of tea. As for magic I only use Healing (myself or others) and Magelight (if a dungeon is still to dark when using my Ring of Night Eye), such as Darkfall Cave.

Re: Samuel - Master of Dark Arts (WIP)

Posted: Wed Jan 18, 2023 11:22 pm
by Selene310187
Altbert wrote: Wed Jan 18, 2023 10:31 pm Looks good! But actually not really my cup of tea. As for magic I only use Healing (myself or others) and Magelight (if a dungeon is still to dark when using my Ring of Night Eye), such as Darkfall Cave.
You can still disable his combat spells via his settings menu :sn-37: and turn him into, for example, a knight if you want. Just give him a sword and armor, and the script changes his combat skills accordingly... Oh, if this a one-handed sword, he will only turned into a spellsword. I forgot to check if a shield is equipped. So I will update the UpdateCombatSkills function and the OnItemAdded/OnItemRemoved parts of the script to take shields into account (see Papyrus code snippets at the end of this post). Then I need to create a matching combat style for the knight which is linked to the UpdateCombatSkills function (the linking is done by using a Global).

Re: Samuel - Master of Dark Arts (WIP)

Posted: Fri Jan 20, 2023 12:35 am
by Selene310187
Now Samuel becomes a spellsword when only a one-handed sword is equipped. As soon as a shield is equipped, his combat style changes to knight automatically, provided that the shield has the default keyword "ArmorShield" assigned in the Creation Kit.

These combat styles will be assigned according to Samuel's equipped stuff:
  • Mage (no weapons; his default combat style)
  • Spellsword (one-handed weapons including staffs)
  • Knight (shield)
  • Two-handed (two-handed swords, axes, maces)
  • Missile (bows, crossbows)
The more I think about it, there are enough people who miss Hand-to-Hand in the list. It wasn't on my radar until now. I probably tie it to the combat spell setting. So if his combat spells are deactivated and if he has nothing in his hands, the Hand-to-Hand combat style will be assigned to the follower.

As soon as I've implemented this tiny bit, I start a final test run testing all functions of the settings menu extensively. After this, I write the in-game manual.

Re: Samuel - Master of Dark Arts (WIP)

Posted: Sat Jan 21, 2023 5:02 am
by Selene310187
Implementing this "tiny bit" took longer than expected. I soon noticed that there isn't a hand-to-hand skill like in the previous The Elder Scrolls games. So I improvised and found the "(invisible) daggers combined with unarmed animations" approach:
https://www.reddit.com/r/skyrimmods/com ... ed_combat/

I further tweaked this approach by assigning unarmed attack sounds to the invisible weapons and removing all sounds which are related to daggers. There's one dagger for the left and another one for the right hand. His "unarmed" combat style is set to "Allow Dual Wielding" which makes sure that he fights with both invisible daggers in his hands. I was quite surprised that it's possible to assign completely different animations to a weapon. Making the daggers invisible was easy. All I need to do was duplicating one of the existing dummy weapons in the Creation Kit.


The new "unarmed" combat style

Re: Samuel - Master of Dark Arts (WIP)

Posted: Sun Jan 22, 2023 10:13 pm
by Selene310187
Today, I finished the in-game manual. Furthermore, I made the strength of the invisible unarmed weapons of his unarmed combat style tiered by the strength of the weapons that start to appear at certain levels of the player (i.e. orcish at level 6 and so on).


Preview of the in-game manual


Preview of Samuel's Quick Menu




The only things left to do is writing the readme and creating the German version of the mod including the translated readme (my mods for the Elder Scrolls games are mostly bilingual).

Re: Samuel - Master of Dark Arts (WIP)

Posted: Wed May 10, 2023 8:48 pm
by Selene310187
After a break of several months I finally took the time to finish and polish the readmes of the English and German versions. Depending on how much energy I have left after this work week, the release will probably be this weekend.

Edit:

Release thread