Difference between revisions of "User:Sickleyield"

From the Oblivion ConstructionSet Wiki
Jump to navigation Jump to search
imported>Sickleyield
imported>Sickleyield
Line 1: Line 1:
(Steps up to podium.)
This is the CM Partners PartnerMagic script.  Their readme gives permission for any and all uses of it, but if anyone from the Cutthroat Mods team should wish me to take it down please contact me and I'll do so at once.


-Nervous cough.- HelloMy name is SickleYield, and I'm a modder.
I'd like to adapt this as a creature follow script while keeping some of the great "levelup with PC" and "attack that NPC over there" sorts of optionsWhen I apply it directly to my spider companion critter, however, the critter remains unactivatable by the playerI tried deleting some of the nonapplicable parts, like the things about torch equippage, but it made no difference.


(Crowd at Modders Anonymous: Hi, SickleYield.)
If we could turn this into a functional critter companion script, I'm sure you can all see far more interesting uses for it than just my Arachnalia mod. ;) Any creature companion could be quickly and easily integrated with the CM Partners mod.  Imagine the possibilities.


I've known about it for a couple of years now, but I don't talk about it much. Sure, my family knows.  They've been supportive.  I tried to stop for a while.  I mean, I'm female, for crying out loud.  I'm over twenty-five years old.  I have a degree in ''Biology''.  I might as well try to take up skateboarding at my age, you know?
Scriptname PartnerMagic


(Crowd: supportive noises.)


But then I looked at the default game armor, and I thought, we can do better than this.  Then I downloaded Blender and GIMP and started learning to model.  It was all downhill from there.  Now I've released my first mod (http://www.tescreens.be/oblivionmodwiki/index.php/House_of_Philemon) and I'm working on another one, and you know what?  I never looked back.  I'm even trying to learn to script now.
short package
short follow
short following
short partner
short command
short inparty
short interior
short doonce
short start
short currentday
short dayspast
short daysdone
float timer
short timepast
short state


(Startled gasps.)
short fspeed
short fathletics
short weaponUse
short incombat
short isdead
short alert
ref target


I know, I knowCan I even successfully write a script without a sex change? We'll seeIn the meantime, I think it's going to be a good time...  Don't you?
short pcz
short npcz
short running
short sitting
short torch
short sneaking
short Chameleon
short invisible
short WaterWalking
 
short npcspeed
short npcathletics
short npcstrength
short npcwillpower
short npcintelligence
short npcagility
short npcendurance
short npcpersonality
short npcluck
short npchealth
short npcmagicka
short npcfatigue
short npcblade
short npcblunt
short npchandtohand
short npcmarksman
short npcheavyarmor
short npclightarmor
short npcblock
short npcsneak
short npcacrobatics
short npcsecurity
short npcmysticism
short npcconjuration
short npcillusion
short npcalteration
short npcdestruction
short npcrestoration
 
short setupdoonce
short npctype
short nlevel
short npclevel
short pclevel
short leveldiff  ; Defined as ( pclevel - npclevel )
short levelup
short levelreport
short npcweapon
short pcweapon
short npcarmor
short pcarmor
short train
short trainday
short trainhour
short traindayspast
short traindone
 
short inventory
short regulator
ref refnpc
ref refbox
 
 
Begin OnLoad
 
Set partner to GetFactionRank Partners
Set npclevel to GetLevel
Set pclevel to Player.GetLevel
 
End
 
Begin OnDeath  ;
 
if GetActorValue Health <= 0 && isdead == 0
  Set isdead to 1
  Set timepast to 1 
  if inparty == 1
    Message, "Your partner is dead."
  endif
endif
 
End
 
Begin OnActivate ; Sets Quest variables when Dialogue is activated.  This allows every Partner NPC to use the Quest dialogue as their own.
 
  Set cmPartnersQuest.nType to npctype
  Set cmPartnersQuest.nLevelup to levelreport
  Set cmPartnersQuest.nInParty to inparty
  Set cmPartnersQuest.nLeveldiff to leveldiff
 
  if Player.IsSneaking == 1 && partner == 2  ; Only activates Dialogue if Player is not sneaking.
    Return
  else
  Activate
  endif
 
End
 
 
Begin GameMode  ; Normal game scripting run in non-menu mode.
 
; INITIAL SETUP - Sets all starting values for variables and adds topics and spells..
 
if setupdoonce == 0
 
; NPC type denotes the NPC's specialized class, is used for levelup, and has the following values:
; 1 -> Combat specialized class
; 2 -> Stealth specialized class
; 3 -> Magic specialized class 
 
  Set npctype to 3
 
  Set partner to GetFactionRank Partners
  Set npclevel to GetLevel
  Set pclevel to Player.GetLevel
  Set leveldiff to ( pclevel - npclevel )
 
  Set npchealth to ( GetBaseActorValue Health )
  Set npcmagicka to ( GetBaseActorValue Magicka )
  Set npcfatigue to ( GetBaseActorValue Fatigue )
  Set npcstrength to ( GetBaseActorValue Strength )
  Set npcintelligence to ( GetBaseActorValue Intelligence )
  Set npcwillpower to ( GetBaseActorValue Willpower )
  Set npcagility to ( GetBaseActorValue Agility )
  Set npcendurance to ( GetBaseActorValue Endurance )
  Set npcpersonality to ( GetBaseActorValue Personality )
  Set npcluck to ( GetBaseActorValue Luck )
  Set npcspeed to ( GetBaseActorValue Speed )
  Set npcathletics to ( GetBaseActorValue Athletics )
 
  Set npcblade to ( GetBaseActorValue Blade )
  Set npcmarksman to ( GetBaseActorValue Marksman )
  Set npcblunt to ( GetBaseActorValue Blunt )
  Set npchandtohand to ( GetBaseActorValue HandtoHand )
 
  Set npclightarmor to ( GetBaseActorValue LightArmor )
  Set npcheavyarmor to ( GetBaseActorValue HeavyArmor )
 
  Set npcacrobatics to ( GetBaseActorValue Acrobatics )
  Set npcsneak to ( GetBaseActorValue Sneak )
  Set npcsecurity to ( GetBaseActorValue Security )
  Set npcblock to ( GetBaseActorValue Block )
 
  Set npcmysticism to ( GetBaseActorValue Mysticism )
  Set npcconjuration to ( GetBaseActorValue Conjuration )
  Set npcillusion to ( GetBaseActorValue Illusion)
  Set npcalteration to ( GetBaseActorValue Alteration )
  Set npcdestruction to ( GetBaseActorValue Destruction )
  Set npcrestoration to ( GetBaseActorValue Restoration )
 
  AddSpell "cmWaterBreathingA"
  SetActorValue Acrobatics, 100
  AddTopic cmxAbilities
  AddTopic cmJoinMe
 
  if npctype == 3
    AddSpell "cmHealPlayer"
    AddSpell "cmRestoreHealth"
  endif
 
  Set setupdoonce to 1
 
endif
 
if timepast == 1  ; Removes the body after 90 seconds if the Partner NPC dies.
  Set timer to ( timer + GetSecondsPassed )
  If timer > 90
    Set timepast to 2
    Set isdead to 2
    Disable
  endif 
endif
 
if isdead == 2  ; Terminates script if Partner NPC dies.
    Return
endif
 
