/* * Copyright (c) 2003-onwards Shaven Puppy Ltd * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * * Neither the name of 'Shaven Puppy' nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package worm.weapons; import net.puppygames.applet.Game; import net.puppygames.applet.effects.EmitterFeature; import org.lwjgl.util.Rectangle; import worm.Entity; import worm.Res; import worm.effects.ElectronZapEffect; import worm.screens.GameScreen; import com.shavenpuppy.jglib.resources.MappedColor; /** * The capacitor weapon * @author Cas */ public class ElectronZapFeature extends WeaponFeature { private static final Rectangle TEMP = new Rectangle(); /** Fattest bit of the zap beam */ private static final float MAX_WIDTH = 1f; private static final float MAX_WOBBLE = 8.0f; private static final float WOBBLE_FACTOR = 0.5f; private static final float WIDTH_FACTOR = 0.025f; /** Beam emitter */ private EmitterFeature beamStartEmitter, beamEndEmitter; /** * Instance of the electron zap weapon */ private class ElectronZapInstance extends WeaponInstance { private static final long serialVersionUID = 1L; private transient ElectronZapEffect beam; private int tick; /** * C'tor * @param entity */ public ElectronZapInstance(Entity entity) { super(entity); } @Override protected void doFire(float targetX, float targetY) { // Spawn a beam if we don't yet have one if (beam == null) { beam = new ElectronZapEffect ( true, Res.getCapacitorBuffer(), new MappedColor("capacitorzap.background"), new MappedColor("capacitorzap.foreground"), 255, beamStartEmitter, beamEndEmitter, entity.getMapX() + entity.getOffsetX(), entity.getMapY() + entity.getOffsetY(), MAX_WIDTH, MAX_WOBBLE, WOBBLE_FACTOR, WIDTH_FACTOR ); beam.setOffset(GameScreen.getSpriteOffset()); beam.spawn(GameScreen.getInstance()); Game.allocateSound(Res.getCapacitorStartBuffer()); } // Target the beam beam.setTarget(targetX, targetY); tick = 1; } @Override public void tick() { super.tick(); // If we didn't doFire this tick, then remove any beam if (tick > 0) { tick --; } else if (beam != null) { beam.finish(); beam = null; } } @Override public void remove() { if (beam != null) { beam.finish(); beam = null; } } } /** * C'tor * @param name */ public ElectronZapFeature(String name) { super(name); } @Override public WeaponInstance spawn(Entity entity) { return new ElectronZapInstance(entity); } }