Script Optimization and Speed

Post » Tue Jun 19, 2012 8:49 pm

Just wondering. Are there any tips on how to optimize scripts?

How fast should a script be able to run? Does it depend on how many lines in total there are... or only on how many lines are run?

I have a LOT of If/ElseIf statements, and my OnHit script takes between half a second and a full second to take effect. Not exactly ideal if I want a strike to kill the actor immediately. Right now, it's 1700 lines long, but the VAST majority of those are If/ElfeIf statements... and many of those are nested.
User avatar
Del Arte
 
Posts: 3543
Joined: Tue Aug 01, 2006 8:40 pm

Post » Tue Jun 19, 2012 11:51 am

Yeah the number of lines that actually have to be executed will be the main factor.

Generally...

if variable
is faster than
if (variable != 0)

If your conditions call functions, then consider caching the value to a local variable if the function would be called many times.
Eg. no need to repeatedly call Game.GetPlayer()

Nested if blocks can help a lot too, as you can skip whole sections of code with irrelevant condition checks.
The order you test things can improve the speed too, but it depends on the problem.
ie, if your function did nothing unless it was lunchtime, then having it bail out early when not lunchtime would be sensible.
User avatar
Laura Mclean
 
Posts: 3471
Joined: Mon Oct 30, 2006 12:15 pm

Post » Tue Jun 19, 2012 4:24 pm

Papyrus has been completely re-written and shares nothing with Legacy (the scripting language used by Oblivion and Fallout 3/New Vegas), so I wouldn't be confident in assuming that the results of optimisation tests for Legacy would still hold for Papyrus.

Whereas in previous games a script would do what it was told immediately - it was even possible to freeze the game with an infinite loop (courtesy of a script extender) as the frame would last at least as long as the scripts running in it took to execute - Skyrim's changed things a bit. Now, as I understand it, scripts are given time in which to run depending on things like how much they need to do and how often they're having native events called on them by the game. This, and Skyrim's support for multi-threading, make it very difficult to test the efficiency of scripts.

Basically, if your script is very "heavy", then instead of slowing down the game as it may have done in previous games, it's more likely to slow down other scripts. It's significantly more difficult now to perform time-sensitive actions via script due to this, and much more difficult than it previously was to perform tests of efficiency.

Cipscis
User avatar
Claudia Cook
 
Posts: 3450
Joined: Mon Oct 30, 2006 10:22 am

Post » Tue Jun 19, 2012 9:20 pm

Thank you both! :-)

So... there isn't a way to give my script a higher priority, is there? At least the "OnHit" event of it?
User avatar
Donatus Uwasomba
 
Posts: 3361
Joined: Sun May 27, 2007 7:22 pm

Post » Tue Jun 19, 2012 8:41 am

Not that I'm aware of, although there may be ways to streamline your script which could make it run faster. I know the Papyrus compiler does some optimisation, but I don't know to what extent scripts are optimised. Why don't you post your script and we'll see if we can think of something that will make it run faster?

Cipscis
User avatar
Paula Ramos
 
Posts: 3384
Joined: Sun Jul 16, 2006 5:43 am

Post » Tue Jun 19, 2012 8:24 pm

Haha, ok, it's certainly not finished. But this is what I've got so far. I know there's some redundancy. Please keep in mind this is my first script ever :-P

EDIT:
The purpose of the script is to determine what type of armor struck actor is wearing and also what type of weapon it was struck with. It sets amount of damage/resistance ability for three different types of damage based on type of material and weapon type. Then it will apply certain effects and damage based on if the strikes succeed or fail according to a calculation.

In short, I want some armor to be invulnerable to some weapons. I don't like the absorption feature of vanilla Skyrim.


Spoiler

