parent
95d6cab0c9
commit
33372b8b1a
9 changed files with 5 additions and 395 deletions
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -1,358 +0,0 @@ |
|||||||
Scriptname _00E_Phasmalist_ApparationAlias extends ReferenceAlias |
|
||||||
{ OBSOLETE. Left for backward save compatibility. See _00E_Phasmalist_NewApparitionAlias. } |
|
||||||
|
|
||||||
; on Abilities/_00E_A3_PhasmalistApparation |
|
||||||
; script that controls the apparation stats calculation and initialization. Additionally, it is responsible for the control of the apparation communication while it is summoned |
|
||||||
|
|
||||||
; we prefer to place new actors instead of using only one actor |
|
||||||
; due to the problem of keeping track of all apparations, |
|
||||||
; which might create memory leaks because of persistence; |
|
||||||
; Additionally, temporary or accidental changes do not cumulate |
|
||||||
; and lead to problems |
|
||||||
|
|
||||||
; balancing data |
|
||||||
float Property apparationManaRate = 1 AutoReadOnly Hidden |
|
||||||
|
|
||||||
float Property playerStatsMultiplier = 0.20 AutoReadOnly Hidden |
|
||||||
float Property playerConjSkillMultiplier = 0.10 AutoReadOnly Hidden |
|
||||||
float Property playerEnchSkillMultiplier = 0.15 AutoReadOnly Hidden |
|
||||||
|
|
||||||
float Property fArcaneFeverLevel01 = 7.00 AutoReadOnly Hidden |
|
||||||
float Property fArcaneFeverLevel02 = 6.00 AutoReadOnly Hidden |
|
||||||
float Property fArcaneFeverLevel03 = 5.00 AutoReadOnly Hidden |
|
||||||
|
|
||||||
int Property fArcaneFeverModWarrior = -1 AutoReadOnly Hidden |
|
||||||
int Property fArcaneFeverModRanger = 0 AutoReadOnly Hidden |
|
||||||
int Property fArcaneFeverModHybrid = 0 AutoReadOnly Hidden |
|
||||||
int Property fArcaneFeverModMage = 1 AutoReadOnly Hidden |
|
||||||
|
|
||||||
int Property ghostlyMageBoostDestructionPowerMod1 = 7 AutoReadOnly Hidden |
|
||||||
int Property ghostlyMageBoostDestructionPowerMod2 = 15 AutoReadOnly Hidden |
|
||||||
int Property ghostlyMageBoostDestructionPowerMod3 = 25 AutoReadOnly Hidden |
|
||||||
|
|
||||||
int Property ghostlyMageBoostMagicka1 = 15 AutoReadOnly Hidden |
|
||||||
int Property ghostlyMageBoostMagicka2 = 40 AutoReadOnly Hidden |
|
||||||
int Property ghostlyMageBoostMagicka3 = 75 AutoReadOnly Hidden |
|
||||||
|
|
||||||
int Property ghostlyRangerBoostArchery1 = 7 AutoReadOnly Hidden |
|
||||||
int Property ghostlyRangerBoostArchery2 = 17 AutoReadOnly Hidden |
|
||||||
int Property ghostlyRangerBoostArchery3 = 30 AutoReadOnly Hidden |
|
||||||
|
|
||||||
int Property ghostlyRangerBoostCritChance1 = 7 AutoReadOnly Hidden |
|
||||||
int Property ghostlyRangerBoostCritChance2 = 15 AutoReadOnly Hidden |
|
||||||
int Property ghostlyRangerBoostCritChance3 = 25 AutoReadOnly Hidden |
|
||||||
|
|
||||||
int Property ghostlyWarriorBoostMelee1 = 7 AutoReadOnly Hidden |
|
||||||
int Property ghostlyWarriorBoostMelee2 = 17 AutoReadOnly Hidden |
|
||||||
int Property ghostlyWarriorBoostMelee3 = 30 AutoReadOnly Hidden |
|
||||||
|
|
||||||
int Property ghostlyWarriorBoostArmorSkill1 = 7 AutoReadOnly Hidden |
|
||||||
int Property ghostlyWarriorBoostArmorSkill2 = 17 AutoReadOnly Hidden |
|
||||||
int Property ghostlyWarriorBoostArmorSkill3 = 30 AutoReadOnly Hidden |
|
||||||
|
|
||||||
int Property iCallApparitionKeyCode = 34 Auto Hidden |
|
||||||
|
|
||||||
Explosion Property enterWorldExplosion auto |
|
||||||
|
|
||||||
Perk Property _00E_Class_Phasmalist_P04_Talent_SummonApparation auto |
|
||||||
Perk Property _00E_Class_Phasmalist_P04_Talent_SummonApparation2 auto |
|
||||||
Perk Property _00E_Class_Phasmalist_P04_Talent_SummonApparation3 auto |
|
||||||
|
|
||||||
Static Property XMarker Auto |
|
||||||
|
|
||||||
Perk Property _00E_Class_Phasmalist_P08a auto |
|
||||||
|
|
||||||
Perk[] Property _00E_Class_Phasmalist_P05a_ABC auto ; ghostly mage |
|
||||||
{ghostly mage perks, this array should have 3 elements for all 3 perks} |
|
||||||
Perk[] Property _00E_Class_Phasmalist_P05b_ABC auto ; ghostly ranger |
|
||||||
{ghostly ranger perks, this array should have 3 elements for all 3 perks} |
|
||||||
Perk[] Property _00E_Class_Phasmalist_P05c_ABC auto ; ghostly warrior |
|
||||||
{ghostly warrior perks, this array should have 3 elements for all 3 perks} |
|
||||||
|
|
||||||
Location Property _00E_Dreamworld_Location auto |
|
||||||
Keyword Property _00E_Phasmalist_NoSummonLocation auto |
|
||||||
Message Property _00E_Phasmalist_NoSummoningMessage auto |
|
||||||
Keyword Property _00E_Phasmalist_NoSummonLocationTown auto |
|
||||||
Message Property _00E_Phasmalist_CurrentlyEquipped auto |
|
||||||
Message Property _00E_Phasmalist_NoSummoningMessageTown auto |
|
||||||
|
|
||||||
Sound Property MAGAlterationInvisibilityIn Auto |
|
||||||
Sound Property MAGAlterationInvisibilityOut Auto |
|
||||||
|
|
||||||
Perk Property _00E_Class_Phasmalist_P08b auto ; apparations can exist in towns |
|
||||||
|
|
||||||
EffectShader Property _00E_Phasmalist_ApparitionShaderFXS Auto |
|
||||||
|
|
||||||
ImageSpaceModifier Property _00E_ArkanistenfieberIMOD Auto |
|
||||||
ImageSpaceModifier Property _00E_Phasmalist_ApparitionEnterWorldIMOD Auto |
|
||||||
|
|
||||||
Sound Property _00E_FS_IncreaseArcaneFeverM Auto |
|
||||||
;Sound Property _00E_FS_Phasmalist_EnterWorld_Male Auto |
|
||||||
;Sound Property _00E_FS_Phasmalist_EnterWorld_Female Auto |
|
||||||
|
|
||||||
Message Property _00E_BlitzheilungArkanistenfieber_sFeverIncreased Auto |
|
||||||
GlobalVariable Property _00E_Phasmalist_IsApparationSummoned Auto |
|
||||||
|
|
||||||
Keyword Property _00E_FS_Magic_Summon auto ; the apparation should not be able to learn certain spells |
|
||||||
Keyword Property _00E_FS_Magic_Mystical auto |
|
||||||
|
|
||||||
int currentBoostMagicka ; this is set in adjustBoost() to have the attribute set correctly in the stats calculation |
|
||||||
|
|
||||||
_00E_Phasmalist_TrinketSC equippedTrinket |
|
||||||
|
|
||||||
Actor Property PlayerREF Auto |
|
||||||
|
|
||||||
Formlist Property _00E_AllAmmos Auto |
|
||||||
|
|
||||||
; for a description, look to the function failsaveRefillOnLoad() of this script |
|
||||||
Actor failsave_content |
|
||||||
|
|
||||||
; functions that are called from the trinkets to keep track of the currently equipped trinket -------------------------------------------------------------------------------------------- |
|
||||||
|
|
||||||
function onTrinketEquipped(_00E_Phasmalist_TrinketSC trinket) |
|
||||||
equippedTrinket = trinket |
|
||||||
Endfunction |
|
||||||
|
|
||||||
function onTrinketUnequipped(_00E_Phasmalist_TrinketSC trinket) |
|
||||||
unsummonIfExists() |
|
||||||
If trinket == equippedTrinket |
|
||||||
equippedTrinket = None |
|
||||||
EndIf |
|
||||||
Endfunction |
|
||||||
|
|
||||||
_00E_Phasmalist_TrinketSC function getEquippedTrinket() |
|
||||||
return equippedTrinket |
|
||||||
Endfunction |
|
||||||
|
|
||||||
; summon and unsummon ------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
|
||||||
|
|
||||||
function unsummon(bool silent = false) |
|
||||||
{Unsummons the phasmalist apparation content of this alias; should be used instead of delete()} |
|
||||||
Actor SelfREF = self.GetActorReference() |
|
||||||
If (!silent) |
|
||||||
SelfREF.placeAtMe(enterWorldExplosion) |
|
||||||
addArcaneFever() |
|
||||||
EndIf |
|
||||||
|
|
||||||
; empty function? |
|
||||||
;(SelfREF.getActorBase() as _00E_Phasmalist_ApparationSC).onUnsummon(SelfREF) |
|
||||||
SelfREF.removeAllItems((SelfREF.GetActorBase() as _00E_Phasmalist_ApparationSC).inventoryContainer, false, true) |
|
||||||
SelfREF.disable() |
|
||||||
_00E_Phasmalist_IsApparationSummoned.setValue(0) |
|
||||||
_RemoveApparationHealthBar() |
|
||||||
SelfREF.delete() |
|
||||||
self.clear() |
|
||||||
failsave_content = None |
|
||||||
SendModEvent("Phasmalist_ApparationUnSummon") |
|
||||||
Endfunction |
|
||||||
|
|
||||||
function unsummonIfExists() |
|
||||||
If getRef() |
|
||||||
unsummon() |
|
||||||
EndIf |
|
||||||
Endfunction |
|
||||||
|
|
||||||
; utility functions ---------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
||||||
|
|
||||||
Function _RemoveApparationHealthBar() |
|
||||||
HealthBarManager.Hide(self.getActorReference()) |
|
||||||
EndFunction |
|
||||||
|
|
||||||
Function _AddApparationHealthBar() |
|
||||||
HealthBarManager.Show(self.getActorReference()) |
|
||||||
EndFunction |
|
||||||
|
|
||||||
; local helper functions --------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
||||||
|
|
||||||
function addArcaneFever() |
|
||||||
float healthLostPercentage = 0 |
|
||||||
If self.getActorReference().isDead() |
|
||||||
healthLostPercentage = 1 |
|
||||||
Else |
|
||||||
healthLostPercentage = 1 - self.getActorReference().GetActorValuePercentage("health") |
|
||||||
EndIf |
|
||||||
int TalentLevel = _00E_TalentLibrary.GetPlayerTalentLevel(_00E_Class_Phasmalist_P04_Talent_SummonApparation, _00E_Class_Phasmalist_P04_Talent_SummonApparation2, _00E_Class_Phasmalist_P04_Talent_SummonApparation3) |
|
||||||
float maxArcaneFeverAdd = 0 |
|
||||||
|
|
||||||
If (TalentLevel == 1) |
|
||||||
maxArcaneFeverAdd = fArcaneFeverLevel01 |
|
||||||
ElseIf (TalentLevel == 2) |
|
||||||
maxArcaneFeverAdd = fArcaneFeverLevel02 |
|
||||||
Else |
|
||||||
maxArcaneFeverAdd = fArcaneFeverLevel03 |
|
||||||
EndIf |
|
||||||
|
|
||||||
If getEquippedTrinket().type == 0 |
|
||||||
maxArcaneFeverAdd = maxArcaneFeverAdd + fArcaneFeverModWarrior |
|
||||||
ElseIf getEquippedTrinket().type == 1 |
|
||||||
maxArcaneFeverAdd = maxArcaneFeverAdd + fArcaneFeverModRanger |
|
||||||
ElseIf getEquippedTrinket().type == 2 |
|
||||||
maxArcaneFeverAdd = maxArcaneFeverAdd + fArcaneFeverModMage |
|
||||||
Else |
|
||||||
maxArcaneFeverAdd = maxArcaneFeverAdd + fArcaneFeverModHybrid |
|
||||||
EndIf |
|
||||||
|
|
||||||
float arcaneFeverAdd = (maxArcaneFeverAdd * healthLostPercentage) as float |
|
||||||
|
|
||||||
If arcaneFeverAdd > 0 |
|
||||||
|
|
||||||
PlayerREF.ModAV("LastFlattered", -arcaneFeverAdd) |
|
||||||
_00E_ArkanistenfieberIMOD.ApplyCrossFade() |
|
||||||
_00E_FS_IncreaseArcaneFeverM.Play(PlayerREF) |
|
||||||
_00E_BlitzheilungArkanistenfieber_sFeverIncreased.Show(arcaneFeverAdd, -1*PlayerREF.GetAV("LastFlattered")) |
|
||||||
|
|
||||||
EndIf |
|
||||||
|
|
||||||
Endfunction |
|
||||||
|
|
||||||
function adjustBoosts() |
|
||||||
adjustBoostPerk(_00E_Class_Phasmalist_P05a_ABC, "mage") |
|
||||||
adjustBoostPerk(_00E_Class_Phasmalist_P05b_ABC, "ranger") |
|
||||||
adjustBoostPerk(_00E_Class_Phasmalist_P05c_ABC, "warrior") |
|
||||||
Endfunction |
|
||||||
|
|
||||||
function addClassBoost(int level, string boostClass) |
|
||||||
Actor referenceActor = self.getActorReference() |
|
||||||
If boostClass == "mage" |
|
||||||
int boostDestructionPowerMod = 0 |
|
||||||
If level == 2 |
|
||||||
boostDestructionPowerMod = ghostlyMageBoostDestructionPowerMod2 |
|
||||||
currentBoostMagicka = ghostlyMageBoostMagicka2; since magicka is boosted later again, we have to save this boost and apply it later to prevent overwriting old boosts |
|
||||||
ElseIf level == 3 |
|
||||||
boostDestructionPowerMod = ghostlyMageBoostDestructionPowerMod3 |
|
||||||
currentBoostMagicka = ghostlyMageBoostMagicka3 |
|
||||||
Else |
|
||||||
boostDestructionPowerMod = ghostlyMageBoostDestructionPowerMod1 |
|
||||||
currentBoostMagicka = ghostlyMageBoostMagicka1 |
|
||||||
EndIf |
|
||||||
;referenceActor.ForceAV("DestructionPowerMod", referenceActor.GetAV("DestructionPowerMod") + boostDestructionPowerMod) |
|
||||||
referenceActor.ModAV("DestructionPowerMod", boostDestructionPowerMod) |
|
||||||
ElseIf boostClass == "ranger" |
|
||||||
int boostArchery = 0 |
|
||||||
int boostCritChance = 0 |
|
||||||
If level == 2 |
|
||||||
boostArchery = ghostlyRangerBoostArchery2 |
|
||||||
boostCritChance = ghostlyRangerBoostCritChance2 |
|
||||||
ElseIf level == 3 |
|
||||||
boostArchery = ghostlyRangerBoostArchery3 |
|
||||||
boostCritChance = ghostlyRangerBoostCritChance3 |
|
||||||
Else |
|
||||||
boostArchery = ghostlyRangerBoostArchery1 |
|
||||||
boostCritChance = ghostlyRangerBoostCritChance1 |
|
||||||
EndIf |
|
||||||
|
|
||||||
;referenceActor.ForceAV("Marksman", referenceActor.GetAV("Marksman") + boostArchery) |
|
||||||
referenceActor.ModAV("Marksman", boostArchery) |
|
||||||
;referenceActor.ForceAV("CritChance", referenceActor.GetAV("CritChance") + boostCritChance) |
|
||||||
referenceActor.ModAV("CritChance", boostCritChance) |
|
||||||
ElseIf boostClass == "warrior" |
|
||||||
int boostMelee = 0 |
|
||||||
int boostArmorSkill = 0 |
|
||||||
If level == 2 |
|
||||||
boostMelee = ghostlyWarriorBoostMelee2 |
|
||||||
boostArmorSkill = ghostlyWarriorBoostArmorSkill2 |
|
||||||
ElseIf level == 3 |
|
||||||
boostMelee = ghostlyWarriorBoostMelee3 |
|
||||||
boostArmorSkill = ghostlyWarriorBoostArmorSkill3 |
|
||||||
Else |
|
||||||
boostMelee = ghostlyWarriorBoostMelee1 |
|
||||||
boostArmorSkill = ghostlyWarriorBoostArmorSkill1 |
|
||||||
EndIf |
|
||||||
|
|
||||||
;referenceActor.ForceAV("HeavyArmor", referenceActor.GetAV("HeavyArmor") + boostArmorSkill) |
|
||||||
referenceActor.ModAV("HeavyArmor", boostArmorSkill) |
|
||||||
;referenceActor.ForceAV("LightArmor", referenceActor.GetAV("LightArmor") + boostArmorSkill) |
|
||||||
referenceActor.ModAV("LightArmor", boostArmorSkill) |
|
||||||
;referenceActor.ForceAV("MeleeDamage", referenceActor.GetAV("MeleeDamage") + boostMelee) |
|
||||||
referenceActor.ModAV("MeleeDamage", boostMelee) |
|
||||||
EndIf |
|
||||||
Endfunction |
|
||||||
|
|
||||||
function adjustBoostPerk(Perk[] perks, string boostClass) |
|
||||||
int i = perks.length |
|
||||||
While i > 0 |
|
||||||
i = i - 1 |
|
||||||
If PlayerREF.HasPerk(perks[i]) |
|
||||||
addClassBoost(i + 1, boostClass) |
|
||||||
return |
|
||||||
EndIf |
|
||||||
EndWhile |
|
||||||
Endfunction |
|
||||||
|
|
||||||
function init() |
|
||||||
initBehaviour() |
|
||||||
initNotPersistentStats() |
|
||||||
|
|
||||||
Actor referenceActor = self.getActorReference() |
|
||||||
;Actor player = Game.getPlayer() |
|
||||||
|
|
||||||
float attributeRaisePercentage = playerConjSkillMultiplier * PlayerREF.getActorValue("Conjuration") + playerEnchSkillMultiplier * PlayerREF.getActorValue("Enchanting") |
|
||||||
attributeRaisePercentage = attributeRaisePercentage / 100 + 1 |
|
||||||
|
|
||||||
adjustBoosts() |
|
||||||
|
|
||||||
If (PlayerREF.hasPerk(_00E_Class_Phasmalist_P08a)) |
|
||||||
float maxAttributeValue = PlayerREF.getBaseActorValue("Health") |
|
||||||
If PlayerREF.getBaseActorValue("Magicka") > maxAttributeValue |
|
||||||
maxAttributeValue = PlayerREF.getBaseActorValue("Magicka") |
|
||||||
EndIf |
|
||||||
If PlayerREF.getBaseActorValue("Stamina") > maxAttributeValue |
|
||||||
maxAttributeValue = PlayerREF.getBaseActorValue("Stamina") |
|
||||||
EndIf |
|
||||||
referenceActor.ForceAV("Health", ((referenceActor.getBaseActorValue("Health") + maxAttributeValue * playerStatsMultiplier) * attributeRaisePercentage) as int) |
|
||||||
referenceActor.ForceAV("Magicka", ((referenceActor.getBaseActorValue("Magicka") + maxAttributeValue * playerStatsMultiplier) * attributeRaisePercentage) as int + currentBoostMagicka) |
|
||||||
referenceActor.ForceAV("Stamina", ((referenceActor.getBaseActorValue("Stamina") + maxAttributeValue * playerStatsMultiplier) * attributeRaisePercentage) as int) |
|
||||||
|
|
||||||
Else |
|
||||||
referenceActor.ForceAV("Health", ((referenceActor.getBaseActorValue("Health") + PlayerREF.getBaseActorValue("Health") * playerStatsMultiplier) * attributeRaisePercentage) as int) |
|
||||||
referenceActor.ForceAV("Magicka", ((referenceActor.getBaseActorValue("Magicka") + PlayerREF.getBaseActorValue("Magicka") * playerStatsMultiplier) * attributeRaisePercentage) as int + currentBoostMagicka) |
|
||||||
referenceActor.ForceAV("Stamina", ((referenceActor.getBaseActorValue("Stamina") + PlayerREF.getBaseActorValue("Stamina") * playerStatsMultiplier) * attributeRaisePercentage) as int) |
|
||||||
EndIf |
|
||||||
|
|
||||||
Endfunction |
|
||||||
|
|
||||||
function initBehaviour() |
|
||||||
Actor akSelf = self.getActorReference() |
|
||||||
If akSelf.GetRelationshipRank(PlayerREF) < 3 && akSelf.GetRelationshipRank(PlayerREF) >= 0 |
|
||||||
akSelf.SetRelationshipRank(PlayerREF, 3) |
|
||||||
EndIf |
|
||||||
|
|
||||||
akSelf.SetPlayerTeammate() |
|
||||||
akSelf.SetActorValue("Confidence", 4) ; the apparation should never flee |
|
||||||
akSelf.SetActorValue("Aggression", 0) ; the apparation should not initiate combat (-> stealth playstyle) |
|
||||||
akSelf.SetActorValue("Sneak", 100) |
|
||||||
akSelf.SetActorValue("Invisibility", 1) ; make the apparation undetectable when sneaking (-> stealth playstyle) |
|
||||||
akSelf.IgnoreFriendlyHits() ; make the apparation ignore friendly fire from the PC |
|
||||||
Endfunction |
|
||||||
|
|
||||||
function initNotPersistentStats() |
|
||||||
|
|
||||||
Actor akSelf = self.getActorReference() |
|
||||||
If akSelf |
|
||||||
akSelf.getActorBase().setCombatStyle(getEquippedTrinket().getUsedCombatStyle()) |
|
||||||
|
|
||||||
akSelf.setAV("HealRate", 50) |
|
||||||
akSelf.setAV("MagickaRate", apparationManaRate) |
|
||||||
|
|
||||||
;failsafe since setav doesn't work sometimes |
|
||||||
akSelf.forceAV("HealRate", 50) |
|
||||||
akSelf.forceAV("MagickaRate", apparationManaRate) |
|
||||||
|
|
||||||
_AddApparationHealthBar() |
|
||||||
EndIf |
|
||||||
Endfunction |
|
||||||
|
|
||||||
; events ----------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
||||||
|
|
||||||
function addSpells() |
|
||||||
int index = self.getActorReference().getNumItems() - 1 |
|
||||||
While index >= 0 |
|
||||||
Form item = self.getActorReference().getNthForm(index) |
|
||||||
If item as book && !item.hasKeyword(_00E_FS_Magic_Summon) && !item.hasKeyword(_00E_FS_Magic_Mystical) |
|
||||||
If (item as book).getSpell() |
|
||||||
self.getActorReference().addSpell((item as book).getSpell()) |
|
||||||
EndIf |
|
||||||
EndIf |
|
||||||
index = index - 1 |
|
||||||
EndWhile |
|
||||||
Endfunction |
|
@ -1,3 +0,0 @@ |
|||||||
Scriptname _00E_Phasmalist_ApparitionShaderSC extends ReferenceAlias |
|
||||||
{ OBSOLETE. Left for backward save compatibility. |
|
||||||
The functions of the script have been moved to the apparition ability. } |
|
Loading…
Reference in new issue