My verse device crashing

Hi, the device seems to be working fine but after going through a few array elements (right here: for(SelectedItem : ShopItem): ) in the ReturnCanvasSlots it breaks and stops working. Would anyone be able to help me out with it i can’t seem to find a fix for this. The code is below

using { /Fortnite.com/Devices }
using { /Fortnite.com/UI }
using { /Fortnite.com/FortPlayerUtilities }
using { /Verse.org/Simulation }
using { /Verse.org/Verse }
using { /UnrealEngine.com/Temporary/Diagnostics }
using { /UnrealEngine.com/Temporary/UI }
using { /UnrealEngine.com/Temporary/SpatialMath }
using { /Verse.org/Colors }
using { /Verse.org/Assets }
 
shop_device := class(creative_device):

    # Refrence the game manager
    @editable MainDevice : game_manager_3 = game_manager_3{}
 
    # The trigger that will open up this ui menu
    @editable ShowUIOnTrigger : trigger_device = trigger_device{}
 
    # An array of button ui, configurable via the editor
    @editable var ShopItem : []shop_item = array{}

    #shop indexes to open the correct page/subpage
    @editable ShopIndex : int = 0
 
    # A map of type ?canvas used to find the canvas tied to a player
    var MaybeMyUIPerPlayer : [player]?canvas = map{}

    #player specific element of ui
    var ItemDisplayTextureBlockPerPlayer : [agent]?texture_block = map{}

    var NameTextBlockPerPlayer : [agent]?text_block = map{}
    var RarityTextBlockPerPlayer : [agent]?text_block = map{}
    var PriceTextBlockPerPlayer : [agent]?text_block = map{}
    var BalanceTextBlockPerPlayer : [agent]?text_block = map{}

    #shop pages maps
    var MinShopPagePerPlayer : [agent]?int = map{}
    var MaxShopPagePerPlayer : [agent]?int = map{}
    var CurrentShopPagePerPlayer : [agent]?int = map{}

    #player ui positions
    var ButtonPositionXPerPlayer : [agent]?float = map{}
    var ButtonPositionYPerPlayer : [agent]?float = map{}

    var TexturePositionXPerPlayer : [agent]?float = map{}
    var TexturePositionYPerPlayer : [agent]?float = map{}

    @editable ButtonType1Text : string = ""
    @editable ButtonType2Text : string = ""
    @editable ButtonType3Text : string = ""
    @editable ButtonType4Text : string = ""
    @editable ButtonType5Text : string = ""
    @editable ButtonType6Text : string = ""
    @editable ButtonType7Text : string = ""

    EmptyButtonText<localizes> : message = ""
    ReadyButtonText<localizes> : message = "Ready"
    MenuButtonText<localizes> : message = "Menu"
    PurchaseButtonText<localizes> : message = "Purchase"

    var ButtonStartingXPosition : float = 120.0
    var ButtonMaxXPosition : float = 1224.0
    var ButtonXPositionIncrease : float = 138.0
    var ButtonStartingYPosition : float = 320.0
    var ButtonYPositionIncrease : float = 138.0

    var TextureStartingXPosition : float = 130.0
    var TextureMaxXPosition : float = 1234.0
    var TextureXPositionIncrease : float = 138.0
    var TextureStartingYPosition : float = 330.0
    var TextureYPositionIncrease : float = 138.0
 
    Convert<localizes>(String : string): message = "{String}"
 
    OnBegin<override>()<suspends>: void =
        ShowUIOnTrigger.TriggeredEvent.Subscribe(CheckForIndexes)
        AssignEachItemAnIndex()

    #assigns each page an index
    AssignEachItemAnIndex(): void = 
        var SetupItemIndex : int = 0
        for(SelectedButton : ShopItem):
            set SetupItemIndex = SetupItemIndex + 1
            set SelectedButton.ItemIndex = SetupItemIndex 
            Print("assigned index: {SelectedButton.ItemIndex}")

    #check for index/subindex
    CheckForIndexes(MaybeAgent : ?agent): void =
        if:
            Agent := MaybeAgent?
            CurrentShopIndex := MainDevice.PlayerShopIndex[Agent]?
            CurrentShopIndex = ShopIndex
        then:
            OpenUI(Agent)
 
    # Opens the UI
    OpenUI(Agent : agent): void =
        if(Player := player[Agent], PlayerUI := GetPlayerUI[Player]):
            if(MyUI := MaybeMyUIPerPlayer[Player]?):
                PlayerUI.RemoveWidget(MyUI)
                if(set MaybeMyUIPerPlayer[Player] = false) {}
            else:
                NewUI := CreateMyUI(Agent)
                PlayerUI.AddWidget(NewUI, player_ui_slot{InputMode := ui_input_mode.All})
                if(set MaybeMyUIPerPlayer[Player] = option{NewUI}) {}

    # Deletes the canvas
    DeleteCanvas(Agent : agent): void =
        if(Player := player[Agent], PlayerUI := GetPlayerUI[Player]):
            if(MyUI := MaybeMyUIPerPlayer[Player]?):
                PlayerUI.RemoveWidget(MyUI)
                if(set MaybeMyUIPerPlayer[Player] = false) {}

    # Deletes the canvas using a widget_message
    DeleteUI(Message : widget_message): void =
        if(PlayerUI := GetPlayerUI[Message.Player], MyUI := MaybeMyUIPerPlayer[Message.Player]?):
            PlayerUI.RemoveWidget(MyUI)
            if(set MaybeMyUIPerPlayer[Message.Player] = false) {}
 
    # Creates the UI
    CreateMyUI(Agent : agent): canvas = 
        for(CurrentButton : ShopItem):
            SelectedButton := button_quiet{DefaultText := EmptyButtonText}
            SelectedButton.OnClick().Subscribe(HandleSelectedButton)
            if(set CurrentButton.ButtonWidgetPerPlayer[Agent] = SelectedButton){}
        for(CurrentTexture : ShopItem):
            ItemTexture := CurrentTexture.ItemTexture
            SelectedTexture := texture_block{DefaultImage := ItemTexture, DefaultDesiredSize := vector2{X := 89.0, Y := 89.0}}
            if(set CurrentTexture.TextureWidgetPerPlayer[Agent] = SelectedTexture){}
        CanvasArray := ReturnCanvasSlots(Agent)
        MyInteractableButtons : canvas = canvas:
            Slots := CanvasArray
        return MyInteractableButtons

    GetButtonXPosition(Agent : agent): float =
        Print("button pos x")
        if(XPosition := ButtonPositionXPerPlayer[Agent]?, YPosition := ButtonPositionYPerPlayer[Agent]?):
            if(XPosition = 0.0):
                if(set ButtonPositionXPerPlayer[Agent] = option{ButtonStartingXPosition}){}
                return ButtonStartingXPosition
            else:
                if(XPosition = ButtonMaxXPosition):
                    if(set ButtonPositionXPerPlayer[Agent] = option{ButtonStartingXPosition}){}
                    if(set ButtonPositionYPerPlayer[Agent] = option{YPosition + ButtonYPositionIncrease}){}
                    return ButtonStartingXPosition
                else:
                    if(set ButtonPositionXPerPlayer[Agent] = option{XPosition + ButtonXPositionIncrease}){}
                    return XPosition + ButtonXPositionIncrease
        else:
            return 0.0

    GetButtonYPosition(Agent : agent): float =
        Print("button pos y")
        if(YPosition := ButtonPositionYPerPlayer[Agent]?):
            if(YPosition = 0.0):
                if(set ButtonPositionYPerPlayer[Agent] = option{ButtonStartingYPosition}){}
                return ButtonStartingYPosition
            else:
                return YPosition
        else:
            return 0.0

    GetTextureXPosition(Agent : agent): float =
        Print("texture pos x")
        if(XPosition := TexturePositionXPerPlayer[Agent]?, YPosition := TexturePositionYPerPlayer[Agent]?):
            if(XPosition = 0.0):
                if(set TexturePositionXPerPlayer[Agent] = option{TextureStartingXPosition}){}
                return TextureStartingXPosition
            else:
                if(XPosition = TextureMaxXPosition):
                    if(set TexturePositionXPerPlayer[Agent] = option{TextureStartingXPosition}){}
                    if(set TexturePositionYPerPlayer[Agent] = option{YPosition + TextureYPositionIncrease}){}
                    return TextureStartingXPosition
                else:
                    if(set TexturePositionXPerPlayer[Agent] = option{XPosition + TextureXPositionIncrease}){}
                    return XPosition + TextureXPositionIncrease
        else:
            return 0.0

    GetTextureYPosition(Agent : agent): float =
        Print("texture pos y")
        if(YPosition := TexturePositionYPerPlayer[Agent]?):
            if(YPosition = 0.0):
                if(set TexturePositionYPerPlayer[Agent] = option{TextureStartingYPosition}){}
                return TextureStartingYPosition
            else:
                return YPosition
        else:
            return 0.0

    CheckIfItemEnabled(Agent : agent, ItemType : int) : int =
        Print("Button enabled/disabled")
        if(ItemType = 1):
            return 1
        else if(ItemType = 2):
            if(Type2Enabled := MainDevice.ItemType2EnabledPerPlayer[Agent]?):
                if(Type2Enabled = 1):
                    return 1
                else: 
                    return 0
            else:
                return 0
        else:
            if(Type3Enabled := MainDevice.ItemType3EnabledPerPlayer[Agent]?):
                if(Type3Enabled = 1):
                    return 1
                else: 
                    return 0
            else:
                return 0
        
    CheckForPageCount(Agent : agent): void =
        var ItemsAvailable : float = 0.0
        if:
            Type2Enabled := MainDevice.ItemType2EnabledPerPlayer[Agent]?
            Type3Enabled := MainDevice.ItemType3EnabledPerPlayer[Agent]?
        then:
            if(set MinShopPagePerPlayer[Agent] = option{1}){}
            if(set MaxShopPagePerPlayer[Agent] = option{1}){}
            for(SelectedItem : ShopItem):
                ItemType := SelectedItem.ItemType
                if(ItemType = 1):
                    set ItemsAvailable = ItemsAvailable + 1.0
                if(ItemType = 2, Type2Enabled = 1):
                    set ItemsAvailable = ItemsAvailable + 1.0
                if(ItemType = 3, Type3Enabled = 1):
                    set ItemsAvailable = ItemsAvailable + 1.0
            set ItemsAvailable = ItemsAvailable / 36.0
            if(RoundedItemsAvailable := Ceil[ItemsAvailable]):
                if(set MaxShopPagePerPlayer[Agent] = option{RoundedItemsAvailable}){}
                Print("Pages: {RoundedItemsAvailable}")

    # Returns an array of canvas_slot
    ReturnCanvasSlots(Agent : agent): []canvas_slot =

        var ButtonReady : button_quiet = button_quiet{DefaultText := ReadyButtonText}
        var ButtonMenu : button_quiet = button_quiet{DefaultText := MenuButtonText}
        var ButtonPurchase : button_quiet = button_quiet{DefaultText := PurchaseButtonText}
        var ButtonPreviousRarity : button_quiet = button_quiet{DefaultText := EmptyButtonText}
        var ButtonNextRarity : button_quiet = button_quiet{DefaultText := EmptyButtonText}
        var ButtonPreviousPage : button_quiet = button_quiet{DefaultText := EmptyButtonText}
        var ButtonNextPage : button_quiet = button_quiet{DefaultText := EmptyButtonText}

        var ButtonType1 : button_quiet = button_quiet{DefaultText := Convert(ButtonType1Text)}
        var ButtonType2 : button_quiet = button_quiet{DefaultText := Convert(ButtonType2Text)}
        var ButtonType3 : button_quiet = button_quiet{DefaultText := Convert(ButtonType3Text)}
        var ButtonType4 : button_quiet = button_quiet{DefaultText := Convert(ButtonType4Text)}
        var ButtonType5 : button_quiet = button_quiet{DefaultText := Convert(ButtonType5Text)}
        var ButtonType6 : button_quiet = button_quiet{DefaultText := Convert(ButtonType6Text)}
        var ButtonType7 : button_quiet = button_quiet{DefaultText := Convert(ButtonType7Text)}

        var WeaponStoreWidget : texture_block = texture_block{DefaultImage := Textures.Weapon_Store_Text, DefaultDesiredSize := vector2{X := 848.0, Y := 233.0}}
        var WeaponDisplayWidget : texture_block = texture_block{DefaultImage := Textures.Weapon_Display_Icon, DefaultDesiredSize := vector2{X := 364.0, Y := 434.0}}
        var ArrowPreviousRarityWidget : texture_block = texture_block{DefaultImage := Textures.Arrow_Previous, DefaultDesiredSize := vector2{X := 50.0, Y := 50.0}}
        var ArrowNextRarityWidget : texture_block = texture_block{DefaultImage := Textures.Arrow_Next, DefaultDesiredSize := vector2{X := 50.0, Y := 50.0}}
        var ArrowPreviousPageWidget : texture_block = texture_block{DefaultImage := Textures.Arrow_Previous, DefaultDesiredSize := vector2{X := 50.0, Y := 50.0}}
        var ArrowNextPageWidget : texture_block = texture_block{DefaultImage := Textures.Arrow_Next, DefaultDesiredSize := vector2{X := 50.0, Y := 50.0}}

        var ItemDisplayWidget : texture_block = texture_block{DefaultImage := Assaults_Textures.Assault_Rifle, DefaultDesiredSize := vector2{X := 290.0, Y := 290.0}}

        var ColorBlock1 : color_block = color_block{DefaultColor := color{R := 0.015625, G := 0.015625, B := 0.015625}, DefaultOpacity := 0.75, DefaultDesiredSize := vector2{X := 1760.0, Y := 952.0}}
        var ColorBlock2 : color_block = color_block{DefaultColor := color{R := 0.015625, G := 0.015625, B := 0.015625}, DefaultOpacity := 0.25, DefaultDesiredSize := vector2{X := 1920.0, Y := 1080.0}}
        var ColorBlock3 : color_block = color_block{DefaultColor := color{R := 0.416667, G := 0.416667, B := 0.416667}, DefaultDesiredSize := vector2{X := 7.0, Y := 656.0}}

        var NameTextBlock : text_block = text_block{DefaultTextColor := color{R := 255.0, G := 255.0, B := 255.0}}
        var PriceTextBlock : text_block = text_block{DefaultTextColor := color{R := 255.0, G := 255.0, B := 255.0}}
        var RarityTextBlock : text_block = text_block{DefaultTextColor := color{R := 255.0, G := 255.0, B := 255.0}, DefaultJustification := text_justification.Center}
        var BalanceTextBlock : text_block = text_block{DefaultTextColor := color{R := 255.0, G := 255.0, B := 255.0}}

        ButtonReady.OnClick().Subscribe(HandleButtonReady)
        ButtonMenu.OnClick().Subscribe(HandleButtonMenu)
        ButtonPurchase.OnClick().Subscribe(HandleButtonPurchase)
        ButtonPreviousRarity.OnClick().Subscribe(HandleButtonPreviousRarity)
        ButtonNextRarity.OnClick().Subscribe(HandleButtonNextRarity)
        ButtonPreviousPage.OnClick().Subscribe(HandleButtonPreviousPage)
        ButtonNextPage.OnClick().Subscribe(HandleButtonNextPage)

        ButtonType1.OnClick().Subscribe(HandleButtonType1)
        ButtonType2.OnClick().Subscribe(HandleButtonType2)
        ButtonType3.OnClick().Subscribe(HandleButtonType3)
        ButtonType4.OnClick().Subscribe(HandleButtonType4)
        ButtonType5.OnClick().Subscribe(HandleButtonType5)
        ButtonType6.OnClick().Subscribe(HandleButtonType6)
        ButtonType7.OnClick().Subscribe(HandleButtonType7)

        var CanvasSlotArray : []canvas_slot = array{}

        if(set ButtonPositionXPerPlayer[Agent] = option{0.0}){}
        if(set ButtonPositionYPerPlayer[Agent] = option{0.0}){}
        if(set TexturePositionXPerPlayer[Agent] = option{0.0}){}
        if(set TexturePositionYPerPlayer[Agent] = option{0.0}){}

        if(set ItemDisplayTextureBlockPerPlayer[Agent] = option{ItemDisplayWidget}){}

        if(set NameTextBlockPerPlayer[Agent] = option{NameTextBlock}){}
        if(set PriceTextBlockPerPlayer[Agent] = option{PriceTextBlock}){}
        if(set RarityTextBlockPerPlayer[Agent] = option{RarityTextBlock}){}
        if(set BalanceTextBlockPerPlayer[Agent] = option{BalanceTextBlock}){}

        CheckForPageCount(Agent)

        for(SelectedItem : ShopItem):
            ItemType := SelectedItem.ItemType
            ItemEnabled := CheckIfItemEnabled(Agent, ItemType)
            if(ItemEnabled = 1):
                ButtonPositionX := GetButtonXPosition(Agent)
                Print("button x returned")
                ButtonPositionY := GetButtonYPosition(Agent)
                Print("button y returned")
                TexturePositionX := GetTextureXPosition(Agent)
                Print("texture x returned")
                TexturePositionY := GetTextureYPosition(Agent)
                Print("texture y returned")
                ItemIndex := SelectedItem.ItemIndex
                Print("Button with index: {ItemIndex} added")
                if(ItemIndex = 1):
                    if(set MainDevice.PlayerItemIndex[Agent] = option{1}){}
                    if(set MainDevice.PlayerChosenRarity[Agent] = option{SelectedItem.MinItemIndex}){}
                    if(set MainDevice.PlayerMinItemIndex[Agent] = option{SelectedItem.MinItemIndex}){}  
                    if(set MainDevice.PlayerMaxItemIndex[Agent] = option{SelectedItem.MaxItemIndex}){} 
                    UpdatePlayerBudget(Agent)
                    UpdateItem(Agent)

                if(SelectedWidget := SelectedItem.ButtonWidgetPerPlayer[Agent]):
                    SelectedSlot := canvas_slot:
                        Offsets := margin{Top := ButtonPositionY, Left := ButtonPositionX, Bottom := SelectedItem.ButtonSize.Y, Right := SelectedItem.ButtonSize.X}
                        ZOrder := 3
                        SizeToContent := false
                        Widget := SelectedWidget
                    set CanvasSlotArray += array{SelectedSlot}
                    Print("Added button to canvas")

                if(SelectedWidget := SelectedItem.TextureWidgetPerPlayer[Agent]):
                    SelectedSlot := canvas_slot:
                        Offsets := margin{Top := TexturePositionY, Left := TexturePositionX, Bottom := SelectedItem.TextureSize.Y, Right := SelectedItem.TextureSize.X}
                        ZOrder := 2
                        SizeToContent := false
                        Widget := SelectedWidget
                    set CanvasSlotArray += CanvasSlotArray + array{SelectedSlot}  
                    Print("Added texture to canvas")          

        SelectedType1Slot := canvas_slot:
            Widget := ButtonType1
            ZOrder := 3
            SizeToContent := false
            Offsets := margin{Left := 120.0, Top := 228.0, Right := 205.0, Bottom := 42.0}
        set CanvasSlotArray += array{SelectedType1Slot}

        SelectedType2Slot := canvas_slot:
            Widget := ButtonType2
            ZOrder := 3
            SizeToContent := false
            Offsets := margin{Left := 364.0, Top := 228.0, Right := 205.0, Bottom := 42.0}
        set CanvasSlotArray += array{SelectedType2Slot}

        SelectedType3Slot := canvas_slot:
            Widget := ButtonType3
            ZOrder := 3
            SizeToContent := false
            Offsets := margin{Left := 604.0, Top := 228.0, Right := 205.0, Bottom := 42.0}
        set CanvasSlotArray += array{SelectedType3Slot}

        SelectedType4Slot := canvas_slot:
            Widget := ButtonType4
            ZOrder := 3
            SizeToContent := false
            Offsets := margin{Left := 852.0, Top := 228.0, Right := 205.0, Bottom := 42.0}
        set CanvasSlotArray += array{SelectedType4Slot}

        SelectedType5Slot := canvas_slot:
            Widget := ButtonType5
            ZOrder := 3
            SizeToContent := false
            Offsets := margin{Left := 1096.0, Top := 228.0, Right := 205.0, Bottom := 42.0}
        set CanvasSlotArray += array{SelectedType5Slot}

        SelectedType6Slot := canvas_slot:
            Widget := ButtonType6
            ZOrder := 3
            SizeToContent := false
            Offsets := margin{Left := 1336.0, Top := 228.0, Right := 205.0, Bottom := 42.0}
        set CanvasSlotArray += array{SelectedType6Slot}

        SelectedType7Slot := canvas_slot:
            Widget := ButtonType7
            ZOrder := 3
            SizeToContent := false
            Offsets := margin{Left := 1584.0, Top := 228.0, Right := 205.0, Bottom := 42.0}
        set CanvasSlotArray += array{SelectedType7Slot}

        SelectedReadySlot := canvas_slot:
            Widget := ButtonReady
            ZOrder := 3
            SizeToContent := false
            Offsets := margin{Left := 210.0, Top := 888.0, Right := 1042.0, Bottom := 60.0}
        set CanvasSlotArray += array{SelectedReadySlot}

        SelectedMenuSlot := canvas_slot:
            Widget := ButtonMenu
            ZOrder := 3
            SizeToContent := false
            Offsets := margin{Left := 1649.0, Top := 100.0, Right := 140.0, Bottom := 75.0}
        set CanvasSlotArray += array{SelectedMenuSlot}

        SelectedPurchaseSlot := canvas_slot:
            Widget := ButtonPurchase
            ZOrder := 3
            SizeToContent := false
            Offsets := margin{Left := 1432.0, Top := 888.0, Right := 356.0, Bottom := 60.0}
        set CanvasSlotArray += array{SelectedPurchaseSlot}

        SelectedPreviousRaritySlot := canvas_slot:
            Widget := ButtonPreviousRarity
            ZOrder := 3
            SizeToContent := false
            Offsets := margin{Left := 1453.0, Top := 641.0, Right := 60.0, Bottom := 60.0}
        set CanvasSlotArray += array{SelectedPreviousRaritySlot}

        SelectedNextRaritySlot := canvas_slot:
            Widget := ButtonNextRarity
            ZOrder := 3
            SizeToContent := false
            Offsets := margin{Left := 1707.0, Top := 641.0, Right := 60.0, Bottom := 60.0}
        set CanvasSlotArray += array{SelectedNextRaritySlot}

        SelectedPreviousPageSlot := canvas_slot:
            Widget := ButtonPreviousPage
            ZOrder := 3
            SizeToContent := false
            Offsets := margin{Left := 124.0, Top := 888.0, Right := 60.0, Bottom := 60.0}
        set CanvasSlotArray += array{SelectedPreviousPageSlot}

        SelectedNextPageSlot := canvas_slot:
            Widget := ButtonNextPage
            ZOrder := 3
            SizeToContent := false
            Offsets := margin{Left := 1280.0, Top := 888.0, Right := 60.0, Bottom := 60.0}
        set CanvasSlotArray += array{SelectedNextPageSlot}

        SelectedWeaponStoreSlot := canvas_slot:
            Widget := WeaponStoreWidget
            ZOrder := 3
            Offsets := margin{Left := 64.0, Top := 24.0, Right := 848.0, Bottom := 233.0}
        set CanvasSlotArray += array{SelectedWeaponStoreSlot}

        SelectedWeaponDisplaySlot := canvas_slot:
            Widget := WeaponDisplayWidget
            ZOrder := 2
            Offsets := margin{Left := 1428.0, Top := 296.0, Right := 364.0, Bottom := 434.0}
        set CanvasSlotArray += array{SelectedWeaponDisplaySlot}

        SelectedArrowPreviousRaritySlot := canvas_slot:
            Widget := ArrowPreviousRarityWidget
            ZOrder := 2
            Offsets := margin{Left := 1455.0, Top := 645.0, Right := 50.0, Bottom := 50.0}
        set CanvasSlotArray += array{SelectedArrowPreviousRaritySlot}

        SelectedArrowNextRaritySlot := canvas_slot:
            Widget := ArrowNextRarityWidget
            ZOrder := 2
            Offsets := margin{Left := 1715.0, Top := 647.0, Right := 50.0, Bottom := 50.0}
        set CanvasSlotArray += array{SelectedArrowNextRaritySlot}

        SelectedArrowPreviousPageSlot := canvas_slot:
            Widget := ArrowPreviousPageWidget
            ZOrder := 2
            Offsets := margin{Left := 128.0, Top := 892.0, Right := 50.0, Bottom := 50.0}
        set CanvasSlotArray += array{SelectedArrowPreviousPageSlot}

        SelectedArrowNextPageSlot := canvas_slot:
            Widget := ArrowNextPageWidget
            ZOrder := 2
            Offsets := margin{Left := 1288.0, Top := 892.0, Right := 50.0, Bottom := 50.0}
        set CanvasSlotArray += array{SelectedArrowNextPageSlot}

        SelectedItemDisplaySlot := canvas_slot:
            Widget := ItemDisplayWidget
            ZOrder := 4
            Offsets := margin{Left := 1456.0, Top := 345.0, Right := 290.0, Bottom := 290.0}
        set CanvasSlotArray += array{SelectedItemDisplaySlot}

        SelectedColorBlock1Slot := canvas_slot:
            Widget := ColorBlock1
            ZOrder := 1
            Offsets := margin{Left := 80.0, Top := 65.0, Right := 1760.0, Bottom := 952.0}
        set CanvasSlotArray += array{SelectedColorBlock1Slot}

        SelectedColorBlock2Slot := canvas_slot:
            Widget := ColorBlock2
            ZOrder := 1
            Offsets := margin{Left := 0.0, Top := 0.0, Right := 1920.0, Bottom := 1080.0}
        set CanvasSlotArray += array{SelectedColorBlock2Slot}

        SelectedColorBlock3Slot := canvas_slot:
            Widget := ColorBlock3
            ZOrder := 2
            Offsets := margin{Left := 1372.0, Top := 324.0, Right := 7.0, Bottom := 656.0}
        set CanvasSlotArray += array{SelectedColorBlock3Slot}

        SelectedNameSlot := canvas_slot:
            Widget := NameTextBlock
            ZOrder := 4
            SizeToContent := false
            Offsets := margin{Left := 1436.0, Top := 736.0, Right := 165.0, Bottom := 41.0}
        set CanvasSlotArray += array{SelectedNameSlot}

        SelectedRaritySlot := canvas_slot:
            Widget := PriceTextBlock
            ZOrder := 4
            SizeToContent := false
            Offsets := margin{Left := 1436.0, Top := 776.0, Right := 165.0, Bottom := 41.0}
        set CanvasSlotArray += array{SelectedRaritySlot}

        SelectedPriceSlot := canvas_slot:
            Widget := RarityTextBlock
            ZOrder := 4
            SizeToContent := false
            Offsets := margin{Left := 1527.5, Top := 650.0, Right := 165.0, Bottom := 41.0}
        set CanvasSlotArray += array{SelectedPriceSlot}

        SelectedBalanceSlot := canvas_slot:
            Widget := BalanceTextBlock
            ZOrder := 4
            SizeToContent := false
            Offsets := margin{Left := 1436.0, Top := 816.0, Right := 165.0, Bottom := 41.0}
        set CanvasSlotArray += array{SelectedBalanceSlot}
        Print("Canvas array returned")
        return CanvasSlotArray

    HandleButtonType1(Wdata : widget_message) : void =
        if:
            Agent := agent[Wdata.Player]
        then:
            DeleteCanvas(Agent)
            if(set MainDevice.PlayerShopIndex[Agent] = option{1}){}
            MainDevice.TriggerShop.Trigger(Agent)

    HandleButtonType2(Wdata : widget_message) : void =
        if:
            Agent := agent[Wdata.Player]
        then:
            DeleteCanvas(Agent)
            if(set MainDevice.PlayerShopIndex[Agent] = option{2}){}
            MainDevice.TriggerShop.Trigger(Agent)

    HandleButtonType3(Wdata : widget_message) : void =
        if:
            Agent := agent[Wdata.Player]
        then:
            DeleteCanvas(Agent)
            if(set MainDevice.PlayerShopIndex[Agent] = option{3}){}
            MainDevice.TriggerShop.Trigger(Agent)

    HandleButtonType4(Wdata : widget_message) : void =
        if:
            Agent := agent[Wdata.Player]
        then:
            DeleteCanvas(Agent)
            if(set MainDevice.PlayerShopIndex[Agent] = option{4}){}
            MainDevice.TriggerShop.Trigger(Agent)

    HandleButtonType5(Wdata : widget_message) : void =
        if:
            Agent := agent[Wdata.Player]
        then:
            DeleteCanvas(Agent)
            if(set MainDevice.PlayerShopIndex[Agent] = option{5}){}
            MainDevice.TriggerShop.Trigger(Agent)

    HandleButtonType6(Wdata : widget_message) : void =
        if:
            Agent := agent[Wdata.Player]
        then:
            DeleteCanvas(Agent)
            if(set MainDevice.PlayerShopIndex[Agent] = option{6}){}
            MainDevice.TriggerShop.Trigger(Agent)

    HandleButtonType7(Wdata : widget_message) : void =
        if:
            Agent := agent[Wdata.Player]
        then:
            DeleteCanvas(Agent)
            if(set MainDevice.PlayerShopIndex[Agent] = option{7}){}
            MainDevice.TriggerShop.Trigger(Agent)

    HandleButtonPurchase(Wdata : widget_message) : void =
        if:
            Agent := agent[Wdata.Player]
        then:
            BuyItem(Agent)

    HandleButtonReady(Wdata : widget_message) : void =
        if:
            Agent := agent[Wdata.Player]
        then:
            DeleteCanvas(Agent)
            MainDevice.AssignInfoBox(Agent)
            MainDevice.TeleportToRandomIsland(Agent)

    HandleButtonMenu(Wdata : widget_message) : void =
        if:
            Agent := agent[Wdata.Player]
        then:
            DeleteCanvas(Agent)
            spawn {MainDevice.ShowInfo(Agent, "Dance To Get The Shop Back")}

    HandleButtonPreviousRarity(Wdata : widget_message) : void =
        if:
            Agent := agent[Wdata.Player]
            Rarity := MainDevice.PlayerChosenRarity[Agent]?
            MinIndex := MainDevice.PlayerMinItemIndex[Agent]?
            MaxIndex := MainDevice.PlayerMaxItemIndex[Agent]?
        then:
            if((Rarity - 1) < MinIndex):
                if(set MainDevice.PlayerChosenRarity[Agent] = option{MaxIndex}){}
            else:
                if(set MainDevice.PlayerChosenRarity[Agent] = option{Rarity - 1}){}
            UpdateItem(Agent)
            
    HandleButtonNextRarity(Wdata : widget_message) : void =
        if:
            Agent := agent[Wdata.Player]
            Rarity := MainDevice.PlayerChosenRarity[Agent]?
            MinIndex := MainDevice.PlayerMinItemIndex[Agent]?
            MaxIndex := MainDevice.PlayerMaxItemIndex[Agent]?
        then:
            if((Rarity + 1) > MaxIndex):
                if(set MainDevice.PlayerChosenRarity[Agent] = option{MinIndex}){}       
            else:
                if(set MainDevice.PlayerChosenRarity[Agent] = option{Rarity + 1}){}
            UpdateItem(Agent)

    HandleButtonPreviousPage(Wdata : widget_message) : void =
        if:
            Agent := agent[Wdata.Player]
            Page := CurrentShopPagePerPlayer[Agent]?
            MinPage := MinShopPagePerPlayer[Agent]?
            MaxPage := MaxShopPagePerPlayer[Agent]?
        then:
            if((Page - 1) < MinPage):
                if(set CurrentShopPagePerPlayer[Agent] = option{MaxPage}){}
            else:
                if(set CurrentShopPagePerPlayer[Agent] = option{Page - 1}){}
            UpdateItem(Agent)
            
    HandleButtonNextPage(Wdata : widget_message) : void =
        if:
            Agent := agent[Wdata.Player]
            Page := CurrentShopPagePerPlayer[Agent]?
            MinPage := MinShopPagePerPlayer[Agent]?
            MaxPage := MaxShopPagePerPlayer[Agent]?
        then:
            if((Page + 1) < MaxPage):
                if(set CurrentShopPagePerPlayer[Agent] = option{MinPage}){}
            else:
                if(set CurrentShopPagePerPlayer[Agent] = option{Page + 1}){}
            UpdateItem(Agent)
 
    #Handles the button click
    HandleSelectedButton(Message : widget_message): void =
        Player := Message.Player
        if(PlayerUI := GetPlayerUI[Message.Player], MyUI := MaybeMyUIPerPlayer[Message.Player]?):
            SelectedWidget := Message.Source
            StaleButtonUI := FindButtonUI(Player, SelectedWidget)
            if(SelectedButton := StaleButtonUI?):
                ItemIndex := SelectedButton.ItemIndex
                MinItemIndex := SelectedButton.MinItemIndex
                MaxItemIndex := SelectedButton.MaxItemIndex
                Print("Item Index: {ItemIndex}")
                if(Agent := agent[Player]):
                    if(set MainDevice.PlayerItemIndex[Agent] = option{ItemIndex}){}
                    if(set MainDevice.PlayerMinItemIndex[Agent] = option{MinItemIndex}){}  
                    if(set MainDevice.PlayerMaxItemIndex[Agent] = option{MaxItemIndex}){} 
                    UpdateIndex(Agent)
                    UpdateItem(Agent)
 
    #Finds the button with the agent information
    FindButtonUI(Agent : agent, SelectedWidget : widget): ?shop_item =
        for(SelectedButton : ShopItem):
            if(SelectedButtonWidget := SelectedButton.ButtonWidgetPerPlayer[Agent]):
                if(SelectedWidget = SelectedButtonWidget):
                    return option{SelectedButton}
        return false

    UpdatePlayerBudget(Agent : agent): void =
        if:
            BalanceTextBlock := BalanceTextBlockPerPlayer[Agent]?
            PlayerBudget := MainDevice.BudgetPerPlayer[Agent]?
        then:
            BalanceTextBlock.SetText(Convert("Balance: ${PlayerBudget}"))

    BuyItem(Agent : agent): void = 
        if:
            Index := MainDevice.PlayerItemIndex[Agent]?
            Rarity := MainDevice.PlayerChosenRarity[Agent]?
            PlayerBudget := MainDevice.BudgetPerPlayer[Agent]?
            BudgetSpent := MainDevice.BudgetSpentPerPlayer[Agent]?
        then:
            for(SelectedItem : ShopItem):
                if(Index = SelectedItem.ItemIndex):
                    for(SelectedRarity : SelectedItem.ShopItem):
                        if(Rarity = SelectedRarity.ItemRarityIndex):
                            ItemCost := SelectedRarity.ItemCost
                            ItemGranterIndex := SelectedRarity.ItemGranterIndex
                            UsedOutcome := SelectedRarity.UsedOutcome
                                if(PlayerBudget >= ItemCost):
                                    if(set MainDevice.BudgetPerPlayer[Agent] = option{PlayerBudget - ItemCost}){}
                                    if(set MainDevice.BudgetSpentPerPlayer[Agent] = option{BudgetSpent + ItemCost}){}
                                    if(UsedOutcome = 1):
                                        MainDevice.ShopOutcome.SetNextItem(ItemGranterIndex)
                                        MainDevice.ShopOutcome.GrantItem(Agent)
                                    if(UsedOutcome = 2):
                                        MainDevice.ShopOutcome2.SetNextItem(ItemGranterIndex)
                                        MainDevice.ShopOutcome2.GrantItem(Agent)
                                    UpdatePlayerBudget(Agent)
                                else:
                                    spawn {MainDevice.ShowInfo(Agent, "Not Enough Budget To Buy")}
                                
    UpdateItem(Agent : agent): void =
        if:
            Index := MainDevice.PlayerItemIndex[Agent]?
            Rarity := MainDevice.PlayerChosenRarity[Agent]?
            TextureBlock := ItemDisplayTextureBlockPerPlayer[Agent]?
            NameTextBlock := NameTextBlockPerPlayer[Agent]?  
            PriceTextBlock := PriceTextBlockPerPlayer[Agent]? 
            RarityTextBlock := RarityTextBlockPerPlayer[Agent]? 
        then:
            for(SelectedItem : ShopItem):
                if(Index = SelectedItem.ItemIndex):
                    Print("Item index in update: {SelectedItem.ItemIndex}")
                    for(SelectedRarity : SelectedItem.ShopItem):
                        if(Rarity = SelectedRarity.ItemRarityIndex):
                            Print("Item rarity in update: {SelectedRarity.ItemRarityIndex}")
                            ItemCost := SelectedRarity.ItemCost
                            ItemRarity := SelectedRarity.ItemRarity
                            ItemName := SelectedRarity.ItemName
                            ItemTexture := SelectedRarity.ItemTexture    
                            TextureBlock.SetImage(ItemTexture)
                            Print("Item updated")
                            NameTextBlock.SetText(Convert("{ItemName}"))
                            PriceTextBlock.SetText(Convert("Price: ${ItemCost}"))
                            RarityTextBlock.SetText(Convert("{ItemRarity}"))
                            
    UpdateIndex(Agent : agent): void =
        if:
            Rarity := MainDevice.PlayerChosenRarity[Agent]?
            MinIndex := MainDevice.PlayerMinItemIndex[Agent]?
            MaxIndex := MainDevice.PlayerMaxItemIndex[Agent]?
        then:
            if(Rarity > MaxIndex):
                if(set MainDevice.PlayerChosenRarity[Agent] = option{MaxIndex}){} 
            if(Rarity < MinIndex):
                if(set MainDevice.PlayerChosenRarity[Agent] = option{MinIndex}){} 
 
