From e1dc5946ea66304a72631d2c6ce8d65688ea2923 Mon Sep 17 00:00:00 2001 From: empathicqubit Date: Mon, 14 Jun 2021 04:18:27 -0400 Subject: [PATCH] Make container texture more transparent. Try to figure out how to sort and chunk the items. --- .../Scripts/_EQ_ItemRoulette_FormChunks.psc | 100 ++++++++++++++++++ Source/Scripts/_EQ_ItemRoulette_Quest.psc | 82 ++++++++++++-- .../_EQ_ItemRoulette/roulette_container.xcf | Bin 2892510 -> 2892510 bytes plugin/Data/_EQ_ItemRoulette.esp | Bin 864 -> 1048 bytes 4 files changed, 174 insertions(+), 8 deletions(-) create mode 100644 Source/Scripts/_EQ_ItemRoulette_FormChunks.psc diff --git a/Source/Scripts/_EQ_ItemRoulette_FormChunks.psc b/Source/Scripts/_EQ_ItemRoulette_FormChunks.psc new file mode 100644 index 0000000..76925fc --- /dev/null +++ b/Source/Scripts/_EQ_ItemRoulette_FormChunks.psc @@ -0,0 +1,100 @@ +Scriptname _EQ_ItemRoulette_FormChunks extends Form + +Form[] Property Children Auto + +Function SortByName() + ; based on "Optimized QuickSort - C Implementation" by darel rex finley (http://alienryderflex.com/quicksort/) + Int[] Beg = new Int[127] + Int[] End = new Int[127] + String[] Names = new String[127] + Int i = 0 + Int L + Int R + Int swap + Form piv + String pivName + + Beg[0] = 0 + End[0] = Children.Length + + While(i < Children.Length) + If Children[i] != None + Names[i] = Children[i].GetName() + Else + Names[i] = "" + EndIf + i += 1 + EndWhile + + i = 0 + While (i >= 0) + L = Beg[i] + R = End[i] - 1; + If (L < R) + piv = Children[L] + pivName = Names[L] + While (L < R) + While ((Names[R] >= pivName) && (L < R)) + R -= 1 + EndWhile + If (L < R) + Names[L] = Names[R] + Children[L] = Children[R] + L += 1 + EndIf + While ((Names[L] <= pivName) && (L < R)) + L += 1 + EndWhile + If (L < R) + Names[R] = Names[L] + Children[R] = Children[L] + R -= 1 + EndIf + EndWhile + Children[L] = piv + Names[L] = pivName + Beg[i + 1] = L + 1 + End[i + 1] = End[i] + End[i] = L + i += 1 + If (End[i] - Beg[i] > End[i - 1] - Beg[i - 1]) + swap = Beg[i] + Beg[i] = Beg[i - 1] + Beg[i - 1] = swap + swap = End[i] + End[i] = End[i - 1] + End[i - 1] = swap + EndIf + Else + i -= 1 + EndIf + EndWhile +EndFunction + +Function SortByNameRecursive() + SortByName() + Int childIndex = 0 + While childIndex < Children.Length + Form child = Children[childIndex] + _EQ_ItemRoulette_FormChunks subChunk = (child as _EQ_ItemRoulette_FormChunks) + If(subChunk != None) + subChunk.SortByNameRecursive() + EndIf + childIndex += 1 + EndWhile +EndFunction + +Function PrintNamesRecursive() + Int childIndex = 0 + While childIndex < Children.Length + Form child = Children[childIndex] + _EQ_ItemRoulette_FormChunks subChunk = (child as _EQ_ItemRoulette_FormChunks) + If(subChunk != None) + Debug.Trace("Chunk") + subChunk.PrintNamesRecursive() + ElseIf child != None + Debug.Trace(child.GetName()) + EndIf + childIndex += 1 + EndWhile +EndFunction \ No newline at end of file diff --git a/Source/Scripts/_EQ_ItemRoulette_Quest.psc b/Source/Scripts/_EQ_ItemRoulette_Quest.psc index 7b719c8..af5df7b 100644 --- a/Source/Scripts/_EQ_ItemRoulette_Quest.psc +++ b/Source/Scripts/_EQ_ItemRoulette_Quest.psc @@ -2,11 +2,15 @@ Scriptname _EQ_ItemRoulette_Quest extends Quest Actor Property PlayerRef Auto Static Property _EQ_ItemRoulette_Roulette Auto +Activator Property FormChunks Auto ObjectReference[] DisplayItems +Form[] SpawnedForms +Form[] UnspawnedForms ObjectReference Roulette Int MAX_ITEMS +Float UI_TRANSLATE_SPEED Float UI_DISTANCE Float UI_DEGREES Float UI_ZEES @@ -23,6 +27,7 @@ Function Main() UI_DEGREES = 14.0 UI_ZEES = 12.0 UI_ITEM_SCALE = 0.25 + UI_TRANSLATE_SPEED = 10000 DisplayItems = New ObjectReference[127] int index = 0 @@ -31,8 +36,23 @@ Function Main() index += 1 EndWhile + UnspawnedForms = New Form[127] + index = 0 + While index < MAX_ITEMS + UnspawnedForms[index] = None + index += 1 + EndWhile + + SpawnedForms = New Form[127] + index = 0 + While index < MAX_ITEMS + SpawnedForms[index] = None + index += 1 + EndWhile + Debug.Trace("Item Roulette loaded") Roulette = PlayerRef.PlaceAtMe(_EQ_ItemRoulette_Roulette) + Roulette.SetMotionType(Roulette.Motion_Keyframed) RegisterForModEvent("_EQ_ItemRoulette_Activate", "OnMyAction") VRIK.VrikAddGestureAction("_EQ_ItemRoulette_Activate", "Activate Item Roulette") RegisterForSingleUpdate(0.01) @@ -41,9 +61,26 @@ EndFunction Event OnUpdate() Float playerAngle = PlayerRef.GetAngleZ() - Roulette.TranslateTo(PlayerRef.X + UI_DISTANCE * Math.sin(playerAngle), PlayerRef.Y + UI_DISTANCE * Math.cos(playerAngle), VRIK.VrikGetHmdZ(), 0, 0, playerAngle, 1000) - Int index = 0 + While index < MAX_ITEMS + Form unspawnedForm = UnspawnedForms[index] + if unspawnedForm != None + If unspawnedForm != SpawnedForms[index] + SpawnedForms[index] = unspawnedForm + ObjectReference displayItem = Roulette.PlaceAtMe(unspawnedForm) + DisplayItems[index] = displayItem + displayItem.SetScale(UI_ITEM_SCALE) + displayItem.SetMotionType(displayItem.Motion_Keyframed) + EndIf + Else + index += 1000 + EndIf + index += 1 + EndWhile + + Roulette.TranslateTo(PlayerRef.X + UI_DISTANCE * Math.sin(playerAngle), PlayerRef.Y + UI_DISTANCE * Math.cos(playerAngle), VRIK.VrikGetHmdZ(), 0, 0, playerAngle, UI_TRANSLATE_SPEED) + + index = 0 While index < MAX_ITEMS && DisplayItems[index] != None ; T-LCR-B Float top = 0 @@ -60,7 +97,7 @@ Event OnUpdate() Else top = UI_ZEES EndIf - DisplayItems[index].MoveTo(PlayerRef, UI_DISTANCE * Math.sin(playerAngle - left), UI_DISTANCE * Math.cos(playerAngle - left), (VRIK.VrikGetHmdZ() - PlayerRef.Z) - top) + DisplayItems[index].TranslateTo(PlayerRef.X + UI_DISTANCE * Math.sin(playerAngle - left), PlayerRef.Y + UI_DISTANCE * Math.cos(playerAngle - left), VRIK.VrikGetHmdZ() - top, 0, 0, playerAngle, UI_TRANSLATE_SPEED) index += 1 EndWhile @@ -69,16 +106,45 @@ EndEvent Event OnMyAction(string eventName, string strArg, float numArg, Form sender) Debug.Trace("VRIK activated me!") + ;/ + Get list of all inventory item names, sorted alphabetically + break into groups of five + find a common label for that group + group the groups in a similar manner until there are only five? + /; Int numItems = PlayerRef.getNumItems() - Int formIndex = numItems + Debug.Trace("Found " + numItems + " items") + + _EQ_ItemRoulette_FormChunks sortChunks = ((Roulette.PlaceAtMe(FormChunks) as Form) as _EQ_ItemRoulette_FormChunks) + sortChunks.Children = new Form[127] + Int formIndex = 0 + Int chunkIndex = -1 + Int chunkItemIndex = 127 + _EQ_ItemRoulette_FormChunks chunk + While formIndex < numItems + If chunkItemIndex >= 127 + chunkItemIndex = 0 + chunkIndex += 1 + chunk = ((Roulette.PlaceAtMe(FormChunks) as Form) as _EQ_ItemRoulette_FormChunks) + chunk.Children = new Form[127] + sortChunks.Children[chunkIndex] = chunk + EndIf + chunk.Children[chunkItemIndex] = PlayerRef.GetNthForm(formIndex) + formIndex += 1 + chunkItemIndex += 1 + EndWhile + + Debug.Trace("Sorting") + sortChunks.SortByNameRecursive() + Debug.Trace("Printing") + sortChunks.PrintNamesRecursive() + Int count = 0 + formIndex = numItems While formIndex > 0 && formIndex > numItems - MAX_ITEMS formIndex -= 1 count = numItems - formIndex Form invItem = PlayerRef.GetNthForm(formIndex) - ObjectReference invItemInst = PlayerRef.DropObject(invItem) - invItemInst.SetScale(UI_ITEM_SCALE) - invItemInst.SetMotionType(invItemInst.Motion_Keyframed) - DisplayItems[count - 1] = invItemInst + UnspawnedForms[count - 1] = invItem EndWhile EndEvent \ No newline at end of file diff --git a/Source/Textures/_EQ_ItemRoulette/roulette_container.xcf b/Source/Textures/_EQ_ItemRoulette/roulette_container.xcf index 34dd0d2da6f07a542417e1b46ad7a0c516201e5a..db44e4ca09ea938ff7fd2dc9fd4a3a48ffec42f0 100644 GIT binary patch delta 33365 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 Vyr1{IpLjp-_qwkvul$Jm{{Sqb3q}9{ delta 99354 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