package com.pkrandom.constants; /*----------------------------------------------------------------------------*/ /*-- Gen1Constants.java - Constants for Red/Green/Blue/Yellow --*/ /*-- --*/ /*-- 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.Collections; import java.util.List; import com.pkrandom.pokemon.ItemList; import com.pkrandom.pokemon.Trainer; import com.pkrandom.pokemon.Type; public class Gen1Constants { public static final int baseStatsEntrySize = 0x1C; public static final int bsHPOffset = 1, bsAttackOffset = 2, bsDefenseOffset = 3, bsSpeedOffset = 4, bsSpecialOffset = 5, bsPrimaryTypeOffset = 6, bsSecondaryTypeOffset = 7, bsCatchRateOffset = 8, bsExpYieldOffset = 9, bsFrontSpriteOffset = 11, bsLevel1MovesOffset = 15, bsGrowthCurveOffset = 19, bsTMHMCompatOffset = 20; public static final int encounterTableEnd = 0xFFFF, encounterTableSize = 10, yellowSuperRodTableSize = 4; public static final int trainerClassCount = 47; public static final int champRivalOffsetFromGymLeaderMoves = 0x44; public static final int tmCount = 50, hmCount = 5; public static final int[] gymLeaderTMs = new int[] { 34, 11, 24, 21, 6, 46, 38, 27 }; public static final int[] tclassesCounts = new int[] { 21, 47 }; public static final List singularTrainers = Arrays.asList(28, 32, 33, 34, 35, 36, 37, 38, 39, 43, 45, 46); public static final List bannedMovesWithXAccBanned = Arrays.asList( Moves.sonicBoom, Moves.dragonRage, Moves.spore); public static final List bannedMovesWithoutXAccBanned = Arrays.asList( Moves.sonicBoom, Moves.dragonRage, Moves.spore, Moves.hornDrill, Moves.fissure, Moves.guillotine); // ban transform because of Transform assumption glitch public static final List bannedLevelupMoves = Collections.singletonList(Moves.transform); public static final List fieldMoves = Arrays.asList( Moves.cut, Moves.fly, Moves.surf, Moves.strength, Moves.flash, Moves.dig, Moves.teleport); public static final int damagePoison20PercentEffect = 2, damageAbsorbEffect = 3, damageBurn10PercentEffect = 4, damageFreeze10PercentEffect = 5, damageParalyze10PercentEffect = 6, dreamEaterEffect = 8, noDamageAtkPlusOneEffect = 10, noDamageDefPlusOneEffect = 11, noDamageSpecialPlusOneEffect = 13, noDamageEvasionPlusOneEffect = 15, noDamageAtkMinusOneEffect = 18, noDamageDefMinusOneEffect = 19, noDamageSpeMinusOneEffect = 20, noDamageAccuracyMinusOneEffect = 22, flinch10PercentEffect = 31, noDamageSleepEffect = 32, damagePoison40PercentEffect = 33, damageBurn30PercentEffect = 34, damageFreeze30PercentEffect = 35, damageParalyze30PercentEffect = 36, flinch30PercentEffect = 37, chargeEffect = 39, flyEffect = 43, damageRecoilEffect = 48, noDamageConfusionEffect = 49, noDamageAtkPlusTwoEffect = 50, noDamageDefPlusTwoEffect = 51, noDamageSpePlusTwoEffect = 52, noDamageSpecialPlusTwoEffect = 53, noDamageDefMinusTwoEffect = 59, noDamagePoisonEffect = 66, noDamageParalyzeEffect = 67, damageAtkMinusOneEffect = 68, damageDefMinusOneEffect = 69, damageSpeMinusOneEffect = 70, damageSpecialMinusOneEffect = 71, damageConfusionEffect = 76, twineedleEffect = 77, hyperBeamEffect = 80; // Taken from critical_hit_moves.asm; we could read this from the ROM, but it's easier to hardcode it. public static final List increasedCritMoves = Arrays.asList(Moves.karateChop, Moves.razorLeaf, Moves.crabhammer, Moves.slash); public static final List earlyRequiredHMs = Collections.singletonList(Moves.cut); public static final int hmsStartIndex = Gen1Items.hm01, tmsStartIndex = Gen1Items.tm01; public static final List requiredFieldTMs = Arrays.asList(3, 4, 8, 10, 12, 14, 16, 19, 20, 22, 25, 26, 30, 40, 43, 44, 45, 47); public static final int towerMapsStartIndex = 0x90, towerMapsEndIndex = 0x94; public static final String guaranteedCatchPrefix = "CF7EFE01"; public static final Type[] typeTable = constructTypeTable(); private static Type[] constructTypeTable() { Type[] table = new Type[0x20]; table[0x00] = Type.NORMAL; table[0x01] = Type.FIGHTING; table[0x02] = Type.FLYING; table[0x03] = Type.POISON; table[0x04] = Type.GROUND; table[0x05] = Type.ROCK; table[0x07] = Type.BUG; table[0x08] = Type.GHOST; table[0x14] = Type.FIRE; table[0x15] = Type.WATER; table[0x16] = Type.GRASS; table[0x17] = Type.ELECTRIC; table[0x18] = Type.PSYCHIC; table[0x19] = Type.ICE; table[0x1A] = Type.DRAGON; return table; } public static byte typeToByte(Type type) { for (int i = 0; i < typeTable.length; i++) { if (typeTable[i] == type) { return (byte) i; } } return (byte) 0; } public static final ItemList allowedItems = setupAllowedItems(); private static ItemList setupAllowedItems() { ItemList allowedItems = new ItemList(Gen1Items.tm50); // 251-255 are junk TMs // Assorted key items & junk // 23/01/2014: ban fake PP Up allowedItems.banSingles(Gen1Items.townMap, Gen1Items.bicycle, Gen1Items.questionMark7, Gen1Items.safariBall, Gen1Items.pokedex, Gen1Items.oldAmber, Gen1Items.cardKey, Gen1Items.ppUpGlitch, Gen1Items.coin, Gen1Items.ssTicket, Gen1Items.goldTeeth); allowedItems.banRange(Gen1Items.boulderBadge, 8); allowedItems.banRange(Gen1Items.domeFossil, 5); allowedItems.banRange(Gen1Items.coinCase, 10); // Unused allowedItems.banRange(Gen1Items.unused84, 112); // HMs allowedItems.banRange(hmsStartIndex, hmCount); // Real TMs allowedItems.tmRange(tmsStartIndex, tmCount); return allowedItems; } public static void tagTrainersUniversal(List trs) { // Gym Leaders tbc(trs, 34, 0, "GYM1"); tbc(trs, 35, 0, "GYM2"); tbc(trs, 36, 0, "GYM3"); tbc(trs, 37, 0, "GYM4"); tbc(trs, 38, 0, "GYM5"); tbc(trs, 40, 0, "GYM6"); tbc(trs, 39, 0, "GYM7"); tbc(trs, 29, 2, "GYM8"); // Other giovanni teams tbc(trs, 29, 0, "GIO1"); tbc(trs, 29, 1, "GIO2"); // Elite 4 tbc(trs, 44, 0, "ELITE1"); tbc(trs, 33, 0, "ELITE2"); tbc(trs, 46, 0, "ELITE3"); tbc(trs, 47, 0, "ELITE4"); } public static void tagTrainersRB(List trs) { // Gary Battles tbc(trs, 25, 0, "RIVAL1-0"); tbc(trs, 25, 1, "RIVAL1-1"); tbc(trs, 25, 2, "RIVAL1-2"); tbc(trs, 25, 3, "RIVAL2-0"); tbc(trs, 25, 4, "RIVAL2-1"); tbc(trs, 25, 5, "RIVAL2-2"); tbc(trs, 25, 6, "RIVAL3-0"); tbc(trs, 25, 7, "RIVAL3-1"); tbc(trs, 25, 8, "RIVAL3-2"); tbc(trs, 42, 0, "RIVAL4-0"); tbc(trs, 42, 1, "RIVAL4-1"); tbc(trs, 42, 2, "RIVAL4-2"); tbc(trs, 42, 3, "RIVAL5-0"); tbc(trs, 42, 4, "RIVAL5-1"); tbc(trs, 42, 5, "RIVAL5-2"); tbc(trs, 42, 6, "RIVAL6-0"); tbc(trs, 42, 7, "RIVAL6-1"); tbc(trs, 42, 8, "RIVAL6-2"); tbc(trs, 42, 9, "RIVAL7-0"); tbc(trs, 42, 10, "RIVAL7-1"); tbc(trs, 42, 11, "RIVAL7-2"); tbc(trs, 43, 0, "RIVAL8-0"); tbc(trs, 43, 1, "RIVAL8-1"); tbc(trs, 43, 2, "RIVAL8-2"); // Gym Trainers tbc(trs, 5, 0, "GYM1"); tbc(trs, 15, 0, "GYM2"); tbc(trs, 6, 0, "GYM2"); tbc(trs, 4, 7, "GYM3"); tbc(trs, 20, 0, "GYM3"); tbc(trs, 41, 2, "GYM3"); tbc(trs, 3, 16, "GYM4"); tbc(trs, 3, 17, "GYM4"); tbc(trs, 6, 10, "GYM4"); tbc(trs, 18, 0, "GYM4"); tbc(trs, 18, 1, "GYM4"); tbc(trs, 18, 2, "GYM4"); tbc(trs, 32, 0, "GYM4"); tbc(trs, 21, 2, "GYM5"); tbc(trs, 21, 3, "GYM5"); tbc(trs, 21, 6, "GYM5"); tbc(trs, 21, 7, "GYM5"); tbc(trs, 22, 0, "GYM5"); tbc(trs, 22, 1, "GYM5"); tbc(trs, 19, 0, "GYM6"); tbc(trs, 19, 1, "GYM6"); tbc(trs, 19, 2, "GYM6"); tbc(trs, 19, 3, "GYM6"); tbc(trs, 45, 21, "GYM6"); tbc(trs, 45, 22, "GYM6"); tbc(trs, 45, 23, "GYM6"); tbc(trs, 8, 8, "GYM7"); tbc(trs, 8, 9, "GYM7"); tbc(trs, 8, 10, "GYM7"); tbc(trs, 8, 11, "GYM7"); tbc(trs, 11, 3, "GYM7"); tbc(trs, 11, 4, "GYM7"); tbc(trs, 11, 5, "GYM7"); tbc(trs, 22, 2, "GYM8"); tbc(trs, 22, 3, "GYM8"); tbc(trs, 24, 5, "GYM8"); tbc(trs, 24, 6, "GYM8"); tbc(trs, 24, 7, "GYM8"); tbc(trs, 31, 0, "GYM8"); tbc(trs, 31, 8, "GYM8"); tbc(trs, 31, 9, "GYM8"); } public static void tagTrainersYellow(List trs) { // Rival Battles tbc(trs, 25, 0, "IRIVAL"); tbc(trs, 25, 1, "RIVAL1-0"); tbc(trs, 25, 2, "RIVAL2-0"); tbc(trs, 42, 0, "RIVAL3-0"); tbc(trs, 42, 1, "RIVAL4-0"); tbc(trs, 42, 2, "RIVAL4-1"); tbc(trs, 42, 3, "RIVAL4-2"); tbc(trs, 42, 4, "RIVAL5-0"); tbc(trs, 42, 5, "RIVAL5-1"); tbc(trs, 42, 6, "RIVAL5-2"); tbc(trs, 42, 7, "RIVAL6-0"); tbc(trs, 42, 8, "RIVAL6-1"); tbc(trs, 42, 9, "RIVAL6-2"); tbc(trs, 43, 0, "RIVAL7-0"); tbc(trs, 43, 1, "RIVAL7-1"); tbc(trs, 43, 2, "RIVAL7-2"); // Rocket Jessie & James tbc(trs, 30, 41, "THEMED:JESSIE&JAMES"); tbc(trs, 30, 42, "THEMED:JESSIE&JAMES"); tbc(trs, 30, 43, "THEMED:JESSIE&JAMES"); tbc(trs, 30, 44, "THEMED:JESSIE&JAMES"); // Gym Trainers tbc(trs, 5, 0, "GYM1"); tbc(trs, 6, 0, "GYM2"); tbc(trs, 15, 0, "GYM2"); tbc(trs, 4, 7, "GYM3"); tbc(trs, 20, 0, "GYM3"); tbc(trs, 41, 2, "GYM3"); tbc(trs, 3, 16, "GYM4"); tbc(trs, 3, 17, "GYM4"); tbc(trs, 6, 10, "GYM4"); tbc(trs, 18, 0, "GYM4"); tbc(trs, 18, 1, "GYM4"); tbc(trs, 18, 2, "GYM4"); tbc(trs, 32, 0, "GYM4"); tbc(trs, 21, 2, "GYM5"); tbc(trs, 21, 3, "GYM5"); tbc(trs, 21, 6, "GYM5"); tbc(trs, 21, 7, "GYM5"); tbc(trs, 22, 0, "GYM5"); tbc(trs, 22, 1, "GYM5"); tbc(trs, 19, 0, "GYM6"); tbc(trs, 19, 1, "GYM6"); tbc(trs, 19, 2, "GYM6"); tbc(trs, 19, 3, "GYM6"); tbc(trs, 45, 21, "GYM6"); tbc(trs, 45, 22, "GYM6"); tbc(trs, 45, 23, "GYM6"); tbc(trs, 8, 8, "GYM7"); tbc(trs, 8, 9, "GYM7"); tbc(trs, 8, 10, "GYM7"); tbc(trs, 8, 11, "GYM7"); tbc(trs, 11, 3, "GYM7"); tbc(trs, 11, 4, "GYM7"); tbc(trs, 11, 5, "GYM7"); tbc(trs, 22, 2, "GYM8"); tbc(trs, 22, 3, "GYM8"); tbc(trs, 24, 5, "GYM8"); tbc(trs, 24, 6, "GYM8"); tbc(trs, 24, 7, "GYM8"); tbc(trs, 31, 0, "GYM8"); tbc(trs, 31, 8, "GYM8"); tbc(trs, 31, 9, "GYM8"); } private static void tbc(List allTrainers, int classNum, int number, String tag) { int currnum = -1; for (Trainer t : allTrainers) { if (t.trainerclass == classNum) { currnum++; if (currnum == number) { t.tag = tag; return; } } } } }