/** * Copyright 2008 - 2012 * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of * the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations under * the License. * * @project loon * @author cping * @email:javachenpeng@yahoo.com * @version 0.3.3 */ package com.mygame; public class Tile { private static int bridgeHeight; private static int bridgeOffs; private static int caveBottomYOffset; private static Sprite caves = null; private static int caveYOffset; private int changeTicks = -1; public int col; private static int currentTileset; private boolean dropReverse; public int dropTick = -1; public int lavaborders = 0; private static Sprite lavabridge; private static Sprite lavabridge2; private static Sprite lavabridgeshadow; private static Sprite lavacorner; private static Sprite lavacorner2; private static Sprite lavatiles; private static Sprite lavatileshoriz; private int lockAmount = 0; private boolean locked = false; private static int pressLowerY; private ETileTypes previoustype; public int row; public int subtype; private static int tileHReal; private static Sprite tiles = null; private static int tileWReal; public ETileTypes type; public int x; public int y; public final boolean bridgeDropped() { return (this.dropTick == -1); } private static void clearTiles() { if (tiles != null) { tiles = null; } } public static int getTileH() { return tiles.getHeight(); } public static int getTileHReal() { return tileHReal; } public static int getTileW() { return tiles.getWidth(); } public static int getTileWReal() { return tileWReal; } public static void initTiles(int tileset) { if (caves == null) { caves = new Sprite("caves", 8, 1, 9, true); lavabridge = new Sprite("lavabridge", 1, 1, 9, true); lavabridge2 = new Sprite("lavabridge2", 1, 1, 9, true); lavabridgeshadow = new Sprite("lavabridgeshadow", 1, 1, 9, true); lavatiles = new Sprite("lavatiles", 2, 1, 9, true); lavatileshoriz = new Sprite("lavatileshoriz", 1, 2, 9, true); lavacorner = new Sprite("lavacorner", 1, 1, 9, true); lavacorner2 = new Sprite("lavacorner2", 1, 1, 0x21, true); } if ((tiles == null) || (tileset != currentTileset)) { currentTileset = tileset; clearTiles(); bridgeOffs = 0; if (currentTileset == 0) { tiles = new Sprite("tiles", 11, 1, 0x12, false); } else if (currentTileset == 1) { tiles = new Sprite("tiles2", 11, 1, 0x12, false); } else { tiles = new Sprite("tiles3", 11, 1, 0x12, false); bridgeOffs = (tiles.getWidth() - (lavabridge.getWidth() * 3)) / 6; bridgeHeight = lavabridge2.getHeight() - 2; } pressLowerY = tiles.getHeight() / 8; int num = (currentTileset == 2) ? ((caves.getHeight() * 8) / 10) : (caves.getHeight() + 8); caveYOffset = num - tiles.getHeight(); caveBottomYOffset = (num * 0x53) / 260; tileWReal = (tiles.getWidth() * 260) / 0x11c; tileHReal = (tiles.getHeight() * 0xd5) / 0xf8; } } public final void InitWithString(String value) { String[] strArray = value.split("[,]", -1); this.col = Integer.parseInt(strArray[0]); this.row = Integer.parseInt(strArray[1]); this.x = Integer.parseInt(strArray[2]); this.y = Integer.parseInt(strArray[3]); this.type = ETileTypes.forValue(Integer.parseInt(strArray[4])); this.subtype = Integer.parseInt(strArray[5]); } public final boolean IsCave() { return ((this.type.getValue() >= ETileTypes.ECaveBottom.getValue()) && (this.type .getValue() <= ETileTypes.ECaveTop.getValue())); } public final boolean isLavaEmptyTile() { if ((this.type.getValue() != ETileTypes.ETileCustom3.getValue()) && (this.type.getValue() != ETileTypes.ETileBridgeHorizontal .getValue())) { return (this.type.getValue() == ETileTypes.ETileBridgeVertical .getValue()); } return true; } public final boolean isLocked() { return this.locked; } public final void Paint(Painter painter, int layer) { this.Paint(painter, layer, 0, false, false); } public final void Paint(Painter painter, int layer, int tick, boolean paused, boolean lavalevel) { int y = this.y; int type = this.type.getValue(); if (!paused) { if ((this.isLocked() && (this.type != ETileTypes.ETileBridgeHorizontal)) && (this.type != ETileTypes.ETileBridgeVertical)) { this.lockAmount++; if (this.lockAmount > 4) { this.lockAmount = 4; } } else if (this.lockAmount > 0) { this.lockAmount--; } } y += (tileHReal * this.lockAmount) / 40; if (this.lavaborders != 0) { if ((this.lavaborders & 1) > 0) { lavatileshoriz.Paint(painter, (float) (this.x - ((tileWReal * 5) / 100)), (float) (this.y - ((tileWReal * 2) / 100)), 0); } if ((this.lavaborders & 8) > 0) { lavatiles.Paint(painter, (float) (this.x - 2), (float) this.y, 0); if ((this.lavaborders & 1) > 0) { lavacorner.Paint(painter, (float) this.x, (float) (this.y + ((tileHReal * 2) / 100)), 0); } } if ((this.lavaborders & 2) > 0) { lavatiles .Paint(painter, (float) ((this.x + ((tileWReal * 100) / 100)) - lavatiles .getWidth()), (float) this.y, 1); if ((this.lavaborders & 1) > 0) { lavacorner.PaintScaled(painter, (float) (((this.x + tileWReal) - lavacorner .getWidth()) - 4), (float) (this.y + ((tileHReal * 4) / 100)), 0, 1f, 1f, true); } } if ((this.lavaborders & 4) > 0) { lavatileshoriz .Paint(painter, (float) this.x, (float) ((this.y + ((tileHReal * 0x6c) / 100)) - ((lavatileshoriz .getHeight() * 80) / 100)), 1); if ((this.lavaborders & 8) > 0) { lavacorner2.Paint(painter, (float) (this.x + ((tileWReal * 5) / 100)), (float) (this.y + ((tileHReal * 0x6c) / 100)), 0); } if ((this.lavaborders & 2) > 0) { lavacorner2.PaintScaled(painter, (float) (((this.x + tileWReal) - lavacorner2 .getWidth()) - 4), (float) (this.y + ((tileHReal * 0x6c) / 100)), 0, 1f, 1f, true); } } } if (this.changeTicks != -1) { if (!paused) { this.changeTicks++; } if (this.changeTicks < 4) { float angle = (this.changeTicks * 90) / 4; if (angle < 45f) { type = this.previoustype.getValue(); } else { angle -= 90f; } y += pressLowerY - ((pressLowerY * GameUtils .sin((this.changeTicks * 90) / 4)) >> 13); tiles.Paint(painter, (float) (this.x + (tileWReal / 2)), (float) (y + (tileHReal / 2)), type, angle); return; } this.changeTicks = -1; } if (this.IsCave()) { type -= 0x18; int num4 = this.y; if (this.type == ETileTypes.ECaveBottom) { num4 -= caveBottomYOffset; } if (currentTileset == 2) { if (layer == 0) { caves.PaintScaled(painter, (float) this.x, (float) (num4 - caveYOffset), type, 0.8f, 0.8f); } else { caves.PaintScaled(painter, (float) this.x, (float) (num4 - caveYOffset), type + 4, 0.8f, 0.8f); } } else { int x = this.x; if (this.type == ETileTypes.ECaveTop) { x -= 3; } if (layer == 0) { caves.Paint(painter, (float) x, (float) (num4 - caveYOffset), type); } else { caves.Paint(painter, (float) x, (float) (num4 - caveYOffset), type + 4); } } } else { if (currentTileset == 2) { if (type == 11) { type = -1; } else if ((type >= 12) && (type <= 13)) { type = 0; } else if ((type >= 14) && (type <= 0x15)) { type = 0; } if (!this.isLavaEmptyTile() && (this.dropTick != -1)) { if ((tick - this.dropTick) > 15) { this.dropTick = -1; } else { GameUtils .initRandom(((tick / 3) * 0xabe80) ^ ((this.x * 0x46cc) + (this.dropTick * 0x346))); y += ((GameUtils.getRandom() >> 3) & 3) - 1; } } } else if ((type >= 11) && (type <= 0x15)) { type = 0; } switch (type) { case 0x16: { type = -1; boolean shake = this.isLocked() || (this.dropTick != -1); GameUtils.initRandom(((tick / 2) * 0xabe63) ^ ((this.x * 0x46cc) + (this.y * 0x346))); int droppos = (this.dropTick != -1) ? (tick - this.dropTick) : 0; if (this.dropReverse) { droppos -= 20; } int num7 = this.x + bridgeOffs; paintBridgepart(painter, num7, y, droppos, false, shake); droppos -= this.dropReverse ? -10 : 10; num7 += lavabridge.getWidth(); paintBridgepart(painter, num7, y, droppos, false, shake); droppos -= this.dropReverse ? -10 : 10; num7 += lavabridge.getWidth(); paintBridgepart(painter, num7, y, droppos, false, shake); break; } case 0x17: { type = -1; boolean flag2 = this.isLocked() || (this.dropTick != -1); GameUtils.initRandom(((tick / 2) * 0xabe63) ^ ((this.x * 0x46cc) + (this.y * 0x346))); int num8 = (this.dropTick != -1) ? (tick - this.dropTick) : 0; if (this.dropReverse) { num8 -= 20; } y -= 4; int num9 = this.x + 5; paintBridgepart(painter, num9, y, num8, true, flag2); y += bridgeHeight; num8 -= this.dropReverse ? -10 : 10; paintBridgepart(painter, num9, y, num8, true, flag2); y += bridgeHeight; num8 -= this.dropReverse ? -10 : 10; paintBridgepart(painter, num9, y, num8, true, flag2); break; } } if (type != -1) { tiles.Paint(painter, (float) (this.x + (tileWReal / 2)), (float) (y + (tileHReal / 2)), type); } } } private static void paintBridgepart(Painter painter, int x, int y, int droppos, boolean vertical, boolean shake) { if (droppos < 0) { droppos = 0; } if (droppos < 20) { int num = 0; int num2 = tileHReal / 2; if ((droppos > 0) && (droppos < 10)) { num = (num2 * droppos) / 10; } else if (droppos >= 10) { num = num2; painter.setOpacity((float) (1f - (((float) (droppos - 10)) / 10f))); } float angle = 0f; if (droppos > 0) { int num4 = ((((x * 0x25abe) ^ (y * 0x32bee)) >> 5) % 40) - 20; angle += (droppos * num4) / 20; } num += shake ? (((GameUtils.getRandom() >> 3) & 3) - 1) : 0; if (!vertical && (droppos < 10)) { lavabridgeshadow.Paint(painter, (float) x, (float) (y + num2), 0, angle); } if (vertical) { lavabridge2.Paint(painter, (float) x, (float) (y + num), 0, angle); } else { lavabridge.Paint(painter, (float) x, (float) (y + num), 0, angle); } painter.setOpacity(1f); } } public final int rotate() { if (!this.locked) { ETileTypes type = this.type; switch (this.type) { case ETileLeftRight: type = ETileTypes.ETileTopDown; break; case ETileTopDown: type = ETileTypes.ETileLeftRight; break; case ETileTopRight: type = ETileTypes.ETileRightDown; break; case ETileRightDown: type = ETileTypes.ETileDownLeft; break; case ETileDownLeft: type = ETileTypes.ETileLeftTop; break; case ETileLeftTop: type = ETileTypes.ETileTopRight; break; default: break; } if (type != this.type) { this.previoustype = this.type; this.type = type; this.changeTicks = 0; } } return 0; } public final void setLocked(boolean aLocked) { if (this.dropTick == -1) { this.locked = aLocked; } } public final void trainLeftTile(EDirections dir, int tick) { if (tick == -1) { this.dropTick = -1; this.locked = false; } else if ((this.type == ETileTypes.ETileBridgeHorizontal) || (this.type == ETileTypes.ETileBridgeVertical)) { this.dropTick = tick; if ((dir == EDirections.EDirLeft) || (dir == EDirections.EDirTop)) { this.dropReverse = true; } else { this.dropReverse = false; } this.locked = true; } } public final EDirections whereGoesFromDir(EDirections dir) { switch (this.type) { case ETileLeftRight: case ETileBridgeHorizontal: if (dir == EDirections.EDirRight) { return EDirections.EDirRight; } if (dir != EDirections.EDirLeft) { break; } return EDirections.EDirLeft; case ETileTopDown: case ETileBridgeVertical: if (dir == EDirections.EDirTop) { return EDirections.EDirTop; } if (dir != EDirections.EDirDown) { break; } return EDirections.EDirDown; case ETileTopRight: if (dir != EDirections.EDirDown) { if (dir != EDirections.EDirLeft) { break; } return EDirections.EDirTop; } return EDirections.EDirRight; case ETileRightDown: if (dir != EDirections.EDirTop) { if (dir != EDirections.EDirLeft) { break; } return EDirections.EDirDown; } return EDirections.EDirRight; case ETileDownLeft: if (dir != EDirections.EDirTop) { if (dir != EDirections.EDirRight) { break; } return EDirections.EDirDown; } return EDirections.EDirLeft; case ETileLeftTop: if (dir != EDirections.EDirDown) { if (dir != EDirections.EDirRight) { break; } return EDirections.EDirTop; } return EDirections.EDirLeft; case ETileCross: if (dir != EDirections.EDirTop) { if (dir == EDirections.EDirDown) { return EDirections.EDirDown; } if (dir == EDirections.EDirLeft) { return EDirections.EDirLeft; } if (dir == EDirections.EDirRight) { return EDirections.EDirRight; } break; } return EDirections.EDirTop; case ECaveBottom: return EDirections.EDirDown; case ECaveLeft: return EDirections.EDirLeft; case ECaveRight: return EDirections.EDirRight; case ECaveTop: return EDirections.EDirTop; default: return EDirections.TRAIN_CRASH; } return EDirections.TRAIN_CRASH; } }