From 91bf0b946507db08b79ebf63ce9f2791dda19cf7 Mon Sep 17 00:00:00 2001 From: David Date: Wed, 6 Jan 2021 17:40:41 -0600 Subject: [PATCH] Fixed AI to spawn on correct side based on team of other players --- .../src/com/benberi/cadesim/GameContext.java | 88 +++---- .../client/packet/in/ReceiveGameSettings.java | 1 + .../cadesim/game/screen/SeaBattleScreen.java | 16 +- .../game/screen/component/MenuComponent.java | 81 ++++--- .../codec/packet/ServerPacketManager.java | 10 +- .../server/config/ServerConfiguration.java | 98 ++++---- .../server/model/player/NPC_Type1.java | 2 +- .../server/model/player/NPC_Type2.java | 7 +- .../server/model/player/NPC_Type4.java | 2 + .../cadesim/server/model/player/Player.java | 2 +- .../server/model/player/PlayerManager.java | 216 ++++++++++++++++-- .../cadesim/server/service/GameService.java | 4 + 12 files changed, 366 insertions(+), 161 deletions(-) diff --git a/client-core/src/com/benberi/cadesim/GameContext.java b/client-core/src/com/benberi/cadesim/GameContext.java index 58ec140..fac745e 100644 --- a/client-core/src/com/benberi/cadesim/GameContext.java +++ b/client-core/src/com/benberi/cadesim/GameContext.java @@ -486,8 +486,13 @@ public void dispose() { if (getIsInLobby()) { System.out.println("Returned to lobby"); }else { - getLobbyScreen().setPopupMessage("You have disconnected from the server."); - getLobbyScreen().showPopup(); + Gdx.app.postRunnable(new Runnable() { + @Override + public void run() { + getLobbyScreen().setPopupMessage("You have disconnected from the server."); + getLobbyScreen().showPopup(); + } + }); } // #83 reset any lag test mode if we disconnect. @@ -618,6 +623,9 @@ public void handleServersideDisconnect() { public void run() { ScreenManager.getInstance().showScreen(ScreenEnum.LOBBY, context); graphics.setResizable(true); + getLobbyScreen().setPopupMessage("Server Disconnected."); + getLobbyScreen().showPopup(); + graphics.setTitle("GC: v" + Constants.VERSION); } }); } @@ -671,96 +679,96 @@ public ArrayList getGameSettings() { return gameSettings; } - public int getTurnSetting() { + public int getDefaultTurnSetting() { return ((int)gameSettings.get(0)/10); } + public int getDefaultRoundSetting() { + return ((int)gameSettings.get(1)/10); + } + + public int getDefaultRespawnSetting() { + return (int)gameSettings.get(2); + } + + public String getDefaultDisengageSetting() { + return (String)gameSettings.get(3); + } + + public String getDefaultJobberSetting() { + return (String)gameSettings.get(4); + } + + public int getTurnSetting() { + return ((int)gameSettings.get(5)/10); + } + public void setTurnSetting(int value) { - gameSettings.set(0, value); + gameSettings.set(5, value); } public int getRoundSetting() { - return ((int)gameSettings.get(1)/10); + return ((int)gameSettings.get(6)/10); } public void setRoundSetting(int value) { - gameSettings.set(1, value); + gameSettings.set(6, value); } public int getRespawnSetting() { - return (int)gameSettings.get(2); + return (int)gameSettings.get(7); } public void setRespawnSetting(int value) { - gameSettings.set(2, value); + gameSettings.set(7, value); } public String getDisengageSetting() { - return (String)gameSettings.get(3); + return (String)gameSettings.get(8); } public void setDisengageSetting(String value) { - gameSettings.set(3, value); + gameSettings.set(8, value); } public String getJobberSetting() { - return (String)gameSettings.get(4); + return (String)gameSettings.get(9); } public void setJobberSetting(String value) { - gameSettings.set(4, value); + gameSettings.set(9, value); } public boolean getCustomMapSetting() { - return (boolean)gameSettings.get(5); + return (boolean)gameSettings.get(10); } public void setCustomMapSetting(boolean b) { - gameSettings.set(5, b); + gameSettings.set(10, b); } public String getMapNameSetting() { - return (String)gameSettings.get(6); + return (String)gameSettings.get(11); } public void setMapNameSetting(String value) { - gameSettings.set(6, value); + gameSettings.set(11, value); } public int[][] getMapSetting() { - return (int[][])gameSettings.get(7); + return (int[][])gameSettings.get(12); } public void setMapSetting(int[][] value) { - gameSettings.set(7, value); + gameSettings.set(12, value); } public String getAISetting() { - return (String)gameSettings.get(8); + return (String)gameSettings.get(13); } public void setAISetting(String value) { - gameSettings.set(8, value); - } - - public int getDefaultTurnSetting() { - return ((int)gameSettings.get(9)/10); - } - - public int getDefaultRoundSetting() { - return ((int)gameSettings.get(10)/10); - } - - public int getDefaultRespawnSetting() { - return (int)gameSettings.get(11); - } - - public String getDefaultDisengageSetting() { - return (String)gameSettings.get(12); - } - - public String getDefaultJobberSetting() { - return (String)gameSettings.get(13); + gameSettings.set(13, value); } public ExecutorService getService() { diff --git a/client-core/src/com/benberi/cadesim/client/packet/in/ReceiveGameSettings.java b/client-core/src/com/benberi/cadesim/client/packet/in/ReceiveGameSettings.java index 822d9e3..b6c0f5b 100644 --- a/client-core/src/com/benberi/cadesim/client/packet/in/ReceiveGameSettings.java +++ b/client-core/src/com/benberi/cadesim/client/packet/in/ReceiveGameSettings.java @@ -22,6 +22,7 @@ public void execute(Packet p) { if(getContext().getBattleMenu() != null) { getContext().getBattleMenu().clearDisengageBehavior(); getContext().getBattleMenu().clearQuality(); + getContext().getBattleMenu().clearAI(); int length = p.readInt(); ObjectInputStream ois; try { 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 985a5fc..7bcb619 100644 --- a/client-core/src/com/benberi/cadesim/game/screen/SeaBattleScreen.java +++ b/client-core/src/com/benberi/cadesim/game/screen/SeaBattleScreen.java @@ -543,6 +543,7 @@ public void render(float delta) { if(battleMenu.teamTable.isVisible()) { battleMenu.fillTeamList(); } + stage.getBatch().setColor(Color.WHITE); stage.getViewport().setCamera(othercamera); stage.getBatch().setProjectionMatrix(othercamera.combined); stage.getViewport().apply(); @@ -883,8 +884,7 @@ public BlockadeMap getMap() { public void initializePlayerCamera(Vessel vessel) { cameraFollowsVessel = true; // force reset - othercamera.position.add(getIsometricX(vessel.getX(), vessel.getY(), vessel) - othercamera.position.x, getIsometricY(vessel.getX(), vessel.getY(), vessel) - othercamera.position.y, 0); - othercamera.update(); + othercamera.translate(getIsometricX(vessel.getX(), vessel.getY(), vessel) - othercamera.position.x, getIsometricY(vessel.getX(), vessel.getY(), vessel) - othercamera.position.y, 0); } /** @@ -954,7 +954,7 @@ public boolean touchDown(int x, int y, int pointer, int button) { if (battleMenu.touchDown(x, y, pointer, button)) { return true; } - if (othercamera != null && y < othercamera.viewportHeight && !battleMenu.teamTable.isVisible()) { + if (othercamera != null && y < othercamera.viewportHeight - 200 && !battleMenu.teamTable.isVisible()) { // handle camera not following vessel cameraFollowsVessel = false; @@ -975,7 +975,7 @@ public boolean touchUp(int x, int y, int pointer, int button) { if (battleMenu.touchUp(x, y, pointer,button)) { return true; } - if (othercamera != null && y < othercamera.viewportHeight && !battleMenu.teamTable.isVisible()) { + if (othercamera != null && y < othercamera.viewportHeight - 200 && !battleMenu.teamTable.isVisible()) { // handle camera following/not following vessel if (button == Input.Buttons.RIGHT) { cameraFollowsVessel = false; @@ -983,8 +983,7 @@ public boolean touchUp(int x, int y, int pointer, int button) { this.cameraFollowsVessel = true; try { Vessel vessel = context.getEntities().getVesselByName(context.myVessel); - othercamera.position.add(getIsometricX(vessel.getX(), vessel.getY(), vessel) - othercamera.position.x, getIsometricY(vessel.getX(), vessel.getY(), vessel) - othercamera.position.y, 0); - othercamera.update(); + othercamera.translate(getIsometricX(vessel.getX(), vessel.getY(), vessel) - othercamera.position.x, getIsometricY(vessel.getX(), vessel.getY(), vessel) - othercamera.position.y, 0); }catch(NullPointerException e){ //TO-DO -fix issue with null pointer } @@ -1005,10 +1004,9 @@ public boolean touchDragged(int sx, int sy, int pointer) { if (othercamera != null && sy > othercamera.viewportHeight) { return false; } - if (this.canDragMap && sy < Gdx.graphics.getHeight() - 200) { + if (this.canDragMap && sy < othercamera.viewportHeight - 200) { float x = Gdx.input.getDeltaX(); float y = Gdx.input.getDeltaY(); - othercamera.position.add(-x*1.3f, y*1.3f, 0); - othercamera.update(); + othercamera.translate(-x,y*1f); } if (battleMenu.touchDragged(sx, sy, pointer)) { return true; diff --git a/client-core/src/com/benberi/cadesim/game/screen/component/MenuComponent.java b/client-core/src/com/benberi/cadesim/game/screen/component/MenuComponent.java index cb59243..e00344c 100644 --- a/client-core/src/com/benberi/cadesim/game/screen/component/MenuComponent.java +++ b/client-core/src/com/benberi/cadesim/game/screen/component/MenuComponent.java @@ -9,6 +9,7 @@ import java.io.FileReader; import java.io.IOException; import java.util.ArrayList; +import java.util.HashSet; import java.util.Properties; import com.badlogic.gdx.graphics.Texture; @@ -287,8 +288,8 @@ public void createTeams() { teamButtonTable.add(attackerTeamButton).padBottom(2.0f).padLeft(8f).padRight(10.0f); teamButtonTable.add(defenderTeamButton).padBottom(2.0f); - listTables.add(attackerScroller).width(150).height(200).padRight(10.0f); - listTables.add(defenderScroller).width(150).height(200); + listTables.add(attackerScroller).width(250).height(200).padRight(10.0f); + listTables.add(defenderScroller).width(250).height(200); teamTable.add(teamButtonTable).row(); teamTable.add(listTables); teamTable.setPosition(Gdx.graphics.getWidth()/2, Gdx.graphics.getHeight()/2); @@ -366,12 +367,13 @@ public void createDialog() { settingsDialog.setMovable(true); settingsDialog.setResizable(true); resizeSettingsDialog(); - disableAI(); } /* * Fill list with proper teams */ public void fillTeamList() { + HashSet seen=new HashSet<>(); + context.getEntities().vessels.removeIf(e->!seen.add(e.getName())); attackerList.getItems().clear(); defenderList.getItems().clear(); ArrayList attacker = new ArrayList(); @@ -542,38 +544,38 @@ public void exit(InputEvent event, float x, float y, int pointer, Actor actor) { stage.setScrollFocus(null); } }); -// getAIOffButton().addListener(new ClickListener() { -// @Override -// public void clicked(InputEvent event, float x, float y) { -// clearAI(); -// getCustomMapButton().setDisabled(false); -// setAIButton("off",true); -// context.setAISetting("off"); -// }}); -// getAIEasyDifficultyButton().addListener(new ClickListener() { -// @Override -// public void clicked(InputEvent event, float x, float y) { -// clearAI(); -// getCustomMapButton().setDisabled(false); -// setAIButton("easy",true); -// context.setAISetting("easy"); -// }}); -// getAIMediumDifficultyButton().addListener(new ClickListener() { -// @Override -// public void clicked(InputEvent event, float x, float y) { -// clearAI(); -// getCustomMapButton().setDisabled(false); -// setAIButton("medium",true); -// context.setAISetting("medium"); -// }}); -// getAIHardDifficultyButton().addListener(new ClickListener() { -// @Override -// public void clicked(InputEvent event, float x, float y) { -// clearAI(); -// getCustomMapButton().setDisabled(false); -// setAIButton("hard",true); -// context.setAISetting("hard"); -// }}); + getAIOffButton().addListener(new ClickListener() { + @Override + public void clicked(InputEvent event, float x, float y) { + clearAI(); + getCustomMapButton().setDisabled(false); + setAIButton("off",true); + context.setAISetting("off"); + }}); + getAIEasyDifficultyButton().addListener(new ClickListener() { + @Override + public void clicked(InputEvent event, float x, float y) { + clearAI(); + getCustomMapButton().setDisabled(false); + setAIButton("easy",true); + context.setAISetting("easy"); + }}); + getAIMediumDifficultyButton().addListener(new ClickListener() { + @Override + public void clicked(InputEvent event, float x, float y) { + clearAI(); + getCustomMapButton().setDisabled(false); + setAIButton("medium",true); + context.setAISetting("medium"); + }}); + getAIHardDifficultyButton().addListener(new ClickListener() { + @Override + public void clicked(InputEvent event, float x, float y) { + clearAI(); + getCustomMapButton().setDisabled(false); + setAIButton("hard",true); + context.setAISetting("hard"); + }}); getDisengageOffButton().addListener(new ClickListener() { @Override public void clicked(InputEvent event, float x, float y) { @@ -880,6 +882,10 @@ public void selected(Array file) { selectCustomMap(); } } + @Override + public void canceled() { + getCustomMapButton().setDisabled(false); + } }); } @@ -943,6 +949,11 @@ public void showDialog() { if(button.getText().toString().toLowerCase().equals(context.getJobberSetting())) { button.setDisabled(true); } + } + for (TextButton button: aiGroup.getButtons()) { + if(button.getText().toString().toLowerCase().equals(context.getAISetting())) { + button.setDisabled(true); + } } settingsDialog.pack(); settingsScroller.layout(); diff --git a/server/src/com/benberi/cadesim/server/codec/packet/ServerPacketManager.java b/server/src/com/benberi/cadesim/server/codec/packet/ServerPacketManager.java index f88b117..0cd623c 100644 --- a/server/src/com/benberi/cadesim/server/codec/packet/ServerPacketManager.java +++ b/server/src/com/benberi/cadesim/server/codec/packet/ServerPacketManager.java @@ -43,9 +43,13 @@ public ServerPacketManager(ServerContext context) { * Queues all packets and executes them */ public void queuePackets() { - for (Player p : context.getPlayerManager().getPlayers()) { - p.getPackets().queueIncomingPackets(); - } + try { + for (Player p : context.getPlayerManager().getPlayers()) { + p.getPackets().queueIncomingPackets(); + } + }catch(ConcurrentModificationException e) { + + } } /** diff --git a/server/src/com/benberi/cadesim/server/config/ServerConfiguration.java b/server/src/com/benberi/cadesim/server/config/ServerConfiguration.java index 8ee3c09..39bce86 100644 --- a/server/src/com/benberi/cadesim/server/config/ServerConfiguration.java +++ b/server/src/com/benberi/cadesim/server/config/ServerConfiguration.java @@ -34,7 +34,7 @@ public class ServerConfiguration { private static String mapFilter = ".txt"; private static String disengageBehavior = "simple"; private static int votingMajority = 75; // percent - private static String aiLevel = "easy"; + private static String aiLevel = "off"; private static JobbersQuality jobbersQuality = JobbersQuality.ELITE; private static String attackerName = "attacker"; private static String defenderName = "defender"; @@ -49,9 +49,9 @@ public class ServerConfiguration { private static boolean customMap = false; private static boolean checkForUpdatesOnStartup = false; - private static ArrayList gameSettings = new ArrayList(Arrays.asList(turnDuration, - roundDuration,respawnDelay, disengageBehavior, getJobbersQualityAsString(), isCustomMap(), mapName, null, aiLevel, - turnDuration,roundDuration,respawnDelay, disengageBehavior, getJobbersQualityAsString())); + private static ArrayList gameSettings = new ArrayList(Arrays.asList( + turnDuration,roundDuration,respawnDelay, disengageBehavior, getJobbersQualityAsString(), + turnDuration,roundDuration,respawnDelay, disengageBehavior, getJobbersQualityAsString(), isCustomMap(), mapName, null, aiLevel)); // uninitializable defaults private static String nextMapName = null; // the next map in the rotation. cannot be initialized by CLI. private static ArrayList mapList; // store all possible maps, load from file once at the start. restart server to apply change. @@ -391,104 +391,104 @@ public static void setSettingsChanged(boolean changed) { public static ArrayList getGameSettings() { return gameSettings; } + public static int getDefaultTurnSetting() { + return (int)ServerConfiguration.gameSettings.get(0); + } + + public static void setDefaultTurnSetting(int value) { + ServerConfiguration.gameSettings.set(0,value); + } + + public static int getDefaultRoundSetting() { + return (int)ServerConfiguration.gameSettings.get(1); + } + + public static void setDefaultRoundSetting(int value) { + ServerConfiguration.gameSettings.set(1,value); + } + + public static int getDefaultRespawnSetting() { + return (int)ServerConfiguration.gameSettings.get(2); + } + + public static String getDefaultDisengageSetting() { + return (String)ServerConfiguration.gameSettings.get(3); + } + + public static String getDefaultJobberSetting() { + return (String)ServerConfiguration.gameSettings.get(4); + } public static int getTurnSetting() { - return (int)ServerConfiguration.gameSettings.get(0); + return (int)ServerConfiguration.gameSettings.get(5); } public static void setTurnSetting(int value) { - ServerConfiguration.gameSettings.set(0, value); + ServerConfiguration.gameSettings.set(5, value); } public static int getRoundSetting() { - return (int)ServerConfiguration.gameSettings.get(1); + return (int)ServerConfiguration.gameSettings.get(6); } public static void setRoundSetting(int value) { - ServerConfiguration.gameSettings.set(1, value); + ServerConfiguration.gameSettings.set(6, value); } public static int getRespawnSetting() { - return (int)ServerConfiguration.gameSettings.get(2); + return (int)ServerConfiguration.gameSettings.get(7); } public static void setRespawnSetting(int value) { - ServerConfiguration.gameSettings.set(2, value); + ServerConfiguration.gameSettings.set(7, value); } public static String getDisengageSetting() { - return (String)ServerConfiguration.gameSettings.get(3); + return (String)ServerConfiguration.gameSettings.get(8); } public static void setDisengageSetting(String value) { - ServerConfiguration.gameSettings.set(3, value); + ServerConfiguration.gameSettings.set(8, value); } public static String getJobberSetting() { - return (String)ServerConfiguration.gameSettings.get(4); + return (String)ServerConfiguration.gameSettings.get(9); } public static void setJobberSetting(String value) { - ServerConfiguration.gameSettings.set(4, value); + ServerConfiguration.gameSettings.set(9, value); } public static boolean getCustomMapSetting() { - return (boolean)ServerConfiguration.gameSettings.get(5); + return (boolean)ServerConfiguration.gameSettings.get(10); } public static void setCustomMapSetting(boolean b) { - ServerConfiguration.gameSettings.set(5, b); + ServerConfiguration.gameSettings.set(10, b); } public static String getMapNameSetting() { - return (String)ServerConfiguration.gameSettings.get(6); + return (String)ServerConfiguration.gameSettings.get(11); } public static void setMapNameSetting(String value) { - ServerConfiguration.gameSettings.set(6, value); + ServerConfiguration.gameSettings.set(11, value); } public static int[][] getMapSetting() { - return (int[][])ServerConfiguration.gameSettings.get(7); + return (int[][])ServerConfiguration.gameSettings.get(12); } public static void setMapSetting(int[][] value) { - ServerConfiguration.gameSettings.set(7, value); + ServerConfiguration.gameSettings.set(12, value); } public static String getAISetting() { - return (String)ServerConfiguration.gameSettings.get(8); + return (String)ServerConfiguration.gameSettings.get(13); } public static void setAISetting(String value) { - ServerConfiguration.gameSettings.set(8, value); - } - - public static int getDefaultTurnSetting() { - return (int)ServerConfiguration.gameSettings.get(9); - } - - public static void setDefaultTurnSetting(int value) { - ServerConfiguration.gameSettings.set(9,value); + ServerConfiguration.gameSettings.set(13, value); } - public static int getDefaultRoundSetting() { - return (int)ServerConfiguration.gameSettings.get(10); - } - - public static void setDefaultRoundSetting(int value) { - ServerConfiguration.gameSettings.set(10,value); - } - - public static int getDefaultRespawnSetting() { - return (int)ServerConfiguration.gameSettings.get(11); - } - - public static String getDefaultDisengageSetting() { - return (String)ServerConfiguration.gameSettings.get(12); - } - - public static String getDefaultJobberSetting() { - return (String)ServerConfiguration.gameSettings.get(13); - } } diff --git a/server/src/com/benberi/cadesim/server/model/player/NPC_Type1.java b/server/src/com/benberi/cadesim/server/model/player/NPC_Type1.java index 0e213d2..e6ab92d 100644 --- a/server/src/com/benberi/cadesim/server/model/player/NPC_Type1.java +++ b/server/src/com/benberi/cadesim/server/model/player/NPC_Type1.java @@ -28,7 +28,7 @@ public void calculateRoute() { @Override public void performLogic() { - getMoves().setMove(0, MoveType.FORWARD); + getMoves().setMove(0,MoveType.FORWARD); } @Override diff --git a/server/src/com/benberi/cadesim/server/model/player/NPC_Type2.java b/server/src/com/benberi/cadesim/server/model/player/NPC_Type2.java index b1793bf..a1d4f7f 100644 --- a/server/src/com/benberi/cadesim/server/model/player/NPC_Type2.java +++ b/server/src/com/benberi/cadesim/server/model/player/NPC_Type2.java @@ -21,9 +21,14 @@ public NPC_Type2(ServerContext ctx, Channel c) { super.setType(NPC_Type.TYPE2); } + @Override + public void calculateRoute() { + + } + @Override public void performLogic() { - this.getMoves().setMove(0, MoveType.RIGHT); + getMoves().setMove(0,MoveType.FORWARD); } @Override diff --git a/server/src/com/benberi/cadesim/server/model/player/NPC_Type4.java b/server/src/com/benberi/cadesim/server/model/player/NPC_Type4.java index 8058305..7a7837c 100644 --- a/server/src/com/benberi/cadesim/server/model/player/NPC_Type4.java +++ b/server/src/com/benberi/cadesim/server/model/player/NPC_Type4.java @@ -29,6 +29,8 @@ public void calculateRoute() { @Override public void performLogic() { getMoves().setMove(0, MoveType.FORWARD); + getMoves().setMove(1, MoveType.FORWARD); + getMoves().setMove(2, MoveType.FORWARD); } @Override diff --git a/server/src/com/benberi/cadesim/server/model/player/Player.java b/server/src/com/benberi/cadesim/server/model/player/Player.java index b617d30..3c2f2c3 100644 --- a/server/src/com/benberi/cadesim/server/model/player/Player.java +++ b/server/src/com/benberi/cadesim/server/model/player/Player.java @@ -552,7 +552,7 @@ private void respawnOnLandside(boolean landSide, int[] customPosition, VesselFac * wrapper for respawnOnLandside * @param landSide true if want to spawn on landside else false */ - private void respawnOnLandside(boolean landside) { + protected void respawnOnLandside(boolean landside) { respawnOnLandside(landside, null, null, 0, false); } diff --git a/server/src/com/benberi/cadesim/server/model/player/PlayerManager.java b/server/src/com/benberi/cadesim/server/model/player/PlayerManager.java index 7e72095..4b67393 100644 --- a/server/src/com/benberi/cadesim/server/model/player/PlayerManager.java +++ b/server/src/com/benberi/cadesim/server/model/player/PlayerManager.java @@ -18,16 +18,21 @@ import com.benberi.cadesim.server.model.player.vessel.VesselMovementAnimation; import com.benberi.cadesim.server.util.Direction; import com.benberi.cadesim.server.util.Position; + + import io.netty.channel.Channel; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; +import java.util.Comparator; import java.util.HashMap; import java.util.LinkedList; import java.util.List; +import java.util.Map; import java.util.Queue; import java.util.Random; +import java.util.TreeMap; import java.util.concurrent.atomic.AtomicInteger; import java.util.stream.Collectors; @@ -37,6 +42,35 @@ public class PlayerManager { * List of players in the game */ private List players = new ArrayList<>(); + /** + * List of bot names + */ + private List botFirstName = new ArrayList() { + private static final long serialVersionUID = 1L; + { + add("Bright");add("Caustic");add("Charming");add("Classy");add("Clueless");add("Committed"); + add("Crabby");add("Crazy");add("Dangerous");add("Dear");add("Dedicated");add("Devouring"); + add("Dramatic");add("Educated");add("Elegant");add("Enlightened");add("Fat");add("Flexible"); + add("Free");add("Grateful");add("Haughty");add("Healthy");add("Heartless");add("Hungry"); + add("Innocent");add("Lucky");add("Magical");add("Magnificent");add("Old-Fashion");add("Passionate"); + add("Poor");add("Proud");add("Rare");add("Sick");add("Small");add("Strange");add("Touchy"); + add("Tricky");add("Uninhibited");add("Unique");add("Voracious");add("Well-Dressed");add("Witty"); + } + }; + private List botSecondName = new ArrayList() { + private static final long serialVersionUID = 1L; + { + add("Alewife");add("Anchovy");add("Angelfish");add("Angler");add("Barbel");add("Bass");add("Blowfish"); + add("Bluegill");add("Bream");add("Bullhead");add("Carp");add("Catfish");add("Chub");add("Clownfish"); + add("Cod");add("Eel");add("Flounder");add("Gar");add("Grunion");add("Guppy");add("Gurnard"); + add("Haddock");add("Hagfish");add("Hake");add("Halibut");add("Hammerhead");add("Herring");add("Lamprey"); + add("Mackerel");add("Mako");add("Marlin");add("Mullet");add("Hammerhead");add("Needlefish");add("Pike"); + add("Piranha");add("Plaice");add("Pollack");add("Puffer");add("Hammerhead");add("Roach");add("Rudd"); + add("Sailfish");add("Salmon");add("Sardine");add("Sawfish");add("Shad");add("Shiner");add("Sild"); + add("Silverside");add("Spot");add("Sprat");add("Stickleback");add("Sunfush");add("Tench");add("Tigerfish"); + add("Trout");add("Tuna");add("Whitebait");add("Wrasse"); + } + }; /** * List of temporarily banned IPs in the game */ @@ -125,6 +159,10 @@ public static List splitEqually(String text, int size) { return ret; } + public String randomBotName() { + Random random = new Random(); + return botFirstName.get(random.nextInt(botFirstName.size())) + " " + botSecondName.get(random.nextInt(botSecondName.size())); + } /** * helper method to reset tmp settings */ @@ -337,9 +375,6 @@ public void tick() { * Handles and executes all turns */ public void handleTurns() { - for(Player player : listBots()) { - player.performLogic(); - } if (ServerConfiguration.isTestMode()) { if (!context.getRegressionTests().loadNextScenario()) { context.getRegressionTests().getSummary(); @@ -525,7 +560,6 @@ else if (context.getMap().isWhirlpool(tile)){//whirls { players.removeIf(p -> (!p.isRegistered())); // purge any unregistered ships sendAfterTurn(); - } } @@ -1180,13 +1214,16 @@ public void sendAfterTurn() { p.giveLife(); } } - // then deal with individual players for (Player p : listRegisteredPlayers()) { p.getPackets().sendPositions(); sendMoveBar(p); p.getPackets().sendFlags(); } + + for(Player other : listBots()) { + other.performLogic(); + } } public int getPointsDefender() { @@ -1663,7 +1700,95 @@ public void removeAI() { } } } + + public Team getBotTeam() { + switch(listRegisteredPlayers().get(0).getTeam()) { + case ATTACKER: + return Team.DEFENDER; + case DEFENDER: + return Team.ATTACKER; + default: + return Team.ATTACKER; + } + } + + public VesselFace getBotFace() { + switch(listRegisteredPlayers().get(0).getTeam()) { + case ATTACKER: + return VesselFace.NORTH; + case DEFENDER: + return VesselFace.SOUTH; + default: + return VesselFace.SOUTH; + } + } + //searches each tile for corresponding flag points + public Map> checkTilePoints(Player player) { + List localFlags = new ArrayList<>(); + Map>tilePoints = new HashMap<>(); + int diameter = player.getVessel().getInfluenceDiameter(); //as much diameter as warfrig + int radius = diameter / 2; + int squareRadius = radius; + for (int i = 0; i < context.getMap().getMap().length; i++) { + for(int j = 0; j < context.getMap().getMap()[i].length; j++) { + int pointTotal = 0; + localFlags.clear(); + if(context.getMap().isRock(i, j, player) || context.getMap().isOutOfBounds(i, j)) { + continue; + } + for (int x = i - squareRadius; x < i + squareRadius; x++) { + for (int y = j - squareRadius; y < j + squareRadius; y++) { + if((java.lang.Math.pow(x - i, 2) + java.lang.Math.pow(y - j, 2)) < java.lang.Math.pow(radius, 2)) { + Flag checkedFlag = context.getMap().getFlag(x, y); + if ((checkedFlag != null) && (!localFlags.contains(checkedFlag))) { // add once only + localFlags.add(checkedFlag); + } + } + } + } + Flag north = context.getMap().getFlag(i, j + radius); + Flag south = context.getMap().getFlag(i, j - radius); + Flag west = context.getMap().getFlag(i - radius, j); + Flag east = context.getMap().getFlag(i + radius, j); + + // add the four cardinal flags. + // in case radius is 0, our cardinal flags will be 4x identical. + // avoid adding 4x in this case. + if ((north != null) && (!localFlags.contains(north))) { + localFlags.add(north); + } + if ((south != null) && (!localFlags.contains(south))) { + localFlags.add(south); + } + if ((west != null) && (!localFlags.contains(west))) { + localFlags.add(west); + } + if ((east != null) && (!localFlags.contains(east))) { + localFlags.add(east); + } + + for(Flag points : localFlags) { + pointTotal += points.getSize().getID(); + } + if(pointTotal != 0) { + Map tile = new HashMap(); + tile.put(i, j); + tilePoints.put(pointTotal,tile); + } + } + } + return tilePoints; + } + + //sorts flags in reverse order giving max points per position + public void getMaxTilePoints(Player player) { + Map> sortedMap = new TreeMap>(Comparator.reverseOrder()); + sortedMap.putAll(checkTilePoints(player)); + System.out.println(sortedMap.keySet()); // flag point total + System.out.println(sortedMap.values()); // position of tile (x,y) + } + public void spawnAI() { removeAI(); int playerListSize = listRegisteredPlayers().size(); @@ -1671,29 +1796,72 @@ public void spawnAI() { case "off": return; case "easy": - createBot(NPC_Type.TYPE1, "Type1", 11, Team.ATTACKER, null, VesselFace.SOUTH, 0.0f); - createBot(NPC_Type.TYPE2, "Type2", 11, Team.ATTACKER, null, VesselFace.SOUTH, 0.0f); - break; + for (int i =0; i < playerListSize ; i++) { + createBot(NPC_Type.TYPE4, randomBotName(), listRegisteredPlayers().get(0).getVessel().getID(), getBotTeam(), null, getBotFace(), 0.0f); + } + createBot(NPC_Type.TYPE3, randomBotName(), 0, getBotTeam(), null, getBotFace(), 0.0f); + createBot(NPC_Type.TYPE1, randomBotName(), 1, getBotTeam(), null, getBotFace(), 0.0f); + createBot(NPC_Type.TYPE2, randomBotName(), 2, getBotTeam(), null, getBotFace(), 0.0f); + createBot(NPC_Type.TYPE3, randomBotName(), 8, getBotTeam(), null, getBotFace(), 0.0f); + for(Player p : listBots()) { + if(listRegisteredPlayers().get(0).getTeam() == Team.ATTACKER) { + p.respawnOnLandside(true); + }else { + p.respawnOnLandside(false); + } + } + for(Player p : listRegisteredPlayers()) { + if(!p.isBot()) { + p.getPackets().sendPlayers(); + } + } + return; + case "medium": - for (int i =1; i <=(playerListSize * 1.5) ; i++) { - System.out.println("Medium: " + i); - createBot(NPC_Type.TYPE1, "Type1", 11, Team.ATTACKER, null, VesselFace.SOUTH, 0.0f); + for (int i =0; i < playerListSize *1.5 ; i++) { + createBot(NPC_Type.TYPE4, randomBotName(), listRegisteredPlayers().get(0).getVessel().getID(), getBotTeam(), null, getBotFace(), 0.0f); + } + createBot(NPC_Type.TYPE1, randomBotName(), 2, getBotTeam(), null, getBotFace(), 0.0f); + createBot(NPC_Type.TYPE2, randomBotName(), 3, getBotTeam(), null, getBotFace(), 0.0f); + createBot(NPC_Type.TYPE3, randomBotName(), 4, getBotTeam(), null, getBotFace(), 0.0f); + for(Player p : listBots()) { + if(listRegisteredPlayers().get(0).getTeam() == Team.ATTACKER) { + p.respawnOnLandside(true); + }else { + p.respawnOnLandside(false); + } + } + for(Player p : listRegisteredPlayers()) { + if(!p.isBot()) { + p.getPackets().sendPlayers(); + } } - break; + return; case "hard": - for (int i =1; i <=(playerListSize * 2) ; i++) { - System.out.println("Hard: " + i); - createBot(NPC_Type.TYPE1, "Type1", 11, Team.ATTACKER, null, VesselFace.SOUTH, 0.0f); + for (int i =0; i < playerListSize * 2 ; i++) { + createBot(NPC_Type.TYPE4, randomBotName(), listRegisteredPlayers().get(0).getVessel().getID(), getBotTeam(), null, getBotFace(), 0.0f); + } + createBot(NPC_Type.TYPE1, randomBotName(), 1, getBotTeam(), null, getBotFace(), 0.0f); + createBot(NPC_Type.TYPE2, randomBotName(), 1, getBotTeam(), null, getBotFace(), 0.0f); + createBot(NPC_Type.TYPE2, randomBotName(), 2, getBotTeam(), null, getBotFace(), 0.0f); + createBot(NPC_Type.TYPE3, randomBotName(), 8, getBotTeam(), null, getBotFace(), 0.0f); + createBot(NPC_Type.TYPE3, randomBotName(), 8, getBotTeam(), null, getBotFace(), 0.0f); + for(Player p : listBots()) { + if(listRegisteredPlayers().get(0).getTeam() == Team.ATTACKER) { + p.respawnOnLandside(true); + }else { + p.respawnOnLandside(false); + } + } + for(Player p : listRegisteredPlayers()) { + if(!p.isBot()) { + p.getPackets().sendPlayers(); + } } - break; + return; default: return; } - for(Player p : listRegisteredPlayers()) { - if(!p.isBot()) { - p.getPackets().sendPlayers(); - } - } } private void printTeams(Player pl, boolean verbose) { @@ -1747,13 +1915,17 @@ private String proposeSetHelp() } public void setTeam(Player pl, int value) { + Team beforeTeam = pl.getTeam(); if(value == 0) { pl.setTeam(Team.ATTACKER); }else { pl.setTeam(Team.DEFENDER); } - + Team afterTeam = pl.getTeam(); sendTeamInfo(); + if(beforeTeam != afterTeam) { + spawnAI(); + } } public void sendTeamInfo() { diff --git a/server/src/com/benberi/cadesim/server/service/GameService.java b/server/src/com/benberi/cadesim/server/service/GameService.java index d2d830e..8d9881c 100644 --- a/server/src/com/benberi/cadesim/server/service/GameService.java +++ b/server/src/com/benberi/cadesim/server/service/GameService.java @@ -5,6 +5,7 @@ import com.benberi.cadesim.server.ServerContext; import com.benberi.cadesim.server.config.Constants; import com.benberi.cadesim.server.config.ServerConfiguration; +import com.benberi.cadesim.server.model.player.Player; import com.benberi.cadesim.server.model.player.PlayerManager; /** @@ -128,6 +129,9 @@ else if ( playerManager.renewGame(); context.getTimeMachine().renewRound(); // bugfix - order matters playerManager.spawnAI(); + for(Player other : playerManager.listBots()) { + other.performLogic(); + } playerManager.serverBroadcastMessage("Started new round: #" + (gamesCompleted + 1)); }