Set package to GetCurrentAIPackage        ; Sets main variables to use as conditions for the rest of the scripting
Set follow to GetCurrentAIPackage == 1
Set partner to GetFactionRank "Partners"
 
if inparty == 1 && package == 13
  Set inparty to 0
elseif inparty == 0 && follow == 1
  Set inparty to 1
endif
 
; FOLLOW MODE - Sets all the follow variables to define how the NPC follows the Player.
 
if follow == 1 && following == 0
  Set inparty to 1
  Set fspeed to ( Player.GetActorValue Speed * 2.25 )
  Set fathletics to ( Player.GetActorValue Athletics * 2.25 )
  SetActorValue Speed, fspeed
  SetActorValue Athletics, fathletics
  SetIgnoreFriendlyHits 7
  Set following to 1 
elseif follow != 1 && following == 1
  SetActorValue Speed, npcspeed
  SetActorValue Athletics, npcathletics
  SetIgnoreFriendlyHits 3
  Set following to 0
endif
 
if follow == 1 && incombat == 0
  Set pcz to Player.GetPos z
  Set npcz to GetPos z
elseif follow != 1 && incombat == 0 
  Set npcz to GetPos z
endif
 
if follow == 1 ;  Scripting in this block commands the NPC to follow the Player in many different ways.
 
  if pcz > ( npcz + 400 )
    MoveTo Player
  elseif pcz < ( npcz - 400 )
    MoveTo Player
  endif
 
  if GetDistance Player > 1024 && incombat == 0
    MoveTo Player
  endif
 
  if IsInCombat == 1
    Set incombat to 1
  else
    Set incombat to 0
  endif
 
  if incombat == 1    ; Prevents combat between Partner NPC's..
    Set target to GetCombatTarget
    if target == Player
      Yield
      Return
    elseif target.GetInFaction Partners
      Yield
      Return
    endif
  endif
 
  if alert == 0 && Player.IsWeaponOut == 1
    SetAlert 1
    Set alert to 1
  elseif alert == 1 && Player.IsWeaponOut == 0
    SetAlert 0
    Set alert to 0
  endif
 
  if sneaking == 0 && Player.IsSneaking == 1
    SetForceSneak 1
    Set sneaking to 1
  elseif sneaking == 1 && Player.IsSneaking == 0
    SetForceSneak 0
    Set sneaking to 0
  endif
 
  if Chameleon == 0 && Player.HasMagicEffect CHML == 1
    AddSpell "cmChameleonA"
    Set Chameleon to 1
  elseif Chameleon == 1 && Player.HasMagicEffect CHML == 0
    RemoveSpell "cmChameleonA"
    Set Chameleon to 0
  endif
 
  if invisible == 0 && Player.HasMagicEffect INVI == 1
    AddSpell "cmInvisibilityA"
    Set invisible to 1
  elseif invisible == 1 && Player.HasMagicEffect INVI == 0
    RemoveSpell "cmInvisibilityA"
    Set invisible to 0
  endif
 
  if running == 0 && Player.IsRunning == 1
    SetForceRun 1
    Set running to 1
  elseif running == 1 && Player.IsRunning == 0
    SetForceRun 0
    Set running to 0
  endif
 
  if WaterWalking == 0 && Player.HasMagicEffect WAWA == 1
    AddSpell "cmWaterWalkingA"
    Set WaterWalking to 1
  elseif WaterWalking == 1 && Player.HasMagicEffect WAWA == 0
    RemoveSpell "cmWaterWalkingA"
    Set WaterWalking to 0
  endif
 
  if npctype == 3 && cmPartnersQuest.nHeal == 1 ; Cast Party Heal spell.
    AddSpell "cmHealParty"
    Cast cmHealParty Player
    RemoveSpell "cmHealParty"
    Set cmPartnersQuest.nHeal to 0
  endif
 
  if sitting == 0 && Player.GetSitting == 3
    AddScriptPackage "cmSitScript"
    Set sitting to 1
  endif 
 
endif
 
if sitting == 1 && Player.GetSitting == 0  ; Forces NPC to rejoin Player after sitting package is complete.
  RemoveScriptPackage
  AddScriptPackage "cmFollowPlayer"
  Set sitting to 0
endif
 
; INVENTORY MODE  - Inventory scripting which is a modified Toaster script.
 
if inventory == 1 && follow == 1
 
  if regulator == 3
    AddItem cmTorch02 1
    EquipItem cmTorch02
    RemoveItem cmTorch02 1
    Set regulator to 4
    RemoveScriptPackage "cmInventory"
    AddScriptPackage "cmFollowPlayer"
    Set inventory to 0
  endif
 
  if regulator == 2 && MenuMode == 0
    Set regulator to 3
    refbox.RemoveAllItems refnpc
    refbox.Disable
  endif
 
  if regulator == 1
    RemoveAllItems refbox
    refbox.Activate Player
    Set regulator to 2
  endif
 
endif
 
 
; PARTY COMMANDS - Reads Quest variable nParty and executes party commands for NPC.
 
if partner == 2 && command == 0 && cmPartnersQuest.nParty==1 && inparty == 1
  Set command to 1
  RemoveScriptPackage
  AddScriptPackage "cmFollowPlayer"
elseif partner == 2 && command == 0 && cmPartnersQuest.nParty==2
  Set inparty to 0
  Set command to 1
  RemoveScriptPackage
  AddScriptPackage "cmStandGuard"
elseif partner == 2 && command == 0 && cmPartnersQuest.nParty==3
  Set inparty to 0
  Set command to 1
  RemoveScriptPackage
  AddScriptPackage "cmWander"
elseif partner == 2 && command == 0 && cmPartnersQuest.nParty==4
  RemoveScriptPackage
  AddScriptPackage "cmEatCommand"
  Set command to 1   
elseif partner == 2 && command == 0 && cmPartnersQuest.nParty==5
  RemoveScriptPackage
  AddScriptPackage "cmDrunk"
  Set command to 1   
elseif partner == 2 && command == 0 && cmPartnersQuest.nParty==6
  RemoveScriptPackage
  AddScriptPackage "cmSleepCommand"
  Set command to 1   
elseif partner == 2 && command == 0 && cmPartnersQuest.nParty==7 && npctype >= 2
  RemoveScriptPackage
  AddScriptPackage "cmHarvestCommand"
  Set command to 1
elseif partner == 2 && command == 0 && cmPartnersQuest.nParty==8
  RemoveScriptPackage
  AddScriptPackage "cmMeleeCommand"
  Set command to 1   
elseif partner == 2 && command == 0 && cmPartnersQuest.nParty==9
  RemoveScriptPackage
  AddScriptPackage "cmCastAnyCommand"
  Set command to 1 
elseif partner == 2 && command == 0 && cmPartnersQuest.nParty==10
  RemoveScriptPackage
  AddScriptPackage "cmAttackNPCCommand"
  Set command to 1   
elseif partner == 2 && command == 0 && cmPartnersQuest.nParty==11
  RemoveScriptPackage
  AddScriptPackage "cmAttackMonsterCommand"
  Set command to 1 
elseif partner == 2 && command == 0 && cmPartnersQuest.nParty==12
  RemoveScriptPackage
  AddScriptPackage "cmFollowPlayer"
  Set command to 1 
elseif partner == 2 && command == 1 && cmPartnersQuest.nParty==0
  Set command to 0
elseif partner == 1
  Set inparty to 0 
endif
 
