package com.sneed.pkrandom.pokemon; /*----------------------------------------------------------------------------*/ /*-- Gen1Pokemon.java - represents an individual Gen 1 Pokemon. Used to --*/ /*-- handle things related to stats because of the lack --*/ /*-- of the Special split in Gen 1. --*/ /*-- --*/ /*-- 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.List; import java.util.Random; public class Gen1Pokemon extends Pokemon { public Gen1Pokemon() { shuffledStatsOrder = Arrays.asList(0, 1, 2, 3, 4); } @Override public void copyShuffledStatsUpEvolution(Pokemon evolvesFrom) { // If stats were already shuffled once, un-shuffle them shuffledStatsOrder = Arrays.asList( shuffledStatsOrder.indexOf(0), shuffledStatsOrder.indexOf(1), shuffledStatsOrder.indexOf(2), shuffledStatsOrder.indexOf(3), shuffledStatsOrder.indexOf(4)); applyShuffledOrderToStats(); shuffledStatsOrder = evolvesFrom.shuffledStatsOrder; applyShuffledOrderToStats(); } @Override protected void applyShuffledOrderToStats() { List stats = Arrays.asList(hp, attack, defense, special, speed); // Copy in new stats hp = stats.get(shuffledStatsOrder.get(0)); attack = stats.get(shuffledStatsOrder.get(1)); defense = stats.get(shuffledStatsOrder.get(2)); special = stats.get(shuffledStatsOrder.get(3)); speed = stats.get(shuffledStatsOrder.get(4)); } @Override public void randomizeStatsWithinBST(Random random) { // Minimum 20 HP, 10 everything else int bst = bst() - 60; // Make weightings double hpW = random.nextDouble(), atkW = random.nextDouble(), defW = random.nextDouble(); double specW = random.nextDouble(), speW = random.nextDouble(); double totW = hpW + atkW + defW + specW + speW; hp = (int) Math.max(1, Math.round(hpW / totW * bst)) + 20; attack = (int) Math.max(1, Math.round(atkW / totW * bst)) + 10; defense = (int) Math.max(1, Math.round(defW / totW * bst)) + 10; special = (int) Math.max(1, Math.round(specW / totW * bst)) + 10; speed = (int) Math.max(1, Math.round(speW / totW * bst)) + 10; // Check for something we can't store if (hp > 255 || attack > 255 || defense > 255 || special > 255 || speed > 255) { // re roll randomizeStatsWithinBST(random); } } @Override public void copyRandomizedStatsUpEvolution(Pokemon evolvesFrom) { double ourBST = bst(); double theirBST = evolvesFrom.bst(); double bstRatio = ourBST / theirBST; hp = (int) Math.min(255, Math.max(1, Math.round(evolvesFrom.hp * bstRatio))); attack = (int) Math.min(255, Math.max(1, Math.round(evolvesFrom.attack * bstRatio))); defense = (int) Math.min(255, Math.max(1, Math.round(evolvesFrom.defense * bstRatio))); speed = (int) Math.min(255, Math.max(1, Math.round(evolvesFrom.speed * bstRatio))); special = (int) Math.min(255, Math.max(1, Math.round(evolvesFrom.special * bstRatio))); } @Override public void assignNewStatsForEvolution(Pokemon evolvesFrom, Random random) { double ourBST = bst(); double theirBST = evolvesFrom.bst(); double bstDiff = ourBST - theirBST; // Make weightings double hpW = random.nextDouble(), atkW = random.nextDouble(), defW = random.nextDouble(); double specW = random.nextDouble(), speW = random.nextDouble(); double totW = hpW + atkW + defW + specW + speW; double hpDiff = Math.round((hpW / totW) * bstDiff); double atkDiff = Math.round((atkW / totW) * bstDiff); double defDiff = Math.round((defW / totW) * bstDiff); double specDiff = Math.round((specW / totW) * bstDiff); double speDiff = Math.round((speW / totW) * bstDiff); hp = (int) Math.min(255, Math.max(1, evolvesFrom.hp + hpDiff)); attack = (int) Math.min(255, Math.max(1, evolvesFrom.attack + atkDiff)); defense = (int) Math.min(255, Math.max(1, evolvesFrom.defense + defDiff)); speed = (int) Math.min(255, Math.max(1, evolvesFrom.speed + speDiff)); special = (int) Math.min(255, Math.max(1, evolvesFrom.special + specDiff)); } @Override protected int bst() { return hp + attack + defense + special + speed; } @Override public int bstForPowerLevels() { return hp + attack + defense + special + speed; } @Override public double getAttackSpecialAttackRatio() { return (double)attack / ((double)attack + (double)special); } @Override public String toString() { return "Pokemon [name=" + name + ", number=" + number + ", primaryType=" + primaryType + ", secondaryType=" + secondaryType + ", hp=" + hp + ", attack=" + attack + ", defense=" + defense + ", special=" + special + ", speed=" + speed + "]"; } }