Scriptname SAWDOnHit extends ActiveMagicEffect{SAWD OnHit Damage Calculation}Keyword property VendorItemAnimalHide autoKeyword property ArmorMaterialDaedric autoKeyword property ArmorMaterialDragonplate autoKeyword property ArmorMaterialDragonscale autoKeyword property ArmorMaterialDwarven autoKeyword property ArmorMaterialEbony autoKeyword property ArmorMaterialElven autoKeyword property ArmorMaterialElvenGilded autoKeyword property ArmorMaterialGlass autoKeyword property ArmorMaterialHide autoKeyword property ArmorMaterialImperialHeavy autoKeyword property ArmorMaterialImperialLight autoKeyword property ArmorMaterialImperialStudded autoKeyword property ArmorMaterialIron autoKeyword property ArmorMaterialIronBanded autoKeyword property ArmorMaterialLeather autoKeyword property ArmorMaterialOrcish autoKeyword property ArmorMaterialScaled autoKeyword property ArmorMaterialSteel autoKeyword property ArmorMaterialSteelPlate autoKeyword property ArmorMaterialStormcloak autoKeyword property ArmorMaterialStudded autoKeyword property ArmorNightingale autoKeyword property ArmorDarkBrotherhood autoKeyword property ArmorCuirass autoKeyword property VendorItemArrow autoKeyword property WeapTypeBoundArrow autoKeyword property WeapTypeBow autoKeyword property WeapTypeDagger autoKeyword property WeapTypeSword autoKeyword property WeapTypeGreatsword autoKeyword property WeapTypeWarAxe autoKeyword property WeapTypeBattleaxe autoKeyword property WeapTypeMace autoKeyword property WeapTypeWarhammer autoKeyword property WeapTypeStaff autoKeyword property WeapMaterialDaedric autoKeyword property WeapMaterialDraugr autoKeyword property WeapMaterialDraugrHoned autoKeyword property WeapMaterialDwarven autoKeyword property WeapMaterialEbony autoKeyword property WeapMaterialElven autoKeyword property WeapMaterialFalmer autoKeyword property WeapMaterialFalmerHoned autoKeyword property WeapMaterialGlass autoKeyword property WeapMaterialImperial autoKeyword property WeapMaterialIron autoKeyword property WeapMaterialOrcish autoKeyword property WeapMaterialSilver autoKeyword property WeapMaterialSteel autoKeyword property WeapMaterialWood autoSPELL PROPERTY SAWDStagger2 AUTOSPELL PROPERTY SAWDStagger AUTOSPELL PROPERTY SAWDKneel AUTOSPELL PROPERTY SAWDDamageHeavy AUTOSPELL PROPERTY SAWDDamageModerate AUTOSPELL PROPERTY SAWDDamageLight AUTOSPELL PROPERTY SAWDBleedHeavy AUTOSPELL PROPERTY SAWDBleedModerate AUTOSPELL PROPERTY SAWDBleedLight AUTOActor property Target autoEvent OnEffectStart(Actor akTarget, Actor akCaster)Target = akTargetendEventEvent OnHit(ObjectReference akAggressor, Form akSource, Projectile akProjectile, bool abPowerAttack, bool abSneakAttack, \  bool abBashAttack, bool abHitBlocked)int ResistPenetration = 0int ResistCut = 0int ResistConcussion = 0int PenetrationMin = 0int PenetrationMax = 0int CutMin = 0int CutMax = 0int ConcussionMin = 0int ConcussionMax = 0int PenetrationRoll = 0int CutRoll = 0int ConcussionRoll = 0int PenetrationSuccess = 0int CutSuccess = 0int ConcussionSuccess = 0int ArrowPenetration = 0int ArrowConcussion = 0  If ( Target.WornHasKeyword(ArmorCuirass))  ResistPenetration = 0  ResistCut = 0  ResistConcussion = 0  If ( Target.WornHasKeyword(ArmorMaterialDaedric))   ResistPenetration = 250   ResistCut = 250   ResistConcussion = 250  ElseIf ( Target.WornHasKeyword(ArmorMaterialDragonplate))   ResistPenetration = 225   ResistCut = 225   ResistConcussion = 225  ElseIf ( Target.WornHasKeyword(ArmorMaterialEbony))   ResistPenetration = 200   ResistCut = 200   ResistConcussion = 200  ElseIf ( Target.WornHasKeyword(ArmorMaterialDwarven))   ResistPenetration = 175   ResistCut = 170   ResistConcussion = 175  ElseIf ( Target.WornHasKeyword(ArmorMaterialOrcish))   ResistPenetration = 150   ResistCut = 150   ResistConcussion = 150  ElseIf ( Target.WornHasKeyword(ArmorMaterialDragonscale))   ResistPenetration = 150   ResistCut = 150   ResistConcussion = 150  ElseIf ( Target.WornHasKeyword(ArmorMaterialImperialHeavy))   ResistPenetration = 140   ResistCut = 140   ResistConcussion = 140  ElseIf ( Target.WornHasKeyword(ArmorMaterialSteelPlate))   ResistPenetration = 130   ResistCut = 130   ResistConcussion = 130  ElseIf ( Target.WornHasKeyword(ArmorMaterialGlass))   ResistPenetration = 130   ResistCut = 130   ResistConcussion = 130    ElseIf ( Target.WornHasKeyword(ArmorMaterialSteel))   ResistPenetration = 120   ResistCut = 120   ResistConcussion = 120  ElseIf ( Target.WornHasKeyword(ArmorMaterialIronBanded))   ResistPenetration = 110   ResistCut = 110   ResistConcussion = 110  ElseIf ( Target.WornHasKeyword(ArmorMaterialElvenGilded))   ResistPenetration = 110   ResistCut = 110   ResistConcussion = 110    ElseIf ( Target.WornHasKeyword(ArmorMaterialIron))   ResistPenetration = 100   ResistCut = 100   ResistConcussion = 100  ElseIf ( Target.WornHasKeyword(ArmorMaterialElven))   ResistPenetration = 100   ResistCut = 100   ResistConcussion = 100    ElseIf ( Target.WornHasKeyword(ArmorMaterialScaled))   ResistPenetration = 75   ResistCut = 90   ResistConcussion = 60  ElseIf ( Target.WornHasKeyword(ArmorMaterialImperialStudded))   ResistPenetration = 60   ResistCut = 80   ResistConcussion = 40    ElseIf ( Target.WornHasKeyword(ArmorMaterialStormcloak))   ResistPenetration = 50   ResistCut = 75   ResistConcussion = 35  ElseIf ( Target.WornHasKeyword(ArmorNightingale))   ResistPenetration = 50   ResistCut = 35   ResistConcussion = 30    ElseIf ( Target.WornHasKeyword(ArmorMaterialStudded))   ResistPenetration = 45   ResistCut = 35   ResistConcussion = 30  ElseIf ( Target.WornHasKeyword(ArmorMaterialImperialLight))   ResistPenetration = 40   ResistCut = 30   ResistConcussion = 25  ElseIf ( Target.WornHasKeyword(ArmorMaterialLeather))   ResistPenetration = 40   ResistCut = 30   ResistConcussion = 25    ElseIf ( Target.WornHasKeyword(ArmorDarkBrotherhood))   ResistPenetration = 30   ResistCut = 30   ResistConcussion = 20  ElseIf ( Target.WornHasKeyword(ArmorMaterialHide))   ResistPenetration = 15   ResistCut = 15   ResistConcussion = 15  ElseIf ( Target.WornHasKeyword(VendorItemAnimalHide))   ResistPenetration = 15   ResistCut = 15   ResistConcussion = 15    Else   ResistPenetration = 0   ResistCut = 0   ResistConcussion = 0  EndIfEndIf  if ( akSource.HasKeyword(WeapTypeDagger) || akSource.HasKeyword(WeapTypeSword) || akSource.HasKeyword(WeapTypeGreatsword) || akSource.HasKeyword(WeapTypeWarAxe) || akSource.HasKeyword(WeapTypeBattleaxe))  CutMin = 0  CutMax = 0  if ( akSource.HasKeyword(WeapMaterialIron))   CutMin = 1   CutMax = 50  ElseIf ( akSource.HasKeyword(WeapMaterialSteel))   CutMin = 2   CutMax = 53  ElseIf ( akSource.HasKeyword(WeapMaterialImperial))   CutMin = 3   CutMax = 55  ElseIf ( akSource.HasKeyword(WeapMaterialSilver))   CutMin = 1   CutMax = 45    ElseIf ( akSource.HasKeyword(WeapMaterialOrcish))   CutMin = 4   CutMax = 62  ElseIf ( akSource.HasKeyword(WeapMaterialDwarven))   CutMin = 7   CutMax = 65    ElseIf ( akSource.HasKeyword(WeapMaterialFalmer))   CutMin = 3   CutMax = 57  ElseIf ( akSource.HasKeyword(WeapMaterialFalmerHoned))   CutMin = 8   CutMax = 67  ElseIf ( akSource.HasKeyword(WeapMaterialElven))   CutMin = 10   CutMax = 70  ElseIf ( akSource.HasKeyword(WeapMaterialGlass))   CutMin = 20   CutMax = 75  ElseIf ( akSource.HasKeyword(WeapMaterialDraugr))   CutMin = 1   CutMax = 48  ElseIf ( akSource.HasKeyword(WeapMaterialDraugrHoned))   CutMin = 4   CutMax = 59  ElseIf ( akSource.HasKeyword(WeapMaterialEbony))   CutMin = 30   CutMax = 90  ElseIf ( akSource.HasKeyword(WeapMaterialDaedric))   CutMin = 40   CutMax = 100  ElseIf ( akSource.HasKeyword(WeapMaterialWood))   CutMin = 0   CutMax = 0  Else   CutMin = 0   CutMax = 0    EndIfElse  CutMin = 0  CutMax = 0EndIfif (akSource as spell) == NONE  PenetrationMin = 0  PenetrationMax = 0  ConcussionMin = 0  ConcussionMax = 0  if abPowerAttack == False     If ( akSource.HasKeyword(WeapTypeBow))	if ( akSource.HasKeyword(WeapMaterialIron))	 PenetrationMin = 26	 PenetrationMax = 265	 ConcussionMin = 1	 ConcussionMax = 10	ElseIf ( akSource.HasKeyword(WeapMaterialSteel))	 PenetrationMin = 27	 PenetrationMax = 270	 ConcussionMin = 1	 ConcussionMax = 10	ElseIf ( akSource.HasKeyword(WeapMaterialImperial))	 PenetrationMin = 27	 PenetrationMax = 275	 ConcussionMin = 1	 ConcussionMax = 10	ElseIf ( akSource.HasKeyword(WeapMaterialSilver))	 PenetrationMin = 26	 PenetrationMax = 260	 ConcussionMin = 1	 ConcussionMax = 10	ElseIf ( akSource.HasKeyword(WeapMaterialOrcish))	 PenetrationMin = 30	 PenetrationMax = 300	 ConcussionMin = 1	 ConcussionMax = 15	ElseIf ( akSource.HasKeyword(WeapMaterialDwarven))	 PenetrationMin = 34	 PenetrationMax = 340	 ConcussionMin = 1	 ConcussionMax = 20	ElseIf ( akSource.HasKeyword(WeapMaterialFalmer))	 PenetrationMin = 31	 PenetrationMax = 310	 ConcussionMin = 1	 ConcussionMax = 23	ElseIf ( akSource.HasKeyword(WeapMaterialFalmerHoned))	 PenetrationMin = 35	 PenetrationMax = 350	 ConcussionMin = 1	 ConcussionMax = 23	ElseIf ( akSource.HasKeyword(WeapMaterialElven))	 PenetrationMin = 41	 PenetrationMax = 410	 ConcussionMin = 1	 ConcussionMax = 10	ElseIf ( akSource.HasKeyword(WeapMaterialGlass))	 PenetrationMin = 32	 PenetrationMax = 320	 ConcussionMin = 1	 ConcussionMax = 15	ElseIf ( akSource.HasKeyword(WeapMaterialDraugr))	 PenetrationMin = 16	 PenetrationMax = 163	 ConcussionMin = 1	 ConcussionMax = 10	ElseIf ( akSource.HasKeyword(WeapMaterialDraugrHoned))	 PenetrationMin = 18	 PenetrationMax = 185	 ConcussionMin = 1	 ConcussionMax = 10	ElseIf ( akSource.HasKeyword(WeapMaterialEbony))	 PenetrationMin = 36	 PenetrationMax = 360	 ConcussionMin = 3	 ConcussionMax = 25	ElseIf ( akSource.HasKeyword(WeapMaterialDaedric))	 PenetrationMin = 40	 PenetrationMax = 400	 ConcussionMin = 4	 ConcussionMax = 30	ElseIf ( akSource.HasKeyword(WeapMaterialWood))	 PenetrationMin = 9	 PenetrationMax = 90	 ConcussionMin = 1	 ConcussionMax = 8	Else	 PenetrationMin = 0	 PenetrationMax = 0	 ConcussionMin = 0	 ConcussionMax = 0  	EndIf  	ArrowPenetration = 0	ArrowConcussion = 0  	if ( akSource.HasKeyword(WeapMaterialIron))	 ArrowPenetration = 5	 ArrowConcussion = 0	ElseIf ( akSource.HasKeyword(WeapMaterialSteel))	 ArrowPenetration = 10	 ArrowConcussion = 1	ElseIf ( akSource.HasKeyword(WeapMaterialImperial))	 ArrowPenetration = 15	 ArrowConcussion = 1	ElseIf ( akSource.HasKeyword(WeapMaterialSilver))	 ArrowPenetration = 1	 ArrowConcussion = 0	ElseIf ( akSource.HasKeyword(WeapMaterialOrcish))	 ArrowPenetration = 20	 ArrowConcussion = 2	ElseIf ( akSource.HasKeyword(WeapMaterialDwarven))	 ArrowPenetration = 25	 ArrowConcussion = 2	ElseIf ( akSource.HasKeyword(WeapMaterialFalmer))	 ArrowPenetration = 22	 ArrowConcussion = 3	ElseIf ( akSource.HasKeyword(WeapMaterialFalmerHoned))	 ArrowPenetration = 30	 ArrowConcussion = 3	ElseIf ( akSource.HasKeyword(WeapMaterialElven))	 ArrowPenetration = 50	 ArrowConcussion = 5	ElseIf ( akSource.HasKeyword(WeapMaterialGlass))	 ArrowPenetration = 35	 ArrowConcussion = 3	ElseIf ( akSource.HasKeyword(WeapMaterialDraugr))	 ArrowPenetration = 3	 ArrowConcussion = 0	ElseIf ( akSource.HasKeyword(WeapMaterialDraugrHoned))	 ArrowPenetration = 17	 ArrowConcussion = 1	ElseIf ( akSource.HasKeyword(WeapMaterialEbony))	 ArrowPenetration = 40	 ArrowConcussion = 4	ElseIf ( akSource.HasKeyword(WeapMaterialDaedric))	 ArrowPenetration = 45	 ArrowConcussion = 4	ElseIf ( akSource.HasKeyword(WeapMaterialWood))	 ArrowPenetration = 0	 ArrowConcussion = 0	Else	 ArrowPenetration = 0	 ArrowConcussion = 0  	EndIf  	PenetrationMin = ( PenetrationMin + ArrowPenetration )	PenetrationMax = ( PenetrationMax + ArrowPenetration )	ConcussionMin = ( ConcussionMin + ArrowConcussion )	ConcussionMax = ( ConcussionMax + ArrowConcussion )     Elseif ( akSource.HasKeyword(WeapTypeDagger))	if ( akSource.HasKeyword(WeapMaterialIron))	 PenetrationMin = 1	 PenetrationMax = 35	 ConcussionMin = 1	 ConcussionMax = 10	ElseIf ( akSource.HasKeyword(WeapMaterialSteel))	 PenetrationMin = 1	 PenetrationMax = 37	 ConcussionMin = 1	 ConcussionMax = 10	ElseIf ( akSource.HasKeyword(WeapMaterialImperial))	 PenetrationMin = 1	 PenetrationMax = 39	 ConcussionMin = 1	 ConcussionMax = 10	ElseIf ( akSource.HasKeyword(WeapMaterialSilver))	 PenetrationMin = 1	 PenetrationMax = 33	 ConcussionMin = 1	 ConcussionMax = 10  	ElseIf ( akSource.HasKeyword(WeapMaterialOrcish))	 PenetrationMin = 2	 PenetrationMax = 41	 ConcussionMin = 1	 ConcussionMax = 15	ElseIf ( akSource.HasKeyword(WeapMaterialDwarven))	 PenetrationMin = 5	 PenetrationMax = 45	 ConcussionMin = 1	 ConcussionMax = 20	ElseIf ( akSource.HasKeyword(WeapMaterialFalmer))	 PenetrationMin = 3	 PenetrationMax = 42	 ConcussionMin = 1	 ConcussionMax = 23	ElseIf ( akSource.HasKeyword(WeapMaterialFalmerHoned))	 PenetrationMin = 5	 PenetrationMax = 48	 ConcussionMin = 1	 ConcussionMax = 23	ElseIf ( akSource.HasKeyword(WeapMaterialElven))	 PenetrationMin = 3	 PenetrationMax = 40	 ConcussionMin = 1	 ConcussionMax = 10	ElseIf ( akSource.HasKeyword(WeapMaterialGlass))	 PenetrationMin = 4	 PenetrationMax = 43	 ConcussionMin = 1	 ConcussionMax = 15	ElseIf ( akSource.HasKeyword(WeapMaterialDraugr))	 PenetrationMin = 1	 PenetrationMax = 34	 ConcussionMin = 1	 ConcussionMax = 10	ElseIf ( akSource.HasKeyword(WeapMaterialDraugrHoned))	 PenetrationMin = 2	 PenetrationMax = 40	 ConcussionMin = 1	 ConcussionMax = 10	ElseIf ( akSource.HasKeyword(WeapMaterialEbony))	 PenetrationMin = 7	 PenetrationMax = 55	 ConcussionMin = 3	 ConcussionMax = 25	ElseIf ( akSource.HasKeyword(WeapMaterialDaedric))	 PenetrationMin = 10	 PenetrationMax = 65	 ConcussionMin = 4	 ConcussionMax = 30	ElseIf ( akSource.HasKeyword(WeapMaterialWood))	 PenetrationMin = 0	 PenetrationMax = 10	 ConcussionMin = 1	 ConcussionMax = 8	Else	 PenetrationMin = 0	 PenetrationMax = 0	 ConcussionMin = 0	 ConcussionMax = 0  	EndIf   Elseif ( akSource.HasKeyword(WeapTypeSword))	if ( akSource.HasKeyword(WeapMaterialIron))	 PenetrationMin = 1	 PenetrationMax = 150	 ConcussionMin = 69	 ConcussionMax = 138	ElseIf ( akSource.HasKeyword(WeapMaterialSteel))	 PenetrationMin = 1	 PenetrationMax = 155	 ConcussionMin = 71	 ConcussionMax = 142	ElseIf ( akSource.HasKeyword(WeapMaterialImperial))	 PenetrationMin = 1	 PenetrationMax = 160	 ConcussionMin = 73	 ConcussionMax = 146	ElseIf ( akSource.HasKeyword(WeapMaterialSilver))	 PenetrationMin = 1	 PenetrationMax = 140	 ConcussionMin = 75	 ConcussionMax = 150  	ElseIf ( akSource.HasKeyword(WeapMaterialOrcish))	 PenetrationMin = 5	 PenetrationMax = 175	 ConcussionMin = 85	 ConcussionMax = 170	ElseIf ( akSource.HasKeyword(WeapMaterialDwarven))	 PenetrationMin = 15	 PenetrationMax = 210	 ConcussionMin = 100	 ConcussionMax = 200	ElseIf ( akSource.HasKeyword(WeapMaterialFalmer))	 PenetrationMin = 10	 PenetrationMax = 185	 ConcussionMin = 105	 ConcussionMax = 210	ElseIf ( akSource.HasKeyword(WeapMaterialFalmerHoned))	 PenetrationMin = 20	 PenetrationMax = 225	 ConcussionMin = 105	 ConcussionMax = 210	ElseIf ( akSource.HasKeyword(WeapMaterialElven))	 PenetrationMin = 5	 PenetrationMax = 180	 ConcussionMin = 80	 ConcussionMax = 160	ElseIf ( akSource.HasKeyword(WeapMaterialGlass))	 PenetrationMin = 10	 PenetrationMax = 200	 ConcussionMin = 95	 ConcussionMax = 185	ElseIf ( akSource.HasKeyword(WeapMaterialDraugr))	 PenetrationMin = 1	 PenetrationMax = 145	 ConcussionMin = 72	 ConcussionMax = 144	ElseIf ( akSource.HasKeyword(WeapMaterialDraugrHoned))	 PenetrationMin = 3	 PenetrationMax = 165	 ConcussionMin = 72	 ConcussionMax = 144	ElseIf ( akSource.HasKeyword(WeapMaterialEbony))	 PenetrationMin = 25	 PenetrationMax = 255	 ConcussionMin = 115	 ConcussionMax = 225	ElseIf ( akSource.HasKeyword(WeapMaterialDaedric))	 PenetrationMin = 35	 PenetrationMax = 285	 ConcussionMin = 130	 ConcussionMax = 255	ElseIf ( akSource.HasKeyword(WeapMaterialWood))	 PenetrationMin = 1	 PenetrationMax = 10	 ConcussionMin = 35	 ConcussionMax = 70	Else	 PenetrationMin = 0	 PenetrationMax = 0	 ConcussionMin = 0	 ConcussionMax = 0  	EndIf   Elseif ( akSource.HasKeyword(WeapTypeGreatsword))	if ( akSource.HasKeyword(WeapMaterialIron))	 PenetrationMin = 5	 PenetrationMax = 165	 ConcussionMin = 90	 ConcussionMax = 155	ElseIf ( akSource.HasKeyword(WeapMaterialSteel))	 PenetrationMin = 5	 PenetrationMax = 170	 ConcussionMin = 95	 ConcussionMax = 160	ElseIf ( akSource.HasKeyword(WeapMaterialImperial))	 PenetrationMin = 5	 PenetrationMax = 175	 ConcussionMin = 100	 ConcussionMax = 165	ElseIf ( akSource.HasKeyword(WeapMaterialSilver))	 PenetrationMin = 5	 PenetrationMax = 155	 ConcussionMin = 105	 ConcussionMax = 170  	ElseIf ( akSource.HasKeyword(WeapMaterialOrcish))	 PenetrationMin = 10	 PenetrationMax = 190	 ConcussionMin = 115	 ConcussionMax = 195	ElseIf ( akSource.HasKeyword(WeapMaterialDwarven))	 PenetrationMin = 20	 PenetrationMax = 225	 ConcussionMin = 130	 ConcussionMax = 230	ElseIf ( akSource.HasKeyword(WeapMaterialFalmer))	 PenetrationMin = 15	 PenetrationMax = 195	 ConcussionMin = 135	 ConcussionMax = 245	ElseIf ( akSource.HasKeyword(WeapMaterialFalmerHoned))	 PenetrationMin = 25	 PenetrationMax = 250	 ConcussionMin = 135	 ConcussionMax = 245	ElseIf ( akSource.HasKeyword(WeapMaterialElven))	 PenetrationMin = 10	 PenetrationMax = 195	 ConcussionMin = 110	 ConcussionMax = 180	ElseIf ( akSource.HasKeyword(WeapMaterialGlass))	 PenetrationMin = 15	 PenetrationMax = 215	 ConcussionMin = 120	 ConcussionMax = 205	ElseIf ( akSource.HasKeyword(WeapMaterialDraugr))	 PenetrationMin = 5	 PenetrationMax = 160	 ConcussionMin = 98	 ConcussionMax = 163	ElseIf ( akSource.HasKeyword(WeapMaterialDraugrHoned))	 PenetrationMin = 7	 PenetrationMax = 180	 ConcussionMin = 98	 ConcussionMax = 163	ElseIf ( akSource.HasKeyword(WeapMaterialEbony))	 PenetrationMin = 30	 PenetrationMax = 270	 ConcussionMin = 160	 ConcussionMax = 260	ElseIf ( akSource.HasKeyword(WeapMaterialDaedric))	 PenetrationMin = 40	 PenetrationMax = 300	 ConcussionMin = 180	 ConcussionMax = 280	ElseIf ( akSource.HasKeyword(WeapMaterialWood))	 PenetrationMin = 1	 PenetrationMax = 15	 ConcussionMin = 45	 ConcussionMax = 90	Else	 PenetrationMin = 0	 PenetrationMax = 0	 ConcussionMin = 0	 ConcussionMax = 0  	EndIf   Elseif ( akSource.HasKeyword(WeapTypeWarAxe))	if ( akSource.HasKeyword(WeapMaterialIron))	 PenetrationMin = 5	 PenetrationMax = 165	 ConcussionMin = 65	 ConcussionMax = 145	ElseIf ( akSource.HasKeyword(WeapMaterialSteel))	 PenetrationMin = 5	 PenetrationMax = 170	 ConcussionMin = 68	 ConcussionMax = 150	ElseIf ( akSource.HasKeyword(WeapMaterialImperial))	 PenetrationMin = 5	 PenetrationMax = 175	 ConcussionMin = 70	 ConcussionMax = 155	ElseIf ( akSource.HasKeyword(WeapMaterialSilver))	 PenetrationMin = 5	 PenetrationMax = 155	 ConcussionMin = 75	 ConcussionMax = 160  	ElseIf ( akSource.HasKeyword(WeapMaterialOrcish))	 PenetrationMin = 10	 PenetrationMax = 190	 ConcussionMin = 85	 ConcussionMax = 180	ElseIf ( akSource.HasKeyword(WeapMaterialDwarven))	 PenetrationMin = 20	 PenetrationMax = 225	 ConcussionMin = 95	 ConcussionMax = 200	ElseIf ( akSource.HasKeyword(WeapMaterialFalmer))	 PenetrationMin = 13	 PenetrationMax = 200	 ConcussionMin = 100	 ConcussionMax = 207	ElseIf ( akSource.HasKeyword(WeapMaterialFalmerHoned))	 PenetrationMin = 25	 PenetrationMax = 245	 ConcussionMin = 100	 ConcussionMax = 207	ElseIf ( akSource.HasKeyword(WeapMaterialElven))	 PenetrationMin = 10	 PenetrationMax = 195	 ConcussionMin = 80	 ConcussionMax = 170	ElseIf ( akSource.HasKeyword(WeapMaterialGlass))	 PenetrationMin = 15	 PenetrationMax = 215	 ConcussionMin = 90	 ConcussionMax = 190	ElseIf ( akSource.HasKeyword(WeapMaterialDraugr))	 PenetrationMin = 5	 PenetrationMax = 150	 ConcussionMin = 69	 ConcussionMax = 153	ElseIf ( akSource.HasKeyword(WeapMaterialDraugrHoned))	 PenetrationMin = 7	 PenetrationMax = 180	 ConcussionMin = 69	 ConcussionMax = 153	ElseIf ( akSource.HasKeyword(WeapMaterialEbony))	 PenetrationMin = 30	 PenetrationMax = 270	 ConcussionMin = 105	 ConcussionMax = 215	ElseIf ( akSource.HasKeyword(WeapMaterialDaedric))	 PenetrationMin = 40	 PenetrationMax = 300	 ConcussionMin = 115	 ConcussionMax = 240	ElseIf ( akSource.HasKeyword(WeapMaterialWood))	 PenetrationMin = 1	 PenetrationMax = 55	 ConcussionMin = 35	 ConcussionMax = 70	Else	 PenetrationMin = 0	 PenetrationMax = 0	 ConcussionMin = 0	 ConcussionMax = 0  	EndIf   Elseif ( akSource.HasKeyword(WeapTypeBattleaxe))	if ( akSource.HasKeyword(WeapMaterialIron))	 PenetrationMin = 108	 PenetrationMax = 215	 ConcussionMin = 93	 ConcussionMax = 175	ElseIf ( akSource.HasKeyword(WeapMaterialSteel))	 PenetrationMin = 110	 PenetrationMax = 220	 ConcussionMin = 95	 ConcussionMax = 180	ElseIf ( akSource.HasKeyword(WeapMaterialImperial))	 PenetrationMin = 113	 PenetrationMax = 225	 ConcussionMin = 98	 ConcussionMax = 185	ElseIf ( akSource.HasKeyword(WeapMaterialSilver))	 PenetrationMin = 105	 PenetrationMax = 210	 ConcussionMin = 100	 ConcussionMax = 190  	ElseIf ( akSource.HasKeyword(WeapMaterialOrcish))	 PenetrationMin = 125	 PenetrationMax = 250	 ConcussionMin = 110	 ConcussionMax = 220	ElseIf ( akSource.HasKeyword(WeapMaterialDwarven))	 PenetrationMin = 145	 PenetrationMax = 290	 ConcussionMin = 130	 ConcussionMax = 260	ElseIf ( akSource.HasKeyword(WeapMaterialFalmer))	 PenetrationMin = 128	 PenetrationMax = 255	 ConcussionMin = 135	 ConcussionMax = 270	ElseIf ( akSource.HasKeyword(WeapMaterialFalmerHoned))	 PenetrationMin = 150	 PenetrationMax = 270	 ConcussionMin = 135	 ConcussionMax = 270	ElseIf ( akSource.HasKeyword(WeapMaterialElven))	 PenetrationMin = 120	 PenetrationMax = 240	 ConcussionMin = 105	 ConcussionMax = 200	ElseIf ( akSource.HasKeyword(WeapMaterialGlass))	 PenetrationMin = 135	 PenetrationMax = 270	 ConcussionMin = 120	 ConcussionMax = 240	ElseIf ( akSource.HasKeyword(WeapMaterialDraugr))	 PenetrationMin = 107	 PenetrationMax = 213	 ConcussionMin = 97	 ConcussionMax = 183	ElseIf ( akSource.HasKeyword(WeapMaterialDraugrHoned))	 PenetrationMin = 118	 PenetrationMax = 235	 ConcussionMin = 97	 ConcussionMax = 183	ElseIf ( akSource.HasKeyword(WeapMaterialEbony))	 PenetrationMin = 155	 PenetrationMax = 310	 ConcussionMin = 140	 ConcussionMax = 280	ElseIf ( akSource.HasKeyword(WeapMaterialDaedric))	 PenetrationMin = 175	 PenetrationMax = 350	 ConcussionMin = 160	 ConcussionMax = 320	ElseIf ( akSource.HasKeyword(WeapMaterialWood))	 PenetrationMin = 0	 PenetrationMax = 0	 ConcussionMin = 40	 ConcussionMax = 80	Else	 PenetrationMin = 0	 PenetrationMax = 0	 ConcussionMin = 0	 ConcussionMax = 0  	EndIf   Elseif ( akSource.HasKeyword(WeapTypeMace))	if ( akSource.HasKeyword(WeapMaterialIron))	 PenetrationMin = 65	 PenetrationMax = 145	 ConcussionMin = 75	 ConcussionMax = 155	ElseIf ( akSource.HasKeyword(WeapMaterialSteel))	 PenetrationMin = 68	 PenetrationMax = 150	 ConcussionMin = 78	 ConcussionMax = 160	ElseIf ( akSource.HasKeyword(WeapMaterialImperial))	 PenetrationMin = 70	 PenetrationMax = 155	 ConcussionMin = 80	 ConcussionMax = 165	ElseIf ( akSource.HasKeyword(WeapMaterialSilver))	 PenetrationMin = 75	 PenetrationMax = 160	 ConcussionMin = 85	 ConcussionMax = 170  	ElseIf ( akSource.HasKeyword(WeapMaterialOrcish))	 PenetrationMin = 85	 PenetrationMax = 180	 ConcussionMin = 95	 ConcussionMax = 190	ElseIf ( akSource.HasKeyword(WeapMaterialDwarven))	 PenetrationMin = 95	 PenetrationMax = 200	 ConcussionMin = 105	 ConcussionMax = 210	ElseIf ( akSource.HasKeyword(WeapMaterialFalmer))	 PenetrationMin = 80	 PenetrationMax = 185	 ConcussionMin = 110	 ConcussionMax = 218	ElseIf ( akSource.HasKeyword(WeapMaterialFalmerHoned))	 PenetrationMin = 100	 PenetrationMax = 208	 ConcussionMin = 110	 ConcussionMax = 218	ElseIf ( akSource.HasKeyword(WeapMaterialElven))	 PenetrationMin = 80	 PenetrationMax = 170	 ConcussionMin = 90	 ConcussionMax = 180	ElseIf ( akSource.HasKeyword(WeapMaterialGlass))	 PenetrationMin = 90	 PenetrationMax = 190	 ConcussionMin = 100	 ConcussionMax = 200	ElseIf ( akSource.HasKeyword(WeapMaterialDraugr))	 PenetrationMin = 63	 PenetrationMax = 143	 ConcussionMin = 79	 ConcussionMax = 163	ElseIf ( akSource.HasKeyword(WeapMaterialDraugrHoned))	 PenetrationMin = 75	 PenetrationMax = 165	 ConcussionMin = 79	 ConcussionMax = 163	ElseIf ( akSource.HasKeyword(WeapMaterialEbony))	 PenetrationMin = 105	 PenetrationMax = 215	 ConcussionMin = 115	 ConcussionMax = 225	ElseIf ( akSource.HasKeyword(WeapMaterialDaedric))	 PenetrationMin = 115	 PenetrationMax = 240	 ConcussionMin = 125	 ConcussionMax = 250	ElseIf ( akSource.HasKeyword(WeapMaterialWood))	 PenetrationMin = 0	 PenetrationMax = 0	 ConcussionMin = 10	 ConcussionMax = 35	Else	 PenetrationMin = 0	 PenetrationMax = 0	 ConcussionMin = 0	 ConcussionMax = 0  	EndIf   Elseif ( akSource.HasKeyword(WeapTypeWarhammer))	if ( akSource.HasKeyword(WeapMaterialIron))	 PenetrationMin = 0	 PenetrationMax = 0	 ConcussionMin = 108	 ConcussionMax = 215	ElseIf ( akSource.HasKeyword(WeapMaterialSteel))	 PenetrationMin = 0	 PenetrationMax = 0	 ConcussionMin = 110	 ConcussionMax = 220	ElseIf ( akSource.HasKeyword(WeapMaterialImperial))	 PenetrationMin = 0	 PenetrationMax = 0	 ConcussionMin = 113	 ConcussionMax = 225	ElseIf ( akSource.HasKeyword(WeapMaterialSilver))	 PenetrationMin = 0	 PenetrationMax = 0	 ConcussionMin = 115	 ConcussionMax = 230  	ElseIf ( akSource.HasKeyword(WeapMaterialOrcish))	 PenetrationMin = 0	 PenetrationMax = 0	 ConcussionMin = 125	 ConcussionMax = 250	ElseIf ( akSource.HasKeyword(WeapMaterialDwarven))	 PenetrationMin = 0	 PenetrationMax = 0	 ConcussionMin = 145	 ConcussionMax = 290	ElseIf ( akSource.HasKeyword(WeapMaterialFalmer))	 PenetrationMin = 0	 PenetrationMax = 0	 ConcussionMin = 150	 ConcussionMax = 300	ElseIf ( akSource.HasKeyword(WeapMaterialFalmerHoned))	 PenetrationMin = 0	 PenetrationMax = 0	 ConcussionMin = 155	 ConcussionMax = 305	ElseIf ( akSource.HasKeyword(WeapMaterialElven))	 PenetrationMin = 0	 PenetrationMax = 0	 ConcussionMin = 120	 ConcussionMax = 240	ElseIf ( akSource.HasKeyword(WeapMaterialGlass))	 PenetrationMin = 0	 PenetrationMax = 0	 ConcussionMin = 135	 ConcussionMax = 270	ElseIf ( akSource.HasKeyword(WeapMaterialDraugr))	 PenetrationMin = 0	 PenetrationMax = 0	 ConcussionMin = 105	 ConcussionMax = 213	ElseIf ( akSource.HasKeyword(WeapMaterialDraugrHoned))	 PenetrationMin = 0	 PenetrationMax = 0	 ConcussionMin = 105	 ConcussionMax = 218	ElseIf ( akSource.HasKeyword(WeapMaterialEbony))	 PenetrationMin = 0	 PenetrationMax = 0	 ConcussionMin = 155	 ConcussionMax = 310	ElseIf ( akSource.HasKeyword(WeapMaterialDaedric))	 PenetrationMin = 0	 PenetrationMax = 0	 ConcussionMin = 175	 ConcussionMax = 350	ElseIf ( akSource.HasKeyword(WeapMaterialWood))	 PenetrationMin = 0	 PenetrationMax = 0	 ConcussionMin = 50	 ConcussionMax = 100	Else	 PenetrationMin = 0	 PenetrationMax = 0	 ConcussionMin = 0	 ConcussionMax = 0  	EndIf   EndIf  Elseif abPowerAttack == True   if ( akSource.HasKeyword(WeapTypeDagger))	if ( akSource.HasKeyword(WeapMaterialIron))	 PenetrationMin = 10	 PenetrationMax = 130	 ConcussionMin = 1	 ConcussionMax = 10	ElseIf ( akSource.HasKeyword(WeapMaterialSteel))	 PenetrationMin = 13	 PenetrationMax = 140	 ConcussionMin = 1	 ConcussionMax = 10	ElseIf ( akSource.HasKeyword(WeapMaterialImperial))	 PenetrationMin = 15	 PenetrationMax = 145	 ConcussionMin = 1	 ConcussionMax = 10	ElseIf ( akSource.HasKeyword(WeapMaterialSilver))	 PenetrationMin = 8	 PenetrationMax = 125	 ConcussionMin = 1	 ConcussionMax = 10  	ElseIf ( akSource.HasKeyword(WeapMaterialOrcish))	 PenetrationMin = 20	 PenetrationMax = 180	 ConcussionMin = 1	 ConcussionMax = 10	ElseIf ( akSource.HasKeyword(WeapMaterialDwarven))	 PenetrationMin = 25	 PenetrationMax = 200	 ConcussionMin = 1	 ConcussionMax = 17	ElseIf ( akSource.HasKeyword(WeapMaterialFalmer))	 PenetrationMin = 20	 PenetrationMax = 185	 ConcussionMin = 2	 ConcussionMax = 18	ElseIf ( akSource.HasKeyword(WeapMaterialFalmerHoned))	 PenetrationMin = 32	 PenetrationMax = 225	 ConcussionMin = 2	 ConcussionMax = 18	ElseIf ( akSource.HasKeyword(WeapMaterialElven))	 PenetrationMin = 22	 PenetrationMax = 190	 ConcussionMin = 1	 ConcussionMax = 10	ElseIf ( akSource.HasKeyword(WeapMaterialGlass))	 PenetrationMin = 24	 PenetrationMax = 230	 ConcussionMin = 1	 ConcussionMax = 15	ElseIf ( akSource.HasKeyword(WeapMaterialDraugr))	 PenetrationMin = 9	 PenetrationMax = 128	 ConcussionMin = 1	 ConcussionMax = 10	ElseIf ( akSource.HasKeyword(WeapMaterialDraugrHoned))	 PenetrationMin = 17	 PenetrationMax = 155	 ConcussionMin = 1	 ConcussionMax = 10	ElseIf ( akSource.HasKeyword(WeapMaterialEbony))	 PenetrationMin = 40	 PenetrationMax = 255	 ConcussionMin = 3	 ConcussionMax = 19	ElseIf ( akSource.HasKeyword(WeapMaterialDaedric))	 PenetrationMin = 75	 PenetrationMax = 300	 ConcussionMin = 4	 ConcussionMax = 20	ElseIf ( akSource.HasKeyword(WeapMaterialWood))	 PenetrationMin = 1	 PenetrationMax = 50	 ConcussionMin = 1	 ConcussionMax = 8	Else	 PenetrationMin = 0	 PenetrationMax = 0	 ConcussionMin = 0	 ConcussionMax = 0  	EndIf   Elseif ( akSource.HasKeyword(WeapTypeSword))	if ( akSource.HasKeyword(WeapMaterialIron))	 PenetrationMin = 15	 PenetrationMax = 135	 ConcussionMin = 1	 ConcussionMax = 20	ElseIf ( akSource.HasKeyword(WeapMaterialSteel))	 PenetrationMin = 18	 PenetrationMax = 145	 ConcussionMin = 1	 ConcussionMax = 20	ElseIf ( akSource.HasKeyword(WeapMaterialImperial))	 PenetrationMin = 20	 PenetrationMax = 150	 ConcussionMin = 1	 ConcussionMax = 20	ElseIf ( akSource.HasKeyword(WeapMaterialSilver))	 PenetrationMin = 13	 PenetrationMax = 130	 ConcussionMin = 1	 ConcussionMax = 20  	ElseIf ( akSource.HasKeyword(WeapMaterialOrcish))	 PenetrationMin = 25	 PenetrationMax = 185	 ConcussionMin = 1	 ConcussionMax = 22	ElseIf ( akSource.HasKeyword(WeapMaterialDwarven))	 PenetrationMin = 30	 PenetrationMax = 205	 ConcussionMin = 3	 ConcussionMax = 25	ElseIf ( akSource.HasKeyword(WeapMaterialFalmer))	 PenetrationMin = 27	 PenetrationMax = 190	 ConcussionMin = 4	 ConcussionMax = 27	ElseIf ( akSource.HasKeyword(WeapMaterialFalmerHoned))	 PenetrationMin = 48	 PenetrationMax = 235	 ConcussionMin = 4	 ConcussionMax = 27	ElseIf ( akSource.HasKeyword(WeapMaterialElven))	 PenetrationMin = 27	 PenetrationMax = 195	 ConcussionMin = 1	 ConcussionMax = 20	ElseIf ( akSource.HasKeyword(WeapMaterialGlass))	 PenetrationMin = 29	 PenetrationMax = 230	 ConcussionMin = 2	 ConcussionMax = 22	ElseIf ( akSource.HasKeyword(WeapMaterialDraugr))	 PenetrationMin = 14	 PenetrationMax = 133	 ConcussionMin = 1	 ConcussionMax = 20	ElseIf ( akSource.HasKeyword(WeapMaterialDraugrHoned))	 PenetrationMin = 22	 PenetrationMax = 160	 ConcussionMin = 1	 ConcussionMax = 20	ElseIf ( akSource.HasKeyword(WeapMaterialEbony))	 PenetrationMin = 45	 PenetrationMax = 255	 ConcussionMin = 5	 ConcussionMax = 30	ElseIf ( akSource.HasKeyword(WeapMaterialDaedric))	 PenetrationMin = 80	 PenetrationMax = 305	 ConcussionMin = 5	 ConcussionMax = 35	ElseIf ( akSource.HasKeyword(WeapMaterialWood))	 PenetrationMin = 0	 PenetrationMax = 50	 ConcussionMin = 1	 ConcussionMax = 15	Else	 PenetrationMin = 0	 PenetrationMax = 0	 ConcussionMin = 0	 ConcussionMax = 0  	EndIf   Elseif ( akSource.HasKeyword(WeapTypeGreatsword))	if ( akSource.HasKeyword(WeapMaterialIron))	 PenetrationMin = 20	 PenetrationMax = 140	 ConcussionMin = 2	 ConcussionMax = 25	ElseIf ( akSource.HasKeyword(WeapMaterialSteel))	 PenetrationMin = 23	 PenetrationMax = 150	 ConcussionMin = 2	 ConcussionMax = 25	ElseIf ( akSource.HasKeyword(WeapMaterialImperial))	 PenetrationMin = 25	 PenetrationMax = 155	 ConcussionMin = 2	 ConcussionMax = 25	ElseIf ( akSource.HasKeyword(WeapMaterialSilver))	 PenetrationMin = 18	 PenetrationMax = 135	 ConcussionMin = 2	 ConcussionMax = 25  	ElseIf ( akSource.HasKeyword(WeapMaterialOrcish))	 PenetrationMin = 30	 PenetrationMax = 190	 ConcussionMin = 3	 ConcussionMax = 27	ElseIf ( akSource.HasKeyword(WeapMaterialDwarven))	 PenetrationMin = 35	 PenetrationMax = 210	 ConcussionMin = 5	 ConcussionMax = 35	ElseIf ( akSource.HasKeyword(WeapMaterialFalmer))	 PenetrationMin = 32	 PenetrationMax = 195	 ConcussionMin = 6	 ConcussionMax = 37	ElseIf ( akSource.HasKeyword(WeapMaterialFalmerHoned))	 PenetrationMin = 43	 PenetrationMax = 240	 ConcussionMin = 6	 ConcussionMax = 37	ElseIf ( akSource.HasKeyword(WeapMaterialElven))	 PenetrationMin = 32	 PenetrationMax = 200	 ConcussionMin = 2	 ConcussionMax = 25	ElseIf ( akSource.HasKeyword(WeapMaterialGlass))	 PenetrationMin = 34	 PenetrationMax = 235	 ConcussionMin = 4	 ConcussionMax = 30	ElseIf ( akSource.HasKeyword(WeapMaterialDraugr))	 PenetrationMin = 19	 PenetrationMax = 138	 ConcussionMin = 2	 ConcussionMax = 25	ElseIf ( akSource.HasKeyword(WeapMaterialDraugrHoned))	 PenetrationMin = 27	 PenetrationMax = 165	 ConcussionMin = 2	 ConcussionMax = 25	ElseIf ( akSource.HasKeyword(WeapMaterialEbony))	 PenetrationMin = 50	 PenetrationMax = 260	 ConcussionMin = 6	 ConcussionMax = 40	ElseIf ( akSource.HasKeyword(WeapMaterialDaedric))	 PenetrationMin = 85	 PenetrationMax = 310	 ConcussionMin = 7	 ConcussionMax = 45	ElseIf ( akSource.HasKeyword(WeapMaterialWood))	 PenetrationMin = 1	 PenetrationMax = 50	 ConcussionMin = 2	 ConcussionMax = 20	Else	 PenetrationMin = 0	 PenetrationMax = 0	 ConcussionMin = 0	 ConcussionMax = 0  	EndIf   Elseif ( akSource.HasKeyword(WeapTypeWarAxe))	if ( akSource.HasKeyword(WeapMaterialIron))	 PenetrationMin = 90	 PenetrationMax = 180	 ConcussionMin = 80	 ConcussionMax = 170	ElseIf ( akSource.HasKeyword(WeapMaterialSteel))	 PenetrationMin = 93	 PenetrationMax = 185	 ConcussionMin = 83	 ConcussionMax = 175	ElseIf ( akSource.HasKeyword(WeapMaterialImperial))	 PenetrationMin = 95	 PenetrationMax = 190	 ConcussionMin = 85	 ConcussionMax = 180	ElseIf ( akSource.HasKeyword(WeapMaterialSilver))	 PenetrationMin = 87	 PenetrationMax = 175	 ConcussionMin = 90	 ConcussionMax = 185  	ElseIf ( akSource.HasKeyword(WeapMaterialOrcish))	 PenetrationMin = 110	 PenetrationMax = 215	 ConcussionMin = 100	 ConcussionMax = 205	ElseIf ( akSource.HasKeyword(WeapMaterialDwarven))	 PenetrationMin = 120	 PenetrationMax = 235	 ConcussionMin = 110	 ConcussionMax = 225	ElseIf ( akSource.HasKeyword(WeapMaterialFalmer))	 PenetrationMin = 112	 PenetrationMax = 220	 ConcussionMin = 115	 ConcussionMax = 233	ElseIf ( akSource.HasKeyword(WeapMaterialFalmerHoned))	 PenetrationMin = 125	 PenetrationMax = 242	 ConcussionMin = 115	 ConcussionMax = 233	ElseIf ( akSource.HasKeyword(WeapMaterialElven))	 PenetrationMin = 105	 PenetrationMax = 205	 ConcussionMin = 95	 ConcussionMax = 195	ElseIf ( akSource.HasKeyword(WeapMaterialGlass))	 PenetrationMin = 115	 PenetrationMax = 225	 ConcussionMin = 105	 ConcussionMax = 215	ElseIf ( akSource.HasKeyword(WeapMaterialDraugr))	 PenetrationMin = 89	 PenetrationMax = 178	 ConcussionMin = 84	 ConcussionMax = 178	ElseIf ( akSource.HasKeyword(WeapMaterialDraugrHoned))	 PenetrationMin = 100	 PenetrationMax = 200	 ConcussionMin = 84	 ConcussionMax = 178	ElseIf ( akSource.HasKeyword(WeapMaterialEbony))	 PenetrationMin = 130	 PenetrationMax = 250	 ConcussionMin = 120	 ConcussionMax = 240	ElseIf ( akSource.HasKeyword(WeapMaterialDaedric))	 PenetrationMin = 140	 PenetrationMax = 275	 ConcussionMin = 130	 ConcussionMax = 265	ElseIf ( akSource.HasKeyword(WeapMaterialWood))	 PenetrationMin = 5	 PenetrationMax = 75	 ConcussionMin = 40	 ConcussionMax = 90	Else	 PenetrationMin = 0	 PenetrationMax = 0	 ConcussionMin = 0	 ConcussionMax = 0  	EndIf   Elseif ( akSource.HasKeyword(WeapTypeBattleaxe))	if ( akSource.HasKeyword(WeapMaterialIron))	 PenetrationMin = 133	 PenetrationMax = 265	 ConcussionMin = 113	 ConcussionMax = 215	ElseIf ( akSource.HasKeyword(WeapMaterialSteel))	 PenetrationMin = 135	 PenetrationMax = 270	 ConcussionMin = 115	 ConcussionMax = 220	ElseIf ( akSource.HasKeyword(WeapMaterialImperial))	 PenetrationMin = 138	 PenetrationMax = 275	 ConcussionMin = 118	 ConcussionMax = 225	ElseIf ( akSource.HasKeyword(WeapMaterialSilver))	 PenetrationMin = 130	 PenetrationMax = 260	 ConcussionMin = 120	 ConcussionMax = 230  	ElseIf ( akSource.HasKeyword(WeapMaterialOrcish))	 PenetrationMin = 150	 PenetrationMax = 300	 ConcussionMin = 130	 ConcussionMax = 260	ElseIf ( akSource.HasKeyword(WeapMaterialDwarven))	 PenetrationMin = 170	 PenetrationMax = 340	 ConcussionMin = 150	 ConcussionMax = 300	ElseIf ( akSource.HasKeyword(WeapMaterialFalmer))	 PenetrationMin = 155	 PenetrationMax = 310	 ConcussionMin = 155	 ConcussionMax = 310	ElseIf ( akSource.HasKeyword(WeapMaterialFalmerHoned))	 PenetrationMin = 175	 PenetrationMax = 350	 ConcussionMin = 155	 ConcussionMax = 310	ElseIf ( akSource.HasKeyword(WeapMaterialElven))	 PenetrationMin = 145	 PenetrationMax = 290	 ConcussionMin = 125	 ConcussionMax = 240	ElseIf ( akSource.HasKeyword(WeapMaterialGlass))	 PenetrationMin = 160	 PenetrationMax = 320	 ConcussionMin = 140	 ConcussionMax = 280	ElseIf ( akSource.HasKeyword(WeapMaterialDraugr))	 PenetrationMin = 132	 PenetrationMax = 163	 ConcussionMin = 117	 ConcussionMax = 123	ElseIf ( akSource.HasKeyword(WeapMaterialDraugrHoned))	 PenetrationMin = 142	 PenetrationMax = 185	 ConcussionMin = 117	 ConcussionMax = 123	ElseIf ( akSource.HasKeyword(WeapMaterialEbony))	 PenetrationMin = 180	 PenetrationMax = 360	 ConcussionMin = 160	 ConcussionMax = 320	ElseIf ( akSource.HasKeyword(WeapMaterialDaedric))	 PenetrationMin = 200	 PenetrationMax = 400	 ConcussionMin = 180	 ConcussionMax = 360	ElseIf ( akSource.HasKeyword(WeapMaterialWood))	 PenetrationMin = 10	 PenetrationMax = 90	 ConcussionMin = 55	 ConcussionMax = 110	Else	 PenetrationMin = 0	 PenetrationMax = 0	 ConcussionMin = 0	 ConcussionMax = 0  	EndIf   Elseif ( akSource.HasKeyword(WeapTypeMace))	if ( akSource.HasKeyword(WeapMaterialIron))	 PenetrationMin = 80	 PenetrationMax = 170	 ConcussionMin = 90	 ConcussionMax = 180	ElseIf ( akSource.HasKeyword(WeapMaterialSteel))	 PenetrationMin = 83	 PenetrationMax = 175	 ConcussionMin = 93	 ConcussionMax = 185	ElseIf ( akSource.HasKeyword(WeapMaterialImperial))	 PenetrationMin = 85	 PenetrationMax = 180	 ConcussionMin = 95	 ConcussionMax = 190	ElseIf ( akSource.HasKeyword(WeapMaterialSilver))	 PenetrationMin = 90	 PenetrationMax = 185	 ConcussionMin = 100	 ConcussionMax = 195  	ElseIf ( akSource.HasKeyword(WeapMaterialOrcish))	 PenetrationMin = 100	 PenetrationMax = 205	 ConcussionMin = 110	 ConcussionMax = 215	ElseIf ( akSource.HasKeyword(WeapMaterialDwarven))	 PenetrationMin = 110	 PenetrationMax = 225	 ConcussionMin = 120	 ConcussionMax = 235	ElseIf ( akSource.HasKeyword(WeapMaterialFalmer))	 PenetrationMin = 102	 PenetrationMax = 210	 ConcussionMin = 125	 ConcussionMax = 242	ElseIf ( akSource.HasKeyword(WeapMaterialFalmerHoned))	 PenetrationMin = 115	 PenetrationMax = 232	 ConcussionMin = 125	 ConcussionMax = 242	ElseIf ( akSource.HasKeyword(WeapMaterialElven))	 PenetrationMin = 95	 PenetrationMax = 195	 ConcussionMin = 105	 ConcussionMax = 205	ElseIf ( akSource.HasKeyword(WeapMaterialGlass))	 PenetrationMin = 105	 PenetrationMax = 215	 ConcussionMin = 115	 ConcussionMax = 225	ElseIf ( akSource.HasKeyword(WeapMaterialDraugr))	 PenetrationMin = 68	 PenetrationMax = 168	 ConcussionMin = 94	 ConcussionMax = 188	ElseIf ( akSource.HasKeyword(WeapMaterialDraugrHoned))	 PenetrationMin = 90	 PenetrationMax = 185	 ConcussionMin = 94	 ConcussionMax = 188	ElseIf ( akSource.HasKeyword(WeapMaterialEbony))	 PenetrationMin = 120	 PenetrationMax = 240	 ConcussionMin = 130	 ConcussionMax = 250	ElseIf ( akSource.HasKeyword(WeapMaterialDaedric))	 PenetrationMin = 130	 PenetrationMax = 265	 ConcussionMin = 140	 ConcussionMax = 275	ElseIf ( akSource.HasKeyword(WeapMaterialWood))	 PenetrationMin = 1	 PenetrationMax = 55	 ConcussionMin = 50	 ConcussionMax = 100	Else	 PenetrationMin = 0	 PenetrationMax = 0	 ConcussionMin = 0	 ConcussionMax = 0  	EndIf   Elseif ( akSource.HasKeyword(WeapTypeWarhammer))	if ( akSource.HasKeyword(WeapMaterialIron))	 PenetrationMin = 0	 PenetrationMax = 0	 ConcussionMin = 133	 ConcussionMax = 265	ElseIf ( akSource.HasKeyword(WeapMaterialSteel))	 PenetrationMin = 0	 PenetrationMax = 0	 ConcussionMin = 135	 ConcussionMax = 270	ElseIf ( akSource.HasKeyword(WeapMaterialImperial))	 PenetrationMin = 0	 PenetrationMax = 0	 ConcussionMin = 138	 ConcussionMax = 275	ElseIf ( akSource.HasKeyword(WeapMaterialSilver))	 PenetrationMin = 0	 PenetrationMax = 0	 ConcussionMin = 140	 ConcussionMax = 280  	ElseIf ( akSource.HasKeyword(WeapMaterialOrcish))	 PenetrationMin = 0	 PenetrationMax = 0	 ConcussionMin = 150	 ConcussionMax = 300	ElseIf ( akSource.HasKeyword(WeapMaterialDwarven))	 PenetrationMin = 0	 PenetrationMax = 0	 ConcussionMin = 170	 ConcussionMax = 340	ElseIf ( akSource.HasKeyword(WeapMaterialFalmer))	 PenetrationMin = 0	 PenetrationMax = 0	 ConcussionMin = 175	 ConcussionMax = 350	ElseIf ( akSource.HasKeyword(WeapMaterialFalmerHoned))	 PenetrationMin = 0	 PenetrationMax = 0	 ConcussionMin = 175	 ConcussionMax = 355	ElseIf ( akSource.HasKeyword(WeapMaterialElven))	 PenetrationMin = 0	 PenetrationMax = 0	 ConcussionMin = 145	 ConcussionMax = 290	ElseIf ( akSource.HasKeyword(WeapMaterialGlass))	 PenetrationMin = 0	 PenetrationMax = 0	 ConcussionMin = 160	 ConcussionMax = 320	ElseIf ( akSource.HasKeyword(WeapMaterialDraugr))	 PenetrationMin = 0	 PenetrationMax = 0	 ConcussionMin = 136	 ConcussionMax = 273	ElseIf ( akSource.HasKeyword(WeapMaterialDraugrHoned))	 PenetrationMin = 0	 PenetrationMax = 0	 ConcussionMin = 136	 ConcussionMax = 278	ElseIf ( akSource.HasKeyword(WeapMaterialEbony))	 PenetrationMin = 0	 PenetrationMax = 0	 ConcussionMin = 180	 ConcussionMax = 360	ElseIf ( akSource.HasKeyword(WeapMaterialDaedric))	 PenetrationMin = 0	 PenetrationMax = 0	 ConcussionMin = 200	 ConcussionMax = 400	ElseIf ( akSource.HasKeyword(WeapMaterialWood))	 PenetrationMin = 0	 PenetrationMax = 0	 ConcussionMin = 75	 ConcussionMax = 150	Else	 PenetrationMin = 0	 PenetrationMax = 0	 ConcussionMin = 0	 ConcussionMax = 0  	EndIf     EndIf  EndIf  PenetrationRoll = 0  CutRoll = 0  ConcussionRoll = 0  PenetrationRoll = utility.RandomInt( PenetrationMin , PenetrationMax )  CutRoll = utility.RandomInt( CutMin , CutMax )  ConcussionRoll = utility.RandomInt( ConcussionMin , ConcussionMax )  PenetrationSuccess = 0  CutSuccess = 0  ConcussionSuccess = 0  If abHitBlocked == False   If ( akSource.HasKeyword(WeapTypeBow))	if PenetrationRoll > ( ResistPenetration * 1.2 )	 PenetrationSuccess = 1	ElseIf  PenetrationRoll > ResistPenetration	 PenetrationSuccess = 2  	Else	 PenetrationSuccess = 0	EndIf     ElseIf PenetrationRoll > ResistPenetration	; ResistConcussion = 0	ResistCut = 0	PenetrationSuccess = 1   Else	PenetrationSuccess = 0   EndIf   if CutRoll > ResistCut	; ResistConcussion = 0	CutSuccess = 1   Else	CutSuccess = 0   EndIf   if ConcussionRoll > ( ResistConcussion * 3 )	ConcussionSuccess = 1   ElseIf  ConcussionRoll > ( ResistConcussion * 2.5 )	ConcussionSuccess = 2   ElseIf  ConcussionRoll > ( ResistConcussion * 2 )	ConcussionSuccess = 3   ElseIf  ConcussionRoll > ( ResistConcussion * 1.5 )	ConcussionSuccess = 4   ElseIf  ConcussionRoll > ResistConcussion	ConcussionSuccess = 5     Else	ConcussionSuccess = 0   EndIf  Else   if ConcussionRoll > ResistConcussion	; Stagger   Endif  EndIf  if abPowerAttack == False   If ( akSource.HasKeyword(WeapTypeBow))	If PenetrationSuccess == 1	 ;SAWDStagger2.cast(Target , Target)	 SAWDKneel.cast(Target , akAggressor)	 ;SAWDBleedModerate.cast(Target , Target)	ElseIf PenetrationSuccess == 2	 ;SAWDStagger.cast(Target , Target)	 ;SAWDBleedLight.cast(Target , Target)		EndIf   ElseIf PenetrationSuccess == 1	SAWDKneel.cast(Target , (akSource as ObjectReference))	;SAWDKneel.cast(Target , Target)	;SAWDStagger.cast(Target , Target)	;SAWDBleedHeavy.cast(Target , Target)	;SAWDBleedModerate.cast(Target , Target)	;SAWDBleedLight.cast(Target , Target)   Endif   if Cutsuccess == 1	;SAWDKneel.cast(Target , Target)	;SAWDStagger.cast(Target , Target)	;SAWDBleedHeavy.cast(Target , Target)	;SAWDBleedModerate.cast(Target , Target)	;SAWDBleedLight.cast(Target , Target)   EndIf   if ConcussionSuccess == 1	; Target.kill(Target)   ElseIf ConcussionSuccess == 2	; Target.PushActorAway(Target, 0)	;SAWDDamageHeavy.cast(Target , Target)	;SAWDBleedHeavy.cast(Target , Target)	;SAWDBleedModerate.cast(Target , Target)	;SAWDBleedLight.cast(Target , Target)     ElseIf ConcussionSuccess == 3	;SAWDKneel.cast(Target , Target)	;SAWDDamageModerate.cast(Target , Target)	;SAWDBleedModerate.cast(Target , Target)	;SAWDBleedLight.cast(Target , Target)     ElseIf ConcussionSuccess == 4	;SAWDStagger.cast(Target , Target)	;SAWDDamageLight.cast(Target , Target)	;SAWDBleedLight.cast(Target , Target)  	; Light Damage   ElseIf ConcussionSuccess == 5	;SAWDStagger.cast(Target , Target)	; Stagger Only   EndIf  ElseIf abPowerAttack == True   if ( akSource.HasKeyword(WeapTypeDagger) || akSource.HasKeyword(WeapTypeSword) || akSource.HasKeyword(WeapTypeGreatsword))	if PenetrationSuccess == 1	 ;SAWDDamageLight.cast(Target , Target)	 ;SAWDBleedModerate.cast(Target , Target)	 ;SAWDBleedLight.cast(Target , Target)	EndIf   ElseIf ( akSource.HasKeyword(WeapTypeWarAxe) || akSource.HasKeyword(WeapTypeBattleaxe))	if PenetrationSuccess == 1	 ;SAWDDamageHeavy.cast(Target , Target)	 ;SAWDBleedHeavy.cast(Target , Target)	EndIf   Else	if PenetrationSuccess == 1	 ;SAWDDamageHeavy.cast(Target , Target)	 ;SAWDDamageModerate.cast(Target , Target)	 ;SAWDBleedModerate.cast(Target , Target)	EndIf   EndIf   if ConcussionSuccess == 1	; Target.kill(Target)   ElseIf ConcussionSuccess == 2	; Target.PushActorAway(Target, 0)	;SAWDDamageHeavy.cast(Target , Target)	;SAWDBleedHeavy.cast(Target , Target)	;SAWDBleedModerate.cast(Target , Target)	;SAWDBleedLight.cast(Target , Target)     ElseIf ConcussionSuccess == 3	;SAWDKneel.cast(Target , Target)	;SAWDDamageModerate.cast(Target , Target)	;SAWDBleedModerate.cast(Target , Target)	;SAWDBleedLight.cast(Target , Target)     ElseIf ConcussionSuccess == 4	;SAWDStagger.cast(Target , Target)	;SAWDDamageLight.cast(Target , Target)	;SAWDBleedLight.cast(Target , Target)  	; Light Damage   ElseIf ConcussionSuccess == 5	;SAWDStagger.cast(Target , Target)	; Stagger Only   EndIf  EndIf  ; Debug.MessageBox(" Target " + Target )  ; Debug.MessageBox(" PenetrationSuccess " + PenetrationSuccess + " Cutsuccess " + Cutsuccess + " ConcussionSuccess " + ConcussionSuccess )  ; Debug.MessageBox(" PowerAttack " + abPowerAttack + " ResistPenetration " + ResistPenetration + " PenetrationMin " + PenetrationMin + " PenetrationMax " + PenetrationMax + " PenetrationRoll " + PenetrationRoll + " ResistCut " + ResistCut + " CutMin " + CutMin + " CutMax " + CutMax + " CutRoll " + CutRoll + " ResistConcussion " + ResistConcussion + " ConcussionMin " + ConcussionMin + " ConcussionMax " + ConcussionMax + " ConcussionRoll " + ConcussionRoll )  EndifEndEvent
User avatar
Bitter End
 