if torch == 0 && IsActorUsingATorch == 0 && cmPartnersQuest.nTorch == 1 && IsSneaking == 0
  AddItem cmTorch02 1
  EquipItem cmTorch02
  Set torch to 1
elseif torch == 1 && cmPartnersQuest.nTorch == 0
  RemoveItem cmTorch02 1
  Set torch to 0
elseif torch == 1 && IsSneaking == 1
  RemoveItem cmTorch02 1
  Set torch to 0 
endif
 
 
; TRAINING - Time-delayed levelup scripting
 
Set npclevel to GetLevel
Set pclevel to Player.GetLevel
Set leveldiff to ( pclevel - npclevel )
 
if follow == 1 && train == 0 && leveldiff >= 2
  Set train to 1   
endif
 
if follow == 1 && train == 1
  Set trainday to GameDay          ; Sets up a Day Counter.
  Set trainhour to GameHour
  if trainhour > 23.5
    Set trainhour to 0
  endif 
  Set traindayspast to 0
  Set traindone to leveldiff
  Set train to 2
endif
 
if follow == 1 && train == 2
  if trainday != GameDay
    if trainhour < GameHour
      Set trainday to GameDay
      Set traindayspast to ( traindayspast + 1 ) ; Day Counter counts the number of daysWhen the number of days equal to the number of training days required, variables are reset to zero and the task can be performed again.
      if traindayspast != traindone    ; If training has not been completed, conduct training.
        Set levelup to 1
      endif
    endif
  endif
endif
 
if follow == 1 && train == 2
  if levelup == 1
 
    Set npclevel to ( npclevel + 1 )
    Set nlevel to npclevel
 
    if nlevel == 2
      SetLevel, 2
    elseif nlevel == 3
      SetLevel, 3
    elseif nlevel == 4
      SetLevel, 4
    elseif nlevel == 5
      SetLevel, 5
    elseif nlevel == 6
      SetLevel, 6
    elseif nlevel == 7
      SetLevel, 7
    elseif nlevel == 8
      SetLevel, 8
    elseif nlevel == 9
      SetLevel, 9
    elseif nlevel == 10
      SetLevel, 10
    elseif nlevel == 11
      SetLevel, 11
    elseif nlevel == 12
      SetLevel, 12
    elseif nlevel == 13
      SetLevel, 13
    elseif nlevel == 14
      SetLevel, 14
    elseif nlevel == 15
      SetLevel, 15
    elseif nlevel == 16
      SetLevel, 16
    elseif nlevel == 17
      SetLevel, 17
    elseif nlevel == 18
      SetLevel, 18
    elseif nlevel == 19
      SetLevel, 19
    elseif nlevel == 20
      SetLevel, 20
    elseif nlevel == 21
      SetLevel, 21
    elseif nlevel == 22
      SetLevel, 22
    elseif nlevel == 23
      SetLevel, 23
    elseif nlevel == 24
      SetLevel, 24
    elseif nlevel == 25
      SetLevel, 25
    elseif nlevel == 26
      SetLevel, 26
    elseif nlevel == 27
      SetLevel, 27
    elseif nlevel == 28
      SetLevel, 28
    elseif nlevel == 29
      SetLevel, 29
    elseif nlevel == 30
      SetLevel, 30
    elseif nlevel == 31
      SetLevel, 31
    elseif nlevel == 32
      SetLevel, 32
    elseif nlevel == 33
      SetLevel, 33
    elseif nlevel == 34
      SetLevel, 34   
    elseif nlevel == 35
      SetLevel, 35
    elseif nlevel == 36
      SetLevel, 36
    elseif nlevel == 37
      SetLevel, 37
    elseif nlevel == 38
      SetLevel, 38   
    elseif nlevel == 39
      SetLevel, 39       
    elseif nlevel == 40
      SetLevel, 40
    elseif nlevel == 41
      SetLevel, 41
    elseif nlevel == 42
      SetLevel, 42
    elseif nlevel == 43
      SetLevel, 43
    elseif nlevel == 44
      SetLevel, 44       
    elseif nlevel == 45
      SetLevel, 45
    elseif nlevel == 46
      SetLevel, 46
    elseif nlevel == 47
      SetLevel, 47
    elseif nlevel == 48
      SetLevel, 48
    elseif nlevel == 49
      SetLevel, 49       
    elseif nlevel == 50
      SetLevel, 50
 
    endif
 
    ; NPC Skill Increases
 
    ; Weapons
 
    Set npcweapon to GetWeaponSkillType
    Set pcweapon to Player.GetWeaponSkillType
 
    if npcweapon == 0
      Set npchandtohand to ( npchandtohand + 1 )
    elseif npcweapon == 1
      Set npcblade to ( npcblade + 1 )
    elseif npcweapon == 2
      Set npcblunt to ( npcblunt + 1 )
    elseif npcweapon == 3
      Set npcmarksman to ( npcmarksman + 1 )
    endif
 
    if pcweapon == 0
      Set npchandtohand to ( npchandtohand + 1 )
    elseif pcweapon == 1
      Set npcblade to ( npcblade + 1 )
    elseif pcweapon == 2
      Set npcblunt to ( npcblunt + 1 )
    elseif pcweapon == 3
      Set npcmarksman to ( npcmarksman + 1 )
    endif
 
    ; Armor
 
    Set npcarmor to GetArmorRatingUpperBody
    Set pcarmor to Player.GetArmorRatingUpperBody
 
    if npcarmor == 1
      Set npclightarmor to ( npclightarmor + 1 )
    elseif npcarmor == 2
      Set npcheavyarmor to ( npcheavyarmor + 1 )
    endif
 
    if pcarmor == 1
      Set npclightarmor to ( npclightarmor + 1 )
    elseif pcarmor == 2
      Set npcheavyarmor to ( npcheavyarmor + 1 )
    endif
 
    ; Magic
 
    if npcdestruction >= npcalteration
      if npcdestruction >= npcillusion
        if npcdestruction >= npcconjuration
          if npcdestruction >= npcmysticism
            if npcdestruction >= npcrestoration
              Set npcdestruction to ( npcdestruction + 1 )
            endif
          endif
        endif
      endif
    endif
 
    if npcalteration >= npcdestruction
      if npcalteration >= npcillusion
        if npcalteration >= npcconjuration
          if npcalteration >= npcmysticism
            if npcalteration >= npcrestoration
              Set npcalteration to ( npcalteration + 1 )
            endif
          endif
        endif
      endif
    endif
 
    if npcillusion >= npcalteration
      if npcillusion >= npcdestruction
        if npcillusion >= npcconjuration
          if npcillusion >= npcmysticism
            if npcillusion >= npcrestoration
              Set npcillusion to ( npcillusion + 1 )
            endif
          endif
        endif
      endif
    endif
 
    if npcconjuration >= npcalteration
      if npcconjuration >= npcillusion
        if npcconjuration >= npcdestruction
          if npcconjuration >= npcmysticism
            if npcconjuration > npcrestoration
              Set npcconjuration to ( npcconjuration + 1 )
            endif
          endif
        endif
      endif
    endif
 
    if npcmysticism >= npcalteration
      if npcmysticism >= npcillusion
        if npcmysticism >= npcconjuration
          if npcmysticism >= npcdestruction
            if npcmysticism >= npcrestoration
              Set npcmysticism to ( npcmysticism + 1 )
            endif
          endif
        endif
      endif
    endif
 
    if npcrestoration >= npcalteration
      if npcrestoration >= npcillusion
        if npcrestoration >= npcconjuration
          if npcrestoration >= npcmysticism
            if npcrestoration >= npcdestruction
              Set npcrestoration to ( npcrestoration + 1 )
            endif
          endif
        endif
      endif
    endif
 
    ; Stealth
 
    if npcsneak >= npcacrobatics
      if npcsneak >= npcsecurity
        if npcsneak >= npcblock
          Set npcsneak to ( npcsneak + 1 )
        endif
      endif
    endif
 
    if npcsecurity >= npcacrobatics
      if npcsecurity >= npcsneak
        if npcsecurity >= npcblock
          Set npcsecurity to ( npcsecurity + 1 )
        endif
      endif
    endif
 
    if npcacrobatics >= npcsneak
      if npcacrobatics >= npcsecurity
        if npcacrobatics >= npcblock
          Set npcacrobatics to ( npcacrobatics + 1 )
        endif
      endif
    endif
 
    if npcblock >= npcacrobatics
      if npcblock >= npcsneak
        if npcblock >= npcsecurity
          Set npcblock to ( npcblock + 1 )
        endif
      endif
    endif
 
    ; Attributes
 
    if npctype == 1  ; For Combat NPC's
 
      Set npchealth to ( npchealth + 6 )
      Set npcmagicka to ( npcmagicka + 1 )
 
      Set npcendurance to ( npcendurance + 2 )
      Set npcstrength to ( npcstrength + 2 )
      Set npcathletics to ( npcathletics + 1 )
      Set npcagility to ( npcagility + 1 )
      Set npcspeed to ( npcspeed + 1 )
     
    elseif npctype == 2  ; For Stealth NPC's
 
      Set npchealth to ( npchealth + 4 )
      Set npcmagicka to ( npcmagicka + 2 )
 
      Set npcluck to ( npcluck + 1 )
      Set npcspeed to ( npcspeed + 2 )
      Set npcagility to ( npcagility + 2 )
      Set npcstrength to ( npcstrength + 1 )
      Set npcendurance to ( npcendurance + 1 )
     
    elseif npctype == 3  ; For Magic NPC's  
 
        Set npchealth to ( npchealth + 4 )
        Set npcmagicka to ( npcmagicka + 3 )
 
        Set npcpersonality to ( npcpersonality + 1 )
        Set npcwillpower to ( npcwillpower + 2 )
        Set npcintelligence to ( npcintelligence + 2 )
        Set npcspeed to ( npcspeed + 1 )
        Set npcstrength to ( npcstrength + 1 )     
     
    endif
 
    SetActorValue Strength, npcstrength
    SetActorValue Willpower, npcwillpower
    SetActorValue Intelligence, npcintelligence
    SetActorValue Agility, npcagility
    SetActorValue Endurance, npcendurance
    SetActorValue Personality, npcpersonality
    SetActorValue Luck, npcluck
    SetActorValue Speed, npcspeed
    SetActorValue Athletics, npcathletics
 
    SetActorValue Health, npchealth
    SetActorValue Magicka, npcmagicka
    SetActorValue Fatigue, npcfatigue
 
    SetActorValue HandtoHand, npchandtohand
    SetActorValue Blade, npcblade
    SetActorValue Blunt, npcblunt
    SetActorValue Marksman, npcmarksman
 
    SetActorValue LightArmor, npclightarmor
    SetActorValue HeavyArmor, npcheavyarmor
 
    SetActorValue Destruction, npcdestruction
    SetActorValue Alteration, npcalteration
    SetActorValue Illusion, npcillusion
    SetActorValue Conjuration, npcconjuration
    SetActorValue Mysticism, npcmysticism
    SetActorValue Restoration, npcrestoration
 
    SetActorValue Sneak, npcsneak
    SetActorValue Security, npcsecurity
    SetActorValue Acrobatics, 100
    SetActorValue Block, npcblock
 
    Set pclevel to Player.GetLevel
    Set leveldiff to ( pclevel - npclevel )
 
    Set levelreport to 1
    Message "Your partner has gained a new level." 10
 
    if nlevel >= 50    ; Check to see if NPC has reached highest level.  
      Set trainday to 0
      Set traindayspast to 0
      Set trainhour to 0
      Set traindone to 0
      Set train to 4
      Set levelup to 2
      Set levelreport to 2
      Message "Your partner has become a master and no longer needs training," 10     
 
    elseif leveldiff < 2 ; Check to see if we need to continue training.
      Set trainday to 0
      Set traindayspast to 0
      Set trainhour to 0
      Set traindone to 0
      Set train to 0
      Set levelup to 0
 
    elseif leveldiff >= 2
      Set levelup to 0
    endif
  endif
