From dd537f19f89973040b7b0d1e64970580f2ef387e Mon Sep 17 00:00:00 2001 From: David Date: Thu, 11 Mar 2021 18:02:49 -0600 Subject: [PATCH] Made use of team colors for selection screen --- .../benberi/cadesim/BlockadeSimulator.java | 7 + .../src/com/benberi/cadesim/GameContext.java | 57 ++++-- .../cadesim/client/ClientConnectionTask.java | 1 - .../cadesim/game/screen/LoadingScreen.java | 2 +- .../cadesim/game/screen/LoginScreen.java | 180 ++++++------------ .../cadesim/game/screen/MapEditorScreen.java | 13 +- .../cadesim/game/screen/SeaBattleScreen.java | 6 +- .../cadesim/game/screen/SelectionScreen.java | 74 +++++-- .../screen/component/GameInformation.java | 65 ++++++- .../impl/connect/ResolutionTypeLabel.java | 60 ------ .../screen/impl/connect/RoomNumberLabel.java | 23 --- .../com/benberi/cadesim/util/ShapeArc.java | 36 ++++ .../src/com/benberi/cadesim/util/Team.java | 31 ++- .../cadesim/util/TextureCollection.java | 34 ++++ client-launcher/gclogo128.png | Bin 0 -> 24185 bytes .../cadesim/desktop/DesktopLauncher.java | 4 + .../benberi/cadesim/desktop/SplashScreen.java | 26 +++ client-launcher/user.config | 7 +- 18 files changed, 360 insertions(+), 266 deletions(-) delete mode 100644 client-core/src/com/benberi/cadesim/game/screen/impl/connect/ResolutionTypeLabel.java delete mode 100644 client-core/src/com/benberi/cadesim/game/screen/impl/connect/RoomNumberLabel.java create mode 100644 client-core/src/com/benberi/cadesim/util/ShapeArc.java create mode 100644 client-launcher/gclogo128.png create mode 100644 client-launcher/src/com/benberi/cadesim/desktop/SplashScreen.java diff --git a/client-core/src/com/benberi/cadesim/BlockadeSimulator.java b/client-core/src/com/benberi/cadesim/BlockadeSimulator.java index 1e799f7..1bcdc4f 100644 --- a/client-core/src/com/benberi/cadesim/BlockadeSimulator.java +++ b/client-core/src/com/benberi/cadesim/BlockadeSimulator.java @@ -1,7 +1,11 @@ package com.benberi.cadesim; +import java.awt.Window; +import java.util.Arrays; import java.util.Timer; +import javax.swing.JWindow; + import com.badlogic.gdx.Game; import com.badlogic.gdx.Gdx; import com.benberi.cadesim.util.ScreenEnum; @@ -17,6 +21,9 @@ public class BlockadeSimulator extends Game{ @Override public void create () { + Arrays.asList(Window.getWindows()).stream() + .filter(window -> window instanceof JWindow) + .forEach(window -> window.setVisible(false)); VisUI.setSkipGdxVersionCheck(true); VisUI.load(); context = new GameContext(this); diff --git a/client-core/src/com/benberi/cadesim/GameContext.java b/client-core/src/com/benberi/cadesim/GameContext.java index 9cdf155..b987ac5 100644 --- a/client-core/src/com/benberi/cadesim/GameContext.java +++ b/client-core/src/com/benberi/cadesim/GameContext.java @@ -100,8 +100,7 @@ public void setTurnDuration(int value) { public List admins; public Map serverInfo = new HashMap(); public String currentServerRoom = ""; - public String userName; - public String accountName; + public String accountName = ""; public String hostURL; public int myVesselType; public Team myTeam; @@ -355,7 +354,6 @@ public void sendLoginPacket(String accountName, String display, int ship, int te packet.setName(display); packet.setShip(ship); packet.setTeam(team); - System.out.println("Login:" + display); sendPacket(packet); shipId = ship; } @@ -452,14 +450,37 @@ public String handleLoginResponse(int response) { case LoginResponsePacket.BAD_VERSION: return "Outdated client."; case LoginResponsePacket.NAME_IN_USE: + Gdx.app.postRunnable(new Runnable() { + @Override + public void run() { + ScreenManager.getInstance().showScreen(ScreenEnum.SELECTION, context); + } + + }); return "Display name already in use."; case LoginResponsePacket.BAD_SHIP: + Gdx.app.postRunnable(new Runnable() { + @Override + public void run() { + ScreenManager.getInstance().showScreen(ScreenEnum.SELECTION, context); + } + + }); return "The selected ship is not allowed."; case LoginResponsePacket.SERVER_FULL: + ScreenManager.getInstance().showScreen(ScreenEnum.LOGIN, context); return "The server is full."; case LoginResponsePacket.BAD_NAME: + Gdx.app.postRunnable(new Runnable() { + @Override + public void run() { + ScreenManager.getInstance().showScreen(ScreenEnum.SELECTION, context); + } + + }); return "That ship name is not allowed."; default: + ScreenManager.getInstance().showScreen(ScreenEnum.LOGIN, context); return "Unknown login failure."; } @@ -602,7 +623,7 @@ public void disconnect() { setConnected(false); setIsInLobby(true); getServerChannel().disconnect(); - ScreenManager.getInstance().showScreen(ScreenEnum.LOGIN, this); + ScreenManager.getInstance().showScreen(ScreenEnum.SELECTION, this); Gdx.graphics.setTitle("GC:" + Constants.VERSION); System.out.println("Client disconnected."); getLobbyScreen().setStatusMessage("Client: " + "Client Disconnected."); @@ -641,16 +662,16 @@ public void handleServersideDisconnect() { getServerChannel().disconnect(); getLobbyScreen().setStatusMessage("Server: " + "Server Disconnected."); } - - Gdx.app.postRunnable(new Runnable() { - @Override - public void run() { - ScreenManager.getInstance().showScreen(ScreenEnum.LOGIN, context); - graphics.setResizable(true); - getLobbyScreen().setStatusMessage("Server: " + "Server Disconnected."); - graphics.setTitle("GC: v" + Constants.VERSION); - } - }); +// +// Gdx.app.postRunnable(new Runnable() { +// @Override +// public void run() { +// ScreenManager.getInstance().showScreen(ScreenEnum.LOGIN, context); +// graphics.setResizable(true); +// getLobbyScreen().setStatusMessage("Server: " + "Server Disconnected."); +// graphics.setTitle("GC: v" + Constants.VERSION); +// } +// }); } public GameAssetManager getAssetObject() { @@ -814,12 +835,12 @@ public int getTeam() { return this.myTeam.getID(); } - public void setUserName(String name) { - userName = name; + public void setVesselName(String name) { + myVessel = name; } - public String getUserName() { - return userName; + public String getVesselName() { + return myVessel; } public void setAccountName(String name) { diff --git a/client-core/src/com/benberi/cadesim/client/ClientConnectionTask.java b/client-core/src/com/benberi/cadesim/client/ClientConnectionTask.java index 25b3be5..c102df5 100644 --- a/client-core/src/com/benberi/cadesim/client/ClientConnectionTask.java +++ b/client-core/src/com/benberi/cadesim/client/ClientConnectionTask.java @@ -56,7 +56,6 @@ protected void initChannel(SocketChannel socketChannel) throws Exception { } }); ChannelFuture future = connect(ip,Constants.PROTOCOL_PORT); - System.out.println(Constants.PROTOCOL_PORT); future.addListener(new ChannelFutureListener() { @Override public void operationComplete(ChannelFuture future) throws Exception{ if(!future.isSuccess()) { diff --git a/client-core/src/com/benberi/cadesim/game/screen/LoadingScreen.java b/client-core/src/com/benberi/cadesim/game/screen/LoadingScreen.java index 9315bf9..e7cca93 100644 --- a/client-core/src/com/benberi/cadesim/game/screen/LoadingScreen.java +++ b/client-core/src/com/benberi/cadesim/game/screen/LoadingScreen.java @@ -144,7 +144,7 @@ public void render(float delta) { if (connectTask != null && connectTask.isDone() && context.getManager().update() && !isConnected) { isConnected = true; try { - context.connect(context.getAccountName(), context.getUserName(), context.getHostURL(), context.getVesselType(), context.getTeam()); + context.connect(context.getAccountName(), context.getVesselName(), context.getHostURL(), context.getVesselType(), context.getTeam()); } catch (UnknownHostException e) { e.printStackTrace(); } diff --git a/client-core/src/com/benberi/cadesim/game/screen/LoginScreen.java b/client-core/src/com/benberi/cadesim/game/screen/LoginScreen.java index a01714b..e74c254 100644 --- a/client-core/src/com/benberi/cadesim/game/screen/LoginScreen.java +++ b/client-core/src/com/benberi/cadesim/game/screen/LoginScreen.java @@ -7,9 +7,7 @@ import java.nio.file.Files; import java.nio.file.Paths; import java.util.ArrayList; -import java.util.HashMap; import java.util.Properties; -import java.util.Random; import org.apache.commons.io.IOUtils; import com.badlogic.gdx.Gdx; @@ -45,22 +43,12 @@ public class LoginScreen extends AbstractScreen implements InputProcessor { private GameContext context; final Graphics graphics = Gdx.graphics; -// private long popupTimestamp; - - /** - * Batch for opening screen - */ - - private BitmapFont font; private BitmapFont titleFont; private BitmapFont notesFont; // connectscene private ArrayList greetings = new ArrayList(); - private ArrayList port_numbers = new ArrayList(); - private ArrayList server_codes = new ArrayList(); - private ArrayList room_names = new ArrayList(); private java.util.Random prng = new java.util.Random(System.currentTimeMillis()); private String chosenGreeting; private final String CODE_URL = "https://github.com/plaza-in-a-heatwave/Cadesim/issues"; @@ -103,7 +91,6 @@ public class LoginScreen extends AbstractScreen implements InputProcessor { public int screenWidth; public int screenHeight; - private Random random = new Random(); private String[] url = null; private AsyncExecutor executor = new AsyncExecutor(4); private AsyncResult task; @@ -116,9 +103,6 @@ public LoginScreen(GameContext context) { public void buildStage() { context.setLobbyScreen(this); - port_numbers.clear(); - room_names.clear(); - server_codes.clear(); greetings.clear(); mapEditorButtonStyle = new ImageButtonStyle(); guestButtonStyle = new ImageButtonStyle(); @@ -131,11 +115,12 @@ public void buildStage() { mapEditorButtonStyle.imageUp = mapEditorDrawable; mapEditorButtonStyle.imageDown = mapEditorDisabledDrawable; mapEditorButtonStyle.imageOver = mapEditorDisabledDrawable; + mapEditorButtonStyle.imageDisabled = mapEditorDisabledDrawable; guestButtonStyle.imageUp = guestDrawable; guestButtonStyle.imageDown = guestDisabledDrawable; guestButtonStyle.imageOver = guestDisabledDrawable; - + guestButtonStyle.imageDisabled = guestDisabledDrawable; //login button Skin altskin = new Skin(Gdx.files.internal("skin/glassy/glassy-ui.json")); loginButton = new TextButton("LOGON", altskin); @@ -198,46 +183,6 @@ public Color toRGB(int r, int g, int b) { return new Color(RED, GREEN, BLUE, 1); } - @Override - public void render(float delta) { - Gdx.gl.glClearColor(37f/255f, 37f/255f, 38/255f, 1f); - Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT | GL20.GL_DEPTH_BUFFER_BIT); - //enable login click if disabled - if(!loginButton.isTouchable()) { - loginButton.setTouchable(Touchable.enabled); - } - - if(task != null && task.isDone() && isStartup && context.getManager().update()) { - isStartup = false; - buttonGuest.setDisabled(false); - buttonMapEditor.setDisabled(false); - } - stage.getBatch().setColor(Color.WHITE); - stage.getBatch().begin(); - stage.getBatch().draw(clientlogo, Gdx.graphics.getWidth()/2 - clientlogo.getWidth()/2, MAIN_GROUP_OFFSET_Y + 432, 128, 128); - stage.getBatch().end(); - stage.getBatch().begin(); - titleFont.setColor(toRGB(240,137,13)); - titleFont.draw(stage.getBatch(), "Global CadeSim", Gdx.graphics.getWidth()/2 - 230, MAIN_GROUP_OFFSET_Y + 420); - notesFont.draw(stage.getBatch(), chosenGreeting, Gdx.graphics.getWidth()/2 + 130, MAIN_GROUP_OFFSET_Y + 399); - notesFont.draw(stage.getBatch(), "Version " + Constants.VERSION + " by Cyclist & Fatigue, based on the Cadesim by Benberi", 15, 75); - notesFont.draw(stage.getBatch(), "Inspired by the original Dachimpy Cadesim", 15, 50); - notesFont.draw(stage.getBatch(), "Found a bug? Let us know!", 15, 25); - - if (codeURL) { notesFont.setColor(Color.SKY); } - notesFont.draw(stage.getBatch(), CODE_URL, 138, 25); - notesFont.setColor(Color.WHITE); - - font.setColor(Color.ORANGE); - font.draw(stage.getBatch(), "Account:", Gdx.graphics.getWidth()/2 - 180, MAIN_GROUP_OFFSET_Y + 355); - font.draw(stage.getBatch(), "Password:", Gdx.graphics.getWidth()/2 - 190, MAIN_GROUP_OFFSET_Y + 320); - font.draw(stage.getBatch(), "Server:", Gdx.graphics.getWidth()/2 - 170, MAIN_GROUP_OFFSET_Y + 270); - stage.getBatch().end(); - - stage.act(); - stage.draw(); - } - /* * Greeting list for startup screen */ @@ -313,10 +258,9 @@ public void fillSelectBoxes() { * Initialize properties such as team info/resolution, etc. */ public void fillInfo() { - if(Constants.USERPROPERTIES.get("user.username") == null) { - accountName = new TextField("User"+Integer.toString(random.nextInt(9999)), skin); - }else { - accountName = new TextField(Constants.USERPROPERTIES.get("user.username"), skin); + accountName = new TextField("", skin); + if(Constants.USERPROPERTIES.get("user.accountname") != null) { + accountName.setText(Constants.USERPROPERTIES.get("user.accountname")); } password = new TextField(Constants.SERVER_CODE, skin); @@ -340,21 +284,23 @@ public void changed (ChangeEvent event, Actor actor) { } } }); - buttonGuest.addListener(new ClickListener() {//runs update if there is one before logging in - public void clicked(InputEvent event, float x, float y){ + buttonGuest.addListener(new ChangeListener() {//runs update if there is one before logging in + @Override + public void changed(ChangeEvent event, Actor actor) { context.setServerRoom(roomLabel.getSelected()); Gdx.app.postRunnable(new Runnable() { @Override public void run() { stage.clear(); + context.setAccountName(""); ScreenManager.getInstance().showScreen(ScreenEnum.SELECTION, context); graphics.setResizable(false); } }); - } + } }); - buttonMapEditor.addListener(new ClickListener() {//runs update if there is one before logging in - public void clicked(InputEvent event, float x, float y){ + buttonMapEditor.addListener(new ChangeListener() {//runs update if there is one before logging in + public void changed(ChangeEvent event, Actor actor) { Gdx.app.postRunnable(new Runnable() { @Override public void run() { @@ -418,12 +364,6 @@ public void setActorPositions(int width) { password.setPosition(width/2 - password.getWidth()/2, MAIN_GROUP_OFFSET_Y + 295); passwordMode.setPosition(width/2 + 120, MAIN_GROUP_OFFSET_Y + 295); } - - @Override - public void dispose() { - super.dispose(); - renderer.dispose(); - } @Override public boolean keyDown(int keycode) { @@ -570,7 +510,7 @@ public void updateProperties() { prop.load(new FileInputStream("user.config")); prop.setProperty("user.width", Integer.toString(Gdx.graphics.getWidth())); prop.setProperty("user.height", Integer.toString(Gdx.graphics.getHeight())); - prop.setProperty("user.username", accountName.getText()); + prop.setProperty("user.accountname", accountName.getText()); prop.setProperty("user.last_room_index", Integer.toString(roomLabel.getSelectedIndex())); prop.store(new FileOutputStream("user.config"),null); }catch (FileNotFoundException e) { @@ -578,7 +518,7 @@ public void updateProperties() { prop.setProperty("user.width", Integer.toString(Gdx.graphics.getWidth())); prop.setProperty("user.height", Integer.toString(Gdx.graphics.getHeight())); - prop.setProperty("user.username", accountName.getText()); + prop.setProperty("user.accountname", accountName.getText()); prop.setProperty("user.last_room_index", Integer.toString(roomLabel.getSelectedIndex())); try { @@ -590,52 +530,6 @@ public void updateProperties() { e.printStackTrace(); } } - - public HashMap getUserProperties(){ - Properties prop =new Properties(); - try { - prop.load(new FileInputStream("user.config")); - return new HashMap (){ - private static final long serialVersionUID = 1L; - { - put("user.username", prop.getProperty("user.username")); - put("user.last_room_index", prop.getProperty("user.last_room_index")); - put("user.last_team", prop.getProperty("user.last_team")); - put("user.width", prop.getProperty("user.width")); - put("user.height", prop.getProperty("user.height")); - put("user.volume", prop.getProperty("user.volume")); - put("autoupdate", prop.getProperty("autoupdate")); - put("url", prop.getProperty("url")); - }}; - }catch (FileNotFoundException e) { - return new HashMap (){ - private static final long serialVersionUID = 1L; - { - put("user.username", "User"+Integer.toString(random.nextInt(9999))); - put("user.last_room_index", "0"); - put("user.last_team", "0"); - put("user.width", "800"); - put("user.height", "600"); - put("user.volume", "0.15"); - put("autoupdate", "yes"); - put("url", prop.getProperty("url")); - }}; - } catch (IOException e) { - return new HashMap (){ - private static final long serialVersionUID = 1L; - { - put("user.username", "User"+Integer.toString(random.nextInt(9999))); - put("user.last_room_index", "0"); - put("user.last_team", "0"); - put("user.width", "800"); - put("user.height", "600"); - put("user.last_ship", "11"); - put("user.volume", "0.15"); - put("autoupdate", "yes"); - put("url", prop.getProperty("url")); - }}; - } - } public boolean isMouseOverCodeUrl(float x, float y) { @@ -677,6 +571,52 @@ public void setScreenRect (int width, int height){ screenHeight = height; } + @Override + public void render(float delta) { + Gdx.gl.glClearColor(37f/255f, 37f/255f, 38/255f, 1f); + Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT | GL20.GL_DEPTH_BUFFER_BIT); + //enable login click if disabled + if(!loginButton.isTouchable()) { + loginButton.setTouchable(Touchable.enabled); + } + + if(task != null && task.isDone() && isStartup && context.getManager().update()) { + isStartup = false; + buttonGuest.setDisabled(false); + buttonMapEditor.setDisabled(false); + } + stage.getBatch().setColor(Color.WHITE); + stage.getBatch().begin(); + stage.getBatch().draw(clientlogo, Gdx.graphics.getWidth()/2 - clientlogo.getWidth()/2, MAIN_GROUP_OFFSET_Y + 432, 128, 128); + stage.getBatch().end(); + stage.getBatch().begin(); + titleFont.setColor(toRGB(240,137,13)); + titleFont.draw(stage.getBatch(), "Global CadeSim", Gdx.graphics.getWidth()/2 - 230, MAIN_GROUP_OFFSET_Y + 420); + notesFont.draw(stage.getBatch(), chosenGreeting, Gdx.graphics.getWidth()/2 + 130, MAIN_GROUP_OFFSET_Y + 399); + notesFont.draw(stage.getBatch(), "Version " + Constants.VERSION + " by Cyclist & Fatigue, based on the Cadesim by Benberi", 15, 75); + notesFont.draw(stage.getBatch(), "Inspired by the original Dachimpy Cadesim", 15, 50); + notesFont.draw(stage.getBatch(), "Found a bug? Let us know!", 15, 25); + + if (codeURL) { notesFont.setColor(Color.SKY); } + notesFont.draw(stage.getBatch(), CODE_URL, 138, 25); + notesFont.setColor(Color.WHITE); + + font.setColor(Color.ORANGE); + font.draw(stage.getBatch(), "Account:", Gdx.graphics.getWidth()/2 - 180, MAIN_GROUP_OFFSET_Y + 355); + font.draw(stage.getBatch(), "Password:", Gdx.graphics.getWidth()/2 - 190, MAIN_GROUP_OFFSET_Y + 320); + font.draw(stage.getBatch(), "Server:", Gdx.graphics.getWidth()/2 - 170, MAIN_GROUP_OFFSET_Y + 270); + stage.getBatch().end(); + + stage.act(); + stage.draw(); + } + + @Override + public void dispose() { + super.dispose(); + renderer.dispose(); + } + @Override public void resize (int width, int height) { super.resize(width, height); diff --git a/client-core/src/com/benberi/cadesim/game/screen/MapEditorScreen.java b/client-core/src/com/benberi/cadesim/game/screen/MapEditorScreen.java index 6b5ca2e..3901f2f 100644 --- a/client-core/src/com/benberi/cadesim/game/screen/MapEditorScreen.java +++ b/client-core/src/com/benberi/cadesim/game/screen/MapEditorScreen.java @@ -46,14 +46,7 @@ import com.kotcrab.vis.ui.widget.file.FileTypeFilter; public class MapEditorScreen extends AbstractScreen implements InputProcessor { - /** - * The main game context - */ - - /** - * The shape renderer - */ - + private TextButton loadButton; private TextButton helpButton; private TextButton saveButton; @@ -1031,7 +1024,7 @@ public void initButtons() { private void drawBackground() { Gdx.gl.glEnable(GL20.GL_BLEND); renderer.begin(ShapeRenderer.ShapeType.Filled); - renderer.setColor(new Color(128 / 255f, 128 / 255f, 128 / 255f, 0.7f)); + renderer.setColor(new Color(38 / 255f, 38 / 255f, 38 / 255f, 1f)); renderer.rect(Gdx.graphics.getWidth()-175, 0, Gdx.graphics.getWidth(), Gdx.graphics.getHeight()); renderer.setColor(new Color(72 / 255f, 72 / 255f, 72 / 255f, 1)); @@ -1040,7 +1033,7 @@ private void drawBackground() { renderer.setColor(new Color(135 / 255f, 161 / 255f, 188 / 255f, 1)); renderer.rect(Gdx.graphics.getWidth()-173, 0, 1, Gdx.graphics.getHeight()); - renderer.setColor(new Color(68 / 255f, 101 / 255f, 136 / 255f, 1)); + renderer.setColor(new Color(135 / 255f, 135 / 255f, 135 / 255f, 1)); renderer.rect(Gdx.graphics.getWidth()-171, 0, 1, Gdx.graphics.getHeight()); renderer.end(); Gdx.gl.glDisable(GL20.GL_BLEND); diff --git a/client-core/src/com/benberi/cadesim/game/screen/SeaBattleScreen.java b/client-core/src/com/benberi/cadesim/game/screen/SeaBattleScreen.java index 1b6ab83..bf622c6 100644 --- a/client-core/src/com/benberi/cadesim/game/screen/SeaBattleScreen.java +++ b/client-core/src/com/benberi/cadesim/game/screen/SeaBattleScreen.java @@ -727,7 +727,7 @@ private void renderEntities() { // render move bar int BAR_HEIGHT_ABOVE_SHIP = 15; // px - int BAR_HEIGHT = 7; + int BAR_HEIGHT = 8; renderer.begin(ShapeRenderer.ShapeType.Line); float x = getIsometricX(vessel.getX(), vessel.getY(), vessel); float y = getIsometricY(vessel.getX(), vessel.getY(), vessel); @@ -754,12 +754,12 @@ private void renderEntities() { fill = fill > 3? 3:fill; // cap at 3 if large ship w = (width) / 3; } - renderer.rect(x + (vessel.getRegionWidth() / 2) - (width / 2), y + vessel.getRegionHeight() + BAR_HEIGHT_ABOVE_SHIP, fill * w, BAR_HEIGHT - 1); + renderer.rect(x + (vessel.getRegionWidth() / 2) - (width / 2), y + 1 + vessel.getRegionHeight() + BAR_HEIGHT_ABOVE_SHIP, fill * w, BAR_HEIGHT - 1); // draw red fill extension if large ship if (vessel.getMoveType() == VesselMoveType.THREE_MOVES && vessel.getNumberOfMoves() > 3) { renderer.setColor(Color.RED); - renderer.rect(x + (vessel.getRegionWidth() / 2) - (width / 2) + (3*w), y + vessel.getRegionHeight() + BAR_HEIGHT_ABOVE_SHIP, w, BAR_HEIGHT - 1); + renderer.rect(x + (vessel.getRegionWidth() / 2) - (width / 2) + (3*w), y + 1 + vessel.getRegionHeight() + BAR_HEIGHT_ABOVE_SHIP, w, BAR_HEIGHT - 1); } renderer.end(); diff --git a/client-core/src/com/benberi/cadesim/game/screen/SelectionScreen.java b/client-core/src/com/benberi/cadesim/game/screen/SelectionScreen.java index 911afae..d480c07 100644 --- a/client-core/src/com/benberi/cadesim/game/screen/SelectionScreen.java +++ b/client-core/src/com/benberi/cadesim/game/screen/SelectionScreen.java @@ -24,7 +24,9 @@ import com.benberi.cadesim.util.ScreenEnum; import com.benberi.cadesim.util.ScreenManager; import com.benberi.cadesim.util.ShipSelection; +import com.benberi.cadesim.util.Team; import com.benberi.cadesim.util.TeamSelection; +import com.benberi.cadesim.util.TextureCollection; import com.benberi.cadesim.util.UtilMethods; public class SelectionScreen extends AbstractScreen implements InputProcessor { @@ -53,6 +55,8 @@ public class SelectionScreen extends AbstractScreen implements InputProcessor { private Label incorrectNameLabel; private Label shipLabel; private Label teamLabel; + private Label shipTextLabel; + private Label teamTextLabel; private ShipSelection ship; private TeamSelection team; @@ -62,6 +66,8 @@ public class SelectionScreen extends AbstractScreen implements InputProcessor { private TextButton prevTeamButton; private TextButton nextTeamButton; + private Image shipImage; + public SelectionScreen(GameContext context) { super(); this.context = context; @@ -78,10 +84,14 @@ public void buildStage() { prevTeamButton = new TextButton("<<<", skin); nextTeamButton = new TextButton(">>>", skin); shipNameLabel = new Label("Ship Name:", skin); + shipNameLabel.setColor(Color.ORANGE); incorrectNameLabel = new Label("", skin); shipName = new TextField("",skin); + if (Constants.USERPROPERTIES.get("user.username") != null) shipName.setText(Constants.USERPROPERTIES.get("user.username")); shipLabel = new Label("Ship Type:", skin); + shipLabel.setColor(Color.ORANGE); teamLabel = new Label("Team:", skin); + teamLabel.setColor(Color.ORANGE); initTextures(); //login button Skin altskin = new Skin(Gdx.files.internal("skin/glassy/glassy-ui.json")); @@ -90,14 +100,19 @@ public void buildStage() { selectionTable = new Table(); selectionTable.add(prevButton).padRight(30).width(40).height(20); cell = selectionTable.add().width(100).height(90); - cell.setActor(new Image(ship.getCurrentShip())); + shipImage = new Image(TextureCollection.prepareAltTextureForTeam(ship.getCurrentShip(), Team.forId(team.getCurrentTeamAsInt()))); + cell.setActor(shipImage); selectionTable.add(nextButton).width(40).height(20).padLeft(30).row(); shipCell = selectionTable.add().colspan(3).padBottom(20f); - shipCell.setActor(new Label(ship.getCurrentShipLabel(), skin)); selectionTable.row(); selectionTable.add(prevTeamButton).width(40).height(20); teamCell = selectionTable.add().width(70).padLeft(10).padRight(10); - teamCell.setActor(new Label(team.getCurrentTeam(), skin)); + teamTextLabel = new Label(team.getCurrentTeam(), skin); + teamCell.setActor(teamTextLabel); + teamTextLabel.setColor(Team.forString(teamTextLabel.getText().toString()).getAltColor()); + shipTextLabel = new Label(ship.getCurrentShipLabel(), skin); + shipCell.setActor(shipTextLabel); + shipTextLabel.setColor(Team.forString(teamTextLabel.getText().toString()).getAltColor()); selectionTable.add(nextTeamButton).width(40).height(20); addStage(); selectionTable.pack(); @@ -106,8 +121,6 @@ public void buildStage() { multiplexer.addProcessor(this); multiplexer.addProcessor(stage); Gdx.input.setInputProcessor(multiplexer); - - } public void addStage() { @@ -169,7 +182,6 @@ public void fillInfo() { public void initListeners() { shipName.setMaxLength(15); shipName.setTextFieldFilter(new TextField.TextFieldFilter() { - @Override public boolean acceptChar(TextField textField, char c) { if (Character.toString(c).matches("^[a-zA-Z0-9]")) { @@ -177,12 +189,12 @@ public boolean acceptChar(TextField textField, char c) { } return false; } - }); shipName.setTextFieldListener(new TextField.TextFieldListener() { @Override public void keyTyped(TextField textField, char key) { if(textField.getText().toLowerCase().contains("fatigue")) { + incorrectNameLabel.setColor(Color.YELLOW); incorrectNameLabel.setText("Reserved name; please choose another."); incorrectNameLabel.setPosition(Gdx.graphics.getWidth()/2-120, 380); }else{ @@ -195,7 +207,13 @@ public void clicked(InputEvent event, float x, float y){ Gdx.app.postRunnable(new Runnable() { @Override public void run() { - context.setUserName(shipName.getText()); + if (shipName.getText().equals("") || shipName.getText().toString().equals("")) { + incorrectNameLabel.setColor(Color.YELLOW); + incorrectNameLabel.setText("Please enter a ship name."); + incorrectNameLabel.setPosition(Gdx.graphics.getWidth()/2-120, 380); + return; + } + context.setVesselName(shipName.getText()); context.setHostURL("localhost"); context.setVesselType(ship.getCurrentShipAsInt()); context.setTeam(team.getCurrentTeamAsInt()); @@ -228,8 +246,12 @@ public void clicked(InputEvent event, float x, float y){ Gdx.app.postRunnable(new Runnable() { @Override public void run() { - cell.setActor(new Image(ship.getNextShip())); - shipCell.setActor(new Label(ship.getNextShipLabel(), skin)); + ship.getNextShip(); + shipTextLabel = new Label(ship.getNextShipLabel(), skin); + shipTextLabel.setColor(Team.forString(teamTextLabel.getText().toString()).getAltColor()); + shipCell.setActor(shipTextLabel); + shipImage = new Image(TextureCollection.prepareAltTextureForTeam(ship.getCurrentShip(), Team.forId(team.getCurrentTeamAsInt()))); + cell.setActor(shipImage); } }); } @@ -239,8 +261,12 @@ public void clicked(InputEvent event, float x, float y){ Gdx.app.postRunnable(new Runnable() { @Override public void run() { - cell.setActor(new Image(ship.getPreviousShip())); - shipCell.setActor(new Label(ship.getPreviousShipLabel(), skin)); + ship.getPreviousShip(); + shipTextLabel = new Label(ship.getPreviousShipLabel(), skin); + shipTextLabel.setColor(Team.forString(teamTextLabel.getText().toString()).getAltColor()); + shipCell.setActor(shipTextLabel); + shipImage = new Image(TextureCollection.prepareAltTextureForTeam(ship.getCurrentShip(), Team.forId(team.getCurrentTeamAsInt()))); + cell.setActor(shipImage); } }); } @@ -251,7 +277,14 @@ public void clicked(InputEvent event, float x, float y){ Gdx.app.postRunnable(new Runnable() { @Override public void run() { - teamCell.setActor(new Label(team.getPreviousTeam(), skin)); + teamTextLabel = new Label(team.getPreviousTeam(), skin); + teamCell.setActor(teamTextLabel); + teamTextLabel.setColor(Team.forString(teamTextLabel.getText().toString()).getAltColor()); + shipTextLabel = new Label(ship.getPreviousShipLabel(), skin); + shipTextLabel.setColor(Team.forString(teamTextLabel.getText().toString()).getAltColor()); + shipCell.setActor(shipTextLabel); + shipImage = new Image(TextureCollection.prepareAltTextureForTeam(ship.getCurrentShip(), Team.forId(team.getCurrentTeamAsInt()))); + cell.setActor(shipImage); } }); } @@ -262,7 +295,14 @@ public void clicked(InputEvent event, float x, float y){ Gdx.app.postRunnable(new Runnable() { @Override public void run() { - teamCell.setActor(new Label(team.getNextTeam(), skin)); + teamTextLabel = new Label(team.getNextTeam(), skin); + teamCell.setActor(teamTextLabel); + teamTextLabel.setColor(Team.forString(teamTextLabel.getText().toString()).getAltColor()); + shipTextLabel = new Label(ship.getPreviousShipLabel(), skin); + shipTextLabel.setColor(Team.forString(teamTextLabel.getText().toString()).getAltColor()); + shipCell.setActor(shipTextLabel); + shipImage = new Image(TextureCollection.prepareAltTextureForTeam(ship.getCurrentShip(), Team.forId(team.getCurrentTeamAsInt()))); + cell.setActor(shipImage); } }); } @@ -307,7 +347,6 @@ public boolean keyDown(int keycode) { @Override public boolean keyUp(int keycode) { - return false; } @@ -379,11 +418,6 @@ public boolean mouseMoved(int screenX, int screenY) { @Override public boolean scrolled(float amountX, float amountY) { return false; - } - - public void loginFailed() { -// setPopupMessage("Could not connect to server."); -// showPopup(); } public String getOld_Name() { diff --git a/client-core/src/com/benberi/cadesim/game/screen/component/GameInformation.java b/client-core/src/com/benberi/cadesim/game/screen/component/GameInformation.java index 1531aa8..4a45547 100644 --- a/client-core/src/com/benberi/cadesim/game/screen/component/GameInformation.java +++ b/client-core/src/com/benberi/cadesim/game/screen/component/GameInformation.java @@ -1,11 +1,14 @@ package com.benberi.cadesim.game.screen.component; import com.badlogic.gdx.graphics.Color; +import com.badlogic.gdx.graphics.Pixmap; import com.badlogic.gdx.graphics.Texture; import com.badlogic.gdx.graphics.g2d.BitmapFont; import com.badlogic.gdx.graphics.g2d.TextureRegion; +import com.badlogic.gdx.graphics.glutils.ShapeRenderer.ShapeType; import com.benberi.cadesim.GameContext; import com.benberi.cadesim.game.screen.SeaBattleScreen; +import com.benberi.cadesim.util.ShapeArc; import com.benberi.cadesim.util.Team; public class GameInformation extends SeaBattleScreen{ @@ -41,7 +44,8 @@ public class GameInformation extends SeaBattleScreen{ // are we defender or attacker? boolean areDefender; - + private ShapeArc a; + private Color panelBorderColor = new Color(216f/255f,196f/255f,55f/255f,255f/255f); public GameInformation(GameContext context) { super(context); this.context = context; @@ -49,8 +53,7 @@ public GameInformation(GameContext context) { } public void buildStage() { - - this.panel = context.getManager().get(context.getAssetObject().infoPanel); + a = new ShapeArc(); this.contenders = context.getManager().get(context.getAssetObject().contenders); this.defenderThem = new TextureRegion(contenders, 0, 0, 13, 18); this.defenderUs = new TextureRegion(contenders, 13, 0, 13, 18); @@ -65,6 +68,7 @@ public void buildStage() { breakInfoFont = context.getManager().get(context.getAssetObject().fontBreak); areDefender = context.myTeam.name().equals(Team.DEFENDER.toString()); setTeamColors(); + this.panel = drawPanel(140,140, 20, new Color(45/255f,45/255f,45/255f,0.8f)); } public void setTeamColors() { @@ -100,13 +104,46 @@ public void setBreakTime(int value) { public boolean getIsBreak() { return timeUntilBreak == 0 && breakTime >= 0; } + + public static Texture drawPanel(int width, int height, int cornerRadius, Color color) { + + Pixmap pixmap = new Pixmap(width, height, Pixmap.Format.RGBA8888); + Pixmap ret = new Pixmap(width, height, Pixmap.Format.RGBA8888); + + pixmap.setColor(color); + + pixmap.drawCircle(cornerRadius, cornerRadius, cornerRadius); + pixmap.fillCircle(cornerRadius, cornerRadius, cornerRadius); + pixmap.drawCircle(width - cornerRadius - 1, cornerRadius, cornerRadius); + pixmap.fillCircle(width - cornerRadius - 1, cornerRadius, cornerRadius); + pixmap.drawCircle(cornerRadius, height - cornerRadius - 1, cornerRadius); + pixmap.fillCircle(cornerRadius, height - cornerRadius - 1, cornerRadius); + pixmap.drawCircle(width - cornerRadius - 1, height - cornerRadius - 1, cornerRadius); + pixmap.fillCircle(width - cornerRadius - 1, height - cornerRadius - 1, cornerRadius); + pixmap.drawRectangle(cornerRadius, 0, width - cornerRadius * 2, height); + pixmap.fillRectangle(cornerRadius, 0, width - cornerRadius * 2, height); + pixmap.drawRectangle(0, cornerRadius, width, height - cornerRadius * 2); + pixmap.fillRectangle(0, cornerRadius, width, height - cornerRadius * 2); + + ret.setColor(color); + for (int x = 0; x < width; x++) { + for (int y = 0; y < height; y++) { + if (pixmap.getPixel(x, y) != 0) ret.drawPixel(x, y); + } + } + pixmap.dispose(); + + Texture texture = new Texture(ret); + return texture; + } public void render(float delta) { int xPlacement = 60 + (longestTeam.length() * 6); stage.getBatch().setProjectionMatrix(stage.getCamera().combined); + shapeRenderer.setProjectionMatrix(stage.getCamera().combined); + a.setProjectionMatrix(stage.getCamera().combined); stage.getBatch().begin(); stage.getBatch().draw(panel, 5, 205); - // draw defender fontTeamDefender.draw(stage.getBatch(), defender + ":", 38,320 ); fontPointsDefender.draw(stage.getBatch(), Integer.toString(defenderPoints), xPlacement,318 ); @@ -175,6 +212,26 @@ public void render(float delta) { } stage.getBatch().end(); + + shapeRenderer.begin(ShapeType.Filled); + shapeRenderer.setColor(panelBorderColor); // Red line + + shapeRenderer.rectLine(5, 270, 145, 270, 2); + shapeRenderer.end(); + shapeRenderer.begin(ShapeType.Line); + shapeRenderer.setColor(panelBorderColor); + shapeRenderer.line(5, 225, 5, 325); + shapeRenderer.line(5+15, 205, 140-15, 205); + shapeRenderer.line(6+140, 225, 6+140, 325); + shapeRenderer.line(10+15, 205+140, 140-15, 205+140); + shapeRenderer.end(); + a.begin(ShapeType.Line); + a.setColor(panelBorderColor); + a.arc(25, 225, 20, 180, 90); + a.arc(5+120, 325, 20, 0, 90); + a.arc(25, 325, 20, 90, 90); + a.arc(5+120, 225, 20, 270, 90); + a.end(); } public void dispose() { diff --git a/client-core/src/com/benberi/cadesim/game/screen/impl/connect/ResolutionTypeLabel.java b/client-core/src/com/benberi/cadesim/game/screen/impl/connect/ResolutionTypeLabel.java deleted file mode 100644 index a883e16..0000000 --- a/client-core/src/com/benberi/cadesim/game/screen/impl/connect/ResolutionTypeLabel.java +++ /dev/null @@ -1,60 +0,0 @@ -package com.benberi.cadesim.game.screen.impl.connect; - -import com.badlogic.gdx.scenes.scene2d.ui.Label; - -public class ResolutionTypeLabel extends Label { - // informed by - // www.rapidtables.com/web/dev/screen-resolution-statistics.html - public static final String[] RES_LIST = { - "800x600", - "1024x768", - "1280x800", - "1280x1024", - "1366x768", - "1440x900", - "1600x900", - "1680x1050", - "1920x1080", - "2500x1400", - "3600x2000", - }; - - /** - * helper methods for if you use the whole RES_LIST. - * if not, dont use these method. - */ - public static String[] restypeToRes(int restype) { - return RES_LIST[restype].split("x"); - } - public static int resToResType(String[] res) { - String combinedRes = res[0] + "x" + res[1]; - for (int i=0; i 0."); + float colorBits = getColor().toFloatBits(); + float theta = (2 * MathUtils.PI * (degrees / 360.0f)) / segments; + float cos = MathUtils.cos(theta); + float sin = MathUtils.sin(theta); + float cx = radius * MathUtils.cos(start * MathUtils.degreesToRadians); + float cy = radius * MathUtils.sin(start * MathUtils.degreesToRadians); + + for (int i = 0; i < segments; i++) { + renderer.color(colorBits); + renderer.vertex(x + cx, y + cy, 0); + float temp = cx; + cx = cos * cx - sin * cy; + cy = sin * temp + cos * cy; + renderer.color(colorBits); + renderer.vertex(x + cx, y + cy, 0); + } + } +} diff --git a/client-core/src/com/benberi/cadesim/util/Team.java b/client-core/src/com/benberi/cadesim/util/Team.java index da9b996..da24a13 100644 --- a/client-core/src/com/benberi/cadesim/util/Team.java +++ b/client-core/src/com/benberi/cadesim/util/Team.java @@ -5,24 +5,49 @@ public enum Team { - DEFENDER(1, new Color(0.29803921568f, 0.77647058823f, 0.22352941176f, 1f)), - ATTACKER(0, new Color(0.81568627451f, 0.18039215686f, 0.20392156862f, 1f)); + DEFENDER(1, new Color(0.29803921568f, 0.77647058823f, 0.22352941176f, 1f), new Color(146 / 255f, 236 / 255f, 30 / 255f, 1), "Defender"), + ATTACKER(0, new Color(0.81568627451f, 0.18039215686f, 0.20392156862f, 1f), new Color(100 / 255f, 182 / 255f, 232 / 255f, 1), "Attacker"); private int team; private Color color; + private Color altColor; + private String teamAsString; - Team(int id, Color color) { + Team(int id, Color color, Color altColor, String teamAsString) { this.team = id; this.color = color; + this.altColor = altColor; + this.teamAsString = teamAsString; } public Color getColor() { return this.color; } + + public Color getAltColor() { + return this.altColor; + } + + public String getTeamAsString() { + return this.teamAsString; + } public int getID() { return this.team; } + + public static Team forString(String team) { + if (team == "") { + return null; + } + switch (team) { + case "Defender": + default: + return DEFENDER; + case "Attacker": + return ATTACKER; + } + } public static Team forId(int team) { if (team == -1) { diff --git a/client-core/src/com/benberi/cadesim/util/TextureCollection.java b/client-core/src/com/benberi/cadesim/util/TextureCollection.java index 4b3b5ea..308e499 100644 --- a/client-core/src/com/benberi/cadesim/util/TextureCollection.java +++ b/client-core/src/com/benberi/cadesim/util/TextureCollection.java @@ -164,7 +164,41 @@ public static Texture prepareTextureForTeam(Texture texture, Team team) { } } + return new Texture(pixmap); + } + + public static Texture prepareAltTextureForTeam(Texture texture, Team team) { + // The texture data + TextureData data = texture.getTextureData(); + + // Make sure its prepared + if (!data.isPrepared()) { + data.prepare(); + } + + // Our pixmap + Pixmap pixmap = data.consumePixmap(); + + // Loop through all pixels + for (int x = 0; x < pixmap.getWidth(); x++) { + for (int y = 0; y < pixmap.getHeight(); y++) { + + // The current color in the given position + int color = pixmap.getPixel(x, y); + + // RGBA conversion from int + int R = ((color & 0xff000000) >>> 24); + int G = ((color & 0x00ff0000) >>> 16); + int B = ((color & 0x0000ff00) >>> 8); + int A = ((color & 0x000000ff)); + + // Chec + if (R == 90 && G == 172 && B == 222 && A == 255) { + pixmap.drawPixel(x, y, Color.rgba8888(team.getAltColor())); + } + } + } return new Texture(pixmap); } } diff --git a/client-launcher/gclogo128.png b/client-launcher/gclogo128.png new file mode 100644 index 0000000000000000000000000000000000000000..75214a5915b8788a9ef7cf94d57dfab7bc3707be GIT binary patch literal 24185 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 Y;Q#&sQh3QX_y7Wf)>SRJX&3Q-0E3T7LI3~& literal 0 HcmV?d00001 diff --git a/client-launcher/src/com/benberi/cadesim/desktop/DesktopLauncher.java b/client-launcher/src/com/benberi/cadesim/desktop/DesktopLauncher.java index 4c25183..910120a 100644 --- a/client-launcher/src/com/benberi/cadesim/desktop/DesktopLauncher.java +++ b/client-launcher/src/com/benberi/cadesim/desktop/DesktopLauncher.java @@ -22,6 +22,7 @@ public class DesktopLauncher { private static String servers = ""; public static void main (String[] arg) { + new SplashScreen(); for (String s : arg) { if (s.equals("--no-update")) { Constants.AUTO_UPDATE = false; @@ -104,6 +105,7 @@ public static HashMap getUserProperties(){ return new HashMap (){ private static final long serialVersionUID = 1L; { + put("user.accountname", prop.getProperty("user.accountname")); put("user.username", prop.getProperty("user.username")); put("user.last_room_index", prop.getProperty("user.last_room_index")); put("user.last_ship", prop.getProperty("user.last_ship")); @@ -119,6 +121,7 @@ public static HashMap getUserProperties(){ return new HashMap (){ private static final long serialVersionUID = 1L; { + put("user.accountname", ""); put("user.username", "User"+Integer.toString(random.nextInt(9999))); put("user.last_room_index", "0"); put("user.last_team", "0"); @@ -134,6 +137,7 @@ public static HashMap getUserProperties(){ return new HashMap (){ private static final long serialVersionUID = 1L; { + put("user.accountname", ""); put("user.username", "User"+Integer.toString(random.nextInt(9999))); put("user.last_room_index", "0"); put("user.last_team", "0"); diff --git a/client-launcher/src/com/benberi/cadesim/desktop/SplashScreen.java b/client-launcher/src/com/benberi/cadesim/desktop/SplashScreen.java new file mode 100644 index 0000000..d54005a --- /dev/null +++ b/client-launcher/src/com/benberi/cadesim/desktop/SplashScreen.java @@ -0,0 +1,26 @@ +package com.benberi.cadesim.desktop; + +import javax.swing.*; +import java.awt.*; +public class SplashScreen extends JWindow { + + private static final long serialVersionUID = 1L; + private Image splashScreen; + private ImageIcon imageIcon; + + public SplashScreen() { + splashScreen = Toolkit.getDefaultToolkit().getImage("gclogo-splash.png"); + imageIcon = new ImageIcon(splashScreen); + setSize(imageIcon.getIconWidth(),imageIcon.getIconHeight()); + Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); + setLocation((screenSize.width-getSize().width)/2,(screenSize.height-getSize().height)/2); + setBackground(new Color(0,0,0,1)); + setVisible(true); + } + + public void paint(Graphics g) { + super.paint(g); + g.drawImage(splashScreen, 0, 0, this); + } + +} \ No newline at end of file diff --git a/client-launcher/user.config b/client-launcher/user.config index 41f7327..454cd5a 100644 --- a/client-launcher/user.config +++ b/client-launcher/user.config @@ -1,10 +1,11 @@ -#Thu Mar 11 11:26:25 CST 2021 -user.account=fast +#Thu Mar 11 17:56:06 CST 2021 +user.account=Fatigue +user.accountname=fast user.height=600 user.username=Fatigue user.last_team=0 user.last_room_index=0 user.width=800 -user.last_ship=14 +user.last_ship=8 url=https\://globalcadesim.com/imp/users.txt user.volume=0.17999999