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