Jump to content

Wabbajack Anatomy 101


hidconsp

Recommended Posts

So I've went through lists of wabbajack effects in here, and here.

What I found is that they are somewhat disorganized, and some effects seems to be caused by glitches. (Like "DOES NOTHING")

So I opened the script used to the wabbajack to see what is actually going on.

 

 

Scriptname DA15WabbajackEffectSCRIPT extends ActiveMagicEffect  

; the gold
MISCOBJECT PROPERTY gold AUTO

; the sweet roll
POTION PROPERTY sweetRoll AUTO
MISCOBJECT PROPERTY plate AUTO

; the heal spell
SPELL PROPERTY healSpell AUTO

; invisibilty spell
SPELL PROPERTY invis AUTO

; the fire/frost/storm spell
EXPLOSION PROPERTY fireSpell AUTO
EXPLOSION PROPERTY frostSpell AUTO
EXPLOSION PROPERTY stormSpell AUTO

; a skeever
ACTORBASE PROPERTY skeever AUTO
ACTORBASE PROPERTY wolf AUTO
ACTORBASE PROPERTY bandit AUTO
ACTORBASE PROPERTY draugr AUTO
ACTORBASE PROPERTY falmer AUTO
ACTORBASE PROPERTY dragonPriest AUTO
ACTORBASE PROPERTY atronach AUTO

; ally
FACTION PROPERTY playerFaction AUTO

; //THE STUFF FOR THE EXPLOSION
EXPLOSION PROPERTY forceExplosion AUTO
EXPLOSION PROPERTY visualExplosion AUTO

OBJECTREFERENCE PROPERTY explosionMarker AUTO
EFFECTSHADER PROPERTY wabbaHitEffect AUTO

SPELL PROPERTY ghostSpell AUTO

INT randEffect=0
ACTORBASE ghostNPC
OBJECTREFERENCE npcChanged
OBJECTREFERENCE newCreature

KEYWORD PROPERTY keyWabbajackExcluded Auto
KEYWORD PROPERTY keyGiant AUTO
KEYWORD PROPERTY keyDragon AUTO

; //TRANSMOGRIFY VARIABLES
OBJECTREFERENCE objStore
OBJECTREFERENCE newRefStore
ACTORBASE PROPERTY chicken AUTO
ACTORBASE PROPERTY mudcrab AUTO
ACTORBASE PROPERTY rabbit AUTO
ACTORBASE PROPERTY dremora AUTO
dunTransmogrifyAnimal mainScript

; //WE madwoman
ACTORBASE PROPERTY madWoman AUTO

; //////////
; //ASH PILE VARIABLES
; //////////
float property fDelay = 0.75 auto
{time to wait before Spawning Ash Pile}
float property fDelayEnd = 1.65 auto
{time to wait before Removing Base Actor}
float property ShaderDuration = 0.00 auto
{Duration of Effect Shader.}
Activator property pDefaultAshPileGhost auto
{The object we use as a pile.}
Bool property bSetAlphaZero = True auto
{The Effect Shader we want.}
FormList Property pDisintegrationMainImmunityList auto
{If the target is in this list, they will not be disintegrated.}
EFFECTSHADER PROPERTY pGhostDeathFXShader AUTO
{the shader to play while dying}

race VictimRace
ACTOR victim
bool TargetIsImmune = True

EVENT onEffectStart(Actor akTarget, Actor akCaster)

victim = akTarget

