282 lines
7.5 KiB
Plaintext
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)
|
||
|
Game.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
|