package javastory.game.data; import java.util.ArrayList; import java.util.Collections; import java.util.List; import javastory.tools.Randomizer; import com.google.common.base.Preconditions; import com.google.common.collect.Lists; /** * * @author shoftee */ public class RandomRewardList { private final List<RandomRewardEntry> entries; public RandomRewardList() { this.entries = Lists.newLinkedList(); } public void addEntry(final int probability, final int itemId) { this.entries.add(new RandomRewardEntry(probability, itemId)); } public void addEntry(final RandomRewardEntry entry) { this.entries.add(entry); } public RandomRewardFactory build() { return new ConcreteRandomRewardFactory(this.entries); } static class ConcreteRandomRewardFactory implements RandomRewardFactory { private final List<RandomRewardEntry> entries; private int total; public ConcreteRandomRewardFactory(final List<RandomRewardEntry> list) { final ArrayList<RandomRewardEntry> shuffledList = Lists.newArrayList(list); Collections.shuffle(shuffledList); this.entries = Lists.newArrayListWithExpectedSize(shuffledList.size()); for (final RandomRewardEntry entry : shuffledList) { this.entries.add(entry); this.total += entry.Probability; } } @Override public int getRandomItem() { int factor = Randomizer.nextInt(this.total); int itemId = -1; for (final RandomRewardEntry entry : this.entries) { factor -= entry.Probability; if (factor <= 0) { itemId = entry.ItemId; break; } } Preconditions.checkState(itemId != -1); return itemId; } } }