IF(akCaster == game.getPlayer())

	randEffect = utility.randomInt(1, 100)
	explosionMarker.moveTo(akTarget)
	
	IF(akTarget.isEssential())
		randEffect = 1
	ELSEIF(akTarget.hasKeyword(keyWabbajackExcluded))
		randEffect = 1
	ELSEIF(akTarget.hasKeyword(keyGiant))
		randEffect = 1
	ELSEIF(akTarget.hasKeyword(keyDragon))
		randEffect = 1
	ELSEIF(akTarget.isCommandedActor())
		randEffect = 1
	ELSEIF(akTarget.getBaseObject() == madwoman)
		randEffect = 60
	ENDIF

	; /////////////
	; //CHOOSE WHAT WE'RE RANDOMLY DOING
	IF(randEffect >= 1 && randEffect < 51)
		elementalEffect(akTarget)
	
	ELSEIF(randEffect >= 51 && randEffect < 58)
		randomCreatureChicken(akTarget)			
		
	ELSEIF(randEffect >= 58 && randEffect < 65)
		randomCreatureRabbit(akTarget)	
		
	ELSEIF(randEffect >= 65 && randEffect < 72)
		randomCreatureMudcrab(akTarget)	
	
	ELSEIF(randEffect >= 72 && randEffect < 77)
		castInvis(akTarget)

	ELSEIF(randEffect >= 77 && randEffect < 82)
		hsmTransfer(akTarget)
		
	ELSEIF(randEffect >= 82 && randEffect < 89)
		randomCreatureDremora(akTarget)

	ELSEIF(randEffect >= 89 && randEffect < 94)
		healSpell.cast(akTarget, akTarget)
		
	ELSEIF(randEffect >= 94 && randEffect < 96)
		spawnGold(akTarget)
			
	ELSEIF(randEffect >= 96 && randEffect < 98)
		spawnSweetRoll(akTarget)
		
	ELSEIF(randEffect >= 98)
		akTarget.kill(game.getPlayer())
	
	ENDIF
	
	
ENDIF

ENDEVENT

FUNCTION basicDamage(ACTOR targ)

ENDFUNCTION

FUNCTION randomCreatureChicken(ACTOR targ)

targ.disable()
		
newRefStore = targ.placeAtMe(chicken)

; //setting the master script to be the one with the stored vars
mainScript = newRefstore AS dunTransmogrifyAnimal
mainScript.storedActor = targ

targ.stopCombat()

ENDFUNCTION

FUNCTION randomCreatureMudcrab(ACTOR targ)

targ.disable()
		
newRefStore = targ.placeAtMe(mudcrab)

; //setting the master script to be the one with the stored vars
mainScript = newRefstore AS dunTransmogrifyAnimal
mainScript.storedActor = targ

targ.stopCombat()

ENDFUNCTION

FUNCTION randomCreatureRabbit(ACTOR targ)

targ.disable()
		
newRefStore = targ.placeAtMe(rabbit)

; //setting the master script to be the one with the stored vars
mainScript = newRefstore AS dunTransmogrifyAnimal
mainScript.storedActor = targ

targ.stopCombat()

ENDFUNCTION

FUNCTION randomCreatureDremora(ACTOR targ)

targ.disable()
		
newRefStore = targ.placeAtMe(dremora)

; //setting the master script to be the one with the stored vars
mainScript = newRefstore AS dunTransmogrifyAnimal
mainScript.storedActor = targ

targ.stopCombat()

ENDFUNCTION

FUNCTION spawnGhostFriend(ACTOR targ)

targ.placeAtMe(visualExplosion)

ACTOR tempNPC = (targ.placeAtMe(targ.getBaseObject()) as ACTOR)
tempNPC.addSpell(ghostSpell)
tempNPC.removeFromAllFactions()
tempNPC.setFactionRank(playerFaction, 5)
tempNPC.setGhost(TRUE)
		
utility.wait(10)

explosionMarker.setPosition(tempNPC.x, tempNPC.y, (tempNPC.z + 75))
tempNPC.placeAtMe(visualExplosion)

utility.wait(0.5)

tempNPC.disable()

ENDFUNCTION

FUNCTION elementalEffect(ACTOR targ)

int rand = utility.randomInt(1,3)
explosionMarker.setPosition(targ.x, targ.y, (targ.z + 75))
	
IF(rand == 1)
	targ.placeAtMe(fireSpell)
	targ.damageAV("Health", 60)

ELSEIF(rand == 2)
	targ.placeAtMe(frostSpell)
	targ.damageAV("Health", 60)

ELSEIF(rand == 3)
	targ.placeAtMe(stormSpell)
	targ.damageAV("Health", 60)