Posts: 3418
Joined: Fri Sep 08, 2006 11:40 am

Post » Tue Jun 19, 2012 4:51 pm

To begin with...Can you embed the code inside spoiler tags, so people don't have to scroll down forever?

I don't think papyrus was thought to have scripts as large, so the number of lines could matter.

Apart from that.


In akSource.HasKeyword(WeapTypeBow) you seem to be checking the same material conditions twice, so I guess you could merge them. Maybe you wanted to check bow material and arrows material, but even when I have no idea which one you are checking there, it looks the same

How do you get all those values? is there any kind of formula? Would it be possible to create a formula that assigns a value to each weapon type, to each material and to power attack boolean and returns a number for each damage type instead of a different value for each combination?

Also you initialize variables to 0 a few times but I doubt that matters too much.
User avatar
Chris Duncan
 
Posts: 3471
Joined: Sun Jun 24, 2007 2:31 am

Post » Tue Jun 19, 2012 8:14 am

Basically, if your script is very "heavy", then instead of slowing down the game as it may have done in previous games, it's more likely to slow down other scripts.
I'm not so sure about that. I can't remember where I've seen it, but there was a post somewhere from a dev that suggested that a "heavy" script would only slow itself down. It was something along the lines of a script getting a "timeslice" in which to run (as in a multi-tasking OS) and if it couldn't run within that then it would have to wait for another. Which would mean that a "heavy" script would only take away from every other script as much as any other script could. ie ... More scripts running means less time for each, but a single script can't have more than it's fair share of time.