endif
 
End
 
; AI PACKAGE CONTROLS
 
Begin OnPackageStart "cmInventory"
 
if partner == 2 && IsInCombat != 1
  Set refnpc to GetSelf
  Set regulator to 1
  Set refbox to PlaceAtMe cmPartnersBox 1 0 0
  refbox.SetOwnership
  Set inventory to 1
endif
 
End
 
 
Begin OnPackageStart "cmPickLockContainer"
  SetPackDuration 2
End
 
Begin OnPackageDone "cmPickLockContainer" ; Commands NPC to rejoin Player after lockpicking'
  AddScriptPackage "cmFollowPlayer"
End
 
 
; MENU MODE
 
Begin MenuMode 1009 ; Dialogue Menu - Reset quest and local variables
 
Set cmPartnersQuest.nParty to 0
Set command to 0
Set levelreport to 0 
 
End
 
 
Begin MenuMode 1012  ; SleepWait Menu - Restores health, fatigue, and magicka to NPC when the player waits or sleeps.
 
if follow == 1
  if GetActorValue Health < npchealth
    SetActorValue Health, npchealth
  elseif GetActorValue Fatigue < npcfatigue
    SetActorValue Magicka, npcfatigue   
  elseif GetActorValue Magicka < npcmagicka
    SetActorValue Magicka, npcmagicka
  endif
endif
 
End
 
 
Begin OnReset  ; Resets stats if 72 hour automatic cell refresh resets to default values while player is away.  Not sure if this is necessaryNever tested it.
 
if GetActorValue Acrobatics < 100
 
  SetLevel, npclevel
 
  SetActorValue Strength, npcstrength
  SetActorValue Willpower, npcwillpower
  SetActorValue Intelligence, npcintelligence
  SetActorValue Agility, npcagility
  SetActorValue Endurance, npcendurance
  SetActorValue Personality, npcpersonality
  SetActorValue Luck, npcluck
  SetActorValue Speed, npcspeed
  SetActorValue Athletics, npcathletics
  SetActorValue Health, npchealth
  SetActorValue Magicka, npcmagicka
  SetActorValue Fatigue, npcfatigue
  SetActorValue Blade, npcblade
  SetActorValue Blunt, npcblunt
  SetActorValue Marksman, npcmarksman
  SetActorValue HandtoHand, npchandtohand
  SetActorValue HeavyArmor, npcheavyarmor
  SetActorValue LightArmor, npclightarmor
  SetActorValue Destruction, npcdestruction
  SetActorValue Alteration, npcalteration
  SetActorValue Illusion, npcillusion
  SetActorValue Conjuration, npcconjuration
  SetActorValue Mysticism, npcmysticism
  SetActorValue Restoration, npcrestoration
  SetActorValue Sneak, npcsneak
  SetActorValue Security, npcsecurity
  SetActorValue Acrobatics, 150
  SetActorValue Block, npcblock
 
