Merge remote-tracking branch 'origin/dev/client_beck' into dev/client_koppe2

# Conflicts:
#	Projekte/mdga/client/src/main/java/pp/mdga/client/MdgaApp.java
#	Projekte/mdga/client/src/main/java/pp/mdga/client/NotificationSynchronizer.java
#	Projekte/mdga/client/src/main/java/pp/mdga/client/view/GameView.java
This commit is contained in:
Felix Koppe
2024-11-29 10:13:15 +01:00
37 changed files with 36189 additions and 522 deletions

View File

@@ -3,11 +3,11 @@
public enum Asset {
bigTent,
cardStack,
cir,
heer,
cir("Models/lcir/cir_newOrigin.obj"),
heer("Models/heer/heer_newOrigin.obj"),
jet,
lw,
marine,
lw("Models/lw/lw_newOrigin.obj"),
marine("Models/marine/marine_newOrigin.obj"),
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"),
@@ -27,9 +27,12 @@ public enum Asset {
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,
swapCard,
shieldCard,
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")
;
@@ -51,6 +54,13 @@ public enum Asset {
this.size = 1f;
}
Asset(String modelPath) {
String folderFileName = "./" + root + name() + "/" + name();
this.modelPath = modelPath;
this.diffPath = folderFileName + "_diff.png";;
this.size = 1f;
}
Asset(float size) {
String folderFileName = "./" + root + name() + "/" + name();
this.modelPath = folderFileName + ".j3o";

View File

@@ -1,5 +1,6 @@
package pp.mdga.client;
import com.jme3.collision.CollisionResult;
import com.jme3.collision.CollisionResults;
import com.jme3.input.InputManager;
import com.jme3.input.KeyInput;
@@ -17,6 +18,7 @@
import pp.mdga.client.board.PieceControl;
import pp.mdga.client.gui.CardControl;
import pp.mdga.client.view.GameView;
import pp.mdga.game.Color;
import pp.mdga.game.Piece;
public class InputSynchronizer {
@@ -74,15 +76,15 @@ public void onAction(String name, boolean isPressed, float tpf) {
if(cardLayerSelect != null) {
//cardSelect
cardLayerSelect.outline();
if(cardLayerSelect.isSelectable()) gameView.getGuiHandler().selectCard(cardLayerSelect);
}
if(cardLayerSelect == null && boardSelect != null) {
else if(boardSelect != null) {
//boardSelect
if(boardSelect instanceof PieceControl pieceControl){
if(pieceControl.isSelectable()) gameView.getBoardHandler().pieceSelect(pieceControl);
}
if(boardSelect instanceof NodeControl nodeControl){
// nodeControl.outline();
//
}
}
else {
@@ -93,7 +95,11 @@ public void onAction(String name, boolean isPressed, float tpf) {
}
if(name.equals("Test") &&isPressed){
test = true;
if(app.getView() instanceof GameView gameView){
gameView.getGuiHandler().showDice();
// gameView.getBoardHandler().showDice(Color.AIRFORCE);
}
}
}
};
@@ -115,6 +121,7 @@ else if (name.equals("MouseScrollDown")) {
}
else if (name.equals("MouseLeft") || name.equals("MouseRight") || name.equals("MouseVertical")){
hoverPiece();
hoverCard();
}
}
};
@@ -129,6 +136,21 @@ private <T extends AbstractControl> T checkHover(Camera cam, Node root, Class<T>
return null;
}
private <T extends AbstractControl> T checkHoverOrtho(Camera cam, Node root, Class<T> controlType) {
CollisionResults results = new CollisionResults();
Vector3f mousePos = getMousePos(cam);
mousePos.setZ(cam.getLocation().getZ());
Ray ray = new Ray(mousePos, getMousePos(cam).subtract(mousePos).normalize());
root.collideWith(ray, results);
if (results.size() > 0) {
for(CollisionResult res : results ){
T control = res.getGeometry().getControl(controlType);
if(control != null) return control;
}
}
return null;
}
private void hoverPiece() {
if (app.getView() instanceof GameView gameView) {
PieceControl control = checkPiece();
@@ -143,33 +165,26 @@ private void hoverPiece() {
}
}
private void hoverCardOutline() {
private void hoverCard() {
if (app.getView() instanceof GameView gameView) {
CardControl control = checkHover(gameView.getGuiHandler().getCardLayerCamera(), gameView.getGuiHandler().getCardLayer().getRootNode(), CardControl.class);
CardControl control = checkCard(gameView);
if (control != null) {
if(control != hoverCard){
pieceOff();
cardOff();
hoverCard = control;
hoverCard.outline();
hoverCard.hover();
}
}
else pieceOff();
else cardOff();
}
}
private void hoverAction(){
}
private PieceControl checkPiece(){
return checkHover(app.getCamera(), app.getRootNode(), PieceControl.class);
}
private void outlineOff(OutlineControl outline) {
if (outline != null) outline.deOutline();
outline = null;
private CardControl checkCard(GameView gameView){
return checkHoverOrtho(gameView.getGuiHandler().getCardLayerCamera(), gameView.getGuiHandler().getCardLayer().getRootNode(), CardControl.class);
}
private void pieceOff(){
@@ -177,9 +192,16 @@ private void pieceOff(){
hoverPiece = null;
}
private void cardOff(){
if(hoverCard != null) hoverCard.hoverOff();
hoverCard = null;
}
private Vector3f getMousePos(Camera cam){
Vector2f mousePositionScreen = inputManager.getCursorPosition();
return cam.getWorldCoordinates(mousePositionScreen, 0);
Vector3f world = cam.getWorldCoordinates(mousePositionScreen, 0);
if (cam.isParallelProjection()) world.setZ(0);
return world;
}
public float getRotation() {

View File

@@ -53,9 +53,6 @@ public void simpleInitApp() {
notificationSynchronizer = new NotificationSynchronizer(this);
inputSynchronizer = new InputSynchronizer(this);
modelSyncronizer = new ModelSyncronizer(this);
modelSyncronizer.enter(MdgaState.CEREMONY);
//enter(state);
}
@Override

View File

@@ -1,9 +1,5 @@
package pp.mdga.client;
import pp.mdga.notification.Notification;
import pp.mdga.notification.PieceInGameNotification;
import pp.mdga.notification.PlayerInGameNotification;
public enum MdgaState {
NONE,
MAIN,

View File

@@ -1,6 +1,5 @@
package pp.mdga.client;
import pp.mdga.client.view.CeremonyView;
import pp.mdga.client.view.GameView;
import pp.mdga.client.view.LobbyView;
import pp.mdga.game.Color;
@@ -70,9 +69,11 @@ private void handleLobby(Notification notification) {
private void handleGame(Notification notification) {
GameView gameView = (GameView) app.getView();
GuiHandler guiHandler = gameView.getGuiHandler();
BoardHandler boardHandler = gameView.getBoardHandler();
if (notification instanceof AcquireCardNotification) {
// Handle AcquireCardNotification
if (notification instanceof AcquireCardNotification n) {
guiHandler.addCard(n.getBonusCard(), n.getCardId());
} else if (notification instanceof ActivePlayerNotification n) {
gameView.getGuiHandler().setActivePlayer(n.getColor());
} else if (notification instanceof CeremonyNotification ceremonyNotification) {
@@ -103,60 +104,58 @@ private void handleGame(Notification notification) {
ceremonyView.addStatisticsRow(name, v1, v2, v3, v4, v5, v6);
}
} else if (notification instanceof DiceNowNotification) {
// Handle DiceNowNotification
} else if (notification instanceof DicingNotification) {
// Handle DicingNotification
} else if (notification instanceof DrawCardNotification) {
// Handle DrawCardNotification
guiHandler.showDice();
} else if (notification instanceof DicingNotification n) {
//TODO
} else if (notification instanceof DrawCardNotification n) {
//TODO ???
} else if (notification instanceof HomeMoveNotification home) {
gameView.getBoardHandler().moveHomePiece(home.getPieceId(), home.getHomeIndex());
boardHandler.moveHomePiece(home.getPieceId(), home.getHomeIndex());
} else if (notification instanceof InterruptNotification) {
// Handle InterruptNotification
//TODO
} else if (notification instanceof MovePieceNotification n) {
if(n.isMoveStart()) {
//StartMove
gameView.getBoardHandler().movePieceStart(n.getPiece(), n.getMoveIndex());
boardHandler.movePieceStart(n.getPiece(), n.getMoveIndex());
}
else {
//InfieldMove
gameView.getBoardHandler().movePiece(n.getPiece(), n.getStartIndex(), n.getMoveIndex());
boardHandler.movePiece(n.getPiece(), n.getStartIndex(), n.getMoveIndex());
}
} else if (notification instanceof ThrowPieceNotification n) {
boardHandler.throwPiece(n.getPieceId());
} else if (notification instanceof NoShieldNotification n) {
boardHandler.unshieldPiece(n.getPieceId());
} else if (notification instanceof PlayCardNotification n) {
switch(n.getCard()){
case SWAP -> guiHandler.swap();
case TURBO -> guiHandler.turbo();
case SHIELD -> guiHandler.shield();
default -> throw new RuntimeException("invalid card");
}
} else if (notification instanceof MoveThrowPieceNotification) {
MoveThrowPieceNotification n = (MoveThrowPieceNotification)notification;
//gameView.getBoardHandler().throwPiece(n.); //TODO
} else if (notification instanceof NoShieldNotification) {
NoShieldNotification n = (NoShieldNotification)notification;
gameView.getBoardHandler().unshieldPiece(n.getPieceId());
} else if (notification instanceof PieceInGameNotification) {
// Handle PieceInGameNotification
} else if (notification instanceof PlayCardNotification) {
// Handle PlayCardNotification
} else if (notification instanceof PlayerInGameNotification n) {
// Handle PlayerInGameNotification
gameView.getBoardHandler().addPlayer(n.getColor(),n.getPiecesList());
gameView.getGuiHandler().addPlayer(n.getColor(),n.getName());
boardHandler.addPlayer(n.getColor(),n.getPiecesList());
guiHandler.addPlayer(n.getColor(),n.getName(), gameView.getOwnColor() == n.getColor());
} else if (notification instanceof ResumeNotification) {
// Handle ResumeNotification
} else if (notification instanceof RollDiceNotification) {
// Handle RollDiceNotification
} else if (notification instanceof SelectableCardsNotification) {
// Handle SelectableCardsNotification
} else if (notification instanceof ShieldActiveNotification) {
ShieldActiveNotification n = (ShieldActiveNotification)notification;
gameView.getBoardHandler().shieldPiece(n.getPieceId());
} else if (notification instanceof ShieldSuppressedNotification) {
ShieldSuppressedNotification n = (ShieldSuppressedNotification)notification;
gameView.getBoardHandler().suppressShield(n.getPieceId());
} else if (notification instanceof RollDiceNotification n) {
guiHandler.rollDice(n.getEyes());
//TODO multiplicator
} else if (notification instanceof SelectableCardsNotification n) {
guiHandler.setSelectableCards(n.getCards());
} else if (notification instanceof ShieldActiveNotification n) {
boardHandler.shieldPiece(n.getPieceId());
} else if (notification instanceof ShieldSuppressedNotification n) {
boardHandler.suppressShield(n.getPieceId());
} else if (notification instanceof StartDialogNotification) {
app.enter(MdgaState.MAIN);
} else if (notification instanceof SwapPieceNotification n) {
gameView.getBoardHandler().swapPieces(n.getFirstPiece(), n.getSecondPiece());
boardHandler.swapPieces(n.getFirstPiece(), n.getSecondPiece());
} else if (notification instanceof WaitMoveNotification) {
// Handle WaitMoveNotification
//TODO disable all hover, highlight, etc
} else if (notification instanceof SelectableMoveNotification n) {
gameView.getBoardHandler().outlineMove(n.getPieces(), n.getMoveIndexe(), n.getHomeMoves());
boardHandler.outlineMove(n.getPieces(), n.getMoveIndexe(), n.getHomeMoves());
} else if (notification instanceof SelectableSwapNotification n) {
gameView.getBoardHandler().outlineSwap(n.getOwnPieces(), n.getEnemyPieces());
boardHandler.outlineSwap(n.getOwnPieces(), n.getEnemyPieces());
} else {
throw new RuntimeException("notification not expected: " + notification.toString());
}

View File

@@ -9,6 +9,7 @@
import com.jme3.scene.control.AbstractControl;
import pp.mdga.client.Asset;
import pp.mdga.client.MdgaApp;
import pp.mdga.client.gui.DiceControl;
import pp.mdga.game.Color;
import java.util.*;
@@ -46,6 +47,7 @@ public class BoardHandler {
private List<PieceControl> selectableEnemyPieces = new ArrayList<>();
private PieceControl selectedOwnPiece;
private PieceControl selectedEnemyPiece;
private DiceControl diceControl;
public BoardHandler(MdgaApp app, FilterPostProcessor fpp) {
if(app == null) throw new RuntimeException("app is null");
@@ -77,6 +79,8 @@ private void initMap() {
this.waitingPiecesMap = new HashMap<>();
this.pieceColor = new HashMap<>();
this.outlineControls = new HashSet<>();
diceControl = new DiceControl(app.getAssetManager());
diceControl.create(new Vector3f(0,0,0), 0.7f, true);
@@ -193,6 +197,20 @@ private <T, E> List<T> removeItemFromMapList(Map<E,List<T>> map, E key, T item){
return list;
}
private Vector3f getWaitingPos(Color color){
return getMeanPosition(waitingNodesMap.get(color).stream().map(NodeControl::getLocation).toList());
}
public static Vector3f getMeanPosition(List<Vector3f> vectors) {
if (vectors.isEmpty()) return new Vector3f(0, 0, 0);
Vector3f sum = new Vector3f(0, 0, 0);
for (Vector3f v : vectors) {
sum.addLocal(v);
}
return sum.divide(vectors.size());
}
//public methods****************************************************************************************************
public void addPlayer(Color color, List<UUID> uuid) {
if (!isInitialised) throw new RuntimeException("BoardHandler is not initialized");
@@ -449,10 +467,12 @@ else if(selectableEnemyPieces.contains(pieceSelected)) {
public void clearSelectable(){
for(PieceControl p : selectableEnemyPieces) {
p.unSelect();
p.unHighlight();
p.setSelectable(false);
}
for(PieceControl p : selectableOwnPieces) {
p.unSelect();
p.unHighlight();
p.setSelectable(false);
}
selectableEnemyPieces.clear();
@@ -461,8 +481,6 @@ public void clearSelectable(){
selectedOwnPiece = null;
}
public void deOutline(int index){
infield.get(index).deOutline();
@@ -473,5 +491,15 @@ public void enableHover(UUID uuid){
pieces.get(uuid).setHoverable(true);
}
public void showDice(Color color){
node.attachChild(diceControl.getSpatial());
diceControl.setPos(getWaitingPos(color).add(new Vector3f(0,0,4)));
diceControl.spin();
}
public void hideDice(){
diceControl.hide();
}
}

View File

@@ -7,6 +7,7 @@
import com.jme3.math.Vector3f;
import com.jme3.post.FilterPostProcessor;
import com.jme3.shadow.DirectionalLightShadowFilter;
import com.jme3.shadow.EdgeFilteringMode;
import pp.mdga.client.MdgaApp;
public class CameraHandler {
@@ -29,6 +30,9 @@ public CameraHandler(MdgaApp app, FilterPostProcessor fpp){
DirectionalLightShadowFilter dlsf = new DirectionalLightShadowFilter(app.getAssetManager(), SHADOWMAP_SIZE, 4);
dlsf.setLight(sun);
dlsf.setEnabled(true);
dlsf.setEdgeFilteringMode(EdgeFilteringMode.PCFPOISSON);
dlsf.setShadowIntensity(0.7f);
fpp.addFilter(dlsf);
}

View File

@@ -5,6 +5,7 @@
import com.jme3.renderer.Camera;
import com.jme3.renderer.RenderManager;
import com.jme3.renderer.ViewPort;
import com.jme3.scene.Spatial;
import com.jme3.scene.control.AbstractControl;
import pp.mdga.client.MdgaApp;
import pp.mdga.client.board.Outline.SelectObjectOutliner;
@@ -12,17 +13,21 @@
public class OutlineControl extends AbstractControl {
private static final int THICKNESS_DEFAULT = 6;
private final SelectObjectOutliner outlineOwn;
private MdgaApp app;
public OutlineControl(MdgaApp app, FilterPostProcessor fpp){
this.app = app;
outlineOwn = new SelectObjectOutliner(THICKNESS_DEFAULT, fpp, app.getRenderManager(), app.getAssetManager(), app.getCamera());
}
public OutlineControl(MdgaApp app, FilterPostProcessor fpp, Camera cam){
this.app = app;
outlineOwn = new SelectObjectOutliner(THICKNESS_DEFAULT, fpp, app.getRenderManager(), app.getAssetManager(), cam);
}
public OutlineControl(MdgaApp app, FilterPostProcessor fpp, Camera cam, int thickness){
this.app = app;
outlineOwn = new SelectObjectOutliner(thickness, fpp, app.getRenderManager(), app.getAssetManager(), cam);
}
@@ -48,4 +53,23 @@ protected void controlUpdate(float tpf) {
protected void controlRender(RenderManager rm, ViewPort vp) {
}
public void initSpatial(){
}
@Override
public void setSpatial(Spatial spatial){
if(this.spatial == null && spatial != null){
super.setSpatial(spatial);
initSpatial();
}
else{
super.setSpatial(spatial);
}
}
public MdgaApp getApp() {
return app;
}
}

View File

@@ -32,9 +32,9 @@ public class PieceControl extends OutlineControl {
private static final ColorRGBA OUTLINE_ENEMY_HOVER_COLOR = ColorRGBA.Green;
private static final ColorRGBA OUTLINE_OWN_SELECT_COLOR = ColorRGBA.Cyan;
private static final ColorRGBA OUTLINE_ENEMY_SELECT_COLOR = ColorRGBA.Orange;
private static final int OUTLINE_HIGHLIGHT_WIDTH = 6;
private static final int OUTLINE_HOVER_WIDTH = 6;
private static final int OUTLINE_SELECT_WIDTH = 8;
private static final int OUTLINE_HIGHLIGHT_WIDTH = 8;
private static final int OUTLINE_HOVER_WIDTH = 8;
private static final int OUTLINE_SELECT_WIDTH = 10;
private final Node parentNode;
private boolean enemy;
@@ -87,16 +87,6 @@ public void setLocation(Vector3f loc){
}
@Override
public void setSpatial(Spatial spatial){
if(this.spatial == null && spatial != null){
super.setSpatial(spatial);
initSpatial();
}
else{
super.setSpatial(spatial);
}
}
public void initSpatial(){
setRotation(this.initRotation);
@@ -143,8 +133,6 @@ public Material getMaterial(){
return ((Geometry) getSpatial()).getMaterial();
}
//highlight own/enemy figure to select
public void highlight(boolean enemy) {
this.enemy = enemy;
highlight = true;
@@ -153,9 +141,9 @@ public void highlight(boolean enemy) {
public void unHighlight(){
highlight = false;
deOutline();
}
public void hover(){
if(!hoverable) return;
super.outline(enemy ? OUTLINE_ENEMY_HOVER_COLOR : OUTLINE_OWN_HOVER_COLOR, OUTLINE_HOVER_WIDTH);
@@ -194,8 +182,4 @@ public boolean isSelectable() {
public void setHoverable(boolean hoverable) {
this.hoverable = hoverable;
}
public void deOutline() {
super.deOutline();
}
}

View File

@@ -0,0 +1,53 @@
package pp.mdga.client.gui;
import com.jme3.asset.AssetManager;
import com.jme3.font.BitmapFont;
import com.jme3.font.BitmapText;
import com.jme3.math.ColorRGBA;
import com.jme3.math.Vector3f;
import com.jme3.scene.Node;
import com.jme3.system.AppSettings;
import pp.mdga.client.Asset;
public class ActionTextHandler {
private Node root;
public ActionTextHandler(AppSettings appSettings, AssetManager assetManager, Node guiNode){
root = new Node("actionTextRoot");
guiNode.attachChild(root);
root.setLocalTranslation(center(appSettings.getWidth(), appSettings.getHeight(), Vector3f.ZERO));
BitmapFont playerFont = assetManager.loadFont("Fonts/Gunplay.fnt");
root.attachChild(createTextWithSpacing(playerFont, "TEST", 20f, 250));
}
public static Node createTextWithSpacing(BitmapFont font, String text, float spacing, float size) {
Node textNode = new Node("TextWithSpacing");
Node center = new Node();
float xOffset = 0;
for (char c : text.toCharArray()) {
BitmapText letter = new BitmapText(font);
letter.setSize(size);
letter.setText(Character.toString(c));
letter.setLocalTranslation(xOffset, letter.getHeight()/2, 0);
center.attachChild(letter);
xOffset += letter.getLineWidth() + spacing;
}
center.setLocalTranslation(new Vector3f(-xOffset/2,0,0));
textNode.attachChild(center);
return textNode;
}
private Vector3f center(float width, float height, Vector3f pos){
return new Vector3f(pos.x+width/2, pos.y+height/2,0);
}
private Vector3f centerText(float width, float height, Vector3f pos){
return center(-width, height, pos);
}
}

View File

@@ -1,24 +1,153 @@
package pp.mdga.client.gui;
import com.jme3.font.BitmapFont;
import com.jme3.font.BitmapText;
import com.jme3.material.Material;
import com.jme3.math.ColorRGBA;
import com.jme3.math.Vector3f;
import com.jme3.post.FilterPostProcessor;
import com.jme3.renderer.Camera;
import com.jme3.renderer.RenderManager;
import com.jme3.renderer.ViewPort;
import com.jme3.scene.Geometry;
import com.jme3.scene.Node;
import com.jme3.scene.control.AbstractControl;
import com.jme3.scene.shape.Box;
import com.jme3.scene.shape.Cylinder;
import com.jme3.scene.shape.Sphere;
import pp.mdga.client.MdgaApp;
import pp.mdga.client.board.OutlineControl;
import java.awt.*;
public class CardControl extends OutlineControl {
private static final ColorRGBA OUTLINE_COLOR = ColorRGBA.Yellow;
private static final int OUTLINE_THICKNESS = 9;
public CardControl(MdgaApp app, FilterPostProcessor fpp, Camera cam){
private static final ColorRGBA HIGHLIGHT_COLOR = ColorRGBA.Yellow;
private static final int HIGHLIGHT_WIDTH = 9;
private static final ColorRGBA HOVER_COLOR = ColorRGBA.Green;
private static final int HOVER_WIDTH = 12;
private static final ColorRGBA SELECT_COLOR = ColorRGBA.Blue;
private static final int SELECT_WIDTH = 13;
private static final int OUTLINE_THICKNESS = 9;
private boolean hoverable;
private boolean highlight;
private boolean selectable;
private boolean select;
private Node root;
private BitmapText num;
public CardControl(MdgaApp app, FilterPostProcessor fpp, Camera cam, Node root){
super(app, fpp, cam, OUTLINE_THICKNESS);
this.root = root;
Node rootNum = createNum();
rootNum.setLocalTranslation(new Vector3f(0.35f,0.8f,0));
root.attachChild(rootNum);
}
private Node createNum(){
Node rootNum = new Node("root Num");
Geometry circle = new Geometry("circle", new Sphere(20,20,1));
circle.setLocalTranslation(new Vector3f(0.03f,0.01f,1));
circle.setLocalScale(0.2f);
Material mat = new Material(getApp().getAssetManager(), "Common/MatDefs/Misc/Unshaded.j3md");
mat.setColor("Color", ColorRGBA.Black);
circle.setMaterial(mat);
root.attachChild(circle);
BitmapFont guiFont = getApp().getAssetManager().loadFont("Fonts/Gunplay.fnt");
num = new BitmapText(guiFont);
num.setSize(0.3f);
num.setText("1");
num.setColor(ColorRGBA.White);
num.setLocalTranslation(-num.getLineWidth() / 2, num.getHeight() / 2, 2);
rootNum.attachChild(circle);
rootNum.attachChild(num);
return rootNum;
}
public void setNumCard(int num){
this.num.setText(String.valueOf(num));
}
public Node getRoot() {
return root;
}
@Override
public void initSpatial(){
}
public void outline(){
super.outline(OUTLINE_COLOR);
}
private final static Vector3f HIGHLIGHT_Y = new Vector3f(0,0.4f,0);
public void setHighlight() {
this.highlight = true;
root.setLocalTranslation(root.getLocalTranslation().add(HIGHLIGHT_Y));
highlight();
}
public void highlight() {
super.outline(HIGHLIGHT_COLOR, HIGHLIGHT_WIDTH);
}
public void unHighlight(){
highlight = false;
root.setLocalTranslation(root.getLocalTranslation().subtract(HIGHLIGHT_Y));
deOutline();
}
public void hover(){
if(!hoverable) return;
super.outline(HOVER_COLOR, HOVER_WIDTH);
}
public void hoverOff(){
if(!hoverable) return;
if(select) select();
else if(highlight) highlight();
else deOutline();
}
public void select(){
if(!selectable) return;
select = true;
super.outline(SELECT_COLOR, SELECT_WIDTH);
}
public void unSelect(){
if(!selectable) return;
select = false;
if(highlight) highlight();
else deOutline();
}
public void setSelectable(boolean selectable){
this.selectable = selectable;
}
public boolean isSelected() {
return select;
}
public boolean isSelectable() {
return selectable;
}
public void setHoverable(boolean hoverable) {
this.hoverable = hoverable;
}
}

View File

@@ -3,7 +3,9 @@
import com.jme3.app.Application;
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;
import com.jme3.post.filters.ComposeFilter;
@@ -12,6 +14,9 @@
import com.jme3.renderer.ViewPort;
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;
@@ -48,6 +53,22 @@ public void initialize(AppStateManager stateManager, Application app ) {
view.attachScene(root);
fpp.setFrameBufferFormat(Image.Format.RGBA8);
fpp.addFilter(new ComposeFilter(backTexture));
DirectionalLight sun = new DirectionalLight();
sun.setColor(ColorRGBA.White);
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);
dlsf.setEdgeFilteringMode(EdgeFilteringMode.PCFPOISSON);
dlsf.setShadowIntensity(.5f);
fpp.addFilter(dlsf);
view.addProcessor(fpp);
if(!init) init = true;

View File

@@ -1,36 +1,48 @@
package pp.mdga.client.gui;
import com.jme3.asset.AssetManager;
import com.jme3.material.Material;
import com.jme3.math.FastMath;
import com.jme3.math.Quaternion;
import com.jme3.math.Vector3f;
import com.jme3.renderer.RenderManager;
import com.jme3.renderer.ViewPort;
import com.jme3.renderer.queue.RenderQueue;
import com.jme3.scene.Spatial;
import com.jme3.scene.control.AbstractControl;
import pp.mdga.client.Asset;
import pp.mdga.message.server.Dice;
import java.util.Random;
import static com.jme3.material.Materials.LIGHTING;
import static com.jme3.material.Materials.UNSHADED;
public class DiceControl extends AbstractControl {
private final Random random = new Random();
private Quaternion targetRotation; // Final rotation of the dice
private final Vector3f angularVelocity = new Vector3f(); // Rotational velocity (radians/sec)
private float deceleration = 0.5f; // Friction-like deceleration
private boolean isRolling = false;
private boolean slerp = false;
private Quaternion targetRotation;
private final Vector3f angularVelocity = new Vector3f();
private float deceleration = 0.5f;
private float timeElapsed = 0.0f;
private float rollDuration = 0.0001f;
private static final int ANGULAR_MIN = 5;
private static final int ANGULAR_MAX = 15;
private static final int ANGULAR_SPIN = 10;
private boolean isRolling = false;
private boolean slerp = false;
private boolean spin = false;
private final AssetManager assetManager;
public DiceControl(AssetManager assetManager){
this.assetManager = assetManager;
}
@Override
protected void controlUpdate(float tpf) {
if (isRolling) {
if(!slerp) {
// Apply rotational velocity to the dice
Quaternion currentRotation = spatial.getLocalRotation();
Quaternion deltaRotation = new Quaternion();
deltaRotation.fromAngles(
angularVelocity.x * tpf,
angularVelocity.y * tpf,
angularVelocity.z * tpf
);
spatial.setLocalRotation(currentRotation.mult(deltaRotation));
spinWithAngularVelocity(tpf);
// Gradually reduce rotational velocity (simulate deceleration)
angularVelocity.subtractLocal(
@@ -47,9 +59,6 @@ protected void controlUpdate(float tpf) {
if (timeElapsed > 1.0f) timeElapsed = 1.0f;
// Quaternion interpolated = new Quaternion();
// interpolated.slerp(spatial.getLocalRotation(), targetRotation, progress);
// spatial.setLocalRotation(interpolated);
Quaternion interpolated = spatial.getLocalRotation().clone();
interpolated.nlerp(targetRotation, lerp(timeElapsed));
spatial.setLocalRotation(interpolated);
@@ -59,41 +68,52 @@ protected void controlUpdate(float tpf) {
isRolling = false;
slerp = false;
}
}
}else if(spin){
spinWithAngularVelocity(tpf);
}
}
private void spinWithAngularVelocity(float tpf){
Quaternion currentRotation = spatial.getLocalRotation();
Quaternion deltaRotation = new Quaternion();
deltaRotation.fromAngles(
angularVelocity.x * tpf,
angularVelocity.y * tpf,
angularVelocity.z * tpf
);
spatial.setLocalRotation(currentRotation.mult(deltaRotation));
}
@Override
protected void controlRender(RenderManager rm, ViewPort vp) {
// No custom rendering needed
}
public void rollDice(int diceNum) {
if (isRolling) return; // Prevent re-rolling during animation
// Set high initial rotational velocity
public void rollDice(int diceNum) {
if (isRolling) return;
spin = false;
slerp = false;
angularVelocity.set(
random.nextFloat() * 1000f + 200f, // X-axis speed
random.nextFloat() * 1000f + 200f, // Y-axis speed
random.nextFloat() * 1000f + 200f // Z-axis speed
FastMath.nextRandomInt(ANGULAR_MIN,ANGULAR_MAX),
FastMath.nextRandomInt(ANGULAR_MIN,ANGULAR_MAX),
FastMath.nextRandomInt(ANGULAR_MIN,ANGULAR_MAX)
);
// Set final target rotation for the diceNum
targetRotation = getRotationForDiceNum(diceNum);
isRolling = true;
}
private Quaternion getRotationForDiceNum(int diceNum) {
// Define specific rotations for each dice face (adjust based on your dice model)
return switch (diceNum) {
case 1 -> new Quaternion().fromAngleAxis((float) (1 * (Math.PI / 2)), Vector3f.UNIT_X); //
case 2 -> new Quaternion().fromAngleAxis((float) (1 * (Math.PI / 2)), Vector3f.UNIT_Y); //
case 3 -> new Quaternion().fromAngleAxis((float) (0 * (Math.PI / 2)), Vector3f.UNIT_X); //
case 4 -> new Quaternion().fromAngleAxis((float) (2 * (Math.PI / 2)), Vector3f.UNIT_Y); //
case 5 -> new Quaternion().fromAngleAxis((float) (3 * (Math.PI / 2)), Vector3f.UNIT_Y); //
case 6 -> new Quaternion().fromAngleAxis((float) (3 * (Math.PI / 2)), Vector3f.UNIT_X); //
case 1 -> new Quaternion().fromAngleAxis((float) (1 * (Math.PI / 2)), Vector3f.UNIT_X);
case 2 -> new Quaternion().fromAngleAxis((float) (1 * (Math.PI / 2)), Vector3f.UNIT_Y);
case 3 -> new Quaternion().fromAngleAxis((float) (0 * (Math.PI / 2)), Vector3f.UNIT_X);
case 4 -> new Quaternion().fromAngleAxis((float) (2 * (Math.PI / 2)), Vector3f.UNIT_Y);
case 5 -> new Quaternion().fromAngleAxis((float) (3 * (Math.PI / 2)), Vector3f.UNIT_Y);
case 6 -> new Quaternion().fromAngleAxis((float) (3 * (Math.PI / 2)), Vector3f.UNIT_X);
default -> throw new IllegalArgumentException("Invalid dice number: " + diceNum);
};
}
@@ -102,4 +122,48 @@ public static float lerp(float t) {
return (float) Math.sqrt(1 - Math.pow(t - 1, 2));
}
public void randomRotation() {
Quaternion randomRotation = new Quaternion();
randomRotation.fromAngles(
FastMath.nextRandomFloat() * FastMath.TWO_PI, // Random X rotation
FastMath.nextRandomFloat() * FastMath.TWO_PI, // Random Y rotation
FastMath.nextRandomFloat() * FastMath.TWO_PI // Random Z rotation
);
spatial.setLocalRotation(randomRotation);
}
public void spin(){
angularVelocity.set(ANGULAR_SPIN,ANGULAR_SPIN,ANGULAR_SPIN);
spin = true;
}
public void hide(){
spatial.removeFromParent();
spin = false;
isRolling = false;
slerp = false;
}
public void create(Vector3f pos, float scale, boolean shadow){
Spatial spatial = assetManager.loadModel(Asset.dice.getModelPath());
Material mat;
if(shadow){
mat = new Material(assetManager, LIGHTING);
mat.setTexture("DiffuseMap", assetManager.loadTexture(Asset.dice.getDiffPath()));
spatial.setShadowMode(RenderQueue.ShadowMode.CastAndReceive);
}
else{
mat = new Material(assetManager, UNSHADED);
mat.setTexture("ColorMap", assetManager.loadTexture(Asset.dice.getDiffPath()));
}
spatial.setMaterial(mat);
spatial.setLocalScale(scale);
spatial.setLocalTranslation(pos);
spatial.rotate((float)Math.toRadians(90), (float)Math.toRadians(180), (float)Math.toRadians(180));
spatial.addControl(this);
}
public void setPos(Vector3f pos){
spatial.setLocalTranslation(pos);
}
}

View File

@@ -7,6 +7,7 @@
import com.jme3.math.Vector3f;
import com.jme3.post.FilterPostProcessor;
import com.jme3.renderer.Camera;
import com.jme3.renderer.queue.RenderQueue;
import com.jme3.scene.Node;
import com.jme3.scene.Spatial;
import com.jme3.texture.Texture2D;
@@ -17,40 +18,48 @@
import java.util.*;
import static com.jme3.material.Materials.UNSHADED;
public class GuiHandler {
private MdgaApp app;
private CardLayer cardLayer;
private Map<UUID, CardControl> ownCardsMap;
private BitmapFont playerFont;
private Node playerNameNode;
private List<Color> playerOrder;
Map<Color, String> colorNameMap;
private Map<UUID, BonusCard> uuidBonusCardMap;
private Map<BonusCard, CardControl> bonusCardControlMap;
private Map<BonusCard, Integer> bonusCardIntegerMap;
private static final Vector3f START = new Vector3f(-3,-3,0);
private static final Vector3f MARGIN = new Vector3f(2.5f,0,0);
private static final Vector3f START = new Vector3f(-1.8f,-3.5f,0);
private static final Vector3f MARGIN = new Vector3f(1.8f,0,0);
private final FilterPostProcessor fpp;
Texture2D backTexture;
private Camera cardLayerCamera;
private DiceControl diceControl;
private Set<CardControl> selectableCards = new HashSet<>();
private BonusCard cardSelect = null;
private PlayerNameHandler playerNameHandler;
public GuiHandler(MdgaApp app, Texture2D backTexture) {
this.app = app;
this.fpp = new FilterPostProcessor(app.getAssetManager());
this.backTexture = backTexture;
cardLayerCamera = createOverlayCam();
uuidBonusCardMap = new HashMap<>();
bonusCardIntegerMap = new HashMap<>();
bonusCardControlMap = new HashMap<>();
}
public void init(){
cardLayer = new CardLayer(fpp, cardLayerCamera, backTexture);
app.getStateManager().attach(cardLayer);
ownCardsMap = new HashMap<>();
playerFont = app.getAssetManager().loadFont("Fonts/Gunplay.fnt");
playerNameNode = new Node("player name node");
app.getGuiNode().attachChild(playerNameNode);
playerOrder = new ArrayList<>();
colorNameMap = new HashMap<>();
diceControl = new DiceControl(app.getAssetManager());
diceControl.create(new Vector3f(0,0,0), 1f, false);
playerNameHandler = new PlayerNameHandler(app.getGuiNode(), app.getAssetManager(), app.getContext().getSettings());
new ActionTextHandler(app.getContext().getSettings(), app.getAssetManager(), app.getGuiNode());
}
@@ -60,7 +69,6 @@ public void shutdown(){
}
cardLayer = null;
ownCardsMap = null;
}
private Asset bonusToAsset(BonusCard card){
@@ -73,114 +81,75 @@ private Asset bonusToAsset(BonusCard card){
}
public void addCard(BonusCard card, UUID uuid) {
CardControl control = createCard(bonusToAsset(card), nextPos());
ownCardsMap.put(uuid, control);
cardLayer.addSpatial(control.getSpatial());
if(card == BonusCard.HIDDEN) throw new RuntimeException("cant add hidden card to gui");
uuidBonusCardMap.put(uuid, card);
if(!bonusCardControlMap.containsKey(card)) {
CardControl control = createCard(bonusToAsset(card), nextPos());
bonusCardControlMap.put(card, control);
cardLayer.addSpatial(control.getRoot());
}
int newNum = bonusCardIntegerMap.getOrDefault(card,0) + 1;
bonusCardIntegerMap.put(card, newNum);
bonusCardControlMap.get(card).setNumCard(newNum);
}
public void rollDice(int rollNum){
if(!(1 <= rollNum && rollNum <= 6)) throw new RuntimeException("rollNum is not in the range [1,6]");
diceControl.rollDice(rollNum);
}
public void showDice(){
DiceControl control = createDice();
cardLayer.addSpatial(control.getSpatial());
control.rollDice(1);
cardLayer.addSpatial(diceControl.getSpatial());
diceControl.spin();
}
private DiceControl createDice() {
Spatial spatial = app.getAssetManager().loadModel(Asset.dice.getModelPath());
Material mat = new Material(app.getAssetManager(), "Common/MatDefs/Misc/Unshaded.j3md");
mat.setTexture("ColorMap", app.getAssetManager().loadTexture(Asset.dice.getDiffPath()));
spatial.setMaterial(mat);
spatial.setLocalScale(1f);
spatial.setLocalTranslation(new Vector3f(0,0,0));
spatial.rotate((float)Math.toRadians(90), (float)Math.toRadians(180), (float)Math.toRadians(180));
DiceControl control = new DiceControl();
spatial.addControl(control);
return control;
}
public void deleteCard(UUID uuid){
if(!ownCardsMap.containsKey(uuid)) throw new RuntimeException("uuid dont exist in ownCardsmap");
cardLayer.deleteSpatial(ownCardsMap.get(uuid).getSpatial());
ownCardsMap.remove(uuid);
public void hideDice(){
diceControl.hide();
}
private Vector3f nextPos() {
return START.add(MARGIN.mult(ownCardsMap.size()));
return START.add(MARGIN.mult(bonusCardControlMap.size()));
}
private CardControl createCard(Asset card, Vector3f pos){
Node rootCard = new Node("Root Card");
Spatial spatial = app.getAssetManager().loadModel(card.getModelPath());
Material mat = new Material(app.getAssetManager(), "Common/MatDefs/Misc/Unshaded.j3md");
mat.setTexture("ColorMap", app.getAssetManager().loadTexture(card.getDiffPath()));
rootCard.attachChild(spatial);
// Material mat = new Material(app.getAssetManager(), "Common/MatDefs/Misc/Unshaded.j3md");
Material mat = new Material(app.getAssetManager(), "Common/MatDefs/Light/Lighting.j3md");
// mat.setTexture("ColorMap", app.getAssetManager().loadTexture(card.getDiffPath()));
mat.setTexture("DiffuseMap", app.getAssetManager().loadTexture(card.getDiffPath()));
spatial.setMaterial(mat);
spatial.setLocalScale(1f);
spatial.setLocalTranslation(pos);
rootCard.setLocalTranslation(pos);
// spatial.setLocalTranslation(pos);
spatial.rotate((float)Math.toRadians(90), (float)Math.toRadians(180), (float)Math.toRadians(180));
CardControl control = new CardControl(app, fpp, cardLayer.getOverlayCam());
spatial.setShadowMode(RenderQueue.ShadowMode.CastAndReceive);
CardControl control = new CardControl(app, fpp, cardLayer.getOverlayCam(), rootCard);
spatial.addControl(control);
return control;
}
private void drawPlayers(){
playerNameNode.detachAllChildren();
float paddingTop = 10;
float paddingLeft = 15;
float margin = 35;
for(int i = 0; i < playerOrder.size(); i++) {
Color color = playerOrder.get(i);
if(!colorNameMap.containsKey(color)) throw new RuntimeException(color + " isn't mapped to a name");
String name = colorNameMap.get(color);
renderName(name, paddingTop + margin * i, paddingLeft, i == 0);
}
}
private void renderName(String name, float paddingTop, float paddingLeft, boolean first){
BitmapText hudText = new BitmapText(playerFont);
//renderedSize = 45
hudText.setSize(28);
hudText.setColor(first ? ColorRGBA.Blue : ColorRGBA.White);
hudText.setText(name);
int screenHeight = app.getContext().getSettings().getHeight();
hudText.setLocalTranslation(paddingLeft, screenHeight - paddingTop, 0);
playerNameNode.attachChild(hudText);
}
public void setPlayers(List<String> names, List<Color> colors){
if(names.size() != colors.size()) throw new RuntimeException("names and colors are not the same size");
for(int i = 0; i < names.size(); i++){
colorNameMap.put(colors.get(i), names.get(i));
}
this.playerOrder = new ArrayList<>(colors);
drawPlayers();
}
public void addPlayer(Color color, String name){
colorNameMap.put(color, name);
playerOrder.add(color);
drawPlayers();
public void addPlayer(Color color, String name, boolean own){
playerNameHandler.addPlayer(color, name, own);
}
public void setActivePlayer(Color color){
Color lastFirst = playerOrder.remove(0);
playerOrder.remove(color);
playerOrder.add(0,color);
playerOrder.add(lastFirst);
drawPlayers();
playerNameHandler.setActivePlayer(color);
}
private Camera createOverlayCam(){
Camera originalCam = app.getCamera();
Camera overlayCam = new Camera(originalCam.getWidth(), originalCam.getHeight());
overlayCam.setParallelProjection(false);
overlayCam.setFrustum(originalCam.getFrustumNear(), originalCam.getFrustumFar(), originalCam.getFrustumLeft(), originalCam.getFrustumRight(),originalCam.getFrustumTop(), originalCam.getFrustumBottom());
overlayCam.setFov(originalCam.getFov());
overlayCam.setParallelProjection(true);
// overlayCam.setFrustum(originalCam.getFrustumNear(), originalCam.getFrustumFar(), originalCam.getFrustumLeft(), originalCam.getFrustumRight(),originalCam.getFrustumTop(), originalCam.getFrustumBottom());
float CAMERA_ZOOM = 4;
float aspect = (float) originalCam.getWidth() / originalCam.getHeight();
float size = CAMERA_ZOOM;
overlayCam.setFrustum(-1000, 1000, -aspect * size, aspect * size, size, -size);
// overlayCam.setFov(originalCam.getFov());
overlayCam.setLocation(new Vector3f(0, 0, 10));
overlayCam.lookAt(new Vector3f(0,0,0), Vector3f.UNIT_Y);
return overlayCam;
@@ -188,11 +157,14 @@ private Camera createOverlayCam(){
public void test(){
UUID uuid = UUID.randomUUID();
UUID uuid1 = UUID.randomUUID();
addCard(BonusCard.SHIELD, uuid);
addCard(BonusCard.TURBO, UUID.randomUUID());
addCard(BonusCard.SHIELD, UUID.randomUUID());
addCard(BonusCard.TURBO, uuid1);
addCard(BonusCard.SWAP, UUID.randomUUID());
showDice();
// setSelectableCards(List.of(uuid,uuid1));
// showDice();
}
public Camera getCardLayerCamera() {
@@ -204,4 +176,93 @@ public CardLayer getCardLayer(){
}
public void setSelectableCards_UUID(List<UUID> selectUuids) {
for(UUID uuid : selectUuids) {
selectableCards.add(bonusCardControlMap.get(uuidBonusCardMap.get(uuid)));
}
for(CardControl control : selectableCards){
control.setSelectable(true);
control.setHoverable(true);
control.setHighlight();
}
}
public void setSelectableCards(List<BonusCard> select) {
for(BonusCard uuid : select) {
selectableCards.add(bonusCardControlMap.get(uuid));
}
for(CardControl control : selectableCards){
control.setSelectable(true);
control.setHoverable(true);
control.setHighlight();
}
}
public void clearSelectableCards(){
for(CardControl control : selectableCards){
control.setSelectable(false);
control.setHoverable(false);
control.unHighlight();
control.unSelect();
}
selectableCards.clear();
cardSelect = null;
}
public void selectCard(CardControl cardControl) {
if(cardControl.isSelected()) {
cardControl.unSelect();
cardSelect = null;
}
else {
for (CardControl control : selectableCards){
control.unSelect();
}
cardControl.select();
cardSelect = getKeyByValue(bonusCardControlMap, cardControl);
}
}
public static <K, V> K getKeyByValue(Map<K, V> map, V value) {
for (Map.Entry<K, V> entry : map.entrySet()) {
if (entry.getValue().equals(value)) {
return entry.getKey();
}
}
return null; // Key not found
}
private SymbolControl createSymbol(Asset asset){
Spatial spatial = app.getAssetManager().loadModel(asset.getModelPath());
Material mat = new Material(app.getAssetManager(), "Common/MatDefs/Misc/Unshaded.j3md");
mat.setTexture("ColorMap", app.getAssetManager().loadTexture(asset.getDiffPath()));
spatial.setMaterial(mat);
spatial.setLocalScale(1f);
spatial.rotate((float)Math.toRadians(90), (float)Math.toRadians(180), (float)Math.toRadians(180));
SymbolControl control = new SymbolControl();
spatial.addControl(control);
return control;
}
public void shield(){
SymbolControl control = createSymbol(Asset.shieldSymbol);
cardLayer.addSpatial(control.getSpatial());
control.shield();
}
public void swap(){
SymbolControl control = createSymbol(Asset.swapSymbol);
cardLayer.addSpatial(control.getSpatial());
control.swap();
}
public void turbo(){
SymbolControl control = createSymbol(Asset.turboSymbol);
cardLayer.addSpatial(control.getSpatial());
control.turbo();
}
}

View File

@@ -0,0 +1,119 @@
package pp.mdga.client.gui;
import com.jme3.asset.AssetManager;
import com.jme3.font.BitmapFont;
import com.jme3.font.BitmapText;
import com.jme3.math.ColorRGBA;
import com.jme3.scene.Node;
import com.jme3.scene.Spatial;
import com.jme3.system.AppSettings;
import com.jme3.ui.Picture;
import pp.mdga.game.Color;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class PlayerNameHandler {
private final BitmapFont playerFont;
private final Node playerNameNode;
private final List<Color> playerOrder;
private final Map<Color, String> colorNameMap;
private final AppSettings appSettings;
private final AssetManager assetManager;
private Color ownColor;
private static final float PADDING_TOP = 50;
private static final float PADDING_LEFT = 50;
private static final float MARGIN_NAMES = 50;
private static final float IMAGE_SIZE = 50;
private static final float TEXT_SIZE = 28;
private static final ColorRGBA NORMAL_COLOR = ColorRGBA.White;
private static final ColorRGBA ACTIVE_COLOR = ColorRGBA.Blue;
private static final ColorRGBA OWN_COLOR = ColorRGBA.Cyan;
public PlayerNameHandler(Node guiNode, AssetManager assetManager, AppSettings appSettings){
playerFont = assetManager.loadFont("Fonts/Gunplay.fnt");
playerNameNode = new Node("player name node");
playerOrder = new ArrayList<>();
colorNameMap = new HashMap<>();
guiNode.attachChild(playerNameNode);
this.appSettings = appSettings;
this.assetManager = assetManager;
}
private void drawPlayers(){
playerNameNode.detachAllChildren();
for(int i = 0; i < playerOrder.size(); i++) {
Color color = playerOrder.get(i);
if(!colorNameMap.containsKey(color)) throw new RuntimeException(color + " isn't mapped to a name");
Node nameParent = new Node("nameParent");
nameParent.attachChild(createName(colorNameMap.get(color), i == 0, color == ownColor));
nameParent.attachChild(createColor(color));
nameParent.setLocalTranslation(50,appSettings.getWindowHeight()-PADDING_TOP- MARGIN_NAMES *i,0);
playerNameNode.attachChild(nameParent);
}
}
private String imagePath(Color color){
String root = "./Images/name_pictures/";
return switch(color){
case ARMY -> root+"HEER_IMAGE.png";
case NAVY -> root+"MARINE_IMAGE.png";
case CYBER -> root+"CIR_IMAGE.png";
case AIRFORCE -> root+"LW_IMAGE.png";
};
}
private Spatial createColor(Color color) {
Picture pic = new Picture("HUD Picture");
pic.setImage(assetManager, imagePath(color), true);
pic.setWidth(IMAGE_SIZE);
pic.setHeight(IMAGE_SIZE);
pic.setPosition(-pic.getWidth()/2,-pic.getHeight()/2);
return pic;
}
private ColorRGBA playerColorToColorRGBA(Color color){
return switch (color){
case ARMY -> ColorRGBA.Green;
case NAVY -> ColorRGBA.Blue;
case CYBER -> ColorRGBA.Orange;
case AIRFORCE -> ColorRGBA.Black;
};
}
private Spatial createName(String name, boolean first, boolean own){
BitmapText hudText = new BitmapText(playerFont);
//renderedSize = 45
hudText.setSize(TEXT_SIZE);
hudText.setColor(first ? ACTIVE_COLOR : own ? OWN_COLOR : NORMAL_COLOR);
hudText.setText(name);
hudText.setLocalTranslation(PADDING_LEFT,hudText.getHeight()/2, 0);
return hudText;
}
public void addPlayer(Color color, String name, boolean own){
if(own) ownColor = color;
colorNameMap.put(color, name);
playerOrder.add(color);
drawPlayers();
}
public void setActivePlayer(Color color) {
Color lastFirst = playerOrder.remove(0);
playerOrder.remove(color);
playerOrder.add(0, color);
playerOrder.add(lastFirst);
drawPlayers();
}
}

View File

@@ -0,0 +1,149 @@
package pp.mdga.client.gui;
import com.jme3.math.Quaternion;
import com.jme3.math.Vector3f;
import com.jme3.renderer.RenderManager;
import com.jme3.renderer.ViewPort;
import com.jme3.scene.control.AbstractControl;
import pp.mdga.game.BonusCard;
public class SymbolControl extends AbstractControl {
private boolean zoomingIn = false;
private boolean zoomingOut = false;
private float zoomSpeed = 1f;
private float zoomFactor = 3f;
private float progress = 0;
private BonusCard state;
private float rotationSpeed = 0.8f;
private Quaternion initialRotation = null;
private float Y = 5;
@Override
protected void controlUpdate(float tpf) {
if(state == null) return;
switch (state){
case SHIELD -> shieldUpdate(tpf);
case SWAP -> swapUpdate(tpf);
case TURBO -> turboUpdate(tpf);
case HIDDEN -> throw new RuntimeException("forbidden state");
}
}
@Override
protected void controlRender(RenderManager rm, ViewPort vp) {
}
private void shieldUpdate(float tpf){
if (zoomingIn) {
progress += tpf * zoomSpeed;
if (progress > 1) progress = 1;
spatial.setLocalScale(lerp(0, zoomFactor, easeOut(progress)));
if (progress >= 1) {
zoomingIn = false;
zoomingOut = true;
progress = 0;
}
} else if (zoomingOut) {
progress += tpf * zoomSpeed;
spatial.setLocalScale(lerp(zoomFactor, 0, easeIn(progress)));
if (progress > 1) {
zoomingIn = false;
spatial.removeFromParent();
state = null;
progress = 0;
}
}
}
private void swapUpdate(float tpf){
if (initialRotation == null) {
initialRotation = spatial.getLocalRotation().clone();
}
progress += tpf*rotationSpeed;
if(progress < 0) return;
float angle = lerp(0, 360, easeInOut(progress));
Quaternion newRotation = new Quaternion();
newRotation.fromAngleAxis((float) Math.toRadians(angle), new Vector3f(0, 1, 0));
spatial.setLocalRotation(initialRotation.mult(newRotation));
if (progress >= 1.2f) {
state = null;
initialRotation = null;
progress = 0;
spatial.removeFromParent();
}
}
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);
if (progress >= 1) {
zoomingIn = false;
zoomingOut = true;
progress = 0;
}
} else if (zoomingOut) {
progress += tpf * zoomSpeed;
float y = lerp(0,Y, easeIn(progress));
spatial.setLocalTranslation(0,y,0);
if (progress > 1) {
zoomingIn = false;
spatial.removeFromParent();
state = null;
}
}
}
public void shield(){
if(state != null) throw new RuntimeException("another state is avtive");
state = BonusCard.SHIELD;
zoomingIn = true;
zoomingOut = false;
progress = 0;
spatial.setLocalScale(1f);
}
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");
spatial.setLocalScale(2);
state = BonusCard.TURBO;
zoomingIn = true;
zoomingOut = false;
progress = 0;
}
private static float lerp(float start, float end, float t) {
return (1 - t) * start + t * end;
}
private static float easeOut(float t) {
return (float) Math.sqrt(1 - Math.pow(t - 1, 2));
}
private float easeInOut(float t) {
if(t>1) t=1;
return (float) -(Math.cos(Math.PI * t) - 1) / 2;
}
private float easeIn(float t) {
return t * t * t * t;
}
}

View File

@@ -1,6 +1,14 @@
package pp.mdga.client.view;
import com.jme3.input.KeyInput;
import com.jme3.input.MouseInput;
import com.jme3.input.controls.ActionListener;
import com.jme3.input.controls.KeyTrigger;
import com.jme3.input.controls.MouseButtonTrigger;
import com.jme3.post.FilterPostProcessor;
import com.jme3.post.filters.ComposeFilter;
import com.jme3.shadow.DirectionalLightShadowFilter;
import com.jme3.shadow.EdgeFilteringMode;
import com.jme3.texture.FrameBuffer;
import com.jme3.texture.Image;
import com.jme3.texture.Texture2D;
@@ -11,6 +19,11 @@
import pp.mdga.client.button.ButtonRight;
import pp.mdga.client.button.SettingsButton;
import pp.mdga.client.gui.GuiHandler;
import pp.mdga.game.Color;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
public class GameView extends MdgaView {
private BoardHandler boardHandler;
@@ -19,6 +32,8 @@ public class GameView extends MdgaView {
private ButtonRight cheatButton; //TODO
private Color ownColor = null;
public GameView(MdgaApp app) {
super(app);
@@ -48,10 +63,29 @@ public void onEnter() {
camera.init();
boardHandler.init();
guiHandler.init();
continueButton.show();
// boardHandler.addPlayer(Color.AIRFORCE, test);
// boardHandler.movePieceStart(player0, 0);
// boardHandler.enableHover(player0);
// boardHandler.enableHover(player1);
// boardHandler.highlight(player0, true);
// boardHandler.outline(player0, true);
// boardHandler.outline(10);
guiHandler.test();
}
@Override
public void onLeave() {
continueButton.hide();
camera.shutdown();
boardHandler.shutdown();
guiHandler.shutdown();
@@ -88,4 +122,12 @@ public BoardHandler getBoardHandler() {
public GuiHandler getGuiHandler() {
return guiHandler;
}
public void setOwnColor(Color ownColor) {
this.ownColor = ownColor;
}
public Color getOwnColor() {
return ownColor;
}
}

View File

@@ -1,195 +1,195 @@
info face=null size=45 bold=0 italic=0 charset=ASCII unicode=0 stretchH=100 smooth=1 aa=1 padding=0,0,0,0 spacing=1,1
common lineHeight=55 base=26 scaleW=512 scaleH=512 pages=1 packed=0
info face=null size=178 bold=0 italic=0 charset=ASCII unicode=0 stretchH=100 smooth=1 aa=1 padding=0,0,0,0 spacing=1,1
common lineHeight=214 base=26 scaleW=2048 scaleH=2048 pages=1 packed=0
page id=0 file="Gunplay.png"
chars count=255
char id=9 x=0 y=11 width=0 height=55 xoffset=0 yoffset=0 xadvance=-1 page=0 chnl=0
char id=10 x=0 y=11 width=0 height=55 xoffset=0 yoffset=0 xadvance=-1 page=0 chnl=0
char id=13 x=0 y=11 width=0 height=55 xoffset=0 yoffset=0 xadvance=-1 page=0 chnl=0
char id=32 x=0 y=11 width=0 height=55 xoffset=0 yoffset=0 xadvance=14 page=0 chnl=0
char id=33 x=0 y=11 width=9 height=55 xoffset=2 yoffset=0 xadvance=12 page=0 chnl=0
char id=34 x=9 y=11 width=15 height=55 xoffset=2 yoffset=0 xadvance=17 page=0 chnl=0
char id=35 x=24 y=11 width=24 height=55 xoffset=0 yoffset=0 xadvance=23 page=0 chnl=0
char id=36 x=48 y=11 width=20 height=55 xoffset=1 yoffset=0 xadvance=21 page=0 chnl=0
char id=37 x=68 y=11 width=37 height=55 xoffset=1 yoffset=0 xadvance=38 page=0 chnl=0
char id=38 x=105 y=11 width=32 height=55 xoffset=1 yoffset=0 xadvance=32 page=0 chnl=0
char id=39 x=137 y=11 width=7 height=55 xoffset=2 yoffset=0 xadvance=9 page=0 chnl=0
char id=40 x=144 y=11 width=10 height=55 xoffset=1 yoffset=0 xadvance=10 page=0 chnl=0
char id=41 x=154 y=11 width=10 height=55 xoffset=1 yoffset=0 xadvance=10 page=0 chnl=0
char id=42 x=164 y=11 width=17 height=55 xoffset=1 yoffset=0 xadvance=17 page=0 chnl=0
char id=43 x=181 y=11 width=21 height=55 xoffset=0 yoffset=0 xadvance=21 page=0 chnl=0
char id=44 x=202 y=11 width=9 height=55 xoffset=1 yoffset=0 xadvance=10 page=0 chnl=0
char id=45 x=211 y=11 width=15 height=55 xoffset=2 yoffset=0 xadvance=18 page=0 chnl=0
char id=46 x=226 y=11 width=9 height=55 xoffset=2 yoffset=0 xadvance=11 page=0 chnl=0
char id=47 x=235 y=11 width=25 height=55 xoffset=0 yoffset=0 xadvance=24 page=0 chnl=0
char id=48 x=260 y=11 width=26 height=55 xoffset=2 yoffset=0 xadvance=28 page=0 chnl=0
char id=49 x=286 y=11 width=15 height=55 xoffset=0 yoffset=0 xadvance=15 page=0 chnl=0
char id=50 x=301 y=11 width=26 height=55 xoffset=1 yoffset=0 xadvance=27 page=0 chnl=0
char id=51 x=327 y=11 width=25 height=55 xoffset=1 yoffset=0 xadvance=26 page=0 chnl=0
char id=52 x=352 y=11 width=28 height=55 xoffset=0 yoffset=0 xadvance=27 page=0 chnl=0
char id=53 x=380 y=11 width=24 height=55 xoffset=1 yoffset=0 xadvance=26 page=0 chnl=0
char id=54 x=404 y=11 width=25 height=55 xoffset=2 yoffset=0 xadvance=28 page=0 chnl=0
char id=55 x=429 y=11 width=23 height=55 xoffset=1 yoffset=0 xadvance=23 page=0 chnl=0
char id=56 x=452 y=11 width=25 height=55 xoffset=1 yoffset=0 xadvance=26 page=0 chnl=0
char id=57 x=477 y=11 width=26 height=55 xoffset=1 yoffset=0 xadvance=28 page=0 chnl=0
char id=58 x=503 y=11 width=8 height=55 xoffset=2 yoffset=0 xadvance=10 page=0 chnl=0
char id=59 x=0 y=66 width=9 height=55 xoffset=1 yoffset=0 xadvance=10 page=0 chnl=0
char id=60 x=9 y=66 width=14 height=55 xoffset=0 yoffset=0 xadvance=14 page=0 chnl=0
char id=61 x=23 y=66 width=22 height=55 xoffset=2 yoffset=0 xadvance=24 page=0 chnl=0
char id=62 x=45 y=66 width=14 height=55 xoffset=2 yoffset=0 xadvance=15 page=0 chnl=0
char id=63 x=59 y=66 width=23 height=55 xoffset=1 yoffset=0 xadvance=24 page=0 chnl=0
char id=64 x=82 y=66 width=32 height=55 xoffset=1 yoffset=0 xadvance=34 page=0 chnl=0
char id=65 x=114 y=66 width=29 height=55 xoffset=0 yoffset=0 xadvance=28 page=0 chnl=0
char id=66 x=143 y=66 width=26 height=55 xoffset=2 yoffset=0 xadvance=28 page=0 chnl=0
char id=67 x=169 y=66 width=26 height=55 xoffset=2 yoffset=0 xadvance=28 page=0 chnl=0
char id=68 x=195 y=66 width=26 height=55 xoffset=2 yoffset=0 xadvance=28 page=0 chnl=0
char id=69 x=221 y=66 width=21 height=55 xoffset=2 yoffset=0 xadvance=23 page=0 chnl=0
char id=70 x=242 y=66 width=21 height=55 xoffset=2 yoffset=0 xadvance=22 page=0 chnl=0
char id=71 x=263 y=66 width=25 height=55 xoffset=2 yoffset=0 xadvance=28 page=0 chnl=0
char id=72 x=288 y=66 width=25 height=55 xoffset=2 yoffset=0 xadvance=28 page=0 chnl=0
char id=73 x=313 y=66 width=9 height=55 xoffset=2 yoffset=0 xadvance=12 page=0 chnl=0
char id=74 x=322 y=66 width=16 height=55 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=0
char id=75 x=338 y=66 width=28 height=55 xoffset=2 yoffset=0 xadvance=29 page=0 chnl=0
char id=76 x=366 y=66 width=20 height=55 xoffset=2 yoffset=0 xadvance=21 page=0 chnl=0
char id=77 x=386 y=66 width=35 height=55 xoffset=2 yoffset=0 xadvance=38 page=0 chnl=0
char id=78 x=421 y=66 width=27 height=55 xoffset=2 yoffset=0 xadvance=30 page=0 chnl=0
char id=79 x=448 y=66 width=26 height=55 xoffset=2 yoffset=0 xadvance=28 page=0 chnl=0
char id=80 x=474 y=66 width=25 height=55 xoffset=2 yoffset=0 xadvance=27 page=0 chnl=0
char id=81 x=0 y=121 width=26 height=55 xoffset=1 yoffset=0 xadvance=28 page=0 chnl=0
char id=82 x=26 y=121 width=26 height=55 xoffset=2 yoffset=0 xadvance=28 page=0 chnl=0
char id=83 x=52 y=121 width=28 height=55 xoffset=1 yoffset=0 xadvance=29 page=0 chnl=0
char id=84 x=80 y=121 width=27 height=55 xoffset=0 yoffset=0 xadvance=26 page=0 chnl=0
char id=85 x=107 y=121 width=26 height=55 xoffset=2 yoffset=0 xadvance=29 page=0 chnl=0
char id=86 x=133 y=121 width=29 height=55 xoffset=0 yoffset=0 xadvance=27 page=0 chnl=0
char id=87 x=162 y=121 width=42 height=55 xoffset=0 yoffset=0 xadvance=41 page=0 chnl=0
char id=88 x=204 y=121 width=31 height=55 xoffset=0 yoffset=0 xadvance=31 page=0 chnl=0
char id=89 x=235 y=121 width=29 height=55 xoffset=0 yoffset=0 xadvance=28 page=0 chnl=0
char id=90 x=264 y=121 width=25 height=55 xoffset=1 yoffset=0 xadvance=25 page=0 chnl=0
char id=91 x=289 y=121 width=8 height=55 xoffset=2 yoffset=0 xadvance=10 page=0 chnl=0
char id=92 x=297 y=121 width=25 height=55 xoffset=0 yoffset=0 xadvance=24 page=0 chnl=0
char id=93 x=322 y=121 width=8 height=55 xoffset=2 yoffset=0 xadvance=10 page=0 chnl=0
char id=94 x=330 y=121 width=23 height=55 xoffset=1 yoffset=0 xadvance=23 page=0 chnl=0
char id=95 x=353 y=121 width=31 height=55 xoffset=-1 yoffset=0 xadvance=28 page=0 chnl=0
char id=96 x=384 y=121 width=14 height=55 xoffset=-1 yoffset=0 xadvance=13 page=0 chnl=0
char id=97 x=398 y=121 width=24 height=55 xoffset=1 yoffset=0 xadvance=25 page=0 chnl=0
char id=98 x=422 y=121 width=22 height=55 xoffset=2 yoffset=0 xadvance=23 page=0 chnl=0
char id=99 x=444 y=121 width=23 height=55 xoffset=1 yoffset=0 xadvance=24 page=0 chnl=0
char id=100 x=467 y=121 width=22 height=55 xoffset=1 yoffset=0 xadvance=23 page=0 chnl=0
char id=101 x=489 y=121 width=23 height=55 xoffset=1 yoffset=0 xadvance=24 page=0 chnl=0
char id=102 x=0 y=176 width=17 height=55 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=0
char id=103 x=17 y=176 width=22 height=55 xoffset=1 yoffset=0 xadvance=24 page=0 chnl=0
char id=104 x=39 y=176 width=22 height=55 xoffset=2 yoffset=0 xadvance=24 page=0 chnl=0
char id=105 x=61 y=176 width=8 height=55 xoffset=2 yoffset=0 xadvance=11 page=0 chnl=0
char id=106 x=69 y=176 width=14 height=55 xoffset=-4 yoffset=0 xadvance=10 page=0 chnl=0
char id=107 x=83 y=176 width=24 height=55 xoffset=2 yoffset=0 xadvance=25 page=0 chnl=0
char id=108 x=107 y=176 width=8 height=55 xoffset=2 yoffset=0 xadvance=11 page=0 chnl=0
char id=109 x=115 y=176 width=34 height=55 xoffset=2 yoffset=0 xadvance=36 page=0 chnl=0
char id=110 x=149 y=176 width=22 height=55 xoffset=2 yoffset=0 xadvance=25 page=0 chnl=0
char id=111 x=171 y=176 width=23 height=55 xoffset=1 yoffset=0 xadvance=24 page=0 chnl=0
char id=112 x=194 y=176 width=22 height=55 xoffset=2 yoffset=0 xadvance=24 page=0 chnl=0
char id=113 x=216 y=176 width=22 height=55 xoffset=1 yoffset=0 xadvance=24 page=0 chnl=0
char id=114 x=238 y=176 width=15 height=55 xoffset=2 yoffset=0 xadvance=17 page=0 chnl=0
char id=115 x=253 y=176 width=22 height=55 xoffset=1 yoffset=0 xadvance=23 page=0 chnl=0
char id=116 x=275 y=176 width=17 height=55 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=0
char id=117 x=292 y=176 width=22 height=55 xoffset=2 yoffset=0 xadvance=24 page=0 chnl=0
char id=118 x=314 y=176 width=24 height=55 xoffset=0 yoffset=0 xadvance=23 page=0 chnl=0
char id=119 x=338 y=176 width=36 height=55 xoffset=0 yoffset=0 xadvance=36 page=0 chnl=0
char id=120 x=374 y=176 width=25 height=55 xoffset=1 yoffset=0 xadvance=25 page=0 chnl=0
char id=121 x=399 y=176 width=24 height=55 xoffset=0 yoffset=0 xadvance=23 page=0 chnl=0
char id=122 x=423 y=176 width=20 height=55 xoffset=1 yoffset=0 xadvance=21 page=0 chnl=0
char id=123 x=443 y=176 width=17 height=55 xoffset=0 yoffset=0 xadvance=17 page=0 chnl=0
char id=124 x=460 y=176 width=6 height=55 xoffset=2 yoffset=0 xadvance=8 page=0 chnl=0
char id=125 x=466 y=176 width=16 height=55 xoffset=1 yoffset=0 xadvance=17 page=0 chnl=0
char id=126 x=482 y=176 width=22 height=55 xoffset=3 yoffset=0 xadvance=27 page=0 chnl=0
char id=161 x=0 y=231 width=9 height=55 xoffset=2 yoffset=0 xadvance=12 page=0 chnl=0
char id=162 x=9 y=231 width=20 height=55 xoffset=2 yoffset=0 xadvance=22 page=0 chnl=0
char id=163 x=29 y=231 width=23 height=55 xoffset=1 yoffset=0 xadvance=23 page=0 chnl=0
char id=164 x=52 y=231 width=19 height=55 xoffset=3 yoffset=0 xadvance=24 page=0 chnl=0
char id=165 x=71 y=231 width=29 height=55 xoffset=1 yoffset=0 xadvance=30 page=0 chnl=0
char id=166 x=100 y=231 width=6 height=55 xoffset=2 yoffset=0 xadvance=8 page=0 chnl=0
char id=167 x=106 y=231 width=23 height=55 xoffset=2 yoffset=0 xadvance=25 page=0 chnl=0
char id=168 x=129 y=231 width=16 height=55 xoffset=2 yoffset=0 xadvance=19 page=0 chnl=0
char id=169 x=145 y=231 width=38 height=55 xoffset=1 yoffset=0 xadvance=39 page=0 chnl=0
char id=170 x=183 y=231 width=17 height=55 xoffset=1 yoffset=0 xadvance=18 page=0 chnl=0
char id=171 x=200 y=231 width=18 height=55 xoffset=2 yoffset=0 xadvance=22 page=0 chnl=0
char id=172 x=218 y=231 width=25 height=55 xoffset=2 yoffset=0 xadvance=28 page=0 chnl=0
char id=174 x=243 y=231 width=23 height=55 xoffset=1 yoffset=0 xadvance=23 page=0 chnl=0
char id=175 x=266 y=231 width=15 height=55 xoffset=2 yoffset=0 xadvance=18 page=0 chnl=0
char id=176 x=281 y=231 width=17 height=55 xoffset=1 yoffset=0 xadvance=18 page=0 chnl=0
char id=177 x=298 y=231 width=22 height=55 xoffset=3 yoffset=0 xadvance=27 page=0 chnl=0
char id=178 x=320 y=231 width=13 height=55 xoffset=2 yoffset=0 xadvance=15 page=0 chnl=0
char id=179 x=333 y=231 width=12 height=55 xoffset=2 yoffset=0 xadvance=14 page=0 chnl=0
char id=180 x=345 y=231 width=14 height=55 xoffset=2 yoffset=0 xadvance=15 page=0 chnl=0
char id=182 x=359 y=231 width=18 height=55 xoffset=3 yoffset=0 xadvance=22 page=0 chnl=0
char id=183 x=377 y=231 width=9 height=55 xoffset=2 yoffset=0 xadvance=11 page=0 chnl=0
char id=184 x=386 y=231 width=10 height=55 xoffset=2 yoffset=0 xadvance=12 page=0 chnl=0
char id=185 x=396 y=231 width=8 height=55 xoffset=2 yoffset=0 xadvance=11 page=0 chnl=0
char id=186 x=404 y=231 width=17 height=55 xoffset=1 yoffset=0 xadvance=19 page=0 chnl=0
char id=187 x=421 y=231 width=18 height=55 xoffset=2 yoffset=0 xadvance=22 page=0 chnl=0
char id=188 x=439 y=231 width=32 height=55 xoffset=2 yoffset=0 xadvance=34 page=0 chnl=0
char id=189 x=471 y=231 width=31 height=55 xoffset=2 yoffset=0 xadvance=35 page=0 chnl=0
char id=190 x=0 y=286 width=34 height=55 xoffset=0 yoffset=0 xadvance=34 page=0 chnl=0
char id=191 x=34 y=286 width=23 height=55 xoffset=1 yoffset=0 xadvance=24 page=0 chnl=0
char id=192 x=57 y=286 width=29 height=55 xoffset=0 yoffset=0 xadvance=28 page=0 chnl=0
char id=193 x=86 y=286 width=29 height=55 xoffset=0 yoffset=0 xadvance=28 page=0 chnl=0
char id=194 x=115 y=286 width=29 height=55 xoffset=0 yoffset=0 xadvance=28 page=0 chnl=0
char id=195 x=144 y=286 width=29 height=55 xoffset=0 yoffset=0 xadvance=28 page=0 chnl=0
char id=196 x=173 y=286 width=29 height=55 xoffset=0 yoffset=0 xadvance=28 page=0 chnl=0
char id=197 x=202 y=286 width=29 height=55 xoffset=0 yoffset=0 xadvance=28 page=0 chnl=0
char id=198 x=231 y=286 width=32 height=55 xoffset=0 yoffset=0 xadvance=33 page=0 chnl=0
char id=199 x=263 y=286 width=26 height=55 xoffset=2 yoffset=0 xadvance=28 page=0 chnl=0
char id=200 x=289 y=286 width=21 height=55 xoffset=2 yoffset=0 xadvance=23 page=0 chnl=0
char id=201 x=310 y=286 width=21 height=55 xoffset=2 yoffset=0 xadvance=23 page=0 chnl=0
char id=202 x=331 y=286 width=21 height=55 xoffset=2 yoffset=0 xadvance=23 page=0 chnl=0
char id=203 x=352 y=286 width=21 height=55 xoffset=2 yoffset=0 xadvance=23 page=0 chnl=0
char id=204 x=373 y=286 width=13 height=55 xoffset=-1 yoffset=0 xadvance=12 page=0 chnl=0
char id=205 x=386 y=286 width=15 height=55 xoffset=0 yoffset=0 xadvance=12 page=0 chnl=0
char id=206 x=401 y=286 width=17 height=55 xoffset=-2 yoffset=0 xadvance=12 page=0 chnl=0
char id=207 x=418 y=286 width=17 height=55 xoffset=-2 yoffset=0 xadvance=12 page=0 chnl=0
char id=208 x=435 y=286 width=29 height=55 xoffset=1 yoffset=0 xadvance=30 page=0 chnl=0
char id=209 x=464 y=286 width=27 height=55 xoffset=2 yoffset=0 xadvance=30 page=0 chnl=0
char id=210 x=0 y=341 width=26 height=55 xoffset=2 yoffset=0 xadvance=28 page=0 chnl=0
char id=211 x=26 y=341 width=26 height=55 xoffset=2 yoffset=0 xadvance=28 page=0 chnl=0
char id=212 x=52 y=341 width=26 height=55 xoffset=2 yoffset=0 xadvance=28 page=0 chnl=0
char id=213 x=78 y=341 width=26 height=55 xoffset=2 yoffset=0 xadvance=28 page=0 chnl=0
char id=214 x=104 y=341 width=26 height=55 xoffset=2 yoffset=0 xadvance=28 page=0 chnl=0
char id=215 x=130 y=341 width=18 height=55 xoffset=2 yoffset=0 xadvance=21 page=0 chnl=0
char id=216 x=148 y=341 width=26 height=55 xoffset=2 yoffset=0 xadvance=28 page=0 chnl=0
char id=217 x=174 y=341 width=26 height=55 xoffset=2 yoffset=0 xadvance=29 page=0 chnl=0
char id=218 x=200 y=341 width=26 height=55 xoffset=2 yoffset=0 xadvance=29 page=0 chnl=0
char id=219 x=226 y=341 width=26 height=55 xoffset=2 yoffset=0 xadvance=29 page=0 chnl=0
char id=220 x=252 y=341 width=26 height=55 xoffset=2 yoffset=0 xadvance=29 page=0 chnl=0
char id=221 x=278 y=341 width=29 height=55 xoffset=0 yoffset=0 xadvance=28 page=0 chnl=0
char id=222 x=307 y=341 width=20 height=55 xoffset=2 yoffset=0 xadvance=22 page=0 chnl=0
char id=223 x=327 y=341 width=25 height=55 xoffset=1 yoffset=0 xadvance=26 page=0 chnl=0
char id=224 x=352 y=341 width=24 height=55 xoffset=1 yoffset=0 xadvance=25 page=0 chnl=0
char id=225 x=376 y=341 width=24 height=55 xoffset=1 yoffset=0 xadvance=25 page=0 chnl=0
char id=226 x=400 y=341 width=24 height=55 xoffset=1 yoffset=0 xadvance=25 page=0 chnl=0
char id=227 x=424 y=341 width=24 height=55 xoffset=1 yoffset=0 xadvance=25 page=0 chnl=0
char id=228 x=448 y=341 width=24 height=55 xoffset=1 yoffset=0 xadvance=25 page=0 chnl=0
char id=229 x=472 y=341 width=24 height=55 xoffset=1 yoffset=0 xadvance=25 page=0 chnl=0
char id=230 x=0 y=396 width=37 height=55 xoffset=1 yoffset=0 xadvance=38 page=0 chnl=0
char id=231 x=37 y=396 width=23 height=55 xoffset=1 yoffset=0 xadvance=24 page=0 chnl=0
char id=232 x=60 y=396 width=23 height=55 xoffset=1 yoffset=0 xadvance=24 page=0 chnl=0
char id=233 x=83 y=396 width=23 height=55 xoffset=1 yoffset=0 xadvance=24 page=0 chnl=0
char id=234 x=106 y=396 width=23 height=55 xoffset=1 yoffset=0 xadvance=24 page=0 chnl=0
char id=235 x=129 y=396 width=23 height=55 xoffset=1 yoffset=0 xadvance=24 page=0 chnl=0
char id=236 x=152 y=396 width=14 height=55 xoffset=-2 yoffset=0 xadvance=11 page=0 chnl=0
char id=237 x=166 y=396 width=14 height=55 xoffset=2 yoffset=0 xadvance=11 page=0 chnl=0
char id=238 x=180 y=396 width=16 height=55 xoffset=-2 yoffset=0 xadvance=11 page=0 chnl=0
char id=239 x=196 y=396 width=16 height=55 xoffset=-2 yoffset=0 xadvance=11 page=0 chnl=0
char id=240 x=212 y=396 width=25 height=55 xoffset=2 yoffset=0 xadvance=28 page=0 chnl=0
char id=241 x=237 y=396 width=22 height=55 xoffset=2 yoffset=0 xadvance=25 page=0 chnl=0
char id=242 x=259 y=396 width=23 height=55 xoffset=1 yoffset=0 xadvance=24 page=0 chnl=0
char id=243 x=282 y=396 width=23 height=55 xoffset=1 yoffset=0 xadvance=24 page=0 chnl=0
char id=244 x=305 y=396 width=23 height=55 xoffset=1 yoffset=0 xadvance=24 page=0 chnl=0
char id=245 x=328 y=396 width=23 height=55 xoffset=1 yoffset=0 xadvance=24 page=0 chnl=0
char id=246 x=351 y=396 width=23 height=55 xoffset=1 yoffset=0 xadvance=24 page=0 chnl=0
char id=247 x=374 y=396 width=15 height=55 xoffset=2 yoffset=0 xadvance=18 page=0 chnl=0
char id=248 x=389 y=396 width=23 height=55 xoffset=1 yoffset=0 xadvance=24 page=0 chnl=0
char id=249 x=412 y=396 width=22 height=55 xoffset=2 yoffset=0 xadvance=24 page=0 chnl=0
char id=250 x=434 y=396 width=22 height=55 xoffset=2 yoffset=0 xadvance=24 page=0 chnl=0
char id=251 x=456 y=396 width=22 height=55 xoffset=2 yoffset=0 xadvance=24 page=0 chnl=0
char id=252 x=478 y=396 width=22 height=55 xoffset=2 yoffset=0 xadvance=24 page=0 chnl=0
char id=253 x=0 y=451 width=24 height=55 xoffset=0 yoffset=0 xadvance=23 page=0 chnl=0
char id=254 x=24 y=451 width=22 height=55 xoffset=2 yoffset=0 xadvance=23 page=0 chnl=0
char id=255 x=46 y=451 width=24 height=55 xoffset=0 yoffset=0 xadvance=23 page=0 chnl=0
char id=9 x=0 y=46 width=6 height=220 xoffset=0 yoffset=0 xadvance=-1 page=0 chnl=0
char id=10 x=6 y=46 width=6 height=220 xoffset=0 yoffset=0 xadvance=-1 page=0 chnl=0
char id=13 x=12 y=46 width=6 height=220 xoffset=0 yoffset=0 xadvance=-1 page=0 chnl=0
char id=32 x=18 y=46 width=6 height=220 xoffset=0 yoffset=0 xadvance=59 page=0 chnl=0
char id=33 x=24 y=46 width=40 height=220 xoffset=8 yoffset=0 xadvance=49 page=0 chnl=0
char id=34 x=64 y=46 width=62 height=220 xoffset=8 yoffset=0 xadvance=71 page=0 chnl=0
char id=35 x=126 y=46 width=95 height=220 xoffset=3 yoffset=0 xadvance=95 page=0 chnl=0
char id=36 x=221 y=46 width=84 height=220 xoffset=4 yoffset=0 xadvance=86 page=0 chnl=0
char id=37 x=305 y=46 width=148 height=220 xoffset=6 yoffset=0 xadvance=153 page=0 chnl=0
char id=38 x=453 y=46 width=127 height=220 xoffset=6 yoffset=0 xadvance=131 page=0 chnl=0
char id=39 x=580 y=46 width=31 height=220 xoffset=8 yoffset=0 xadvance=39 page=0 chnl=0
char id=40 x=611 y=46 width=44 height=220 xoffset=4 yoffset=0 xadvance=44 page=0 chnl=0
char id=41 x=655 y=46 width=44 height=220 xoffset=4 yoffset=0 xadvance=44 page=0 chnl=0
char id=42 x=699 y=46 width=71 height=220 xoffset=4 yoffset=0 xadvance=71 page=0 chnl=0
char id=43 x=770 y=46 width=86 height=220 xoffset=3 yoffset=0 xadvance=85 page=0 chnl=0
char id=44 x=856 y=46 width=38 height=220 xoffset=7 yoffset=0 xadvance=43 page=0 chnl=0
char id=45 x=894 y=46 width=65 height=220 xoffset=8 yoffset=0 xadvance=75 page=0 chnl=0
char id=46 x=959 y=46 width=39 height=220 xoffset=8 yoffset=0 xadvance=48 page=0 chnl=0
char id=47 x=998 y=46 width=102 height=220 xoffset=1 yoffset=0 xadvance=97 page=0 chnl=0
char id=48 x=1100 y=46 width=107 height=220 xoffset=8 yoffset=0 xadvance=115 page=0 chnl=0
char id=49 x=1207 y=46 width=61 height=220 xoffset=2 yoffset=0 xadvance=64 page=0 chnl=0
char id=50 x=1268 y=46 width=104 height=220 xoffset=6 yoffset=0 xadvance=111 page=0 chnl=0
char id=51 x=1372 y=46 width=100 height=220 xoffset=6 yoffset=0 xadvance=106 page=0 chnl=0
char id=52 x=1472 y=46 width=111 height=220 xoffset=3 yoffset=0 xadvance=109 page=0 chnl=0
char id=53 x=1583 y=46 width=98 height=220 xoffset=7 yoffset=0 xadvance=105 page=0 chnl=0
char id=54 x=1681 y=46 width=104 height=220 xoffset=8 yoffset=0 xadvance=112 page=0 chnl=0
char id=55 x=1785 y=46 width=92 height=220 xoffset=6 yoffset=0 xadvance=93 page=0 chnl=0
char id=56 x=1877 y=46 width=100 height=220 xoffset=7 yoffset=0 xadvance=107 page=0 chnl=0
char id=57 x=0 y=266 width=105 height=220 xoffset=7 yoffset=0 xadvance=112 page=0 chnl=0
char id=58 x=105 y=266 width=36 height=220 xoffset=8 yoffset=0 xadvance=43 page=0 chnl=0
char id=59 x=141 y=266 width=37 height=220 xoffset=7 yoffset=0 xadvance=43 page=0 chnl=0
char id=60 x=178 y=266 width=59 height=220 xoffset=1 yoffset=0 xadvance=58 page=0 chnl=0
char id=61 x=237 y=266 width=92 height=220 xoffset=8 yoffset=0 xadvance=97 page=0 chnl=0
char id=62 x=329 y=266 width=59 height=220 xoffset=8 yoffset=0 xadvance=61 page=0 chnl=0
char id=63 x=388 y=266 width=96 height=220 xoffset=4 yoffset=0 xadvance=98 page=0 chnl=0
char id=64 x=484 y=266 width=132 height=220 xoffset=4 yoffset=0 xadvance=136 page=0 chnl=0
char id=65 x=616 y=266 width=120 height=220 xoffset=1 yoffset=0 xadvance=114 page=0 chnl=0
char id=66 x=736 y=266 width=107 height=220 xoffset=8 yoffset=0 xadvance=115 page=0 chnl=0
char id=67 x=843 y=266 width=107 height=220 xoffset=8 yoffset=0 xadvance=115 page=0 chnl=0
char id=68 x=950 y=266 width=107 height=220 xoffset=8 yoffset=0 xadvance=115 page=0 chnl=0
char id=69 x=1057 y=266 width=87 height=220 xoffset=8 yoffset=0 xadvance=93 page=0 chnl=0
char id=70 x=1144 y=266 width=87 height=220 xoffset=8 yoffset=0 xadvance=91 page=0 chnl=0
char id=71 x=1231 y=266 width=105 height=220 xoffset=8 yoffset=0 xadvance=114 page=0 chnl=0
char id=72 x=1336 y=266 width=105 height=220 xoffset=8 yoffset=0 xadvance=114 page=0 chnl=0
char id=73 x=1441 y=266 width=41 height=220 xoffset=8 yoffset=0 xadvance=50 page=0 chnl=0
char id=74 x=1482 y=266 width=63 height=220 xoffset=3 yoffset=0 xadvance=67 page=0 chnl=0
char id=75 x=1545 y=266 width=114 height=220 xoffset=8 yoffset=0 xadvance=118 page=0 chnl=0
char id=76 x=1659 y=266 width=83 height=220 xoffset=8 yoffset=0 xadvance=87 page=0 chnl=0
char id=77 x=1742 y=266 width=142 height=220 xoffset=8 yoffset=0 xadvance=151 page=0 chnl=0
char id=78 x=1884 y=266 width=111 height=220 xoffset=8 yoffset=0 xadvance=121 page=0 chnl=0
char id=79 x=0 y=486 width=107 height=220 xoffset=8 yoffset=0 xadvance=115 page=0 chnl=0
char id=80 x=107 y=486 width=105 height=220 xoffset=8 yoffset=0 xadvance=108 page=0 chnl=0
char id=81 x=212 y=486 width=107 height=220 xoffset=6 yoffset=0 xadvance=113 page=0 chnl=0
char id=82 x=319 y=486 width=107 height=220 xoffset=8 yoffset=0 xadvance=113 page=0 chnl=0
char id=83 x=426 y=486 width=112 height=220 xoffset=6 yoffset=0 xadvance=117 page=0 chnl=0
char id=84 x=538 y=486 width=107 height=220 xoffset=3 yoffset=0 xadvance=105 page=0 chnl=0
char id=85 x=645 y=486 width=107 height=220 xoffset=8 yoffset=0 xadvance=116 page=0 chnl=0
char id=86 x=752 y=486 width=117 height=220 xoffset=1 yoffset=0 xadvance=111 page=0 chnl=0
char id=87 x=869 y=486 width=169 height=220 xoffset=1 yoffset=0 xadvance=165 page=0 chnl=0
char id=88 x=1038 y=486 width=123 height=220 xoffset=3 yoffset=0 xadvance=124 page=0 chnl=0
char id=89 x=1161 y=486 width=119 height=220 xoffset=2 yoffset=0 xadvance=115 page=0 chnl=0
char id=90 x=1280 y=486 width=101 height=220 xoffset=5 yoffset=0 xadvance=104 page=0 chnl=0
char id=91 x=1381 y=486 width=37 height=220 xoffset=8 yoffset=0 xadvance=44 page=0 chnl=0
char id=92 x=1418 y=486 width=102 height=220 xoffset=1 yoffset=0 xadvance=97 page=0 chnl=0
char id=93 x=1520 y=486 width=37 height=220 xoffset=8 yoffset=0 xadvance=44 page=0 chnl=0
char id=94 x=1557 y=486 width=95 height=220 xoffset=4 yoffset=0 xadvance=96 page=0 chnl=0
char id=95 x=1652 y=486 width=125 height=220 xoffset=-1 yoffset=0 xadvance=115 page=0 chnl=0
char id=96 x=1777 y=486 width=57 height=220 xoffset=-2 yoffset=0 xadvance=56 page=0 chnl=0
char id=97 x=1834 y=486 width=98 height=220 xoffset=7 yoffset=0 xadvance=103 page=0 chnl=0
char id=98 x=1932 y=486 width=91 height=220 xoffset=8 yoffset=0 xadvance=96 page=0 chnl=0
char id=99 x=0 y=706 width=91 height=220 xoffset=7 yoffset=0 xadvance=98 page=0 chnl=0
char id=100 x=91 y=706 width=90 height=220 xoffset=4 yoffset=0 xadvance=96 page=0 chnl=0
char id=101 x=181 y=706 width=91 height=220 xoffset=7 yoffset=0 xadvance=98 page=0 chnl=0
char id=102 x=272 y=706 width=70 height=220 xoffset=1 yoffset=0 xadvance=66 page=0 chnl=0
char id=103 x=342 y=706 width=89 height=220 xoffset=6 yoffset=0 xadvance=96 page=0 chnl=0
char id=104 x=431 y=706 width=91 height=220 xoffset=8 yoffset=0 xadvance=96 page=0 chnl=0
char id=105 x=522 y=706 width=37 height=220 xoffset=8 yoffset=0 xadvance=46 page=0 chnl=0
char id=106 x=559 y=706 width=57 height=220 xoffset=-14 yoffset=0 xadvance=44 page=0 chnl=0
char id=107 x=616 y=706 width=98 height=220 xoffset=8 yoffset=0 xadvance=101 page=0 chnl=0
char id=108 x=714 y=706 width=37 height=220 xoffset=8 yoffset=0 xadvance=46 page=0 chnl=0
char id=109 x=751 y=706 width=138 height=220 xoffset=8 yoffset=0 xadvance=147 page=0 chnl=0
char id=110 x=889 y=706 width=91 height=220 xoffset=8 yoffset=0 xadvance=100 page=0 chnl=0
char id=111 x=980 y=706 width=91 height=220 xoffset=7 yoffset=0 xadvance=99 page=0 chnl=0
char id=112 x=1071 y=706 width=91 height=220 xoffset=8 yoffset=0 xadvance=96 page=0 chnl=0
char id=113 x=1162 y=706 width=90 height=220 xoffset=5 yoffset=0 xadvance=96 page=0 chnl=0
char id=114 x=1252 y=706 width=65 height=220 xoffset=8 yoffset=0 xadvance=69 page=0 chnl=0
char id=115 x=1317 y=706 width=91 height=220 xoffset=6 yoffset=0 xadvance=96 page=0 chnl=0
char id=116 x=1408 y=706 width=73 height=220 xoffset=1 yoffset=0 xadvance=68 page=0 chnl=0
char id=117 x=1481 y=706 width=91 height=220 xoffset=8 yoffset=0 xadvance=100 page=0 chnl=0
char id=118 x=1572 y=706 width=99 height=220 xoffset=1 yoffset=0 xadvance=95 page=0 chnl=0
char id=119 x=1671 y=706 width=146 height=220 xoffset=3 yoffset=0 xadvance=144 page=0 chnl=0
char id=120 x=1817 y=706 width=102 height=220 xoffset=4 yoffset=0 xadvance=103 page=0 chnl=0
char id=121 x=1919 y=706 width=99 height=220 xoffset=2 yoffset=0 xadvance=96 page=0 chnl=0
char id=122 x=0 y=926 width=84 height=220 xoffset=5 yoffset=0 xadvance=86 page=0 chnl=0
char id=123 x=84 y=926 width=67 height=220 xoffset=3 yoffset=0 xadvance=68 page=0 chnl=0
char id=124 x=151 y=926 width=27 height=220 xoffset=8 yoffset=0 xadvance=36 page=0 chnl=0
char id=125 x=178 y=926 width=67 height=220 xoffset=6 yoffset=0 xadvance=68 page=0 chnl=0
char id=126 x=245 y=926 width=93 height=220 xoffset=12 yoffset=0 xadvance=110 page=0 chnl=0
char id=161 x=338 y=926 width=40 height=220 xoffset=8 yoffset=0 xadvance=49 page=0 chnl=0
char id=162 x=378 y=926 width=82 height=220 xoffset=8 yoffset=0 xadvance=90 page=0 chnl=0
char id=163 x=460 y=926 width=93 height=220 xoffset=5 yoffset=0 xadvance=95 page=0 chnl=0
char id=164 x=553 y=926 width=80 height=220 xoffset=12 yoffset=0 xadvance=97 page=0 chnl=0
char id=165 x=633 y=926 width=119 height=220 xoffset=4 yoffset=0 xadvance=120 page=0 chnl=0
char id=166 x=752 y=926 width=27 height=220 xoffset=8 yoffset=0 xadvance=35 page=0 chnl=0
char id=167 x=779 y=926 width=95 height=220 xoffset=8 yoffset=0 xadvance=100 page=0 chnl=0
char id=168 x=874 y=926 width=68 height=220 xoffset=8 yoffset=0 xadvance=78 page=0 chnl=0
char id=169 x=942 y=926 width=153 height=220 xoffset=7 yoffset=0 xadvance=157 page=0 chnl=0
char id=170 x=1095 y=926 width=68 height=220 xoffset=7 yoffset=0 xadvance=75 page=0 chnl=0
char id=171 x=1163 y=926 width=77 height=220 xoffset=8 yoffset=0 xadvance=88 page=0 chnl=0
char id=172 x=1240 y=926 width=102 height=220 xoffset=8 yoffset=0 xadvance=115 page=0 chnl=0
char id=174 x=1342 y=926 width=93 height=220 xoffset=5 yoffset=0 xadvance=95 page=0 chnl=0
char id=175 x=1435 y=926 width=65 height=220 xoffset=8 yoffset=0 xadvance=75 page=0 chnl=0
char id=176 x=1500 y=926 width=70 height=220 xoffset=6 yoffset=0 xadvance=73 page=0 chnl=0
char id=177 x=1570 y=926 width=93 height=220 xoffset=12 yoffset=0 xadvance=110 page=0 chnl=0
char id=178 x=1663 y=926 width=55 height=220 xoffset=8 yoffset=0 xadvance=63 page=0 chnl=0
char id=179 x=1718 y=926 width=53 height=220 xoffset=8 yoffset=0 xadvance=60 page=0 chnl=0
char id=180 x=1771 y=926 width=60 height=220 xoffset=9 yoffset=0 xadvance=61 page=0 chnl=0
char id=182 x=1831 y=926 width=73 height=220 xoffset=14 yoffset=0 xadvance=92 page=0 chnl=0
char id=183 x=1904 y=926 width=39 height=220 xoffset=8 yoffset=0 xadvance=48 page=0 chnl=0
char id=184 x=1943 y=926 width=44 height=220 xoffset=8 yoffset=0 xadvance=48 page=0 chnl=0
char id=185 x=1987 y=926 width=33 height=220 xoffset=9 yoffset=0 xadvance=46 page=0 chnl=0
char id=186 x=0 y=1146 width=69 height=220 xoffset=7 yoffset=0 xadvance=78 page=0 chnl=0
char id=187 x=69 y=1146 width=77 height=220 xoffset=8 yoffset=0 xadvance=88 page=0 chnl=0
char id=188 x=146 y=1146 width=128 height=220 xoffset=10 yoffset=0 xadvance=139 page=0 chnl=0
char id=189 x=274 y=1146 width=126 height=220 xoffset=9 yoffset=0 xadvance=140 page=0 chnl=0
char id=190 x=400 y=1146 width=135 height=220 xoffset=3 yoffset=0 xadvance=138 page=0 chnl=0
char id=191 x=535 y=1146 width=97 height=220 xoffset=4 yoffset=0 xadvance=98 page=0 chnl=0
char id=192 x=632 y=1146 width=120 height=220 xoffset=1 yoffset=0 xadvance=114 page=0 chnl=0
char id=193 x=752 y=1146 width=120 height=220 xoffset=1 yoffset=0 xadvance=114 page=0 chnl=0
char id=194 x=872 y=1146 width=120 height=220 xoffset=1 yoffset=0 xadvance=114 page=0 chnl=0
char id=195 x=992 y=1146 width=120 height=220 xoffset=1 yoffset=0 xadvance=114 page=0 chnl=0
char id=196 x=1112 y=1146 width=120 height=220 xoffset=1 yoffset=0 xadvance=114 page=0 chnl=0
char id=197 x=1232 y=1146 width=120 height=220 xoffset=1 yoffset=0 xadvance=114 page=0 chnl=0
char id=198 x=1352 y=1146 width=131 height=220 xoffset=1 yoffset=0 xadvance=133 page=0 chnl=0
char id=199 x=1483 y=1146 width=107 height=220 xoffset=8 yoffset=0 xadvance=115 page=0 chnl=0
char id=200 x=1590 y=1146 width=87 height=220 xoffset=8 yoffset=0 xadvance=93 page=0 chnl=0
char id=201 x=1677 y=1146 width=87 height=220 xoffset=8 yoffset=0 xadvance=93 page=0 chnl=0
char id=202 x=1764 y=1146 width=87 height=220 xoffset=8 yoffset=0 xadvance=93 page=0 chnl=0
char id=203 x=1851 y=1146 width=87 height=220 xoffset=8 yoffset=0 xadvance=93 page=0 chnl=0
char id=204 x=1938 y=1146 width=56 height=220 xoffset=-3 yoffset=0 xadvance=50 page=0 chnl=0
char id=205 x=0 y=1366 width=60 height=220 xoffset=2 yoffset=0 xadvance=50 page=0 chnl=0
char id=206 x=60 y=1366 width=69 height=220 xoffset=-6 yoffset=0 xadvance=50 page=0 chnl=0
char id=207 x=129 y=1366 width=68 height=220 xoffset=-5 yoffset=0 xadvance=50 page=0 chnl=0
char id=208 x=197 y=1366 width=117 height=220 xoffset=5 yoffset=0 xadvance=123 page=0 chnl=0
char id=209 x=314 y=1366 width=111 height=220 xoffset=8 yoffset=0 xadvance=121 page=0 chnl=0
char id=210 x=425 y=1366 width=107 height=220 xoffset=8 yoffset=0 xadvance=115 page=0 chnl=0
char id=211 x=532 y=1366 width=107 height=220 xoffset=8 yoffset=0 xadvance=115 page=0 chnl=0
char id=212 x=639 y=1366 width=107 height=220 xoffset=8 yoffset=0 xadvance=115 page=0 chnl=0
char id=213 x=746 y=1366 width=107 height=220 xoffset=8 yoffset=0 xadvance=115 page=0 chnl=0
char id=214 x=853 y=1366 width=107 height=220 xoffset=8 yoffset=0 xadvance=115 page=0 chnl=0
char id=215 x=960 y=1366 width=77 height=220 xoffset=8 yoffset=0 xadvance=85 page=0 chnl=0
char id=216 x=1037 y=1366 width=107 height=220 xoffset=8 yoffset=0 xadvance=115 page=0 chnl=0
char id=217 x=1144 y=1366 width=107 height=220 xoffset=8 yoffset=0 xadvance=116 page=0 chnl=0
char id=218 x=1251 y=1366 width=107 height=220 xoffset=8 yoffset=0 xadvance=116 page=0 chnl=0
char id=219 x=1358 y=1366 width=107 height=220 xoffset=8 yoffset=0 xadvance=116 page=0 chnl=0
char id=220 x=1465 y=1366 width=107 height=220 xoffset=8 yoffset=0 xadvance=116 page=0 chnl=0
char id=221 x=1572 y=1366 width=119 height=220 xoffset=2 yoffset=0 xadvance=115 page=0 chnl=0
char id=222 x=1691 y=1366 width=84 height=220 xoffset=8 yoffset=0 xadvance=92 page=0 chnl=0
char id=223 x=1775 y=1366 width=99 height=220 xoffset=7 yoffset=0 xadvance=106 page=0 chnl=0
char id=224 x=1874 y=1366 width=98 height=220 xoffset=7 yoffset=0 xadvance=103 page=0 chnl=0
char id=225 x=0 y=1586 width=98 height=220 xoffset=7 yoffset=0 xadvance=103 page=0 chnl=0
char id=226 x=98 y=1586 width=98 height=220 xoffset=7 yoffset=0 xadvance=103 page=0 chnl=0
char id=227 x=196 y=1586 width=98 height=220 xoffset=7 yoffset=0 xadvance=103 page=0 chnl=0
char id=228 x=294 y=1586 width=98 height=220 xoffset=7 yoffset=0 xadvance=103 page=0 chnl=0
char id=229 x=392 y=1586 width=98 height=220 xoffset=7 yoffset=0 xadvance=103 page=0 chnl=0
char id=230 x=490 y=1586 width=148 height=220 xoffset=7 yoffset=0 xadvance=155 page=0 chnl=0
char id=231 x=638 y=1586 width=91 height=220 xoffset=7 yoffset=0 xadvance=98 page=0 chnl=0
char id=232 x=729 y=1586 width=91 height=220 xoffset=7 yoffset=0 xadvance=98 page=0 chnl=0
char id=233 x=820 y=1586 width=91 height=220 xoffset=7 yoffset=0 xadvance=98 page=0 chnl=0
char id=234 x=911 y=1586 width=91 height=220 xoffset=7 yoffset=0 xadvance=98 page=0 chnl=0
char id=235 x=1002 y=1586 width=91 height=220 xoffset=7 yoffset=0 xadvance=98 page=0 chnl=0
char id=236 x=1093 y=1586 width=56 height=220 xoffset=-5 yoffset=0 xadvance=46 page=0 chnl=0
char id=237 x=1149 y=1586 width=61 height=220 xoffset=8 yoffset=0 xadvance=46 page=0 chnl=0
char id=238 x=1210 y=1586 width=69 height=220 xoffset=-8 yoffset=0 xadvance=46 page=0 chnl=0
char id=239 x=1279 y=1586 width=67 height=220 xoffset=-7 yoffset=0 xadvance=46 page=0 chnl=0
char id=240 x=1346 y=1586 width=105 height=220 xoffset=8 yoffset=0 xadvance=112 page=0 chnl=0
char id=241 x=1451 y=1586 width=91 height=220 xoffset=8 yoffset=0 xadvance=100 page=0 chnl=0
char id=242 x=1542 y=1586 width=91 height=220 xoffset=7 yoffset=0 xadvance=99 page=0 chnl=0
char id=243 x=1633 y=1586 width=91 height=220 xoffset=7 yoffset=0 xadvance=99 page=0 chnl=0
char id=244 x=1724 y=1586 width=91 height=220 xoffset=7 yoffset=0 xadvance=99 page=0 chnl=0
char id=245 x=1815 y=1586 width=91 height=220 xoffset=7 yoffset=0 xadvance=99 page=0 chnl=0
char id=246 x=1906 y=1586 width=91 height=220 xoffset=7 yoffset=0 xadvance=99 page=0 chnl=0
char id=247 x=0 y=1806 width=65 height=220 xoffset=8 yoffset=0 xadvance=75 page=0 chnl=0
char id=248 x=65 y=1806 width=91 height=220 xoffset=7 yoffset=0 xadvance=99 page=0 chnl=0
char id=249 x=156 y=1806 width=91 height=220 xoffset=8 yoffset=0 xadvance=100 page=0 chnl=0
char id=250 x=247 y=1806 width=91 height=220 xoffset=8 yoffset=0 xadvance=100 page=0 chnl=0
char id=251 x=338 y=1806 width=91 height=220 xoffset=8 yoffset=0 xadvance=100 page=0 chnl=0
char id=252 x=429 y=1806 width=91 height=220 xoffset=8 yoffset=0 xadvance=100 page=0 chnl=0
char id=253 x=520 y=1806 width=99 height=220 xoffset=2 yoffset=0 xadvance=96 page=0 chnl=0
char id=254 x=619 y=1806 width=91 height=220 xoffset=8 yoffset=0 xadvance=96 page=0 chnl=0
char id=255 x=710 y=1806 width=99 height=220 xoffset=2 yoffset=0 xadvance=96 page=0 chnl=0

Binary file not shown.

Before

Width:  |  Height:  |  Size: 55 KiB

After

Width:  |  Height:  |  Size: 293 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 894 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 866 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 857 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 842 KiB

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,582 @@
# 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

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,275 @@
# 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

View File

@@ -1,5 +1,7 @@
package pp.mdga.notification;
import pp.mdga.game.BonusCard;
import java.util.UUID;
/**
@@ -8,12 +10,14 @@
public class AcquireCardNotification extends Notification{
private UUID cardId;
private BonusCard bonusCard;
/**
* Constructor.
* @param cardId The id of the card that was acquired.
*/
public AcquireCardNotification(UUID cardId) {
public AcquireCardNotification(BonusCard bonusCard, UUID cardId) {
this.bonusCard = bonusCard;
this.cardId = cardId;
}
@@ -24,4 +28,8 @@ public AcquireCardNotification(UUID cardId) {
public UUID getCardId() {
return cardId;
}
public BonusCard getBonusCard() {
return bonusCard;
}
}

View File

@@ -1,64 +0,0 @@
package pp.mdga.notification;
import pp.mdga.game.Color;
import java.util.UUID;
public class MoveThrowPieceNotification extends Notification{
private UUID pieceId1;
private UUID pieceId2;
private int nodeIndex;
private Color colorPiece2;
/**
* This constructor is used to create a new MoveThrowPieceNotification
*
* @param pieceId1 the pieceId1
* @param pieceId2 the pieceId2
* @param nodeIndex the nodeIndex
* @param colorPiece2 the color
*/
public MoveThrowPieceNotification(UUID pieceId1, UUID pieceId2, int nodeIndex, Color colorPiece2) {
this.pieceId1 = pieceId1;
this.pieceId2 = pieceId2;
this.nodeIndex = nodeIndex;
this.colorPiece2 = colorPiece2;
}
/**
* This method returns the pieceId1
*
* @return the pieceId1
*/
public UUID getPieceId1() {
return pieceId1;
}
/**
* This method returns the pieceId2
*
* @return the pieceId2
*/
public UUID getPieceId2() {
return pieceId2;
}
/**
* This method returns the nodeIndex
*
* @return the nodeIndex
*/
public int getNodeIndex() {
return nodeIndex;
}
/**
* This method returns the color
*
* @return the color
*/
public Color getColor() {
return colorPiece2;
}
}

View File

@@ -1,37 +0,0 @@
package pp.mdga.notification;
import pp.mdga.game.Color;
import java.util.UUID;
/**
* Notification that a piece is in the game
*/
public class PieceInGameNotification extends Notification{
private Color color;
private UUID id;
/**
* Constructor
* @param color the color of the piece
* @param id the id of the piece
*/
PieceInGameNotification(Color color, UUID id) {
this.color = color;
this.id = id;
}
/**
* @return the color of the piece
*/
public Color getColor() {
return null;
}
/**
* @return the id of the piece
*/
public UUID getId() {
return null;
}
}

View File

@@ -0,0 +1,26 @@
package pp.mdga.notification;
import pp.mdga.game.Color;
import java.util.UUID;
public class ThrowPieceNotification extends Notification{
private UUID pieceId;
/**
* This constructor is used to create a new ThrowPieceNotification
*
* @param pieceId1 the pieceId1
* @param pieceId2 the pieceId2
* @param nodeIndex the nodeIndex
* @param colorPiece2 the color
*/
public ThrowPieceNotification(UUID pieceId) {
this.pieceId = pieceId;
}
public UUID getPieceId() {
return pieceId;
}
}