From bd7c60725cdd0ad94f4854b67adf89dda5e4af57 Mon Sep 17 00:00:00 2001 From: Timothée Floure Date: Mon, 25 Apr 2016 12:43:52 +0200 Subject: Week 7 + basic tests --- src/ch/epfl/xblast/server/painter/BlockImage.java | 42 +++++++++++++++++ .../epfl/xblast/server/painter/BoardPainter.java | 40 ++++++++++++++++ .../xblast/server/painter/ExplosionPainter.java | 55 ++++++++++++++++++++++ .../epfl/xblast/server/painter/PlayerPainter.java | 44 +++++++++++++++++ 4 files changed, 181 insertions(+) create mode 100644 src/ch/epfl/xblast/server/painter/BlockImage.java create mode 100644 src/ch/epfl/xblast/server/painter/BoardPainter.java create mode 100644 src/ch/epfl/xblast/server/painter/ExplosionPainter.java create mode 100644 src/ch/epfl/xblast/server/painter/PlayerPainter.java (limited to 'src') diff --git a/src/ch/epfl/xblast/server/painter/BlockImage.java b/src/ch/epfl/xblast/server/painter/BlockImage.java new file mode 100644 index 0000000..d5fa593 --- /dev/null +++ b/src/ch/epfl/xblast/server/painter/BlockImage.java @@ -0,0 +1,42 @@ +package ch.epfl.xblast.server.painter; + +/** + * @author Timothée FLOURE (257420 + */ +public enum BlockImage { + + /** + * Free block. + */ + IRON_FLOOR, + + /** + * Shadowed Free block. + */ + IRON_FLOOR_S, + + /** + * Dark Block (Indestructible wall). + */ + DARK_BLOCK, + + /** + * Wall possibly containing a Bonus. + */ + EXTRA, + + /** + * Crumbling Wall possibly containing a Bonus. + */ + EXTRA_O, + + /** + * MaxBomb bonus. + */ + BONUS_BOMB, + + /** + * Bomb Range Bonus. + */ + BONUS_RANGE +} diff --git a/src/ch/epfl/xblast/server/painter/BoardPainter.java b/src/ch/epfl/xblast/server/painter/BoardPainter.java new file mode 100644 index 0000000..69af129 --- /dev/null +++ b/src/ch/epfl/xblast/server/painter/BoardPainter.java @@ -0,0 +1,40 @@ +package ch.epfl.xblast.server.painter; + +import ch.epfl.xblast.*; +import ch.epfl.xblast.server.*; + +import java.util.Map; + +/** + * @author Timothée FLOURE (257420) + */ +public final class BoardPainter { + + private final Map blocksMap; + private final BlockImage shadowedFreeBlock; + + /** + * Instantiates a new BoardPainter. + * + * @param blocksMap map linking block to the images + * @param shadowedFreeBlock a "shadowed" block image + */ + public BoardPainter(Map blocksMap, BlockImage shadowedFreeBlock ) { + this.blocksMap = blocksMap; + this.shadowedFreeBlock = shadowedFreeBlock; + } + + /** + * Returns the bits sequence of the block related to the given Cell. + * + * @param board given board + * @param cell given cell + * @return the bits sequence related to the image of the given cell + */ + public byte byteForCell(Board board, Cell cell) { + if (board.blockAt(cell).isFree() && board.blockAt(cell.neighbor(Direction.W)).castsShadow()) + return (byte) shadowedFreeBlock.ordinal(); + + return (byte) this.blocksMap.get(board.blockAt(cell)).ordinal(); + } +} diff --git a/src/ch/epfl/xblast/server/painter/ExplosionPainter.java b/src/ch/epfl/xblast/server/painter/ExplosionPainter.java new file mode 100644 index 0000000..63181e9 --- /dev/null +++ b/src/ch/epfl/xblast/server/painter/ExplosionPainter.java @@ -0,0 +1,55 @@ +package ch.epfl.xblast.server.painter; + +import ch.epfl.xblast.server.*; + +/** + * @author Timothée FLOURE (257420) + */ +public final class ExplosionPainter { + private static final byte BLACK_BOMB_IMAGE = 20; + private static final byte WHITE_BOMB_IMAGE = 21; + + private static final byte NORTH_EXPLOSION = 0b1000; + private static final byte EAST_EXPLOSION = 0b0100; + private static final byte SOUTH_EXPLOSION = 0b0010; + private static final byte WEST_EXPLOSION = 0b0001; + + /** + * Return the image corresponding to a bomb depending on its fuse length. + * + * @param bomb given bomb + * @return the byte related to the image of the bomb (black or white) + */ + public static byte byteForBomb(Bomb bomb) + { + if (Integer.bitCount(bomb.fuseLength()) == 1 ) { + return WHITE_BOMB_IMAGE; + } else { + return BLACK_BOMB_IMAGE; + } + } + + /** + * Return the image corresponding to the explosion on a cell given the explosions of its neighbors. + * + * @param north is an explosion on the north cell + * @param east is an explosion on the east cell + * @param south is an explosion on the south cell + * @param west is an explosion on the west cell + * @return the byte corresponding to the related image + */ + public static byte byteForBlast(boolean north, boolean east, boolean south, boolean west) { + byte correspondingByte = 0b0; + + if (north) + correspondingByte += NORTH_EXPLOSION; + if (east) + correspondingByte += EAST_EXPLOSION; + if (south) + correspondingByte += SOUTH_EXPLOSION; + if (west) + correspondingByte += WEST_EXPLOSION; + + return correspondingByte; + } +} diff --git a/src/ch/epfl/xblast/server/painter/PlayerPainter.java b/src/ch/epfl/xblast/server/painter/PlayerPainter.java new file mode 100644 index 0000000..4f28554 --- /dev/null +++ b/src/ch/epfl/xblast/server/painter/PlayerPainter.java @@ -0,0 +1,44 @@ +package ch.epfl.xblast.server.painter; + +import ch.epfl.xblast.server.*; + +/** + * @author Timothée FLOURE (257420) + */ +public final class PlayerPainter { + private static final byte DEAD_PLAYER = 16; + private static final byte DYING_IMAGE_ID = 12; + private static final byte LAST_DYING_IMAGE_ID = 13; + private static final byte PLAYER_MULTIPLIER = 20; + + /** + * Returns the byte related to the image corresponding to the actual state of the given player. + * + * @param player the given player + * @param tick the actual tick of the game + * @return the byte related to the image of the the actual state of the player + */ + public static byte byteForPlayer(Player player, int tick) { + if (!player.isAlive()) + return DEAD_PLAYER; + + byte correspondingByte = (byte) (player.id().ordinal() * PLAYER_MULTIPLIER); + + if (player.lifeState().state() == Player.LifeState.State.DYING) + if (player.lives() > 0) + return (byte) (correspondingByte + DYING_IMAGE_ID); + else + return (byte) (correspondingByte + LAST_DYING_IMAGE_ID ); + + correspondingByte += player.direction().ordinal() * 3; + + switch (tick % 4) { // Magic Numbers !!! + case 1: + return (byte) (correspondingByte + 1); + case 3: + return (byte) (correspondingByte + 2); + default: + return (byte) (correspondingByte + 0); + } + } +} -- cgit v1.2.3