endif
 
End

Revision as of 14:35, 16 November 2006

This is the CM Partners PartnerMagic script. Their readme gives permission for any and all uses of it, but if anyone from the Cutthroat Mods team should wish me to take it down please contact me and I'll do so at once.

I'd like to adapt this as a creature follow script while keeping some of the great "levelup with PC" and "attack that NPC over there" sorts of options. When I apply it directly to my spider companion critter, however, the critter remains unactivatable by the player. I tried deleting some of the nonapplicable parts, like the things about torch equippage, but it made no difference.

If we could turn this into a functional critter companion script, I'm sure you can all see far more interesting uses for it than just my Arachnalia mod. ;) Any creature companion could be quickly and easily integrated with the CM Partners mod. Imagine the possibilities.

Scriptname PartnerMagic


short package short follow short following short partner short command short inparty short interior short doonce short start short currentday short dayspast short daysdone float timer short timepast short state

short fspeed short fathletics short weaponUse short incombat short isdead short alert ref target

short pcz short npcz short running short sitting short torch short sneaking short Chameleon short invisible short WaterWalking

short npcspeed short npcathletics short npcstrength short npcwillpower short npcintelligence short npcagility short npcendurance short npcpersonality short npcluck short npchealth short npcmagicka short npcfatigue short npcblade short npcblunt short npchandtohand short npcmarksman short npcheavyarmor short npclightarmor short npcblock short npcsneak short npcacrobatics short npcsecurity short npcmysticism short npcconjuration short npcillusion short npcalteration short npcdestruction short npcrestoration

short setupdoonce short npctype short nlevel short npclevel short pclevel short leveldiff  ; Defined as ( pclevel - npclevel ) short levelup short levelreport short npcweapon short pcweapon short npcarmor short pcarmor short train short trainday short trainhour short traindayspast short traindone

short inventory short regulator ref refnpc ref refbox


Begin OnLoad

Set partner to GetFactionRank Partners Set npclevel to GetLevel Set pclevel to Player.GetLevel

End

Begin OnDeath  ;

if GetActorValue Health <= 0 && isdead == 0

 Set isdead to 1 
 Set timepast to 1   
 if inparty == 1 
   Message, "Your partner is dead." 
 endif 

endif

End

Begin OnActivate ; Sets Quest variables when Dialogue is activated. This allows every Partner NPC to use the Quest dialogue as their own.

 Set cmPartnersQuest.nType to npctype 
 Set cmPartnersQuest.nLevelup to levelreport 
 Set cmPartnersQuest.nInParty to inparty 
 Set cmPartnersQuest.nLeveldiff to leveldiff 
  
 if Player.IsSneaking == 1 && partner == 2  ; Only activates Dialogue if Player is not sneaking. 
   Return 
 else 
  Activate 
 endif 

End


Begin GameMode  ; Normal game scripting run in non-menu mode.

INITIAL SETUP - Sets all starting values for variables and adds topics and spells..

if setupdoonce == 0

NPC type denotes the NPC's specialized class, is used for levelup, and has the following values
1 -> Combat specialized class
2 -> Stealth specialized class
3 -> Magic specialized class
 Set npctype to 3 
 Set partner to GetFactionRank Partners 
 Set npclevel to GetLevel 
 Set pclevel to Player.GetLevel 
 Set leveldiff to ( pclevel - npclevel ) 
 Set npchealth to ( GetBaseActorValue Health ) 
 Set npcmagicka to ( GetBaseActorValue Magicka ) 
 Set npcfatigue to ( GetBaseActorValue Fatigue ) 
 Set npcstrength to ( GetBaseActorValue Strength ) 
 Set npcintelligence to ( GetBaseActorValue Intelligence ) 
 Set npcwillpower to ( GetBaseActorValue Willpower ) 
 Set npcagility to ( GetBaseActorValue Agility ) 
 Set npcendurance to ( GetBaseActorValue Endurance ) 
 Set npcpersonality to ( GetBaseActorValue Personality ) 
 Set npcluck to ( GetBaseActorValue Luck ) 
 Set npcspeed to ( GetBaseActorValue Speed ) 
 Set npcathletics to ( GetBaseActorValue Athletics ) 
 Set npcblade to ( GetBaseActorValue Blade ) 
 Set npcmarksman to ( GetBaseActorValue Marksman ) 
 Set npcblunt to ( GetBaseActorValue Blunt ) 
 Set npchandtohand to ( GetBaseActorValue HandtoHand ) 
 Set npclightarmor to ( GetBaseActorValue LightArmor ) 
 Set npcheavyarmor to ( GetBaseActorValue HeavyArmor ) 
 Set npcacrobatics to ( GetBaseActorValue Acrobatics ) 
 Set npcsneak to ( GetBaseActorValue Sneak ) 
 Set npcsecurity to ( GetBaseActorValue Security ) 
 Set npcblock to ( GetBaseActorValue Block ) 
 Set npcmysticism to ( GetBaseActorValue Mysticism ) 
 Set npcconjuration to ( GetBaseActorValue Conjuration ) 
 Set npcillusion to ( GetBaseActorValue Illusion) 
 Set npcalteration to ( GetBaseActorValue Alteration ) 
 Set npcdestruction to ( GetBaseActorValue Destruction ) 
 Set npcrestoration to ( GetBaseActorValue Restoration ) 
 AddSpell "cmWaterBreathingA" 
 SetActorValue Acrobatics, 100 
 AddTopic cmxAbilities 
 AddTopic cmJoinMe 
  
 if npctype == 3 
   AddSpell "cmHealPlayer" 
   AddSpell "cmRestoreHealth" 
 endif 
  
 Set setupdoonce to 1 
  

endif

if timepast == 1  ; Removes the body after 90 seconds if the Partner NPC dies.

 Set timer to ( timer + GetSecondsPassed ) 
 If timer > 90 
   Set timepast to 2 
   Set isdead to 2 
   Disable 
 endif   

endif

if isdead == 2  ; Terminates script if Partner NPC dies.

   Return 

endif

Set package to GetCurrentAIPackage  ; Sets main variables to use as conditions for the rest of the scripting Set follow to GetCurrentAIPackage == 1 Set partner to GetFactionRank "Partners"

if inparty == 1 && package == 13

 Set inparty to 0 

elseif inparty == 0 && follow == 1

 Set inparty to 1 

endif

FOLLOW MODE - Sets all the follow variables to define how the NPC follows the Player.

if follow == 1 && following == 0

 Set inparty to 1 
 Set fspeed to ( Player.GetActorValue Speed * 2.25 ) 
 Set fathletics to ( Player.GetActorValue Athletics * 2.25 ) 
 SetActorValue Speed, fspeed 
 SetActorValue Athletics, fathletics 
 SetIgnoreFriendlyHits 7 
 Set following to 1   

elseif follow != 1 && following == 1

 SetActorValue Speed, npcspeed 
 SetActorValue Athletics, npcathletics 
 SetIgnoreFriendlyHits 3 
 Set following to 0 

endif

if follow == 1 && incombat == 0

 Set pcz to Player.GetPos z 
 Set npcz to GetPos z 

elseif follow != 1 && incombat == 0

 Set npcz to GetPos z 

