func()

in sort/item_container.go [92:183]


func (c *ItemContainer) Assembly() (ret []*module.Item) {
	newItems := make([]*module.Item, c.size)
	for _, slot := range c.itemMap {
		// 第一轮优先只处理 SortByRandomStrategy, 防止后续需要移动元素位置
		if slot.sortStrategy != SortByRandomStrategy {
			continue
		}
		var itemSet []*module.Item
		if len(slot.items) >= slot.size {
			itemSet = append(itemSet, slot.items[:slot.size]...)
			slot.index = slot.size
		} else {
			itemSet = append(itemSet, slot.items...)
			slot.index = len(slot.items)
		}
		for _, item := range itemSet {
			index := rand.Intn(c.size)
			i := index
			if newItems[i] != nil {
				for i = (index + 1) % c.size; i != index; i = (i + 1) % c.size {
					if newItems[i] == nil {
						break
					}
				}
			}
			if newItems[i] == nil {
				newItems[i] = item
			}
		}
	}

	for _, slot := range c.itemMap {
		// 第二轮不再处理 SortByRandomStrategy, 已经在第一轮处理过
		if slot.sortStrategy == SortByRandomStrategy {
			continue
		}
		var itemSet []*module.Item
		if len(slot.items) >= slot.size {
			itemSet = append(itemSet, slot.items[:slot.size]...)
			slot.index = slot.size
		} else {
			itemSet = append(itemSet, slot.items...)
			slot.index = len(slot.items)
		}
		i := 0
		for _, item := range itemSet {
			for i < c.size && newItems[i] != nil {
				i++
			}
			if i >= c.size {
				break
			}
			newItems[i] = item
			i++
		}
	}
	for _, item := range newItems {
		if item != nil {
			ret = append(ret, item)
		}
	}
	// if ret size not enough
	if len(ret) < c.size {
		diff := c.size - len(ret)
		var diffItems []*module.Item

		// first use ItemDefaultName slot
		if slot, ok := c.itemMap[ItemDefaultName]; ok {
			if len(slot.items) > slot.index {
				diffItems = append(diffItems, slot.items[slot.index:]...)
			}
		}

		if len(diffItems) < diff {
			for name, slot := range c.itemMap {
				if name != ItemDefaultName {
					if len(slot.items) > slot.index {
						diffItems = append(diffItems, slot.items[slot.index:]...)
					}
				}
			}
		}

		if len(diffItems) > diff {
			diffItems = diffItems[:diff]
		}

		ret = append(ret, diffItems...)
	}

	return
}