/* * SunEffect.java * * Created on January 7, 2007, 5:36 PM * * This file is a part of Shoddy Battle. * Copyright (C) 2006 Colin Fitzpatrick * * 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 2 * 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. */ package org.pokenet.server.battle.mechanics.statuses.field; import org.pokenet.server.battle.BattleField; import org.pokenet.server.battle.Pokemon; import org.pokenet.server.battle.mechanics.PokemonType; import org.pokenet.server.battle.mechanics.StatMultiplier; import org.pokenet.server.battle.mechanics.moves.MoveListEntry; import org.pokenet.server.battle.mechanics.moves.PokemonMove; import org.pokenet.server.battle.mechanics.moves.StatusMove; import org.pokenet.server.battle.mechanics.statuses.ChargeEffect; import org.pokenet.server.battle.mechanics.statuses.PercentEffect; /** * 1. Raises the power of Fire moves by 1.5x * 2. Cuts the power of Water moves by 1/2. * 3. Makes Solarbeam a one-turn move. * 4. Cuts the Accuracy of Thunder to 50%. * 5. Doubles the current effective Speed of pokemon with the Chlorophyll * ability. * 6. Makes pokemon with the Forecast ability Fire-type. * 7. Makes Weather Ball a power 100 Fire-type move. * 8. Makes Moonlight and Morning Sun restore 3/4 of the user's max HP. * 9. Does 1/8 damage per turn to Pokemon with the Dry Skin ability. * 10. Does 1/8 damage per turn to Pokemon with the Solar Power ability. * 11. Raises the special attack of Pokemon with the Solar Power ability by 50% * * @author Colin */ public class SunEffect extends WeatherEffect { /** Creates a new instance of SunEffect */ public SunEffect(int turns) { super(turns); } public String getName() { return "Sun"; } public SunEffect() { super(5); } private void modifySpeed(Pokemon p, double factor) { if (!p.hasAbility("Chlorophyll")) { return; } p.getMultiplier(Pokemon.S_SPEED).multiplyBy(factor); } private void modifySpAttack(Pokemon p, double factor) { if (!p.hasAbility("Solar Power")) { return; } p.getMultiplier(Pokemon.S_SPATTACK).multiplyBy(factor); } private void flowerGift(Pokemon p, boolean increase) { if (!p.hasAbility("Flower Gift")) { return; } StatMultiplier multiplier = p.getMultiplier(Pokemon.S_ATTACK); if (increase) multiplier.increaseMultiplier(); else multiplier.decreaseMultiplier(); multiplier = p.getMultiplier(Pokemon.S_SPDEFENCE); if (increase) multiplier.increaseMultiplier(); else multiplier.decreaseMultiplier(); } public boolean apply(Pokemon p) { if (m_applied[p.getParty()] || !(m_applied[p.getParty()] = hasEffects(p.getField()))) return true; // Double the current effective Speed of pokemon with the // Chlorophyll ability. modifySpeed(p, 2.0); modifySpAttack(p, 1.5); flowerGift(p, true); setTypes(p, new PokemonType[] { PokemonType.T_FIRE }, true); return true; } public void unapply(Pokemon p) { if (!m_applied[p.getParty()]) return; m_applied[p.getParty()] = false; modifySpeed(p, 0.5); modifySpAttack(p, 2.0 / 3.0); flowerGift(p, false); setTypes(p, null, false); } public String getDescription() { return null; } public boolean immobilises(Pokemon p) { return false; } /** * Tick this effect for the whole field. */ protected void tickWeather(BattleField field) { field.showMessage("The sun continues to shine."); } public boolean tickPokemon(Pokemon p) { if (!hasEffects(p.getField())) return false; if (p.hasAbility("Dry Skin") || p.hasAbility("Solar Power")) { p.getField().showMessage(p.getName() + " was hurt by the sunlight!"); p.changeHealth(-p.getStat(Pokemon.S_HP) / 8, true); } return false; } /** * Remove this effect from a field. */ public void unapplyToField(BattleField field) { field.showMessage("The sun faded."); } /** * Apply this effect to a field. */ public boolean applyToField(BattleField field) { field.showMessage("The sun began to shine!"); return true; } /** * 1. Raises the power of Fire moves by 1.5x * 2. Cuts the power of Water moves by 1/2. * 3. Makes Solarbeam a one-turn move. * 4. Cuts the Accuracy of Thunder to 50%. * 6. Makes Weather Ball a power 100 Fire-type move. * 7. Makes Moonlight and Morning Sun restore 3/4 of the user's max HP. */ public MoveListEntry getTransformedMove(Pokemon poke, MoveListEntry entry) { if (!hasEffects(poke.getField())) return entry; PokemonMove move = entry.getMove(); PokemonType type = move.getType(); String name = entry.getName(); if (type.equals(PokemonType.T_FIRE)) { move.setPower((int)((double)move.getPower() * 1.5)); } else if (type.equals(PokemonType.T_WATER)) { move.setPower((int)((double)move.getPower() / 2.0)); } else if (name.equals("Solarbeam")) { if (move instanceof StatusMove) { StatusMove statusMove = (StatusMove)move; // Assume that the first effect is the ChargeEffect! ChargeEffect charge = (ChargeEffect)statusMove.getEffects()[0]; charge.setTurns(0); } } else if (name.equals("Thunder")) { move.setAccuracy(0.5); } else if (name.equals("Weather Ball")) { move.setPower(100); move.setType(PokemonType.T_FIRE); } else if (name.equals("Moonlight") || name.equals("Morning Sun") || name.equals("Synthesis")) { StatusMove statusMove = (StatusMove)move; // Assume that the first effect is the PercentEffect! PercentEffect perc = (PercentEffect)statusMove.getEffects()[0]; perc.setPercent(2.0/3.0); } return entry; } }