endif

if follow == 1  ; Scripting in this block commands the NPC to follow the Player in many different ways.

 if pcz > ( npcz + 400 ) 
   MoveTo Player 
 elseif pcz < ( npcz - 400 ) 
   MoveTo Player 
 endif 
 if GetDistance Player > 1024 && incombat == 0 
   MoveTo Player 
 endif 
 if IsInCombat == 1 
   Set incombat to 1 
 else 
   Set incombat to 0 
 endif 
 if incombat == 1    ; Prevents combat between Partner NPC's.. 
   Set target to GetCombatTarget 
   if target == Player 
     Yield 
     Return 
   elseif target.GetInFaction Partners 
     Yield 
     Return 
   endif 
 endif 
  
 if alert == 0 && Player.IsWeaponOut == 1 
   SetAlert 1 
   Set alert to 1 
 elseif alert == 1 && Player.IsWeaponOut == 0 
   SetAlert 0 
   Set alert to 0 
 endif 
 if sneaking == 0 && Player.IsSneaking == 1 
   SetForceSneak 1 
   Set sneaking to 1 
 elseif sneaking == 1 && Player.IsSneaking == 0 
   SetForceSneak 0 
   Set sneaking to 0 
 endif 
 if Chameleon == 0 && Player.HasMagicEffect CHML == 1 
   AddSpell "cmChameleonA" 
   Set Chameleon to 1 
 elseif Chameleon == 1 && Player.HasMagicEffect CHML == 0 
   RemoveSpell "cmChameleonA" 
   Set Chameleon to 0 
 endif 
 if invisible == 0 && Player.HasMagicEffect INVI == 1 
   AddSpell "cmInvisibilityA" 
   Set invisible to 1 
 elseif invisible == 1 && Player.HasMagicEffect INVI == 0 
   RemoveSpell "cmInvisibilityA" 
   Set invisible to 0 
 endif 
 if running == 0 && Player.IsRunning == 1 
   SetForceRun 1 
   Set running to 1 
 elseif running == 1 && Player.IsRunning == 0 
   SetForceRun 0 
   Set running to 0 
 endif 
 if WaterWalking == 0 && Player.HasMagicEffect WAWA == 1 
   AddSpell "cmWaterWalkingA" 
   Set WaterWalking to 1 
 elseif WaterWalking == 1 && Player.HasMagicEffect WAWA == 0 
   RemoveSpell "cmWaterWalkingA" 
   Set WaterWalking to 0 
 endif 
 if npctype == 3 && cmPartnersQuest.nHeal == 1 ; Cast Party Heal spell. 
   AddSpell "cmHealParty" 
   Cast cmHealParty Player 
   RemoveSpell "cmHealParty" 
   Set cmPartnersQuest.nHeal to 0 
 endif 
  
 if sitting == 0 && Player.GetSitting == 3 
   AddScriptPackage "cmSitScript" 
   Set sitting to 1 
 endif   
  

endif

if sitting == 1 && Player.GetSitting == 0  ; Forces NPC to rejoin Player after sitting package is complete.

 RemoveScriptPackage 
 AddScriptPackage "cmFollowPlayer" 
 Set sitting to 0 

endif

INVENTORY MODE - Inventory scripting which is a modified Toaster script.

if inventory == 1 && follow == 1

 if regulator == 3 
   AddItem cmTorch02 1 
   EquipItem cmTorch02 
   RemoveItem cmTorch02 1 
   Set regulator to 4 
   RemoveScriptPackage "cmInventory" 
   AddScriptPackage "cmFollowPlayer" 
   Set inventory to 0 
 endif 
 if regulator == 2 && MenuMode == 0 
   Set regulator to 3 
   refbox.RemoveAllItems refnpc 
   refbox.Disable 
 endif 
 if regulator == 1 
   RemoveAllItems refbox 
   refbox.Activate Player 
   Set regulator to 2 
 endif 
  

endif


PARTY COMMANDS - Reads Quest variable nParty and executes party commands for NPC.

if partner == 2 && command == 0 && cmPartnersQuest.nParty==1 && inparty == 1

 Set command to 1 
 RemoveScriptPackage 
 AddScriptPackage "cmFollowPlayer" 

elseif partner == 2 && command == 0 && cmPartnersQuest.nParty==2

 Set inparty to 0 
 Set command to 1 
 RemoveScriptPackage 
 AddScriptPackage "cmStandGuard" 

elseif partner == 2 && command == 0 && cmPartnersQuest.nParty==3

 Set inparty to 0 
 Set command to 1 
 RemoveScriptPackage 
 AddScriptPackage "cmWander" 

elseif partner == 2 && command == 0 && cmPartnersQuest.nParty==4

 RemoveScriptPackage 
 AddScriptPackage "cmEatCommand" 
 Set command to 1     

elseif partner == 2 && command == 0 && cmPartnersQuest.nParty==5

 RemoveScriptPackage 
 AddScriptPackage "cmDrunk" 
 Set command to 1     

elseif partner == 2 && command == 0 && cmPartnersQuest.nParty==6

 RemoveScriptPackage 
 AddScriptPackage "cmSleepCommand" 
 Set command to 1     

elseif partner == 2 && command == 0 && cmPartnersQuest.nParty==7 && npctype >= 2

 RemoveScriptPackage 
 AddScriptPackage "cmHarvestCommand" 
 Set command to 1 

elseif partner == 2 && command == 0 && cmPartnersQuest.nParty==8

 RemoveScriptPackage 
 AddScriptPackage "cmMeleeCommand" 
 Set command to 1     

elseif partner == 2 && command == 0 && cmPartnersQuest.nParty==9

 RemoveScriptPackage 
 AddScriptPackage "cmCastAnyCommand" 
 Set command to 1   

elseif partner == 2 && command == 0 && cmPartnersQuest.nParty==10

 RemoveScriptPackage 
 AddScriptPackage "cmAttackNPCCommand" 
 Set command to 1     

elseif partner == 2 && command == 0 && cmPartnersQuest.nParty==11

 RemoveScriptPackage 
 AddScriptPackage "cmAttackMonsterCommand" 
 Set command to 1   

elseif partner == 2 && command == 0 && cmPartnersQuest.nParty==12

 RemoveScriptPackage 
 AddScriptPackage "cmFollowPlayer" 
 Set command to 1   

elseif partner == 2 && command == 1 && cmPartnersQuest.nParty==0

 Set command to 0 

elseif partner == 1

 Set inparty to 0   

endif

if torch == 0 && IsActorUsingATorch == 0 && cmPartnersQuest.nTorch == 1 && IsSneaking == 0

 AddItem cmTorch02 1 
 EquipItem cmTorch02 
 Set torch to 1 

elseif torch == 1 && cmPartnersQuest.nTorch == 0

 RemoveItem cmTorch02 1 
 Set torch to 0 

elseif torch == 1 && IsSneaking == 1

 RemoveItem cmTorch02 1 
 Set torch to 0   

endif


TRAINING - Time-delayed levelup scripting

Set npclevel to GetLevel Set pclevel to Player.GetLevel Set leveldiff to ( pclevel - npclevel )

if follow == 1 && train == 0 && leveldiff >= 2

 Set train to 1     

endif

if follow == 1 && train == 1

 Set trainday to GameDay           ; Sets up a Day Counter. 
 Set trainhour to GameHour 
 if trainhour > 23.5 
   Set trainhour to 0 
 endif   
 Set traindayspast to 0 
 Set traindone to leveldiff 
 Set train to 2 

