summaryrefslogtreecommitdiff
path: root/src/com/pkrandom/constants/GlobalConstants.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/com/pkrandom/constants/GlobalConstants.java')
-rw-r--r--src/com/pkrandom/constants/GlobalConstants.java252
1 files changed, 252 insertions, 0 deletions
diff --git a/src/com/pkrandom/constants/GlobalConstants.java b/src/com/pkrandom/constants/GlobalConstants.java
new file mode 100644
index 0000000..c4d1352
--- /dev/null
+++ b/src/com/pkrandom/constants/GlobalConstants.java
@@ -0,0 +1,252 @@
+package com.pkrandom.constants;
+
+/*----------------------------------------------------------------------------*/
+/*-- GlobalConstants.java - constants that are relevant for multiple games --*/
+/*-- in the Pokemon series --*/
+/*-- --*/
+/*-- 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 <http://www.gnu.org/licenses/>. --*/
+/*----------------------------------------------------------------------------*/
+
+import com.pkrandom.pokemon.*;
+
+import java.util.*;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+public class GlobalConstants {
+
+ public static final boolean[] bannedRandomMoves = new boolean[827], bannedForDamagingMove = new boolean[827];
+ static {
+ bannedRandomMoves[Moves.struggle] = true; // self explanatory
+
+ bannedForDamagingMove[Moves.selfDestruct] = true;
+ bannedForDamagingMove[Moves.dreamEater] = true;
+ bannedForDamagingMove[Moves.explosion] = true;
+ bannedForDamagingMove[Moves.snore] = true;
+ bannedForDamagingMove[Moves.falseSwipe] = true;
+ bannedForDamagingMove[Moves.futureSight] = true;
+ bannedForDamagingMove[Moves.fakeOut] = true;
+ bannedForDamagingMove[Moves.focusPunch] = true;
+ bannedForDamagingMove[Moves.doomDesire] = true;
+ bannedForDamagingMove[Moves.feint] = true;
+ bannedForDamagingMove[Moves.lastResort] = true;
+ bannedForDamagingMove[Moves.suckerPunch] = true;
+ bannedForDamagingMove[Moves.constrict] = true; // overly weak
+ bannedForDamagingMove[Moves.rage] = true; // lock-in in gen1
+ bannedForDamagingMove[Moves.rollout] = true; // lock-in
+ bannedForDamagingMove[Moves.iceBall] = true; // Rollout clone
+ bannedForDamagingMove[Moves.synchronoise] = true; // hard to use
+ bannedForDamagingMove[Moves.shellTrap] = true; // hard to use
+ bannedForDamagingMove[Moves.foulPlay] = true; // doesn't depend on your own attacking stat
+ bannedForDamagingMove[Moves.spitUp] = true; // hard to use
+
+ // make sure these cant roll
+ bannedForDamagingMove[Moves.sonicBoom] = true;
+ bannedForDamagingMove[Moves.dragonRage] = true;
+ bannedForDamagingMove[Moves.hornDrill] = true;
+ bannedForDamagingMove[Moves.guillotine] = true;
+ bannedForDamagingMove[Moves.fissure] = true;
+ bannedForDamagingMove[Moves.sheerCold] = true;
+
+ }
+
+ /* @formatter:off */
+ public static final List<Integer> normalMultihitMoves = Arrays.asList(
+ Moves.armThrust, Moves.barrage, Moves.boneRush, Moves.bulletSeed, Moves.cometPunch, Moves.doubleSlap,
+ Moves.furyAttack, Moves.furySwipes, Moves.icicleSpear, Moves.pinMissile, Moves.rockBlast, Moves.spikeCannon,
+ Moves.tailSlap, Moves.waterShuriken);
+
+ public static final List<Integer> doubleHitMoves = Arrays.asList(
+ Moves.bonemerang, Moves.doubleHit, Moves.doubleIronBash, Moves.doubleKick, Moves.dragonDarts,
+ Moves.dualChop, Moves.gearGrind, Moves.twineedle);
+
+ public static final List<Integer> varyingPowerZMoves = Arrays.asList(
+ Moves.breakneckBlitzPhysical, Moves.breakneckBlitzSpecial,
+ Moves.allOutPummelingPhysical, Moves.allOutPummelingSpecial,
+ Moves.supersonicSkystrikePhysical, Moves.supersonicSkystrikeSpecial,
+ Moves.acidDownpourPhysical, Moves.acidDownpourSpecial,
+ Moves.tectonicRagePhysical, Moves.tectonicRageSpecial,
+ Moves.continentalCrushPhysical, Moves.continentalCrushSpecial,
+ Moves.savageSpinOutPhysical, Moves.savageSpinOutSpecial,
+ Moves.neverEndingNightmarePhysical, Moves.neverEndingNightmareSpecial,
+ Moves.corkscrewCrashPhysical, Moves.corkscrewCrashSpecial,
+ Moves.infernoOverdrivePhysical, Moves.infernoOverdriveSpecial,
+ Moves.hydroVortexPhysical, Moves.hydroVortexSpecial,
+ Moves.bloomDoomPhysical, Moves.bloomDoomSpecial,
+ Moves.gigavoltHavocPhysical, Moves.gigavoltHavocSpecial,
+ Moves.shatteredPsychePhysical, Moves.shatteredPsycheSpecial,
+ Moves.subzeroSlammerPhysical, Moves.subzeroSlammerSpecial,
+ Moves.devastatingDrakePhysical, Moves.devastatingDrakeSpecial,
+ Moves.blackHoleEclipsePhysical, Moves.blackHoleEclipseSpecial,
+ Moves.twinkleTacklePhysical, Moves.twinkleTackleSpecial);
+
+ public static final List<Integer> fixedPowerZMoves = Arrays.asList(
+ Moves.catastropika, Moves.sinisterArrowRaid, Moves.maliciousMoonsault, Moves.oceanicOperetta,
+ Moves.guardianOfAlola, Moves.soulStealing7StarStrike, Moves.stokedSparksurfer, Moves.pulverizingPancake,
+ Moves.extremeEvoboost, Moves.genesisSupernova, Moves.tenMillionVoltThunderbolt, Moves.lightThatBurnsTheSky,
+ Moves.searingSunrazeSmash, Moves.menacingMoonrazeMaelstrom, Moves.letsSnuggleForever,
+ Moves.splinteredStormshards, Moves.clangorousSoulblaze);
+
+ public static final List<Integer> zMoves = Stream.concat(fixedPowerZMoves.stream(),
+ varyingPowerZMoves.stream()).collect(Collectors.toList());
+
+ public static Map<Integer,StatChange> getStatChanges(int generation) {
+ Map<Integer,StatChange> map = new TreeMap<>();
+
+ switch(generation) {
+ case 6:
+ map.put(Species.butterfree,new StatChange(Stat.SPATK.val,90));
+ map.put(Species.beedrill,new StatChange(Stat.ATK.val,90));
+ map.put(Species.pidgeot,new StatChange(Stat.SPEED.val,101));
+ map.put(Species.pikachu,new StatChange(Stat.DEF.val | Stat.SPDEF.val,40, 50));
+ map.put(Species.raichu,new StatChange(Stat.SPEED.val,110));
+ map.put(Species.nidoqueen,new StatChange(Stat.ATK.val,92));
+ map.put(Species.nidoking,new StatChange(Stat.ATK.val,102));
+ map.put(Species.clefable,new StatChange(Stat.SPATK.val,95));
+ map.put(Species.wigglytuff,new StatChange(Stat.SPATK.val,85));
+ map.put(Species.vileplume,new StatChange(Stat.SPATK.val,110));
+ map.put(Species.poliwrath,new StatChange(Stat.ATK.val,95));
+ map.put(Species.alakazam,new StatChange(Stat.SPDEF.val,95));
+ map.put(Species.victreebel,new StatChange(Stat.SPDEF.val,70));
+ map.put(Species.golem,new StatChange(Stat.ATK.val,120));
+ map.put(Species.ampharos,new StatChange(Stat.DEF.val,85));
+ map.put(Species.bellossom,new StatChange(Stat.DEF.val,95));
+ map.put(Species.azumarill,new StatChange(Stat.SPATK.val,60));
+ map.put(Species.jumpluff,new StatChange(Stat.SPDEF.val,95));
+ map.put(Species.beautifly,new StatChange(Stat.SPATK.val,100));
+ map.put(Species.exploud,new StatChange(Stat.SPDEF.val,73));
+ map.put(Species.staraptor,new StatChange(Stat.SPDEF.val,60));
+ map.put(Species.roserade,new StatChange(Stat.DEF.val,65));
+ map.put(Species.stoutland,new StatChange(Stat.ATK.val,110));
+ map.put(Species.unfezant,new StatChange(Stat.ATK.val,115));
+ map.put(Species.gigalith,new StatChange(Stat.SPDEF.val,80));
+ map.put(Species.seismitoad,new StatChange(Stat.ATK.val,95));
+ map.put(Species.leavanny,new StatChange(Stat.SPDEF.val,80));
+ map.put(Species.scolipede,new StatChange(Stat.ATK.val,100));
+ map.put(Species.krookodile,new StatChange(Stat.DEF.val,80));
+ break;
+ case 7:
+ map.put(Species.arbok,new StatChange(Stat.ATK.val,95));
+ map.put(Species.dugtrio,new StatChange(Stat.ATK.val,100));
+ map.put(Species.farfetchd,new StatChange(Stat.ATK.val,90));
+ map.put(Species.dodrio,new StatChange(Stat.SPEED.val,110));
+ map.put(Species.electrode,new StatChange(Stat.SPEED.val,150));
+ map.put(Species.exeggutor,new StatChange(Stat.SPDEF.val,75));
+ map.put(Species.noctowl,new StatChange(Stat.SPATK.val,86));
+ map.put(Species.ariados,new StatChange(Stat.SPDEF.val,70));
+ map.put(Species.qwilfish,new StatChange(Stat.DEF.val,85));
+ map.put(Species.magcargo,new StatChange(Stat.HP.val | Stat.SPATK.val,60,90));
+ map.put(Species.corsola,new StatChange(Stat.HP.val | Stat.DEF.val | Stat.SPDEF.val,65,95,95));
+ map.put(Species.mantine,new StatChange(Stat.HP.val,85));
+ map.put(Species.swellow,new StatChange(Stat.SPATK.val,75));
+ map.put(Species.pelipper,new StatChange(Stat.SPATK.val,95));
+ map.put(Species.masquerain,new StatChange(Stat.SPATK.val | Stat.SPEED.val,100,80));
+ map.put(Species.delcatty,new StatChange(Stat.SPEED.val,90));
+ map.put(Species.volbeat,new StatChange(Stat.DEF.val | Stat.SPDEF.val,75,85));
+ map.put(Species.illumise,new StatChange(Stat.DEF.val | Stat.SPDEF.val,75,85));
+ map.put(Species.lunatone,new StatChange(Stat.HP.val,90));
+ map.put(Species.solrock,new StatChange(Stat.HP.val,90));
+ map.put(Species.chimecho,new StatChange(Stat.HP.val | Stat.DEF.val | Stat.SPDEF.val,75,80,90));
+ map.put(Species.woobat,new StatChange(Stat.HP.val,65));
+ map.put(Species.crustle,new StatChange(Stat.ATK.val,105));
+ map.put(Species.beartic,new StatChange(Stat.ATK.val,130));
+ map.put(Species.cryogonal,new StatChange(Stat.HP.val | Stat.DEF.val,80,50));
+ break;
+ case 8:
+ map.put(Species.aegislash,new StatChange(Stat.DEF.val | Stat.SPDEF.val,140,140));
+ break;
+ case 9:
+ map.put(Species.cresselia,new StatChange(Stat.DEF.val | Stat.SPDEF.val, 110,120));
+ map.put(Species.zacian,new StatChange(Stat.ATK.val, 120));
+ map.put(Species.zamazenta,new StatChange(Stat.ATK.val, 120));
+ break;
+ }
+ return map;
+ }
+
+ /* @formatter:on */
+
+ public static final List<Integer> xItems = Arrays.asList(Items.guardSpec, Items.direHit, Items.xAttack,
+ Items.xDefense, Items.xSpeed, Items.xAccuracy, Items.xSpAtk, Items.xSpDef);
+
+ public static final List<Integer> battleTrappingAbilities = Arrays.asList(Abilities.shadowTag, Abilities.magnetPull,
+ Abilities.arenaTrap);
+
+ public static final List<Integer> negativeAbilities = Arrays.asList(
+ Abilities.defeatist, Abilities.slowStart, Abilities.truant, Abilities.klutz, Abilities.stall
+ );
+
+ public static final List<Integer> badAbilities = Arrays.asList(
+ Abilities.minus, Abilities.plus, Abilities.anticipation, Abilities.forewarn, Abilities.frisk,
+ Abilities.honeyGather, Abilities.auraBreak, Abilities.receiver, Abilities.powerOfAlchemy
+ );
+
+ public static final List<Integer> doubleBattleAbilities = Arrays.asList(
+ Abilities.friendGuard, Abilities.healer, Abilities.telepathy, Abilities.symbiosis,
+ Abilities.battery
+ );
+
+ public static final List<Integer> duplicateAbilities = Arrays.asList(
+ Abilities.vitalSpirit, Abilities.whiteSmoke, Abilities.purePower, Abilities.shellArmor, Abilities.airLock,
+ Abilities.solidRock, Abilities.ironBarbs, Abilities.turboblaze, Abilities.teravolt, Abilities.emergencyExit,
+ Abilities.dazzling, Abilities.tanglingHair, Abilities.powerOfAlchemy, Abilities.fullMetalBody,
+ Abilities.shadowShield, Abilities.prismArmor, Abilities.libero, Abilities.stalwart
+ );
+
+ public static final List<Integer> noPowerNonStatusMoves = Arrays.asList(
+ Moves.guillotine, Moves.hornDrill, Moves.sonicBoom, Moves.lowKick, Moves.counter, Moves.seismicToss,
+ Moves.dragonRage, Moves.fissure, Moves.nightShade, Moves.bide, Moves.psywave, Moves.superFang,
+ Moves.flail, Moves.revenge, Moves.returnTheMoveNotTheKeyword, Moves.present, Moves.frustration,
+ Moves.magnitude, Moves.mirrorCoat, Moves.beatUp, Moves.spitUp, Moves.sheerCold
+ );
+
+ public static final List<Integer> cannotBeObsoletedMoves = Arrays.asList(
+ Moves.returnTheMoveNotTheKeyword, Moves.frustration, Moves.endeavor, Moves.flail, Moves.reversal,
+ Moves.hiddenPower, Moves.storedPower, Moves.smellingSalts, Moves.fling, Moves.powerTrip, Moves.counter,
+ Moves.mirrorCoat, Moves.superFang
+ );
+
+ public static final List<Integer> cannotObsoleteMoves = Arrays.asList(
+ Moves.gearUp, Moves.magneticFlux, Moves.focusPunch, Moves.explosion, Moves.selfDestruct, Moves.geomancy,
+ Moves.venomDrench
+ );
+
+ public static final List<Integer> doubleBattleMoves = Arrays.asList(
+ Moves.followMe, Moves.helpingHand, Moves.ragePowder, Moves.afterYou, Moves.allySwitch, Moves.healPulse,
+ Moves.quash, Moves.ionDeluge, Moves.matBlock, Moves.aromaticMist, Moves.electrify, Moves.instruct,
+ Moves.spotlight, Moves.decorate, Moves.lifeDew, Moves.coaching
+ );
+
+ public static final List<Integer> uselessMoves = Arrays.asList(
+ Moves.splash, Moves.celebrate, Moves.holdHands, Moves.teleport,
+ Moves.reflectType // the AI does not know how to use this move properly
+ );
+
+ public static final List<Integer> requiresOtherMove = Arrays.asList(
+ Moves.spitUp, Moves.swallow, Moves.dreamEater, Moves.nightmare
+ );
+
+ public static final int MIN_DAMAGING_MOVE_POWER = 50;
+
+ public static final int HIGHEST_POKEMON_GEN = 9;
+
+ // Eevee has 8 potential evolutions
+ public static final int LARGEST_NUMBER_OF_SPLIT_EVOS = 8;
+}