Initial commit for Power Up story

Made new preliminary models for each power up. Currently just different colour balls
Added new YachtEventTypes in the enum for each pick up to be sent out to clients
Tokens now not only randomise location but also randomise which type of token will be sent out
Added new methods to the MessageFactory class - Make collision and Make pickup Message
Game Client now checks what type of Yacht Event code has come in to respond appropriately rather than just generic collision / token.. although this has not been implemented yet
Game View loads appropriate token models depending on what is in XML

#story[1245]
This commit is contained in:
William Muir
2017-09-19 17:47:05 +12:00
parent 73799954e4
commit 78596ea111
14 changed files with 900 additions and 36 deletions
+14 -13
View File
@@ -281,7 +281,13 @@ public class GameState implements Runnable {
public static void spawnNewToken() {
Random random = new Random();
tokensInPlay.clear();
tokensInPlay.add(allTokens.get(random.nextInt(allTokens.size())));
//Get a random token location
Token token = allTokens.get(random.nextInt(allTokens.size()));
//Set a random type to this token
token.setTokenType(TokenType.values()[random.nextInt(TokenType.values().length)]);
tokensInPlay.add(token);
}
/**
@@ -397,9 +403,7 @@ public class GameState implements Runnable {
collidedYacht.setCurrentVelocity(
collidedYacht.getCurrentVelocity() * COLLISION_VELOCITY_PENALTY
);
notifyMessageListeners(
new YachtEventCodeMessage(serverYacht.getSourceId(), YachtEventType.COLLISION)
);
notifyMessageListeners(MessageFactory.makeCollisionMessage(serverYacht));
}
//Mark Collision
@@ -411,9 +415,7 @@ public class GameState implements Runnable {
serverYacht.setCurrentVelocity(
serverYacht.getCurrentVelocity() * COLLISION_VELOCITY_PENALTY
);
notifyMessageListeners(
new YachtEventCodeMessage(serverYacht.getSourceId(), YachtEventType.COLLISION)
);
notifyMessageListeners(MessageFactory.makeCollisionMessage(serverYacht));
}
//Boundary Collision
@@ -426,22 +428,21 @@ public class GameState implements Runnable {
serverYacht.setCurrentVelocity(
serverYacht.getCurrentVelocity() * COLLISION_VELOCITY_PENALTY
);
notifyMessageListeners(
new YachtEventCodeMessage(serverYacht.getSourceId(), YachtEventType.COLLISION)
);
notifyMessageListeners(MessageFactory.makeCollisionMessage(serverYacht));
}
//Token Collision
Token collidedToken = checkTokenPickUp(serverYacht);
if (collidedToken != null) {
sendServerMessage(serverYacht.getSourceId(), serverYacht.getBoatName() + " has picked speed-up token");
sendServerMessage(serverYacht.getSourceId(),
serverYacht.getBoatName() + " has picked up a " + collidedToken.getTokenType()
.getName() + " token");
tokensInPlay.remove(collidedToken);
serverYacht.powerUp(collidedToken.getTokenType());
logger.debug("Yacht: " + serverYacht.getShortName() + " got powerup " + collidedToken
.getTokenType());
notifyMessageListeners(MessageFactory.getRaceXML());
notifyMessageListeners(
new YachtEventCodeMessage(serverYacht.getSourceId(), YachtEventType.TOKEN));
notifyMessageListeners(MessageFactory.makePickupMessage(serverYacht, collidedToken));
}
}
@@ -11,11 +11,14 @@ import seng302.gameServer.messages.RaceStatusMessage;
import seng302.gameServer.messages.RaceType;
import seng302.gameServer.messages.XMLMessage;
import seng302.gameServer.messages.XMLMessageSubType;
import seng302.gameServer.messages.YachtEventCodeMessage;
import seng302.gameServer.messages.YachtEventType;
import seng302.model.Player;
import seng302.model.ServerYacht;
import seng302.model.stream.xml.generator.RaceXMLTemplate;
import seng302.model.stream.xml.generator.RegattaXMLTemplate;
import seng302.model.token.Token;
import seng302.model.token.TokenType;
import seng302.utilities.XMLGenerator;
/**
@@ -128,4 +131,30 @@ public class MessageFactory {
XMLMessageSubType.BOAT,
xmlGenerator.getBoatsAsXml().length());
}
public static YachtEventCodeMessage makeCollisionMessage(ServerYacht serverYacht) {
return new YachtEventCodeMessage(serverYacht.getSourceId(), YachtEventType.COLLISION);
}
public static YachtEventCodeMessage makePickupMessage(ServerYacht serverYacht, Token token) {
YachtEventType yachtEventType = null;
switch (token.getTokenType()) {
case BOOST:
yachtEventType = YachtEventType.TOKEN_VELOCITY;
break;
case HANDLING:
yachtEventType = YachtEventType.TOKEN_HANDLING;
break;
case WIND_WALKER:
yachtEventType = YachtEventType.TOKEN_WIND_WALKER;
break;
case BUMPER:
yachtEventType = YachtEventType.TOKEN_BUMPER;
break;
case RANDOM:
yachtEventType = YachtEventType.TOKEN_RANDOM;
break;
}
return new YachtEventCodeMessage(serverYacht.getSourceId(), yachtEventType);
}
}
@@ -5,7 +5,11 @@ package seng302.gameServer.messages;
*/
public enum YachtEventType {
COLLISION(33),
TOKEN(34);
TOKEN_VELOCITY(34),
TOKEN_BUMPER(35),
TOKEN_HANDLING(36),
TOKEN_WIND_WALKER(37),
TOKEN_RANDOM(38);
private int code;
@@ -18,4 +18,8 @@ public class Token extends GeoPoint {
public TokenType getTokenType() {
return tokenType;
}
public void setTokenType(TokenType tokenType) {
this.tokenType = tokenType;
}
}
@@ -5,19 +5,28 @@ package seng302.model.token;
* Created by wmu16 on 28/08/17.
*/
public enum TokenType {
BOOST(0),
HANDLING(1);
BOOST(0, "Boost"),
HANDLING(1, "Handling"),
BUMPER(2, "Bumper"),
RANDOM(3, "Random"),
WIND_WALKER(4, "Wind Walker");
private int value;
private String name;
TokenType(int value) {
TokenType(int value, String name) {
this.value = value;
this.name = name;
}
public int getValue() {
return value;
}
public String getName() {
return name;
}
public static TokenType getToken(int value) {
switch (value) {
case 0:
@@ -245,12 +245,7 @@ public class GameClient {
break;
case YACHT_EVENT_CODE:
YachtEventData yachtEventData = StreamParser.extractYachtEventCode(packet);
if (yachtEventData.getEventId() == YachtEventType.COLLISION.getCode()) {
showCollisionAlert(StreamParser.extractYachtEventCode(packet));
} else if (yachtEventData.getEventId() == YachtEventType.TOKEN.getCode()) {
showPickUp();
}
displayYachtEvent(StreamParser.extractYachtEventCode(packet));
break;
case CHATTER_TEXT:
@@ -407,6 +402,28 @@ public class GameClient {
return courseData;
}
/**
* Appropriately displays the event client side given the YachtEventCode (collision / token..)
*
* @param yachtEventData The YachtEvent data packet
*/
private void displayYachtEvent(YachtEventData yachtEventData) {
if (yachtEventData.getEventId() == YachtEventType.COLLISION.getCode()) {
showCollisionAlert(yachtEventData);
} else if (yachtEventData.getEventId() == YachtEventType.TOKEN_VELOCITY.getCode()) {
showPickUp(yachtEventData);
} else if (yachtEventData.getEventId() == YachtEventType.TOKEN_BUMPER.getCode()) {
showPickUp(yachtEventData);
} else if (yachtEventData.getEventId() == YachtEventType.TOKEN_HANDLING.getCode()) {
showPickUp(yachtEventData);
} else if (yachtEventData.getEventId() == YachtEventType.TOKEN_RANDOM.getCode()) {
showPickUp(yachtEventData);
} else if (yachtEventData.getEventId() == YachtEventType.TOKEN_WIND_WALKER.getCode()) {
showPickUp(yachtEventData);
}
}
/**
* Tells race view to show a collision animation.
*/
@@ -420,7 +437,7 @@ public class GameClient {
}
// TODO: 11/09/17 wmu16 - Add in functionality to viually indicate a pickup to a user
private void showPickUp() {
private void showPickUp(YachtEventData yachtEventData) {
Sounds.playTokenPickupSound();
}
@@ -27,6 +27,7 @@ import seng302.model.mark.CompoundMark;
import seng302.model.mark.Corner;
import seng302.model.mark.Mark;
import seng302.model.token.Token;
import seng302.model.token.TokenType;
import seng302.utilities.GeoUtility;
import seng302.utilities.Sounds;
import seng302.visualiser.fxObjects.MarkArrowFactory;
@@ -556,7 +557,27 @@ public class GameView3D {
mapTokens = new ArrayList<>();
for (Token token : newTokens) {
Point2D location = findScaledXY(token.getLat(), token.getLng());
Node tokenObject = ModelFactory.importModel(ModelType.VELOCITY_PICKUP).getAssets();
ModelType modelType = null;
switch (token.getTokenType()) {
case BOOST:
modelType = ModelType.VELOCITY_PICKUP;
break;
case HANDLING:
modelType = ModelType.HANDLING_PICKUP;
break;
case BUMPER:
modelType = ModelType.BUMPER_PICKUP;
break;
case RANDOM:
modelType = ModelType.RANDOM_PICKUP;
break;
case WIND_WALKER:
modelType = ModelType.WIND_WALKER_PICKUP;
break;
}
Node tokenObject = ModelFactory.importModel(modelType).getAssets();
tokenObject.setLayoutX(location.getX());
tokenObject.setLayoutY(location.getY());
mapTokens.add(tokenObject);
@@ -118,7 +118,11 @@ public class ModelFactory {
}
switch (tokenType) {
case VELOCITY_PICKUP:
return makeCoinPickup(assets);
case BUMPER_PICKUP:
case RANDOM_PICKUP:
case HANDLING_PICKUP:
case WIND_WALKER_PICKUP:
return makeTokenPickup(assets);
case FINISH_MARKER:
case PLAIN_MARKER:
case START_MARKER:
@@ -147,24 +151,22 @@ public class ModelFactory {
}
}
private static Model makeCoinPickup(Group assets){
assets.setRotationAxis(new Point3D(1,0,0));
assets.setRotate(90);
assets.setTranslateX(0.2);
assets.setTranslateY(1);
private static Model makeTokenPickup(Group assets) {
Rotate animationRotate = new Rotate(0, new Point3D(0, 0, 1));
assets.getTransforms().addAll(
new Translate(0,-1,0),
new Rotate(0 ,new Point3D(1,1,1))
animationRotate,
new Translate(0, 0, -1)
);
return new Model(new Group(assets), new AnimationTimer() {
private double rotation = 0;
private Group group = assets;
private Rotate rotate = animationRotate;
@Override
public void handle(long now) {
rotation += 1;
((Rotate) group.getTransforms().get(1)).setAngle(rotation);
rotate.setAngle(rotation);
}
});
}
@@ -7,6 +7,10 @@ package seng302.visualiser.fxObjects.assets_3D;
public enum ModelType {
VELOCITY_PICKUP("velocity_pickup.dae"),
HANDLING_PICKUP("turning_pickup.dae"),
WIND_WALKER_PICKUP("wind_walker_pickup.dae"),
BUMPER_PICKUP("bumper_pickup.dae"),
RANDOM_PICKUP("random_pickup.dae"),
FINISH_MARKER ("finish_marker.dae"),
START_MARKER ("start_marker.dae"),
PLAIN_MARKER ("plain_marker.dae"),