endif

if follow == 1 && train == 2

 if trainday != GameDay 
   if trainhour < GameHour 
     Set trainday to GameDay 
     Set traindayspast to ( traindayspast + 1 )  ; Day Counter counts the number of days.  When the number of days equal to the number of training days required, variables are reset to zero and the task can be performed again. 
     if traindayspast != traindone     ; If training has not been completed, conduct training. 
       Set levelup to 1 
     endif 
   endif 
 endif 

endif

if follow == 1 && train == 2

 if levelup == 1 
   Set npclevel to ( npclevel + 1 ) 
   Set nlevel to npclevel 
   if nlevel == 2 
     SetLevel, 2 
   elseif nlevel == 3 
     SetLevel, 3 
   elseif nlevel == 4 
     SetLevel, 4 
   elseif nlevel == 5 
     SetLevel, 5 
   elseif nlevel == 6 
     SetLevel, 6 
   elseif nlevel == 7 
     SetLevel, 7 
   elseif nlevel == 8 
     SetLevel, 8 
   elseif nlevel == 9 
     SetLevel, 9 
   elseif nlevel == 10 
     SetLevel, 10 
   elseif nlevel == 11 
     SetLevel, 11 
   elseif nlevel == 12 
     SetLevel, 12 
   elseif nlevel == 13 
     SetLevel, 13 
   elseif nlevel == 14 
     SetLevel, 14 
   elseif nlevel == 15 
     SetLevel, 15 
   elseif nlevel == 16 
     SetLevel, 16 
   elseif nlevel == 17 
     SetLevel, 17 
   elseif nlevel == 18 
     SetLevel, 18 
   elseif nlevel == 19 
     SetLevel, 19 
   elseif nlevel == 20 
     SetLevel, 20 
   elseif nlevel == 21 
     SetLevel, 21 
   elseif nlevel == 22 
     SetLevel, 22 
   elseif nlevel == 23 
     SetLevel, 23 
   elseif nlevel == 24 
     SetLevel, 24 
   elseif nlevel == 25 
     SetLevel, 25 
   elseif nlevel == 26 
     SetLevel, 26 
   elseif nlevel == 27 
     SetLevel, 27 
   elseif nlevel == 28 
     SetLevel, 28 
   elseif nlevel == 29 
     SetLevel, 29 
   elseif nlevel == 30 
     SetLevel, 30 
   elseif nlevel == 31 
     SetLevel, 31 
   elseif nlevel == 32 
     SetLevel, 32 
   elseif nlevel == 33 
     SetLevel, 33 
   elseif nlevel == 34 
     SetLevel, 34     
   elseif nlevel == 35 
     SetLevel, 35 
   elseif nlevel == 36 
     SetLevel, 36 
   elseif nlevel == 37 
     SetLevel, 37 
   elseif nlevel == 38 
     SetLevel, 38     
   elseif nlevel == 39 
     SetLevel, 39         
   elseif nlevel == 40 
     SetLevel, 40 
   elseif nlevel == 41 
     SetLevel, 41 
   elseif nlevel == 42 
     SetLevel, 42 
   elseif nlevel == 43 
     SetLevel, 43 
   elseif nlevel == 44 
     SetLevel, 44         
   elseif nlevel == 45 
     SetLevel, 45 
   elseif nlevel == 46 
     SetLevel, 46 
   elseif nlevel == 47 
     SetLevel, 47 
   elseif nlevel == 48 
     SetLevel, 48 
   elseif nlevel == 49 
     SetLevel, 49         
   elseif nlevel == 50 
     SetLevel, 50 
   endif 
   ; NPC Skill Increases 
   ; Weapons 
   Set npcweapon to GetWeaponSkillType 
   Set pcweapon to Player.GetWeaponSkillType 
   if npcweapon == 0 
     Set npchandtohand to ( npchandtohand + 1 ) 
   elseif npcweapon == 1 
     Set npcblade to ( npcblade + 1 ) 
   elseif npcweapon == 2 
     Set npcblunt to ( npcblunt + 1 ) 
   elseif npcweapon == 3 
     Set npcmarksman to ( npcmarksman + 1 ) 
   endif 
   if pcweapon == 0 
     Set npchandtohand to ( npchandtohand + 1 ) 
   elseif pcweapon == 1 
     Set npcblade to ( npcblade + 1 ) 
   elseif pcweapon == 2 
     Set npcblunt to ( npcblunt + 1 ) 
   elseif pcweapon == 3 
     Set npcmarksman to ( npcmarksman + 1 ) 
   endif 
   ; Armor 
   Set npcarmor to GetArmorRatingUpperBody 
   Set pcarmor to Player.GetArmorRatingUpperBody 
   if npcarmor == 1 
     Set npclightarmor to ( npclightarmor + 1 ) 
   elseif npcarmor == 2 
     Set npcheavyarmor to ( npcheavyarmor + 1 ) 
   endif 
   if pcarmor == 1 
     Set npclightarmor to ( npclightarmor + 1 ) 
   elseif pcarmor == 2 
     Set npcheavyarmor to ( npcheavyarmor + 1 ) 
   endif 
   ; Magic 
   if npcdestruction >= npcalteration 
     if npcdestruction >= npcillusion 
       if npcdestruction >= npcconjuration 
         if npcdestruction >= npcmysticism 
           if npcdestruction >= npcrestoration 
             Set npcdestruction to ( npcdestruction + 1 ) 
           endif 
         endif 
       endif 
     endif 
   endif 
   if npcalteration >= npcdestruction 
     if npcalteration >= npcillusion 
       if npcalteration >= npcconjuration 
         if npcalteration >= npcmysticism 
           if npcalteration >= npcrestoration 
             Set npcalteration to ( npcalteration + 1 ) 
           endif 
         endif 
       endif 
     endif 
   endif 
   if npcillusion >= npcalteration 
     if npcillusion >= npcdestruction 
       if npcillusion >= npcconjuration 
         if npcillusion >= npcmysticism 
           if npcillusion >= npcrestoration 
             Set npcillusion to ( npcillusion + 1 ) 
           endif 
         endif 
       endif 
     endif 
   endif 
   if npcconjuration >= npcalteration 
     if npcconjuration >= npcillusion 
       if npcconjuration >= npcdestruction 
         if npcconjuration >= npcmysticism 
           if npcconjuration > npcrestoration 
             Set npcconjuration to ( npcconjuration + 1 ) 
           endif 
         endif 
       endif 
     endif 
   endif 
   if npcmysticism >= npcalteration 
     if npcmysticism >= npcillusion 
       if npcmysticism >= npcconjuration 
         if npcmysticism >= npcdestruction 
           if npcmysticism >= npcrestoration 
             Set npcmysticism to ( npcmysticism + 1 ) 
           endif 
         endif 
       endif 
     endif 
   endif 
   if npcrestoration >= npcalteration 
     if npcrestoration >= npcillusion 
       if npcrestoration >= npcconjuration 
         if npcrestoration >= npcmysticism 
           if npcrestoration >= npcdestruction 
             Set npcrestoration to ( npcrestoration + 1 ) 
           endif 
         endif 
       endif 
     endif 
   endif 
   ; Stealth 
   if npcsneak >= npcacrobatics 
     if npcsneak >= npcsecurity 
       if npcsneak >= npcblock 
         Set npcsneak to ( npcsneak + 1 ) 
       endif 
     endif 
   endif 
   if npcsecurity >= npcacrobatics 
     if npcsecurity >= npcsneak 
       if npcsecurity >= npcblock 
         Set npcsecurity to ( npcsecurity + 1 ) 
       endif 
     endif 
   endif 
   if npcacrobatics >= npcsneak 
     if npcacrobatics >= npcsecurity 
       if npcacrobatics >= npcblock 
         Set npcacrobatics to ( npcacrobatics + 1 ) 
       endif 
     endif 
   endif 
   if npcblock >= npcacrobatics 
     if npcblock >= npcsneak 
       if npcblock >= npcsecurity 
         Set npcblock to ( npcblock + 1 ) 
       endif 
     endif 
   endif 
   ; Attributes 
   if npctype == 1  ; For Combat NPC's 
     Set npchealth to ( npchealth + 6 ) 
     Set npcmagicka to ( npcmagicka + 1 ) 
     Set npcendurance to ( npcendurance + 2 ) 
     Set npcstrength to ( npcstrength + 2 ) 
     Set npcathletics to ( npcathletics + 1 ) 
     Set npcagility to ( npcagility + 1 ) 
     Set npcspeed to ( npcspeed + 1 ) 
      
   elseif npctype == 2  ; For Stealth NPC's 
     Set npchealth to ( npchealth + 4 ) 
     Set npcmagicka to ( npcmagicka + 2 ) 
     Set npcluck to ( npcluck + 1 ) 
     Set npcspeed to ( npcspeed + 2 ) 
     Set npcagility to ( npcagility + 2 ) 
     Set npcstrength to ( npcstrength + 1 ) 
     Set npcendurance to ( npcendurance + 1 ) 
      
   elseif npctype == 3  ; For Magic NPC's 
       Set npchealth to ( npchealth + 4 ) 
       Set npcmagicka to ( npcmagicka + 3 ) 
       Set npcpersonality to ( npcpersonality + 1 ) 
       Set npcwillpower to ( npcwillpower + 2 ) 
       Set npcintelligence to ( npcintelligence + 2 ) 
       Set npcspeed to ( npcspeed + 1 ) 
       Set npcstrength to ( npcstrength + 1 )       
      
   endif 
   SetActorValue Strength, npcstrength 
   SetActorValue Willpower, npcwillpower 
   SetActorValue Intelligence, npcintelligence 
   SetActorValue Agility, npcagility 
   SetActorValue Endurance, npcendurance 
   SetActorValue Personality, npcpersonality 
   SetActorValue Luck, npcluck 
   SetActorValue Speed, npcspeed 
   SetActorValue Athletics, npcathletics 
   SetActorValue Health, npchealth 
   SetActorValue Magicka, npcmagicka 
   SetActorValue Fatigue, npcfatigue 
   SetActorValue HandtoHand, npchandtohand 
   SetActorValue Blade, npcblade 
   SetActorValue Blunt, npcblunt 
   SetActorValue Marksman, npcmarksman 
   SetActorValue LightArmor, npclightarmor 
   SetActorValue HeavyArmor, npcheavyarmor 
   SetActorValue Destruction, npcdestruction 
   SetActorValue Alteration, npcalteration 
   SetActorValue Illusion, npcillusion 
   SetActorValue Conjuration, npcconjuration 
   SetActorValue Mysticism, npcmysticism 
   SetActorValue Restoration, npcrestoration 
   SetActorValue Sneak, npcsneak 
   SetActorValue Security, npcsecurity 
   SetActorValue Acrobatics, 100 
   SetActorValue Block, npcblock 
   Set pclevel to Player.GetLevel 
   Set leveldiff to ( pclevel - npclevel ) 
   Set levelreport to 1 
   Message "Your partner has gained a new level." 10 
   if nlevel >= 50     ; Check to see if NPC has reached highest level. 
     Set trainday to 0 
     Set traindayspast to 0 
     Set trainhour to 0 
     Set traindone to 0 
     Set train to 4 
     Set levelup to 2 
     Set levelreport to 2 
     Message "Your partner has become a master and no longer needs training," 10       
   elseif leveldiff < 2 ; Check to see if we need to continue training. 
     Set trainday to 0 
     Set traindayspast to 0 
     Set trainhour to 0 
     Set traindone to 0 
     Set train to 0 
     Set levelup to 0 
   elseif leveldiff >= 2 
     Set levelup to 0 
   endif 
 endif 

