/// <summary> /// Adds the inventory slots. /// </summary> private void AddSlots() { int numSlots = rows * columns; _slots = new Slot[numSlots]; int itemCount = _inventory.Count(); for (int index = 0; index < numSlots; index++) { // Add Slot Panel GameObject slotPanel = Instantiate(slotPanelPrefab); slotPanel.transform.SetParent(slotsPanel.transform, false); slotPanel.name = string.Format("Slot {0}", index); Slot slotPanelClass = slotPanel.GetComponent <Slot> (); slotPanelClass.Index = index; _slots [index] = slotPanelClass; // Set slot image for all inventory items if (itemCount > 0 && _inventory.Get(index) != null) { Item item = _inventory.Get(index); SlotImageCanvas.InstantiateInstance(slotImageCanvasPrefab, item, slotPanel, toolTipPanel, toolTipPanelSecondary, slotResolution, slotResolution); itemCount--; } else { // Add null values to inventory _inventory.Add(null); } } }
/// <summary> /// Raises the drop event. /// </summary> /// <param name="eventData">Event data.</param> public void OnDrop(PointerEventData eventData) { // If slot is empty, drop new item into it if (!SlotImage) { // Potentially only allow certain item types SlotImageCanvas slotImageCanvas = SlotImageCanvas.itemBeingDragged.GetComponent <SlotImageCanvas> (); if (IsSlotCompatible(slotImageCanvas)) { slotImageCanvas.DropInSlot(this); } } // If slot is filled, swap items else { SlotImageCanvas targetSlotImageCanvas = SlotImage.GetComponent <SlotImageCanvas> (); SlotImageCanvas sourceSlotImageCanvas = SlotImageCanvas.itemBeingDragged.GetComponent <SlotImageCanvas> (); Slot sourceSlot = sourceSlotImageCanvas.GetSlot(); if (IsSlotCompatible(sourceSlotImageCanvas)) { targetSlotImageCanvas.SwapSlots(targetSlotImageCanvas, sourceSlotImageCanvas, this, sourceSlot); } } }
/// <summary> /// Sets the equipped items. /// </summary> /// <param name="unit">Unit.</param> public void SetEquippedItems(Unit unit) { _inventorySlots = unit.GetInventorySlots(); // Delete existing slot image (if exists) before adding new one. // TODO: Clearly, this is terrible. Come up with better solution. ClearAllSlotImages(); ClearAttributeText(); // Iterate over weapons/armor and add foreach (Item item in _inventorySlots.GetInventorySlots().Values) { SetAllAttributesText(item); GameObject slotPanel = GetPanelBySlot(item.SlotType).transform.Find("Slot").gameObject; RectTransform rectTransform = (RectTransform)slotPanel.transform; float height = rectTransform.rect.height; float width = rectTransform.rect.width; // Create slot images SlotImageCanvas.InstantiateInstance( slotImageCanvasPrefab, item, slotPanel, toolTipPanel, toolTipPanelSecondary, width, height ); } }
/// <summary> /// Swaps the slots of 2 items. /// </summary> /// <param name="slotImageCanvas1">Slot image canvas1.</param> /// <param name="slotImageCanvas2">Slot image canvas2.</param> /// <param name="slotImageCanvasSlot1">Slot image canvas slot1.</param> /// <param name="slotImageCanvasSlot2">Slot image canvas slot2.</param> public void SwapSlots(SlotImageCanvas slotImageCanvas1, SlotImageCanvas slotImageCanvas2, Slot slotImageCanvasSlot1, Slot slotImageCanvasSlot2) { // Update UI UpdateUI(slotImageCanvas1, slotImageCanvasSlot2); UpdateUI(slotImageCanvas2, slotImageCanvasSlot1); // Sawp Inventory _inventoryController.SwapInventory( slotImageCanvas1.GetItem(), slotImageCanvas2.GetItem(), slotImageCanvasSlot1, slotImageCanvasSlot2 ); }
// ----------------------------- POINTER CLICK EVENTS ----------------------------- // /// <summary> /// Raises the pointer click event. /// </summary> /// <param name="eventData">Event data.</param> public void OnPointerClick(PointerEventData eventData) { // Check for double click if (eventData.clickCount == 2) { Slot oldSlot = GetSlot(); // This item is in inventory if (oldSlot.slotType == InventorySlots.SlotType.ANY) { // Get item slot and see if it's filled InventorySlots.SlotType slotType = _item.SlotType; Slot equipmentSlot = _inventoryController.GetEquipmentSlot(slotType); if (equipmentSlot != null) { GameObject slotImageCanvasObject = equipmentSlot.SlotImage; // If there is an item in the equipment slot, swap it out if (slotImageCanvasObject != null) { SlotImageCanvas slotImageCanvas = equipmentSlot.SlotImage.GetComponent <SlotImageCanvas> (); SwapSlots(this, slotImageCanvas, oldSlot, equipmentSlot); } else { // Drop item into slot DropInSlot(equipmentSlot); } // Play SFX PlaySFX(); } } // This item is equipped else if (oldSlot.slotType != InventorySlots.SlotType.ANY) { Slot newSlot = _inventoryController.GetFirstOpenSlot(); if (newSlot != null) { // Drop item into slot DropInSlot(newSlot); // Play SFX PlaySFX(); } } } }
/// <summary> /// Updates the UI of the slot image's location. /// </summary> /// <param name="slotImageCanvas">Slot image canvas.</param> /// <param name="newSlot">New slot.</param> private void UpdateUI(SlotImageCanvas slotImageCanvas, Slot newSlot) { // Make slot the parent of the slot canvas/image slotImageCanvas.transform.SetParent(newSlot.transform, false); // Get height of slot and set the image to that same height just to be safe RectTransform rectTransform = (RectTransform)newSlot.transform; float height = rectTransform.rect.height; float width = rectTransform.rect.width; //rectTransform = (RectTransform)slotImageCanvas.transform.GetChild (0); rectTransform = (RectTransform)slotImageCanvas.transform.Find("SlotImage"); rectTransform.sizeDelta = new Vector2(width, height); rectTransform = (RectTransform)slotImageCanvas.transform.Find("SlotBackgroundImage"); rectTransform.sizeDelta = new Vector2(width * 0.85f, height * 0.85f); }
/// <summary> /// Instantiates the instance. /// </summary> /// <returns>The instance.</returns> /// <param name="slotImageCanvasPrefab">Slot image canvas prefab.</param> /// <param name="item">Item.</param> /// <param name="slotPanel">Slot panel.</param> /// <param name="toolTipPanel">Tool tip panel.</param> /// <param name="toolTipPanelSecondary">Tool tip panel secondary.</param> /// <param name="width">Width.</param> /// <param name="height">Height.</param> public static SlotImageCanvas InstantiateInstance( Canvas slotImageCanvasPrefab, Item item, GameObject slotPanel, GameObject toolTipPanel, GameObject toolTipPanelSecondary, float width, float height ) { // Create canvas for slot image Canvas canvas = Instantiate(slotImageCanvasPrefab) as Canvas; // Resize canvas //RectTransform rectTransform = (RectTransform)canvas.transform; //rectTransform.sizeDelta = new Vector2(width, height); canvas.transform.SetParent(slotPanel.transform, false); // Setup background image Image image = canvas.transform.Find("SlotBackgroundImage").GetComponent <Image>(); image.transform.SetParent(canvas.transform, false); image.color = item.TierColor; RectTransform rectTransform = (RectTransform)image.transform; rectTransform.sizeDelta = new Vector2(width * 0.85f, height * 0.85f); // Setup slot image image = canvas.transform.Find("SlotImage").GetComponent <Image>(); image.transform.SetParent(canvas.transform, false); // Set icon on slot image image.sprite = item.Icon; // Resize image size rectTransform = (RectTransform)image.transform; rectTransform.sizeDelta = new Vector2(width, height); // Pass tool tip info SlotImageCanvas slotImage = canvas.transform.GetComponent <SlotImageCanvas> (); slotImage.Initialize(toolTipPanel, toolTipPanelSecondary, item); return(slotImage); }
/// <summary> /// Determines whether this slot is compatible with the item trying to be added to it. /// </summary> /// <returns><c>true</c> if this instance is slot compatible the specified slotImageCanvas; otherwise, <c>false</c>.</returns> /// <param name="slotImageCanvas">Slot image canvas.</param> private bool IsSlotCompatible(SlotImageCanvas slotImageCanvas) { return(slotType == InventorySlots.SlotType.ANY || slotType == slotImageCanvas.GetItem().SlotType); }