From 8e15ad3ac84048ea17452da874abbe06b84b691c Mon Sep 17 00:00:00 2001 From: Nilstrieb Date: Fri, 18 Dec 2020 18:40:59 +0100 Subject: [PATCH] big update, stonks --- .idea/misc.xml | 2 +- 2DGame.iml | 2 + src/main/java/Main.java | 5 +- .../java/core/{ => general}/Drawable.java | 2 +- src/main/java/core/{ => general}/Master.java | 50 +++++++++---- src/main/java/core/math/Coords.java | 10 ++- src/main/java/core/math/Vector2D.java | 14 +++- src/main/java/core/objects/base/DebugPos.java | 1 + .../core/objects/core/CollGameObject.java | 18 +++++ .../java/core/objects/core/GameObject.java | 22 ++++-- src/main/java/core/physics/Collidable.java | 6 +- .../java/core/physics/hitboxes/Hitbox.java | 5 +- .../core/physics/hitboxes/RectHitBox.java | 11 ++- src/main/java/objects/GameObject.java | 67 ++++++++++++++++++ src/main/java/objects/ships/BattleShip.java | 7 +- src/main/java/objects/ships/Shell.java | 15 +++- src/main/java/objects/ships/Submarine.java | 1 - src/main/java/objects/ships/Turret.java | 11 ++- target/classes/BasicEx$1.class | Bin 660 -> 0 bytes target/classes/BasicEx.class | Bin 2155 -> 0 bytes target/classes/core/Master.class | Bin 6573 -> 7807 bytes target/classes/objects/DebugPos.class | Bin 876 -> 0 bytes target/classes/objects/ships/BattleShip.class | Bin 2304 -> 2396 bytes target/classes/objects/ships/Shell.class | Bin 991 -> 1384 bytes target/classes/objects/ships/Turret.class | Bin 4048 -> 3834 bytes target/classes/objects/world/Grid.class | Bin 1155 -> 1160 bytes 26 files changed, 200 insertions(+), 49 deletions(-) create mode 100644 2DGame.iml rename src/main/java/core/{ => general}/Drawable.java (96%) rename src/main/java/core/{ => general}/Master.java (77%) create mode 100644 src/main/java/objects/GameObject.java delete mode 100644 target/classes/BasicEx$1.class delete mode 100644 target/classes/BasicEx.class delete mode 100644 target/classes/objects/DebugPos.class diff --git a/.idea/misc.xml b/.idea/misc.xml index 5f60ad7..0f9e86a 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -8,7 +8,7 @@ - + \ No newline at end of file diff --git a/2DGame.iml b/2DGame.iml new file mode 100644 index 0000000..78b2cc5 --- /dev/null +++ b/2DGame.iml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/src/main/java/Main.java b/src/main/java/Main.java index 9f78e99..01c14d8 100644 --- a/src/main/java/Main.java +++ b/src/main/java/Main.java @@ -1,4 +1,4 @@ -import core.Master; +import core.general.Master; import javax.swing.*; import java.awt.*; @@ -24,7 +24,8 @@ class Main extends JFrame { add(master); setTitle("Points"); - setSize(1000, (int) (1000 / Master.SCREEN_RATIO)); + int w = 1500; + setSize(w, (int) (w / Master.SCREEN_RATIO)); setLocationRelativeTo(null); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); diff --git a/src/main/java/core/Drawable.java b/src/main/java/core/general/Drawable.java similarity index 96% rename from src/main/java/core/Drawable.java rename to src/main/java/core/general/Drawable.java index 6658c96..7efc348 100644 --- a/src/main/java/core/Drawable.java +++ b/src/main/java/core/general/Drawable.java @@ -1,4 +1,4 @@ -package core; +package core.general; import java.awt.Graphics2D; diff --git a/src/main/java/core/Master.java b/src/main/java/core/general/Master.java similarity index 77% rename from src/main/java/core/Master.java rename to src/main/java/core/general/Master.java index 92dc4e4..d4d4429 100644 --- a/src/main/java/core/Master.java +++ b/src/main/java/core/general/Master.java @@ -1,12 +1,15 @@ -package core; +package core.general; import core.math.Vector2D; +import core.objects.core.CollGameObject; import core.physics.Collidable; import core.physics.Collision; import core.objects.base.DebugPos; +import core.physics.hitboxes.Hitbox; import objects.ships.BattleShip; import core.objects.core.GameObject; import objects.ships.Submarine; +import objects.ships.Turret; import objects.world.Grid; import objects.world.Wall; @@ -45,6 +48,7 @@ public class Master extends JPanel { */ private final ArrayList> drawables; + /** * All physics objects that exist */ @@ -55,6 +59,11 @@ public class Master extends JPanel { */ private final ArrayList objectBuffer; + /** + * All physics objects that exist + */ + private final ArrayList collidablesBuffer; + /** * Whether the left mouse button has been pressed since the last frame */ @@ -74,6 +83,7 @@ public class Master extends JPanel { objects = new ArrayList<>(); objectBuffer = new ArrayList<>(); collidables = new ArrayList<>(); + collidablesBuffer = new ArrayList<>(); drawables = new ArrayList<>(); drawables.add(new ArrayList<>()); @@ -82,9 +92,11 @@ public class Master extends JPanel { BattleShip battleShip = new BattleShip(Color.DARK_GRAY); BattleShip bs = new BattleShip(140, 10, 10, 80, Color.GREEN); - /*for (int i = 0; i < 10; i++) { - bs.addTurret(new Turret(bs, 25, 10 * i + 1, 50, i % 5)); - }*/ + + for (int i = 0; i < 8; i++) { + bs.addTurret(new Turret(bs, 2.5, 10 * i + 1, 5, (i % 5 )+ 1)); + + } create(bs); create(battleShip); @@ -143,11 +155,16 @@ public class Master extends JPanel { * This method is the entry method for each frame. It handles everything about the frame */ public void refresh() { + long time = System.currentTimeMillis(); + objects.clear(); objects.addAll(objectBuffer); - objectBuffer.clear(); - objects.forEach(GameObject::update); + collidables.clear(); + collidables.addAll(collidablesBuffer); + objects.forEach(GameObject::startUpdate); + long time2 = System.currentTimeMillis(); mousePressed = false; repaint(); + System.out.println("Frame took " + (System.currentTimeMillis() - time) + "ms, " + (time2 - time) + "ms for update, " + (System.currentTimeMillis() - time2) + "ms for draw"); } /** @@ -182,8 +199,8 @@ public class Master extends JPanel { */ public void create(GameObject obj, int renderLayer) { objectBuffer.add(obj); - if (obj instanceof Collidable) { - collidables.add((Collidable) obj); + if (obj instanceof CollGameObject) { + collidablesBuffer.add((Collidable) obj); } addDrawable(obj, renderLayer); @@ -221,15 +238,20 @@ public class Master extends JPanel { * @return True if it collides with something, false if it doesn't - Should return a Collision */ public Collision doesCollide(Collidable collidable) { + long time = System.nanoTime(); Collision collides = null; for (Collidable other : collidables) { - double distance = Vector2D.distance(other.getCenterPos(), collidable.getCenterPos()); - if (other != collidable && (distance < other.getHitbox().getSize() + collidable.getHitbox().getSize())) { + if (!collidable.getIgnores().contains(other.getClass()) && !other.isTrigger()) { //ONLY calculate when it's not ignored - if (other.getHitbox().collidesWith(collidable.getHitbox())) { - collides = new Collision(collidable, other); + double distance = Vector2D.distance(other.getCenterPos(), collidable.getCenterPos()); + if (other != collidable && (distance < other.getHitbox().getSize() + collidable.getHitbox().getSize())) { + + if (other.getHitbox().collidesWith(collidable.getHitbox())) { + collides = new Collision(collidable, other); + collidable.onCollision(); + } } } } @@ -245,11 +267,11 @@ public class Master extends JPanel { } public void destroy(GameObject gameObject) { - objects.remove(gameObject); objectBuffer.remove(gameObject); drawables.get(gameObject.getLayer()).remove(gameObject); if (gameObject instanceof Collidable) { - collidables.remove(gameObject); + collidablesBuffer.remove(gameObject); + drawables.get(Hitbox.HITBOX_RENDER_LAYER).remove(((CollGameObject) gameObject).getHitbox()); } } } diff --git a/src/main/java/core/math/Coords.java b/src/main/java/core/math/Coords.java index 858f04e..7a60ef1 100644 --- a/src/main/java/core/math/Coords.java +++ b/src/main/java/core/math/Coords.java @@ -1,7 +1,6 @@ package core.math; -import core.Master; -import core.math.Vector2D; +import core.general.Master; /** * This class provides everything about the local coordinate system the game uses @@ -24,6 +23,7 @@ public class Coords { /** * Get the world coordinates of a point in map coordinates + * * @param value A point in map coordinates * @return The point in world coordinates */ @@ -44,4 +44,10 @@ public class Coords { double y = (value.y / master.getH()) * Master.SCREEN_Y_COORDINATES; return new Vector2D(x, y); } + + public static boolean outOfBounds(Vector2D position, Vector2D size) { + + return (position.x + size.magnitude() < 0 || position.x - size.magnitude() > Master.SCREEN_Y_COORDINATES * Master.SCREEN_RATIO || + position.y + size.magnitude() < 0 || position.y - position.magnitude() > Master.SCREEN_Y_COORDINATES); + } } diff --git a/src/main/java/core/math/Vector2D.java b/src/main/java/core/math/Vector2D.java index fa8050c..caa05ab 100644 --- a/src/main/java/core/math/Vector2D.java +++ b/src/main/java/core/math/Vector2D.java @@ -4,7 +4,7 @@ package core.math; import java.awt.*; /** - * A 2-dimensional Vector that can be used to store position or velocity + * A 2-dimensional Vector that can be used to store position or velocity or size or whatever */ public class Vector2D { @@ -44,6 +44,7 @@ public class Vector2D { return new Vector2D(point.x, point.y); } + /** * Add another Vector to this vector, modifies this object * @@ -123,6 +124,17 @@ public class Vector2D { return new Vector2D(a.x - b.x, a.y - b.y); } + /** + * Divide a Vector by a scalar + * + * @param a Vector a + * @param b Scalar b + * @return The result + */ + public static Vector2D divideS(Vector2D a, double b) { + return new Vector2D(a.x / b, a.y / b); + } + /** * Rotate a point around another point *

diff --git a/src/main/java/core/objects/base/DebugPos.java b/src/main/java/core/objects/base/DebugPos.java index 3299c63..d13c840 100644 --- a/src/main/java/core/objects/base/DebugPos.java +++ b/src/main/java/core/objects/base/DebugPos.java @@ -1,5 +1,6 @@ package core.objects.base; +import core.math.Coords; import core.math.Vector2D; import core.objects.core.GameObject; diff --git a/src/main/java/core/objects/core/CollGameObject.java b/src/main/java/core/objects/core/CollGameObject.java index 4a1c161..3213694 100644 --- a/src/main/java/core/objects/core/CollGameObject.java +++ b/src/main/java/core/objects/core/CollGameObject.java @@ -5,12 +5,16 @@ import core.objects.core.GameObject; import core.physics.Collidable; import core.physics.hitboxes.Hitbox; +import java.util.ArrayList; + /** * A specialization of GameObject with Collidable properties */ public abstract class CollGameObject extends GameObject implements Collidable { protected Hitbox hitbox; + protected ArrayList> ignores = new ArrayList<>(); + protected boolean isTrigger = false; public CollGameObject(Vector2D position, Vector2D size, Hitbox hitbox) { super(position, size); @@ -54,4 +58,18 @@ public abstract class CollGameObject extends GameObject implements Collidable { public Vector2D getSize() { return size; } + + @Override + public void onCollision() { + } + + @Override + public ArrayList> getIgnores() { + return ignores; + } + + @Override + public boolean isTrigger() { + return isTrigger; + } } diff --git a/src/main/java/core/objects/core/GameObject.java b/src/main/java/core/objects/core/GameObject.java index 3ebe307..d0b7eb1 100644 --- a/src/main/java/core/objects/core/GameObject.java +++ b/src/main/java/core/objects/core/GameObject.java @@ -1,18 +1,20 @@ package core.objects.core; import core.math.Coords; -import core.Drawable; -import core.Master; +import core.general.Drawable; +import core.general.Master; import core.math.Vector2D; import java.awt.*; /** * The GameObject class is the superclass of every GameObject that can be displayed on screen. It has the 2 - * {@link #update()} and {@link #draw(Graphics2D)} methods that have to be + * {@link #update()} and {@link #draw(Graphics2D)} methods that have to be overridden */ public abstract class GameObject implements Drawable { + protected boolean doesDespawn = true; + protected Vector2D position; protected Vector2D size; @@ -37,6 +39,12 @@ public abstract class GameObject implements Drawable { this.layer = 0; } + public void startUpdate(){ + if(Coords.outOfBounds(position, size)){ + destroy(); + } + update(); + } /** *

The update method is called every frame before the {@link #draw(Graphics2D)} method by the master object on each object. Everything @@ -99,7 +107,12 @@ public abstract class GameObject implements Drawable { Vector2D abs; - abs = (arg.contains("center")) ? Coords.getWorldCoords(getCenterPosition()) : Coords.getWorldCoords(position); + if(arg.contains("center")){ + abs = Coords.getWorldCoords(new Vector2D(position.x - size.x / 2, position.y - size.y / 2)); + } else { + abs = Coords.getWorldCoords(position); + } + Vector2D sizeAbs = Coords.getWorldCoords(size); g2d.setPaint(mainColor); @@ -121,7 +134,6 @@ public abstract class GameObject implements Drawable { g2d.fillRoundRect((int) abs.x, (int) abs.y, (int) sizeAbs.x, (int) sizeAbs.y, arcW, arcH); } - @Deprecated public void destroy() { master.destroy(this); } diff --git a/src/main/java/core/physics/Collidable.java b/src/main/java/core/physics/Collidable.java index 91f153c..1091f6e 100644 --- a/src/main/java/core/physics/Collidable.java +++ b/src/main/java/core/physics/Collidable.java @@ -3,10 +3,14 @@ package core.physics; import core.math.Vector2D; import core.physics.hitboxes.Hitbox; +import java.util.ArrayList; + public interface Collidable { Hitbox getHitbox(); Vector2D getCenterPos(); Vector2D getSize(); - + void onCollision(); + ArrayList> getIgnores(); + boolean isTrigger(); } diff --git a/src/main/java/core/physics/hitboxes/Hitbox.java b/src/main/java/core/physics/hitboxes/Hitbox.java index 00eb65f..4f005fa 100644 --- a/src/main/java/core/physics/hitboxes/Hitbox.java +++ b/src/main/java/core/physics/hitboxes/Hitbox.java @@ -1,11 +1,12 @@ package core.physics.hitboxes; -import core.Drawable; +import core.general.Drawable; import core.math.Vector2D; -import core.physics.Collision; public abstract class Hitbox implements Drawable { + + public static final int HITBOX_RENDER_LAYER = 1; private final boolean isTrigger; protected Hitbox(boolean isTrigger) { diff --git a/src/main/java/core/physics/hitboxes/RectHitBox.java b/src/main/java/core/physics/hitboxes/RectHitBox.java index bab67d0..866c9ca 100644 --- a/src/main/java/core/physics/hitboxes/RectHitBox.java +++ b/src/main/java/core/physics/hitboxes/RectHitBox.java @@ -1,7 +1,7 @@ package core.physics.hitboxes; import core.math.Coords; -import core.Master; +import core.general.Master; import core.math.Vector2D; import java.awt.*; @@ -31,7 +31,7 @@ public class RectHitBox extends Hitbox { this.x2 = Vector2D.add(x1, new Vector2D(size.x, 0)); this.y1 = Vector2D.add(x1, new Vector2D(0, size.y)); this.y2 = Vector2D.add(x1, new Vector2D(size.x, size.y)); - Master.getMaster().addDrawable(this, 1); + Master.getMaster().addDrawable(this, HITBOX_RENDER_LAYER); } /** @@ -46,7 +46,6 @@ public class RectHitBox extends Hitbox { this.x2 = Vector2D.add(x1, new Vector2D(size.x, 0)); this.y1 = Vector2D.add(x1, new Vector2D(0, size.y)); this.y2 = Vector2D.add(x1, new Vector2D(size.x, size.y)); - Master.getMaster().addDrawable(this, 1); } /** @@ -166,10 +165,10 @@ public class RectHitBox extends Hitbox { return y2; } - @Override +/* @Override public String toString() { return "RectHitBox{" + x1 + " " + x2 + "\n" + y1 + " " + y2 + "}"; - } + }*/ @Override public void draw(Graphics2D g2d) { @@ -177,7 +176,7 @@ public class RectHitBox extends Hitbox { Vector2D abs = Coords.getWorldCoords(x1); Vector2D sizeAbs = Coords.getWorldCoords(Vector2D.subtract(y2, x1)); - g2d.drawRect((int)abs.x, (int)abs.y, (int)sizeAbs.x, (int)sizeAbs.y); g2d.setPaint(Color.MAGENTA); + g2d.drawRect((int)abs.x, (int)abs.y, (int)sizeAbs.x, (int)sizeAbs.y); } } diff --git a/src/main/java/objects/GameObject.java b/src/main/java/objects/GameObject.java new file mode 100644 index 0000000..6234486 --- /dev/null +++ b/src/main/java/objects/GameObject.java @@ -0,0 +1,67 @@ +package objects; + +import core.general.Master; +import core.math.Vector2D; + +import java.awt.*; + +/** + * The GameObject class is the superclass of every GameObject that can be displayed on screen. It has the 2 + * {@link #update(Master)} and {@link #draw(Graphics2D, int, Master)} methods that have to be + */ +public abstract class GameObject { + + protected int w; + protected int h; + + protected Vector2D position; + protected Vector2D size; + + protected Vector2D velocity; + + public GameObject(double x, double y, double xSize, double ySize) { + this(new Vector2D(x, y), new Vector2D(xSize, ySize)); + } + + public GameObject(Vector2D position, Vector2D size) { + this.position = position; + this.size = size; + this.velocity = new Vector2D(); + } + + public abstract void draw(Graphics2D g2d, int w, Master master); + public abstract void update(Master master); + + + public double getMapCoords(double value, boolean isX){ + if (isX){ + return (position.x + value / 100 * size.x); + } else { + return (position.y + value / 100 * size.y); + } + } + + public double getMapCoordsSize(double value, boolean useX){ + if (useX){ + return (value / 100 * size.x); + } else { + return (value / 100 * size.y); + } + } + + public double getWorldCoords(double value, boolean isX){ + if (isX){ + return (value / 100 * w); + } else { + return (value / 100 * h); + } + } + + public int getWorldCoordsFromLocal(double value, boolean isX){ + return (int) getWorldCoords(getMapCoords(value, isX), isX); + } + + public int getWorldCoordsFromLocalSize(double value, boolean useX){ + return (int) getWorldCoords(getMapCoordsSize(value, useX), useX); + } +} diff --git a/src/main/java/objects/ships/BattleShip.java b/src/main/java/objects/ships/BattleShip.java index 6a036dd..999d06f 100644 --- a/src/main/java/objects/ships/BattleShip.java +++ b/src/main/java/objects/ships/BattleShip.java @@ -14,10 +14,9 @@ public class BattleShip extends GameObject { public BattleShip(Color mainColor) { this(20, 20, 10, 40, mainColor); - //TODO turret size should use w and h but correct just like with world coords - turrets.add(new Turret(this, 2.5, 10, 5, 3)); - //turrets.add(new Turret(this, 25, 10, 50, 2)); - //turrets.add(new Turret(this, 25, 70, 50, 2)); + turrets.add(new Turret(this, 2.5, 7, 5, 3)); + turrets.add(new Turret(this, 2.5, 15, 5, 3)); + turrets.add(new Turret(this, 2.5, 25, 5, 3)); } public BattleShip(double x, double y, double xSize, double ySize, Color mainColor) { diff --git a/src/main/java/objects/ships/Shell.java b/src/main/java/objects/ships/Shell.java index 991cf83..3c82ae7 100644 --- a/src/main/java/objects/ships/Shell.java +++ b/src/main/java/objects/ships/Shell.java @@ -1,20 +1,23 @@ package objects.ships; import core.math.Vector2D; -import core.objects.core.GameObject; +import core.objects.core.CollGameObject; +import core.physics.hitboxes.RectHitBox; import java.awt.*; /** * A shell fired by a cannon */ -public class Shell extends GameObject { +public class Shell extends CollGameObject { public Shell(Vector2D position, Vector2D size, Vector2D velocity) { - super(position, size/*, new RectHitBox(position, size)*/); + super(position, size, new RectHitBox(position, size)); this.velocity = velocity; this.mainColor = Color.ORANGE; + this.ignores.add(Shell.class); + this.isTrigger = true; } @Override @@ -26,4 +29,10 @@ public class Shell extends GameObject { public void update() { moveTo(Vector2D.add(position, velocity)); } + + @Override + public void onCollision() { + destroy(); + //master.debugPos(position); + } } diff --git a/src/main/java/objects/ships/Submarine.java b/src/main/java/objects/ships/Submarine.java index b9cfb6c..2b6dc4a 100644 --- a/src/main/java/objects/ships/Submarine.java +++ b/src/main/java/objects/ships/Submarine.java @@ -27,5 +27,4 @@ public class Submarine extends CollGameObject { Vector2D centerRelPos = new Vector2D(relPos.x - size.x/2, relPos.y - size.y/2); moveTo(centerRelPos); } - } diff --git a/src/main/java/objects/ships/Turret.java b/src/main/java/objects/ships/Turret.java index 86e480d..6ca7943 100644 --- a/src/main/java/objects/ships/Turret.java +++ b/src/main/java/objects/ships/Turret.java @@ -81,8 +81,8 @@ public class Turret extends GameObject { Point msLoc = master.getMouseLocation(); Vector2D mouseRel = Coords.getMapCoordsFromWorld(Vector2D.fromPoint(msLoc)); //100 correct - Vector2D center = battleShip.getMapCoords(getCenterPosition()); - double targetRotation = -Math.atan2(center.x - mouseRel.x, center.y - mouseRel.y); + Vector2D centerMap = battleShip.getMapCoords(getCenterPosition()); + double targetRotation = -Math.atan2(centerMap.x - mouseRel.x, centerMap.y - mouseRel.y); rotation = ExMath.angleLerp(rotation, targetRotation, ROTATION_SPEED); @@ -98,14 +98,13 @@ public class Turret extends GameObject { lastShot = System.currentTimeMillis(); Vector2D shellVel = Vector2D.getUnitVector(rotation).negative().multiply(SHELL_SPEED); - master.debugPos(battleShip.getMapCoords(center)); - master.debugPos(center); + //master.debugPos(centerMap); Vector2D pos = Vector2D.rotateAround( - battleShip.getMapCoords(center), + centerMap, spawnPosNR, rotation); - master.debugPos(pos); + //master.debugPos(pos); master.create(new Shell(pos, new Vector2D(SHELL_SIZE, SHELL_SIZE), shellVel)); } } diff --git a/target/classes/BasicEx$1.class b/target/classes/BasicEx$1.class deleted file mode 100644 index fd3f4b91be4be388cc75c6af3a78569475cf0c10..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 660 zcmX^0Z`VEs1_mnz4Ne9o24;2!79Ivx1~x_pPN&4;%w*RJ6+=b_wvvp@Vif~M22LNS zs5KV@2LmTN0~ZeiHv%Gw%o*GuyS6X{YrC_Qj0{i zEiUoMFD_wZ;PK4MOD%HFNh~f-EoM+)U}E54U|?Vr5CFv&0|NsS0|Ns$g9HO3gCqk3 zgB=4CScFSUdn*H@)^-N=jbJrW3=9lx42%p64Dt-p3=9ln5LFB^46+O$zy&sqk%5sx zoIwt1mNNq*SQWR{76!&G47}SIgb{{ufu)ofxEPd?4CICz$ju`hfK6CzhA!r)FMPcpc(`T2xd@}`0+6KGXyX)a22PPgk=_ICV?V_MI#ENM1~=V zhani0h}er#(~44yGZ-0Iobyvs85#I}GV@aXN^_G^i$XwdV`LBl#Y0Y5Vo@fD4;5r7 z$;d2bWZ;D72u22$+{8?<7o)L7JR<{3Vo`cABZDv&X+{R#oW$IultdMf87hX13{0sN zj0`+b!MxOR6$3^Fd5i#uh%#2;W~(CmXGf}$~`vLF>%Iq{MZEAi_^PO(svofC6%f-_4}tpyko_}Li> zKCfH;E$0|Nsq10$%~U|?hjVPIg01@jpgl(n`q zFludMVAtBsz!NDTptXyEkAY!3gV0t6QLQZuqT3iGH-e1|Wnf?sV_;=qVBlq7Vc=un zVBlwvW)NafVi0BsV_;z5VPIrnU{GcVXNUl+=VoAoTGhzF0+zGZ+RY#nxt&37D}%h2 z))of&Z4AocT0-jE7&Ns6*&GC!TedOiYB6qOFw|n(#$c+oo53L{6OC=LFt2mfuWqClA)SG5&-JV_*?)0 diff --git a/target/classes/core/Master.class b/target/classes/core/Master.class index e0c9a966bfc347574001c976f913239a25eec841..1d8e907d7e474bfc4be46086601aa494049e3fad 100644 GIT binary patch delta 4701 zcmZ2${NIM_)W2Q(7#J9=8K-XK;$$=uOwP~A$xKO1%1JGDDosmEE#hS0U{K;=P-YNk zWZ+CGN-PJgXH>AzWMmM^Ps&P7E-BV8&o9bJ(RVM(OyOeCU|{BA z;9$_G{LtPGZue=-`^8!_yOZ1)dbMlLwxHKs@u_!Yym7O7Mas!jNd?+ZyLKz}K4vAu9VAXJO0ofJI5Cam4oxGpP zfH8jZ2PUKXIEHkPPzECdJJ|OiWgHAyJPg?kIgAV(>8T~*nJFb1j10^gnx3Fo$m3zi z2T5_JrDV^DwMoSj)&Do|~AR>YSgKoLCZ`S(4$LpI2Oxm{(E^O2S@VUYZaCApR&R z%FIi*=3-dSu)&v|VIvR2CWg(748mZaqFTYoz+M2dFei_ZK~w|N3{cY8%CL={VLK1Q z4u+kROIe-yb~Ef@XV}Zbu#aIsBZJ7~g{&fzZ?UR!A7nVh&TyEA;RwUg$y{tn!p9j- zurr+GVK@a!IWph~o9xdcZURYRK8cm7MeGb`7#S46Qn0uLbDZ;Ya@-ShQ~kjO13SaH z$@AId*e>ueTx7U3`7oOrxZKQOHS6EG|*7mY-4RYll9)`aR>WmB=$@zIDiJ5uDAY1?QFfuT_VPxRUEDkBkOixcO z;$}F@$i&0Q%*evXz>}U@;+&c{S(!tTBb1SihmoC;W3ms2HOE;-E*?g1MxM$290vT1 ze2o0;i~>B2f{a3p3^J1!a>z`6#UaSa$j2zc!zjuqHkpOfgq2Z(kwI+oc^)w?E=F-i zDINw^M(N41oEA*`FUInf{Y40jEW#PvlXT0=9i^%F`Q=P z5@KLxsOM%>WmIElROeyTVAPzvi_?ysQJ05Nk5PZ}f6hQg)5(EcVw2Z%v4V>J$@N@I znHV!CD{))!@dlS9CTII57KDH*n8^{`5t9#a`v|g>Wag$aGBA2EGO&V}Mw7XCoZ02z z)raQh8lH8Gd<9&Lg^We)jKw^RC5)w;E%;a%8OtZz@=FUVGNuVI)-WdrZj4h0*&db zjKY)U`K6sX7&{pmbli#(b5j*c^7FG57;}qtK!ieCevv{c*Z~MWsKVuEW9$ZbqKAhu zgE3Qpv2XGkel?bfj0~!i83p7f_wlhavolVf{Ey$bo|}Oa6w(X~43dlnjQR|WjD`#h z3`~qh3|tKS3<3-c3_=WI4B`xoj3!`lQwAYW%?{_AF$gipBFURG2r)<@@j>bpkoe{d zObpx%JRq|`b%qj{QN&Qpz`!8Pz{tSLz{bGHXu-h1IG2Hk0aW3>oqR~Zs(v?vVB~fN z;jIjcT3Z+tp}cJjD&bnY88jldGiYsN(B93UAGwLaa65y!4~QwkU?sv}14ee67#y}U zIQuf&$qH~RVo=xF&EOWPBf{Vzz$Kf(lF%-~;3dmZz>=_?!DkzTe+x6?^8Yurbha^Q zYiWas-3;}?k-Hf}BeyezgD4ROFA)Z>?FZ zZ)9L#U}m&rU|uqbbxIVgQ$nw z#0|BHkH4twT6WkAa(kfngp43&VT{ zZiWR6;tUHJQrV8??ZwVr_?2I_hih6qL< zMqdU-1}g?7Mn6Vh24)6EMt_F=&`|e+#wFhlhArC|cKK*)?O-^d4NA#~=wx8nz`)M1 zk%5O{6W9t!Z1O>EU}s=w3}6fdg*9Uk!yAyf^$ZLQ`XB)Y1_oBGEez~yK;;%Vd9Z=Q zb{p6nNI0`X&0z#}VL-YW7#N%wn89g*OG{gO8^bXyQNN#oli>i^6o_lMpr$Y|a4`ng zGlqa|*JYRlHLwbr_mn{~r41?xwGT3!p2@%uiY4s>3}-&H)BNuwM{PR%75~U|^`f$-u&Jn}LtvK7$m)0|q&UhYacrj~L7t9x~W4 zJY(=-cn)0fnnYbh6j#}RxF^Lu#Mrd6{{rcPKM`<3^N&8 zK&-cn37XW-02gBhVnd<+FCmqRhSq+&ITEU%_I)ENgRw>;C#Zt zm<_TKT+7HaFeQU*VPF?w)Y{Cb12PHRDgdcqU|^78U}nq#mxsBGc?=8;Y78ul`3%gA pWsDV!)lgO~Vf46F=hlVzBUrSuu>co^&% zj2RhN-Gf|R{kRx(7#u;;PLng4WaL~J8N^{uD9*?%DAo@yP0CFy%FIh;XK9Wdz`>Br!;r#|%E-W&!N|bq2@*-?VaNcBlyfm;F=Vqd2-FtT7lMrLxck&6%m14AJXLlHyqH7^)|8u;k&INMg z8XktV4C^L$aHuhEn7p1topICT>m0Hi>lwCy;%e*US8P&}f(+Yv7}NPIIfPS<`w+unc7`K73`ZG`O>X5>=QzZ0f`{QG!>P$z zI2AZnGMwRIILmNuawV4*hbzMc9)^nymnN^~vgTOHaD|8AD#NwO@3;*38E!D#WM{a= z!*HA74kLriByO3>p4@_*3^y3=@i5$HcrZDc+k}U~`*iXi zZVOeA>z?y4ykJmaWMC^w&CM@M6=GmwDCA~%&G3eu;VlotJBIg@&3NqC89wtcd|~)H zxtb@C(O}|15hfdOmYT%7bn;4Gv&rvy!}xfEOA?c_eG>~pKzVkuGoRn&C47!dl3<0C zS@;DRGdBzIZ)D^%=3+EqG-YQr<6$&swAg%6fQ3=ZijhH7!v~z&auV~>_5H!w+gdY> zpN-Lmi-CjDmWNS;QB#1?e)4}oISofHhNX;7JdDnuNM|c8NJ%V76=2ZjXJd2&DR$>! z)MnHXVDy~qFRaGm!^ogIIbKkF@&sW4M!(4mg^laE7&t-RVPIg8WcbGLm4T7rI|Bm) z6T=S%E(U%E0R{#JAqFu9aRx?)Utsay3_=VFNc=wxLJYD<{J#uB3{pt^-waF)+zdQm zy%`LtU^)d%3o|e>unIA-F)%XxV_;x3VBlt8W?*30Hn~*9s(uTD+-?TJ$n6Zm+ZYtX zwRSV8Ms8guxPwtT!>(Zf9`t)zaC88{g{7Fl=RrWdxOa3J{+$GJ?&EV~Aj6Vq|7uWGH2DWMpAvW?*9AWMpN8 zh6IBQ17kf%7X!;C2Hp(}3=E85$AF|67!nwmK;;P}&=__xFoTT_)7r)mEx?(fwT&TO zKpXD? z7)lsI8A_3S8V2<#149@iJ0k}JBZCJ6A0sCt7XuR`HvpuC<7y?jD&i`oq>sg ziGhKETT6R8Lxono_BMtZknNCo-~)TIih-4(nt_X<25gfUL_ORlZm3O+j696IP*Z~$ zxWKBUwRSVqM`}aTKo~fty|yznvTb8%LRbP(+QJ~k&AWe82K3(85kM3 zVX2nEgn@|xgg(h%j21XeMMo=9Ib;tz;)4BRt7}| zX+{Z#R0bB1o8X@DWt3!;0;SY?246;LkZ%~I7>pTZ7*ZLS!5NpEftl|wgAgO*F9s1_;q{d9LS9Aspe$&jeKli@fc!vThsRxFY%I~h(h zGH8Rz9Sr9!StVJtmoivOu!3YRGcs&rxURjE;c`8gl{{k(gCbM{BnlF|JClKLH^ak7 zZAq5x43B-6|DU4+O0|%fQv#P#4;Yvj9x=!Vd8N$H2fK53U#(7}!M^K5S;l;z6k!RW=nz`(`8$mq@J%jnM_2>_*{f-wL9 diff --git a/target/classes/objects/DebugPos.class b/target/classes/objects/DebugPos.class deleted file mode 100644 index 1dfedb2beabc7aae4dd400993a44f5a99c619e51..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 876 zcmX^0Z`VEs1_mnzV=e|J24;2!79Ivx1~x_pq2&CcRQ=qB_o3fHZwUH#2F;m86fNW<@H%eh-5QR7m6evjUWn^G0El5c$No8c<3eGPrN=|jl z1UZZsW~Uw~z!(%61Q|FOK!BNn5tJqv7#UO<7#PwRm>HNE7#L)TG9V*V@g% z6uF&&cPoQ{)+PqAtqd|785kIt7}OXT7=##D7#J9M88{jE7(^KO8KfBm7}OaU7!)98 zFlaDnf~;VWVbEd_WncuE%b?95%D}|H$e_cZ3$@dMfti7cfq{WTOIt{O8-pUkd{DY# zU=U$oXAlLOD+W;qHGJ~Nw5(-U^XMv2u21& HuxE?_G!wGU diff --git a/target/classes/objects/ships/BattleShip.class b/target/classes/objects/ships/BattleShip.class index 431889524f545f62be0d0109726e01c7ede5cc46..66e57a4f43e3b41c3eaee4ca4051947900a0037d 100644 GIT binary patch delta 1021 zcmZn=x+BDO>ff$?3=9m`40RK^woAz{fB~C>2$*KzVi07I;$h%ske+x+ja!yMj-5fC zhe3fsaWXTbi8`Bu9z+?NgC&H)#h}ih!Ooxw(xS!4Ad{S5l&U}3ol#jrmO%$3sLRN} ztf3jk$-u#&&%M}{3w8!e9tJB0>&X`x<=Jd`80;AA zCx2r!WOL+UaAI(ttjpxYAL7Z(ngXA^_ znQ*Nw47|G;1S7RX7=%R_lyJ(ZAjxb5+Y!vbz#zuJ%D})Nz#zyV$e_(2#Nf&x%n;8Y z!Vm(M1KY?D$`A&Ql>|^YGcYnRaxic+@PHgP`2(A1y_(i;2HD8%4BA^6c(o)sw=(D< zj2B{HVPIeoXW(LxU=U@HWRPZ%0vm0|z{bG9AOkmAh9R6Gf`Jh%7ReC7zzk+ZF+_l! zC&LiU5W&C>7BgTlWZ-0A1Vs@P0}3PU zT?`Hk4BHr75U%3`+au2)$)LcX#-IpxnHa<@iTpvOx@D sU}i`Kr;9X(bZG2nFfcRZGZZqEFhE$P3?&Q|3?Qo+87dj78EP3M0p3rAS^xk5 delta 964 zcmca3)F8xl>ff$?3=9lb3>6c(whMYPfB_eSAcF)C12==@#M^4z(hM@}46-~7at!j5 zc^FLuxEK@}l-L=RK?+nD8N?^2Gb&3+GpK?1>WmD`8k%983>*xaJPcY4+LISCDzoYG zFz7MpPd?2k&27kF#Li&M!(hT-I{71`JexTWg9U@-WHBZ~HftUR8wT6SzD!OW(hT-I z3=RyAlczHovN?mqT_&GnQe$)DVQ^>g*!+v>BqLuk7efj|Dmz0O4?{Xb#^#GGER0@R zj0~b0K3R!niTXK-dFlH8Nm;4MCDxi@{A>(4TnroxxjYQ93~>SsQT(h71t4!0@-Rd& zs53I~c;@A$7CGl678j=$von-TmS@vqDPv@in;g$7K3Rd4eR4J%pROVU0|O(25CcDh z00ScfD72UuycpOR7#X-3ycrl7d>9xQG8niSm>3usbS5ujldoqMVGw28&LF;xK`MMB z0|NsSgD(RE10Mr30|SEqgCK(tgEoUGgC7F}gBU~?gFiz6I1+R~!NT|X+m}zZc;MLy6V8y_&jlmA#JV+oYFi0{e zGN>^qfn5d(1a-K})EUAU!oh(M!JrPc(VBq?>{ecoxw{yg(2V5*J4cOyhe4ge59EJP z;4v`pLd|4kh-8R@n&ia51Xj!iGD#aXiXg^lF>o?yBe{$VY6=4b7eh2d33xplJkpF^$Rj8i!+mp^)oU{lJYB3i}iz2lS@1@ zOPum6xEL52Sa=v%8Q3Nonj3R5a4>MPGjM?fxM8~Uld@8iON#ZuMmgu_9|JvomTa@G|J}Fz7P~GBR)! z~+3?RV5z{tSLV9UVBV8_6~(9Xclz{0@5psl5?vzvi2Qd?&`1M_wU zb}ikl3_Mz!7=*SmNN88fSY9uHk*NgRcjlA cCCC6>NJu~&rp&;?po(MyE8GN6aF}@k0Bhr$@Bjb+ delta 519 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 diff --git a/target/classes/objects/world/Grid.class b/target/classes/objects/world/Grid.class index c26fd1ec5ac4ace63db08fc0404f249b813e597e..488ac1a3802f0a77b5a20698efd14ccf897ee01d 100644 GIT binary patch delta 40 vcmZqX?BJ9?^>5cc1_lOe274|BCI)791{NL$Rt7dk2ASmiqE!8jQkg6Ozsv|# delta 35 qcmeC+Z03|Y^>5cc1_lNz274|BCI)791{NL$Rt7dk2JwyZnJfU8X9jlw