package me.pascoej.ajario.gui.views; import me.pascoej.ajario.AgarClient; import me.pascoej.ajario.node.Node; import me.pascoej.ajario.node.NodeType; import me.pascoej.ajario.node.PlayerNode; import me.pascoej.ajario.packet.clientbound.UpdateLeaderBoard; import me.pascoej.ajario.util.Position; import me.pascoej.ajario.util.ThreatInfo; import org.lwjgl.input.Keyboard; import org.newdawn.slick.GameContainer; import org.newdawn.slick.Graphics; import java.util.Timer; import java.util.TimerTask; /** * Created by john on 6/15/15. */ public class GameView extends View { private final AgarClient agarClient; private Position screenCenter; private double screenScale; public GameView(AgarClient agarClient) { this.agarClient = agarClient; } @Override public void render(GameContainer gameContainer, Graphics g) { int width = gameContainer.getWidth(); int height = gameContainer.getHeight(); int centerX = width / 2; int centerY = height / 2; screenScale = agarClient.getWorld().getScale() * Math.max(width / 1920.0, height / 1080.0); screenCenter = new Position(centerX, centerY); for (Node node : agarClient.getWorld().getNodes()) { Position inter = new Position(node.getX(), node.getY()); Position screenPosition = toScreenCoords(inter); float size = (float) (node.getSize() * screenScale); float diameter = size * 2; if (outOfBounds(screenPosition, width, height, size)) { continue; } float x = (float) (screenPosition.getX() - size); float y = (float) (screenPosition.getY() - size); switch (node.getNodeType()) { case FOOD: g.setColor(org.newdawn.slick.Color.white); break; case VIRUS: g.setColor(org.newdawn.slick.Color.green); break; case PLAYER: org.newdawn.slick.Color color = ThreatInfo.threatInfo(agarClient, (PlayerNode) node).getThreatLevel().getColor(); g.setColor(color); break; } g.fillOval(x, y, diameter, diameter, 35); if (node.getNodeType() == NodeType.PLAYER) { g.setColor(org.newdawn.slick.Color.lightGray); PlayerNode playerNode = (PlayerNode) node; float textX = (float) (screenPosition.getX() - (.5 * g.getFont().getWidth(playerNode.getName()))); float textY = (float) (screenPosition.getY() - 15); if (playerNode.getName() != null) { g.drawString(playerNode.getName(), textX, textY); } if (showMasses) { g.drawString("(" + playerNode.getSize() + ")", textX, textY + g.getFont().getHeight("|") + 1); } } } drawLeaderBoard(gameContainer, g); if (guide) { drawHelp(g); } } @Override public boolean shouldDraw() { return true; } private Position toWorldCoords(Position screen) { double wX = (screen.getX() - screenCenter.getX()) * screenScale + agarClient.getWorld().getCenterX(); double wY = (screen.getY() - screenCenter.getY()) * screenScale + agarClient.getWorld().getCenterY(); return new Position(wX, wY); } private Position toScreenCoords(Position world) { double sX = (world.getX() - agarClient.getWorld().getCenterX()) * screenScale + screenCenter.getX(); double sY = (world.getY() - agarClient.getWorld().getCenterY()) * screenScale + screenCenter.getY(); return new Position(sX, sY); } private void drawLeaderBoard(GameContainer gc, org.newdawn.slick.Graphics g) { UpdateLeaderBoard.LeaderboardPosition[] leaderboard = agarClient.getLeaderBoard(); int width = 150; int charHeight = g.getFont().getHeight("|") + 4; int height = charHeight * leaderboard.length + 10; org.newdawn.slick.Color bg = new org.newdawn.slick.Color(150, 150, 150, 100); int bgX = gc.getWidth() - width; g.setColor(bg); g.fillRect(bgX, 0, width, height); org.newdawn.slick.Color text = new org.newdawn.slick.Color(256, 256, 256, 125); g.setColor(text); int textX = bgX + 4; for (int i = 0; i < leaderboard.length; i++) { UpdateLeaderBoard.LeaderboardPosition leaderboardPosition = leaderboard[i]; String cellName = leaderboardPosition.getNodeName(); if (cellName.equals("")) { cellName = "Unamed: " + leaderboardPosition.getNodeId(); } String line = (i + 1) + ". " + cellName; int textY = i * charHeight; g.drawString(line, textX, textY); } } private void drawHelp(Graphics g) { org.newdawn.slick.Color bg = new org.newdawn.slick.Color(150, 150, 150, 100); org.newdawn.slick.Color text = new org.newdawn.slick.Color(256, 256, 256, 125); int charHeight = g.getFont().getHeight("|") + 4; g.setColor(bg); g.fillRoundRect(5, 5, 150, charHeight * ThreatInfo.ThreatLevel.values().length + 5, 3); ThreatInfo.ThreatLevel[] values = ThreatInfo.ThreatLevel.values(); for (int i = 0; i < values.length; i++) { ThreatInfo.ThreatLevel threatLevel = values[i]; g.setColor(threatLevel.getColor()); int boxX = 5; int textX = boxX + charHeight + 2; int y = i * charHeight + 7; g.fillRect(boxX, y, charHeight, charHeight); g.setColor(text); g.drawString(threatLevel.toString(), textX, y); } } private boolean outOfBounds(Position screenPos, int maxWidth, int maxHeight, float size) { double x = screenPos.getX(); double y = screenPos.getY(); return x < -size || y < -size || x > maxWidth + size || y > maxHeight + size; } private boolean guide = false; public void toggleGuide() { guide = !guide; } private boolean showMasses = true; public void toggleMasses() { showMasses = !showMasses; } @Override public void keyPressed(int key, char c) { if (key == Keyboard.KEY_SPACE) { agarClient.split(); } else if (key == Keyboard.KEY_W) { agarClient.ejectMass(); } else if (key == Keyboard.KEY_Q) { Timer timer = new Timer(); final int[] i = {7}; timer.schedule(new TimerTask() { @Override public void run() { agarClient.update(); agarClient.ejectMass(); i[0] -= 1; if (i[0] <= 0) { this.cancel(); } } }, 50, 50); } else if (key == Keyboard.KEY_P) { agarClient.joinGame(); } if (agarClient.isDead() && key == Keyboard.KEY_SPACE) { agarClient.joinGame(); } } @Override public void mouseMoved(int i, int i1, int x, int y) { Position gamePos = toWorldCoords(new Position(x, y)); agarClient.setMousePosition(gamePos.getX(), gamePos.getY()); } @Override public boolean isAcceptingInput() { return true; } }