Don't take that as gospel though.
User avatar
Max Van Morrison
 
Posts: 3503
Joined: Sat Jul 07, 2007 4:48 pm

Post » Tue Jun 19, 2012 1:44 pm

By the way, I originally had the following if statement inside the "OnEffectStart" event...
If ( Target.WornHasKeyword(ArmorCuirass))

It seemed to work well like that, however when I changed armor in the middle of a fight, I don't believe it updated my new resistances. That's why I moved it into the "OnHit" event. I'm trying to think if it would be faster and if there's a way to put it into another event or script that I could just call.


To begin with...Can you embed the code inside spoiler tags, so people don't have to scroll down forever?

Done... sorry :-P


In akSource.HasKeyword(WeapTypeBow) you seem to be checking the same material conditions twice, so I guess you could merge them. Maybe you wanted to check bow material and arrows material, but even when I have no idea which one you are checking there, it looks the same

Oops!!! Thank you! Hahaha! I meant to check "akProjectile" on the second part. *Embarrassed*



How do you get all those values? is there any kind of formula? Would it be possible to create a formula that assigns a value to each weapon type, to each material and to power attack boolean and returns a number for each damage type instead of a different value for each combination?

Yes, I was thinking about that. This is actually the fourth way I've tried to implement this concept. The first was with enchantments/conditions. The second was with perks/conditions. The third was with a script, but I was using my own keywords. I decided to use a script and already present keywords.

