diff --git a/build.gradle b/build.gradle index 6acc6d1..656448b 100644 --- a/build.gradle +++ b/build.gradle @@ -11,7 +11,7 @@ apply plugin: 'net.minecraftforge.gradle.forge' //Only edit below this line, the above code adds and enables the necessary things for Forge to be setup. -version = "2.1.1" +version = "2.1.2" group = "superhb.arcademod" // http://maven.apache.org/guides/mini/guide-naming-conventions.html archivesBaseName = "arcademod" diff --git a/src/main/java/superhb/arcademod/Reference.java b/src/main/java/superhb/arcademod/Reference.java index 9dfb167..151a0dc 100644 --- a/src/main/java/superhb/arcademod/Reference.java +++ b/src/main/java/superhb/arcademod/Reference.java @@ -3,7 +3,7 @@ public class Reference { public static final String MODID = "arcademod"; public static final String NAME = "Arcade Mod"; - public static final String VERSION = "2.1.1"; + public static final String VERSION = "2.1.2"; public static final String CLIENT_PROXY = "superhb.arcademod.proxy.ClientProxy"; public static final String SERVER_PROXY = "superhb.arcademod.proxy.CommonProxy"; public static final String DESCRIPTION = "Adds various arcade games to Minecraft"; diff --git a/src/main/java/superhb/arcademod/client/gui/GuiHandler.java b/src/main/java/superhb/arcademod/client/gui/GuiHandler.java index c5abdf3..ff057e7 100644 --- a/src/main/java/superhb/arcademod/client/gui/GuiHandler.java +++ b/src/main/java/superhb/arcademod/client/gui/GuiHandler.java @@ -7,7 +7,7 @@ import superhb.arcademod.client.tileentity.*; public class GuiHandler implements IGuiHandler { - private int SNAKE = 0, TETROMINOES = 1, PACMAN = 2, PONG = 3; + private int SNAKE = 0, TETROMINOES = 1, PACMAN = 2, PONG = 3, SPACEINVADERS = 4; private int PRIZE = -1, PUSHER = -2; @Override @@ -23,6 +23,7 @@ public Object getClientGuiElement (int id, EntityPlayer player, World world, int else if (id == PRIZE) return new GuiPrize((TileEntityPrize)world.getTileEntity(new BlockPos(x, y, z))); else if (id == PUSHER) return new GuiPusher(world, x, y, z, player); else if (id == PONG) return new GuiPong(world, (TileEntityArcade)world.getTileEntity(new BlockPos(x, y, z)), new BlockPos(x, y, z), player); + else if (id == SPACEINVADERS) return new GuiSpaceInvaders(world, (TileEntityArcade)world.getTileEntity(new BlockPos(x, y, z)), new BlockPos(x, y, z), player); return null; } } diff --git a/src/main/java/superhb/arcademod/client/gui/GuiSpaceInvaders.java b/src/main/java/superhb/arcademod/client/gui/GuiSpaceInvaders.java new file mode 100644 index 0000000..b124e25 --- /dev/null +++ b/src/main/java/superhb/arcademod/client/gui/GuiSpaceInvaders.java @@ -0,0 +1,1179 @@ +package superhb.arcademod.client.gui; + +import net.minecraft.client.renderer.GlStateManager; +import net.minecraft.client.resources.I18n; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.SoundCategory; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.World; +import superhb.arcademod.Reference; +import superhb.arcademod.api.gui.GuiArcade; +import superhb.arcademod.client.ArcadeItems; +import superhb.arcademod.client.audio.LoopingSound; +import superhb.arcademod.client.tileentity.ArcadeLeaderboard; +import superhb.arcademod.client.tileentity.TileEntityArcade; +import superhb.arcademod.util.ArcadeSoundRegistry; +import superhb.arcademod.util.KeyHandler; + +import javax.annotation.Nullable; +import java.awt.*; +import java.io.IOException; +import java.util.Random; + +public class GuiSpaceInvaders extends GuiArcade { + + private static final ResourceLocation texture = new ResourceLocation(Reference.MODID + ":textures/gui/spaceinvaders.png"); + + // Texture Variables + private static final int GUI_X = 234, GUI_Y = 284; + private static final int MAZE_X = 224, MAZE_Y = 248; + + private static final int ALIEN = 14; + private static final int TANK = 15; + + // Audio Variables + private float volume = 1f; // TODO: Create volume slider in game settings (separate volume sliders for different sounds?) + + // Board Variables + private int boardX, boardY; + private int score; + private Tile[][] tiles = new Tile[31][28]; // 28x31 + private byte level; + private boolean gameOver, mazeBlink, nextLevel; + private int mazeBlinkTick = 0; + private int mazeBlinks = 0; + private boolean playing, updatePos, allDead; + private int startTick = 0; + private EnumBonus bonus; + private int bonusTick, bonusTime; + private boolean showBonus; + private int backTick; + private int activeBombs; + private int ufoScore = 0; + LoopingSound theme; + int topScore; + String topName; + ArcadeLeaderboard[] leaderboard = this.getTileEntity().getLeaderboard(); + + // Character Variables + private Player tank; + private Alien[] aliens = new Alien[32]; + private Bullet bullet; + private Bomb[] bombs = new Bomb[8]; + private UFO ufo; + private Direction lastDirection, desiredDirection = Direction.LEFT; + private int deathTick = 0, gameOverTick = 0; + + public GuiSpaceInvaders (World world, TileEntityArcade tile, @Nullable BlockPos pos, EntityPlayer player) { + super(world, tile, pos, player); + setGuiSize(GUI_X, GUI_Y, 0.8F); + setTexture(texture, 512, 512); + setCost(4); + setOffset(0, 0); + setButtonPos((GUI_X / 2) - (buttonWidth / 2), GUI_Y - 30); + setStartMenu(0); + } + + @Override + public void updateScreen () { + super.updateScreen(); + + if (inMenu) { + if (mc.getSoundHandler().isSoundPlaying(theme)) { + mc.getSoundHandler().stopSound(theme); + } + if (menu == 3) { + if ((tickCounter - backTick) == 60) { + tickCounter = score = mazeBlinks = mazeBlinkTick = deathTick = gameOverTick = level = 0; + checkMenuAfterGameOver(); + } + } + } else { + if (playing) { + if (theme == null) { + theme = new LoopingSound(this.getTileEntity(), ArcadeSoundRegistry.SPACEINVADERS, SoundCategory.RECORDS, volume - 0.5f); + } + if (!mc.getSoundHandler().isSoundPlaying(theme)) { + mc.getSoundHandler().playSound(theme); + } + // Tank Logic + for (int i = 0; i < 3; i++) tank.move().updatePosition(boardX, boardY); + tank.update(); + + if (desiredDirection == Direction.DOWN) { + for (int i = 0; i < aliens.length; i++) { + if (aliens[i].isVisible) { + aliens[i].ai().move().updatePosition(boardX, boardY); + } + } + if (lastDirection == Direction.LEFT) { + desiredDirection = Direction.RIGHT; + lastDirection = Direction.RIGHT; + } else { + desiredDirection = Direction.LEFT; + lastDirection = Direction.LEFT; + } + } else { + for (int i = 0; i < aliens.length; i++) { + if (aliens[i].isVisible) { + aliens[i].ai().move().updatePosition(boardX, boardY); + } + } + } + for (int i = 0; i < aliens.length; i++) { + aliens[i].current = desiredDirection; + aliens[i].update(); + } + + // Alien bombing logic + Random random = new Random(); + activeBombs = 0; + for (int i=0;i= (ufoScore + 100)) { + // Send a UFO + ufoScore = score; + if (ufo == null) { + ufo = new UFO(0, 26, 4, new Color(100,random.nextInt(256),random.nextInt(256)),true); + ufo.canMove = true; + } + } + + if (ufo != null) { + ufo.move().updatePosition(boardX, boardY); + if (ufo != null) { + ufo.update(); + } + } + + collisionDetection(); + + allDead = true; + for (int i = 0; i < aliens.length; i++) { + if (aliens[i].isVisible) { + allDead = false; + } + } + + // Level Logic + if (allDead) { + if (!nextLevel) { + tank.canMove = false; + for (int i = 0; i < aliens.length; i++) aliens[i].canMove = false; + nextLevel = true; + mazeBlinkTick = tickCounter; + } + if (((tickCounter - mazeBlinkTick) == 40 && mazeBlinks == 0) || ((tickCounter - mazeBlinkTick) == 5 && mazeBlinks < 5)) { + mazeBlinkTick = tickCounter; + if (!mazeBlink) mazeBlink = true; + else mazeBlink = false; + mazeBlinks++; + } + if (mazeBlinks == 5) { // Next Game Logic + level++; + mazeBlink = false; + mazeBlinks = 0; + allDead = false; + tickCounter = deathTick = gameOverTick = 0; + setupTiles(); + setupGame(); + } + } + + if (showBonus && (tickCounter - bonusTick) == bonusTime) showBonus = false; + } else { + if ((tickCounter - startTick) == 35) { + playing = true; + tank.canMove = true; + for (int i = 0; i < aliens.length; i++) aliens[i].canMove = true; + } + if (!updatePos) { + updatePos = true; + tank.updatePosition(boardX, boardY); + for (int i = 0; i < aliens.length; i++) aliens[i].updatePosition(boardX, boardY); + } + } + } + } + + @Override + public void drawScreen (int mouseX, int mouseY, float partialTick) { + boardX = xScaled - (GUI_X / 2) + 5; + boardY = yScaled - (GUI_Y / 2) + 14; + super.drawScreen(mouseX, mouseY, partialTick); + + int controlWidth = this.fontRendererObj.getStringWidth(I18n.format("option.arcademod:control.locale")); + int settingWidth = this.fontRendererObj.getStringWidth(I18n.format("option.arcademod:setting.locale")); + + if (inMenu) { + switch (menu) { + case 0: // Main Menu + int titleWidth = this.fontRendererObj.getStringWidth(I18n.format("game.arcademod:spaceinvaders.name")); + int startWidth = this.fontRendererObj.getStringWidth(I18n.format("option.arcademod:start.locale")); + + this.fontRendererObj.drawString(I18n.format("game.arcademod:spaceinvaders.name"), boardX + (GUI_X / 2) - (titleWidth / 2), boardY + 2, Color.WHITE.getRGB()); + this.fontRendererObj.drawString(I18n.format("option.arcademod:start.locale"), boardX + (GUI_X / 2) - (startWidth / 2), boardY + (GUI_Y / 2) - 30, Color.WHITE.getRGB()); + this.fontRendererObj.drawString(I18n.format("option.arcademod:control.locale"), boardX + (GUI_X / 2) - (controlWidth / 2), boardY + (GUI_Y / 2) - 20, Color.WHITE.getRGB()); + this.fontRendererObj.drawString(I18n.format("option.arcademod:setting.locale"), boardX + (GUI_X / 2) - (settingWidth / 2), boardY + (GUI_Y / 2) - 10, Color.WHITE.getRGB()); + + if (menuOption == 0) + drawRightArrow(boardX + (GUI_X / 2) - 30, boardY + (GUI_Y / 2) - 32, true); // Start + else if (menuOption == 1) + drawRightArrow(boardX + (GUI_X / 2) - 30, boardY + (GUI_Y / 2) - 22, true); // Controls + else if (menuOption == 2) + drawRightArrow(boardX + (GUI_X / 2) - 30, boardY + (GUI_Y / 2) - 12, true); // Settings + break; + case 1: // Controls + this.fontRendererObj.drawString(I18n.format("option.arcademod:control.locale"), boardX + (GUI_X / 2) - (controlWidth / 2), boardY + 2, Color.WHITE.getRGB()); + + // Controls + this.fontRendererObj.drawString("[" + KeyHandler.up.getDisplayName() + "] " + I18n.format("control.arcademod:up.spaceinvaders.name"), boardX + (GUI_X / 2) - 30, boardY + (GUI_Y / 2) - 20, Color.WHITE.getRGB()); + this.fontRendererObj.drawString("[" + KeyHandler.left.getDisplayName() + "] " + I18n.format("control.arcademod:left.name"), boardX + (GUI_X / 2) - 30, boardY + (GUI_Y / 2), Color.WHITE.getRGB()); + this.fontRendererObj.drawString("[" + KeyHandler.right.getDisplayName() + "] " + I18n.format("control.arcademod:right.name"), boardX + (GUI_X / 2) - 30, boardY + (GUI_Y / 2) + 10, Color.WHITE.getRGB()); + + // Back + this.fontRendererObj.drawString("[" + KeyHandler.left.getDisplayName() + "] " + I18n.format("option.arcademod:back.name"), boardX + 2, boardY + (GUI_Y) - 30, Color.white.getRGB()); + break; + case 2: // Settings + // Back + this.fontRendererObj.drawString("[" + KeyHandler.left.getDisplayName() + "] " + I18n.format("option.arcademod:back.name"), boardX + 2, boardY + (GUI_Y) - 30, Color.white.getRGB()); + break; + case 3: // Game Over + this.fontRendererObj.drawString(I18n.format("text.arcademod:gameover.locale"), boardX + (GUI_X / 2) - (this.fontRendererObj.getStringWidth(I18n.format("text.arcademod:gameover.locale")) / 2), boardY + (GUI_Y / 2) - 20, Color.WHITE.getRGB()); + this.fontRendererObj.drawString(I18n.format("text.arcademod:score.locale") + ": " + score, boardX + (GUI_X / 2) - (this.fontRendererObj.getStringWidth(I18n.format("text.arcademod:score.locale=Score") + ": " + score)), boardY + (GUI_Y / 2), Color.WHITE.getRGB()); + break; + } + } else { + //getTileEntity().playSound(ArcadeSounds.PACMAN_SIREN, true); + + drawMaze(); + + for (int y = 0; y < 31; y++) { + for (int x = 0; x < 28; x++) { + if (tiles[y][x] != null) tiles[y][x].updatePosition(boardX, boardY).drawTile(); + } + } + + // Aliens + if (playing) { + for (int i = 0; i < aliens.length; i++) { + if (aliens[i].isVisible) { + aliens[i].drawAlien(); + } + } + } + + // Tank (Player) + tank.drawPlayer().drawLives(); + + // Bullet + if (bullet != null) { + bullet.drawBullet(); + } + + // Bombs + for (int i=0;i= 0; i--) { + for (int j=0; j < 8; j++) { + int id = i * 8 + j; + if (bullet != null) { + if (bullet.extendedX >= (aliens[id].extendedX - 7) && + bullet.extendedX <= (aliens[id].extendedX + 7) && + bullet.extendedY >= (aliens[id].extendedY - 7) && + bullet.extendedY <= (aliens[id].extendedY + 7) && + aliens[id].isVisible) { + aliens[id].isVisible = false; + bullet = null; + score += 10; + getWorld().playSound(getPlayer(), getPos(), ArcadeSoundRegistry.SPACEINVADERS_DESTROYED, SoundCategory.BLOCKS, volume - 0.2f, 1.0f); + } + } + } + } + for(int i=0;i= (tank.extendedX - 7) && + bombs[i].extendedX <= (tank.extendedX + 7) && + bombs[i].extendedY + 7 >= (tank.extendedY - 7) && + bombs[i].extendedY <= (tank.extendedY + 7)) { + endGame(); + } + } + } + + // Check if UFO gets killed + if (bullet != null && ufo != null) { + if (bullet.extendedX >= (ufo.extendedX - 7) && + bullet.extendedX <= (ufo.extendedX + 7) && + bullet.extendedY >= (ufo.extendedY - 7) && + bullet.extendedY <= (ufo.extendedY + 7) && + ufo.isVisible) { + bullet = null; + ufo = null; + getWorld().playSound(getPlayer(), getPos(), ArcadeSoundRegistry.SPACEINVADERS_DESTROYED, SoundCategory.BLOCKS, volume - 0.2f, 1.0f); + score += 50; + } + } + } + + private void endGame () { + if (!gameOver) { + gameOver = true; + tank.canMove = false; + for (int i = 0; i < aliens.length; i++) aliens[i].canMove = false; + tank.kill(); + } + this.fontRendererObj.drawString(I18n.format("text.arcademod:gameover.locale"), boardX + (MAZE_X / 2) - (this.fontRendererObj.getStringWidth(I18n.format("text.arcademod:gameover.locale")) / 2), boardY + (MAZE_Y / 2) + 13, Color.red.getRGB()); + } + + private void setupGame () { + resetGame(); + + if (gameOver) { + tank.reset(); + tickCounter = deathTick = gameOverTick = 0; + gameOver = false; + } + startTick = tickCounter; + playing = false; + } + + private void respawn () { + if (gameOver) { + tank.reset(); + tickCounter = deathTick = gameOverTick = 0; + gameOver = false; + } + startTick = tickCounter; + playing = false; + activeBombs = 0; + } + + private void resetGame () { + for (int i=0; i < 4; i++) { + for (int j=0; j < 8; j++) { + int id = i * 8 + j; + if (i == 0) { + aliens[id] = new Alien(id, 7 + (j * 2), 5 + (i * 2), new Color(29, 226, 255), true); + } + if (i == 1) { + aliens[id] = new Alien(id, 7 + (j * 2), 5 + (i * 2), new Color(30, 180, 50), true); + } + if (i == 2) { + aliens[id] = new Alien(id, 7 + (j * 2), 5 + (i * 2), new Color(255, 180, 0), true); + } + if (i == 3) { + aliens[id] = new Alien(id, 7 + (j * 2), 5 + (i * 2), new Color(180, 30, 180), true); + } + } + } + allDead = false; + nextLevel = false; + for (int i=0;i= 12 && gameOverTick == 0) { + moveX = moveY = 0; + setStartPos(14, 29); + prevX = 14; + prevY = 29; + gameOverTick = tickCounter; + } + if ((tickCounter - gameOverTick) == 20) { + if (lives == 0) { // Go back to main menu logic + giveReward(ArcadeItems.ticket, (score / 200)); + inMenu = true; + menu = 3; + playDeathAnimation = false; + backTick = tickCounter; + gameOver = mazeBlink = nextLevel = updatePos = false; + } else { + lives--; + respawn(); + deathAnimation = 0; + playDeathAnimation = false; + showBonus = false; + bonusTick = 0; + } + } + } + + // Bonus Logic + if (showBonus) { + if ((extendedX >= offsetX + (13 * 8) - 2 && (extendedX <= offsetX + (13 * 8) + 2)) && extendedY == offsetY + (17 * 8)) { + showBonus = false; + bonusTick = 0; + score += bonus.getPoints(); + } + } + } + + public void kill () { + playDeathAnimation = true; + deathTick = tickCounter; + getWorld().playSound(getPlayer(), getPos(), ArcadeSoundRegistry.SPACEINVADERS_EXPLODE, SoundCategory.BLOCKS, volume, 1.0f); + } + + private void reset () { + setStartPos(14, 29); + + prevX = 14; + prevY = 29; + moveX = moveY = 0; + current = Direction.LEFT; + } + + private float getSpeed () { + if (level == 0) { // Level 1 + return 0.8f; + } + if (level >= 1 && level <= 3) { // Level 2-4 + return 0.9f; // Regular Speed + } + if (level >= 4 && level <= 19) { // Level 5-20 + return 1; // Regular Speed + } + if (level >= 20) { // Level 21+ + return 0.9f; // Regular Speed + } + return 0.8f; + } + + @Override + public Player updatePosition (int x, int y) { + super.updatePosition(x, y); + + // Animation + if ((this.x != prevX) || (this.y != prevY)) { + prevX = this.x; + prevY = this.y; + if (STATE == 0) STATE = 1; + else STATE = 0; + } + return this; + } + + private Player drawPlayer () { + if (!gameOver) { + GlStateManager.color(1.0F, 1.0F, 1.0F); + switch (current) { + case STAND: + drawModalRectWithCustomSizedTexture(extendedX - 4, extendedY - 4, 0, GUI_Y + (300 - GUI_Y), TANK, TANK, 512, 512); + return this; + case LEFT: + drawModalRectWithCustomSizedTexture(extendedX - 4, extendedY - 4, TANK * 0, GUI_Y + (300 - GUI_Y), TANK, TANK, 512, 512); + return this; + case RIGHT: + drawModalRectWithCustomSizedTexture(extendedX - 4, extendedY - 4, TANK * 0, GUI_Y + (300 - GUI_Y), TANK, TANK, 512, 512); + return this; + case DOWN: + return this; + case UP: + drawModalRectWithCustomSizedTexture(extendedX - 4, extendedY - 4, TANK * 0, GUI_Y + (300 - GUI_Y), TANK, TANK, 512, 512); + return this; + } + } else { + glColor(Color.WHITE); + if (playDeathAnimation && deathAnimation <= 12) { + drawModalRectWithCustomSizedTexture(extendedX - 4, extendedY - 4, TANK * deathAnimation, GUI_Y + (TANK * 2) + (300 - GUI_Y), TANK, TANK, 512, 512); + } + } + return this; + } + + private Player drawLives () { + GlStateManager.color(1.0F, 1.0F, 1.0F); + for (int i = 0; i < lives; i++) { + drawModalRectWithCustomSizedTexture(offsetX + (i * 14), offsetY + 248, TANK * 0, GUI_Y + (300 - GUI_Y), TANK, TANK, 512, 512); + } + return this; + } + } + + private class Alien extends Mover { + private int alienid; + private Color aliencolor; + private boolean isVisible; + int BODY_STATE = 0; + + public Alien (int id, int startx, int starty, Color color, boolean isVisible) { + super(startx,starty); + alienid = id; + aliencolor = color; + this.isVisible = isVisible; + current = Direction.LEFT; + } + + private Mover move () { + // Movement Logic + if (canMove) { + switch (current) { + case LEFT: + if (!isBlockedLeft()) moveX -= getSpeed(); + return this; + case RIGHT: + if (!isBlockedRight()) moveX += getSpeed(); + return this; + case UP: + if (!isBlocked()) moveY -= getSpeed(); + return this; + case DOWN: + if (!isBlockedDown()) moveY += 3; + return this; + case STAND: + return this; + } + } + return this; + } + + private float getSpeed () { + if (level == 1 || level == 2) { // Level 1-2 + return 0.75f; + } + if (level == 3 || level == 4) { // Level 2-3 + return 1.0f; + } + if (level >= 5) { // Level 5+ + return 2.0f; + } + return 0.75f; + } + + @Override + public void update () { + // Animation + if ((extendedX - offsetX) % 4 == 0) { + if (BODY_STATE == 0) BODY_STATE = 1; + else BODY_STATE = 0; + } + } + + private Alien ai () { + if (current == Direction.LEFT) { // Can't Move right + if (isBlockedLeft(x - 1, y)) { // is blocked left + desiredDirection = Direction.DOWN; + } + } + if (current == Direction.RIGHT) { // Can't Move right + if (isBlockedRight(x + 1, y)) { // is blocked left + desiredDirection = Direction.DOWN; + } + } + if (current == Direction.DOWN) { + if (isBlockedDown(x, y + 2)) { // is blocked down + // Game Over is Alien is alive and reaches the ground + if (isVisible) { + tank.lives = 0; + endGame(); + } + } + } + return this; + } + + private boolean isBlockedDown (int x, int y) { + return tiles[Math.min(30, y + 1)][Math.max(0, x)].type == EnumTile.WALL; + } + + private boolean isBlockedLeft (int x, int y) { + return tiles[y][Math.max(0, x - 1)].type == EnumTile.WALL; + } + + private boolean isBlockedRight (int x, int y) { + return tiles[y][Math.min(27, x + 1)].type == EnumTile.WALL; + } + + @Override + public boolean isBlockedDown () { + return isBlockedDown(x, y); + } + + private Alien drawAlien () { + if (!isVisible) { + return this; + } + glColor(aliencolor); + int startX = GUI_X + 10; + + if (alienid < 32) { + startX = GUI_X + 10; + } + if (alienid < 24) { + startX = GUI_X + 10 + (ALIEN * 6); + } + if (alienid < 16) { + startX = GUI_X + 10 + (ALIEN * 4); + } + if (alienid < 8) { + startX = GUI_X + 10 + (ALIEN * 2); + } + if (BODY_STATE == 0) { + drawModalRectWithCustomSizedTexture(extendedX - 3, extendedY - 3, startX, MAZE_Y, ALIEN, ALIEN, 512, 512); + } else { + drawModalRectWithCustomSizedTexture(extendedX - 3, extendedY - 3, startX + ALIEN, MAZE_Y, ALIEN, ALIEN, 512, 512); + } + return this; + } + } + + private class Bullet extends Mover { + private int id; + private Color color; + private boolean isVisible; + int BODY_STATE = 0; + + public Bullet (int id, int startx, int starty, Color color, boolean isVisible) { + super(startx,starty); + this.id = id; + this.color = color; + this.isVisible = isVisible; + } + + private Mover move () { + // Movement Logic + if (canMove) { + if (!isBlocked(x,y - 4)) { + if (isVisible) { + moveY -= getSpeed(); + } + } else { + bullet = null; + return this; + } + return this; + } + return this; + } + + private float getSpeed () { + return 5.0f; + } + + @Override + public void update () { + // Animation + if ((extendedX - offsetX) % 4 == 0) { + if (BODY_STATE == 0) BODY_STATE = 1; + else BODY_STATE = 0; + } + } + + private boolean isBlocked (int x, int y) { + return tiles[Math.max(0, y - 1)][Math.max(0, x)].type == EnumTile.WALL; + } + + private boolean isBlockedDown (int x, int y) { + return tiles[Math.min(30, y + 1)][Math.max(0, x)].type == EnumTile.WALL; + } + + @Override + public boolean isBlockedDown () { + return isBlockedDown(x, y); + } + + private Bullet drawBullet () { + if (!isVisible) { + return this; + } + glColor(color); + drawModalRectWithCustomSizedTexture(extendedX - 3, extendedY - 3, 30, 301, 14, 4, 512, 512); + return this; + } + } + + private class Bomb extends Mover { + int pauseTick; + private int id; + private Color color; + private boolean isVisible; + int BODY_STATE = 0; + + public Bomb (int id, int startx, int starty, Color color, boolean isVisible) { + super(startx,starty); + this.id = id; + this.color = color; + this.isVisible = isVisible; + } + + private Mover move () { + // Movement Logic + if (canMove) { + if (!isBlockedDown(x, y + 1)) { + if (isVisible) { + moveY += getSpeed(); + } + } else { + canMove = false; + isVisible = false; + return this; + } + return this; + } + return this; + } + + private float getSpeed () { + return 4.0f; + } + + @Override + public void update () { + // Animation + if ((extendedY - offsetY) % 4 == 0) { + if (BODY_STATE == 0) BODY_STATE = 1; + else BODY_STATE = 0; + } + } + + private boolean isBlockedDown (int x, int y) { + return tiles[Math.min(30, y + 1)][Math.max(0, x)].type == EnumTile.WALL; + } + + @Override + public boolean isBlockedDown () { + return isBlockedDown(x, y); + } + + private Bomb drawBomb () { + if (!isVisible) { + return this; + } + glColor(color); + // Body + if (BODY_STATE == 0) { + drawModalRectWithCustomSizedTexture(extendedX - 3, extendedY - 3, 240, 270, 14, 14, 512, 512); + } else { + drawModalRectWithCustomSizedTexture(extendedX - 3, extendedY - 3, 257, 270, 14, 14, 512, 512); + } + + return this; + } + } + + private class UFO extends Mover { + int pauseTick; + private int id; + private Color color; + private boolean isVisible; + int BODY_STATE = 0; + + public UFO (int id, int startx, int starty, Color color, boolean isVisible) { + super(startx,starty); + this.id = id; + this.color = color; + this.isVisible = isVisible; + } + + private Mover move () { + // Movement Logic + if (canMove) { + if (!isBlockedDown(x - 1, y)) { + if (isVisible) { + moveX -= getSpeed(); + } + } else { + canMove = false; + isVisible = false; + ufo = null; + return this; + } + return this; + } + return this; + } + + private float getSpeed () { + return 2.0f; + } + + @Override + public void update () { + // Animation + if ((extendedY - offsetY) % 4 == 0) { + if (BODY_STATE == 0) BODY_STATE = 1; + else BODY_STATE = 0; + } + } + + /*private boolean isBlocked (int x, int y) { + return tiles[Math.max(0, y - 1)][Math.max(0, x)].type == EnumTile.WALL; + }*/ + + private boolean isBlockedDown (int x, int y) { + return tiles[Math.min(30, y + 1)][Math.max(0, x)].type == EnumTile.WALL; + } + + @Override + public boolean isBlockedDown () { + return isBlockedDown(x, y); + } + + private UFO drawUFO () { + if (!isVisible) { + return this; + } + glColor(color); + // Body + int startX = GUI_X + 10 + (ALIEN * 8); + if (BODY_STATE == 0) { + drawModalRectWithCustomSizedTexture(extendedX - 3, extendedY - 3, startX, MAZE_Y, ALIEN, ALIEN, 512, 512); + } else { + glColor(color.brighter()); + drawModalRectWithCustomSizedTexture(extendedX - 3, extendedY - 3, startX, MAZE_Y, ALIEN, ALIEN, 512, 512); + } + + return this; + } + } + + private class Mover { + Direction current; + + // Position + int x, y; + int x1, y1; + float moveX, moveY; + int extendedX, extendedY; + int offsetX, offsetY; + + public boolean canMove; + + private Mover (int x, int y) { + setStartPos(x, y); + } + + public Mover updatePosition (int x, int y) { + extendedX = (int)(x1 + x + moveX); + extendedY = (int)(y1 + y + moveY); + + offsetX = x; + offsetY = y; + + if ((extendedX - x) % 8 == 0) this.x = (extendedX - x) / 8; + if ((extendedY - y) % 8 == 0) this.y = (extendedY - y) / 8; + return this; + } + + public void setStartPos (int x, int y) { + this.x1 = (x * 8) - 4; + this.y1 = y * 8; + this.x = x; + this.y = y; + } + public boolean isBlocked () { + return tiles[Math.max(0, y - 1)][x].type == EnumTile.WALL; + } + + public boolean isBlockedDown () { + return tiles[y + 1][x].type == EnumTile.WALL; + } + + boolean isBlockedLeft () { + return tiles[y][Math.max(0, x - 1)].type == EnumTile.WALL; + } + + boolean isBlockedRight () { + return tiles[y][Math.min(27, x + 1)].type == EnumTile.WALL; + } + + /*boolean onTile () { + return (extendedX - offsetX) % 8 == 0 && (extendedY - offsetY) % 8 == 0; + }*/ + + /*EnumTile checkTile () { + return tiles[y][x].type; + }*/ + + /*public Point getPosition () { + return new Point(x, y); + } + + public Tile getTile () { + return tiles[y][x]; + }*/ + + /** + * Called every tick + */ + public void update () {} + } + + private void setupTiles () { + // Row 0 + for (int i = 0; i < 28; i++) tiles[0][i] = new Tile(i, 0, EnumTile.WALL); + // Row 1 - 29 + for (int j = 1; j <= 29; j++) { + for (int i = 0; i < 28; i++) { + if (i == 0 || i == 27) tiles[j][i] = new Tile(i, j, EnumTile.WALL); + else tiles[j][i] = new Tile(i, j,EnumTile.PLAY); + } + } + // Row 30 + for (int i = 0; i < 28; i++) tiles[30][i] = new Tile(i, 30, EnumTile.WALL); + } +} diff --git a/src/main/java/superhb/arcademod/util/ArcadeSoundRegistry.java b/src/main/java/superhb/arcademod/util/ArcadeSoundRegistry.java index 294f79d..da7f8bd 100644 --- a/src/main/java/superhb/arcademod/util/ArcadeSoundRegistry.java +++ b/src/main/java/superhb/arcademod/util/ArcadeSoundRegistry.java @@ -15,6 +15,11 @@ public class ArcadeSoundRegistry { PACMAN_INTRO, PACMAN_GHOST, PACMAN_SIREN, PACMAN_FRIGHT, PACMAN_LIFE, PACMAN_ENERGIZER_1, PACMAN_ENERGIZER_2, PACMAN_ENERGIZER_3, PACMAN_ENERGIZER_4, PACMAN_HOME; // TODO: Add Audio + + public static SoundEvent SPACEINVADERS; + public static SoundEvent SPACEINVADERS_SHOOT; + public static SoundEvent SPACEINVADERS_EXPLODE; + public static SoundEvent SPACEINVADERS_DESTROYED; public static void registerSounds () { // General @@ -37,6 +42,10 @@ public static void registerSounds () { PACMAN_SIREN = registerSound("theme.pacman_siren"); PACMAN_FRIGHT = registerSound("theme.pacman_fright"); PACMAN_LIFE = registerSound("effect.pacman_life"); + SPACEINVADERS = registerSound("theme.spaceinvaders"); + SPACEINVADERS_SHOOT = registerSound("effect.spaceinvaders_shoot"); + SPACEINVADERS_EXPLODE = registerSound("effect.spaceinvaders_explode"); + SPACEINVADERS_DESTROYED = registerSound("effect.spaceinvaders_destroyed"); } private static SoundEvent registerSound (String name) { diff --git a/src/main/java/superhb/arcademod/util/EnumGame.java b/src/main/java/superhb/arcademod/util/EnumGame.java index f9021c3..6532631 100644 --- a/src/main/java/superhb/arcademod/util/EnumGame.java +++ b/src/main/java/superhb/arcademod/util/EnumGame.java @@ -6,7 +6,8 @@ public enum EnumGame implements IStringSerializable { SNAKE(0, "snake"), TETROMINOES(1, "tetrominoes"), PACMAN(2, "pacman"), - PONG(3, "pong"); + PONG(3, "pong"), + SPACEINVADERS(4, "spaceinvaders"); //DDR(4, "ddr"); private int id; diff --git a/src/main/resources/assets/arcademod/blockstates/arcade_machine.json b/src/main/resources/assets/arcademod/blockstates/arcade_machine.json index 9b4a424..f6e2f51 100644 --- a/src/main/resources/assets/arcademod/blockstates/arcade_machine.json +++ b/src/main/resources/assets/arcademod/blockstates/arcade_machine.json @@ -29,7 +29,10 @@ }, "pong": { "model": "arcademod:pong.obj" - } + }, + "spaceinvaders": { + "model": "arcademod:spaceinvaders.obj" + } }, "facing": { "south": { diff --git a/src/main/resources/assets/arcademod/lang/en_us.lang b/src/main/resources/assets/arcademod/lang/en_us.lang index 689a638..532b600 100644 --- a/src/main/resources/assets/arcademod/lang/en_us.lang +++ b/src/main/resources/assets/arcademod/lang/en_us.lang @@ -7,6 +7,7 @@ tile.arcademod:arcade_machine.snake.name=Arcade Machine (Snake) tile.arcademod:arcade_machine.tetrominoes.name=Arcade Machine (Tetris) tile.arcademod:arcade_machine.pacman.name=Arcade Machine (Pac-Man) tile.arcademod:arcade_machine.pong.name=Arcade Machine (Pong) +tile.arcademod:arcade_machine.spaceinvaders.name=Arcade Machine (Space Invaders) tile.arcademod:plushie.creeper.name=Creeper Plushie tile.arcademod:plushie.pig.name=Pig Plushie @@ -21,6 +22,8 @@ text.arcademod:needed.locale=coin needed text.arcademod:needed_plural.locale=coins needed text.arcademod:gameover.locale=Game Over text.arcademod:score.locale=Score +text.arcademod:topscore.locale=Top Score +text.arcademod:level.locale=Level text.arcademod:return_menu.name=Return to Menu text.arcademod:next.tetrominoes.locale=Next @@ -29,6 +32,7 @@ text.arcademod:row.tetrominoes.locale=Rows text.arcademod:level_select.tetrominoes.locale=Level Select text.arcademod:ready.pacman.locale=Ready! +text.arcademod:ready.spaceinvaders.locale=Ready! text.arcademod:left_paddle.pong.name=Left Paddle text.arcademod:right_paddle.pong.name=Right Paddle @@ -50,6 +54,7 @@ game.arcademod:snake.name=Snake game.arcademod:tetrominoes.name=Tetris game.arcademod:pacman.name=Pac-Man game.arcademod:pong.name=Pong +game.arcademod:spaceinvaders.name=Space Invaders control.arcademod:up.name=Up control.arcademod:down.name=Down @@ -58,5 +63,6 @@ control.arcademod:right.name=Right control.arcademod:select.name=Select control.arcademod:up.tetrominoes.name=Up/Rotate +control.arcademod:up.spaceinvaders.name=Shoot control.arcademod:mouse.pong.name=Use mouse to move paddle up and down \ No newline at end of file diff --git a/src/main/resources/assets/arcademod/models/block/spaceinvaders.mtl b/src/main/resources/assets/arcademod/models/block/spaceinvaders.mtl new file mode 100644 index 0000000..1e87189 --- /dev/null +++ b/src/main/resources/assets/arcademod/models/block/spaceinvaders.mtl @@ -0,0 +1,38 @@ +# Blender MTL File: 'None' +# Material Count: 4 + +newmtl Bezel +Ns 90.196078 +Ka 0.000000 0.000000 0.000000 +Kd 0.034113 0.034113 0.034113 +Ks 0.500000 0.500000 0.500000 +Ni 1.000000 +d 1.000000 +illum 2 + +newmtl Body +Ns 90.196078 +Ka 0.000000 0.000000 0.000000 +Kd 0.010445 0.044630 0.498404 +Ks 0.500000 0.500000 0.500000 +Ni 1.000000 +d 1.000000 +illum 2 + +newmtl Marquee +Ns 90.196078 +Ka 0.000000 0.000000 0.000000 +Kd 0.512000 0.512000 0.512000 +Ks 0.500000 0.500000 0.500000 +Ni 1.000000 +d 1.000000 +illum 2 + +newmtl Screen +Ns 90.196078 +Ka 0.000000 0.000000 0.000000 +Kd 0.002870 0.002870 0.002870 +Ks 0.500000 0.500000 0.500000 +Ni 1.000000 +d 1.000000 +illum 2 diff --git a/src/main/resources/assets/arcademod/models/block/spaceinvaders.obj b/src/main/resources/assets/arcademod/models/block/spaceinvaders.obj new file mode 100644 index 0000000..5239939 --- /dev/null +++ b/src/main/resources/assets/arcademod/models/block/spaceinvaders.obj @@ -0,0 +1,318 @@ +# Blender v2.75 (sub 0) OBJ File: '' +# www.blender.org +mtllib spaceinvaders.mtl +o Cube.001 +v 0.100000 0.896645 0.221640 +v 0.100000 -0.000000 0.221640 +v 0.100000 -0.000000 0.160000 +v 0.100000 0.855000 0.160000 +v 0.100000 0.900000 0.200000 +v 0.100000 1.000000 0.133340 +v 0.900000 1.000000 0.133341 +v 0.900000 0.900000 0.200000 +v 0.900001 1.929921 0.324854 +v 0.900001 1.947326 0.315003 +v 0.900001 1.932899 0.280191 +v 0.900001 1.910218 0.281747 +v 0.100000 1.366879 0.812461 +v 0.100001 1.750000 0.322521 +v 0.900001 1.750000 0.322523 +v 0.900001 1.366879 0.812462 +v 0.900000 1.000000 0.093340 +v 0.900000 0.900000 0.160000 +v 0.100000 0.900000 0.160000 +v 0.100000 1.000000 0.093340 +v 0.900000 2.000000 0.627388 +v 0.900000 1.947396 1.000000 +v 0.920343 1.947396 1.000001 +v 0.920344 2.000000 0.627388 +v 0.100000 2.000000 0.627387 +v 0.100001 1.947326 0.315002 +v 0.079658 1.947326 0.315002 +v 0.079657 2.000000 0.627387 +v 0.900001 1.750000 0.282523 +v 0.900001 1.712500 0.282523 +v 0.900000 1.980000 0.627388 +v 0.900000 1.927396 1.000000 +v 0.100000 1.980000 0.627387 +v 0.100001 1.929920 0.324853 +v 0.100001 1.712500 0.282521 +v 0.100001 1.750000 0.282521 +v 0.079657 -0.000000 0.160000 +v 0.079657 0.855000 0.160000 +v 0.920343 1.000000 0.093340 +v 0.920343 0.900000 0.160000 +v 0.079657 0.900000 0.160000 +v 0.079657 1.000000 0.093340 +v 0.920344 1.750000 0.282523 +v 0.920344 1.712500 0.282523 +v 0.079658 1.712500 0.282521 +v 0.079658 1.750000 0.282521 +v 0.100001 1.910218 0.281746 +v 0.079658 1.910218 0.281746 +v 0.900000 -0.000000 0.160000 +v 0.900000 0.855000 0.160000 +v 0.920343 0.855000 0.160000 +v 0.920343 -0.000000 0.160000 +v 0.100000 1.077804 0.173260 +v 0.079657 1.077804 0.173260 +v 0.920344 1.910218 0.281747 +v 0.900001 1.374529 0.258509 +v 0.920344 1.374529 0.258509 +v 0.920344 1.932899 0.280191 +v 0.079658 1.932899 0.280190 +v 0.100001 1.932899 0.280190 +v 0.900000 -0.000000 0.221640 +v 0.900000 0.896645 0.221640 +v 0.920344 1.947326 0.315003 +v 0.100000 1.040063 0.207499 +v 0.900000 1.192851 0.490324 +v 0.100000 1.927396 1.000000 +v 0.100000 1.947396 1.000000 +v 0.079657 1.947396 1.000000 +v 0.900000 1.040063 0.207500 +v 0.900000 1.077804 0.173261 +v 0.100000 1.192852 0.490323 +v 0.100001 1.374529 0.258508 +v 0.920343 1.077804 0.173261 +v 0.079657 1.374529 0.258508 +v 0.100000 -0.000000 0.571902 +v 0.900000 -0.000000 0.571902 +v 0.900000 -0.000000 1.000000 +v 0.100000 -0.000000 1.000000 +v 0.920344 1.929921 0.324854 +v 0.900000 1.750000 1.000000 +v 0.100000 1.750000 1.000000 +v 0.079656 -0.000000 1.000000 +v 0.079657 -0.000000 0.560000 +v 0.900000 1.000000 1.000000 +v 0.900000 0.900000 1.000000 +v 0.920343 0.900000 1.000000 +v 0.920343 1.000000 1.000000 +v 0.100000 1.000000 1.000000 +v 0.100000 0.900000 1.000000 +v 0.100000 1.712500 1.000000 +v 0.079657 1.750000 1.000000 +v 0.079657 1.712500 1.000000 +v 0.900000 0.855000 1.000000 +v 0.100000 0.855000 1.000000 +v 0.900000 1.712500 1.000000 +v 0.920343 1.712500 1.000000 +v 0.920343 1.750000 1.000000 +v 0.920343 0.900000 0.200000 +v 0.920343 0.855000 0.200000 +v 0.920343 1.927396 1.000001 +v 0.079657 0.900000 1.000000 +v 0.079657 0.855000 1.000000 +v 0.900000 1.374529 1.000000 +v 0.100000 1.374529 1.000000 +v 0.079657 1.927396 1.000000 +v 0.920343 1.750000 0.627388 +v 0.920344 1.980000 0.627388 +v 0.079657 0.855000 0.560000 +v 0.079657 1.077804 0.567358 +v 0.079657 1.000000 0.560000 +v 0.079657 1.000000 1.000000 +v 0.079657 1.077804 1.000000 +v 0.920343 0.900000 0.560000 +v 0.920343 1.000000 0.560000 +v 0.920343 0.855000 0.560000 +v 0.920343 0.855000 1.000000 +v 0.079657 0.900000 0.560000 +v 0.920343 -0.000000 0.560000 +v 0.920343 -0.000000 1.000000 +v 0.079657 1.980000 0.627387 +v 0.079657 1.750000 0.627387 +v 0.920343 1.712500 0.627388 +v 0.920343 1.374529 0.595423 +v 0.920343 1.374529 1.000000 +v 0.079657 1.712500 0.627387 +v 0.079658 1.750000 0.322521 +v 0.079658 1.929920 0.324853 +v 0.920343 -0.000000 0.200000 +v 0.079657 0.855000 0.200000 +v 0.079657 0.900000 0.200000 +v 0.920344 1.750000 0.322523 +v 0.920344 1.712500 0.322523 +v 0.900000 1.077804 1.000000 +v 0.920343 1.077804 1.000000 +v 0.079657 1.374529 1.000000 +v 0.079658 1.712500 0.322521 +v 0.079657 1.374529 0.298571 +v 0.920343 1.077804 0.213380 +v 0.920343 1.000000 0.200001 +v 0.079657 -0.000000 0.200000 +v 0.079657 1.000000 0.200000 +v 0.920344 1.374529 0.298572 +v 0.079657 1.077804 0.213379 +v 0.079657 1.374529 0.595422 +v 0.920343 1.077804 0.567359 +v 0.100000 1.077804 1.000000 +vn 0.000000 -1.000000 -0.000000 +vn -0.000000 0.990200 0.139800 +vn 1.000000 0.000000 0.000000 +vn -0.000000 -0.000000 1.000000 +vn 0.000000 -0.988200 -0.153200 +vn 0.000000 0.000000 -1.000000 +vn -1.000000 0.000000 -0.000000 +vn -0.000000 0.986600 -0.163300 +vn 0.000000 0.879800 -0.475300 +vn 0.000000 -0.554700 -0.832100 +vn 0.000000 -0.787700 -0.616000 +vn 0.000000 0.986100 -0.166300 +vn 0.000000 -0.004800 -1.000000 +vn 0.000000 0.716500 -0.697600 +vn 0.000000 0.070900 -0.997500 +vn 0.000000 -0.068400 -0.997700 +vn 0.000000 0.923800 -0.382800 +vn 0.000000 0.276100 -0.961100 +vn 0.000000 0.013000 -0.999900 +usemtl Body +s 1 +f 75//1 76//1 77//1 78//1 +f 33//2 66//2 32//2 31//2 +f 63//3 79//3 55//3 58//3 +f 80//4 32//4 66//4 81//4 +f 75//1 78//1 82//1 83//1 +f 84//4 85//4 86//4 87//4 +f 85//4 84//4 88//4 89//4 +f 1//5 5//5 8//5 62//5 +f 90//4 81//4 91//4 92//4 +f 93//4 85//4 89//4 94//4 +f 77//4 93//4 94//4 78//4 +f 80//4 95//4 96//4 97//4 +f 2//6 1//6 62//6 61//6 +f 98//3 99//3 51//3 40//3 +f 32//4 100//4 23//4 22//4 +f 95//4 80//4 81//4 90//4 +f 94//4 89//4 101//4 102//4 +f 103//4 95//4 90//4 104//4 +f 105//4 66//4 67//4 68//4 +f 106//3 107//3 100//3 97//3 +f 108//7 83//7 82//7 102//7 +f 109//7 110//7 111//7 112//7 +f 113//3 114//3 87//3 86//3 +f 115//3 113//3 86//3 116//3 +f 110//7 117//7 101//7 111//7 +f 118//3 115//3 116//3 119//3 +f 117//7 108//7 102//7 101//7 +f 120//7 121//7 91//7 105//7 +f 122//3 106//3 97//3 96//3 +f 123//3 122//3 96//3 124//3 +f 121//7 125//7 92//7 91//7 +f 89//4 88//4 111//4 101//4 +f 126//7 127//7 48//7 46//7 +f 127//7 27//7 59//7 48//7 +f 76//1 61//1 128//1 118//1 +f 93//4 77//4 119//4 116//4 +f 129//7 130//7 41//7 38//7 +f 78//4 94//4 102//4 82//4 +f 131//3 132//3 44//3 43//3 +f 133//4 84//4 87//4 134//4 +f 32//4 80//4 97//4 100//4 +f 128//1 61//1 49//1 52//1 +f 104//4 90//4 92//4 135//4 +f 81//4 66//4 105//4 91//4 +f 136//7 126//7 46//7 45//7 +f 85//4 93//4 116//4 86//4 +f 120//7 105//7 68//7 28//7 +f 107//3 79//3 63//3 24//3 +f 79//3 131//3 43//3 55//3 +f 137//7 136//7 45//7 74//7 +f 138//3 139//3 39//3 73//3 +f 140//7 129//7 38//7 37//7 +f 99//3 128//3 52//3 51//3 +f 130//7 141//7 42//7 41//7 +f 2//1 140//1 37//1 3//1 +f 139//3 98//3 40//3 39//3 +f 100//3 107//3 24//3 23//3 +f 127//7 120//7 28//7 27//7 +f 77//1 76//1 118//1 119//1 +f 126//7 136//7 125//7 121//7 +f 142//3 132//3 122//3 123//3 +f 132//3 131//3 106//3 122//3 +f 127//7 126//7 121//7 120//7 +f 130//7 129//7 108//7 117//7 +f 128//3 99//3 115//3 118//3 +f 141//7 130//7 117//7 110//7 +f 99//3 98//3 113//3 115//3 +f 98//3 139//3 114//3 113//3 +f 143//7 141//7 110//7 109//7 +f 129//7 140//7 83//7 108//7 +f 131//3 79//3 107//3 106//3 +f 2//1 75//1 83//1 140//1 +f 34//8 33//8 31//8 9//8 +f 2//1 61//1 76//1 75//1 +f 137//7 143//7 109//7 144//7 +f 139//3 138//3 145//3 114//3 +f 142//3 138//3 73//3 57//3 +f 141//7 143//7 54//7 42//7 +f 88//4 146//4 112//4 111//4 +f 103//4 133//4 134//4 124//4 +f 114//3 145//3 134//3 87//3 +f 144//7 109//7 112//7 135//7 +f 84//4 133//4 146//4 88//4 +f 125//7 144//7 135//7 92//7 +f 95//4 103//4 124//4 96//4 +f 132//3 142//3 57//3 44//3 +f 136//7 137//7 144//7 125//7 +f 138//3 142//3 123//3 145//3 +f 143//7 137//7 74//7 54//7 +f 146//4 104//4 135//4 112//4 +f 145//3 123//3 124//3 134//3 +f 133//4 103//4 104//4 146//4 +usemtl Screen +f 71//9 13//9 16//9 65//9 +f 6//9 64//9 69//9 7//9 +f 64//9 71//9 65//9 69//9 +usemtl Bezel +f 1//3 2//3 3//3 4//3 +f 5//10 6//10 7//10 8//10 +f 9//7 10//7 11//7 12//7 +f 13//11 14//11 15//11 16//11 +f 8//7 7//7 17//7 18//7 +f 6//3 5//3 19//3 20//3 +f 21//2 22//2 23//2 24//2 +f 25//12 26//12 27//12 28//12 +f 16//7 15//7 29//7 30//7 +f 31//7 32//7 22//7 21//7 +f 33//3 34//3 26//3 25//3 +f 14//3 13//3 35//3 36//3 +f 4//6 3//6 37//6 38//6 +f 18//10 17//10 39//10 40//10 +f 20//10 19//10 41//10 42//10 +f 30//6 29//6 43//6 44//6 +f 36//6 35//6 45//6 46//6 +f 47//13 36//13 46//13 48//13 +f 49//6 50//6 51//6 52//6 +f 53//14 20//14 42//14 54//14 +f 29//13 12//13 55//13 43//13 +f 56//15 30//15 44//15 57//15 +f 19//6 4//6 38//6 41//6 +f 50//6 18//6 40//6 51//6 +f 55//16 12//16 11//16 58//16 +f 47//16 48//16 59//16 60//16 +f 34//3 14//3 36//3 47//3 +f 61//7 62//7 50//7 49//7 +f 26//3 34//3 47//3 60//3 +f 10//17 63//17 58//17 11//17 +f 64//3 6//3 20//3 53//3 +f 15//7 9//7 12//7 29//7 +f 65//7 16//7 30//7 56//7 +f 27//17 26//17 60//17 59//17 +f 5//3 1//3 4//3 19//3 +f 62//7 8//7 18//7 50//7 +f 66//3 33//3 25//3 67//3 +f 9//7 31//7 21//7 10//7 +f 67//2 25//2 28//2 68//2 +f 10//12 21//12 24//12 63//12 +f 7//7 69//7 70//7 17//7 +f 71//3 64//3 53//3 72//3 +f 17//14 70//14 73//14 39//14 +f 72//18 53//18 54//18 74//18 +f 35//15 72//15 74//15 45//15 +f 13//3 71//3 72//3 35//3 +f 69//7 65//7 56//7 70//7 +f 70//18 56//18 57//18 73//18 +usemtl Marquee +f 14//19 34//19 9//19 15//19 diff --git a/src/main/resources/assets/arcademod/sounds.json b/src/main/resources/assets/arcademod/sounds.json index 62d6637..32840bf 100644 --- a/src/main/resources/assets/arcademod/sounds.json +++ b/src/main/resources/assets/arcademod/sounds.json @@ -111,5 +111,37 @@ "stream": true } ] - } + }, + "theme.spaceinvaders": { + "sounds": [ + { + "name": "arcademod:spaceinvaders/theme", + "stream": true + } + ] + }, + "effect.spaceinvaders_shoot": { + "sounds": [ + { + "name": "arcademod:spaceinvaders/shoot", + "stream": true + } + ] + }, + "effect.spaceinvaders_explode": { + "sounds": [ + { + "name": "arcademod:spaceinvaders/explode", + "stream": true + } + ] + }, + "effect.spaceinvaders_destroyed": { + "sounds": [ + { + "name": "arcademod:spaceinvaders/destroyed", + "stream": true + } + ] + } } \ No newline at end of file diff --git a/src/main/resources/assets/arcademod/sounds/spaceinvaders/destroyed.ogg b/src/main/resources/assets/arcademod/sounds/spaceinvaders/destroyed.ogg new file mode 100644 index 0000000..969284c Binary files /dev/null and b/src/main/resources/assets/arcademod/sounds/spaceinvaders/destroyed.ogg differ diff --git a/src/main/resources/assets/arcademod/sounds/spaceinvaders/explode.ogg b/src/main/resources/assets/arcademod/sounds/spaceinvaders/explode.ogg new file mode 100644 index 0000000..00d9e01 Binary files /dev/null and b/src/main/resources/assets/arcademod/sounds/spaceinvaders/explode.ogg differ diff --git a/src/main/resources/assets/arcademod/sounds/spaceinvaders/shoot.ogg b/src/main/resources/assets/arcademod/sounds/spaceinvaders/shoot.ogg new file mode 100644 index 0000000..0dce76b Binary files /dev/null and b/src/main/resources/assets/arcademod/sounds/spaceinvaders/shoot.ogg differ diff --git a/src/main/resources/assets/arcademod/sounds/spaceinvaders/theme.ogg b/src/main/resources/assets/arcademod/sounds/spaceinvaders/theme.ogg new file mode 100644 index 0000000..f6ad93a Binary files /dev/null and b/src/main/resources/assets/arcademod/sounds/spaceinvaders/theme.ogg differ diff --git a/src/main/resources/assets/arcademod/textures/gui/spaceinvaders.png b/src/main/resources/assets/arcademod/textures/gui/spaceinvaders.png new file mode 100644 index 0000000..7e5e2f4 Binary files /dev/null and b/src/main/resources/assets/arcademod/textures/gui/spaceinvaders.png differ