Merge branch 'development' into 'dev/test'

merge dev into test

See merge request progproj/gruppen-ht24/Gruppe-01!28
This commit is contained in:
Benjamin Feyer
2024-12-01 22:11:24 +00:00
106 changed files with 728 additions and 127064 deletions

View File

@@ -6,7 +6,7 @@
<option name="WORKING_DIRECTORY" value="$MODULE_WORKING_DIR$" />
<extension name="coverage">
<pattern>
<option name="PATTERN" value="pp.mdga.client.board.Outline.*" />
<option name="PATTERN" value="pp.mdga.client.board.outline.*" />
<option name="ENABLED" value="true" />
</pattern>
</extension>
@@ -14,4 +14,4 @@
<option name="Make" enabled="true" />
</method>
</configuration>
</component>
</component>

View File

@@ -1,32 +0,0 @@
#
# A fatal error has been detected by the Java Runtime Environment:
#
# SIGSEGV (0xb) at pc=0x000076fb04e70b48, pid=112363, tid=112397
#
# JRE version: OpenJDK Runtime Environment Temurin-20.0.2+9 (20.0.2+9) (build 20.0.2+9)
# Java VM: OpenJDK 64-Bit Server VM Temurin-20.0.2+9 (20.0.2+9, mixed mode, sharing, tiered, compressed oops, compressed class ptrs, g1 gc, linux-amd64)
# Problematic frame:
# C [libLLVM.so.18.1+0x1070b48] llvm::EVT::isExtendedVector() const+0x8
#
# Core dump will be written. Default location: Core dumps may be processed with "/usr/lib/systemd/systemd-coredump %P %u %g %s %t %c %h" (or dumping to /home/cedric/ProgProjekt/Gruppe-01/Projekte/mdga/client/core.112363)
#
# If you would like to submit a bug report, please visit:
# https://github.com/adoptium/adoptium-support/issues
# The crash happened outside the Java Virtual Machine in native code.
# See problematic frame for where to report the bug.
#
--------------- S U M M A R Y ------------
Command Line: -Ddebugger.agent.enable.coroutines=true -Djava.util.logging.config.file=logging.properties -Dkotlinx.coroutines.debug.enable.creation.stack.trace=false -agentlib:jdwp=transport=dt_socket,server=n,suspend=y,address=127.0.0.1:37129 -javaagent:/usr/share/idea/plugins/java/lib/rt/debugger-agent.jar -Dfile.encoding=UTF-8 -Duser.country=US -Duser.language=en -Duser.variant -ea pp.mdga.client.MdgaApp
Host: AMD Ryzen 5 8640HS w/ Radeon 760M Graphics, 12 cores, 14G, Manjaro Linux
Time: Fri Nov 29 22:02:46 2024 CET elapsed time: 26.893420 seconds (0d 0h 0m 26s)
--------------- T H R E A D ---------------
Current thread (0x000076fbec5e6dd0): JavaThread "jME3 Main" [_thread_in_native, id=112397, stack(0x000076fbd00fe000,0x000076fbd01fe000)]
Stack: [0x000076fbd00fe000,0x000076fbd01fe000], sp=0x000076fbd01f4ef8, free space=987k
Native frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native code)
C [libLLVM.so.18.1+0x1070b48] llvm::EVT::isExtendedVector() const+0x8

View File

