Inventory.gd 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217
  1. extends WindowPanel
  2. @onready var grid : GridContainer = $Margin/HBoxContainer/ItemsBox/Margin/Container/Grid
  3. @onready var itemButtons : Control = $Margin/HBoxContainer/ItemsBox/ItemButtons
  4. @onready var dropButtons : Control = $Margin/HBoxContainer/ItemsBox/DropButtons
  5. @onready var dropButton : Button = $Margin/HBoxContainer/ItemsBox/ItemButtons/Drop
  6. @onready var useButton : Button = $Margin/HBoxContainer/ItemsBox/ItemButtons/Use
  7. @onready var equipButton : Button = $Margin/HBoxContainer/ItemsBox/ItemButtons/Equip
  8. @onready var unequipButton : Button = $Margin/HBoxContainer/ItemsBox/ItemButtons/Unequip
  9. @onready var lessDropButton : Button = $Margin/HBoxContainer/ItemsBox/DropButtons/Less
  10. @onready var moreDropButton : Button = $Margin/HBoxContainer/ItemsBox/DropButtons/More
  11. @onready var dropLabel : Label = $Margin/HBoxContainer/ItemsBox/DropButtons/Label
  12. @onready var weightStat : Control = $Margin/HBoxContainer/InfoBox/Bars/WeightTex/ProgressBar
  13. @onready var slotStat : Control = $Margin/HBoxContainer/InfoBox/Bars/SlotTex/ProgressBar
  14. @onready var equipmentSlots : Array[CellTile] = [
  15. $Margin/HBoxContainer/InfoBox/EquipmentGrid/Chest,
  16. $Margin/HBoxContainer/InfoBox/EquipmentGrid/Legs,
  17. $Margin/HBoxContainer/InfoBox/EquipmentGrid/Feet,
  18. $Margin/HBoxContainer/InfoBox/EquipmentGrid/Hands,
  19. $Margin/HBoxContainer/InfoBox/EquipmentGrid/Head,
  20. $Margin/HBoxContainer/InfoBox/EquipmentGrid/Neck,
  21. $Margin/HBoxContainer/InfoBox/EquipmentGrid/Weapon,
  22. $Margin/HBoxContainer/InfoBox/EquipmentGrid/Shield,
  23. ]
  24. enum ButtonMode
  25. {
  26. UNKNOWN = -1,
  27. ITEM = 0,
  28. DROP,
  29. }
  30. enum FilterTab
  31. {
  32. ALL = 0,
  33. EQUIPMENT,
  34. USABLE,
  35. COMMON,
  36. QUEST
  37. }
  38. var selectedTile : CellTile = null
  39. var dropValue : int = 1
  40. var buttonMode : ButtonMode = ButtonMode.UNKNOWN
  41. var currentFilter : FilterTab = FilterTab.ALL
  42. #
  43. func IsFiltered(cell : ItemCell, filter : FilterTab) -> bool:
  44. if not cell:
  45. return false
  46. match filter:
  47. FilterTab.ALL: return true
  48. FilterTab.EQUIPMENT: return cell.slot >= ActorCommons.Slot.FIRST_EQUIPMENT and cell.slot <= ActorCommons.Slot.LAST_EQUIPMENT
  49. FilterTab.USABLE: return cell.usable
  50. FilterTab.COMMON: return cell.slot == ActorCommons.Slot.NONE and not cell.usable
  51. FilterTab.QUEST: return cell.slot == ActorCommons.Slot.QUEST
  52. return false
  53. func RefreshInventory():
  54. var count : int = 0
  55. var tileIdx : int = 0
  56. var tile : CellTile = grid.GetTile(tileIdx)
  57. for item in Launcher.Player.inventory.items:
  58. if not item or item.cellID == DB.UnknownHash:
  59. continue
  60. var cell : ItemCell = DB.GetItem(item.cellID, item.cellCustomfield)
  61. if not cell:
  62. continue
  63. if IsFiltered(cell, currentFilter):
  64. count += 1
  65. CellTile.RefreshShortcuts(cell, item.count)
  66. if cell.stackable:
  67. if tile:
  68. tile.AssignData(cell, item.count)
  69. tileIdx += 1
  70. tile = grid.GetTile(tileIdx)
  71. else:
  72. break
  73. else:
  74. for cellIdx in range(item.count):
  75. if tile:
  76. tile.AssignData(cell)
  77. tileIdx += 1
  78. tile = grid.GetTile(tileIdx)
  79. else:
  80. break
  81. elif selectedTile and item and cell == selectedTile.cell:
  82. SelectTile(null)
  83. selectedTile = null
  84. for remainingIdx in range(tileIdx, grid.maxCount):
  85. grid.tiles[remainingIdx].AssignData(null, 0)
  86. weightStat.SetStat(Formula.GetWeight(Launcher.Player.inventory), Launcher.Player.stat.current.weightCapacity)
  87. slotStat.SetStat(count, ActorCommons.InventorySize)
  88. for slot in range(ActorCommons.Slot.FIRST_EQUIPMENT, ActorCommons.Slot.LAST_EQUIPMENT):
  89. equipmentSlots[slot - ActorCommons.Slot.FIRST_EQUIPMENT].AssignData(Launcher.Player.inventory.equipments[slot - ActorCommons.Slot.FIRST_EQUIPMENT])
  90. SelectTile(selectedTile if selectedTile else grid.GetTile(0))
  91. func SelectTile(tile : CellTile):
  92. if selectedTile != tile:
  93. if selectedTile:
  94. selectedTile.RemoveSelection()
  95. selectedTile = tile if tile else grid.GetTile(0)
  96. if selectedTile:
  97. selectedTile.AddSelection()
  98. RefreshItemMode()
  99. func RefreshItemMode():
  100. itemButtons.set_visible(true)
  101. dropButtons.set_visible(false)
  102. if selectedTile and selectedTile.cell and selectedTile.count > 0:
  103. var isEquipment : bool = selectedTile.cell.slot >= ActorCommons.Slot.FIRST_EQUIPMENT and selectedTile.cell.slot < ActorCommons.Slot.LAST_EQUIPMENT
  104. var isEquiped : bool = isEquipment and ActorCommons.IsEquipped(selectedTile.cell)
  105. var isQuestItem : bool = selectedTile.cell.slot == ActorCommons.Slot.QUEST
  106. useButton.set_visible(selectedTile.cell.usable)
  107. dropButton.set_visible(not isQuestItem)
  108. dropButton.set_disabled(false)
  109. equipButton.set_visible(isEquipment and not isEquiped)
  110. unequipButton.set_visible(isEquipment and isEquiped)
  111. else:
  112. dropButton.set_visible(false)
  113. useButton.set_visible(false)
  114. equipButton.set_visible(false)
  115. unequipButton.set_visible(false)
  116. if not dropButton.is_visible() and not useButton.is_visible() and not equipButton.is_visible() and not unequipButton.is_visible():
  117. dropButton.set_visible(true)
  118. dropButton.set_disabled(true)
  119. func SetButtonMode(mode : ButtonMode):
  120. buttonMode = mode
  121. match mode:
  122. ButtonMode.ITEM:
  123. RefreshItemMode()
  124. ButtonMode.DROP:
  125. ResetDropButtons()
  126. RefreshDropMode()
  127. _: assert(false, "Unknown button mode within the inventory window")
  128. func ResetDropButtons():
  129. dropValue = 1
  130. func RefreshDropMode():
  131. itemButtons.set_visible(false)
  132. dropButtons.set_visible(true)
  133. dropValue = clamp(dropValue, 0, selectedTile.count)
  134. lessDropButton.set_disabled(dropValue <= 1)
  135. moreDropButton.set_disabled(dropValue >= selectedTile.count)
  136. dropLabel.set_text(str(dropValue))
  137. #
  138. func _ready():
  139. for tileIdx in range(grid.maxCount):
  140. var tile : CellTile = grid.GetTile(tileIdx)
  141. if tile:
  142. tile.selected.connect(SelectTile)
  143. SetButtonMode(ButtonMode.ITEM)
  144. func _on_visibility_changed():
  145. if visible and grid:
  146. SelectTile(grid.GetTile(0))
  147. func _on_use_pressed():
  148. if selectedTile and selectedTile.count > 0 and selectedTile.cell and selectedTile.cell:
  149. Network.UseItem(selectedTile.cell.id)
  150. func _on_equip_pressed():
  151. if selectedTile and selectedTile.cell:
  152. Network.EquipItem(selectedTile.cell.id, selectedTile.cell.customfield)
  153. func _on_unequip_pressed():
  154. if selectedTile and selectedTile.cell:
  155. Network.UnequipItem(selectedTile.cell.id, selectedTile.cell.customfield)
  156. func _on_drop_pressed():
  157. if selectedTile:
  158. if selectedTile.count == 1:
  159. ResetDropButtons()
  160. _on_confirm_drop_pressed()
  161. else:
  162. SetButtonMode(ButtonMode.DROP)
  163. func _on_drop_cancel_pressed():
  164. SetButtonMode(ButtonMode.ITEM)
  165. func _on_drop_less_pressed():
  166. dropValue -= 1
  167. RefreshDropMode()
  168. func _on_drop_more_pressed():
  169. dropValue += 1
  170. RefreshDropMode()
  171. func _on_confirm_drop_pressed():
  172. if selectedTile and selectedTile.cell:
  173. Network.DropItem(selectedTile.cell.id, selectedTile.cell.customfield, dropValue)
  174. SetButtonMode(ButtonMode.ITEM)
  175. func _on_tab_container_tab_changed(tab : int):
  176. currentFilter = tab as FilterTab
  177. RefreshInventory()