endif

End

AI PACKAGE CONTROLS

Begin OnPackageStart "cmInventory"

if partner == 2 && IsInCombat != 1

 Set refnpc to GetSelf 
 Set regulator to 1 
 Set refbox to PlaceAtMe cmPartnersBox 1 0 0 
 refbox.SetOwnership 
 Set inventory to 1 

endif

End


Begin OnPackageStart "cmPickLockContainer"

 SetPackDuration 2 

End

Begin OnPackageDone "cmPickLockContainer" ; Commands NPC to rejoin Player after lockpicking'

 AddScriptPackage "cmFollowPlayer" 

End


MENU MODE

Begin MenuMode 1009 ; Dialogue Menu - Reset quest and local variables

Set cmPartnersQuest.nParty to 0 Set command to 0 Set levelreport to 0

End


Begin MenuMode 1012  ; SleepWait Menu - Restores health, fatigue, and magicka to NPC when the player waits or sleeps.

if follow == 1

 if GetActorValue Health < npchealth 
   SetActorValue Health, npchealth 
 elseif GetActorValue Fatigue < npcfatigue 
   SetActorValue Magicka, npcfatigue     
 elseif GetActorValue Magicka < npcmagicka 
   SetActorValue Magicka, npcmagicka 
 endif 

endif

End


Begin OnReset  ; Resets stats if 72 hour automatic cell refresh resets to default values while player is away. Not sure if this is necessary. Never tested it.

if GetActorValue Acrobatics < 100

 SetLevel, npclevel 
  
 SetActorValue Strength, npcstrength 
 SetActorValue Willpower, npcwillpower 
 SetActorValue Intelligence, npcintelligence 
 SetActorValue Agility, npcagility 
 SetActorValue Endurance, npcendurance 
 SetActorValue Personality, npcpersonality 
 SetActorValue Luck, npcluck 
 SetActorValue Speed, npcspeed 
 SetActorValue Athletics, npcathletics 
 SetActorValue Health, npchealth 
 SetActorValue Magicka, npcmagicka 
 SetActorValue Fatigue, npcfatigue 
 SetActorValue Blade, npcblade 
 SetActorValue Blunt, npcblunt 
 SetActorValue Marksman, npcmarksman 
 SetActorValue HandtoHand, npchandtohand 
 SetActorValue HeavyArmor, npcheavyarmor 
 SetActorValue LightArmor, npclightarmor 
 SetActorValue Destruction, npcdestruction 
 SetActorValue Alteration, npcalteration 
 SetActorValue Illusion, npcillusion 
 SetActorValue Conjuration, npcconjuration 
 SetActorValue Mysticism, npcmysticism 
 SetActorValue Restoration, npcrestoration 
 SetActorValue Sneak, npcsneak 
 SetActorValue Security, npcsecurity 
 SetActorValue Acrobatics, 150 
 SetActorValue Block, npcblock 
  

endif

End