All of the values are hand-placed (which too much time), and based on what I thought may be accurate. I had thought of using a formula to get the values, but I was already halfway through adding them, so I decided to finish just to get something usable. I may still try a formula once I get the rest of the script finished. I'm always open to suggestions! :-D


Also you initialize variables to 0 a few times but I doubt that matters too much.

Yes, some odd things were happening before I did that. I'm not quite sure why. I don't know if the variables kept they're value after the script finished... especially if there were two simultaneous strikes... I suppose the script ran twice at the same time, and may have caused issues. But I have no clue how the game actually handles that.

Thank you for the assistance! :-D
User avatar
Mashystar
 
Posts: 3460
Joined: Mon Jul 16, 2007 6:35 am

Post » Tue Jun 19, 2012 12:30 pm

you should really be using an array or some type of list to get rid of that mountain of if statements. Done correctly you could cut that script to about 1/10th the size.
User avatar
Luis Reyma
 
Posts: 3361
Joined: Fri Nov 02, 2007 11:10 am

Post » Tue Jun 19, 2012 8:59 am

Ah, I found the post I (and Rocket, I think) was talking about:
Papyrus is threaded, and so it only gets as much processor time as it gets - if you have update loops faster than they can be processed, you can bog down all scripts in the whole game.

Cipscis
User avatar
Emma
 
