Compare commits
19 Commits
Mick
...
Connection
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
15492cb91d | ||
|
|
4b7eaaa641 | ||
|
|
9349e6ce48 | ||
|
|
c07c86098a | ||
|
|
c8325ba55c | ||
|
|
95a582b91e | ||
|
|
ab3d57bc7f | ||
|
|
3dbffa4ffb | ||
|
|
23cf4d120e | ||
|
|
737e1ac1cb | ||
|
|
3827098c42 | ||
|
|
f942bbbc92 | ||
|
|
8b4538da39 | ||
|
|
f32a1b34c3 | ||
|
|
1285e1ae82 | ||
|
|
c9a6907fca | ||
|
|
be0703ba61 | ||
|
|
087c3a7193 | ||
|
|
42d88e434f |
Binary file not shown.
|
Before Width: | Height: | Size: 51 KiB After Width: | Height: | Size: 80 KiB |
BIN
core/assets/square.png
Normal file
BIN
core/assets/square.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 913 B |
BIN
core/assets/square2.png
Normal file
BIN
core/assets/square2.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 907 B |
@@ -1,104 +0,0 @@
|
|||||||
package netwerkprog.game.client;
|
|
||||||
|
|
||||||
import netwerkprog.game.util.application.Controller;
|
|
||||||
import netwerkprog.game.util.data.Data;
|
|
||||||
import netwerkprog.game.util.data.ParserCallback;
|
|
||||||
|
|
||||||
import java.io.DataInputStream;
|
|
||||||
import java.io.DataOutputStream;
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.net.Socket;
|
|
||||||
import java.util.Arrays;
|
|
||||||
|
|
||||||
public class Client extends Controller implements ParserCallback {
|
|
||||||
private final int port;
|
|
||||||
private final String hostname;
|
|
||||||
private final Parser parser;
|
|
||||||
private boolean isConnected = true;
|
|
||||||
private Socket socket;
|
|
||||||
private Thread receiveThread;
|
|
||||||
private DataOutputStream outputStream;
|
|
||||||
|
|
||||||
public Client(String hostname) {
|
|
||||||
this.port = Data.port();
|
|
||||||
this.hostname = hostname;
|
|
||||||
this.parser = new Parser(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Starts the client process.
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public void run() {
|
|
||||||
this.connect();
|
|
||||||
this.receiveThread.start();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Connects the client to the server.
|
|
||||||
*/
|
|
||||||
public void connect() {
|
|
||||||
System.out.println("[CLIENT] connecting to server on port " + this.port);
|
|
||||||
try {
|
|
||||||
this.socket = new Socket(this.hostname, this.port);
|
|
||||||
DataInputStream in = new DataInputStream(socket.getInputStream());
|
|
||||||
this.outputStream = new DataOutputStream(socket.getOutputStream());
|
|
||||||
|
|
||||||
this.receiveThread = new Thread( () -> receive(in));
|
|
||||||
|
|
||||||
} catch (IOException e) {
|
|
||||||
System.out.println("[CLIENT] there was an error connecting : " + e.getMessage());
|
|
||||||
StringBuilder sb = new StringBuilder(" Stacktrace : ");
|
|
||||||
Arrays.stream(e.getStackTrace()).forEach(n -> sb.append("\t\t").append(n).append("\n"));
|
|
||||||
System.out.println(sb.toString());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Sends a message to the server.
|
|
||||||
* @param message The message to send.
|
|
||||||
*/
|
|
||||||
public void send(String message) {
|
|
||||||
try {
|
|
||||||
this.outputStream.writeUTF(message);
|
|
||||||
} catch (IOException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Receives a message from the server.
|
|
||||||
* @param in The inputStream
|
|
||||||
*/
|
|
||||||
public void receive(DataInputStream in) {
|
|
||||||
while (isConnected) {
|
|
||||||
try {
|
|
||||||
this.parser.parse(in.readUTF());
|
|
||||||
} catch (IOException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void disconnect() {
|
|
||||||
this.isConnected = false;
|
|
||||||
try {
|
|
||||||
this.receiveThread.join();
|
|
||||||
} catch (InterruptedException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
|
|
||||||
send("Disconnect");
|
|
||||||
|
|
||||||
try {
|
|
||||||
this.socket.close();
|
|
||||||
} catch (IOException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onDataReceived(String data) {
|
|
||||||
System.out.println(data);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -3,23 +3,35 @@ package netwerkprog.game.client;
|
|||||||
import com.badlogic.gdx.ApplicationAdapter;
|
import com.badlogic.gdx.ApplicationAdapter;
|
||||||
import com.badlogic.gdx.Files;
|
import com.badlogic.gdx.Files;
|
||||||
import com.badlogic.gdx.Gdx;
|
import com.badlogic.gdx.Gdx;
|
||||||
|
import com.badlogic.gdx.assets.AssetManager;
|
||||||
import com.badlogic.gdx.audio.Music;
|
import com.badlogic.gdx.audio.Music;
|
||||||
import com.badlogic.gdx.graphics.GL20;
|
import com.badlogic.gdx.graphics.GL20;
|
||||||
import com.badlogic.gdx.graphics.OrthographicCamera;
|
import com.badlogic.gdx.graphics.OrthographicCamera;
|
||||||
import com.badlogic.gdx.graphics.Texture;
|
import com.badlogic.gdx.graphics.Texture;
|
||||||
|
import com.badlogic.gdx.graphics.g2d.BitmapFont;
|
||||||
|
import com.badlogic.gdx.graphics.g2d.GlyphLayout;
|
||||||
import com.badlogic.gdx.graphics.g2d.SpriteBatch;
|
import com.badlogic.gdx.graphics.g2d.SpriteBatch;
|
||||||
|
|
||||||
import com.badlogic.gdx.graphics.g2d.TextureRegion;
|
import com.badlogic.gdx.graphics.g2d.TextureRegion;
|
||||||
|
import netwerkprog.game.client.game.GAMESTATE;
|
||||||
|
import netwerkprog.game.client.game.characters.Agent;
|
||||||
import netwerkprog.game.client.game.characters.Hacker;
|
import netwerkprog.game.client.game.characters.Hacker;
|
||||||
|
import netwerkprog.game.client.game.characters.Team;
|
||||||
import netwerkprog.game.client.game.characters.abilities.BodySwap;
|
import netwerkprog.game.client.game.characters.abilities.BodySwap;
|
||||||
|
import netwerkprog.game.client.game.connections.Client;
|
||||||
|
import netwerkprog.game.client.game.map.GameInputProcessor;
|
||||||
|
import netwerkprog.game.client.game.map.GameTile;
|
||||||
import netwerkprog.game.client.game.map.Map;
|
import netwerkprog.game.client.game.map.Map;
|
||||||
import netwerkprog.game.client.game.map.MapRenderer;
|
import netwerkprog.game.client.game.map.MapRenderer;
|
||||||
import netwerkprog.game.client.game.map.GameInputProcessor;
|
import netwerkprog.game.util.data.Data;
|
||||||
|
import netwerkprog.game.util.data.DataCallback;
|
||||||
|
import netwerkprog.game.util.game.Faction;
|
||||||
import netwerkprog.game.util.game.GameCharacter;
|
import netwerkprog.game.util.game.GameCharacter;
|
||||||
import netwerkprog.game.util.graphics.FrameRate;
|
import netwerkprog.game.util.graphics.FrameRate;
|
||||||
import netwerkprog.game.util.tree.BST;
|
import netwerkprog.game.util.graphics.TextRenderer;
|
||||||
|
|
||||||
public class MainGame extends ApplicationAdapter {
|
import java.awt.*;
|
||||||
|
|
||||||
|
public class MainGame extends ApplicationAdapter implements DataCallback {
|
||||||
SpriteBatch batch;
|
SpriteBatch batch;
|
||||||
float screenWidth;
|
float screenWidth;
|
||||||
float screenHeight;
|
float screenHeight;
|
||||||
@@ -28,12 +40,17 @@ public class MainGame extends ApplicationAdapter {
|
|||||||
private OrthographicCamera camera;
|
private OrthographicCamera camera;
|
||||||
private GameInputProcessor gameInputProcessor;
|
private GameInputProcessor gameInputProcessor;
|
||||||
private GameCharacter selectedCharacter;
|
private GameCharacter selectedCharacter;
|
||||||
|
private Team team;
|
||||||
|
private Team enemyTeam;
|
||||||
|
private TextRenderer textRenderer;
|
||||||
|
private BitmapFont font;
|
||||||
|
private GlyphLayout layout;
|
||||||
|
private GAMESTATE gamestate;
|
||||||
|
private Faction chosenFaction;
|
||||||
|
|
||||||
private Map map;
|
private Map map;
|
||||||
public MapRenderer mapRenderer;
|
public MapRenderer mapRenderer;
|
||||||
|
public AssetManager assets;
|
||||||
private BST<GameCharacter> tree;
|
|
||||||
public GameCharacter testCharacter;
|
|
||||||
|
|
||||||
private static MainGame INSTANCE;
|
private static MainGame INSTANCE;
|
||||||
|
|
||||||
@@ -55,17 +72,20 @@ public class MainGame extends ApplicationAdapter {
|
|||||||
screenHeight = Gdx.graphics.getHeight();
|
screenHeight = Gdx.graphics.getHeight();
|
||||||
frameRate = new FrameRate();
|
frameRate = new FrameRate();
|
||||||
camera = new OrthographicCamera(Gdx.graphics.getWidth(), Gdx.graphics.getHeight());
|
camera = new OrthographicCamera(Gdx.graphics.getWidth(), Gdx.graphics.getHeight());
|
||||||
|
textRenderer = new TextRenderer();
|
||||||
|
font = new BitmapFont();
|
||||||
|
layout = new GlyphLayout();
|
||||||
|
assets = new AssetManager();
|
||||||
|
|
||||||
String[] strings = new String[]{
|
String[] strings = new String[]{
|
||||||
"#########################",
|
"#########################",
|
||||||
"#xxxx #",
|
"#xxxx #",
|
||||||
"# x #",
|
"# x #",
|
||||||
"# xxxx #",
|
"# xxxx xxxxx #",
|
||||||
"# xx #",
|
"# xxxx xxxxx #",
|
||||||
"# x #",
|
"# xxxx xx xx #",
|
||||||
"# x #",
|
"# x xxxxx #",
|
||||||
"# x #",
|
"# x xxxx #",
|
||||||
"# x #",
|
"# x #",
|
||||||
"# xxxxxx #",
|
"# xxxxxx #",
|
||||||
"# x #",
|
"# x #",
|
||||||
@@ -80,28 +100,39 @@ public class MainGame extends ApplicationAdapter {
|
|||||||
camera.viewportWidth = screenWidth / 2;
|
camera.viewportWidth = screenWidth / 2;
|
||||||
camera.viewportHeight = screenHeight / 2;
|
camera.viewportHeight = screenHeight / 2;
|
||||||
camera.update();
|
camera.update();
|
||||||
this.tree = new BST<>();
|
setGamestate(GAMESTATE.SELECTING_FACTION);
|
||||||
initCharacters();
|
|
||||||
// this.tree.insert(new Hacker(,new BodySwap()));
|
// this.tree.insert(new Hacker(,new BodySwap()));
|
||||||
|
|
||||||
|
|
||||||
// playSong();
|
// playSong();
|
||||||
|
|
||||||
|
|
||||||
// connectToServer();
|
connectToServer();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void initCharacters() {
|
public void initCharacters() {
|
||||||
Texture texture = new Texture(Gdx.files.internal("core/assets/characters.png"));
|
assets.load("core/assets/characters.png", Texture.class);
|
||||||
|
assets.finishLoading();
|
||||||
|
Texture texture = assets.get("core/assets/characters.png");
|
||||||
TextureRegion[][] characters = TextureRegion.split(texture, 32, 32);
|
TextureRegion[][] characters = TextureRegion.split(texture, 32, 32);
|
||||||
this.testCharacter = new Hacker("harry",characters[1][0], new BodySwap("test"));
|
this.team = new Team();
|
||||||
GameCharacter character2 = new Hacker("test2",characters[2][0], new BodySwap("test"));
|
|
||||||
// this.tree.insert(testCharacter);
|
for (int i = 1; i <= 5; i++) {
|
||||||
// this.tree.insert(character2);
|
GameCharacter temp = new Hacker("hacker" + i, characters[5][0], new BodySwap("test"));
|
||||||
// this.tree.insert(new Agent(characters[2][0], new Implant("test")));
|
mapRenderer.getGameTiles()[1][i].visit(temp);
|
||||||
this.setSelectedCharacter(testCharacter);
|
if (chosenFaction == Faction.HACKER) {
|
||||||
mapRenderer.getGameTiles()[0][1].visit(testCharacter);
|
this.team.addMember(temp);
|
||||||
mapRenderer.getGameTiles()[0][2].visit(character2);
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int i = 1; i <= 5; i++) {
|
||||||
|
GameCharacter temp = new Agent("Agent" + i, characters[11][0], new BodySwap("Test"));
|
||||||
|
mapRenderer.getGameTiles()[3][i].visit(temp);
|
||||||
|
if (chosenFaction == Faction.MEGACORPORATION) {
|
||||||
|
this.team.addMember(temp);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
this.setSelectedCharacter(this.team.get(0));
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -118,7 +149,7 @@ public class MainGame extends ApplicationAdapter {
|
|||||||
|
|
||||||
|
|
||||||
private void connectToServer() {
|
private void connectToServer() {
|
||||||
client = new Thread(new Client("localhost"));
|
client = new Thread(new Client("localhost", this));
|
||||||
try {
|
try {
|
||||||
client.start();
|
client.start();
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
@@ -131,12 +162,36 @@ public class MainGame extends ApplicationAdapter {
|
|||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public void render() {
|
public void render() {
|
||||||
update();
|
if (this.gamestate == GAMESTATE.PLAYING) {
|
||||||
// clear screen
|
update();
|
||||||
Gdx.gl.glClearColor(0, 0, 0, 1);
|
// clear screen
|
||||||
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
|
Gdx.gl.glClearColor(0, 0, 0, 1);
|
||||||
mapRenderer.render();
|
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
|
||||||
frameRate.render();
|
mapRenderer.render();
|
||||||
|
frameRate.render();
|
||||||
|
renderText();
|
||||||
|
} else if (this.gamestate == GAMESTATE.SELECTING_FACTION) {
|
||||||
|
renderString("FACTION SELECT\nPress 1 for mega corporation, press 2 for hackers", Gdx.graphics.getWidth() / 2f, Gdx.graphics.getHeight() / 2f);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private void renderText() {
|
||||||
|
String text = "FACION: " + chosenFaction;
|
||||||
|
text += "\nSelected character: " + selectedCharacter.getName();
|
||||||
|
text += "\nHealth: " + selectedCharacter.getHealth();
|
||||||
|
layout.setText(font, text);
|
||||||
|
textRenderer.render(text, Gdx.graphics.getWidth() - layout.width - 5, Gdx.graphics.getHeight() - 3);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void renderString(String text) {
|
||||||
|
layout.setText(font, text);
|
||||||
|
textRenderer.render(text, Gdx.graphics.getWidth() - layout.width - 5, Gdx.graphics.getHeight() - 3);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void renderString(String text, float x, float y) {
|
||||||
|
layout.setText(font, text);
|
||||||
|
textRenderer.render(text, x - layout.width / 2f, x - layout.height / 2f);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -155,6 +210,7 @@ public class MainGame extends ApplicationAdapter {
|
|||||||
screenWidth = width;
|
screenWidth = width;
|
||||||
frameRate.resize(width, height);
|
frameRate.resize(width, height);
|
||||||
mapRenderer.resize(width, height);
|
mapRenderer.resize(width, height);
|
||||||
|
textRenderer.resize(width, height);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -165,6 +221,8 @@ public class MainGame extends ApplicationAdapter {
|
|||||||
@Override
|
@Override
|
||||||
public void dispose() {
|
public void dispose() {
|
||||||
batch.dispose();
|
batch.dispose();
|
||||||
|
textRenderer.dispose();
|
||||||
|
assets.dispose();
|
||||||
}
|
}
|
||||||
|
|
||||||
public float getScreenWidth() {
|
public float getScreenWidth() {
|
||||||
@@ -183,13 +241,27 @@ public class MainGame extends ApplicationAdapter {
|
|||||||
return map.getWidth();
|
return map.getWidth();
|
||||||
}
|
}
|
||||||
|
|
||||||
public BST<GameCharacter> getTree() {
|
|
||||||
return tree;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setSelectedCharacter(GameCharacter character) {
|
public void setSelectedCharacter(GameCharacter character) {
|
||||||
this.selectedCharacter = character;
|
this.selectedCharacter = character;
|
||||||
System.out.println("selected character set to : " + character);
|
GameTile characterTile = mapRenderer.getTile(character);
|
||||||
|
Point pos = mapRenderer.getPos(characterTile);
|
||||||
|
mapRenderer.setSurroundedTilesOfCurrentCharacter(pos.x, pos.y);
|
||||||
|
}
|
||||||
|
|
||||||
|
public GAMESTATE getGamestate() {
|
||||||
|
return gamestate;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setGamestate(GAMESTATE gamestate) {
|
||||||
|
this.gamestate = gamestate;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Faction getChosenFaction() {
|
||||||
|
return chosenFaction;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setChosenFaction(Faction chosenFaction) {
|
||||||
|
this.chosenFaction = chosenFaction;
|
||||||
}
|
}
|
||||||
|
|
||||||
public GameCharacter getSelectedCharacter() {
|
public GameCharacter getSelectedCharacter() {
|
||||||
@@ -199,4 +271,13 @@ public class MainGame extends ApplicationAdapter {
|
|||||||
public boolean hasCharacterSelected() {
|
public boolean hasCharacterSelected() {
|
||||||
return selectedCharacter != null;
|
return selectedCharacter != null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Team getTeam() {
|
||||||
|
return team;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onDataReceived(Data data) {
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,15 +0,0 @@
|
|||||||
package netwerkprog.game.client;
|
|
||||||
|
|
||||||
import netwerkprog.game.util.data.ParserCallback;
|
|
||||||
|
|
||||||
public class Parser {
|
|
||||||
private final ParserCallback callback;
|
|
||||||
|
|
||||||
public Parser(ParserCallback callback) {
|
|
||||||
this.callback = callback;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void parse(String data) {
|
|
||||||
callback.onDataReceived(data);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
6
core/src/netwerkprog/game/client/game/GAMESTATE.java
Normal file
6
core/src/netwerkprog/game/client/game/GAMESTATE.java
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
package netwerkprog.game.client.game;
|
||||||
|
|
||||||
|
public enum GAMESTATE {
|
||||||
|
PLAYING,
|
||||||
|
SELECTING_FACTION
|
||||||
|
}
|
||||||
@@ -1,15 +0,0 @@
|
|||||||
package netwerkprog.game.client.game;
|
|
||||||
|
|
||||||
import netwerkprog.game.util.application.Controller;
|
|
||||||
|
|
||||||
public class Game extends Controller {
|
|
||||||
|
|
||||||
|
|
||||||
public Game() {
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void run() {
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,14 +0,0 @@
|
|||||||
package netwerkprog.game.client.game;
|
|
||||||
|
|
||||||
import netwerkprog.game.util.application.Controller;
|
|
||||||
|
|
||||||
public class Graphics extends Controller {
|
|
||||||
public Graphics() {
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void run() {
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -6,7 +6,7 @@ import netwerkprog.game.util.game.Faction;
|
|||||||
import netwerkprog.game.util.game.GameCharacter;
|
import netwerkprog.game.util.game.GameCharacter;
|
||||||
|
|
||||||
public class Agent extends GameCharacter {
|
public class Agent extends GameCharacter {
|
||||||
public Agent(TextureRegion textureRegion, Ability... abilities) {
|
public Agent(String name, TextureRegion textureRegion, Ability... abilities) {
|
||||||
super("Agent", Faction.MEGACORPORATION, textureRegion, abilities);
|
super(name, Faction.MEGACORPORATION, textureRegion, abilities);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
package netwerkprog.game.client.game.characters;
|
package netwerkprog.game.client.game.characters;
|
||||||
|
|
||||||
import com.badlogic.gdx.graphics.g2d.TextureRegion;
|
import com.badlogic.gdx.graphics.g2d.TextureRegion;
|
||||||
import netwerkprog.game.util.game.GameCharacter;
|
|
||||||
import netwerkprog.game.util.game.Faction;
|
import netwerkprog.game.util.game.Faction;
|
||||||
|
import netwerkprog.game.util.game.GameCharacter;
|
||||||
|
|
||||||
public class DevTest1 extends GameCharacter {
|
public class DevTest1 extends GameCharacter {
|
||||||
public DevTest1() {
|
public DevTest1() {
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
package netwerkprog.game.client.game.characters;
|
package netwerkprog.game.client.game.characters;
|
||||||
|
|
||||||
import netwerkprog.game.util.game.GameCharacter;
|
|
||||||
import netwerkprog.game.util.game.Faction;
|
import netwerkprog.game.util.game.Faction;
|
||||||
|
import netwerkprog.game.util.game.GameCharacter;
|
||||||
|
|
||||||
public class DevTest2 extends GameCharacter {
|
public class DevTest2 extends GameCharacter {
|
||||||
public DevTest2() {
|
public DevTest2() {
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
package netwerkprog.game.client.game.characters;
|
package netwerkprog.game.client.game.characters;
|
||||||
|
|
||||||
import netwerkprog.game.util.game.GameCharacter;
|
|
||||||
import netwerkprog.game.util.game.Faction;
|
import netwerkprog.game.util.game.Faction;
|
||||||
|
import netwerkprog.game.util.game.GameCharacter;
|
||||||
|
|
||||||
public class DevTest3 extends GameCharacter {
|
public class DevTest3 extends GameCharacter {
|
||||||
public DevTest3() {
|
public DevTest3() {
|
||||||
|
|||||||
64
core/src/netwerkprog/game/client/game/characters/Team.java
Normal file
64
core/src/netwerkprog/game/client/game/characters/Team.java
Normal file
@@ -0,0 +1,64 @@
|
|||||||
|
package netwerkprog.game.client.game.characters;
|
||||||
|
|
||||||
|
import netwerkprog.game.util.game.GameCharacter;
|
||||||
|
import netwerkprog.game.util.tree.BST;
|
||||||
|
|
||||||
|
public class Team {
|
||||||
|
private BST<GameCharacter> members;
|
||||||
|
|
||||||
|
public Team() {
|
||||||
|
this.members = new BST<>();
|
||||||
|
}
|
||||||
|
|
||||||
|
public Team(BST<GameCharacter> characters) {
|
||||||
|
this.members = characters;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void addMember(GameCharacter gameCharacter) {
|
||||||
|
if (this.members.getSize() != 6)
|
||||||
|
this.members.insert(gameCharacter);
|
||||||
|
}
|
||||||
|
|
||||||
|
public BST<GameCharacter> getMembers() {
|
||||||
|
return this.members;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setMembers(BST<GameCharacter> members) {
|
||||||
|
this.members = members;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void addMember(GameCharacter... characters) {
|
||||||
|
for (GameCharacter gameCharacter : characters) {
|
||||||
|
this.members.insert(gameCharacter);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public GameCharacter get(GameCharacter character) {
|
||||||
|
for (GameCharacter cur : this.members) {
|
||||||
|
if (cur.equals(character)) {
|
||||||
|
return cur;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public GameCharacter get(int position) {
|
||||||
|
if (position >= this.members.getSize()) {
|
||||||
|
throw new IndexOutOfBoundsException("position out of range");
|
||||||
|
}
|
||||||
|
int i = 0;
|
||||||
|
for (GameCharacter cur : this.members) {
|
||||||
|
if (i == position) return cur;
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isDead() {
|
||||||
|
int dead = 0;
|
||||||
|
for (GameCharacter character : this.members) {
|
||||||
|
if (character.isDead()) dead++;
|
||||||
|
}
|
||||||
|
return dead >= this.members.getSize();
|
||||||
|
}
|
||||||
|
}
|
||||||
127
core/src/netwerkprog/game/client/game/connections/Client.java
Normal file
127
core/src/netwerkprog/game/client/game/connections/Client.java
Normal file
@@ -0,0 +1,127 @@
|
|||||||
|
package netwerkprog.game.client.game.connections;
|
||||||
|
|
||||||
|
import netwerkprog.game.util.application.Controller;
|
||||||
|
import netwerkprog.game.util.data.ConnectionData;
|
||||||
|
import netwerkprog.game.util.data.Data;
|
||||||
|
import netwerkprog.game.util.data.DataCallback;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.ObjectInputStream;
|
||||||
|
import java.io.ObjectOutputStream;
|
||||||
|
import java.net.Socket;
|
||||||
|
import java.util.Arrays;
|
||||||
|
|
||||||
|
public class Client extends Controller {
|
||||||
|
private final int port;
|
||||||
|
private final String hostname;
|
||||||
|
private boolean isConnected;
|
||||||
|
private Socket socket;
|
||||||
|
private Thread receiveThread;
|
||||||
|
private DataCallback callback;
|
||||||
|
private ObjectOutputStream outputStream;
|
||||||
|
private boolean connecting;
|
||||||
|
|
||||||
|
public Client(String hostname, DataCallback callback) {
|
||||||
|
this.port = Data.port();
|
||||||
|
this.hostname = hostname;
|
||||||
|
this.callback = callback;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Starts the client process.
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
this.connect();
|
||||||
|
this.receiveThread.start();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Connects the client to the server.
|
||||||
|
*/
|
||||||
|
public void connect() {
|
||||||
|
System.out.println("[CLIENT] connecting to server on port " + this.port);
|
||||||
|
this.connecting = true;
|
||||||
|
try {
|
||||||
|
this.socket = new Socket(this.hostname, this.port);
|
||||||
|
ObjectInputStream in = new ObjectInputStream(socket.getInputStream());
|
||||||
|
this.outputStream = new ObjectOutputStream(socket.getOutputStream());
|
||||||
|
register(in);
|
||||||
|
this.receiveThread = new Thread( () -> receive(in));
|
||||||
|
} catch (IOException e) {
|
||||||
|
this.connecting = false;
|
||||||
|
System.out.println("[CLIENT] there was an error connecting : " + e.getMessage());
|
||||||
|
StringBuilder sb = new StringBuilder(" Stacktrace : ");
|
||||||
|
Arrays.stream(e.getStackTrace()).forEach(n -> sb.append("\t\t").append(n).append("\n"));
|
||||||
|
System.out.println(sb.toString());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void register(ObjectInputStream in) {
|
||||||
|
while (connecting) {
|
||||||
|
String username = "DEV";
|
||||||
|
send(new ConnectionData("Connect", username));
|
||||||
|
try {
|
||||||
|
Object object = in.readObject();
|
||||||
|
if (object instanceof Data) {
|
||||||
|
Data data = (Data) object;
|
||||||
|
if (data.getPayload() instanceof ConnectionData) {
|
||||||
|
ConnectionData connectionData = (ConnectionData) data.getPayload();
|
||||||
|
if (connectionData.getAction().equals("Connect") && connectionData.getMessage().equals("Confirm")){
|
||||||
|
this.connecting = false;
|
||||||
|
this.isConnected = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (IOException | ClassNotFoundException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sends a message to the server.
|
||||||
|
* @param data The message to send.
|
||||||
|
*/
|
||||||
|
public void send(Data data) {
|
||||||
|
try {
|
||||||
|
this.outputStream.writeObject(data);
|
||||||
|
} catch (IOException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Receives a message from the server.
|
||||||
|
* @param in The inputStream
|
||||||
|
*/
|
||||||
|
public void receive(ObjectInputStream in) {
|
||||||
|
while (isConnected) {
|
||||||
|
try {
|
||||||
|
Object object = in.readObject();
|
||||||
|
if (object instanceof Data) {
|
||||||
|
callback.onDataReceived((Data) object);
|
||||||
|
}
|
||||||
|
} catch (IOException | ClassNotFoundException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void disconnect() {
|
||||||
|
this.isConnected = false;
|
||||||
|
try {
|
||||||
|
this.receiveThread.join();
|
||||||
|
} catch (InterruptedException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
|
||||||
|
send(new ConnectionData("Disconnect", "DEV"));
|
||||||
|
|
||||||
|
try {
|
||||||
|
this.socket.close();
|
||||||
|
} catch (IOException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -8,6 +8,8 @@ import com.badlogic.gdx.math.MathUtils;
|
|||||||
import com.badlogic.gdx.math.Vector3;
|
import com.badlogic.gdx.math.Vector3;
|
||||||
import com.badlogic.gdx.utils.TimeUtils;
|
import com.badlogic.gdx.utils.TimeUtils;
|
||||||
import netwerkprog.game.client.MainGame;
|
import netwerkprog.game.client.MainGame;
|
||||||
|
import netwerkprog.game.client.game.GAMESTATE;
|
||||||
|
import netwerkprog.game.util.game.Faction;
|
||||||
import netwerkprog.game.util.game.GameCharacter;
|
import netwerkprog.game.util.game.GameCharacter;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
@@ -89,25 +91,41 @@ public class GameInputProcessor implements InputProcessor {
|
|||||||
@Override
|
@Override
|
||||||
public boolean keyUp(int keycode) {
|
public boolean keyUp(int keycode) {
|
||||||
// System.out.println(camera.position.x + " , " + camera.position.y);
|
// System.out.println(camera.position.x + " , " + camera.position.y);
|
||||||
if (keysList.contains(keycode)) {
|
if (mainGame.getGamestate() == GAMESTATE.PLAYING) {
|
||||||
if (keycode == keysList.get(0)) {
|
|
||||||
this.isWPressed = false;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
if (keycode == keysList.get(1)) {
|
|
||||||
this.isAPressed = false;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
if (keycode == keysList.get(2)) {
|
|
||||||
this.isSPressed = false;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
if (keycode == keysList.get(3)) {
|
|
||||||
this.isDPressed = false;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
if (keysList.contains(keycode)) {
|
||||||
|
if (keycode == keysList.get(0)) {
|
||||||
|
this.isWPressed = false;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if (keycode == keysList.get(1)) {
|
||||||
|
this.isAPressed = false;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if (keycode == keysList.get(2)) {
|
||||||
|
this.isSPressed = false;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if (keycode == keysList.get(3)) {
|
||||||
|
this.isDPressed = false;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
} else if (mainGame.getGamestate() == GAMESTATE.SELECTING_FACTION) {
|
||||||
|
if (keycode == Input.Keys.NUM_1) {
|
||||||
|
System.out.println("MEGA CORP");
|
||||||
|
mainGame.setChosenFaction(Faction.MEGACORPORATION);
|
||||||
|
mainGame.initCharacters();
|
||||||
|
mainGame.setGamestate(GAMESTATE.PLAYING);
|
||||||
|
}
|
||||||
|
if (keycode == Input.Keys.NUM_2) {
|
||||||
|
System.out.println("HACKER");
|
||||||
|
mainGame.setChosenFaction(Faction.HACKER);
|
||||||
|
mainGame.initCharacters();
|
||||||
|
mainGame.setGamestate(GAMESTATE.PLAYING);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -122,25 +140,37 @@ public class GameInputProcessor implements InputProcessor {
|
|||||||
|
|
||||||
Vector3 touchPoint = new Vector3(Gdx.input.getX(), Gdx.input.getY(), 0);
|
Vector3 touchPoint = new Vector3(Gdx.input.getX(), Gdx.input.getY(), 0);
|
||||||
camera.unproject(touchPoint);
|
camera.unproject(touchPoint);
|
||||||
|
if (mainGame.getGamestate() == GAMESTATE.PLAYING) {
|
||||||
|
|
||||||
for (int row = 0; row < mainGame.mapRenderer.getGameTiles().length; row++) {
|
|
||||||
for (int col = 0; col < mainGame.mapRenderer.getGameTiles()[0].length; col++) {
|
for (int row = 0; row < mainGame.mapRenderer.getGameTiles().length; row++) {
|
||||||
GameTile gameTile = mainGame.mapRenderer.getGameTiles()[row][col];
|
for (int col = 0; col < mainGame.mapRenderer.getGameTiles()[0].length; col++) {
|
||||||
if (gameTile.contains(touchPoint.x, touchPoint.y)) {
|
GameTile gameTile = mainGame.mapRenderer.getGameTiles()[row][col];
|
||||||
if (button == Input.Buttons.LEFT) {
|
if (gameTile.contains(touchPoint.x, touchPoint.y)) {
|
||||||
|
if (button == Input.Buttons.LEFT) {
|
||||||
// System.out.println(gameTile + " row: " + row + ", col: " + col);
|
// System.out.println(gameTile + " row: " + row + ", col: " + col);
|
||||||
if (mainGame.hasCharacterSelected() && !gameTile.containsCharacter()) {
|
if (mainGame.hasCharacterSelected() && !gameTile.containsCharacter()) {
|
||||||
// System.out.println(mainGame.getSelectedCharacter());
|
// System.out.println(mainGame.getSelectedCharacter());
|
||||||
removeCharacterFromTile(mainGame.getSelectedCharacter());
|
if (gameTile.getSymbol() != '#' && mainGame.mapRenderer.getSurroundedTilesOfCurrentCharacter().contains(gameTile)) {
|
||||||
gameTile.visit(mainGame.getSelectedCharacter());
|
removeCharacterFromTile(mainGame.getSelectedCharacter());
|
||||||
|
gameTile.visit(mainGame.getSelectedCharacter());
|
||||||
|
mainGame.mapRenderer.setSurroundedTilesOfCurrentCharacter(col, row);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!mainGame.hasCharacterSelected() && gameTile.containsCharacter()) {
|
||||||
|
if (gameTile.getCharacter().getFaction() == mainGame.getChosenFaction()) {
|
||||||
|
mainGame.setSelectedCharacter(gameTile.getCharacter());
|
||||||
|
mainGame.mapRenderer.setSurroundedTilesOfCurrentCharacter(col, row);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (gameTile.containsCharacter()
|
||||||
|
&& !mainGame.getSelectedCharacter().equals(gameTile.getCharacter())
|
||||||
|
&& gameTile.getCharacter().getFaction() == mainGame.getChosenFaction()) {
|
||||||
|
mainGame.setSelectedCharacter(gameTile.getCharacter());
|
||||||
|
mainGame.mapRenderer.setSurroundedTilesOfCurrentCharacter(col, row);
|
||||||
|
}
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
if (!mainGame.hasCharacterSelected() && gameTile.containsCharacter()) {
|
|
||||||
mainGame.setSelectedCharacter(gameTile.getCharacter());
|
|
||||||
}
|
|
||||||
if (gameTile.containsCharacter() && !mainGame.getSelectedCharacter().equals(gameTile.getCharacter())) {
|
|
||||||
mainGame.setSelectedCharacter(gameTile.getCharacter());
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -36,6 +36,8 @@ public class GameTile extends Rectangle {
|
|||||||
public boolean visit(GameCharacter character) {
|
public boolean visit(GameCharacter character) {
|
||||||
if (this.character != null) return false;
|
if (this.character != null) return false;
|
||||||
this.character = character;
|
this.character = character;
|
||||||
|
this.character.setX(this.x);
|
||||||
|
this.character.setY(this.y);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -61,6 +63,7 @@ public class GameTile extends Rectangle {
|
|||||||
"symbol=" + symbol +
|
"symbol=" + symbol +
|
||||||
", x=" + x +
|
", x=" + x +
|
||||||
", y=" + y +
|
", y=" + y +
|
||||||
|
", character=" + this.character +
|
||||||
'}';
|
'}';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,5 @@
|
|||||||
package netwerkprog.game.client.game.map;
|
package netwerkprog.game.client.game.map;
|
||||||
|
|
||||||
import java.util.Arrays;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Map class to hold a 2d array of tiles which will specify the map
|
* Map class to hold a 2d array of tiles which will specify the map
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -4,9 +4,14 @@ import com.badlogic.gdx.Gdx;
|
|||||||
import com.badlogic.gdx.graphics.OrthographicCamera;
|
import com.badlogic.gdx.graphics.OrthographicCamera;
|
||||||
import com.badlogic.gdx.graphics.Texture;
|
import com.badlogic.gdx.graphics.Texture;
|
||||||
import com.badlogic.gdx.graphics.g2d.SpriteBatch;
|
import com.badlogic.gdx.graphics.g2d.SpriteBatch;
|
||||||
import netwerkprog.game.client.MainGame;
|
|
||||||
import netwerkprog.game.util.graphics.Renderable;
|
|
||||||
import com.badlogic.gdx.graphics.g2d.TextureRegion;
|
import com.badlogic.gdx.graphics.g2d.TextureRegion;
|
||||||
|
import netwerkprog.game.client.MainGame;
|
||||||
|
import netwerkprog.game.util.game.GameCharacter;
|
||||||
|
import netwerkprog.game.util.graphics.Renderable;
|
||||||
|
|
||||||
|
import java.awt.*;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
public class MapRenderer implements Renderable {
|
public class MapRenderer implements Renderable {
|
||||||
private final OrthographicCamera camera;
|
private final OrthographicCamera camera;
|
||||||
@@ -19,6 +24,8 @@ public class MapRenderer implements Renderable {
|
|||||||
private static int y = 0;
|
private static int y = 0;
|
||||||
|
|
||||||
private MainGame mainGame;
|
private MainGame mainGame;
|
||||||
|
private Texture square;
|
||||||
|
private Texture square2;
|
||||||
|
|
||||||
|
|
||||||
public static TextureRegion FLOOR_TILE;
|
public static TextureRegion FLOOR_TILE;
|
||||||
@@ -26,6 +33,7 @@ public class MapRenderer implements Renderable {
|
|||||||
public static TextureRegion PATH_TILE;
|
public static TextureRegion PATH_TILE;
|
||||||
|
|
||||||
private GameTile[][] gameTiles;
|
private GameTile[][] gameTiles;
|
||||||
|
private List<GameTile> surroundedTilesOfCurrentCharacter;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -50,7 +58,14 @@ public class MapRenderer implements Renderable {
|
|||||||
* loads all the images for the tiles and adds all the tiles to the array
|
* loads all the images for the tiles and adds all the tiles to the array
|
||||||
*/
|
*/
|
||||||
private void makeTiles() {
|
private void makeTiles() {
|
||||||
Texture texture = new Texture(Gdx.files.internal(tilePath));
|
mainGame.assets.load("square.png", Texture.class);
|
||||||
|
mainGame.assets.load("square2.png", Texture.class);
|
||||||
|
mainGame.assets.load(tilePath, Texture.class);
|
||||||
|
mainGame.assets.finishLoading();
|
||||||
|
square = mainGame.assets.get("square.png");
|
||||||
|
square2 = mainGame.assets.get("square2.png");
|
||||||
|
|
||||||
|
Texture texture = mainGame.assets.get(tilePath);
|
||||||
TextureRegion[][] tileTextures = TextureRegion.split(texture, 32, 32);
|
TextureRegion[][] tileTextures = TextureRegion.split(texture, 32, 32);
|
||||||
|
|
||||||
FLOOR_TILE = tileTextures[1][6];
|
FLOOR_TILE = tileTextures[1][6];
|
||||||
@@ -100,18 +115,67 @@ public class MapRenderer implements Renderable {
|
|||||||
for (int col = 0; col < gameTiles[0].length; col++) {
|
for (int col = 0; col < gameTiles[0].length; col++) {
|
||||||
GameTile cur = gameTileRow[col];
|
GameTile cur = gameTileRow[col];
|
||||||
batch.draw(cur.getTextureRegion(), cur.x, cur.y);
|
batch.draw(cur.getTextureRegion(), cur.x, cur.y);
|
||||||
|
|
||||||
if (cur.containsCharacter()) {
|
if (cur.containsCharacter()) {
|
||||||
batch.draw(cur.getCharacter().getTextureRegion(), cur.x, cur.y);
|
batch.draw(cur.getCharacter().getTextureRegion(), cur.x, cur.y);
|
||||||
// System.out.println("drawing character at " + cur.x + " " + cur.y);
|
if (cur.getCharacter().equals(mainGame.getSelectedCharacter())) {
|
||||||
|
batch.draw(square, cur.x, cur.y);
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (surroundedTilesOfCurrentCharacter != null && !surroundedTilesOfCurrentCharacter.isEmpty()) {
|
||||||
|
for (GameTile gameTile : surroundedTilesOfCurrentCharacter) {
|
||||||
|
batch.draw(square2, gameTile.x, gameTile.y);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
batch.end();
|
batch.end();
|
||||||
x = 0;
|
x = 0;
|
||||||
y = 0;
|
y = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static int[][] directions = new int[][]{{-1, -1}, {-1, 0}, {-1, 1}, {0, 1}, {1, 1}, {1, 0}, {1, -1}, {0, -1}};
|
||||||
|
|
||||||
|
public List<GameTile> setSurroundedTilesOfCurrentCharacter(int x, int y) {
|
||||||
|
List<GameTile> res = new ArrayList<GameTile>();
|
||||||
|
for (int[] direction : directions) {
|
||||||
|
int cx = x + direction[0];
|
||||||
|
int cy = y + direction[1];
|
||||||
|
if (cy >= 0 && cy < gameTiles.length)
|
||||||
|
if (cx >= 0 && cx < gameTiles[cy].length)
|
||||||
|
if (gameTiles[cy][cx].getSymbol() != '#')
|
||||||
|
res.add(gameTiles[cy][cx]);
|
||||||
|
}
|
||||||
|
surroundedTilesOfCurrentCharacter = res;
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
public GameTile getTile(GameCharacter character) {
|
||||||
|
for (GameTile[] tiles : this.gameTiles) {
|
||||||
|
for (GameTile tile : tiles) {
|
||||||
|
if (tile.containsCharacter())
|
||||||
|
if (tile.getCharacter().equals(character)) {
|
||||||
|
return tile;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public Point getPos(GameTile tile) {
|
||||||
|
for (int row = 0; row < this.gameTiles.length; row++) {
|
||||||
|
for (int col = 0; col < this.gameTiles[0].length; col++) {
|
||||||
|
if (gameTiles[row][col].equals(tile)) {
|
||||||
|
return new Point(col, row);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return new Point(-1, -1);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void update(double deltaTime) {
|
public void update(double deltaTime) {
|
||||||
|
|
||||||
@@ -127,4 +191,9 @@ public class MapRenderer implements Renderable {
|
|||||||
public GameTile[][] getGameTiles() {
|
public GameTile[][] getGameTiles() {
|
||||||
return gameTiles;
|
return gameTiles;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public List<GameTile> getSurroundedTilesOfCurrentCharacter() {
|
||||||
|
return surroundedTilesOfCurrentCharacter;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,43 +0,0 @@
|
|||||||
package netwerkprog.game.server;
|
|
||||||
|
|
||||||
import netwerkprog.game.client.game.characters.DevTest1;
|
|
||||||
import netwerkprog.game.client.game.characters.DevTest2;
|
|
||||||
import netwerkprog.game.client.game.characters.DevTest3;
|
|
||||||
import netwerkprog.game.server.controllers.DataController;
|
|
||||||
import netwerkprog.game.util.data.ParserCallback;
|
|
||||||
|
|
||||||
import java.util.Scanner;
|
|
||||||
|
|
||||||
public class Parser {
|
|
||||||
private final ParserCallback callback;
|
|
||||||
private Scanner scanner;
|
|
||||||
|
|
||||||
private final DataController dataController;
|
|
||||||
|
|
||||||
public Parser(ParserCallback callback) {
|
|
||||||
this.callback = callback;
|
|
||||||
this.dataController = new DataController();
|
|
||||||
|
|
||||||
this.dataController.addAllCharacters(new DevTest1(), new DevTest2(), new DevTest3());
|
|
||||||
}
|
|
||||||
|
|
||||||
public void parse(String request) {
|
|
||||||
String data = "";
|
|
||||||
this.scanner = new Scanner(request);
|
|
||||||
scanner.useDelimiter("~");
|
|
||||||
String type = scanner.next();
|
|
||||||
String name = scanner.next();
|
|
||||||
|
|
||||||
if (type.equals("character")) {
|
|
||||||
try {
|
|
||||||
data = dataController.getCharacter(name).toString();
|
|
||||||
} catch (IllegalArgumentException ex) {
|
|
||||||
data = ex.getMessage();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
callback.onDataReceived(data);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,16 +1,19 @@
|
|||||||
package netwerkprog.game.server;
|
package netwerkprog.game.server;
|
||||||
|
|
||||||
|
import netwerkprog.game.server.controllers.DataController;
|
||||||
import netwerkprog.game.server.controllers.SessionController;
|
import netwerkprog.game.server.controllers.SessionController;
|
||||||
|
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
|
|
||||||
public class Server {
|
public class Server {
|
||||||
private SessionController sessionController;
|
private SessionController sessionController;
|
||||||
|
private DataController dataController;
|
||||||
private Thread sessionThread;
|
private Thread sessionThread;
|
||||||
private HashMap<String, Thread> gameThreads;
|
private HashMap<String, Thread> gameThreads;
|
||||||
|
|
||||||
public void start() {
|
public void start() {
|
||||||
this.sessionController = new SessionController();
|
this.sessionController = new SessionController(this);
|
||||||
|
this.dataController = new DataController();
|
||||||
|
|
||||||
this.gameThreads = new HashMap<>();
|
this.gameThreads = new HashMap<>();
|
||||||
this.sessionThread = new Thread(sessionController);
|
this.sessionThread = new Thread(sessionController);
|
||||||
@@ -32,4 +35,8 @@ public class Server {
|
|||||||
// gameThreads.get(game).start();
|
// gameThreads.get(game).start();
|
||||||
// }
|
// }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public DataController getDataController() {
|
||||||
|
return dataController;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,38 +1,35 @@
|
|||||||
package netwerkprog.game.server;
|
package netwerkprog.game.server;
|
||||||
|
|
||||||
|
import netwerkprog.game.server.controllers.DataController;
|
||||||
import netwerkprog.game.server.controllers.SessionController;
|
import netwerkprog.game.server.controllers.SessionController;
|
||||||
import netwerkprog.game.util.data.ParserCallback;
|
import netwerkprog.game.util.data.ConnectionData;
|
||||||
|
import netwerkprog.game.util.data.Data;
|
||||||
|
import netwerkprog.game.util.data.DataCallback;
|
||||||
|
|
||||||
import java.io.DataInputStream;
|
|
||||||
import java.io.DataOutputStream;
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.net.Socket;
|
import java.io.ObjectInputStream;
|
||||||
|
import java.io.ObjectOutputStream;
|
||||||
|
|
||||||
public class ServerClient implements Runnable, ParserCallback {
|
public class ServerClient implements Runnable {
|
||||||
private DataInputStream in;
|
private ObjectInputStream in;
|
||||||
private DataOutputStream out;
|
private ObjectOutputStream out;
|
||||||
private final String name;
|
private final String name;
|
||||||
private final SessionController server;
|
private final SessionController server;
|
||||||
private final Parser parser;
|
private final DataCallback callback;
|
||||||
private boolean isConnected;
|
private boolean isConnected;
|
||||||
|
|
||||||
public ServerClient(String name, Socket socket, SessionController server) {
|
public ServerClient(String name, ObjectInputStream in, ObjectOutputStream out, SessionController server, DataController dataController) {
|
||||||
this.name = name;
|
this.name = name;
|
||||||
this.server = server;
|
this.server = server;
|
||||||
this.parser = new Parser(this);
|
this.callback = dataController;
|
||||||
try {
|
this.in = in;
|
||||||
this.in = new DataInputStream(socket.getInputStream());
|
this.out = out;
|
||||||
this.out = new DataOutputStream(socket.getOutputStream());
|
this.isConnected = true;
|
||||||
this.isConnected = true;
|
|
||||||
} catch (IOException e) {
|
|
||||||
this.isConnected = false;
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void writeUTF(String text) {
|
public void writeData(Data data) {
|
||||||
try {
|
try {
|
||||||
this.out.writeUTF(text);
|
this.out.writeObject(data);
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
@@ -42,14 +39,26 @@ public class ServerClient implements Runnable, ParserCallback {
|
|||||||
public void run() {
|
public void run() {
|
||||||
while (this.isConnected) {
|
while (this.isConnected) {
|
||||||
try {
|
try {
|
||||||
String received = this.in.readUTF();
|
Object object = this.in.readObject();
|
||||||
this.parser.parse(received);
|
if (object instanceof Data) {
|
||||||
|
Data data = (Data) object;
|
||||||
|
if (data.getPayload() instanceof ConnectionData) {
|
||||||
|
ConnectionData connectionData = (ConnectionData) data.getPayload();
|
||||||
|
if (connectionData.getAction().equals("Disconnect")) {
|
||||||
|
this.isConnected = false;
|
||||||
|
//todo properly remove thread.
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
callback.onDataReceived((Data) this.in.readObject());
|
||||||
|
}
|
||||||
|
}
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
System.out.println("[SERVERCLIENT] caught exception - " + e.getMessage());
|
System.out.println("[SERVERCLIENT] caught exception - " + e.getMessage());
|
||||||
System.out.println("[SERVERCLIENT] terminating failing connection...");
|
System.out.println("[SERVERCLIENT] terminating failing connection...");
|
||||||
this.isConnected = false;
|
this.isConnected = false;
|
||||||
System.out.println("[SERVERCLIENT] done!");
|
System.out.println("[SERVERCLIENT] done!");
|
||||||
|
} catch (ClassNotFoundException e) {
|
||||||
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -57,9 +66,4 @@ public class ServerClient implements Runnable, ParserCallback {
|
|||||||
public String getName() {
|
public String getName() {
|
||||||
return this.name;
|
return this.name;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onDataReceived(String data) {
|
|
||||||
writeUTF(data);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,11 +1,14 @@
|
|||||||
package netwerkprog.game.server.controllers;
|
package netwerkprog.game.server.controllers;
|
||||||
|
|
||||||
|
import netwerkprog.game.util.data.CharacterData;
|
||||||
|
import netwerkprog.game.util.data.Data;
|
||||||
|
import netwerkprog.game.util.data.DataCallback;
|
||||||
import netwerkprog.game.util.game.GameCharacter;
|
import netwerkprog.game.util.game.GameCharacter;
|
||||||
|
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
|
|
||||||
public class DataController {
|
public class DataController implements DataCallback {
|
||||||
private final HashSet<GameCharacter> gameCharacters;
|
private final HashSet<GameCharacter> gameCharacters;
|
||||||
|
|
||||||
public DataController() {
|
public DataController() {
|
||||||
@@ -44,4 +47,15 @@ public class DataController {
|
|||||||
}
|
}
|
||||||
throw new IllegalArgumentException("The character does not exist.");
|
throw new IllegalArgumentException("The character does not exist.");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onDataReceived(Data data) {
|
||||||
|
switch (data.getType()) {
|
||||||
|
case "Character" :
|
||||||
|
if (data.getPayload() instanceof CharacterData) {
|
||||||
|
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,11 +1,13 @@
|
|||||||
package netwerkprog.game.server.controllers;
|
package netwerkprog.game.server.controllers;
|
||||||
|
|
||||||
|
import netwerkprog.game.server.Server;
|
||||||
import netwerkprog.game.server.ServerClient;
|
import netwerkprog.game.server.ServerClient;
|
||||||
import netwerkprog.game.util.application.Controller;
|
import netwerkprog.game.util.application.Controller;
|
||||||
|
import netwerkprog.game.util.data.ConnectionData;
|
||||||
import netwerkprog.game.util.data.Data;
|
import netwerkprog.game.util.data.Data;
|
||||||
|
|
||||||
import java.io.DataInputStream;
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
import java.io.ObjectInputStream;
|
||||||
import java.io.ObjectOutputStream;
|
import java.io.ObjectOutputStream;
|
||||||
import java.net.ServerSocket;
|
import java.net.ServerSocket;
|
||||||
import java.net.Socket;
|
import java.net.Socket;
|
||||||
@@ -17,12 +19,14 @@ import java.util.Set;
|
|||||||
* The sessionController manages any connections from new clients and assigns individual threads to said clients.
|
* The sessionController manages any connections from new clients and assigns individual threads to said clients.
|
||||||
*/
|
*/
|
||||||
public class SessionController extends Controller {
|
public class SessionController extends Controller {
|
||||||
|
private Server server;
|
||||||
private ServerSocket serverSocket;
|
private ServerSocket serverSocket;
|
||||||
private final ArrayList<ServerClient> clients = new ArrayList<>();
|
private final ArrayList<ServerClient> clients = new ArrayList<>();
|
||||||
private final HashMap<String, Thread> clientThreads = new HashMap<>();
|
private final HashMap<String, Thread> clientThreads = new HashMap<>();
|
||||||
private boolean listening;
|
private boolean listening;
|
||||||
|
|
||||||
public SessionController() {
|
public SessionController(Server server) {
|
||||||
|
this.server = server;
|
||||||
this.listening = true;
|
this.listening = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -59,43 +63,66 @@ public class SessionController extends Controller {
|
|||||||
try {
|
try {
|
||||||
System.out.println("[SERVER] got new client on " + socket.getInetAddress().getHostAddress());
|
System.out.println("[SERVER] got new client on " + socket.getInetAddress().getHostAddress());
|
||||||
ObjectOutputStream outputStream = new ObjectOutputStream(socket.getOutputStream());
|
ObjectOutputStream outputStream = new ObjectOutputStream(socket.getOutputStream());
|
||||||
DataInputStream inputStream = new DataInputStream(socket.getInputStream());
|
ObjectInputStream inputStream = new ObjectInputStream(socket.getInputStream());
|
||||||
|
|
||||||
outputStream.writeUTF("Enter username: ");
|
String username = "";
|
||||||
String username = inputStream.readUTF();
|
boolean registering = true;
|
||||||
|
|
||||||
|
while (registering) {
|
||||||
|
outputStream.writeObject(new ConnectionData("Connect", "Please give a username"));
|
||||||
|
Object object = inputStream.readObject();
|
||||||
|
|
||||||
|
if (object instanceof Data) {
|
||||||
|
Data data = (Data) object;
|
||||||
|
if (data instanceof ConnectionData) {
|
||||||
|
ConnectionData connectionData = (ConnectionData) data.getPayload();
|
||||||
|
if (connectionData.getAction().equals("Connect")) {
|
||||||
|
username = connectionData.getMessage();
|
||||||
|
outputStream.writeObject(new ConnectionData("Connect", "Confirm"));
|
||||||
|
registering = false;
|
||||||
|
} else {
|
||||||
|
//todo error messaging.
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
//todo error messaging.
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
//todo error messaging.
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
System.out.println("[SERVER] got username " + username);
|
System.out.println("[SERVER] got username " + username);
|
||||||
ServerClient serverClient = new ServerClient(username, socket, this);
|
ServerClient serverClient = new ServerClient(username, inputStream, outputStream, this, server.getDataController());
|
||||||
|
|
||||||
Thread t = new Thread(serverClient);
|
Thread t = new Thread(serverClient);
|
||||||
t.start();
|
t.start();
|
||||||
|
|
||||||
this.clientThreads.put(username,t);
|
this.clientThreads.put(username,t);
|
||||||
this.clients.add(serverClient);
|
this.clients.add(serverClient);
|
||||||
} catch (IOException ex) {
|
} catch (IOException | ClassNotFoundException ex) {
|
||||||
ex.printStackTrace();
|
ex.printStackTrace();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sends a server message to all connected clients.
|
* Sends a server message to all connected clients.
|
||||||
* @param text message.
|
* @param data message.
|
||||||
*/
|
*/
|
||||||
public void serverMessage(String text) {
|
public void serverMessage(Data data) {
|
||||||
for (ServerClient serverClient : clients) {
|
for (ServerClient serverClient : clients) {
|
||||||
serverClient.writeUTF(text);
|
serverClient.writeData(data);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sends a message to a specific user.
|
* Sends a message to a specific user.
|
||||||
* @param name user.
|
* @param name user.
|
||||||
* @param text message.
|
* @param data message.
|
||||||
*/
|
*/
|
||||||
public void personalMessage(String name, String text) {
|
public void personalMessage(String name, Data data) {
|
||||||
for (ServerClient serverClient : clients) {
|
for (ServerClient serverClient : clients) {
|
||||||
if (serverClient.getName().equals(name)) {
|
if (serverClient.getName().equals(name)) {
|
||||||
serverClient.writeUTF(text);
|
serverClient.writeData(data);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -113,7 +140,7 @@ public class SessionController extends Controller {
|
|||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
this.clientThreads.remove(serverClient.getName());
|
this.clientThreads.remove(serverClient.getName());
|
||||||
this.serverMessage(serverClient.getName() + " left!");
|
//this.serverMessage(serverClient.getName() + " left!");
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
17
core/src/netwerkprog/game/util/data/CharacterData.java
Normal file
17
core/src/netwerkprog/game/util/data/CharacterData.java
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
package netwerkprog.game.util.data;
|
||||||
|
|
||||||
|
import netwerkprog.game.util.game.GameCharacter;
|
||||||
|
|
||||||
|
import java.io.Serializable;
|
||||||
|
|
||||||
|
public class CharacterData extends Data implements Serializable {
|
||||||
|
private final String name;
|
||||||
|
private final GameCharacter character;
|
||||||
|
|
||||||
|
public CharacterData(String name, GameCharacter character) {
|
||||||
|
super("Character");
|
||||||
|
super.setPayload(this);
|
||||||
|
this.name = name;
|
||||||
|
this.character = character;
|
||||||
|
}
|
||||||
|
}
|
||||||
23
core/src/netwerkprog/game/util/data/ConnectionData.java
Normal file
23
core/src/netwerkprog/game/util/data/ConnectionData.java
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
package netwerkprog.game.util.data;
|
||||||
|
|
||||||
|
import java.io.Serializable;
|
||||||
|
|
||||||
|
public class ConnectionData extends Data implements Serializable {
|
||||||
|
private final String action;
|
||||||
|
private final String message;
|
||||||
|
|
||||||
|
public ConnectionData(String action, String message) {
|
||||||
|
super("Connection");
|
||||||
|
super.setPayload(this);
|
||||||
|
this.action = action;
|
||||||
|
this.message = message;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getAction() {
|
||||||
|
return action;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getMessage() {
|
||||||
|
return message;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,7 +1,32 @@
|
|||||||
package netwerkprog.game.util.data;
|
package netwerkprog.game.util.data;
|
||||||
|
|
||||||
public class Data {
|
import java.io.Serializable;
|
||||||
|
|
||||||
|
public class Data implements Serializable {
|
||||||
public static int port() {
|
public static int port() {
|
||||||
return 8000;
|
return 8000;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private String objectType;
|
||||||
|
private Data payload;
|
||||||
|
|
||||||
|
public Data(String type) {
|
||||||
|
this.objectType = type;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setObjectType(String objectType) {
|
||||||
|
this.objectType = objectType;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setPayload(Data payload) {
|
||||||
|
this.payload = payload;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getType() {
|
||||||
|
return objectType;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Data getPayload() {
|
||||||
|
return payload;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
5
core/src/netwerkprog/game/util/data/DataCallback.java
Normal file
5
core/src/netwerkprog/game/util/data/DataCallback.java
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
package netwerkprog.game.util.data;
|
||||||
|
|
||||||
|
public interface DataCallback {
|
||||||
|
void onDataReceived(Data data);
|
||||||
|
}
|
||||||
@@ -1,29 +1,35 @@
|
|||||||
package netwerkprog.game.util.game;
|
package netwerkprog.game.util.game;
|
||||||
|
|
||||||
|
|
||||||
import com.badlogic.gdx.graphics.Texture;
|
|
||||||
import com.badlogic.gdx.graphics.g2d.SpriteBatch;
|
|
||||||
import com.badlogic.gdx.graphics.g2d.TextureRegion;
|
import com.badlogic.gdx.graphics.g2d.TextureRegion;
|
||||||
import com.badlogic.gdx.scenes.scene2d.Actor;
|
import com.badlogic.gdx.scenes.scene2d.Actor;
|
||||||
|
import netwerkprog.game.client.game.map.GameTile;
|
||||||
|
|
||||||
|
import java.io.Serializable;
|
||||||
|
import java.util.ArrayList;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
|
import java.util.List;
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
|
|
||||||
public abstract class GameCharacter extends Actor implements Comparable<GameCharacter> {
|
public abstract class GameCharacter extends Actor implements Comparable<GameCharacter>, Serializable {
|
||||||
protected String name;
|
protected String name;
|
||||||
protected Faction faction;
|
protected Faction faction;
|
||||||
protected HashSet<Ability> abilities;
|
protected HashSet<Ability> abilities;
|
||||||
protected boolean override;
|
protected boolean override;
|
||||||
protected TextureRegion textureRegion;
|
protected TextureRegion textureRegion;
|
||||||
|
protected int health;
|
||||||
|
protected List<GameTile> allowedToMove;
|
||||||
|
|
||||||
public GameCharacter(String name, Faction faction, TextureRegion textureRegion, Ability... abilities) {
|
public GameCharacter(String name, Faction faction, TextureRegion textureRegion, Ability... abilities) {
|
||||||
|
super();
|
||||||
this.name = name;
|
this.name = name;
|
||||||
this.faction = faction;
|
this.faction = faction;
|
||||||
this.abilities = new HashSet<>(Arrays.asList(abilities));
|
this.abilities = new HashSet<>(Arrays.asList(abilities));
|
||||||
this.override = false;
|
this.override = false;
|
||||||
this.textureRegion = textureRegion;
|
this.textureRegion = textureRegion;
|
||||||
|
this.health = 100;
|
||||||
|
this.allowedToMove = new ArrayList<>();
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getName() {
|
public String getName() {
|
||||||
@@ -38,6 +44,28 @@ public abstract class GameCharacter extends Actor implements Comparable<GameChar
|
|||||||
this.abilities.remove(ability);
|
this.abilities.remove(ability);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public int getHealth() {
|
||||||
|
return health;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setHealth(int health) {
|
||||||
|
this.health = health;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void heal(int amount) {
|
||||||
|
this.health += amount;
|
||||||
|
if (this.health > 100) this.health = 100;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void damage(int amount) {
|
||||||
|
this.health -= amount;
|
||||||
|
if (this.health < 0) this. health = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isDead() {
|
||||||
|
return this.health <= 0;
|
||||||
|
}
|
||||||
|
|
||||||
public void changeControl() {
|
public void changeControl() {
|
||||||
this.override = !this.override;
|
this.override = !this.override;
|
||||||
}
|
}
|
||||||
@@ -69,7 +97,7 @@ public abstract class GameCharacter extends Actor implements Comparable<GameChar
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int compareTo(GameCharacter o) {
|
public int compareTo(GameCharacter o) {
|
||||||
return this.name.compareTo(o.name);
|
return this.health - o.health;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -77,6 +105,20 @@ public abstract class GameCharacter extends Actor implements Comparable<GameChar
|
|||||||
return "GameCharacter{" +
|
return "GameCharacter{" +
|
||||||
"name='" + name + '\'' +
|
"name='" + name + '\'' +
|
||||||
", faction=" + faction +
|
", faction=" + faction +
|
||||||
|
", x=" + super.getX() +
|
||||||
|
", y=" + super.getY() +
|
||||||
'}';
|
'}';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public List<GameTile> getAllowedToMove() {
|
||||||
|
return allowedToMove;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setAllowedToMove(List<GameTile> allowedToMove) {
|
||||||
|
this.allowedToMove = allowedToMove;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Faction getFaction() {
|
||||||
|
return faction;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
38
core/src/netwerkprog/game/util/graphics/TextRenderer.java
Normal file
38
core/src/netwerkprog/game/util/graphics/TextRenderer.java
Normal file
@@ -0,0 +1,38 @@
|
|||||||
|
package netwerkprog.game.util.graphics;
|
||||||
|
|
||||||
|
import com.badlogic.gdx.Gdx;
|
||||||
|
import com.badlogic.gdx.graphics.OrthographicCamera;
|
||||||
|
import com.badlogic.gdx.graphics.g2d.BitmapFont;
|
||||||
|
import com.badlogic.gdx.graphics.g2d.SpriteBatch;
|
||||||
|
import com.badlogic.gdx.utils.Disposable;
|
||||||
|
|
||||||
|
public class TextRenderer implements Disposable {
|
||||||
|
private BitmapFont font;
|
||||||
|
private SpriteBatch batch;
|
||||||
|
private OrthographicCamera cam;
|
||||||
|
|
||||||
|
public TextRenderer() {
|
||||||
|
font = new BitmapFont();
|
||||||
|
batch = new SpriteBatch();
|
||||||
|
cam = new OrthographicCamera(Gdx.graphics.getWidth(), Gdx.graphics.getHeight());
|
||||||
|
|
||||||
|
}
|
||||||
|
@Override
|
||||||
|
public void dispose() {
|
||||||
|
font.dispose();
|
||||||
|
batch.dispose();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void resize(int screenWidth, int screenHeight) {
|
||||||
|
cam = new OrthographicCamera(screenWidth, screenHeight);
|
||||||
|
cam.translate(screenWidth / 2, screenHeight / 2);
|
||||||
|
cam.update();
|
||||||
|
batch.setProjectionMatrix(cam.combined);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void render(String text, float x, float y) {
|
||||||
|
batch.begin();
|
||||||
|
font.draw(batch, text, x, y);
|
||||||
|
batch.end();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,7 +1,5 @@
|
|||||||
package netwerkprog.game.util.tree;
|
package netwerkprog.game.util.tree;
|
||||||
|
|
||||||
import java.util.*;
|
|
||||||
|
|
||||||
public class BST<E extends Comparable<E>> extends AbstractTree<E> {
|
public class BST<E extends Comparable<E>> extends AbstractTree<E> {
|
||||||
protected TreeNode<E> root;
|
protected TreeNode<E> root;
|
||||||
protected int size = 0;
|
protected int size = 0;
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ public class RestartSessionControllerTest {
|
|||||||
SessionController sessionController;
|
SessionController sessionController;
|
||||||
Thread sessionThread;
|
Thread sessionThread;
|
||||||
|
|
||||||
sessionController = new SessionController();
|
sessionController = new SessionController(null);
|
||||||
sessionThread = new Thread(sessionController);
|
sessionThread = new Thread(sessionController);
|
||||||
|
|
||||||
sessionThread.start();
|
sessionThread.start();
|
||||||
|
|||||||
Reference in New Issue
Block a user