mirror of
https://github.com/michaelrausch/Party-Parrots-At-Sea.git
synced 2026-05-09 14:28:43 +00:00
Added per map max player count. Handles case when map cannot fit players behind start mark. Added initial implementation for spacing out yachts.
#implement.
This commit is contained in:
@@ -3,6 +3,8 @@ package seng302.gameServer;
|
||||
import java.io.IOException;
|
||||
import java.net.ServerSocket;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.Random;
|
||||
import java.util.Timer;
|
||||
import java.util.TimerTask;
|
||||
@@ -13,7 +15,6 @@ import seng302.model.GeoPoint;
|
||||
import seng302.model.Player;
|
||||
import seng302.model.PolarTable;
|
||||
import seng302.model.ServerYacht;
|
||||
import seng302.model.mark.CompoundMark;
|
||||
import seng302.model.stream.xml.parser.RaceXMLData;
|
||||
import seng302.model.stream.xml.parser.RegattaXMLData;
|
||||
import seng302.utilities.GeoUtility;
|
||||
@@ -329,39 +330,107 @@ public class MainServerThread implements Runnable, ClientConnectionDelegate {
|
||||
* Initialise boats to specific spaced out geopoints behind starting line.
|
||||
*/
|
||||
private void initialiseBoatPositions() {
|
||||
CompoundMark cm = GameState.getMarkOrder().getMarkOrder().get(0);
|
||||
GeoPoint startMark1 = cm.getSubMark(1);
|
||||
GeoPoint startMark2 = cm.getSubMark(2);
|
||||
// CompoundMark cm = GameState.getMarkOrder().getMarkOrder().get(0);
|
||||
// GeoPoint startMark1 = cm.getSubMark(1);
|
||||
// GeoPoint startMark2 = cm.getSubMark(2);
|
||||
//
|
||||
// // Calculating midpoint
|
||||
// Double perpendicularAngle = GeoUtility.getBearing(startMark1, startMark2);
|
||||
// Double length = GeoUtility.getDistance(startMark1, startMark2);
|
||||
// GeoPoint midpoint = GeoUtility.getGeoCoordinate(startMark1, perpendicularAngle, length / 2);
|
||||
//
|
||||
// // Setting each boats position side by side
|
||||
// final double SEPARATION = 50.0; // distance apart in meters
|
||||
//
|
||||
// int boatIndex = 0;
|
||||
// for (ServerYacht yacht : GameState.getYachts().values()) {
|
||||
// int distanceApart = boatIndex / 2;
|
||||
//
|
||||
// if (boatIndex % 2 == 1 && boatIndex != 0) {
|
||||
// distanceApart++;
|
||||
// distanceApart *= -1;
|
||||
// }
|
||||
//
|
||||
// GeoPoint spawnMark = GeoUtility
|
||||
// .getGeoCoordinate(midpoint, perpendicularAngle, distanceApart * SEPARATION);
|
||||
//
|
||||
// if (yacht.getHeading() < perpendicularAngle) {
|
||||
// spawnMark = GeoUtility
|
||||
// .getGeoCoordinate(spawnMark, perpendicularAngle + 90, SEPARATION);
|
||||
// } else {
|
||||
// spawnMark = GeoUtility
|
||||
// .getGeoCoordinate(spawnMark, perpendicularAngle + 270, SEPARATION);
|
||||
// }
|
||||
//
|
||||
// yacht.setLocation(spawnMark);
|
||||
// boatIndex++;
|
||||
// }
|
||||
|
||||
// Calculating midpoint
|
||||
Double perpendicularAngle = GeoUtility.getBearing(startMark1, startMark2);
|
||||
Double length = GeoUtility.getDistance(startMark1, startMark2);
|
||||
GeoPoint midpoint = GeoUtility.getGeoCoordinate(startMark1, perpendicularAngle, length / 2);
|
||||
final double SEPARATION = 50.0; // distance apart in meters
|
||||
|
||||
// Setting each boats position side by side
|
||||
double DISTANCE_FACTOR = 50.0; // distance apart in meters
|
||||
int boatIndex = 0;
|
||||
for (ServerYacht yacht : GameState.getYachts().values()) {
|
||||
int distanceApart = boatIndex / 2;
|
||||
//Reverse of the angle from start to first mark
|
||||
double angleToFirstMark = 360 - GeoUtility.getBearing(
|
||||
GameState.getMarkOrder().getMarkOrder().get(0).getMidPoint(),
|
||||
GameState.getMarkOrder().getMarkOrder().get(1).getMidPoint()
|
||||
);
|
||||
|
||||
if (boatIndex % 2 == 1 && boatIndex != 0) {
|
||||
distanceApart++;
|
||||
distanceApart *= -1;
|
||||
//Length of start line
|
||||
double startLineLength = GeoUtility.getDistance(
|
||||
GameState.getMarkOrder().getMarkOrder().get(0).getSubMark(1),
|
||||
GameState.getMarkOrder().getMarkOrder().get(0).getSubMark(2)
|
||||
);
|
||||
|
||||
//Angle of start line
|
||||
double startMarkToMarkAngle = GeoUtility.getBearing(
|
||||
GameState.getMarkOrder().getMarkOrder().get(0).getSubMark(1),
|
||||
GameState.getMarkOrder().getMarkOrder().get(0).getSubMark(2)
|
||||
);
|
||||
|
||||
//How many yachts can fit along the start line
|
||||
int spacesAlongLine = (int) Math.round(startLineLength / SEPARATION);
|
||||
//The free space left by the boats.
|
||||
double buffer = (startLineLength % SEPARATION) / 2;
|
||||
|
||||
//Randomize starting order.
|
||||
List<ServerYacht> serverYachtList = new ArrayList<>(GameState.getYachts().values());
|
||||
Collections.shuffle(serverYachtList);
|
||||
|
||||
//set the starting point away from start line.
|
||||
GeoPoint startingPoint = GeoUtility.getGeoCoordinate(
|
||||
GameState.getMarkOrder().getMarkOrder().get(0).getSubMark(1),
|
||||
angleToFirstMark, SEPARATION
|
||||
);
|
||||
|
||||
//Move it along the start line
|
||||
startingPoint = GeoUtility.getGeoCoordinate(
|
||||
startingPoint, startMarkToMarkAngle, buffer
|
||||
);
|
||||
|
||||
int yachtCount = 0;
|
||||
int repeats = 0;
|
||||
|
||||
GeoPoint yachtLocation;
|
||||
|
||||
for (ServerYacht serverYacht : serverYachtList) {
|
||||
|
||||
//Move away from start line
|
||||
yachtLocation = GeoUtility.getGeoCoordinate(
|
||||
startingPoint, angleToFirstMark,repeats * SEPARATION
|
||||
);
|
||||
//Move along start line
|
||||
yachtLocation = GeoUtility.getGeoCoordinate(
|
||||
yachtLocation, startMarkToMarkAngle, yachtCount * SEPARATION
|
||||
);
|
||||
serverYacht.setLocation(yachtLocation);
|
||||
serverYacht.setHeading(GeoUtility.getBearing(
|
||||
yachtLocation, GameState.getMarkOrder().getMarkOrder().get(1).getMidPoint()
|
||||
));
|
||||
//Set location for next yacht
|
||||
yachtCount++;
|
||||
if (yachtCount > spacesAlongLine) {
|
||||
yachtCount = 0;
|
||||
repeats++;
|
||||
}
|
||||
|
||||
GeoPoint spawnMark = GeoUtility
|
||||
.getGeoCoordinate(midpoint, perpendicularAngle, distanceApart * DISTANCE_FACTOR);
|
||||
|
||||
if (yacht.getHeading() < perpendicularAngle) {
|
||||
spawnMark = GeoUtility
|
||||
.getGeoCoordinate(spawnMark, perpendicularAngle + 90, DISTANCE_FACTOR);
|
||||
} else {
|
||||
spawnMark = GeoUtility
|
||||
.getGeoCoordinate(spawnMark, perpendicularAngle + 270, DISTANCE_FACTOR);
|
||||
}
|
||||
|
||||
yacht.setLocation(spawnMark);
|
||||
boatIndex++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -56,7 +56,8 @@ public class MessageFactory {
|
||||
new ArrayList<>(),
|
||||
race.getMarkSequence(),
|
||||
race.getCourseLimit(),
|
||||
new ArrayList<>(race.getCompoundMarks().values())
|
||||
new ArrayList<>(race.getCompoundMarks().values()),
|
||||
GameState.getCapacity(), true
|
||||
)
|
||||
);
|
||||
String xmlStr = xmlGenerator.getRaceAsXml();
|
||||
|
||||
@@ -15,6 +15,7 @@ import java.util.zip.Checksum;
|
||||
import javafx.beans.property.SimpleObjectProperty;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import org.w3c.dom.Document;
|
||||
import seng302.gameServer.messages.BoatAction;
|
||||
import seng302.gameServer.messages.ChatterMessage;
|
||||
import seng302.gameServer.messages.ClientType;
|
||||
@@ -196,11 +197,11 @@ public class ServerToClientThread implements Runnable {
|
||||
// TODO: 17/08/2017 ajm412: Send a response packet here, not really necessary until we do shapes.
|
||||
break;
|
||||
case RACE_XML:
|
||||
Document document = StreamParser.extractXmlMessage(packet);
|
||||
raceXMLProperty.set(
|
||||
XMLParser.parseRace(
|
||||
StreamParser.extractXmlMessage(packet)
|
||||
)
|
||||
XMLParser.parseRace(document)
|
||||
);
|
||||
GameState.setMaxPlayers(XMLParser.getMaxPlayers(document));
|
||||
break;
|
||||
case REGATTA_XML:
|
||||
regattaXMLProperty.set(
|
||||
|
||||
Reference in New Issue
Block a user