Posts: 3287
Joined: Mon Aug 28, 2006 12:51 am

Post » Tue Jun 19, 2012 2:21 pm

Kageseigi you should take a look into using Form Lists, it can simplify what your doing instead of having to rewrite conditionals like that
User avatar
yermom
 
Posts: 3323
Joined: Mon Oct 15, 2007 12:56 pm

Post » Tue Jun 19, 2012 2:11 pm

Kageseigi you should take a look into using Form Lists, it can simplify what your doing instead of having to rewrite conditionals like that
I do love Form Lists, but I cannot think how to use them to do what Kageseigi wants. How would you use them if every case should be different?

Ah, I found the post I (and Rocket, I think) was talking about:

That's...scary lol

Cipscis
User avatar
marina
 
Posts: 3401
Joined: Tue Mar 13, 2007 10:02 pm

Post » Tue Jun 19, 2012 1:29 pm

Thank you all for the input.

If I may ask, may I get a link to a page about Form Lists?

One thing I would like to consider is keeping the script open to new additions. Weapons of the Third Era and Real Swords for example... I would like to be able to add keywords that they may use into my script. Is there a way to do that with form lists or arrays?

What is the most efficient way to detect what the target is being hit by, then assign/call a value for it?
Would an array speed up the execution, or would it simply reduce the size of the script?