ENDIF

ENDFUNCTION

FUNCTION castInvis(ACTOR targ)

float baseMagicka = targ.getAV("magicka")
float baseIllusion = targ.getAV("Illusion")

targ.setAV("magicka", 200)
targ.setAV("Illusion", 200)
invis.cast(targ, targ)

utility.wait(0.5)

targ.setAV("magicka", baseMagicka)
targ.setAV("Illusion", baseIllusion)
	
ENDFUNCTION

FUNCTION hsmTransfer(ACTOR targ)

wabbaHitEffect.play(game.getPlayer())

targ.damageAV("health", (targ.getBaseAV("health") * 0.5))
game.getPlayer().restoreAV("health", (game.getPlayer().getBaseAV("health") * 0.5))

targ.damageAV("stamina", (targ.getBaseAV("stamina") * 0.5))
game.getPlayer().restoreAV("stamina", (game.getPlayer().getBaseAV("stamina") * 0.5))

targ.damageAV("magicka", (targ.getBaseAV("magicka") * 0.5))
game.getPlayer().restoreAV("magicka", (game.getPlayer().getBaseAV("magicka") * 0.5))

utility.wait(1.5)

wabbaHitEffect.stop(game.getPlayer())

ENDFUNCTION

FUNCTION spawnGold(ACTOR targ)
targ.placeAtMe(visualExplosion)
createAshPile()	
explosionMarker.setPosition(targ.x, targ.y, (targ.z + 100))

utility.wait(0.1)
explosionMarker.placeAtMe(gold, 50)
explosionMarker.placeAtMe(forceExplosion)

ENDFUNCTION

FUNCTION spawnSweetRoll(ACTOR targ)
targ.placeAtMe(visualExplosion)

utility.wait(0.7)
explosionMarker.setPosition(targ.x, targ.y, (targ.z + 10))
utility.wait(0.1)
createAshPile()
explosionMarker.placeAtMe(sweetRoll)


ENDFUNCTION

FUNCTION createAshPile()

; //check to see if the target is in the immunity list
IF(pDisintegrationMainImmunityList == none)
	TargetIsImmune = False
ELSE
	ActorBase VictimBase = victim.GetBaseObject() as ActorBase
	VictimRace = VictimBase.GetRace()
	
	IF(pDisintegrationMainImmunityList.hasform(VictimRace) || pDisintegrationMainImmunityList.hasform(VictimBase))
		TargetIsImmune = True
	ELSE
		TargetIsImmune = False
	ENDIF
ENDIF

; //if the target is not immune, disintegrate them
IF(TargetIsImmune == False)
; 		debug.trace("victim just died")

	
	victim.kill(game.getPlayer())
	victim.SetCriticalStage(victim.CritStage_DisintegrateStart)

	IF(pGhostDeathFXShader != none)
		pGhostDeathFXShader.play(victim,ShaderDuration)
	ENDIF
	
	victim.SetAlpha (0.0,True)
	
	; //attach the ash pile
	victim.AttachAshPile(pDefaultAshPileGhost)
	
	utility.wait(fDelayEnd)
	IF(pGhostDeathFXShader != none)
		pGhostDeathFXShader.stop(victim)
	ENDIF
	IF(bSetAlphaZero == True)
		victim.SetAlpha (0.0,True)
	ENDIF
	victim.SetCriticalStage(victim.CritStage_DisintegrateEnd)
ENDIF

endFUNCTION


 

 

Pretty long isn't it? Let me delete everything except names...

 

Scriptname DA15WabbajackEffectSCRIPT extends ActiveMagicEffect  

