mirror of
https://github.com/Card-Forge/forge.git
synced 2025-11-18 11:48:02 +00:00
Added option to start quests with a precon deck
This commit is contained in:
1
.gitattributes
vendored
1
.gitattributes
vendored
@@ -11529,6 +11529,7 @@ src/main/java/forge/quest/data/QuestDuel.java svneol=native#text/plain
|
|||||||
src/main/java/forge/quest/data/QuestEvent.java -text
|
src/main/java/forge/quest/data/QuestEvent.java -text
|
||||||
src/main/java/forge/quest/data/QuestEventManager.java svneol=native#text/plain
|
src/main/java/forge/quest/data/QuestEventManager.java svneol=native#text/plain
|
||||||
src/main/java/forge/quest/data/QuestPreferences.java svneol=native#text/plain
|
src/main/java/forge/quest/data/QuestPreferences.java svneol=native#text/plain
|
||||||
|
src/main/java/forge/quest/data/QuestStartPool.java -text
|
||||||
src/main/java/forge/quest/data/QuestUtil.java svneol=native#text/plain
|
src/main/java/forge/quest/data/QuestUtil.java svneol=native#text/plain
|
||||||
src/main/java/forge/quest/data/QuestUtilCards.java -text
|
src/main/java/forge/quest/data/QuestUtilCards.java -text
|
||||||
src/main/java/forge/quest/data/bazaar/QuestStallDefinition.java svneol=native#text/plain
|
src/main/java/forge/quest/data/bazaar/QuestStallDefinition.java svneol=native#text/plain
|
||||||
|
|||||||
@@ -1,12 +1,5 @@
|
|||||||
package forge.gui.home.quest;
|
package forge.gui.home.quest;
|
||||||
|
|
||||||
import java.io.File;
|
|
||||||
import java.io.FilenameFilter;
|
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
import javax.swing.JOptionPane;
|
|
||||||
|
|
||||||
import forge.AllZone;
|
import forge.AllZone;
|
||||||
import forge.Command;
|
import forge.Command;
|
||||||
import forge.Singletons;
|
import forge.Singletons;
|
||||||
@@ -17,6 +10,15 @@ import forge.properties.NewConstants;
|
|||||||
import forge.quest.data.QuestData;
|
import forge.quest.data.QuestData;
|
||||||
import forge.quest.data.QuestDataIO;
|
import forge.quest.data.QuestDataIO;
|
||||||
import forge.quest.data.QuestPreferences.QPref;
|
import forge.quest.data.QuestPreferences.QPref;
|
||||||
|
import forge.quest.data.QuestStartPool;
|
||||||
|
|
||||||
|
import javax.swing.*;
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.FilenameFilter;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
import static forge.quest.data.QuestStartPool.*;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* TODO: Write javadoc for this type.
|
* TODO: Write javadoc for this type.
|
||||||
@@ -139,6 +141,16 @@ public enum CSubmenuQuestData implements ICSubmenu {
|
|||||||
"ControlQuest() > newQuest(): Error starting new quest!");
|
"ControlQuest() > newQuest(): Error starting new quest!");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
final QuestStartPool startPool;
|
||||||
|
final String startPrecon = view.getPrecon();
|
||||||
|
if (view.getRadCompleteStart().isSelected()) {
|
||||||
|
startPool = COMPLETE;
|
||||||
|
} else if (view.getRadStandardStart().isSelected()) {
|
||||||
|
startPool = STANDARD;
|
||||||
|
} else {
|
||||||
|
startPool = PRECON;
|
||||||
|
}
|
||||||
|
|
||||||
final Object o = JOptionPane.showInputDialog(null, "Poets will remember your quest as:", "Quest Name", JOptionPane.OK_CANCEL_OPTION);
|
final Object o = JOptionPane.showInputDialog(null, "Poets will remember your quest as:", "Quest Name", JOptionPane.OK_CANCEL_OPTION);
|
||||||
|
|
||||||
if (o == null) { return; }
|
if (o == null) { return; }
|
||||||
@@ -151,7 +163,7 @@ public enum CSubmenuQuestData implements ICSubmenu {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Give the user a few cards to build a deck
|
// Give the user a few cards to build a deck
|
||||||
newdata.newGame(difficulty, mode, view.getCbStandardStart().isSelected());
|
newdata.newGame(difficulty, mode, startPool, startPrecon);
|
||||||
newdata.setName(questName);
|
newdata.setName(questName);
|
||||||
newdata.saveData();
|
newdata.saveData();
|
||||||
|
|
||||||
|
|||||||
@@ -1,22 +1,17 @@
|
|||||||
package forge.gui.home.quest;
|
package forge.gui.home.quest;
|
||||||
|
|
||||||
import javax.swing.ButtonGroup;
|
|
||||||
import javax.swing.JCheckBox;
|
|
||||||
import javax.swing.JPanel;
|
|
||||||
import javax.swing.JRadioButton;
|
|
||||||
import javax.swing.SwingConstants;
|
|
||||||
|
|
||||||
import net.miginfocom.swing.MigLayout;
|
|
||||||
import forge.gui.home.EMenuGroup;
|
import forge.gui.home.EMenuGroup;
|
||||||
import forge.gui.home.EMenuItem;
|
import forge.gui.home.EMenuItem;
|
||||||
import forge.gui.home.ICSubmenu;
|
import forge.gui.home.ICSubmenu;
|
||||||
import forge.gui.home.IVSubmenu;
|
import forge.gui.home.IVSubmenu;
|
||||||
import forge.gui.toolbox.FCheckBox;
|
import forge.gui.toolbox.*;
|
||||||
import forge.gui.toolbox.FLabel;
|
import forge.quest.data.QuestData;
|
||||||
import forge.gui.toolbox.FPanel;
|
|
||||||
import forge.gui.toolbox.FRadioButton;
|
import net.miginfocom.swing.MigLayout;
|
||||||
import forge.gui.toolbox.FScrollPane;
|
|
||||||
import forge.gui.toolbox.FSkin;
|
import javax.swing.*;
|
||||||
|
import java.awt.event.ActionEvent;
|
||||||
|
import java.awt.event.ActionListener;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Singleton instance of "Colors" submenu in "Constructed" group.
|
* Singleton instance of "Colors" submenu in "Constructed" group.
|
||||||
@@ -35,10 +30,15 @@ public enum VSubmenuQuestData implements IVSubmenu {
|
|||||||
private final JRadioButton radMedium = new FRadioButton("Medium");
|
private final JRadioButton radMedium = new FRadioButton("Medium");
|
||||||
private final JRadioButton radHard = new FRadioButton("Hard");
|
private final JRadioButton radHard = new FRadioButton("Hard");
|
||||||
private final JRadioButton radExpert = new FRadioButton("Expert");
|
private final JRadioButton radExpert = new FRadioButton("Expert");
|
||||||
|
|
||||||
private final JRadioButton radFantasy = new FRadioButton("Fantasy");
|
private final JRadioButton radFantasy = new FRadioButton("Fantasy");
|
||||||
private final JRadioButton radClassic = new FRadioButton("Classic");
|
private final JRadioButton radClassic = new FRadioButton("Classic");
|
||||||
|
|
||||||
private final JCheckBox cbStandardStart = new FCheckBox("Standard (Type 2) Starting Pool");
|
private final JRadioButton radCompleteStart = new FRadioButton("Unrestricted Starting Pool");
|
||||||
|
private final JRadioButton radStandardStart = new FRadioButton("Standard (Type 2) Starting Pool");
|
||||||
|
private final JRadioButton radPreconStart = new FRadioButton("Preconstructed Deck: ");
|
||||||
|
private final JComboBox cbxPrecon = new JComboBox();
|
||||||
|
|
||||||
private final FLabel btnEmbark = new FLabel.Builder().opaque(true).hoverable(true).text("Embark!").build();
|
private final FLabel btnEmbark = new FLabel.Builder().opaque(true).hoverable(true).text("Embark!").build();
|
||||||
|
|
||||||
/* (non-Javadoc)
|
/* (non-Javadoc)
|
||||||
@@ -73,14 +73,32 @@ public enum VSubmenuQuestData implements IVSubmenu {
|
|||||||
group1.add(radMedium);
|
group1.add(radMedium);
|
||||||
group1.add(radHard);
|
group1.add(radHard);
|
||||||
group1.add(radExpert);
|
group1.add(radExpert);
|
||||||
|
|
||||||
radEasy.setSelected(true);
|
radEasy.setSelected(true);
|
||||||
radClassic.setSelected(true);
|
|
||||||
|
|
||||||
final ButtonGroup group2 = new ButtonGroup();
|
final ButtonGroup group2 = new ButtonGroup();
|
||||||
group2.add(radFantasy);
|
group2.add(radFantasy);
|
||||||
group2.add(radClassic);
|
group2.add(radClassic);
|
||||||
|
radClassic.setSelected(true);
|
||||||
|
|
||||||
|
final ActionListener preconListener = new ActionListener() {
|
||||||
|
@Override public void actionPerformed(ActionEvent actionEvent) {
|
||||||
|
cbxPrecon.setEnabled(radPreconStart.isSelected());
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
for (String preconDeck : QuestData.getPrecons().getNames()) {
|
||||||
|
cbxPrecon.addItem(preconDeck);
|
||||||
|
}
|
||||||
|
|
||||||
|
final ButtonGroup group3 = new ButtonGroup();
|
||||||
|
group3.add(radCompleteStart);
|
||||||
|
radCompleteStart.addActionListener(preconListener);
|
||||||
|
group3.add(radStandardStart);
|
||||||
|
radStandardStart.addActionListener(preconListener);
|
||||||
|
group3.add(radPreconStart);
|
||||||
|
radPreconStart.addActionListener(preconListener);
|
||||||
|
radCompleteStart.setSelected(true);
|
||||||
|
cbxPrecon.setEnabled(false);
|
||||||
final JPanel pnlOptions = new JPanel();
|
final JPanel pnlOptions = new JPanel();
|
||||||
pnlOptions.setOpaque(false);
|
pnlOptions.setOpaque(false);
|
||||||
pnlOptions.setLayout(new MigLayout("insets 0, gap 0"));
|
pnlOptions.setLayout(new MigLayout("insets 0, gap 0"));
|
||||||
@@ -91,8 +109,11 @@ public enum VSubmenuQuestData implements IVSubmenu {
|
|||||||
pnlOptions.add(radMedium, constraints + ", gap 7.5% 2.5% 0 0");
|
pnlOptions.add(radMedium, constraints + ", gap 7.5% 2.5% 0 0");
|
||||||
pnlOptions.add(radClassic, constraints + ", wrap");
|
pnlOptions.add(radClassic, constraints + ", wrap");
|
||||||
pnlOptions.add(radHard, constraints + ", gap 7.5% 2.5% 0 0");
|
pnlOptions.add(radHard, constraints + ", gap 7.5% 2.5% 0 0");
|
||||||
pnlOptions.add(cbStandardStart, constraints + ", wrap");
|
pnlOptions.add(radCompleteStart, constraints + ", wrap");
|
||||||
pnlOptions.add(radExpert, constraints + ", gap 7.5% 2.5% 0 0, wrap");
|
pnlOptions.add(radExpert, constraints + ", gap 7.5% 2.5% 0 0 ");
|
||||||
|
pnlOptions.add(radStandardStart, constraints + ", wrap");
|
||||||
|
pnlOptions.add(radPreconStart, constraints + ", wrap, skip");
|
||||||
|
pnlOptions.add(cbxPrecon, "gap 20 0, w 30%!, h 35px!, wrap, skip");
|
||||||
|
|
||||||
pnlOptions.add(btnEmbark, "w 40%!, h 30px!, gap 30% 0 20px 0, span 3 1");
|
pnlOptions.add(btnEmbark, "w 40%!, h 30px!, gap 30% 0 20px 0, span 3 1");
|
||||||
|
|
||||||
@@ -111,7 +132,7 @@ public enum VSubmenuQuestData implements IVSubmenu {
|
|||||||
pnlViewport.add(scr, "w 96%!, pushy, growy, gap 2% 0 0 30px");
|
pnlViewport.add(scr, "w 96%!, pushy, growy, gap 2% 0 0 30px");
|
||||||
|
|
||||||
pnlViewport.add(pnlTitleNew, "w 96%, h 36px!, gap 2% 0 0 10px");
|
pnlViewport.add(pnlTitleNew, "w 96%, h 36px!, gap 2% 0 0 10px");
|
||||||
pnlViewport.add(pnlOptions, "w 96%!, h 200px!, gap 2% 0 0 20px");
|
pnlViewport.add(pnlOptions, "w 96%!, h 250px!, gap 2% 0 0 20px");
|
||||||
|
|
||||||
pnl.add(new FScrollPane(pnlViewport), "w 100%!, h 100%!");
|
pnl.add(new FScrollPane(pnlViewport), "w 100%!, h 100%!");
|
||||||
}
|
}
|
||||||
@@ -192,11 +213,24 @@ public enum VSubmenuQuestData implements IVSubmenu {
|
|||||||
return radClassic;
|
return radClassic;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** @return {@link javax.swing.JCheckBox} */
|
public JRadioButton getRadCompleteStart() {
|
||||||
public JCheckBox getCbStandardStart() {
|
return radCompleteStart;
|
||||||
return cbStandardStart;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** @return {@link javax.swing.JCheckBox} */
|
||||||
|
public JRadioButton getRadStandardStart() {
|
||||||
|
return radStandardStart;
|
||||||
|
}
|
||||||
|
|
||||||
|
public JRadioButton getRadPreconStart() {
|
||||||
|
return radPreconStart;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getPrecon() {
|
||||||
|
return (String) cbxPrecon.getSelectedItem();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/** @return {@link forge.gui.toolbox.FLabel} */
|
/** @return {@link forge.gui.toolbox.FLabel} */
|
||||||
public FLabel getBtnEmbark() {
|
public FLabel getBtnEmbark() {
|
||||||
return btnEmbark;
|
return btnEmbark;
|
||||||
|
|||||||
@@ -17,28 +17,19 @@
|
|||||||
*/
|
*/
|
||||||
package forge.quest.data;
|
package forge.quest.data;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
|
|
||||||
import forge.Singletons;
|
import forge.Singletons;
|
||||||
import forge.deck.Deck;
|
import forge.deck.Deck;
|
||||||
import forge.item.CardPrinted;
|
import forge.item.*;
|
||||||
import forge.item.InventoryItem;
|
|
||||||
import forge.item.ItemPool;
|
|
||||||
import forge.item.ItemPoolView;
|
|
||||||
import forge.item.PreconDeck;
|
|
||||||
import forge.properties.ForgeProps;
|
import forge.properties.ForgeProps;
|
||||||
import forge.properties.NewConstants;
|
import forge.properties.NewConstants;
|
||||||
import forge.quest.data.QuestPreferences.QPref;
|
import forge.quest.data.QuestPreferences.QPref;
|
||||||
import forge.quest.data.item.QuestInventory;
|
import forge.quest.data.item.QuestInventory;
|
||||||
import forge.quest.data.pet.QuestPetManager;
|
import forge.quest.data.pet.QuestPetManager;
|
||||||
import forge.util.Predicate;
|
import forge.util.*;
|
||||||
import forge.util.StorageView;
|
|
||||||
import forge.util.IStorage;
|
import java.util.ArrayList;
|
||||||
import forge.util.IStorageView;
|
import java.util.HashMap;
|
||||||
import forge.util.MyRandom;
|
import java.util.List;
|
||||||
|
|
||||||
//when you create QuestDataOld and AFTER you copy the AI decks over
|
//when you create QuestDataOld and AFTER you copy the AI decks over
|
||||||
//you have to call one of these two methods below
|
//you have to call one of these two methods below
|
||||||
@@ -172,8 +163,8 @@ public final class QuestData {
|
|||||||
private transient QuestEvent currentEvent;
|
private transient QuestEvent currentEvent;
|
||||||
|
|
||||||
// This is used by shop. Had no idea where else to place this
|
// This is used by shop. Had no idea where else to place this
|
||||||
private static transient IStorageView<PreconDeck> preconManager = new StorageView<PreconDeck>(new PreconReader(
|
private static transient IStorageView<PreconDeck> preconManager =
|
||||||
ForgeProps.getFile(NewConstants.Quest.PRECONS)));
|
new StorageView<PreconDeck>(new PreconReader(ForgeProps.getFile(NewConstants.Quest.PRECONS)));
|
||||||
|
|
||||||
/** The Constant RANK_TITLES. */
|
/** The Constant RANK_TITLES. */
|
||||||
public static final String[] RANK_TITLES = new String[] { "Level 0 - Confused Wizard", "Level 1 - Mana Mage",
|
public static final String[] RANK_TITLES = new String[] { "Level 0 - Confused Wizard", "Level 1 - Mana Mage",
|
||||||
@@ -235,22 +226,34 @@ public final class QuestData {
|
|||||||
*
|
*
|
||||||
* @param diff
|
* @param diff
|
||||||
* the diff
|
* the diff
|
||||||
* @param m0de
|
* @param mode
|
||||||
* the m0de
|
* the mode
|
||||||
* @param standardStart
|
* @param startPool
|
||||||
* the standard start
|
* the start type
|
||||||
*/
|
*/
|
||||||
public void newGame(final int diff, final String m0de, final boolean standardStart) {
|
public void newGame(final int diff, final String mode, final QuestStartPool startPool, final String preconName) {
|
||||||
this.setDifficulty(diff);
|
this.setDifficulty(diff);
|
||||||
|
|
||||||
final Predicate<CardPrinted> filter = standardStart ? Singletons.getModel().getFormats().getStandard()
|
this.mode = mode;
|
||||||
.getFilterPrinted() : CardPrinted.Predicates.Presets.IS_TRUE;
|
|
||||||
|
|
||||||
this.myCards.setupNewGameCardPool(filter, diff);
|
|
||||||
this.setCredits(Singletons.getModel().getQuestPreferences().getPreferenceInt(QPref.STARTING_CREDITS, diff));
|
|
||||||
|
|
||||||
this.mode = m0de;
|
|
||||||
this.life = this.mode.equals(QuestData.FANTASY) ? 15 : 20;
|
this.life = this.mode.equals(QuestData.FANTASY) ? 15 : 20;
|
||||||
|
|
||||||
|
final Predicate<CardPrinted> filter;
|
||||||
|
switch (startPool) {
|
||||||
|
case PRECON:
|
||||||
|
myCards.addPreconDeck(preconManager.get(preconName));
|
||||||
|
return;
|
||||||
|
|
||||||
|
case STANDARD:
|
||||||
|
filter = Singletons.getModel().getFormats().getStandard().getFilterPrinted();
|
||||||
|
break;
|
||||||
|
|
||||||
|
default: //Unrestricted
|
||||||
|
filter = CardPrinted.Predicates.Presets.IS_TRUE;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
this.setCredits(Singletons.getModel().getQuestPreferences().getPreferenceInt(QPref.STARTING_CREDITS, diff));
|
||||||
|
this.myCards.setupNewGameCardPool(filter, diff);
|
||||||
}
|
}
|
||||||
|
|
||||||
// All belongings
|
// All belongings
|
||||||
|
|||||||
7
src/main/java/forge/quest/data/QuestStartPool.java
Normal file
7
src/main/java/forge/quest/data/QuestStartPool.java
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
package forge.quest.data;
|
||||||
|
|
||||||
|
public enum QuestStartPool {
|
||||||
|
COMPLETE,
|
||||||
|
STANDARD,
|
||||||
|
PRECON
|
||||||
|
}
|
||||||
@@ -17,30 +17,21 @@
|
|||||||
*/
|
*/
|
||||||
package forge.quest.data;
|
package forge.quest.data;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Map.Entry;
|
|
||||||
|
|
||||||
import net.slightlymagic.braids.util.lambda.Lambda1;
|
|
||||||
import forge.Singletons;
|
import forge.Singletons;
|
||||||
import forge.card.BoosterGenerator;
|
import forge.card.BoosterGenerator;
|
||||||
import forge.card.CardEdition;
|
import forge.card.CardEdition;
|
||||||
import forge.card.FormatCollection;
|
import forge.card.FormatCollection;
|
||||||
import forge.deck.Deck;
|
import forge.deck.Deck;
|
||||||
import forge.item.BoosterPack;
|
import forge.item.*;
|
||||||
import forge.item.CardDb;
|
|
||||||
import forge.item.CardPrinted;
|
|
||||||
import forge.item.FatPack;
|
|
||||||
import forge.item.InventoryItem;
|
|
||||||
import forge.item.ItemPool;
|
|
||||||
import forge.item.ItemPoolView;
|
|
||||||
import forge.item.OpenablePack;
|
|
||||||
import forge.item.PreconDeck;
|
|
||||||
import forge.item.TournamentPack;
|
|
||||||
import forge.quest.BoosterUtils;
|
import forge.quest.BoosterUtils;
|
||||||
import forge.quest.data.QuestPreferences.QPref;
|
import forge.quest.data.QuestPreferences.QPref;
|
||||||
import forge.util.MyRandom;
|
import forge.util.MyRandom;
|
||||||
import forge.util.Predicate;
|
import forge.util.Predicate;
|
||||||
|
import net.slightlymagic.braids.util.lambda.Lambda1;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map.Entry;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This is a helper class to execute operations on QuestData. It has been
|
* This is a helper class to execute operations on QuestData. It has been
|
||||||
@@ -222,11 +213,15 @@ public final class QuestUtilCards {
|
|||||||
if (this.q.getCredits() >= value) {
|
if (this.q.getCredits() >= value) {
|
||||||
this.q.setCredits(this.q.getCredits() - value);
|
this.q.setCredits(this.q.getCredits() - value);
|
||||||
this.q.getShopList().remove(precon);
|
this.q.getShopList().remove(precon);
|
||||||
this.q.getMyDecks().add(precon.getDeck());
|
addPreconDeck(precon);
|
||||||
this.addAllCards(precon.getDeck().getMain().toFlatList());
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void addPreconDeck(PreconDeck precon) {
|
||||||
|
this.q.getMyDecks().add(precon.getDeck());
|
||||||
|
this.addAllCards(precon.getDeck().getMain().toFlatList());
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sell card.
|
* Sell card.
|
||||||
*
|
*
|
||||||
@@ -357,7 +352,9 @@ public final class QuestUtilCards {
|
|||||||
*/
|
*/
|
||||||
public void generateTournamentsInShop(final int count) {
|
public void generateTournamentsInShop(final int count) {
|
||||||
Predicate<CardEdition> hasTournament = CardEdition.Predicates.HAS_TOURNAMENT_PACK;
|
Predicate<CardEdition> hasTournament = CardEdition.Predicates.HAS_TOURNAMENT_PACK;
|
||||||
this.q.getShopList().addAllFlat(hasTournament.random(Singletons.getModel().getEditions(), count, TournamentPack.FN_FROM_SET));
|
this.q.getShopList().addAllFlat(hasTournament.random(Singletons.getModel().getEditions(),
|
||||||
|
count,
|
||||||
|
TournamentPack.FN_FROM_SET));
|
||||||
}
|
}
|
||||||
|
|
||||||
public void generateFatPacksInShop(final int count) {
|
public void generateFatPacksInShop(final int count) {
|
||||||
|
|||||||
Reference in New Issue
Block a user