package com.pkrandom.pokemon;
/*----------------------------------------------------------------------------*/
/*-- GenRestrictions.java - stores what generations the user has limited. --*/
/*-- --*/
/*-- Part of "Universal Pokemon Randomizer ZX" by the UPR-ZX team --*/
/*-- Pokemon and any associated names and the like are --*/
/*-- trademark and (C) Nintendo 1996-2020. --*/
/*-- --*/
/*-- The custom code written here is licensed under the terms of the GPL: --*/
/*-- --*/
/*-- This program is free software: you can redistribute it and/or modify --*/
/*-- it under the terms of the GNU General Public License as published by --*/
/*-- the Free Software Foundation, either version 3 of the License, or --*/
/*-- (at your option) any later version. --*/
/*-- --*/
/*-- This program is distributed in the hope that it will be useful, --*/
/*-- but WITHOUT ANY WARRANTY; without even the implied warranty of --*/
/*-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the --*/
/*-- GNU General Public License for more details. --*/
/*-- --*/
/*-- You should have received a copy of the GNU General Public License --*/
/*-- along with this program. If not, see . --*/
/*----------------------------------------------------------------------------*/
import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;
public class GenRestrictions {
public boolean allow_gen1, allow_gen2, allow_gen3, allow_gen4, allow_gen5, allow_gen6, allow_gen7;
public boolean allow_evolutionary_relatives;
public GenRestrictions() {
}
public GenRestrictions(int state) {
allow_gen1 = (state & 1) > 0;
allow_gen2 = (state & 2) > 0;
allow_gen3 = (state & 4) > 0;
allow_gen4 = (state & 8) > 0;
allow_gen5 = (state & 16) > 0;
allow_gen6 = (state & 32) > 0;
allow_gen7 = (state & 64) > 0;
allow_evolutionary_relatives = (state & 128) > 0;
}
public boolean nothingSelected() {
return !allow_gen1 && !allow_gen2 && !allow_gen3 && !allow_gen4 && !allow_gen5 && !allow_gen6 && !allow_gen7;
}
public int toInt() {
return makeIntSelected(allow_gen1, allow_gen2, allow_gen3, allow_gen4, allow_gen5, allow_gen6, allow_gen7,
allow_evolutionary_relatives);
}
public void limitToGen(int generation) {
if (generation < 2) {
allow_gen2 = false;
}
if (generation < 3) {
allow_gen3 = false;
}
if (generation < 4) {
allow_gen4 = false;
}
if (generation < 5) {
allow_gen5 = false;
}
if (generation < 6) {
allow_gen6 = false;
}
if (generation < 7) {
allow_gen7 = false;
}
}
public boolean allowTrainerSwapMegaEvolvables(boolean isXY, boolean isTypeThemedTrainers) {
if (isTypeThemedTrainers) {
return megaEvolutionsOfEveryTypeAreInPool(isXY);
} else {
return megaEvolutionsAreInPool(isXY);
}
}
public boolean megaEvolutionsOfEveryTypeAreInPool(boolean isXY) {
Set typePool = new HashSet<>();
if (allow_gen1) {
typePool.addAll(Arrays.asList(Type.GRASS, Type.POISON, Type.FIRE, Type.FLYING, Type.WATER, Type.PSYCHIC,
Type.GHOST, Type.NORMAL, Type.BUG, Type.ROCK));
}
if (allow_gen2) {
typePool.addAll(Arrays.asList(Type.ELECTRIC, Type.BUG, Type.STEEL, Type.FIGHTING, Type.DARK,
Type.FIRE, Type.ROCK));
if (!isXY) {
typePool.add(Type.GROUND);
}
}
if (allow_gen3) {
typePool.addAll(Arrays.asList(Type.FIRE, Type.FIGHTING, Type.PSYCHIC, Type.FAIRY, Type.STEEL, Type.ROCK,
Type.ELECTRIC, Type.GHOST, Type.DARK, Type.DRAGON));
if (!isXY) {
typePool.addAll(Arrays.asList(Type.GRASS, Type.WATER, Type.GROUND, Type.FLYING, Type.ICE));
}
}
if (allow_gen4) {
typePool.addAll(Arrays.asList(Type.DRAGON, Type.GROUND, Type.FIGHTING, Type.STEEL, Type.GRASS, Type.ICE));
if (!isXY) {
typePool.addAll(Arrays.asList(Type.NORMAL, Type.PSYCHIC));
}
}
if (allow_gen5 && !isXY) {
typePool.add(Type.NORMAL);
}
if (allow_gen6 && !isXY) {
typePool.addAll(Arrays.asList(Type.ROCK, Type.FAIRY));
}
return typePool.size() == 18;
}
public boolean megaEvolutionsAreInPool(boolean isXY) {
if (isXY) {
return allow_gen1 || allow_gen2 || allow_gen3 || allow_gen4;
} else {
return allow_gen1 || allow_gen2 || allow_gen3 || allow_gen4 || allow_gen5 || allow_gen6;
}
}
private int makeIntSelected(boolean... switches) {
if (switches.length > 32) {
// No can do
return 0;
}
int initial = 0;
int state = 1;
for (boolean b : switches) {
initial |= b ? state : 0;
state *= 2;
}
return initial;
}
}