EVENT onEffectStart(Actor akTarget, Actor akCaster)
IF(akCaster == game.getPlayer())
	randEffect = utility.randomInt(1, 100)

	; //CHOOSE WHAT WE'RE RANDOMLY DOING
	IF(randEffect >= 1 && randEffect < 51)
		elementalEffect(akTarget)
	ELSEIF(randEffect >= 51 && randEffect < 58)
		randomCreatureChicken(akTarget)					
	ELSEIF(randEffect >= 58 && randEffect < 65)
		randomCreatureRabbit(akTarget)			
	ELSEIF(randEffect >= 65 && randEffect < 72)
		randomCreatureMudcrab(akTarget)		
	ELSEIF(randEffect >= 72 && randEffect < 77)
		castInvis(akTarget)
	ELSEIF(randEffect >= 77 && randEffect < 82)
		hsmTransfer(akTarget)	
	ELSEIF(randEffect >= 82 && randEffect < 89)
		randomCreatureDremora(akTarget)
	ELSEIF(randEffect >= 89 && randEffect < 94)
		healSpell.cast(akTarget, akTarget)	
	ELSEIF(randEffect >= 94 && randEffect < 96)
		spawnGold(akTarget)	
	ELSEIF(randEffect >= 96 && randEffect < 98)
		spawnSweetRoll(akTarget)
	ELSEIF(randEffect >= 98)
		akTarget.kill(game.getPlayer())		
	ENDIF
ENDIF
ENDEVENT

FUNCTION basicDamage(ACTOR targ)
FUNCTION randomCreatureChicken(ACTOR targ)
FUNCTION randomCreatureMudcrab(ACTOR targ)
FUNCTION randomCreatureRabbit(ACTOR targ)
FUNCTION randomCreatureDremora(ACTOR targ)
FUNCTION spawnGhostFriend(ACTOR targ)
FUNCTION elementalEffect(ACTOR targ)
FUNCTION castInvis(ACTOR targ)
FUNCTION hsmTransfer(ACTOR targ)
FUNCTION spawnGold(ACTOR targ)
FUNCTION spawnSweetRoll(ACTOR targ)

 

So from what I see in the script, odds are like this:

 

50% Elemental Spell (Fire, Frost, Shock)

Actually this is not "spell"... When you look at the script, it generates only explosion, and then use "damageActorValue-health" to give 60 damages.

Thus nothing -no magic resist, no elemental resist, no player destruction skill level- affects this effect.

In addition, this might let us kill NPCs without getting 1000 bounty added, because the damage is given through script.

(Wabbajack gives 1 damage on hit, so we might still get 40 bounty for minor crime.)

7% + 7% + 7% Change to Animal (Chicken, Rabbit, Mudcrab)

Very useful when I want to have a cup of tea during 1:1 battle

5% Invisibility

Really does nothing, because enemies would try to hit you anyway, resulting in dispelling invisibility...

5% Absorb Health, Magicka, Stamina

This functions really weirdly. You do not absorb HMS of fixed value.

You take 50% of enemy HMS (Yeah, die! bandit chief!) to restore 50% of you HMS.

So it's super-effective to enemies with large maximum health and still a good way to heal yourself when used to minor enemies.

7% Change to Dremora

YOU MEET YOUR END, MORTAL!!!

 

No, thanks.

Hit him once, and he will disappear, just like "change to animal" effect

6% Heal

The spell cast is "Fast Healing," which restores 50 health.

As far as you get another elemental spell effect with wabbajack, this effect is not that dangerous.

 

2% Change to Coin

My favorite effect, indeed.

Instant kill, and gives me some septims to buy a sweetroll

 

2% Change to Sweetroll

No need to visit Belethor to buy one!

Instant kill, also

 

3% Instant Kill

Unlike elemental spells, the kill script in this effect designates a killer, which is the player.

 

So in summary,

 

50% elemental skill (damage 60)

5% absorb HMS (50%)

7% instant kill

38% fun

 

What do you think? I think this is quite useful... Especially 7% instant kill is at least higher on value than that of Mehrune's Razor, (2/101) except that only "Elemental Spell" effect occurs when Wabbajack is used to certain "essential" actors...

 

Also, I found "Spawn Ghost Friend" effect in the script, but it is not actually used...

When I changed the script to use the effect, it summoned a doppelganger of the target to fight against him.

Have anyone seen this effect without modifying the script?

Edited by hidconsp
Link to comment
Share on other sites

  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...