@@ -8,11 +8,11 @@
public enum Asset {
bigTent,
cardStack,
cir("Models/cir/cir_newOrigin.obj"),
heer("Models/heer/heer_newOrigin.obj"),
cir,
heer,
jet,
lw("Models/lw/lw_newOrigin.obj"),
marine("Models/marine/marine_newOrigin.obj"),
lw,
marine,
node_home_blue("Models/node_home/node_home.j3o", "Models/node_home/node_home_blue_diff.png"),
node_wait_blue("Models/node_home/node_home.j3o", "Models/node_home/node_home_blue_diff.png"),
node_home_black("Models/node_home/node_home.j3o", "Models/node_home/node_home_black_diff.png"),
@@ -28,29 +28,29 @@ public enum Asset {
ship(0.8f),
smallTent,
tank,
world("Models/world_new/world_export_new.obj", "Models/world_new/world_new_diff.png", 1.2f),
shield_ring("Models/shield_ring/shield_ring.obj", null),
tree_small("Models/tree_small/tree_small.obj", "Models/tree_small/tree_small_diff.png"),
tree_big("Models/tree_big/tree_big.obj", "Models/tree_big/tree_big_diff.png"),
turboCard("Models/turboCard/turboCard.obj", "Models/turboCard/turboCard_diff.png"),
turboSymbol("Models/turboCard/turboSymbol.obj", "Models/turboCard/turboCard_diff.png"),
swapCard("Models/swapCard/swapCard.obj", "Models/swapCard/swapCard_diff.png"),
swapSymbol("Models/swapCard/swapSymbol.obj", "Models/swapCard/swapCard_diff.png"),
shieldCard("Models/shieldCard/shieldCard.obj", "Models/shieldCard/shieldCard_diff.png"),
shieldSymbol("Models/shieldCard/shieldSymbol.obj", "Models/shieldCard/shieldCard_diff.png"),
dice("Models/dice/dice.obj", "Models/dice/dice_diff.jpeg")
world(1.2f),
shieldRing("Models/shieldRing/shieldRing.j3o", null),
treeSmall,
treeBig,
turboCard,
turboSymbol("Models/turboCard/turboSymbol.j3o", "Models/turboCard/turboCard_diff.j3o"),
swapCard,
swapSymbol("Models/swapCard/swapSymbol.j3o", "Models/swapCard/swapCard_diff.j3o"),
shieldCard,
shieldSymbol("Models/shieldCard/shieldSymbol.j3o", "Models/shieldCard/shieldCard_diff.j3o"),
dice
;
private final String modelPath;
private final String diffPath;
private final float size;
private static final String root = "Models/";
private static final String ROOT = "Models/";
/**
* Default constructor. Initializes modelPath and diffPath based on the enum name and sets default size to 1.0.
*/
Asset() {
String folderFileName = "./" + root + name() + "/" + name();
String folderFileName = "./" + ROOT + name() + "/" + name();
this.modelPath = folderFileName + ".j3o";
this.diffPath = folderFileName + "_diff.png";
this.size = 1f;
@@ -74,7 +74,7 @@ public enum Asset {
* @param modelPath Path to the 3D model file.
*/
Asset(String modelPath) {
String folderFileName = "./" + root + name() + "/" + name();
String folderFileName = "./" + ROOT + name() + "/" + name();
this.modelPath = modelPath;
this.diffPath = folderFileName + "_diff.png";;
this.size = 1f;
@@ -86,7 +86,7 @@ public enum Asset {
* @param size Scaling factor for the asset.
*/
Asset(float size) {
String folderFileName = "./" + root + name() + "/" + name();
String folderFileName = "./" + ROOT + name() + "/" + name();
this.modelPath = folderFileName + ".j3o";
this.diffPath = folderFileName + "_diff.png";
this.size = size;

View File

@@ -18,8 +18,12 @@
import pp.mdga.client.board.PieceControl;
import pp.mdga.client.gui.CardControl;
import pp.mdga.client.view.GameView;
import pp.mdga.game.BonusCard;
import pp.mdga.game.Color;
import pp.mdga.game.Piece;
import pp.mdga.notification.SelectableCardsNotification;
import java.util.List;
public class InputSynchronizer {
@@ -112,6 +116,7 @@ else if(boardSelect != null) {
}
if(name.equals("Test") &&isPressed){
if(app.getView() instanceof GameView gameView){
app.getNotificationSynchronizer().addTestNotification(new SelectableCardsNotification(List.of(BonusCard.SHIELD)));
}
}
}
@@ -272,6 +277,10 @@ public float getRotation() {
return (rotationAngle / 2) % 360;
}
public void setRotation(float rotationAngle){
this.rotationAngle = rotationAngle;
}
/**
* Gets the current scroll value.
*

View File

@@ -39,7 +39,7 @@ public class MdgaApp extends SimpleApplication {
private MdgaState state = null;
/** Scale for rendering images. */
private static final float imageScale = 1.5f;
private static final float IMAGE_SCALE = 1.5f;
/** The main menu view. */
private MdgaView mainView;
@@ -75,8 +75,8 @@ public static void main(String[] args) {
AppSettings settings = new AppSettings(true);
settings.setSamples(128);
settings.setCenterWindow(true);
settings.setWidth(1080);
settings.setHeight(720);
settings.setWidth((int) (1920*0.9f));
settings.setHeight((int) (1080*0.9f));
settings.setVSync(false);
MdgaApp app = new MdgaApp();
@@ -190,7 +190,7 @@ public MdgaState getState() {
* @return the image scale as a float
*/
public float getImageScale() {
return imageScale;
return IMAGE_SCALE;
}
/**

View File

@@ -28,9 +28,6 @@ public class ModelSynchronizer {
this.app = app;
}
private Color testColor;
private int test = 0;
public void animationEnd() {
app.getGameLogic().selectAnimationEnd();
}
@@ -130,42 +127,11 @@ public void setJoin(String ip, int port) {
}
public void leave() {
LOGGER.log(Level.INFO, "leave");
app.getAcousticHandler().playSound(MdgaSound.LEAVE);
enter(MdgaState.MAIN);
app.getGameLogic().selectLeave();
}
public void enter(MdgaState state) {
LOGGER.log(Level.INFO, "enter: {0}", state);
app.enter(state);
if (state == MdgaState.CEREMONY) {
CeremonyView ceremonyView = (CeremonyView) app.getView();
ceremonyView.addCeremonyParticipant(Color.AIRFORCE, 1, "ugidffdg");
ceremonyView.addCeremonyParticipant(Color.ARMY, 2, "ugidffdg");
ceremonyView.addCeremonyParticipant(Color.NAVY, 3, "ugidffdg");
ceremonyView.addCeremonyParticipant(Color.CYBER, 4, "ugidffdg");
ceremonyView.addStatisticsRow("player sdgsd", 1, 2, 3, 4, 5, 6);
ceremonyView.addStatisticsRow("player sdgsd", 1, 2, 3, 4, 5, 6);
ceremonyView.addStatisticsRow("player sdgsd", 1, 2, 3, 4, 5, 6);
ceremonyView.addStatisticsRow("player sdgsd", 1, 2, 3, 4, 5, 6);
ceremonyView.addStatisticsRow("Gesamt", 1, 2, 3, 4, 5, 6);
}
if (state == MdgaState.GAME) {
GameView gameView = (GameView) app.getView();
//app.getNotificationSynchronizer().addTestNotification(new DrawCardNotification(Color.AIRFORCE, BonusCard.SHIELD));
selectPiece(UUID.randomUUID());
}
if (state == MdgaState.LOBBY) {
LobbyView lobbyView = (LobbyView) app.getView();
app.getNotificationSynchronizer().addTestNotification(new TskSelectNotification(Color.CYBER, "blablabupp", false));
app.getNotificationSynchronizer().addTestNotification(new TskSelectNotification(Color.ARMY, "Spieler 2", false));
lobbyView.setReady(Color.ARMY, true);
}
//app.enter(state);
}
}

View File

@@ -43,6 +43,7 @@ public void update() {
throw new RuntimeException("no notification expected: " + n.toString());
}
}
notifications.clear();
}
private void handleMain(Notification notification) {
@@ -59,6 +60,8 @@ private void handleLobby(Notification notification) {
if (notification instanceof TskSelectNotification n) {
lobbyView.setTaken(n.getColor(), true, n.isSelf(), n.getName());
lobbyView.setTaken(n.getColor(), true, false, n.getName());
} else if (notification instanceof StartDialogNotification) {
app.enter(MdgaState.MAIN);
} else if (notification instanceof TskUnselectNotification n) {
lobbyView.setTaken(n.getColor(), false, false, null);
} else if(notification instanceof LobbyReadyNotification lobbyReadyNotification) {
@@ -75,8 +78,8 @@ private void handleGame(Notification notification) {
GuiHandler guiHandler = gameView.getGuiHandler();
BoardHandler boardHandler = gameView.getBoardHandler();
if (notification instanceof AcquireCardNotification) {
// Handle AcquireCardNotification
if (notification instanceof AcquireCardNotification n) {
guiHandler.addCard(n.getBonusCard());
} else if (notification instanceof ActivePlayerNotification n) {
gameView.getGuiHandler().setActivePlayer(n.getColor());
} else if (notification instanceof CeremonyNotification ceremonyNotification) {
@@ -144,11 +147,11 @@ private void handleGame(Notification notification) {
//TODO
} else if (notification instanceof RollDiceNotification n) {
if(n.getColor() == gameView.getOwnColor()){
//guiHandler.rollDice(n.getEyes(), n.isTurbo() ? n.getMultiplier() : -1);
guiHandler.rollDice(n.getEyes(), n.isTurbo() ? n.getMultiplier() : -1);
}
else {
//if (n.isTurbo()) guiHandler.showRolledDiceMult(n.getEyes(), n.getMultiplier(), n.getColor());
//else guiHandler.showRolledDice(n.getEyes(), n.getColor());
if (n.isTurbo()) guiHandler.showRolledDiceMult(n.getEyes(), n.getMultiplier(), n.getColor());
else guiHandler.showRolledDice(n.getEyes(), n.getColor());
}
} else if (notification instanceof SelectableCardsNotification n) {
guiHandler.setSelectableCards(n.getCards());
@@ -167,10 +170,10 @@ private void handleGame(Notification notification) {
boardHandler.outlineMove(n.getPieces(), n.getMoveIndices(), n.getHomeMoves());
} else if (notification instanceof SelectableSwapNotification n) {
boardHandler.outlineSwap(n.getOwnPieces(), n.getEnemyPieces());
// } //else if (notification instanceof SelectableShieldNotification n) {
// boardHandler.outlineShield(n.getOwnPieces());
//} else if (notification instanceof TurboActiveNotification){
// guiHandler.turbo();
} else if (notification instanceof SelectableShieldNotification n) {
boardHandler.outlineShield(n.getPieces());
} else if (notification instanceof TurboActiveNotification){
guiHandler.turbo();
} else {
throw new RuntimeException("notification not expected: " + notification.toString());
}

View File

@@ -20,7 +20,7 @@ enum MusicAsset {
private final String path;
private final boolean loop;
private final float subVolume;
private static final String root = "Music/";
private static final String ROOT = "Music/";
/**
* Constructs a new MusicAsset object with the specified name and sub-volume.
@@ -30,7 +30,7 @@ enum MusicAsset {
* @param subVolume A relative volume that modifies the base volume of the track (typically a percentage).
*/
MusicAsset(String name, float subVolume) {
this.path = root + name;
this.path = ROOT + name;
this.loop = false;
this.subVolume = subVolume;
}
@@ -43,7 +43,7 @@ enum MusicAsset {
* @param subVolume A relative volume that modifies the base volume of the track (typically a percentage).
*/
MusicAsset(String name, boolean loop, float subVolume) {
this.path = root + name;
this.path = ROOT + name;
this.loop = loop;
this.subVolume = subVolume;
}

View File

@@ -30,7 +30,7 @@ public class BoardHandler {
private Map<Color, List<PieceControl>> waitingPiecesMap;
private Map<UUID, Color> pieceColor;
private Node node = new Node();
private Node rootNodeBoard;
private final Node rootNode;
private final FilterPostProcessor fpp;
@@ -49,6 +49,7 @@ public BoardHandler(MdgaApp app, Node rootNode, FilterPostProcessor fpp) {
this.app = app;
this.fpp = fpp;
rootNodeBoard = new Node("Board Root Node");
this.rootNode = rootNode;
isInitialised = false;
}
@@ -61,14 +62,13 @@ public void init() {
selectedOwnPiece = null;
selectedEnemyPiece = null;
initMap();
rootNode.attachChild(node);
rootNode.attachChild(rootNodeBoard);
}
public void shutdown(){
clearSelectable();
isInitialised = false;
initMap();
rootNode.detachChild(node);
rootNode.detachChild(rootNodeBoard);
}
private void addFigureToPlayerMap(Color col, AssetOnMap assetOnMap) {
@@ -132,7 +132,7 @@ private Spatial createModel(Asset asset, Vector3f pos, float rot) {
Material mat = new Material(app.getAssetManager(), "Common/MatDefs/Light/Lighting.j3md");
mat.setTexture("DiffuseMap", app.getAssetManager().loadTexture(texName));
model.setMaterial(mat);
node.attachChild(model);
rootNodeBoard.attachChild(model);
return model;
}
@@ -468,7 +468,7 @@ public void enableHover(UUID uuid){
}
public void showDice(Color color){
node.attachChild(diceControl.getSpatial());
rootNodeBoard.attachChild(diceControl.getSpatial());
diceControl.setPos(getWaitingPos(color).add(new Vector3f(0,0,4)));
diceControl.spin();
}

View File

@@ -13,6 +13,7 @@
import com.jme3.util.SkyFactory;
import com.jme3.util.SkyFactory.EnvMapType;
import pp.mdga.client.MdgaApp;
import pp.mdga.game.Color;
public class CameraHandler {
MdgaApp app;
@@ -29,11 +30,15 @@ public class CameraHandler {
DirectionalLightShadowFilter dlsf;
Spatial sky;
private Color ownColor;
private boolean init;
private boolean initRot;
public CameraHandler(MdgaApp app, FilterPostProcessor fpp) {
init = false;
initRot = false;
this.app = app;
this.fpp = fpp;
// Save the default camera state
this.defaultCameraPosition = app.getCamera().getLocation().clone();
this.defaultCameraRotation = app.getCamera().getRotation().clone();
@@ -45,23 +50,26 @@ public CameraHandler(MdgaApp app, FilterPostProcessor fpp) {
ambient = new AmbientLight();
ambient.setColor(new ColorRGBA(0.3f, 0.3f, 0.3f, 1));
dlsf = new DirectionalLightShadowFilter(app.getAssetManager(), SHADOWMAP_SIZE, 4);
dlsf = new DirectionalLightShadowFilter(app.getAssetManager(), SHADOWMAP_SIZE, 1);
dlsf.setLight(sun);
dlsf.setEnabled(true);
dlsf.setEdgeFilteringMode(EdgeFilteringMode.PCFPOISSON);
dlsf.setShadowIntensity(0.7f);
fpp.addFilter(dlsf);
sky = SkyFactory.createSky(app.getAssetManager(), "Images/sky/sky.dds", EnvMapType.EquirectMap).rotate(FastMath.HALF_PI*1,0,FastMath.HALF_PI*0.2f);
}
public void init() {
public void init(Color ownColor) {
app.getRootNode().addLight(sun);
app.getRootNode().addLight(ambient);
app.getRootNode().attachChild(sky);
fpp.addFilter(dlsf);
init = true;
initRot = true;
this.ownColor = ownColor;
app.getInputSynchronize().setRotation(getInitAngleByColor(ownColor)*2);
}
public void shutdown() {
@@ -77,6 +85,7 @@ public void shutdown() {
}
public void update(float scroll, float rotation) {
if(!init) return;
float scrollValue = Math.max(0, Math.min(scroll, 100));
float rotationValue = rotation % 360;
@@ -84,6 +93,7 @@ public void update(float scroll, float rotation) {
rotationValue += 360;
}
float radius;
float verticalAngle;
@@ -92,10 +102,9 @@ public void update(float scroll, float rotation) {
radius = 30f;
} else {
verticalAngle = 90f;
rotationValue = 270f;
rotationValue = getAngleByColor(ownColor);
radius = 50f;
}
float verticalAngleRadians = FastMath.DEG_TO_RAD * verticalAngle;
float z = radius * FastMath.sin(verticalAngleRadians);
@@ -108,4 +117,18 @@ public void update(float scroll, float rotation) {
app.getCamera().lookAt(Vector3f.ZERO, Vector3f.UNIT_Z);
}
private float getAngleByColor(Color color){
return switch (color){
case ARMY -> 0;
case AIRFORCE -> 90;
case NAVY -> 270;
case CYBER -> 180;
default -> throw new RuntimeException("None is not allowed");
};
}
private float getInitAngleByColor(Color color){
return (getAngleByColor(color) + 180) % 360;
}
}

View File

@@ -84,8 +84,8 @@ private static Asset getLoadedAsset(String assetName) {
case "radar" -> Asset.radar;
case "ship" -> Asset.ship;
case "tank" -> Asset.tank;
case "tree_small" -> Asset.tree_small;
case "tree_big" -> Asset.tree_big;
case "tree_small" -> Asset.treeSmall;
case "tree_big" -> Asset.treeBig;
default -> throw new IllegalStateException("Unexpected value: " + assetName);
};
}

View File

@@ -8,7 +8,7 @@
import com.jme3.scene.Spatial;
import com.jme3.scene.control.AbstractControl;
import pp.mdga.client.MdgaApp;
import pp.mdga.client.board.Outline.SelectObjectOutliner;
import pp.mdga.client.board.outline.SelectObjectOutliner;
public class OutlineControl extends AbstractControl {
private static final int THICKNESS_DEFAULT = 6;
@@ -18,17 +18,17 @@ public class OutlineControl extends AbstractControl {
public OutlineControl(MdgaApp app, FilterPostProcessor fpp){
this.app = app;
outlineOwn = new SelectObjectOutliner(THICKNESS_DEFAULT, fpp, app.getRenderManager(), app.getAssetManager(), app.getCamera());
outlineOwn = new SelectObjectOutliner(THICKNESS_DEFAULT, fpp, app.getRenderManager(), app.getAssetManager(), app.getCamera(), app);
}
public OutlineControl(MdgaApp app, FilterPostProcessor fpp, Camera cam){
this.app = app;
outlineOwn = new SelectObjectOutliner(THICKNESS_DEFAULT, fpp, app.getRenderManager(), app.getAssetManager(), cam);
outlineOwn = new SelectObjectOutliner(THICKNESS_DEFAULT, fpp, app.getRenderManager(), app.getAssetManager(), cam, app);
}
public OutlineControl(MdgaApp app, FilterPostProcessor fpp, Camera cam, int thickness){
this.app = app;
outlineOwn = new SelectObjectOutliner(thickness, fpp, app.getRenderManager(), app.getAssetManager(), cam);
outlineOwn = new SelectObjectOutliner(thickness, fpp, app.getRenderManager(), app.getAssetManager(), cam, app);
}
public void outline(ColorRGBA color){

View File

@@ -102,7 +102,7 @@ public void rotateInit() {
}
public void activateShield(){
shieldRing = assetManager.loadModel(Asset.shield_ring.getModelPath());
shieldRing = assetManager.loadModel(Asset.shieldRing.getModelPath());
shieldRing.scale(1f);
shieldRing.rotate((float) Math.toRadians(0), 0, (float) Math.toRadians(0));
shieldRing.setLocalTranslation(spatial.getLocalTranslation().add(new Vector3f(0,0,SHIELD_Z)));

View File

@@ -1,4 +1,4 @@
package pp.mdga.client.board.Outline;
package pp.mdga.client.board.outline;
import com.jme3.asset.AssetManager;
import com.jme3.material.Material;
@@ -10,7 +10,7 @@
import com.jme3.renderer.ViewPort;
import com.jme3.texture.FrameBuffer;
public class OutlineFilter extends Filter {
private OutlinePreFilter outlinePreFilter;

View File

@@ -1,4 +1,4 @@
package pp.mdga.client.board.Outline;
package pp.mdga.client.board.outline;
import com.jme3.asset.AssetManager;
import com.jme3.material.Material;
@@ -11,12 +11,12 @@
import com.jme3.texture.Image.Format;
import com.jme3.texture.Texture;
public class OutlinePreFilter extends Filter {
private Pass normalPass;
private RenderManager renderManager;
/**
* Creates a OutlinePreFilter
*/

View File

@@ -1,4 +1,4 @@
package pp.mdga.client.board.Outline;
package pp.mdga.client.board.outline;
import com.jme3.asset.AssetManager;
import com.jme3.material.Material;

View File

@@ -1,4 +1,4 @@
package pp.mdga.client.board.Outline;
package pp.mdga.client.board.outline;
import com.jme3.asset.AssetManager;
import com.jme3.math.ColorRGBA;
@@ -7,6 +7,7 @@
import com.jme3.renderer.RenderManager;
import com.jme3.renderer.ViewPort;
import com.jme3.scene.Spatial;
import pp.mdga.client.MdgaApp;
public class SelectObjectOutliner {
@@ -19,14 +20,16 @@ public class SelectObjectOutliner {
private ViewPort outlineViewport = null;
// private OutlineFilter outlineFilter = null;
private OutlineProFilter outlineFilter = null;
private final MdgaApp app;
public SelectObjectOutliner(int width, FilterPostProcessor fpp, RenderManager renderManager, AssetManager assetManager, Camera cam) {
public SelectObjectOutliner(int width, FilterPostProcessor fpp, RenderManager renderManager, AssetManager assetManager, Camera cam, MdgaApp app) {
this.selected = false;
this.fpp = fpp;
this.renderManager = renderManager;
this.assetManager = assetManager;
this.cam = cam;
this.width = width;
this.app = app;
}
public void deselect(Spatial model) {
@@ -51,30 +54,35 @@ public void select(Spatial model, ColorRGBA color, int width) {
}
private void hideOutlineFilterEffect(Spatial model) {
outlineFilter.setEnabled(false);
outlineFilter.getOutlinePreFilter().setEnabled(false);
fpp.removeFilter(outlineFilter);
outlineViewport.detachScene(model);
outlineViewport.clearProcessors();
renderManager.removePreView(outlineViewport);
outlineViewport = null;
// app.enqueue(() -> {
outlineFilter.setEnabled(false);
outlineFilter.getOutlinePreFilter().setEnabled(false);
fpp.removeFilter(outlineFilter);
outlineViewport.detachScene(model);
outlineViewport.clearProcessors();
renderManager.removePreView(outlineViewport);
outlineViewport = null;
// return null;
// });
}
private void showOutlineFilterEffect(Spatial model, int width, ColorRGBA color) {
outlineViewport = renderManager.createPreView("outlineViewport", cam);
FilterPostProcessor outlineFpp = new FilterPostProcessor(assetManager);
// app.enqueue(() -> {
outlineViewport = renderManager.createPreView("outlineViewport", cam);
FilterPostProcessor outlineFpp = new FilterPostProcessor(assetManager);
OutlinePreFilter outlinePreFilter = new OutlinePreFilter();
outlineFpp.addFilter(outlinePreFilter);
OutlinePreFilter outlinePreFilter = new OutlinePreFilter();
outlineFpp.addFilter(outlinePreFilter);
outlineViewport.attachScene(model);
outlineViewport.addProcessor(outlineFpp);
outlineViewport.attachScene(model);
outlineViewport.addProcessor(outlineFpp);
// outlineFilter = new OutlineFilter(outlinePreFilter);
outlineFilter = new OutlineProFilter(outlinePreFilter);
outlineFilter.setOutlineColor(color);
outlineFilter.setOutlineWidth(width);
outlineFilter = new OutlineProFilter(outlinePreFilter);
outlineFilter.setOutlineColor(color);
outlineFilter.setOutlineWidth(width);
fpp.addFilter(outlineFilter);
fpp.addFilter(outlineFilter);
// return null;
// });
}
}

View File

@@ -110,7 +110,7 @@ public CeremonyButton(MdgaApp app, Node node, Node node3d, Color tsk, Pos pos, S
instance.setText("Marine");
yield Asset.marine;
}
default -> throw new RuntimeException("Color not supported");
default -> throw new RuntimeException("None is not valid");
};
switch (pos) {

View File

@@ -197,14 +197,14 @@ protected void setImageRelative(Picture picture) {
return;
}
final float LARGER = 10;
final float larger = 10;
picture.setWidth(instance.getPreferredSize().x + LARGER);
picture.setHeight(instance.getPreferredSize().y + LARGER);
picture.setWidth(instance.getPreferredSize().x + larger);
picture.setHeight(instance.getPreferredSize().y + larger);
picture.setLocalTranslation(
instance.getLocalTranslation().x - LARGER / 2,
(instance.getLocalTranslation().y - picture.getHeight()) + LARGER / 2,
instance.getLocalTranslation().x - larger / 2,
(instance.getLocalTranslation().y - picture.getHeight()) + larger / 2,
instance.getLocalTranslation().z + 0.01f
);
}

View File

@@ -28,5 +28,6 @@ public void hide() {
}
protected abstract void onShow();
protected abstract void onHide ();
protected abstract void onHide();
}

View File

@@ -65,6 +65,7 @@ public void update(float delta) {
try {
this.connectionFuture.get();
} catch (ExecutionException ignored) {
// todo: implement
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}

View File

@@ -117,7 +117,7 @@ private ColorRGBA playerColorToColorRGBA(Color color){
case NAVY -> ColorRGBA.Blue;
case CYBER -> ColorRGBA.Orange;
case AIRFORCE -> ColorRGBA.Black;
default -> throw new RuntimeException("Color not supported");
default -> throw new RuntimeException("None is not valid");
};
}

View File

@@ -84,9 +84,6 @@ public Node getRoot() {
public void initSpatial(){
}
public void outline(){
super.outline(OUTLINE_COLOR);
}

View File

@@ -4,7 +4,6 @@
import com.jme3.app.state.AbstractAppState;
import com.jme3.app.state.AppStateManager;
import com.jme3.light.DirectionalLight;
import com.jme3.material.Material;
import com.jme3.math.ColorRGBA;
import com.jme3.math.Vector3f;
import com.jme3.post.FilterPostProcessor;
@@ -15,16 +14,16 @@
import com.jme3.scene.Node;
import com.jme3.scene.Spatial;
import com.jme3.shadow.DirectionalLightShadowFilter;
import com.jme3.shadow.DirectionalLightShadowRenderer;
import com.jme3.shadow.EdgeFilteringMode;
import com.jme3.texture.Image;
import com.jme3.texture.Texture2D;
import pp.mdga.client.Asset;
import java.util.*;
public class CardLayer extends AbstractAppState {
public static final int SHADOWMAP_SIZE = 1024 * 8;
private Node root;
private Application app;
private boolean init;
@@ -43,7 +42,7 @@ public CardLayer(FilterPostProcessor fpp, Camera overlayCam, Texture2D backTextu
}
@Override
public void initialize(AppStateManager stateManager, Application app ) {
public void initialize(AppStateManager stateManager, Application app) {
this.app = app;
root = new Node("Under gui viewport Root");
@@ -57,11 +56,9 @@ public void initialize(AppStateManager stateManager, Application app ) {
DirectionalLight sun = new DirectionalLight();
sun.setColor(ColorRGBA.White);
sun.setDirection(new Vector3f(.5f,-.5f,-1));
sun.setDirection(new Vector3f(.5f, -.5f, -1));
root.addLight(sun);
final int SHADOWMAP_SIZE=1024*8;
DirectionalLightShadowFilter dlsf = new DirectionalLightShadowFilter(app.getAssetManager(), SHADOWMAP_SIZE, 3);
dlsf.setLight(sun);
dlsf.setEnabled(true);
@@ -71,27 +68,24 @@ public void initialize(AppStateManager stateManager, Application app ) {
view.addProcessor(fpp);
if(!init) init = true;
if (!init) init = true;
}
public void shutdown(){
public void shutdown() {
cardBuffer.clear();
root.detachAllChildren();
}
@Override
public void render(RenderManager rm) {
root.updateGeometricState();
}
@Override
public void update( float tpf ) {
public void update(float tpf) {
if (init && !cardBuffer.isEmpty()) {
for(Spatial spatial : cardBuffer){
for (Spatial spatial : cardBuffer) {
root.attachChild(spatial);
}
cardBuffer.clear();
@@ -99,19 +93,19 @@ public void update( float tpf ) {
root.updateLogicalState(tpf);
}
public void addSpatial(Spatial card){
public void addSpatial(Spatial card) {
cardBuffer.add(card);
}
public void deleteSpatial(Spatial spatial){
public void deleteSpatial(Spatial spatial) {
root.detachChild(spatial);
}
public Camera getOverlayCam(){
public Camera getOverlayCam() {
return overlayCam;
}
public Node getRootNode(){
public Node getRootNode() {
return root;
}
}
}

View File

@@ -43,6 +43,7 @@ public void init() {
cardLayerCamera = createOverlayCam();
cardLayer = new CardLayer(fpp, cardLayerCamera, backTexture);
app.getStateManager().attach(cardLayer);
diceControl = new DiceControl(app.getAssetManager());
diceControl.create(new Vector3f(0, 0, 0), 1f, false);
}
@@ -50,6 +51,7 @@ public void init() {
public void shutdown() {
if (cardLayer != null) {
cardLayer.shutdown();
clearSelectableCards();
}
cardLayer = null;
}

View File

@@ -16,11 +16,11 @@ public class GuiHandler {
private final CardLayerHandler cardLayerHandler;
private final PlayerNameHandler playerNameHandler;
private final ActionTextHandler actionTextHandler;
private final Color ownColor;
private Color ownColor;
private FrameBuffer backFrameBuffer;
public GuiHandler(MdgaApp app, Node guiNode, Color ownColor) {
public GuiHandler(MdgaApp app, Node guiNode) {
this.app = app;
this.ownColor = ownColor;
@@ -34,8 +34,10 @@ public GuiHandler(MdgaApp app, Node guiNode, Color ownColor) {
actionTextHandler = new ActionTextHandler(guiNode, app.getAssetManager(), app.getContext().getSettings());
}
public void init() {
public void init(Color ownColor) {
cardLayerHandler.init();
playerNameHandler.show();
this.ownColor = ownColor;
app.getViewPort().setOutputFrameBuffer(backFrameBuffer);
}

View File

@@ -78,7 +78,7 @@ private String imagePath(Color color){
case NAVY -> root+"MARINE_IMAGE.png";
case CYBER -> root+"CIR_IMAGE.png";
case AIRFORCE -> root+"LW_IMAGE.png";
default -> {throw new RuntimeException("Color not supported");}
default -> throw new RuntimeException("None is not valid");
};
}

View File

@@ -16,14 +16,13 @@ public class SymbolControl extends AbstractControl {
private BonusCard state;
private float rotationSpeed = 0.8f;
private Quaternion initialRotation = null;
private float Y = 5;
private float y = 5;
@Override
protected void controlUpdate(float tpf) {
if(state == null) return;
switch (state){
if (state == null) return;
switch (state) {
case SHIELD -> shieldUpdate(tpf);
case SWAP -> swapUpdate(tpf);
case TURBO -> turboUpdate(tpf);
@@ -36,7 +35,7 @@ protected void controlRender(RenderManager rm, ViewPort vp) {
}
private void shieldUpdate(float tpf){
private void shieldUpdate(float tpf) {
if (zoomingIn) {
progress += tpf * zoomSpeed;
if (progress > 1) progress = 1;
@@ -58,13 +57,13 @@ private void shieldUpdate(float tpf){
}
}
private void swapUpdate(float tpf){
private void swapUpdate(float tpf) {
if (initialRotation == null) {
initialRotation = spatial.getLocalRotation().clone();
}
progress += tpf*rotationSpeed;
if(progress < 0) return;
progress += tpf * rotationSpeed;
if (progress < 0) return;
float angle = lerp(0, 360, easeInOut(progress));
@@ -80,12 +79,13 @@ private void swapUpdate(float tpf){
spatial.removeFromParent();
}
}
private void turboUpdate(float tpf){
private void turboUpdate(float tpf) {
if (zoomingIn) {
progress += tpf * zoomSpeed;
if (progress > 1) progress = 1;
float y = lerp(-Y,0, easeOut(progress));
spatial.setLocalTranslation(0,y,0);
float y = lerp(-this.y, 0, easeOut(progress));
spatial.setLocalTranslation(0, y, 0);
if (progress >= 1) {
zoomingIn = false;
zoomingOut = true;
@@ -93,8 +93,8 @@ private void turboUpdate(float tpf){
}
} else if (zoomingOut) {
progress += tpf * zoomSpeed;
float y = lerp(0,Y, easeIn(progress));
spatial.setLocalTranslation(0,y,0);
float y = lerp(0, this.y, easeIn(progress));
spatial.setLocalTranslation(0, y, 0);
if (progress > 1) {
zoomingIn = false;
spatial.removeFromParent();
@@ -103,8 +103,8 @@ private void turboUpdate(float tpf){
}
}
public void shield(){
if(state != null) throw new RuntimeException("another state is avtive");
public void shield() {
if (state != null) throw new RuntimeException("another state is avtive");
state = BonusCard.SHIELD;
zoomingIn = true;
zoomingOut = false;
@@ -112,15 +112,15 @@ public void shield(){
spatial.setLocalScale(1f);
}
public void swap(){
if(state != null) throw new RuntimeException("another state is avtive");
public void swap() {
if (state != null) throw new RuntimeException("another state is avtive");
spatial.setLocalScale(3);
state = BonusCard.SWAP;
progress = -0.2f;
}
public void turbo(){
if(state != null) throw new RuntimeException("another state is avtive");
public void turbo() {
if (state != null) throw new RuntimeException("another state is avtive");
spatial.setLocalScale(2);
state = BonusCard.TURBO;
zoomingIn = true;
@@ -137,7 +137,7 @@ private static float easeOut(float t) {
}
private float easeInOut(float t) {
if(t>1) t=1;
if (t > 1) t = 1;
return (float) -(Math.cos(Math.PI * t) - 1) / 2;
}

View File

@@ -12,15 +12,16 @@ public class ZoomControl extends AbstractControl {
private float zoomSpeed = 1f;
private float zoomFactor = 1f;
public ZoomControl(){}
public ZoomControl() {
}
public ZoomControl(float speed) {
zoomSpeed = speed;
}
@Override
public void setSpatial(Spatial spatial){
if(this.spatial == null && spatial != null){
public void setSpatial(Spatial spatial) {
if (this.spatial == null && spatial != null) {
super.setSpatial(spatial);
initSpatial();
}
@@ -51,7 +52,7 @@ protected void controlUpdate(float tpf) {
}
}
private void end(){
private void end() {
spatial.removeFromParent();
spatial.removeControl(this);
}
@@ -65,14 +66,15 @@ private static float lerp(float start, float end, float t) {
return (1 - t) * start + t * end;
}
// private static float easeOut(float t) {
// private static float easeOut(float t) {
// return (float) Math.sqrt(1 - Math.pow(t - 1, 2));
// }
private float easeOut(float x) {
private float easeOut(float x) {
return x == 1 ? 1 : (float) (1 - Math.pow(2, -10 * x));
}
// private float easeIn(float t) {
// private float easeIn(float t) {
// return t * t * t * t;
// }
private float easeIn(float x) {

View File

@@ -14,6 +14,7 @@
import java.io.IOException;
import java.lang.System.Logger;
import java.lang.System.Logger.Level;
import java.net.InetAddress;
import java.util.Map;
import java.util.UUID;
import java.util.concurrent.BlockingQueue;
@@ -52,6 +53,7 @@ public MdgaServer(int port) {
LOGGER.log(Level.INFO, "Creating MdgaServer"); //NON-NLS
logic = new ServerGameLogic(this, new Game());
}
/**
*
*/
@@ -67,13 +69,13 @@ public void run() {
private void startServer() {
try {
LOGGER.log(Level.INFO, "Starting server..."); //NON-NLS
myServer = Network.createServer(port);
initializeSerializables();
myServer.start();
registerListeners();
LOGGER.log(Level.INFO, "Server started: {0}", myServer.isRunning()); //NON-NLS
}
catch (IOException e) {
} catch (IOException e) {
LOGGER.log(Level.ERROR, "Couldn't start server: {0}", e.getMessage()); //NON-NLS
exit(1);
}
@@ -190,6 +192,7 @@ private void messageReceived(HostedConnection source, ClientMessage message) {
@Override
public void connectionAdded(Server server, HostedConnection hostedConnection) {
System.out.println("new connection " + hostedConnection); //NON-NLS
LOGGER.log(Level.DEBUG, "new connection {0}", hostedConnection); //NON-NLS
}
@@ -250,7 +253,7 @@ public void send(int id, ServerMessage message) {
*/
@Override
public void broadcast(ServerMessage message) {
for (Map.Entry<Integer, Player> entry: this.logic.getGame().getPlayers().entrySet()) {
for (Map.Entry<Integer, Player> entry : this.logic.getGame().getPlayers().entrySet()) {
this.send(entry.getKey(), message);
}
}

View File

@@ -9,7 +9,22 @@
import pp.mdga.client.button.ButtonLeft;
import pp.mdga.client.button.ButtonRight;
import pp.mdga.client.gui.GuiHandler;
import pp.mdga.game.BonusCard;
import pp.mdga.game.Color;
import pp.mdga.notification.AcquireCardNotification;
import pp.mdga.notification.ActivePlayerNotification;
import pp.mdga.notification.DiceNowNotification;
import pp.mdga.notification.GameNotification;
import pp.mdga.notification.MovePieceNotification;
import pp.mdga.notification.PlayerInGameNotification;
import pp.mdga.notification.RollDiceNotification;
import pp.mdga.notification.SelectableCardsNotification;
import pp.mdga.notification.SelectableMoveNotification;
import pp.mdga.notification.ShieldActiveNotification;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
public class GameView extends MdgaView {
private BoardHandler boardHandler;
@@ -37,25 +52,63 @@ public GameView(MdgaApp app) {
this.camera = new CameraHandler(app, fpp);
this.boardHandler = new BoardHandler(app, rootNode, fpp);
guiHandler = new GuiHandler(app, guiNode, ownColor);
guiHandler = new GuiHandler(app, guiNode);
}
@Override
public void onEnter() {
camera.init();
setOwnColor(Color.AIRFORCE);
camera.init(ownColor);
boardHandler.init();
guiHandler.init();
guiHandler.init(ownColor);
app.getViewPort().addProcessor(fpp);
app.getAcousticHandler().playSound(MdgaSound.START);
//Test
// List<UUID> uuid1 = new ArrayList<>();
// UUID p1 = UUID.randomUUID();
// UUID p2 = UUID.randomUUID();
// uuid1.add(p1);
// uuid1.add(p2);
// uuid1.add(UUID.randomUUID());
// uuid1.add(UUID.randomUUID());
// List<UUID> uuid2 = new ArrayList<>();
// UUID p1_2 = UUID.randomUUID();
// UUID p2_2 = UUID.randomUUID();
// uuid2.add(p1_2);
// uuid2.add(p2_2);
// uuid2.add(UUID.randomUUID());
// uuid2.add(UUID.randomUUID());
// app.getNotificationSynchronizer().addTestNotification(new PlayerInGameNotification(Color.AIRFORCE, uuid1, "Cedric"));
// app.getNotificationSynchronizer().addTestNotification(new PlayerInGameNotification(Color.NAVY, uuid2, "Test"));
// app.getNotificationSynchronizer().addTestNotification(new MovePieceNotification(p1, 0, true));
// app.getNotificationSynchronizer().addTestNotification(new MovePieceNotification(p1_2, 30, true));
// app.getNotificationSynchronizer().addTestNotification(new SelectableMoveNotification(List.of(p1), List.of(4), List.of(false)));
// app.getNotificationSynchronizer().addTestNotification(new AcquireCardNotification(BonusCard.SHIELD));
// app.getNotificationSynchronizer().addTestNotification(new SelectableCardsNotification(List.of(BonusCard.SHIELD)));
// app.getNotificationSynchronizer().addTestNotification(new ShieldActiveNotification(p1));
// app.getNotificationSynchronizer().addTestNotification(new ActivePlayerNotification(Color.NAVY));
// app.getNotificationSynchronizer().addTestNotification(new DiceNowNotification());
// app.getNotificationSynchronizer().addTestNotification(new RollDiceNotification(Color.AIRFORCE, 5, true, 2));
//p1 = p1;
}
@Override
public void onLeave() {
camera.shutdown();
boardHandler.shutdown();
guiHandler.shutdown();
camera.shutdown();
confirmButton.hide();

View File

@@ -18,6 +18,7 @@
import pp.mdga.client.button.LobbyButton;
import pp.mdga.client.button.SettingsButton;
import pp.mdga.game.Color;
import pp.mdga.notification.GameNotification;
public class LobbyView extends MdgaView {
private Geometry background;
@@ -186,7 +187,7 @@ public void setReady(Color color, boolean isReady) {
case AIRFORCE -> airforceButton;
case ARMY -> armyButton;
case NAVY -> navyButton;
default -> throw new IllegalStateException("Unexpected value: " + color);
default -> throw new RuntimeException("None is not valid");
};
button.setReady(isReady);

View File

@@ -102,25 +102,23 @@ private void tryHost() {
if(port >= 1 && port <= 65535) {
app.getModelSynchronize().setName(startDialog.getName());
hostDialog.setHostname(Inet4Address.getLocalHost().getHostAddress());
hostDialog.hostServer();
try {
Thread.sleep(1000);
} catch (InterruptedException ignored) {
// todo: implement
}
hostDialog.connectServerAsClient();
try {
Thread.sleep(1000);
} catch (InterruptedException ignored) {
// todo: implement
}
app.getModelSynchronize().setHost(port);
//app.getAcousticHandler().playSound(MdgaSound.WRONG_INPUT);
return;
}
} catch (NumberFormatException e) {
//nothing
} catch (UnknownHostException e) {
throw new RuntimeException(e);
} catch (NumberFormatException ignored) {
}
hostDialog.resetPort();
@@ -130,7 +128,7 @@ private void tryHost() {
private void tryJoin() {
int port = 0;
String ip = joinDialog.getIpt();
String portText = hostDialog.getPort();
String portText = joinDialog.getPort();
try {
// Validate the port
@@ -138,19 +136,24 @@ private void tryJoin() {
if (port < 1 || port > 65535) {
throw new IllegalArgumentException("Invalid port");
}
joinDialog.setPortNumber(port);
// Validate the IP address
if (isValidIpAddress(ip)) {
app.getModelSynchronize().setName(startDialog.getName());
app.getModelSynchronize().setJoin(ip, port);
joinDialog.setHostname(ip);
joinDialog.connectToServer();
try {
Thread.sleep(1000);
} catch (InterruptedException ignored) {
}
app.getModelSynchronize().setJoin(ip, port);
return;
}
} catch (IllegalArgumentException e) {
// Invalid input, fall through to reset
}
hostDialog.resetPort();
joinDialog.resetPort();
joinDialog.resetIp();
app.getAcousticHandler().playSound(MdgaSound.WRONG_INPUT);
}

View File

@@ -20,9 +20,9 @@ public enum Overlay {
}
protected MdgaApp app;
protected Node rootNode = new Node();
protected Node guiNode = new Node();
protected Node overlayNode = new Node();
protected Node rootNode = new Node("View Root");
protected Node guiNode = new Node("View Root GUI");
protected Node overlayNode = new Node("View Root Overlay");
private SettingsButton settingsButton;
@@ -51,8 +51,8 @@ public void enter() {
}
public void leave() {
app.getRootNode().detachChild(rootNode);
app.getGuiNode().detachChild(guiNode);
onLeave();
settingsButton.hide();
@@ -60,7 +60,8 @@ public void leave() {
pressEscape();
}
onLeave();
app.getRootNode().detachChild(rootNode);
app.getGuiNode().detachChild(guiNode);
}
public void enterOverlay(Overlay overlay) {
@@ -83,10 +84,14 @@ public void update(float tpf) {
}
protected abstract void onEnter();
protected abstract void onLeave();
protected void onUpdate(float tpf) {}
protected void onUpdate(float tpf) {
}
protected abstract void onEnterOverlay(Overlay overlay);
protected abstract void onLeaveOverlay(Overlay overlay);
protected Geometry createBackground(String texturePath) {
@@ -161,9 +166,9 @@ private void leaveAdvanced() {
}
public void pressEscape() {
if(settingsDepth == 0) {
if (settingsDepth == 0) {
enterSettings();
} else if(settingsDepth == 1) {
} else if (settingsDepth == 1) {
leaveSettings();
} else {
leaveAdvanced();
@@ -171,20 +176,20 @@ public void pressEscape() {
}
public void pressForward() {
if(this instanceof MainView mainView) {
if (this instanceof MainView mainView) {
mainView.forward(false);
app.getAcousticHandler().playSound(MdgaSound.BUTTON_PRESSED);
}
if(this instanceof LobbyView lobbyView) {
if (this instanceof LobbyView lobbyView) {
lobbyView.ready();
}
if(this instanceof GameView gameView) {
if (this instanceof GameView gameView) {
app.getAcousticHandler().playSound(MdgaSound.WRONG_INPUT);
}
if(this instanceof CeremonyView ceremonyView) {
if (this instanceof CeremonyView ceremonyView) {
ceremonyView.forward();
}
}

View File

@@ -46,17 +46,21 @@ cir 5,4 0
cir 5,5 0
#Assets
jet -10,-1 45
ship 11,0 169
big_tent -9,-7 130
big_tent 7,-10 225
jet -12,0 45
jet -17,-2 55
small_tent -9,7 45
small_tent -10,5 60
small_tent -7,8 30
ship 11,0 169
small_tent 6,8 340
small_tent 8,7 320
big_tent -10,-9 130
big_tent 9,-10 225
radar 0,10 -20
small_tent 6,8 190
small_tent 8,7 160
tank -1,-10 135
tank 0,-18 180
tank 3,-18 180
tank -3,-18 180
#Yellow (CIR) wait Node
node_wait_yellow 4,5 0

File diff suppressed because it is too large Load Diff

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.8 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.8 MiB

View File

@@ -1,582 +0,0 @@
# Blender 3.6.5
# www.blender.org
o Shield.001
v 0.331177 0.029684 0.498915
v 0.331177 0.029684 -0.019826
v 0.324814 0.029684 -0.113625
v 0.305971 0.029684 -0.203821
v 0.275372 0.029684 -0.286945
v 0.234192 0.029684 -0.359804
v 0.184014 0.029684 -0.419598
v 0.126767 0.029684 -0.464029
v 0.064650 0.029684 -0.491389
v 0.000000 0.029684 -0.500628
v 0.000000 0.029684 0.498915
v 0.318062 -0.020828 0.485801
v 0.318062 -0.020828 -0.019381
v 0.311791 -0.020828 -0.111832
v 0.293331 -0.020828 -0.200195
v 0.263432 -0.020828 -0.281417
v 0.223370 -0.020828 -0.352299
v 0.174868 -0.020828 -0.410095
v 0.120002 -0.020828 -0.452678
v 0.061012 -0.020828 -0.478662
v 0.000000 -0.020828 0.498915
v 0.331177 -0.020828 0.498915
v 0.000000 -0.020828 -0.500628
v 0.331177 -0.020828 -0.019826
v 0.324814 -0.020828 -0.113625
v 0.305971 -0.020828 -0.203821
v 0.275372 -0.020828 -0.286945
v 0.234192 -0.020828 -0.359804
v 0.184014 -0.020828 -0.419598
v 0.126767 -0.020828 -0.464029
v 0.064650 -0.020828 -0.491389
v 0.000000 -0.020828 -0.485507
v 0.000000 -0.020828 0.485800
v 0.000000 -0.020828 0.000147
v 0.318062 -0.030185 0.485801
v 0.318062 -0.030185 -0.019381
v 0.311791 -0.030185 -0.111832
v 0.293331 -0.030185 -0.200195
v 0.263432 -0.030185 -0.281417
v 0.223370 -0.030185 -0.352299
v 0.174868 -0.030185 -0.410095
v 0.120002 -0.030185 -0.452678
v 0.061012 -0.030185 -0.478662
v 0.000000 -0.030185 0.498915
v 0.331177 -0.030185 0.498915
v 0.000000 -0.030185 -0.500628
v 0.331177 -0.030185 -0.019826
v 0.324814 -0.030185 -0.113625
v 0.305971 -0.030185 -0.203821
v 0.275372 -0.030185 -0.286945
v 0.234192 -0.030185 -0.359804
v 0.184014 -0.030185 -0.419598
v 0.126767 -0.030185 -0.464029
v 0.064650 -0.030185 -0.491389
v 0.000000 -0.030185 -0.485507
v 0.000000 -0.030185 0.485800
v -0.331177 0.029684 0.498915
v -0.331177 0.029684 -0.019826
v -0.324814 0.029684 -0.113625
v -0.305971 0.029684 -0.203821
v -0.275372 0.029684 -0.286945
v -0.234192 0.029684 -0.359804
v -0.184014 0.029684 -0.419598
v -0.126767 0.029684 -0.464029
v -0.064650 0.029684 -0.491389
v -0.318062 -0.020828 0.485801
v -0.318062 -0.020828 -0.019381
v -0.311791 -0.020828 -0.111832
v -0.293331 -0.020828 -0.200195
v -0.263432 -0.020828 -0.281417
v -0.223370 -0.020828 -0.352299
v -0.174868 -0.020828 -0.410095
v -0.120002 -0.020828 -0.452678
v -0.061012 -0.020828 -0.478662
v -0.331177 -0.020828 0.498915
v -0.331177 -0.020828 -0.019826
v -0.324814 -0.020828 -0.113625
v -0.305971 -0.020828 -0.203821
v -0.275372 -0.020828 -0.286945
v -0.234192 -0.020828 -0.359804
v -0.184014 -0.020828 -0.419598
v -0.126767 -0.020828 -0.464029
v -0.064650 -0.020828 -0.491389
v -0.318062 -0.030185 0.485801
v -0.318062 -0.030185 -0.019381
v -0.311791 -0.030185 -0.111832
v -0.293331 -0.030185 -0.200195
v -0.263432 -0.030185 -0.281417
v -0.223370 -0.030185 -0.352299
v -0.174868 -0.030185 -0.410095
v -0.120002 -0.030185 -0.452678
v -0.061012 -0.030185 -0.478662
v -0.331177 -0.030185 0.498915
v -0.331177 -0.030185 -0.019826
v -0.324814 -0.030185 -0.113625
v -0.305971 -0.030185 -0.203821
v -0.275372 -0.030185 -0.286945
v -0.234192 -0.030185 -0.359804
v -0.184014 -0.030185 -0.419598
v -0.126767 -0.030185 -0.464029
v -0.064650 -0.030185 -0.491389
vn 0.6574 0.6894 -0.3043
vn 0.8218 -0.0000 -0.5698
vn 0.5971 0.6870 -0.4141
vn -0.5120 -0.0000 0.8590
vn -0.6935 -0.0000 0.7205
vn 0.7153 0.6919 -0.0985
vn 0.9994 -0.0000 -0.0339
vn 0.9907 -0.0000 -0.1364
vn 1.0000 -0.0000 -0.0000
vn 0.2021 0.6777 -0.7070
vn 0.1415 -0.0000 -0.9899
vn 0.1046 0.6729 -0.7323
vn 0.6935 -0.0000 -0.7205
vn 0.5059 0.6840 -0.5256
vn 0.9612 -0.0000 -0.2757
vn 0.6949 0.6910 -0.1993
vn 0.0437 0.7064 0.7064
vn 0.7142 0.6996 -0.0242
vn -0.0000 0.7071 0.7071
vn -0.0000 -0.0000 1.0000
vn 0.5120 -0.0000 -0.8590
vn 0.3751 0.6806 -0.6294
vn 0.9075 -0.0000 -0.4201
vn 0.2748 -0.0000 -0.9615
vn -0.0000 -1.0000 -0.0000
vn -0.8218 -0.0000 0.5698
vn -0.9075 -0.0000 0.4201
vn -0.1115 -0.0000 0.9938
vn -0.2603 -0.0000 0.9655
vn -0.9612 -0.0000 0.2757
vn -0.9994 -0.0000 0.0339
vn -1.0000 -0.0000 -0.0000
vn -0.9907 -0.0000 0.1364
vn -0.0000 -0.0000 -1.0000
vn -0.8218 -0.0000 -0.5698
vn -0.9075 -0.0000 -0.4201
vn 0.6935 -0.0000 0.7205
vn 0.5120 -0.0000 0.8590
vn -0.9907 -0.0000 -0.1364
vn -0.9994 -0.0000 -0.0339
vn -0.1415 -0.0000 -0.9899
vn -0.2748 -0.0000 -0.9615
vn -0.6935 -0.0000 -0.7205
vn -0.9612 -0.0000 -0.2757
vn -0.5120 -0.0000 -0.8590
vn 0.8218 -0.0000 0.5698
vn 0.9075 -0.0000 0.4201
vn 0.2603 -0.0000 0.9655
vn 0.1115 -0.0000 0.9938
vn 0.9612 -0.0000 0.2757
vn 0.9994 -0.0000 0.0339
vn 0.9907 -0.0000 0.1364
vn -0.0000 1.0000 -0.0000
vt 0.852452 0.926767
vt 0.863932 0.943326
vt 0.852452 0.943326
vt 0.416217 0.784524
vt 0.414091 0.772054
vt 0.416217 0.772054
vt 0.852452 0.887374
vt 0.863932 0.866055
vt 0.863932 0.887374
vt 0.550685 0.744478
vt 0.539205 0.630661
vt 0.539205 0.741041
vt 0.348119 0.828570
vt 0.336639 0.813877
vt 0.348119 0.813877
vt 0.863932 0.956916
vt 0.852452 0.956916
vt 0.863932 0.907874
vt 0.852452 0.907874
vt 0.852452 0.748155
vt 0.852452 0.866055
vt 0.643871 0.823767
vt 0.632391 0.748497
vt 0.643871 0.748497
vt 0.348119 0.855700
vt 0.336639 0.842689
vt 0.348119 0.842689
vt 0.863932 0.926767
vt 0.336639 0.828570
vt 0.980591 0.564665
vt 0.984787 0.584748
vt 0.913922 0.610199
vt 0.866059 0.956916
vt 0.537078 0.741041
vt 0.537078 0.744478
vt 0.630264 0.517300
vt 0.632391 0.530436
vt 0.630264 0.530436
vt 0.866059 0.943326
vt 0.632391 0.546546
vt 0.630264 0.546546
vt 0.416217 0.811798
vt 0.414091 0.797931
vt 0.416217 0.797931
vt 0.866059 0.926767
vt 0.632391 0.565007
vt 0.630264 0.565007
vt 0.334512 0.813877
vt 0.434232 0.744478
vt 0.506522 0.741497
vt 0.509502 0.744478
vt 0.505096 0.605666
vt 0.509502 0.626577
vt 0.506522 0.626678
vt 0.500901 0.585583
vt 0.508056 0.605259
vt 0.494105 0.567123
vt 0.503773 0.584759
vt 0.485000 0.551012
vt 0.496819 0.565866
vt 0.473976 0.537876
vt 0.487459 0.549307
vt 0.461506 0.528198
vt 0.476055 0.535717
vt 0.448099 0.522293
vt 0.463044 0.525618
vt 0.434232 0.517300
vt 0.434232 0.520737
vt 0.336639 0.855700
vt 0.334512 0.842689
vt 0.632391 0.823767
vt 0.630264 0.748497
vt 0.414091 0.784524
vt 0.334512 0.828570
vt 0.539205 0.520281
vt 0.539205 0.517300
vt 0.537078 0.517300
vt 0.630264 0.606102
vt 0.632391 0.720921
vt 0.630264 0.720921
vt 0.863932 0.748155
vt 0.866059 0.866055
vt 0.630264 0.585090
vt 0.632391 0.606102
vt 0.866059 0.887374
vt 0.182971 0.916633
vt 0.180845 0.844343
vt 0.182971 0.844343
vt 0.632391 0.585090
vt 0.866059 0.907874
vt 0.600561 0.530890
vt 0.589081 0.547450
vt 0.589081 0.530890
vt 0.414091 0.851542
vt 0.416217 0.839072
vt 0.416217 0.851542
vt 0.600561 0.586842
vt 0.589081 0.608161
vt 0.589081 0.586842
vt 0.348119 0.799183
vt 0.600561 0.517300
vt 0.589081 0.517300
vt 0.600561 0.566342
vt 0.589081 0.566342
vt 0.600561 0.608161
vt 0.589081 0.726061
vt 0.643871 0.899038
vt 0.336639 0.785065
vt 0.348119 0.772054
vt 0.348119 0.785065
vt 0.600561 0.547450
vt 0.336639 0.799183
vt 0.913922 0.720579
vt 0.841633 0.720579
vt 0.602688 0.517300
vt 0.893635 0.938640
vt 0.895762 0.951776
vt 0.893635 0.951776
vt 0.602688 0.530890
vt 0.895762 0.922530
vt 0.893635 0.922530
vt 0.414091 0.825665
vt 0.416217 0.825665
vt 0.602688 0.547450
vt 0.895762 0.904069
vt 0.893635 0.904069
vt 0.361942 0.741497
vt 0.434232 0.741497
vt 0.358961 0.626577
vt 0.363367 0.605666
vt 0.361942 0.626678
vt 0.360408 0.605259
vt 0.367563 0.585583
vt 0.364690 0.584759
vt 0.374359 0.567123
vt 0.371645 0.565866
vt 0.383464 0.551012
vt 0.381004 0.549307
vt 0.394488 0.537876
vt 0.392409 0.535717
vt 0.406958 0.528198
vt 0.405420 0.525618
vt 0.420365 0.522293
vt 0.419538 0.519400
vt 0.334512 0.785065
vt 0.336639 0.772054
vt 0.630264 0.899038
vt 0.632391 0.899038
vt 0.334512 0.799183
vt 0.895762 0.748155
vt 0.893635 0.862974
vt 0.893635 0.748155
vt 0.602688 0.608161
vt 0.600561 0.726061
vt 0.895762 0.862974
vt 0.893635 0.883986
vt 0.602688 0.586842
vt 0.182971 0.772054
vt 0.602688 0.566342
vt 0.550685 0.517300
vt 0.539205 0.744478
vt 0.986212 0.605761
vt 0.986212 0.720579
vt 0.913922 0.499819
vt 0.941197 0.507280
vt 0.927789 0.501375
vt 0.953667 0.516959
vt 0.964690 0.530095
vt 0.973795 0.546205
vt 0.632391 0.517300
vt 0.414091 0.811798
vt 0.448925 0.519400
vt 0.334512 0.855700
vt 0.630264 0.823767
vt 0.537078 0.520281
vt 0.866059 0.748155
vt 0.180845 0.916633
vt 0.414091 0.839072
vt 0.841633 0.605761
vt 0.843058 0.584748
vt 0.847254 0.564665
vt 0.854049 0.546205
vt 0.863155 0.530095
vt 0.874178 0.516959
vt 0.886648 0.507280
vt 0.900055 0.501375
vt 0.895762 0.938640
vt 0.358961 0.744478
vt 0.334512 0.772054
vt 0.602688 0.726061
vt 0.895762 0.883986
vt 0.180845 0.772054
vt 0.591727 0.581771
vt 0.592669 0.565234
vt 0.601155 0.522724
vt 0.866647 0.820446
vt 0.866647 0.893741
vt 0.855496 0.893741
vt 0.593938 0.550739
vt 0.595485 0.538844
vt 0.597249 0.530005
vt 0.599163 0.524562
vt 0.601155 0.721574
vt 0.590950 0.618375
vt 0.591146 0.599714
vt 0.590950 0.721574
vt 0.855496 0.752511
vt 0.857673 0.753816
vt 0.859764 0.757682
vt 0.864768 0.782703
vt 0.863381 0.772408
vt 0.861692 0.763960
vt 0.865798 0.794448
vt 0.866433 0.807192
s 1
f 5/1/1 28/2/2 6/3/3
f 19/4/4 41/5/5 18/6/5
f 3/7/6 24/8/7 25/9/8
f 10/10/9 34/11/9 32/12/9
f 9/13/10 23/14/11 10/15/12
f 6/3/3 29/16/13 7/17/14
f 3/7/6 26/18/15 4/19/16
f 1/20/17 24/8/7 2/21/18
f 11/22/19 22/23/20 1/24/17
f 7/25/14 30/26/21 8/27/22
f 4/19/16 27/28/23 5/1/1
f 8/27/22 31/29/24 9/13/10
f 15/30/25 14/31/25 34/32/25
f 28/2/2 52/33/13 29/16/13
f 32/12/9 55/34/9 46/35/9
f 18/36/5 40/37/26 17/38/26
f 27/28/23 51/39/2 28/2/2
f 17/38/26 39/40/27 16/41/27
f 32/42/28 43/43/29 20/44/29
f 26/18/15 50/45/23 27/28/23
f 16/41/27 38/46/30 15/47/30
f 31/29/24 46/48/11 23/14/11
f 44/49/25 35/50/25 45/51/25
f 37/52/25 47/53/25 36/54/25
f 38/55/25 48/56/25 37/52/25
f 39/57/25 49/58/25 38/55/25
f 40/59/25 50/60/25 39/57/25
f 41/61/25 51/62/25 40/59/25
f 42/63/25 52/64/25 41/61/25
f 43/65/25 53/66/25 42/63/25
f 35/50/25 47/53/25 45/51/25
f 46/67/25 43/65/25 55/68/25
f 29/69/13 53/70/21 30/26/21
f 21/71/20 45/72/20 22/23/20
f 19/4/4 43/43/29 42/73/4
f 30/26/21 54/74/24 31/29/24
f 33/75/9 21/76/9 44/77/9
f 13/78/31 35/79/32 12/80/32
f 22/81/9 47/82/7 24/8/7
f 14/83/33 36/84/31 13/78/31
f 24/8/7 48/85/8 25/9/8
f 12/86/34 56/87/34 33/88/34
f 15/47/30 37/89/33 14/83/33
f 25/9/8 49/90/15 26/18/15
f 80/91/35 61/92/36 62/93/35
f 90/94/37 73/95/38 72/96/37
f 77/97/39 58/98/40 59/99/39
f 23/14/41 65/100/42 10/15/41
f 81/101/43 62/93/35 63/102/43
f 78/103/44 59/99/39 60/104/44
f 76/105/40 57/106/32 58/98/40
f 57/107/20 21/71/20 11/22/20
f 82/108/45 63/109/43 64/110/45
f 79/111/36 60/104/44 61/92/36
f 83/112/42 64/110/45 65/100/42
f 34/32/25 33/113/25 66/114/25
f 99/115/43 80/91/35 81/101/43
f 71/116/46 90/117/37 72/118/37
f 98/119/35 79/111/36 80/91/35
f 88/120/47 71/116/46 70/121/47
f 92/122/48 32/42/49 74/123/48
f 97/124/36 78/103/44 79/111/36
f 87/125/50 70/121/47 69/126/50
f 46/48/41 83/112/42 23/14/41
f 44/49/25 84/127/25 56/128/25
f 94/129/25 86/130/25 85/131/25
f 95/132/25 87/133/25 86/130/25
f 96/134/25 88/135/25 87/133/25
f 97/136/25 89/137/25 88/135/25
f 98/138/25 90/139/25 89/137/25
f 99/140/25 91/141/25 90/139/25
f 100/142/25 92/143/25 91/141/25
f 84/127/25 94/129/25 85/131/25
f 46/67/25 92/143/25 101/144/25
f 100/145/45 81/146/43 82/108/45
f 93/147/20 21/71/20 75/148/20
f 73/95/38 92/122/48 74/123/48
f 101/149/42 82/108/45 83/112/42
f 84/150/9 67/151/51 66/152/9
f 94/153/40 75/154/32 76/105/40
f 85/155/51 68/156/52 67/151/51
f 95/157/39 76/105/40 77/97/39
f 56/87/34 66/158/34 33/88/34
f 68/156/52 87/125/50 69/126/50
f 96/159/44 77/97/39 78/103/44
f 5/1/1 27/28/23 28/2/2
f 19/4/4 42/73/4 41/5/5
f 3/7/6 2/21/18 24/8/7
f 21/76/9 33/75/9 11/160/9
f 11/160/9 34/11/9 10/10/9
f 10/10/9 32/12/9 23/161/9
f 34/11/9 11/160/9 33/75/9
f 9/13/10 31/29/24 23/14/11
f 6/3/3 28/2/2 29/16/13
f 3/7/6 25/9/8 26/18/15
f 1/20/9 22/81/9 24/8/7
f 11/22/19 21/71/20 22/23/20
f 7/25/14 29/69/13 30/26/21
f 4/19/16 26/18/15 27/28/23
f 8/27/22 30/26/21 31/29/24
f 14/31/25 13/162/25 34/32/25
f 13/162/25 12/163/25 34/32/25
f 12/163/25 33/113/25 34/32/25
f 34/32/25 32/164/25 19/165/25
f 32/164/25 20/166/25 19/165/25
f 34/32/25 19/165/25 18/167/25
f 18/167/25 17/168/25 34/32/25
f 17/168/25 16/169/25 34/32/25
f 16/169/25 15/30/25 34/32/25
f 28/2/2 51/39/2 52/33/13
f 32/12/9 46/35/9 23/161/9
f 18/36/5 41/170/5 40/37/26
f 27/28/23 50/45/23 51/39/2
f 17/38/26 40/37/26 39/40/27
f 32/42/28 55/171/28 43/43/29
f 26/18/15 49/90/15 50/45/23
f 16/41/27 39/40/27 38/46/30
f 31/29/24 54/74/24 46/48/11
f 44/49/25 56/128/25 35/50/25
f 37/52/25 48/56/25 47/53/25
f 38/55/25 49/58/25 48/56/25
f 39/57/25 50/60/25 49/58/25
f 40/59/25 51/62/25 50/60/25
f 41/61/25 52/64/25 51/62/25
f 42/63/25 53/66/25 52/64/25
f 43/65/25 54/172/25 53/66/25
f 35/50/25 36/54/25 47/53/25
f 46/67/25 54/172/25 43/65/25
f 29/69/13 52/173/13 53/70/21
f 21/71/20 44/174/20 45/72/20
f 19/4/4 20/44/29 43/43/29
f 30/26/21 53/70/21 54/74/24
f 33/75/9 44/77/9 56/175/9
f 13/78/31 36/84/31 35/79/32
f 22/81/9 45/176/9 47/82/7
f 14/83/33 37/89/33 36/84/31
f 24/8/7 47/82/7 48/85/8
f 12/86/34 35/177/34 56/87/34
f 15/47/30 38/46/30 37/89/33
f 25/9/8 48/85/8 49/90/15
f 80/91/35 79/111/36 61/92/36
f 90/94/37 91/178/38 73/95/38
f 77/97/39 76/105/40 58/98/40
f 23/14/41 83/112/42 65/100/42
f 81/101/43 80/91/35 62/93/35
f 78/103/44 77/97/39 59/99/39
f 76/105/40 75/154/32 57/106/32
f 57/107/20 75/148/20 21/71/20
f 82/108/45 81/146/43 63/109/43
f 79/111/36 78/103/44 60/104/44
f 83/112/42 82/108/45 64/110/45
f 66/114/25 67/179/25 34/32/25
f 67/179/25 68/180/25 34/32/25
f 68/180/25 69/181/25 34/32/25
f 69/181/25 70/182/25 34/32/25
f 70/182/25 71/183/25 34/32/25
f 71/183/25 72/184/25 34/32/25
f 72/184/25 73/185/25 34/32/25
f 73/185/25 74/186/25 32/164/25
f 32/164/25 34/32/25 73/185/25
f 99/115/43 98/119/35 80/91/35
f 71/116/46 89/187/46 90/117/37
f 98/119/35 97/124/36 79/111/36
f 88/120/47 89/187/46 71/116/46
f 92/122/48 55/171/49 32/42/49
f 97/124/36 96/159/44 78/103/44
f 87/125/50 88/120/47 70/121/47
f 46/48/41 101/149/42 83/112/42
f 44/49/25 93/188/25 84/127/25
f 94/129/25 95/132/25 86/130/25
f 95/132/25 96/134/25 87/133/25
f 96/134/25 97/136/25 88/135/25
f 97/136/25 98/138/25 89/137/25
f 98/138/25 99/140/25 90/139/25
f 99/140/25 100/142/25 91/141/25
f 100/142/25 101/144/25 92/143/25
f 84/127/25 93/188/25 94/129/25
f 46/67/25 55/68/25 92/143/25
f 100/145/45 99/189/43 81/146/43
f 93/147/20 44/174/20 21/71/20
f 73/95/38 91/178/38 92/122/48
f 101/149/42 100/145/45 82/108/45
f 84/150/9 85/155/51 67/151/51
f 94/153/40 93/190/32 75/154/32
f 85/155/51 86/191/52 68/156/52
f 95/157/39 94/153/40 76/105/40
f 56/87/34 84/192/34 66/158/34
f 68/156/52 86/191/52 87/125/50
f 96/159/44 95/157/39 77/97/39
f 4/193/16 5/194/1 10/195/12
s 0
f 58/196/53 57/197/53 11/198/53
s 1
f 5/194/1 6/199/3 10/195/12
f 6/199/3 7/200/14 10/195/12
f 7/200/14 8/201/22 10/195/12
f 8/201/22 9/202/10 10/195/12
f 10/195/12 11/203/19 2/204/18
f 4/193/16 10/195/12 3/205/6
f 11/203/19 1/206/17 2/204/18
f 2/204/18 3/205/6 10/195/12
s 0
f 11/198/53 10/207/53 58/196/53
f 10/207/53 65/208/53 64/209/53
f 61/210/53 10/207/53 62/211/53
f 64/209/53 63/212/53 10/207/53
f 63/212/53 62/211/53 10/207/53
f 61/210/53 60/213/53 10/207/53
f 60/213/53 59/214/53 10/207/53
f 59/214/53 58/196/53 10/207/53

View File

@@ -1,616 +0,0 @@
# Blender 3.6.5
# www.blender.org
o shield
v 0.329363 -0.615745 1.151866
v -0.000000 -0.615745 0.415793
v -0.000000 -0.615745 1.151866
v 0.329363 -0.615745 1.092511
v -0.000000 -0.615745 0.415793
v 0.326010 -0.615745 0.996204
v 0.316022 -0.615745 0.901858
v 0.299600 -0.615745 0.811392
v 0.277080 -0.615745 0.726650
v 0.248920 -0.615745 0.649355
v 0.215692 -0.615745 0.581082
v 0.178074 -0.615745 0.523220
v 0.136832 -0.615745 0.476947
v 0.092804 -0.615745 0.443205
v 0.046887 -0.615745 0.422681
v -0.329363 -0.615745 1.151866
v -0.329363 -0.615745 1.092511
v -0.326010 -0.615745 0.996204
v -0.316022 -0.615745 0.901858
v -0.299600 -0.615745 0.811392
v -0.277080 -0.615745 0.726650
v -0.248920 -0.615745 0.649355
v -0.215692 -0.615745 0.581082
v -0.178075 -0.615745 0.523220
v -0.136832 -0.615745 0.476947
v -0.092804 -0.615745 0.443205
v -0.046887 -0.615745 0.422681
v 0.329363 -0.590929 1.151866
v -0.000000 -0.590929 1.151866
v -0.000000 -0.590929 0.415793
v -0.000000 -0.590929 0.415793
v 0.046887 -0.590929 0.422681
v 0.092804 -0.590929 0.443205
v 0.136832 -0.590929 0.476947
v 0.178074 -0.590929 0.523220
v 0.215692 -0.590929 0.581082
v 0.248920 -0.590929 0.649355
v 0.277080 -0.590929 0.726650
v 0.299600 -0.590929 0.811392
v 0.316022 -0.590929 0.901858
v 0.326010 -0.590929 0.996204
v 0.329363 -0.590929 1.092511
v -0.329363 -0.590929 1.151866
v -0.046887 -0.590929 0.422681
v -0.092804 -0.590929 0.443205
v -0.136832 -0.590929 0.476947
v -0.178075 -0.590929 0.523220
v -0.215692 -0.590929 0.581082
v -0.248920 -0.590929 0.649355
v -0.277080 -0.590929 0.726650
v -0.299600 -0.590929 0.811392
v -0.316022 -0.590929 0.901858
v -0.326010 -0.590929 0.996204
v -0.329363 -0.590929 1.092511
v -0.000000 0.740870 0.678108
v -0.000000 0.740870 1.005550
v 0.144537 0.726635 0.678108
v 0.144537 0.726635 1.005550
v 0.283519 0.684475 0.678108
v 0.283519 0.684475 1.005550
v 0.411605 0.616011 0.678108
v 0.411605 0.616011 1.005550
v 0.523874 0.523875 0.678108
v 0.523874 0.523874 1.005550
v 0.616011 0.411606 0.678108
v 0.616011 0.411606 1.005550
v 0.684475 0.283519 0.678108
v 0.684475 0.283519 1.005550
v 0.726635 0.144537 0.678108
v 0.726635 0.144537 1.005550
v 0.740870 0.000000 0.678108
v 0.740870 0.000000 1.005550
v 0.726635 -0.144537 0.678108
v 0.726635 -0.144537 1.005550
v 0.684475 -0.283519 0.678108
v 0.684475 -0.283519 1.005550
v 0.616011 -0.411605 0.678108
v 0.616011 -0.411605 1.005550
v 0.523874 -0.523874 0.678108
v 0.523874 -0.523874 1.005550
v 0.411605 -0.616011 0.678108
v 0.411605 -0.616011 1.005550
v -0.411606 -0.616011 0.678108
v -0.411606 -0.616011 1.005550
v -0.523875 -0.523874 0.678108
v -0.523875 -0.523875 1.005550
v -0.616011 -0.411606 0.678108
v -0.616011 -0.411606 1.005550
v -0.684475 -0.283519 0.678108
v -0.684475 -0.283519 1.005550
v -0.726635 -0.144537 0.678108
v -0.726635 -0.144537 1.005550
v -0.740870 -0.000000 0.678108
v -0.740870 -0.000000 1.005550
v -0.726635 0.144537 0.678108
v -0.726635 0.144537 1.005550
v -0.684475 0.283519 0.678108
v -0.684475 0.283519 1.005550
v -0.616011 0.411606 0.678108
v -0.616011 0.411606 1.005550
v -0.523875 0.523874 0.678108
v -0.523875 0.523874 1.005550
v -0.411606 0.616011 0.678108
v -0.411606 0.616011 1.005550
v -0.283519 0.684475 0.678108
v -0.283519 0.684475 1.005550
v -0.144537 0.726635 0.678108
v -0.144537 0.726635 1.005550
v -0.142275 0.717330 1.005550
v -0.142275 0.717330 0.678108
v -0.279082 0.675829 1.005550
v -0.279082 0.675829 0.678108
v -0.405165 0.608437 1.005550
v -0.405165 0.608437 0.678108
v -0.515677 0.517742 1.005550
v -0.515677 0.517742 0.678108
v -0.606372 0.407230 1.005550
v -0.606372 0.407230 0.678108
v -0.673764 0.281147 1.005550
v -0.673764 0.281147 0.678108
v -0.715265 0.144340 1.005550
v -0.715265 0.144340 0.678108
v -0.729277 0.002065 1.005550
v -0.729277 0.002065 0.678108
v -0.715265 -0.140210 1.005550
v -0.715265 -0.140210 0.678108
v -0.673764 -0.277017 1.005550
v -0.673764 -0.277017 0.678108
v -0.606372 -0.403100 1.005550
v -0.606372 -0.403100 0.678108
v -0.515677 -0.513612 1.005550
v -0.515677 -0.513612 0.678108
v -0.405165 -0.604307 0.678108
v -0.405165 -0.604307 1.005550
v 0.405165 -0.604307 1.005550
v 0.405165 -0.604307 0.678108
v 0.515677 -0.513612 1.005550
v 0.515677 -0.513612 0.678108
v 0.606372 -0.403100 1.005550
v 0.606372 -0.403100 0.678108
v 0.673764 -0.277017 1.005550
v 0.673764 -0.277017 0.678108
v 0.715264 -0.140210 1.005550
v 0.715264 -0.140210 0.678108
v 0.729277 0.002065 1.005550
v 0.729277 0.002065 0.678108
v 0.715264 0.144340 1.005550
v 0.715264 0.144340 0.678108
v 0.673764 0.281147 1.005550
v 0.673764 0.281147 0.678108
v 0.606372 0.407230 1.005550
v 0.606372 0.407230 0.678108
v 0.515677 0.517742 1.005550
v 0.515677 0.517742 0.678108
v 0.405165 0.608437 1.005550
v 0.405165 0.608437 0.678108
v 0.279082 0.675829 1.005550
v 0.279082 0.675829 0.678108
v -0.000000 0.731342 1.005550
v 0.142275 0.717330 1.005550
v 0.142275 0.717330 0.678108
v -0.000000 0.731342 0.678108
vn -0.0000 -0.0000 1.0000
vn -0.9839 -0.0000 0.1786
vn 0.9994 -0.0000 0.0348
vn -0.4081 -0.0000 0.9130
vn 0.7465 -0.0000 0.6654
vn -0.9944 -0.0000 0.1053
vn 1.0000 -0.0000 -0.0000
vn -0.6083 -0.0000 0.7937
vn 0.8384 -0.0000 0.5451
vn -0.9994 -0.0000 0.0348
vn -0.7465 -0.0000 0.6654
vn 0.8992 -0.0000 0.4376
vn -1.0000 -0.0000 -0.0000
vn -0.8384 -0.0000 0.5451
vn 0.9396 -0.0000 0.3423
vn -0.0000 -0.0000 -1.0000
vn -0.8992 -0.0000 0.4376
vn 0.9665 -0.0000 0.2568
vn 0.1453 -0.0000 0.9894
vn -0.9396 -0.0000 0.3423
vn 0.9839 -0.0000 0.1786
vn 0.4081 -0.0000 0.9130
vn -0.9665 -0.0000 0.2568
vn 0.9944 -0.0000 0.1053
vn -0.1453 -0.0000 0.9894
vn 0.6083 -0.0000 0.7937
vn 0.0980 0.9952 -0.0000
vn 0.2903 0.9569 -0.0000
vn 0.4714 0.8819 -0.0000
vn 0.6344 0.7730 -0.0000
vn 0.7730 0.6344 -0.0000
vn 0.8819 0.4714 -0.0000
vn 0.9569 0.2903 -0.0000
vn 0.9952 0.0980 -0.0000
vn 0.9952 -0.0980 -0.0000
vn 0.9569 -0.2903 -0.0000
vn 0.8819 -0.4714 -0.0000
vn 0.7730 -0.6344 -0.0000
vn 0.6344 -0.7730 -0.0000
vn -0.6344 -0.7730 -0.0000
vn -0.7730 -0.6344 -0.0000
vn -0.8819 -0.4714 -0.0000
vn -0.9569 -0.2903 -0.0000
vn -0.9952 -0.0980 -0.0000
vn -0.9952 0.0980 -0.0000
vn -0.9569 0.2903 -0.0000
vn -0.8819 0.4714 -0.0000
vn -0.7730 0.6344 -0.0000
vn -0.6344 0.7730 -0.0000
vn -0.4714 0.8819 -0.0000
vn -0.2903 0.9569 -0.0000
vn -0.0980 0.9952 -0.0000
vn -0.8761 -0.4821 -0.0000
vn 0.4714 -0.8819 -0.0000
vn -0.4714 -0.8819 -0.0000
vn 0.8761 -0.4821 -0.0000
vn -0.2903 -0.9569 -0.0000
vn -0.0980 -0.9952 -0.0000
vn 0.0980 -0.9952 -0.0000
vn 0.2903 -0.9569 -0.0000
vn -0.0000 1.0000 -0.0000
vn -0.0000 -1.0000 -0.0000
vn -0.4081 -0.0000 0.9129
vn 0.4081 -0.0000 0.9129
vt 0.500025 0.000000
vt 0.500000 0.000000
vt 0.500000 1.000000
vt 0.571179 0.009358
vt 0.979748 0.660349
vt 0.954818 0.537446
vt 0.994911 0.788524
vt 1.000000 0.919363
vt 0.640884 0.037241
vt 0.707722 0.083081
vt 0.770332 0.145946
vt 1.000000 1.000000
vt 0.827439 0.224555
vt 0.877881 0.317308
vt 0.920631 0.422318
vt 0.968750 0.500000
vt 1.000000 0.500000
vt 0.968750 1.000000
vt 0.937500 0.500000
vt 0.937500 1.000000
vt 0.906250 0.500000
vt 0.906250 1.000000
vt 0.875000 0.500000
vt 0.875000 1.000000
vt 0.843750 0.500000
vt 0.843750 1.000000
vt 0.812500 0.500000
vt 0.781250 1.000000
vt 0.781250 0.500000
vt 0.750000 1.000000
vt 0.750000 0.500000
vt 0.718750 0.500000
vt 0.687500 1.000000
vt 0.687500 0.500000
vt 0.656250 0.500000
vt 0.656250 1.000000
vt 0.625000 0.500000
vt 0.625000 1.000000
vt 0.593750 0.500000
vt 0.406250 0.500000
vt 0.375000 1.000000
vt 0.375000 0.500000
vt 0.343750 1.000000
vt 0.343750 0.500000
vt 0.312500 0.500000
vt 0.312500 1.000000
vt 0.281250 0.500000
vt 0.250000 1.000000
vt 0.250000 0.500000
vt 0.218750 0.500000
vt 0.218750 1.000000
vt 0.187500 0.500000
vt 0.187500 1.000000
vt 0.156250 0.500000
vt 0.125000 1.000000
vt 0.125000 0.500000
vt 0.093750 0.500000
vt 0.093750 1.000000
vt 0.062500 0.500000
vt 0.000000 1.000000
vt 0.031250 1.000000
vt 0.062500 1.000000
vt 0.031250 0.500000
vt 0.000000 0.500000
vt 0.281250 1.000000
vt 0.593750 1.000000
vt 0.156250 1.000000
vt 0.718750 1.000000
vt 0.812500 1.000000
vt 0.406250 1.000000
s 0
f 5/1/1 2/2/1 3/3/1
f 2/2/1 5/1/1 27/4/1
f 30/2/1 31/1/1 32/4/1
f 31/1/1 30/2/1 29/3/1
f 7/5/2 39/6/2 8/6/2
f 18/7/3 54/8/3 17/8/3
f 15/4/4 33/9/4 32/4/4
f 25/10/5 47/11/5 24/11/5
f 6/7/6 40/5/6 7/5/6
f 17/8/7 43/12/7 16/12/7
f 14/9/8 34/10/8 33/9/8
f 24/11/9 48/13/9 23/13/9
f 4/8/10 41/7/10 6/7/10
f 12/11/11 34/10/11 13/10/11
f 23/13/12 49/14/12 22/14/12
f 1/12/13 42/8/13 4/8/13
f 11/13/14 35/11/14 12/11/14
f 22/14/15 50/15/15 21/15/15
f 3/3/16 28/12/16 1/12/16
f 16/12/16 29/3/16 3/3/16
f 10/14/17 36/13/17 11/13/17
f 21/15/18 51/6/18 20/6/18
f 5/1/19 44/4/19 27/4/19
f 9/15/20 37/14/20 10/14/20
f 20/6/21 52/5/21 19/5/21
f 26/9/22 44/4/22 45/9/22
f 8/6/23 38/15/23 9/15/23
f 19/5/24 53/7/24 18/7/24
f 15/4/25 31/1/25 5/1/25
f 25/10/26 45/9/26 46/10/26
f 56/12/27 57/16/27 55/17/27
f 58/18/28 59/19/28 57/16/28
f 60/20/29 61/21/29 59/19/29
f 62/22/30 63/23/30 61/21/30
f 64/24/31 65/25/31 63/23/31
f 66/26/32 67/27/32 65/25/32
f 67/27/33 70/28/33 69/29/33
f 69/29/34 72/30/34 71/31/34
f 72/30/35 73/32/35 71/31/35
f 73/32/36 76/33/36 75/34/36
f 76/33/37 77/35/37 75/34/37
f 78/36/38 79/37/38 77/35/38
f 80/38/39 81/39/39 79/37/39
f 83/40/40 86/41/40 85/42/40
f 85/42/41 88/43/41 87/44/41
f 88/43/42 89/45/42 87/44/42
f 90/46/43 91/47/43 89/45/43
f 91/47/44 94/48/44 93/49/44
f 94/48/45 95/50/45 93/49/45
f 96/51/46 97/52/46 95/50/46
f 98/53/47 99/54/47 97/52/47
f 99/54/48 102/55/48 101/56/48
f 102/55/49 103/57/49 101/56/49
f 104/58/50 105/59/50 103/57/50
f 56/60/1 109/61/1 159/60/1
f 106/62/51 107/63/51 105/59/51
f 108/61/52 55/64/52 107/63/52
f 94/48/1 125/65/1 123/48/1
f 64/24/1 151/26/1 66/26/1
f 82/66/53 136/39/53 81/39/53
f 80/38/1 135/66/1 82/66/1
f 79/37/16 136/39/16 138/37/16
f 88/43/1 131/41/1 129/43/1
f 87/44/16 132/42/16 85/42/16
f 104/58/1 115/55/1 113/58/1
f 103/57/16 116/56/16 101/56/16
f 58/18/1 157/20/1 60/20/1
f 102/55/1 117/67/1 115/55/1
f 74/68/1 141/33/1 76/33/1
f 95/50/16 124/49/16 93/49/16
f 68/69/1 147/28/1 70/28/1
f 56/12/1 160/18/1 58/18/1
f 72/30/1 143/68/1 74/68/1
f 97/52/16 122/50/16 95/50/16
f 96/51/1 123/48/1 121/51/1
f 112/59/54 113/58/54 114/57/54
f 118/54/37 119/53/37 120/52/37
f 126/47/34 123/48/34 125/65/34
f 130/44/31 131/41/31 132/42/31
f 138/37/48 139/36/48 140/35/48
f 144/32/45 145/30/45 146/31/45
f 150/27/42 151/26/42 152/25/42
f 156/21/55 157/20/55 158/19/55
f 93/49/16 126/47/16 91/47/16
f 60/20/1 155/22/1 62/22/1
f 77/35/16 138/37/16 140/35/16
f 126/47/33 127/46/33 128/45/33
f 128/45/32 129/43/32 130/44/32
f 59/19/16 156/21/16 158/19/16
f 86/41/1 134/70/1 131/41/1
f 67/27/16 148/29/16 150/27/16
f 132/42/30 134/70/30 133/40/30
f 92/65/1 127/46/1 125/65/1
f 136/39/49 137/38/49 138/37/49
f 76/33/1 139/36/1 78/36/1
f 85/42/16 133/40/16 83/40/16
f 140/35/47 141/33/47 142/34/47
f 65/25/16 150/27/16 152/25/16
f 144/32/46 141/33/46 143/68/46
f 75/34/16 140/35/16 142/34/16
f 55/64/16 110/63/16 107/63/16
f 99/54/16 120/52/16 97/52/16
f 83/40/56 134/70/56 84/70/56
f 146/31/44 147/28/44 148/29/44
f 55/17/16 161/16/16 162/17/16
f 108/61/1 111/62/1 109/61/1
f 148/29/43 149/69/43 150/27/43
f 57/16/16 158/19/16 161/16/16
f 63/23/16 152/25/16 154/23/16
f 71/31/16 144/32/16 146/31/16
f 101/56/16 118/54/16 99/54/16
f 152/25/41 153/24/41 154/23/41
f 98/53/1 121/51/1 119/53/1
f 90/46/1 129/43/1 127/46/1
f 154/23/40 155/22/40 156/21/40
f 73/32/16 142/34/16 144/32/16
f 107/63/16 112/59/16 105/59/16
f 70/28/1 145/30/1 72/30/1
f 100/67/1 119/53/1 117/67/1
f 158/19/57 160/18/57 161/16/57
f 69/29/16 146/31/16 148/29/16
f 89/45/16 130/44/16 87/44/16
f 161/16/58 159/12/58 162/17/58
f 62/22/1 153/24/1 64/24/1
f 162/64/59 109/61/59 110/63/59
f 66/26/1 149/69/1 68/69/1
f 110/63/60 111/62/60 112/59/60
f 106/62/1 113/58/1 111/62/1
f 91/47/16 128/45/16 89/45/16
f 61/21/16 154/23/16 156/21/16
f 114/57/39 115/55/39 116/56/39
f 116/56/38 117/67/38 118/54/38
f 105/59/16 114/57/16 103/57/16
f 78/36/1 137/38/1 80/38/1
f 120/52/36 121/51/36 122/50/36
f 122/50/35 123/48/35 124/49/35
f 3/3/61 1/12/61 4/8/61
f 4/8/61 6/7/61 3/3/61
f 6/7/61 7/5/61 3/3/61
f 7/5/61 8/6/61 3/3/61
f 8/6/61 9/15/61 3/3/61
f 9/15/61 10/14/61 3/3/61
f 10/14/61 11/13/61 5/1/61
f 3/3/61 10/14/61 5/1/61
f 11/13/61 12/11/61 5/1/61
f 12/11/61 13/10/61 5/1/61
f 13/10/61 14/9/61 5/1/61
f 14/9/61 15/4/61 5/1/61
f 27/4/61 26/9/61 2/2/61
f 26/9/61 25/10/61 2/2/61
f 25/10/61 24/11/61 2/2/61
f 24/11/61 23/13/61 2/2/61
f 23/13/61 22/14/61 2/2/61
f 22/14/61 21/15/61 3/3/61
f 21/15/61 20/6/61 3/3/61
f 20/6/61 19/5/61 3/3/61
f 19/5/61 18/7/61 3/3/61
f 18/7/61 17/8/61 3/3/61
f 17/8/61 16/12/61 3/3/61
f 22/14/61 3/3/61 2/2/61
f 32/4/62 33/9/62 30/2/62
f 33/9/62 34/10/62 30/2/62
f 34/10/62 35/11/62 30/2/62
f 35/11/62 36/13/62 30/2/62
f 36/13/62 37/14/62 30/2/62
f 37/14/62 38/15/62 29/3/62
f 38/15/62 39/6/62 29/3/62
f 39/6/62 40/5/62 29/3/62
f 40/5/62 41/7/62 29/3/62
f 41/7/62 42/8/62 29/3/62
f 42/8/62 28/12/62 29/3/62
f 37/14/62 29/3/62 30/2/62
f 29/3/62 43/12/62 54/8/62
f 54/8/62 53/7/62 29/3/62
f 53/7/62 52/5/62 29/3/62
f 52/5/62 51/6/62 29/3/62
f 51/6/62 50/15/62 29/3/62
f 50/15/62 49/14/62 29/3/62
f 49/14/62 48/13/62 31/1/62
f 29/3/62 49/14/62 31/1/62
f 48/13/62 47/11/62 31/1/62
f 47/11/62 46/10/62 31/1/62
f 46/10/62 45/9/62 31/1/62
f 45/9/62 44/4/62 31/1/62
f 7/5/2 40/5/2 39/6/2
f 18/7/3 53/7/3 54/8/3
f 15/4/63 14/9/63 33/9/63
f 25/10/5 46/10/5 47/11/5
f 6/7/6 41/7/6 40/5/6
f 17/8/7 54/8/7 43/12/7
f 14/9/8 13/10/8 34/10/8
f 24/11/9 47/11/9 48/13/9
f 4/8/10 42/8/10 41/7/10
f 12/11/11 35/11/11 34/10/11
f 23/13/12 48/13/12 49/14/12
f 1/12/13 28/12/13 42/8/13
f 11/13/14 36/13/14 35/11/14
f 22/14/15 49/14/15 50/15/15
f 3/3/16 29/3/16 28/12/16
f 16/12/16 43/12/16 29/3/16
f 10/14/17 37/14/17 36/13/17
f 21/15/18 50/15/18 51/6/18
f 5/1/19 31/1/19 44/4/19
f 9/15/20 38/15/20 37/14/20
f 20/6/21 51/6/21 52/5/21
f 26/9/64 27/4/64 44/4/64
f 8/6/23 39/6/23 38/15/23
f 19/5/24 52/5/24 53/7/24
f 15/4/25 32/4/25 31/1/25
f 25/10/26 26/9/26 45/9/26
f 56/12/27 58/18/27 57/16/27
f 58/18/28 60/20/28 59/19/28
f 60/20/29 62/22/29 61/21/29
f 62/22/30 64/24/30 63/23/30
f 64/24/31 66/26/31 65/25/31
f 66/26/32 68/69/32 67/27/32
f 67/27/33 68/69/33 70/28/33
f 69/29/34 70/28/34 72/30/34
f 72/30/35 74/68/35 73/32/35
f 73/32/36 74/68/36 76/33/36
f 76/33/37 78/36/37 77/35/37
f 78/36/38 80/38/38 79/37/38
f 80/38/39 82/66/39 81/39/39
f 83/40/40 84/70/40 86/41/40
f 85/42/41 86/41/41 88/43/41
f 88/43/42 90/46/42 89/45/42
f 90/46/43 92/65/43 91/47/43
f 91/47/44 92/65/44 94/48/44
f 94/48/45 96/51/45 95/50/45
f 96/51/46 98/53/46 97/52/46
f 98/53/47 100/67/47 99/54/47
f 99/54/48 100/67/48 102/55/48
f 102/55/49 104/58/49 103/57/49
f 104/58/50 106/62/50 105/59/50
f 56/60/1 108/61/1 109/61/1
f 106/62/51 108/61/51 107/63/51
f 108/61/52 56/60/52 55/64/52
f 94/48/1 92/65/1 125/65/1
f 64/24/1 153/24/1 151/26/1
f 82/66/53 135/66/53 136/39/53
f 80/38/1 137/38/1 135/66/1
f 79/37/16 81/39/16 136/39/16
f 88/43/1 86/41/1 131/41/1
f 87/44/16 130/44/16 132/42/16
f 104/58/1 102/55/1 115/55/1
f 103/57/16 114/57/16 116/56/16
f 58/18/1 160/18/1 157/20/1
f 102/55/1 100/67/1 117/67/1
f 74/68/1 143/68/1 141/33/1
f 95/50/16 122/50/16 124/49/16
f 68/69/1 149/69/1 147/28/1
f 56/12/1 159/12/1 160/18/1
f 72/30/1 145/30/1 143/68/1
f 97/52/16 120/52/16 122/50/16
f 96/51/1 94/48/1 123/48/1
f 112/59/54 111/62/54 113/58/54
f 118/54/37 117/67/37 119/53/37
f 126/47/34 124/49/34 123/48/34
f 130/44/31 129/43/31 131/41/31
f 138/37/48 137/38/48 139/36/48
f 144/32/45 143/68/45 145/30/45
f 150/27/42 149/69/42 151/26/42
f 156/21/55 155/22/55 157/20/55
f 93/49/16 124/49/16 126/47/16
f 60/20/1 157/20/1 155/22/1
f 77/35/16 79/37/16 138/37/16
f 126/47/33 125/65/33 127/46/33
f 128/45/32 127/46/32 129/43/32
f 59/19/16 61/21/16 156/21/16
f 86/41/1 84/70/1 134/70/1
f 67/27/16 69/29/16 148/29/16
f 132/42/30 131/41/30 134/70/30
f 92/65/1 90/46/1 127/46/1
f 136/39/49 135/66/49 137/38/49
f 76/33/1 141/33/1 139/36/1
f 85/42/16 132/42/16 133/40/16
f 140/35/47 139/36/47 141/33/47
f 65/25/16 67/27/16 150/27/16
f 144/32/46 142/34/46 141/33/46
f 75/34/16 77/35/16 140/35/16
f 55/64/16 162/64/16 110/63/16
f 99/54/16 118/54/16 120/52/16
f 83/40/56 133/40/56 134/70/56
f 146/31/44 145/30/44 147/28/44
f 55/17/16 57/16/16 161/16/16
f 108/61/1 106/62/1 111/62/1
f 148/29/43 147/28/43 149/69/43
f 57/16/16 59/19/16 158/19/16
f 63/23/16 65/25/16 152/25/16
f 71/31/16 73/32/16 144/32/16
f 101/56/16 116/56/16 118/54/16
f 152/25/41 151/26/41 153/24/41
f 98/53/1 96/51/1 121/51/1
f 90/46/1 88/43/1 129/43/1
f 154/23/40 153/24/40 155/22/40
f 73/32/16 75/34/16 142/34/16
f 107/63/16 110/63/16 112/59/16
f 70/28/1 147/28/1 145/30/1
f 100/67/1 98/53/1 119/53/1
f 158/19/57 157/20/57 160/18/57
f 69/29/16 71/31/16 146/31/16
f 89/45/16 128/45/16 130/44/16
f 161/16/58 160/18/58 159/12/58
f 62/22/1 155/22/1 153/24/1
f 162/64/59 159/60/59 109/61/59
f 66/26/1 151/26/1 149/69/1
f 110/63/60 109/61/60 111/62/60
f 106/62/1 104/58/1 113/58/1
f 91/47/16 126/47/16 128/45/16
f 61/21/16 63/23/16 154/23/16
f 114/57/39 113/58/39 115/55/39
f 116/56/38 115/55/38 117/67/38
f 105/59/16 112/59/16 114/57/16
f 78/36/1 139/36/1 137/38/1
f 120/52/36 119/53/36 121/51/36
f 122/50/35 121/51/35 123/48/35

Binary file not shown.

Before

Width:  |  Height:  |  Size: 93 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 59 KiB

View File

@@ -1,275 +0,0 @@
# Blender 3.6.5
# www.blender.org
o turbo.001
v 0.479911 0.031444 0.058178
v 0.008582 0.031444 0.530813
v 0.469532 0.031444 0.039992
v 0.309421 0.031444 0.039992
v 0.001804 0.031444 0.348364
v -0.304681 0.031444 0.041125
v -0.474757 0.031444 0.041125
v -0.474757 0.031444 0.059620
v -0.006999 0.031444 0.530813
v 0.479911 0.031444 -0.248942
v 0.008582 0.031444 0.223694
v 0.469532 0.031444 -0.267127
v 0.309421 0.031444 -0.267127
v 0.001804 0.031444 0.041245
v -0.304681 0.031444 -0.265994
v -0.474757 0.031444 -0.265994
v -0.474757 0.031444 -0.247499
v -0.006999 0.031444 0.223694
v 0.479911 0.031444 -0.561796
v 0.008582 0.031444 -0.092817
v 0.469532 0.031444 -0.579981
v 0.309421 0.031444 -0.579981
v 0.001804 0.031444 -0.275266
v -0.304681 0.031444 -0.578848
v -0.474757 0.031444 -0.578848
v -0.474757 0.031444 -0.560354
v -0.006999 0.031444 -0.092817
v 0.479911 -0.029054 0.058178
v 0.008582 -0.029055 0.530813
v 0.469532 -0.029054 0.039992
v 0.309421 -0.029054 0.039992
v 0.001804 -0.029055 0.348364
v -0.304681 -0.029054 0.041125
v -0.474757 -0.029055 0.041125
v -0.474757 -0.029055 0.059620
v -0.006999 -0.029055 0.530813
v 0.479911 -0.029054 -0.248942
v 0.008582 -0.029055 0.223694
v 0.469532 -0.029054 -0.267127
v 0.309421 -0.029054 -0.267127
v 0.001804 -0.029055 0.041245
v -0.304681 -0.029054 -0.265994
v -0.474757 -0.029055 -0.265994
v -0.474757 -0.029055 -0.247499
v -0.006999 -0.029055 0.223694
v 0.479911 -0.029054 -0.561796
v 0.008582 -0.029055 -0.092817
v 0.469532 -0.029054 -0.579981
v 0.309421 -0.029054 -0.579981
v 0.001804 -0.029055 -0.275266
v -0.304681 -0.029054 -0.578848
v -0.474757 -0.029055 -0.578848
v -0.474757 -0.029055 -0.560354
v -0.006999 -0.029055 -0.092817
vn 0.8685 -0.0000 -0.4957
vn -1.0000 -0.0000 -0.0000
vn -0.0000 -0.0000 1.0000
vn -0.0000 -0.0000 -1.0000
vn -0.7080 -0.0000 -0.7062
vn -0.7097 -0.0000 0.7045
vn 0.7081 -0.0000 0.7061
vn -0.7069 -0.0000 0.7073
vn 0.7080 -0.0000 -0.7062
vn -0.7037 -0.0000 -0.7104
vn 0.7053 -0.0000 0.7089
vn 0.7037 -0.0000 -0.7105
vn -0.0000 -1.0000 -0.0000
vt 0.588715 0.839843
vt 0.583870 0.825758
vt 0.588715 0.825758
vt 0.452602 0.883467
vt 0.448296 0.897552
vt 0.448296 0.883467
vt 0.203212 0.786027
vt 0.189127 0.782563
vt 0.203212 0.782563
vt 0.077824 0.851102
vt 0.063739 0.811505
vt 0.077824 0.811505
vt 0.419186 0.782563
vt 0.405101 0.854358
vt 0.405101 0.782563
vt 0.246407 0.922613
vt 0.232322 0.786027
vt 0.246407 0.786027
vt 0.588715 0.883038
vt 0.583869 0.868953
vt 0.588715 0.868953
vt 0.409407 0.883467
vt 0.405101 0.897552
vt 0.405101 0.883467
vt 0.619270 0.531191
vt 0.633355 0.686593
vt 0.619270 0.686593
vt 0.232322 0.782563
vt 0.246407 0.782563
vt 0.462381 0.782563
vt 0.448296 0.854357
vt 0.448296 0.782563
vt 0.881817 0.837845
vt 0.867732 0.701259
vt 0.881817 0.701259
vt 0.881817 0.866955
vt 0.867732 0.904232
vt 0.867732 0.866955
vt 0.588715 0.796648
vt 0.583869 0.782563
vt 0.588715 0.782563
vt 0.619270 0.715702
vt 0.633355 0.871104
vt 0.619270 0.871104
vt 0.867732 0.697796
vt 0.881817 0.697796
vt 0.318711 0.782563
vt 0.332797 0.876581
vt 0.318711 0.876581
vt 0.505575 0.782563
vt 0.491490 0.854357
vt 0.491490 0.782563
vt 0.548770 0.876182
vt 0.534685 0.913458
vt 0.534685 0.876182
vt 0.121019 0.851102
vt 0.106934 0.811505
vt 0.121019 0.811505
vt 0.867732 0.513285
vt 0.881817 0.668686
vt 0.867732 0.668686
vt 0.361906 0.782563
vt 0.375991 0.876581
vt 0.361906 0.876581
vt 0.106934 0.880211
vt 0.111240 0.894296
vt 0.106934 0.894296
vt 0.077824 0.917488
vt 0.063739 0.880211
vt 0.077824 0.880211
vt 0.028640 0.858942
vt 0.014555 0.819345
vt 0.028640 0.819345
vt 0.203212 0.922613
vt 0.189127 0.786027
vt 0.275517 0.782563
vt 0.289602 0.876581
vt 0.275517 0.876581
vt 0.231604 0.642143
vt 0.303398 0.713761
vt 0.299165 0.753454
vt 0.374985 0.642143
vt 0.446779 0.713761
vt 0.442546 0.753454
vt 0.518366 0.642143
vt 0.590160 0.713761
vt 0.585927 0.753454
vt 0.583870 0.839843
vt 0.452602 0.897552
vt 0.063739 0.851102
vt 0.419186 0.854358
vt 0.232322 0.922613
vt 0.583869 0.883038
vt 0.409407 0.897552
vt 0.633355 0.531191
vt 0.462381 0.854357
vt 0.867732 0.837845
vt 0.881817 0.904232
vt 0.583869 0.796649
vt 0.633355 0.715702
vt 0.332797 0.782563
vt 0.505575 0.854357
vt 0.548770 0.913458
vt 0.106934 0.851102
vt 0.881817 0.513285
vt 0.375991 0.782563
vt 0.111240 0.880211
vt 0.063739 0.917488
vt 0.014555 0.858942
vt 0.189127 0.922613
vt 0.289602 0.782563
vt 0.303399 0.751038
vt 0.189127 0.643721
vt 0.189127 0.640093
vt 0.298829 0.531191
vt 0.303135 0.531191
vt 0.303135 0.570788
vt 0.446779 0.751038
vt 0.332508 0.643721
vt 0.332508 0.640093
vt 0.442210 0.531191
vt 0.446516 0.531191
vt 0.446516 0.570788
vt 0.590160 0.751038
vt 0.475889 0.643721
vt 0.475889 0.640093
vt 0.585591 0.531191
vt 0.589897 0.531191
vt 0.589897 0.570788
s 0
f 3/1/1 28/2/1 30/3/1
f 16/4/2 44/5/2 17/6/2
f 9/7/3 29/8/3 2/9/3
f 24/10/4 52/11/4 25/12/4
f 5/13/5 31/14/5 32/15/5
f 17/16/6 45/17/6 18/18/6
f 12/19/1 37/20/1 39/21/1
f 25/22/2 53/23/2 26/24/2
f 2/25/7 28/26/7 1/27/7
f 18/18/3 38/28/3 11/29/3
f 14/30/5 40/31/5 41/32/5
f 26/33/8 54/34/8 27/35/8
f 4/36/4 30/37/4 31/38/4
f 21/39/1 46/40/1 48/41/1
f 11/42/7 37/43/7 10/44/7
f 27/35/3 47/45/3 20/46/3
f 5/47/9 33/48/9 6/49/9
f 23/50/10 49/51/10 50/52/10
f 13/53/4 39/54/4 40/55/4
f 6/56/4 34/57/4 7/58/4
f 20/59/11 46/60/11 19/61/11
f 14/62/9 42/63/9 15/64/9
f 8/65/2 34/66/2 35/67/2
f 21/68/4 49/69/4 22/70/4
f 15/71/4 43/72/4 16/73/4
f 8/74/6 36/75/6 9/7/6
f 23/76/12 51/77/12 24/78/12
f 32/79/13 31/80/13 28/81/13
f 41/82/13 40/83/13 37/84/13
f 50/85/13 49/86/13 46/87/13
f 3/1/1 1/88/1 28/2/1
f 16/4/2 43/89/2 44/5/2
f 9/7/3 36/75/3 29/8/3
f 24/10/4 51/90/4 52/11/4
f 5/13/5 4/91/5 31/14/5
f 17/16/6 44/92/6 45/17/6
f 12/19/1 10/93/1 37/20/1
f 25/22/2 52/94/2 53/23/2
f 2/25/7 29/95/7 28/26/7
f 18/18/3 45/17/3 38/28/3
f 14/30/5 13/96/5 40/31/5
f 26/33/8 53/97/8 54/34/8
f 4/36/4 3/98/4 30/37/4
f 21/39/1 19/99/1 46/40/1
f 11/42/7 38/100/7 37/43/7
f 27/35/3 54/34/3 47/45/3
f 5/47/9 32/101/9 33/48/9
f 23/50/10 22/102/10 49/51/10
f 13/53/4 12/103/4 39/54/4
f 6/56/4 33/104/4 34/57/4
f 20/59/11 47/105/11 46/60/11
f 14/62/9 41/106/9 42/63/9
f 8/65/2 7/107/2 34/66/2
f 21/68/4 48/108/4 49/69/4
f 15/71/4 42/109/4 43/72/4
f 8/74/6 35/110/6 36/75/6
f 23/76/12 50/111/12 51/77/12
f 31/80/13 30/112/13 28/81/13
f 28/81/13 29/113/13 32/79/13
f 29/113/13 36/114/13 32/79/13
f 36/114/13 35/115/13 32/79/13
f 35/115/13 34/116/13 33/117/13
f 32/79/13 35/115/13 33/117/13
f 40/83/13 39/118/13 37/84/13
f 37/84/13 38/119/13 41/82/13
f 38/119/13 45/120/13 41/82/13
f 45/120/13 44/121/13 41/82/13
f 44/121/13 43/122/13 42/123/13
f 41/82/13 44/121/13 42/123/13
f 49/86/13 48/124/13 46/87/13
f 46/87/13 47/125/13 50/85/13
f 47/125/13 54/126/13 50/85/13
f 54/126/13 53/127/13 50/85/13
f 53/127/13 52/128/13 51/129/13
f 50/85/13 53/127/13 51/129/13

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 MiB

After

Width:  |  Height:  |  Size: 10 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 10 MiB

View File

@@ -12,6 +12,7 @@
import pp.mdga.message.server.UpdateReadyMessage;
import pp.mdga.message.server.UpdateTSKMessage;
import pp.mdga.notification.LobbyReadyNotification;
import pp.mdga.notification.StartDialogNotification;
import pp.mdga.notification.TskSelectNotification;
import pp.mdga.notification.TskUnselectNotification;
@@ -36,6 +37,7 @@ public void exit() {
@Override
public void selectLeave() {
parent.setState(parent.getStartDialog());
logic.addNotification(new StartDialogNotification());
logic.send(new LeaveGameMessage());
}
@@ -72,6 +74,7 @@ public void selectStart(){
@Override
public void received(ServerStartGameMessage msg){
parent.startGame();
}

View File

@@ -34,7 +34,7 @@ public void received(CeremonyMessage msg){
@Override
public void received(DieMessage msg){
logic.getGame().setDiceEyes(msg.getDiceEye());
logic.addNotification(new RollDiceNotification(logic.getGame().getActiveColor(), logic.getGame().getDiceEyes(), logic.getGame().getDiceEyes() * logic.getGame().getDiceModifier()));
// logic.addNotification(new RollDiceNotification(logic.getGame().getActiveColor(), logic.getGame().getDiceEyes(), logic.getGame().getDiceEyes() * logic.getGame().getDiceModifier()));
if(msg.getDiceEye() == 6){
logic.getGame().getPlayerByColor(logic.getGame().getActiveColor()).getPlayerStatistic().increaseDiced6();
logic.getGame().getGameStatistics().increaseDiced6();

View File

@@ -40,7 +40,7 @@ public void received(DiceNowMessage msg){
@Override
public void received(DieMessage msg){
logic.getGame().setDiceEyes(msg.getDiceEye());
logic.addNotification(new RollDiceNotification(logic.getGame().getActiveColor(), logic.getGame().getDiceEyes(), logic.getGame().getDiceEyes() * logic.getGame().getDiceModifier()));
// logic.addNotification(new RollDiceNotification(logic.getGame().getActiveColor(), logic.getGame().getDiceEyes(), logic.getGame().getDiceEyes() * logic.getGame().getDiceModifier()));
if(msg.getDiceEye() == 6){
logic.getGame().getPlayerByColor(logic.getGame().getActiveColor()).getPlayerStatistic().increaseDiced6();
logic.getGame().getGameStatistics().increaseDiced6();

View File

@@ -7,34 +7,15 @@
/**
* Notification that is sent when a card is acquired.
*/
public class AcquireCardNotification extends Notification {
/**
* The id of the card that was acquired.
*/
private final UUID cardId;
public class AcquireCardNotification extends Notification{
/**
* The bonus card that was acquired.
*/
private final BonusCard bonusCard;
private BonusCard bonusCard;
/**
* Constructor.
*
* @param cardId The id of the card that was acquired.
*/
public AcquireCardNotification(BonusCard bonusCard, UUID cardId) {
public AcquireCardNotification(BonusCard bonusCard) {
this.bonusCard = bonusCard;
this.cardId = cardId;
}
/**
* Get the id of the card that was acquired.
*
* @return The id of the card that was acquired.
*/
public UUID getCardId() {
return cardId;
}
public BonusCard getBonusCard() {

View File

@@ -1,12 +1,22 @@
package pp.mdga.notification;
import pp.mdga.game.Color;
/**
* GameNotification class
*/
public class GameNotification extends Notification {
public class GameNotification extends Notification{
private final Color ownColor;
/**
* Constructor
*/
public GameNotification() {
public GameNotification(Color ownColor) {
this.ownColor = ownColor;
}
public Color getOwnColor() {
return ownColor;
}
}

View File

@@ -5,38 +5,34 @@
/**
* Notification that a die has been rolled.
*/
public class RollDiceNotification extends Notification {
/**
* The color of the player that rolled the die.
*/
private final Color color;
public class RollDiceNotification extends Notification{
/**
* The number of eyes that were rolled.
*/
private final int eyes;
/**
* The number of the move that was made.
*/
private final int moveNumber;
private Color color;
private int eyes;
private boolean turbo;
private int multiplier;
/**
* Constructor.
*
* @param color the color of the player that rolled the die.
* @param eyes the number of eyes that were rolled.
* @param moveNumber the number of the move that was made.
* @param color the color of the player that rolled the die.
* @param eyes the number of eyes that were rolled.
*/
public RollDiceNotification(Color color, int eyes, int moveNumber) {
public RollDiceNotification(Color color, int eyes) {
this.color = color;
this.eyes = eyes;
this.moveNumber = moveNumber;
this.turbo = false;
this.multiplier = -1;
}
public RollDiceNotification(Color color, int eyes, boolean turbo, int multiplier) {
this.color = color;
this.eyes = eyes;
this.turbo = turbo;
this.multiplier = multiplier;
}
/**
* Get the color of the player that rolled the die.
*
* @return the color of the player that rolled the die.
*/
public Color getColor() {
@@ -45,19 +41,17 @@ public Color getColor() {
/**
* Get the number of eyes that were rolled.
*
* @return the number of eyes that were rolled.
*/
public int getEyes() {
return eyes;
}
/**
* Get the number of the move that was made.
*
* @return the number of the move that was made.
*/
public int getMoveNumber() {
return moveNumber;
public int getMultiplier() {
return multiplier;
}
public boolean isTurbo() {
return turbo;
}
}

View File

@@ -0,0 +1,16 @@
package pp.mdga.notification;
import java.util.List;
import java.util.UUID;
public class SelectableShieldNotification extends Notification{
private List<UUID> pieces;
public SelectableShieldNotification(List<UUID> pieces){
this.pieces = pieces;
}
public List<UUID> getPieces() {
return pieces;
}
}

View File

@@ -0,0 +1,4 @@
package pp.mdga.notification;
public class TurboActiveNotification extends Notification{
}

View File

@@ -174,9 +174,9 @@ public LobbyState getLobbyState() {
}
/**
* This method will be used to return gameState attribute of ServerGameLogic class.
* This method will be used to return gamestate attribute of ServerGameLogic class.
*
* @return gameState as a GameState object.
* @return gamestate as a GameState object.
*/
public GameState getGameState() {
return this.gameState;
@@ -192,9 +192,9 @@ public InterruptState getInterruptState() {
}
/**
* This method will be used to return ceremonyState attribute of ServerGameLogic class.
* This method will be used to return ceremonystate attribute of ServerGameLogic class.
*
* @return ceremonyState as a CeremonyState object.
* @return ceremonystate as a CeremonyState object.
*/
public CeremonyState getCeremonyState() {
return this.ceremonyState;

View File

@@ -33,6 +33,6 @@ public void enter() {
*/
@Override
public void exit() {
LOGGER.log(System.Logger.Level.DEBUG, "Exited CeremonyState state.");
}
}

View File

@@ -55,7 +55,7 @@ public void enter() {
*/
@Override
public void exit() {
LOGGER.log(System.Logger.Level.DEBUG, "Exited GameState state.");
}
/**

View File

@@ -41,7 +41,7 @@ public void enter() {
*/
@Override
public void exit() {
LOGGER.log(System.Logger.Level.DEBUG, "Exited InterruptState state.");
}
/**

View File

@@ -40,12 +40,12 @@ public void enter() {
*/
@Override
public void exit() {
LOGGER.log(System.Logger.Level.DEBUG, "Exited LobbyState state.");
}
/**
* This method will be called whenever the server received a JoinedLobbyMessage message.
* It will also get the client id of the player who send this messag
* It will also get the client id of the player who send this message
*
* @param msg as the message which was sent by the player as a JoinedLobbyMessage object.
* @param from as the client id of the player as an Integer.
@@ -55,7 +55,9 @@ public void received(JoinedLobbyMessage msg, int from) {
Player player = new Player(msg.getName());
player.setColor(Color.getColorByIndex(this.logic.getGame().getPlayers().size()));
this.logic.getGame().addPlayer(from, player);
this.logic.getServerSender().broadcast(new LobbyPlayerJoinedMessage(from, player));
for (Map.Entry<Integer, Player> entry: this.logic.getGame().getPlayers().entrySet()) {
this.logic.getServerSender().broadcast(new LobbyPlayerJoinedMessage(entry.getKey(), entry.getValue()));
}
}
/**

View File

@@ -10,6 +10,11 @@
*
*/
public class AnimationState extends GameAutomatonState {
/**
* Create FirstRollState constants.
*/
private static final System.Logger LOGGER = System.getLogger(AnimationState.class.getName());
/**
* Constructs a server state of the specified game logic.
*
@@ -22,12 +27,12 @@ public AnimationState(GameState gameAutomaton, ServerGameLogic logic) {
@Override
public void enter() {
LOGGER.log(System.Logger.Level.DEBUG, "Entered AnimationState state.");
}
@Override
public void exit() {
LOGGER.log(System.Logger.Level.DEBUG, "Exited AnimationState state.");
}
/**

View File

@@ -5,6 +5,7 @@
import pp.mdga.message.server.DieMessage;
import pp.mdga.server.ServerGameLogic;
import pp.mdga.server.automaton.GameState;
import pp.mdga.server.automaton.game.turn.RollDiceState;
import java.util.HashMap;
import java.util.Map;
@@ -12,6 +13,11 @@
import java.util.stream.Collectors;
public class DetermineStartPlayerState extends GameAutomatonState {
/**
* Create FirstRollState constants.
*/
private static final System.Logger LOGGER = System.getLogger(DetermineStartPlayerState.class.getName());
/**
* Create DetermineStartPlayerState attributes.
*/
@@ -29,12 +35,12 @@ public DetermineStartPlayerState(GameState gameAutomaton, ServerGameLogic logic)
@Override
public void enter() {
LOGGER.log(System.Logger.Level.DEBUG, "Entered DetermineStartPlayerState state.");
}
@Override
public void exit() {
LOGGER.log(System.Logger.Level.DEBUG, "Exited DetermineStartPlayerState state.");
}
/**

View File

@@ -9,6 +9,10 @@
* It will also be used as the turn automaton.
*/
public class TurnState extends GameAutomatonState {
/**
* Create FirstRollState constants.
*/
private static final System.Logger LOGGER = System.getLogger(TurnState.class.getName());
/**
* Create TurnState states.
*/
@@ -36,12 +40,12 @@ public TurnState(GameState gameAutomaton, ServerGameLogic logic) {
@Override
public void enter() {
LOGGER.log(System.Logger.Level.DEBUG, "Entered TurnState state.");
}
@Override
public void exit() {
LOGGER.log(System.Logger.Level.DEBUG, "Exited TurnState state.");
}
/**

View File

@@ -4,6 +4,11 @@
import pp.mdga.server.automaton.game.TurnState;
public class ChoosePieceState extends TurnAutomatonState {
/**
* Create LobbyState constants.
*/
private static final System.Logger LOGGER = System.getLogger(ChoosePieceState.class.getName());
/**
* Constructs a server state of the specified game logic.
*
@@ -16,11 +21,11 @@ public ChoosePieceState(TurnState turnAutomaton, ServerGameLogic logic) {
@Override
public void enter() {
LOGGER.log(System.Logger.Level.DEBUG, "Exited ChoosePieceState state.");
}
@Override
public void exit() {
LOGGER.log(System.Logger.Level.DEBUG, "Entered ChoosePieceState state.");
}
}

View File

@@ -4,6 +4,10 @@
import pp.mdga.server.automaton.game.TurnState;
public class MovePieceState extends TurnAutomatonState {
/**
* Create LobbyState constants.
*/
private static final System.Logger LOGGER = System.getLogger(MovePieceState.class.getName());
/**
* Constructs a server state of the specified game logic.
@@ -17,11 +21,11 @@ public MovePieceState(TurnState turnAutomaton, ServerGameLogic logic) {
@Override
public void enter() {
LOGGER.log(System.Logger.Level.DEBUG, "Entered MovePieceState state.");
}
@Override
public void exit() {
LOGGER.log(System.Logger.Level.DEBUG, "Exited MovePieceState state.");
}
}

View File

@@ -1,9 +1,15 @@
package pp.mdga.server.automaton.game.turn;
import pp.mdga.server.ServerGameLogic;
import pp.mdga.server.automaton.game.AnimationState;
import pp.mdga.server.automaton.game.TurnState;
public class PlayPowerCardState extends TurnAutomatonState {
/**
* Create FirstRollState constants.
*/
private static final System.Logger LOGGER = System.getLogger(PlayPowerCardState.class.getName());
/**
* Constructs a server state of the specified game logic.
*
@@ -16,11 +22,11 @@ public PlayPowerCardState(TurnState turnAutomaton, ServerGameLogic logic) {
@Override
public void enter() {
LOGGER.log(System.Logger.Level.DEBUG, "Entered PlayPowerCardState state.");
}
@Override
public void exit() {
LOGGER.log(System.Logger.Level.DEBUG, "Exited PlayPowerCardState state.");
}
}

View File

@@ -1,9 +1,15 @@
package pp.mdga.server.automaton.game.turn;
import pp.mdga.server.ServerGameLogic;
import pp.mdga.server.automaton.game.AnimationState;
import pp.mdga.server.automaton.game.TurnState;
public class PowerCardState extends TurnAutomatonState {
/**
* Create FirstRollState constants.
*/
private static final System.Logger LOGGER = System.getLogger(PowerCardState.class.getName());
/**
* Constructs a server state of the specified game logic.
*
@@ -16,11 +22,11 @@ public PowerCardState(TurnState turnAutomaton, ServerGameLogic logic) {
@Override
public void enter() {
LOGGER.log(System.Logger.Level.DEBUG, "Exited PowerCardState state.");
}
@Override
public void exit() {
LOGGER.log(System.Logger.Level.DEBUG, "Entered PowerCardState state.");
}
}

View File

@@ -2,8 +2,25 @@
import pp.mdga.server.ServerGameLogic;
import pp.mdga.server.automaton.game.TurnState;
import pp.mdga.server.automaton.game.turn.rolldice.FirstRollState;
import pp.mdga.server.automaton.game.turn.rolldice.RollDiceAutomatonState;
import pp.mdga.server.automaton.game.turn.rolldice.SecondRollState;
import pp.mdga.server.automaton.game.turn.rolldice.ThirdRollState;
public class RollDiceState extends TurnAutomatonState {
/**
* Create FirstRollState constants.
*/
private static final System.Logger LOGGER = System.getLogger(RollDiceState.class.getName());
/**
* Create RollDiceState attributes.
*/
private RollDiceAutomatonState currentState;
private final FirstRollState firstRollState;
private final SecondRollState secondRollState;
private final ThirdRollState thirdRollState;
/**
* Constructs a server state of the specified game logic.
*
@@ -12,15 +29,68 @@ public class RollDiceState extends TurnAutomatonState {
*/
public RollDiceState(TurnState turnAutomaton, ServerGameLogic logic) {
super(turnAutomaton, logic);
this.firstRollState = new FirstRollState(this, logic);
this.secondRollState = new SecondRollState(this, logic);
this.thirdRollState = new ThirdRollState(this, logic);
}
@Override
public void enter() {
LOGGER.log(System.Logger.Level.DEBUG, "Entered RollDiceState state.");
}
@Override
public void exit() {
LOGGER.log(System.Logger.Level.DEBUG, "Exited RollDiceState state.");
}
/**
* This method will be used to return currentState attribute of RollDiceState class.
*
* @return currentState as a RollDiceAutomatonState object.
*/
public RollDiceAutomatonState getCurrentState() {
return this.currentState;
}
/**
* This method will be used to return firstRollState attribute of RollDiceState class.
*
* @return firstRollState as a FirstRollState object.
*/
public FirstRollState getFirstRollStateState() {
return this.firstRollState;
}
/**
* This method will be used to return secondRollState attribute of RollDiceState class.
*
* @return secondRollState as a SecondRollState object.
*/
public SecondRollState getSecondRollState() {
return this.secondRollState;
}
/**
* This method will be used to return currentState attribute of RollDiceState class.
*
* @return thirdRollState as a ThirdRollState object.
*/
public ThirdRollState getThirdRollState() {
return this.thirdRollState;
}
/**
* This method will be used to set currentState attribute of RollDiceState class to the given state parameter.
* In Addition, the currentState will be exited, changed and entered.
*
* @param state as the new currentState attribute as a RollDiceAutomatonState object.
*/
public void setCurrentState(RollDiceAutomatonState state) {
if (this.currentState != null) {
this.currentState.exit();
}
this.currentState = state;
this.currentState.enter();
}
}

View File

@@ -13,6 +13,7 @@ public abstract class ChoosePieceAutomatonState extends ServerState {
/**
* Constructs a server state of the specified game logic.
*
* @param choosePieceAutomaton as the automaton of the choose piece state as a ChoosePieceState object.
* @param logic the game logic
*/
public ChoosePieceAutomatonState(ChoosePieceState choosePieceAutomaton, ServerGameLogic logic) {

View File

@@ -3,5 +3,35 @@
import pp.mdga.server.ServerGameLogic;
import pp.mdga.server.automaton.game.turn.ChoosePieceState;
public class NoPieceState {
public class NoPieceState extends ChoosePieceAutomatonState {
/**
* Create FirstRollState constants.
*/
private static final System.Logger LOGGER = System.getLogger(NoPieceState.class.getName());
/**
* Constructs a server state of the specified game logic.
*
* @param choosePieceAutomaton as the automaton of the choose piece state as a ChoosePieceState object.
* @param logic the game logic
*/
public NoPieceState(ChoosePieceState choosePieceAutomaton, ServerGameLogic logic) {
super(choosePieceAutomaton, logic);
}
/**
* This method will be used whenever this state will be entered.
*/
@Override
public void enter() {
LOGGER.log(System.Logger.Level.DEBUG, "Entered NoPieceState state.");
}
/**
* This method will be used whenever this state will be exited.
*/
@Override
public void exit() {
LOGGER.log(System.Logger.Level.DEBUG, "Exited NoPieceState state.");
}
}

View File

@@ -3,5 +3,35 @@
import pp.mdga.server.ServerGameLogic;
import pp.mdga.server.automaton.game.turn.ChoosePieceState;
public class NoTurnState {
public class NoTurnState extends ChoosePieceAutomatonState {
/**
* Create FirstRollState constants.
*/
private static final System.Logger LOGGER = System.getLogger(NoTurnState.class.getName());
/**
* Constructs a server state of the specified game logic.
*
* @param choosePieceAutomaton as the automaton of the choose piece state as a ChoosePieceState object.
* @param logic the game logic
*/
public NoTurnState(ChoosePieceState choosePieceAutomaton, ServerGameLogic logic) {
super(choosePieceAutomaton, logic);
}
/**
* This method will be used whenever this state will be entered.
*/
@Override
public void enter() {
LOGGER.log(System.Logger.Level.DEBUG, "Entered NoTurnState state.");
}
/**
* This method will be used whenever this state will be exited.
*/
@Override
public void exit() {
LOGGER.log(System.Logger.Level.DEBUG, "Exited NoTurnState state.");
}
}

View File

@@ -3,6 +3,35 @@
import pp.mdga.server.ServerGameLogic;
import pp.mdga.server.automaton.game.turn.ChoosePieceState;
public class SelectPieceState {
public class SelectPieceState extends ChoosePieceAutomatonState {
/**
* Create FirstRollState constants.
*/
private static final System.Logger LOGGER = System.getLogger(SelectPieceState.class.getName());
/**
* Constructs a server state of the specified game logic.
*
* @param choosePieceAutomaton as the automaton of the choose piece state as a ChoosePieceState object.
* @param logic the game logic
*/
public SelectPieceState(ChoosePieceState choosePieceAutomaton, ServerGameLogic logic) {
super(choosePieceAutomaton, logic);
}
/**
* This method will be used whenever this state will be entered.
*/
@Override
public void enter() {
LOGGER.log(System.Logger.Level.DEBUG, "Entered SelectPieceState state.");
}
/**
* This method will be used whenever this state will be exited.
*/
@Override
public void exit() {
LOGGER.log(System.Logger.Level.DEBUG, "Exited SelectPieceState state.");
}
}

View File

@@ -3,5 +3,35 @@
import pp.mdga.server.ServerGameLogic;
import pp.mdga.server.automaton.game.turn.ChoosePieceState;
public class StartPieceState {
public class StartPieceState extends ChoosePieceAutomatonState {
/**
* Create FirstRollState constants.
*/
private static final System.Logger LOGGER = System.getLogger(StartPieceState.class.getName());
/**
* Constructs a server state of the specified game logic.
*
* @param choosePieceAutomaton as the automaton of the choose piece state as a ChoosePieceState object.
* @param logic the game logic
*/
public StartPieceState(ChoosePieceState choosePieceAutomaton, ServerGameLogic logic) {
super(choosePieceAutomaton, logic);
}
/**
* This method will be used whenever this state will be entered.
*/
@Override
public void enter() {
LOGGER.log(System.Logger.Level.DEBUG, "Exited StartPieceState state.");
}
/**
* This method will be used whenever this state will be exited.
*/
@Override
public void exit() {
LOGGER.log(System.Logger.Level.DEBUG, "Entered StartPieceState state.");
}
}

Some files were not shown because too many files have changed in this diff Show More