Again, on my PC (which is dated), the script seems to take half a second or so before an effect takes place (kill an actor, message box appears, etc.).
User avatar
Jeneene Hunte
 
Posts: 3478
Joined: Mon Sep 11, 2006 3:18 pm

Post » Tue Jun 19, 2012 3:46 pm

It's probably unnecessary to interrogate the armor values on every hit. I'd consider moving that code to OnEffectStart or a separate function that had a runOnce flag.

I don't know if it makes much difference timewise, but if the values are not needed externally then don't use properties, but instead use script-scope variables.
User avatar
neen
 
Posts: 3517
Joined: Sun Nov 26, 2006 1:19 pm

Post » Tue Jun 19, 2012 7:42 pm

It's probably unnecessary to interrogate the armor values on every hit. I'd consider moving that code to OnEffectStart or a separate function that had a runOnce flag.

Yeah, I had the armor values in the OnEffectStart event at first. That works for everyone save for the player and followers, it seems. Well, it works, it just doesn't seem to update when equipping/unequipping armor. Is there a way to move that to another script and have it update when needed... then use this script to get the value from it?


I don't know if it makes much difference timewise, but if the values are not needed externally then don't use properties, but instead use script-scope variables.

Ah, please explain. Do you mean the keyword properties? I couldn't get the script to work until I filled the properties. Is there a way to get the script to recognize the keywords without using properties?
User avatar
Taylah Haines
 