shop_item := class<concrete>():

    var ButtonSize : vector2 = vector2{X := 108.0, Y:= 108.0}
    var TextureSize : vector2 = vector2{X := 89.0, Y:= 89.0}
    @editable var ItemTexture : texture = Assaults_Textures.Assault_Rifle

    #item index set when assigning buttons
    var ItemIndex : int = 0

    #min and max index for each item
    @editable MinItemIndex : int = 0
    @editable MaxItemIndex : int = 0

    #shop items
    @editable ShopItem : []item_setup = array{}

    #shop ui maps
    var ButtonWidgetPerPlayer : [agent]widget = map{}
    var TextureWidgetPerPlayer : [agent]widget = map{}

    #used to mark if the weapon is br/og/ballistic
    @editable_number(int):
        MinValue := option{1}
        MaxValue := option{3}
    ItemType : int = 1

item_setup := class<concrete>():

    @editable ItemCost : int = 0
    @editable ItemRarityIndex : int = 0
    @editable ItemGranterIndex : int = 0
    @editable ItemName : string = ""
    @editable ItemRarity : string = ""
    @editable ItemTexture : texture = Assaults_Textures.Assault_Rifle
    @editable_number(int):
        MinValue := option{1}
        MaxValue := option{2}
    UsedOutcome : int = 1