class Rsrb::Item::Container
Constants
- MAX_ITEMS
Attributes
always_stack[R]
capacity[R]
fire_events[RW]
items[R]
listeners[R]
Public Class Methods
new(always_stack, capacity)
click to toggle source
# File lib/rsrb/model/item.rb, line 252 def initialize(always_stack, capacity) @capacity = capacity @items = Array.new(@capacity, nil) @listeners = [] @always_stack = always_stack @fire_events = true end
transfer(from, to, slot, id)
click to toggle source
# File lib/rsrb/model/item.rb, line 355 def Container.transfer(from, to, slot, id) item = from.items[slot] return false if item == nil or item.id != id success = to.add item from.set slot, nil if success success end
Public Instance Methods
add(item)
click to toggle source
# File lib/rsrb/model/item.rb, line 260 def add(item) if item.definition.properties[:stackable] or @always_stack new = @items.find {|e| e && e.id == item.id } i = @items.index(new) existing = new != nil if existing count = item.count + new.count return false if count > MAX_ITEMS || count < 1 set i, Item.new(new.id, count) return true else slot = get_free_slot set slot, item if slot != -1 return slot != -1 end else slots = free_slots return false unless slots >= item.count fire = @fire_events @fire_events = false begin item.count.times { set get_free_slot, Item.new(item.id) } fire_items_changed if fire return true ensure @fire_events = fire end end return false end
add_listener(listener)
click to toggle source
# File lib/rsrb/model/item.rb, line 386 def add_listener(listener) @listeners << listener listener.items_changed self end
clear()
click to toggle source
# File lib/rsrb/model/item.rb, line 429 def clear @items = Array.new(@capacity, nil) fire_items_changed if @fire_events end
contains(id)
click to toggle source
# File lib/rsrb/model/item.rb, line 382 def contains(id) slot_for_id(id) != -1 end
count(id)
click to toggle source
# File lib/rsrb/model/item.rb, line 370 def count(id) @items.inject(0) {|sum, v| v != nil && v.id == id ? sum + v.count : sum } end
fire_items_changed()
click to toggle source
# File lib/rsrb/model/item.rb, line 450 def fire_items_changed @listeners.each {|e| e.items_changed self } end
fire_slot_changed(slot)
click to toggle source
# File lib/rsrb/model/item.rb, line 438 def fire_slot_changed(slot) @listeners.each {|e| e.slot_changed self, slot } end
fire_slots_changed(slots)
click to toggle source
# File lib/rsrb/model/item.rb, line 444 def fire_slots_changed(slots) @listeners.each {|e| e.slots_changed self, slots } end
free_slots()
click to toggle source
# File lib/rsrb/model/item.rb, line 434 def free_slots @capacity-size end
get_free_slot()
click to toggle source
# File lib/rsrb/model/item.rb, line 397 def get_free_slot @items.index nil or -1 end
has_room_for(item)
click to toggle source
# File lib/rsrb/model/item.rb, line 401 def has_room_for(item) if ItemDefinition.for_id(item.id).properties[:stackable] or @always_stack new = @items.find {|e| e && e.id == item.id } existing = new != nil if existing count = item.count + new.count return false if count > MAX_ITEMS or count < 1 return true end get_free_slot != -1 else free_slots >= item.count end end
insert(from_slot, to_slot)
click to toggle source
# File lib/rsrb/model/item.rb, line 297 def insert(from_slot, to_slot) if @items[to_slot] == nil swap from_slot, to_slot else while from_slot != to_slot if from_slot > to_slot swap from_slot, from_slot - 1, true from_slot -= 1 elsif from_slot < to_slot swap from_slot, from_slot + 1, true from_slot += 1 end end end fire_items_changed if @fire_events end
is_slot_free(slot)
click to toggle source
# File lib/rsrb/model/item.rb, line 421 def is_slot_free(slot) @items[slot] == nil end
is_slot_used(slot)
click to toggle source
# File lib/rsrb/model/item.rb, line 417 def is_slot_used(slot) @items[slot] != nil end
item_for_id(id)
click to toggle source
# File lib/rsrb/model/item.rb, line 374 def item_for_id(id) @items.find {|e| e && e.id == id } end
remove(preferred, item)
click to toggle source
# File lib/rsrb/model/item.rb, line 320 def remove(preferred, item) removed = 0 if item.definition.properties[:stackable] or @always_stack slot = slot_for_id item.id stack = @items[slot] if stack.count > item.count removed = item.count set slot, Item.new(stack.id, stack.count - item.count) else removed = stack.count set slot, nil end else item.count.times {|i| slot = slot_for_id item.id if i == 0 && preferred != -1 in_slot = @items[preferred] slot = preferred if in_slot.id == item.id end if slot != -1 removed += 1 set slot, nil else break end } end return removed end
remove_empty_slots()
click to toggle source
# File lib/rsrb/model/item.rb, line 391 def remove_empty_slots kept = @items.reject {|e| e == nil } @items = kept + ([nil] * (@capacity-kept.size)) fire_items_changed if @fire_events end
set(index, item)
click to toggle source
# File lib/rsrb/model/item.rb, line 315 def set(index, item) @items[index] = item fire_slot_changed index if @fire_events end
size()
click to toggle source
# File lib/rsrb/model/item.rb, line 425 def size @items.count {|i| i != nil } end
slot_for_id(id)
click to toggle source
# File lib/rsrb/model/item.rb, line 378 def slot_for_id(id) @items.index {|e| e && e.id == id } or -1 end
swap(from, to, stfu = false)
click to toggle source
# File lib/rsrb/model/item.rb, line 364 def swap(from, to, stfu = false) @items[from], @items[to] = @items[to], @items[from] slots = [from, to] fire_slots_changed(slots) if @fire_events && !stfu end