/* * 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; import com.shavenpuppy.jglib.util.FPMath; /** * Directional facing constants * @author Cas */ public abstract class Facing { public static final int EAST = 0; public static final int NORTH = 1; public static final int WEST = 2; public static final int SOUTH = 3; public static final int[] DX = {1, 0, -1, 0}; public static final int[] DY = {0, 1, 0, -1}; public static final int[] ANGLE = {0, FPMath.QUARTER, FPMath.HALF, FPMath.HALF + FPMath.QUARTER}; /** * No c'tor */ private Facing() { } /** * Given vector, calculate the facing. * @param ddx * @param ddy * @param oldFacing * @return 0..3, or oldFacing if vector is 0, 0 or a diagonal */ public static int calcFacing(int ddx, int ddy, int oldFacing) { if (ddy > 0 && ddx == 0) { return NORTH; } else if (ddy < 0 && ddx == 0) { return SOUTH; } else if (ddx > 0 && ddy == 0) { return EAST; } else if (ddx < 0 && ddy == 0) { return WEST; } else if (ddx ==0 && ddy == 0) { return oldFacing; } else { // Hm. switch (oldFacing) { case NORTH: if (ddy < 0) { return SOUTH; } else { return oldFacing; } case SOUTH: if (ddy > 0) { return NORTH; } else { return oldFacing; } case WEST: if (ddx > 0) { return EAST; } else { return oldFacing; } case EAST: if (ddx < 0) { return WEST; } else { return oldFacing; } default: return oldFacing; } } } }