Posts: 3439
Joined: Tue Feb 13, 2007 3:10 am

Post » Tue Jun 19, 2012 2:47 pm

Yes, you can use Arrays and Formlists.(and would probably like it better)

The wiki has a section on arrays that gives a few good examples. http://www.creationkit.com/Arrays_%28Papyrus%29

combined with FormList's you can do something like this

Spoiler


FormList Property KeywordFormList Autoint[] Property RPVal Auto  ; --- fill thesse arrays with theint[] Property RCVal Auto  ; --- right values in the scriptint[] Property RCCVal Auto ; --- properties (editor)Event OnHit(ObjectReference akAggressor, Form akSource, Projectile akProjectile, bool abPowerAttack, bool abSneakAttack, bool abBashAttack, bool abHitBlocked)int ResistPenetration = 0int ResistCut = 0int ResistConcussion = 0int FlCount = 0while (FlCount < KeywordFormList.GetSize())  if Target.WornHasKeyword( KeywordFormList.GetAt(FlCount) )   ResistPenetration = RPVal[FlCount]   ResistCut = RCVal[FlCount]   ResistConcussion = RCCVal[FlCount]   endIf  FlCount += 1endWhileendEvent


Smaller Code... and as you suggested, it should make it easier to add keywords later.

Though done with a loop, it would essentially be just as many "IF" statements executed, so it may not perform faster. Although, without the "ElseIf" it may improve performance. (but maybe not)
User avatar
Katy Hogben
 
Posts: 3457
Joined: Mon Oct 30, 2006 12:20 am

Post » Tue Jun 19, 2012 10:16 am


Sorry, that post looked rude for ignoring your last post. Having to tend to a toddler here atm. High chance of this reply will have been ninja'd too.

If you are doing the same thing for certain types of armour, then yeah having them all in the same array property would make sense.

re: updating the armour values on change... no idea.

Sorry, no I didn't mean the keyword properties. The only property that you had originally that could possible be a script-var, was Target.
But if you're going to be creating separate functions then a few more of the event-scope vars would need to go script-scope.
As I said... not sure if properties add much (if any) load.

OT: Not about effeciency, but about the order of the armour checks...
It's a shame Beth didn't supply 'where' the hit struck so you could find the appropriate armour on that part of the body.
I'd think it would be better to take the values of the weakest armour worn. Assuming that is where a smart opponent would target first.

Edit: had to remove the html formatting. My post looked like it was hijacked by MS Frontpage :/
User avatar
Ludivine Poussineau
 
Posts: 3353
Joined: Fri Mar 30, 2007 2:49 pm

Post » Tue Jun 19, 2012 6:01 am

The wiki has a section on arrays that gives a few good examples. http://www.creationkit.com/Arrays_%28Papyrus%29

combined with FormList's you can do something like this

Thank you for those :-)

Having to tend to a toddler here atm.

Haha, toddlers can be fun! Good luck ;-)


OT: Not about effeciency, but about the order of the armour checks...
It's a shame Beth didn't supply 'where' the hit struck so you could find the appropriate armour on that part of the body.
I'd think it would be better to take the values of the weakest armour worn. Assuming that is where a smart opponent would target first.

Hahaha, tell me about it! What confuses me is that the locational properties seem to still exist from Fallout. I wish Bethesda hadn't disabled them.

I am hoping for someone else to implement locational damage soon, though. I'm actually hoping to take this script's concept and rig it around their implementation if possible.

Yes, that is another issue with how I've got this script working. I don't know how to find the keyword for a specific piece of armor that the actor with the script is wearing. I wanted to base it on the cuirass, so that's why I put the check in the code. All it does, though, is make sure the actor is wearing one. It's better than nothing, I suppose. But from what I can tell, an actor can be wearing a Fur cuirass and Daedric gloves, and my script will give them the defense rating of Daedric. I listed If statement to catch the highest rated material first, because I prefer the actor to be given a bonus in that case instead of wearing a Daedric cuirass with Fur gloves and getting the Fur rating.

I do suppose there are ways to tell what any given actor is wearing (by outfit or so) beforehand other than the player and followers. But as you can tell, my script is already quite large and bogging down that I'm just trying to get it working decently before adding even more to it. And yes, there is a LOT more, haha! I have to include checks and keywords for creatures also. Silver has weak ratings, but it needs to be effective against magical/undead creatures. Giants need to be VERY powerful. Dragons need high resistances. And I haven't even touched magic yet.

I'll actually probably end up creating separate scripts for creatures, but it should be along the same design.
User avatar
Christine Pane
 
Posts: 3306
Joined: Mon Apr 23, 2007 2:14 am


Return to V - Skyrim