enderalse/source/scripts/_00e_fs_sleightofhand_hiddenslotsc.psc

282 lines
7.5 KiB
Plaintext

Scriptname _00E_FS_SleightOfHand_HiddenSlotSC extends ObjectReference
; This script sets up the sleight of hand loot of a chest upon activating it
;=====================================================================================
; EVENTS
;=====================================================================================
Event OnActivate(ObjectReference akActionRef)
If _00E_FS_IsForgottenStoriesActivated.GetValueInt() == 1 && !Self.IsLocked() && akActionRef == PlayerREF
If !bSetUp
SetUpHiddenSlot()
EndIf
Utility.Wait(0.5)
If bFoundTreasure && !bDone
OpenHiddenSlot()
EndIf
EndIf
EndEvent
Event OnMenuClose(String MenuName)
containterToFill.RemoveAllItems(Self as ObjectReference, true, false)
UnregisterForMenu("ContainerMenu")
EndEvent
;=====================================================================================
; FUNCTIONS
;=====================================================================================
Function OpenHiddenSlot()
bDone = True
UILockpickingCylinderTurnM.Play(PlayerREF)
messageToShow.Show()
If bOwned
containterToFill.SetFactionOwner(SleightOfHandOwnerFaction)
Else
containterToFill.SetFactionOwner(none)
Endif
RegisterForMenu("ContainerMenu")
containterToFill.Activate(PlayerREF, True)
If sTreasureSize == "Big"
UIEnchantingLearnEffectM.Play(PlayerREF)
Levelsystem.GiveEP(iRewardEXPBigSlot)
If _00E_HiddenSlotAchievementUnlocked.GetValueInt() == 0 && _00E_AchievementsEnabled.GetValueInt() == 1
_00E_HiddenSlotAchievementUnlocked.SetValueInt(1)
Steam.UnlockAchievement("END_HIDDEN_SLOT_01")
EndIf
EndIf
EndFunction
Function SetUpHiddenSlot()
bSetUp = True
if DoesContainerHaveHiddenSlot()
bFoundTreasure = True
sTreasureSize = GetSlotSize()
iHiddenSlotTier = GetHiddenSlotTier()
iFormlistIndexOffset = 8*(iHiddenSlotTier - 1)
iFormlistIndex
if sTreasureSize == "Small"
containterToFill = _00E_FS_SleightOfHand_HiddenSlot_SmallSlotREF
iFormlistIndex = Utility.RandomInt(0, 2) + iFormlistIndexOffset
Elseif sTreasureSize == "Medium"
containterToFill = _00E_FS_SleightOfHand_HiddenSlot_MediumSlotREF
iFormlistIndex = Utility.RandomInt(3, 5) + iFormlistIndexOffset
Elseif sTreasureSize == "Big"
containterToFill = _00E_FS_SleightOfHand_HiddenSlot_BigSlotREF
iFormlistIndex = Utility.RandomInt(6, 7) + iFormlistIndexOffset
EndIf
bOwned = GetOwner()
hiddenSlotFormlist = _00E_FS_HiddenSlotRewardFormlists.GetAt(iFormlistIndex) as Formlist
AddItemsToContainer(hiddenSlotFormlist)
EndIf
EndFunction
Function AddItemsToContainer(Formlist itemsToAdd)
containterToFill.RemoveAllItems()
if sTreasureSize == "Big"
if !(itemsToAdd.HasForm(_00E_FS_SleightOfHand_HiddenSlotUsedMarker))
itemsToAdd.AddForm(_00E_FS_SleightOfHand_HiddenSlotUsedMarker)
Else
iFormlistIndex = Utility.RandomInt(3, 5) + iFormlistIndexOffset
itemsToAdd = _00E_FS_HiddenSlotRewardFormlists.GetAt(iFormlistIndex) as Formlist
messageToShow = _00E_FS_SleightOfHand_HiddenSlot_sMediumSlotFound
EndIf
EndIf
int iIndex = itemsToAdd.GetSize() - 1
while iIndex >= 0
Form formToAdd = itemsToAdd.GetAt(iIndex)
if formToAdd == Gold001
containterToFill.AddItem(itemsToAdd.GetAt(iIndex), iHiddenSlotTier*5)
Else
containterToFill.AddItem(itemsToAdd.GetAt(iIndex), 1)
EndIf
iIndex -= 1
endwhile
EndFunction
bool Function DoesContainerHaveHiddenSlot()
float fHiddenSlotChance = Utility.RandomInt(0, 100)
iPlayerPickpocketSkill = PlayerREF.GetActorValue("Pickpocket") as Int
; raised the divider from 2 to 2.5, maybe we should raise it even further
; otherwise too much loot might be given away
float fPlayerChance = iPlayerPickpocketSkill/2.5
If fPlayerChance < 15
fPlayerChance = 15
EndIf
If fHiddenSlotChance <= fPlayerChance
Return True
Else
Return False
EndIf
EndFunction
int Function GetHiddenSlotTier()
iPlayerLevel = PlayerLevel.GetValueInt()
if iPlayerLevel >= iTierCap_1 && iPlayerLevel < iTierCap_2
Return 1
Elseif iPlayerLevel >= iTierCap_2 && iPlayerLevel < iTierCap_3
Return 2
Elseif iPlayerLevel >= iTierCap_3 && iPlayerLevel < iTierCap_4
Return 3
Elseif iPlayerLevel >= iTierCap_4 && iPlayerLevel < iTierCap_5
Return 4
Else
Return 5
EndIf
EndFunction
string Function GetSlotSize()
; This calculates whether the hidden slot will be filled with a small, a regular, or a rare reward
int iSlotSize = Utility.RandomInt(1, 100)
if iSlotSize <= iBigSlotChance && PlayerREF.GetAV("Pickpocket") >= 75
messageToShow = _00E_FS_SleightOfHand_HiddenSlot_sBigSlotFound
Return "Big"
Elseif (iSlotSize > iBigSlotChance) && (iSlotSize <= (iMediumSlotChance + iBigSlotChance)) && PlayerREF.GetAV("Pickpocket") >= 50
messageToShow = _00E_FS_SleightOfHand_HiddenSlot_sMediumSlotFound
Return "Medium"
Else
messageToShow = _00E_FS_SleightOfHand_HiddenSlot_sSmallSlotFound
Return "Small"
EndIf
EndFunction
bool Function GetOwner()
ContainerParentCell = Self.GetParentCell()
If Self.GetActorOwner()
bOwned = true
EndIf
If !bOwned && ContainerParentCell.GetActorOwner()
bOwned = true
EndIf
If !bOwned && ContainerParentCell.GetFactionOwner()
bOwned = true
EndIf
Return bOwned
EndFunction
;=====================================================================================
; PROPERTIES
;=====================================================================================
bool bFoundTreasure
bool bDone
bool bSetUp
bool bOwned
int iPlayerPickpocketSkill
int iPlayerLevel
int iHiddenSlotTier
int iFormlistIndexOffset
int iFormlistIndex
int iRewardEXPBigSlot = 50
; These integers determine at which levels player can access the different tiers
int iTierCap_1 = 0
int iTierCap_2 = 15
int iTierCap_3 = 25
int iTierCap_4 = 35
int iTierCap_5 = 45
; These integers determine the likelihood of the different slot sizes
int iSmallSlotChance = 50
int iMediumSlotChance = 35
int iBigSlotChance = 15
String sTreasureSize
; This formlist will be filled with the formlist containing the items that will actually be added into the container
Formlist hiddenSlotFormlist
Message messageToShow
ObjectReference containterToFill
Cell ContainerParentCell
_00E_QuestFunctions Property Levelsystem Auto
Actor Property PlayerREF Auto
GlobalVariable Property _00E_FS_IsForgottenStoriesActivated Auto
GlobalVariable Property PlayerLevel Auto
GlobalVariable Property _00E_AchievementsEnabled Auto
GlobalVariable Property _00E_HiddenSlotAchievementUnlocked Auto
; These REFs simply provide the containers that will be filled when finding a secret slot
ObjectReference Property _00E_FS_SleightOfHand_HiddenSlot_SmallSlotREF Auto
ObjectReference Property _00E_FS_SleightOfHand_HiddenSlot_MediumSlotREF Auto
ObjectReference Property _00E_FS_SleightOfHand_HiddenSlot_BigSlotREF Auto
MiscObject Property Gold001 Auto
MiscObject Property _00E_FS_SleightOfHand_HiddenSlotUsedMarker Auto
Sound Property UILockpickingCylinderTurnM Auto
Sound Property UIEnchantingLearnEffectM Auto
Message Property _00E_FS_SleightOfHand_HiddenSlot_sSmallSlotFound Auto
Message Property _00E_FS_SleightOfHand_HiddenSlot_sMediumSlotFound Auto
Message Property _00E_FS_SleightOfHand_HiddenSlot_sBigSlotFound Auto
; This contains all formlists with items for the rewards.For every tier, there are nine different treasures to be found, three in small and medium category, two in big.
Formlist Property _00E_FS_HiddenSlotRewardFormlists Auto
Faction Property SleightOfHandOwnerFaction Auto