diff --git a/JavaFX.iml b/JavaFX.iml
index ec5c9ee..e9d74f2 100644
--- a/JavaFX.iml
+++ b/JavaFX.iml
@@ -32,26 +32,5 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/README.md b/README.md
index 4a9a485..c337eb0 100644
--- a/README.md
+++ b/README.md
@@ -1,2 +1,11 @@
# Leendert
Het spectaculaire tuinavontuur
+
+## Gemaakt door
+* Mette Lejeune (afbeeldingen)
+* Julius de Jeu (programmeren)
+* Jelle Miltenburg (muziek)
+* Marleen Peeters (afbeeldingen)
+* Jesper de Wilde (programmeren en afbeeldingen)
+* Nathan van der Kamp (programmeren)
+
diff --git a/pom.xml b/pom.xml
index 2745552..672faeb 100644
--- a/pom.xml
+++ b/pom.xml
@@ -1,6 +1,6 @@
-4.0.0
@@ -13,12 +13,41 @@
org.apache.maven.pluginsmaven-compiler-plugin
- RELEASE
+ 3.6.11.8
+
+ org.apache.maven.plugins
+ maven-assembly-plugin
+ 2.4.1
+
+
+
+ jar-with-dependencies
+
+
+
+
+ nl.minkema.leendert.Main
+
+
+
+
+
+
+ make-assembly
+
+ package
+
+ single
+
+
+
+
+
diff --git a/src/main/java/nl/minkema/leendert/Dice.java b/src/main/java/nl/minkema/leendert/Dice.java
index 436e5af..1a1171b 100644
--- a/src/main/java/nl/minkema/leendert/Dice.java
+++ b/src/main/java/nl/minkema/leendert/Dice.java
@@ -25,11 +25,19 @@ public class Dice extends Group {
private Group dotPattern6 = new Group();
private Group klaver = new Group();
+ /**
+ * Dit is de constructor van onze dobbelsteen
+ * De dobbelsteen is helemaal gemaakt met basisvormen door Nathan, daarna een beetje aangepast door Julius
+ *
+ * @param x de x-coördinaat van de dobbelsteen
+ * @param y de y-coördinaat van de dobbelsteen
+ */
public Dice(int x, int y) {
this.r = new Random(System.currentTimeMillis());
this.setTranslateX(x);
this.setTranslateY(y);
+
Ellipse mainEll = new Ellipse(50, 50, 40, 50);
mainEll.setFill(Color.DARKRED);
Ellipse headEll1 = new Ellipse(34, 11, 6, 4);
@@ -136,13 +144,21 @@ public class Dice extends Group {
roll();
}
+ /**
+ * @return Dit is de functie die het rollen van de dobbelsteen op zich neemt.
+ */
public int roll() {
+ //We willen een getal tussen 0 en 6
int roll = r.nextInt(6);
+ //We maken eerst de groep leeg
this.getChildren().clear();
+ //Als er 3 uit de roll komt, en we dus 4 zeggen, willen we een klavertje 4 laten zien
if (roll == 3) {
this.getChildren().add(klaver);
} else {
+ //Maar anders gaan we voor een lieveheersbeestje
this.getChildren().add(ladybah);
+ //Dit zijn alle afzonderlijke patronen
switch (roll) {
case 0:
this.getChildren().add(dotPattern1);
@@ -159,10 +175,12 @@ public class Dice extends Group {
case 5:
this.getChildren().add(dotPattern6);
break;
+ //Dit zou wel heel bijzonder zijn
default:
System.out.println("Error drawing die");
}
}
+ //En aan het eind nemen we de roll en tellen we er één bij op.
return roll + 1;
}
diff --git a/src/main/java/nl/minkema/leendert/Game.java b/src/main/java/nl/minkema/leendert/Game.java
index ab137cd..318eb72 100644
--- a/src/main/java/nl/minkema/leendert/Game.java
+++ b/src/main/java/nl/minkema/leendert/Game.java
@@ -5,11 +5,12 @@ import javafx.scene.control.Label;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.input.MouseEvent;
+import javafx.scene.layout.Background;
+import javafx.scene.layout.BackgroundFill;
import javafx.scene.layout.Pane;
import javafx.scene.media.Media;
import javafx.scene.media.MediaPlayer;
import javafx.scene.paint.Color;
-import javafx.scene.shape.Circle;
import javafx.scene.text.Text;
import java.util.ArrayList;
@@ -27,23 +28,31 @@ public class Game extends Pane {
public static int[][] locations;
public static ArrayList players = new ArrayList<>();
+ /**
+ * De constructor voor de game
+ */
public Game() {
+ //We willen dat de volgorde van de spelers willekeurig is.
Collections.shuffle(players);
- Image bord = new Image("/images/KLAAR.png");
+ //Dit is de achtergrond met het bord er op.
+ Image bord = new Image("/images/bord.png");
ImageView view = new ImageView(bord);
-
view.setPreserveRatio(true);
view.setFitHeight(800);
view.setX(0);
view.setY(0);
this.getChildren().add(view);
+ //Dit zorgt voor de nummers in de vakjes
for (int i = 0, locationsLength = locations.length; i < locationsLength; i++) {
int[] k = locations[i];
- getChildren().add(new Circle(k[0], k[1], 5, Color.RED));
- getChildren().add(new Text(k[0], k[1], String.valueOf(i)));
+ //getChildren().add(new Circle(k[0], k[1], 5, Color.RED));
+ Text text = new Text(k[0] - 5, k[1] - 10, String.valueOf(i));
+ text.setFill(Color.GREENYELLOW);
+ getChildren().add(text);
}
+ //Dit was om de locaties van de vakjes te bepalen.
this.setOnMouseClicked(new EventHandler() {
int i = 0;
@@ -52,12 +61,14 @@ public class Game extends Pane {
//System.out.printf("%d: %d,%d%n", i++, (int) event.getSceneX(), (int) event.getSceneY());
}
});
+ //Dit is de afbeelding van de speler die mag gooien
ImageView playerTurn = new ImageView();
playerTurn.setX(1000);
playerTurn.setY(50);
playerTurn.setPreserveRatio(true);
playerTurn.setFitHeight(400);
+ //Hier staat de naam van het karaker in.
Label l = new Label();
l.setTranslateX(965);
l.setTranslateY(370);
@@ -66,19 +77,31 @@ public class Game extends Pane {
this.getChildren().add(playerTurn);
this.getChildren().addAll(l);
+ //Dit is onze dobbelsteen
Dice dice = new Dice(1100, 700);
this.getChildren().add(dice);
+ //Dit is de knop van de dobbelsteen.
this.getChildren().add(Menu.createButton("Gooi", 1100, 650, e -> {
+ //We kijken wie de volgende speler is
Player p = players.get(Player.getNextActive());
+ //En rollen een dobbelsteen
int roll = dice.roll();
+ //Dan verplaatsen we de speler
p.move(roll);
+ //Als de speler 4 gooit mag hij/zij nog een keer
if (roll == 4) Player.four();
+ //We zoeken uit wie er hier na mag
int next = players.get(Player.getNextActive()).getCh();
+ //Zetten die afbeelding als de speler die mag gooien
playerTurn.setImage(Menu.images[next]);
+ //En doen hetzelfde met de naam van de speler
l.setText(Menu.names[next] + " is aan de beurt!");
+ //En zetten het weer terug naar de vorige speler
Player.four();
}));
- //this.setBackground(new Background(new BackgroundFill(Color.RED, null, null)));
+ //Dit is de achtergrond
+ this.setBackground(new Background(new BackgroundFill(Color.GREENYELLOW, null, null)));
+ //Dit zijn alle spelers
for (Player p : players) {
this.getChildren().add(p.getImageView());
}
@@ -86,6 +109,7 @@ public class Game extends Pane {
playerTurn.setImage(Menu.images[players.get(1).getCh()]);
l.setText(Menu.names[players.get(1).getCh()] + " is aan de beurt!");
+ //En hier is de achtergrondmuziek, die het soms wel en soms niet doet...
String loc = this.getClass().getResource("/music/game.mp3").toString();
Media music = new Media(loc);
MediaPlayer menuplayer = new MediaPlayer(music);
diff --git a/src/main/java/nl/minkema/leendert/Main.java b/src/main/java/nl/minkema/leendert/Main.java
index c3594b9..0deb89d 100644
--- a/src/main/java/nl/minkema/leendert/Main.java
+++ b/src/main/java/nl/minkema/leendert/Main.java
@@ -14,13 +14,10 @@ import java.util.Properties;
public class Main extends Application {
public static Scene scene;
- public static boolean memes = false;
public static void main(String[] args) throws Exception {
- for (String s : args) {
- if (s.equals("-memes")) memes = true;
- }
+ //Je kan properties best goed gebruiken om simpele lijsten in te laden
Properties properties = new Properties();
properties.load(Main.class.getResourceAsStream("/text/locations.properties"));
Game.locations = new int[properties.size()][2];
diff --git a/src/main/java/nl/minkema/leendert/Menu.java b/src/main/java/nl/minkema/leendert/Menu.java
index beb955b..a283a2d 100644
--- a/src/main/java/nl/minkema/leendert/Menu.java
+++ b/src/main/java/nl/minkema/leendert/Menu.java
@@ -37,32 +37,42 @@ public class Menu extends Group {
private ArrayList chosen = new ArrayList<>();
+
+ /**
+ * De constructor voor het menu
+ *
+ * @throws URISyntaxException als de achtergrondmuziek niet gevonden kan worden.
+ * @throws MalformedURLException gebeurt hopelijk niet...
+ */
public Menu() throws URISyntaxException, MalformedURLException {
ArrayList nodes = new ArrayList<>();
- Image bg = new Image(ModLoader.getFile("/images/background.png"));
+ //achtergrondafbeelding
+ Image bg = new Image("/images/background.png");
ImageView view = new ImageView(bg);
-
+ //zet de x en y naar de linker bovenhoek
view.setX(0);
view.setY(0);
+ //dit is om te zorgen dat de afbeelding past
view.setFitHeight(850);
view.setPreserveRatio(false);
view.setFitWidth(1250);
+ nodes.add(view);
+
+ //De achtergrondmuziek
String loc = this.getClass().getResource("/music/menu.mp4").toString();
- //loc = new File("menu.mp4").toURI().toURL().toString();
- //loc = ModLoader.getFile("/music/menu.mp4");
Media music = new Media(loc);
MediaPlayer menuplayer = new MediaPlayer(music);
menuplayer.setCycleCount(Integer.MAX_VALUE);
menuplayer.setVolume(0.6f);
+ //Dit deel is om te garanderen dat de muziek start, hoewel het soms toch niet werkt, iets met codecs enzo
menuplayer.setAutoPlay(true);
menuplayer.play();
menuplayer.play();
- nodes.add(view);
-
-
+ //De breedte van de afbeelding
int imagewidth = 100;
+ //Een array met speler afbeeldingen
images = new Image[]{
new Image("/svg/p1.svg", imagewidth, 0, true, false),
new Image("/svg/p2.svg", imagewidth, 0, true, false),
@@ -70,36 +80,50 @@ public class Menu extends Group {
new Image("/svg/p4.svg", imagewidth, 0, true, false),
new Image("/svg/p5.svg", imagewidth, 0, true, false)};
+ //De namen van de karakters
names = new String[]{"Paulus", "Pinkeltje", "Petunia", "Kwebbel", "Stuart"};
int x = 0, y = 0;
+ //Voor elke afbeelding wordt dit uitgevoerd
for (int i1 = 0; i1 < images.length; i1++) {
+ //We maken van de afbeelding een ImageView, zodat het zichtbaar gemaakt kan worden
Image i = images[i1];
ImageView iv = new ImageView(i);
iv.setX(750 + x);
iv.setY(400 + y);
+ //En geven het een tooltip met de naam van de Kabouter
Tooltip.install(iv, new Tooltip(names[i1]));
x += i.getRequestedWidth();
+ //Als we te ver gaan op de x as, gaan we door op een volgende regel
if (x > 200) {
y += 150;
x = -70;
}
final int ch = i1;
+ //Wat er gebeurt als je op een kabouter klikt
iv.setOnMouseClicked(e -> {
+ //Eerst controleren of het karakter al is gekozen.
if (chosen.contains(ch)) {
new Alert(Alert.AlertType.ERROR, "Sorry, dit karakter is al door iemand anders gekozen...").show();
return;
}
+ //Als er nog geen hoeveelheid is gekozen kan dat ook best een probleempje opleveren.
if (hoeveel < 0) {
Alert alert = new Alert(Alert.AlertType.ERROR, "Je moet eerst kiezen hoe veel spelers je wilt!\nDruk links op de juiste hoeveelheid kaboutertjes!", ButtonType.OK);
alert.show();
} else {
+ //Maar verder kunnen we gewoon de karakters vinden
Image image = new Image(i.impl_getUrl(), 0, 50, true, false);
+ //Toevoegen aan de lijst van spelers
Game.players.add(new Player(image, ch));
+ //De hoeveelheid benodigde spelers met één verlagen
hoeveel--;
+ //En controleren of iedereen er een gekozen heeft
if (hoeveel == 0) {
+ //Zo ja: we stoppen het muziekje en starten het spel!
menuplayer.stop();
Main.scene.setRoot(new Game());
} else {
+ //Maar anders laten we mensen nog kiezen.
String een = "Er moet nog 1 persoon kiezen!";
String meer = String.format("Er moeten nog %d mensen kiezen!", hoeveel);
Alert alert = new Alert(Alert.AlertType.NONE, hoeveel > 1 ? meer : een, ButtonType.OK);
@@ -110,22 +134,24 @@ public class Menu extends Group {
}
});
+ //Maar we moeten wel het karakter zichtbaar maken.
nodes.add(iv);
}
int x2 = 30, y2 = 50;
+ //Dit zijn de knoppen voor de hoeveelheid spelers
for (int i = 0; i < 4; i++) {
if (i == 0) continue;
int number = 1 + i;
- int locy = y2 + 150 * i + 10;
+ int locy = y2 + 155 * i + 10;
for (int e = 0; e < number; e++) {
ImageView view1 = new ImageView(new Image("/svg/p1.svg", 75, 0, true, false));
view1.setX(x2 + 85 * e + 10 * e);
view1.setY(locy);
nodes.add(view1);
}
- Rectangle clickable = new Rectangle(x2 - 10, locy + 125, 95 + i * 95, 150);
+ Rectangle clickable = new Rectangle(x2 - 10, locy + 125, 95 + i * 95, 152);
clickable.setFill(Color.TRANSPARENT);
clickable.setStroke(Color.BLACK);
clickable.setArcHeight(50);
@@ -143,6 +169,14 @@ public class Menu extends Group {
getChildren().addAll(nodes);
}
+ /**
+ * Maakt een knop op een plek, met een willekeurige kleur.
+ * @param string de tekst van de knop
+ * @param x de x coördinaat van de knop
+ * @param y de y coördinaat van de knop
+ * @param onClick een {@link EventHandler} die wordt uitgevoerd als de knop is ingedrukt
+ * @return een stackpane met daarin een knop
+ */
public static StackPane createButton(String string, double x, double y, EventHandler onClick) {
Text text = createText(string);
Rectangle rectangle = rectangulate(text);
@@ -153,6 +187,11 @@ public class Menu extends Group {
return pane;
}
+ /**
+ * Maakt een text object
+ * @param string de tekst van het object
+ * @return een object met de tekst
+ */
private static Text createText(String string) {
Text text = new Text(string);
text.setBoundsType(TextBoundsType.VISUAL);
@@ -165,6 +204,11 @@ public class Menu extends Group {
return text;
}
+ /**
+ * Maakt een rechthoek precies passend om de tekst heen.
+ * @param text een {@link Text} object
+ * @return een rechthoek met daar in de tekst
+ */
private static Rectangle rectangulate(Text text) {
Rectangle rectangle = new Rectangle();
rectangle.setFill(getRandomColor());
@@ -176,6 +220,11 @@ public class Menu extends Group {
return rectangle;
}
+ /**
+ * methode die de breedte van een {@link Text} object opvraagt
+ * @param text het object
+ * @return de breedte van het object
+ */
private static double getWidth(Text text) {
new Scene(new Group(text));
text.applyCss();
@@ -183,6 +232,11 @@ public class Menu extends Group {
return text.getLayoutBounds().getWidth();
}
+ /**
+ * methode die de hoogte van een {@link Text} object opvraagt
+ * @param text het object
+ * @return de hoogte van het object
+ */
private static double getHeight(Text text) {
new Scene(new Group(text));
text.applyCss();
@@ -190,6 +244,10 @@ public class Menu extends Group {
return text.getLayoutBounds().getHeight();
}
+ /**
+ * maakt een willekeurige kleur
+ * @return een willekeurige kleur.
+ */
public static Color getRandomColor() {
return Color.hsb(random.nextInt(360), 0.8, 0.8);
diff --git a/src/main/java/nl/minkema/leendert/ModLoader.java b/src/main/java/nl/minkema/leendert/ModLoader.java
index c373c49..ea3ace4 100644
--- a/src/main/java/nl/minkema/leendert/ModLoader.java
+++ b/src/main/java/nl/minkema/leendert/ModLoader.java
@@ -8,6 +8,12 @@ import java.io.File;
*/
public class ModLoader {
+ /**
+ * Dit was een leuk idee, maar het werkte 9/10 keer niet goed
+ *
+ * @param file de naam van het bestand
+ * @return het pad, danwel in het .jar bestand of als absoluut bestand
+ */
public static String getFile(String file) {
File f = new File("mods" + file);
if (f.exists()) {
diff --git a/src/main/java/nl/minkema/leendert/Player.java b/src/main/java/nl/minkema/leendert/Player.java
index 2dc824d..bf8591c 100644
--- a/src/main/java/nl/minkema/leendert/Player.java
+++ b/src/main/java/nl/minkema/leendert/Player.java
@@ -23,18 +23,28 @@ public class Player {
private int plaats = 0;
private int[] coords = Game.locations[plaats];
-
+ /**
+ * De constructor voor een speler
+ *
+ * @param image de afbeelding die bij de speler hoort
+ * @param ch het hoeveelste karakter de speler is.
+ */
public Player(Image image, int ch) {
this.ch = ch;
Random r = new Random(System.currentTimeMillis());
this.image = image;
this.view = new ImageView(this.image);
+ //Elke speler staat niet precies op het zelfde punt, ziet er wat leuker uit
this.add = new int[]{r.nextInt(10) - 5 - image.widthProperty().intValue() / 2, r.nextInt(10) - 5 - image.heightProperty().intValue() / 2};// new int[]{r.nextInt(10) - 5, r.nextInt(10) - 5};
coords = new int[]{coords[0] + add[0], coords[1] + add[1]};
getImageView().setTranslateX(coords[0]);
getImageView().setTranslateY(coords[1]);
}
+ /**
+ * Een methode om de volgende speler te verkrijgen
+ * @return het nummer van de volgende speler, niet verwarren met het character id.
+ */
public static int getNextActive() {
who++;
if (who >= Game.players.size()) {
@@ -44,10 +54,12 @@ public class Player {
return who;
}
+ //Dit zorgt dat de vorige speler geselecteerd wordt
public static void four() {
who -= 1;
}
+ //Dit is de afbeelding die bij de speler hoort
public ImageView getImageView() {
return view;
}
@@ -56,20 +68,27 @@ public class Player {
return ch;
}
+ /**
+ * Dit is de methode die wordt gebruikt om de speler te verplaatsen
+ * @param roll de hoeveelheid die is gegeooid.
+ */
public void move(int roll) {
+ //De standaard tekst
Alert alert = new Alert(Alert.AlertType.NONE, "Je hebt " + roll + " gegooid!", ButtonType.OK);
+ //Als er 4 is gegooid mag je nog een keer, dus passen we de tekst aan
if (roll == 4)
alert.contentTextProperty().setValue("Je hebt " + roll + " gegooid!\nKlavertje 4! Je mag dus nog een keer!");
+ //We willen geen titel
alert.titleProperty().setValue("");
- if (plaats + roll == 69 && Main.memes) {
- alert.contentTextProperty().setValue("heheheh 69 icksdie\n" + alert.getContentText());
- }
+ //Zolang er geen waterval of klimop is laten we het zien
if (!Game.specials.containsKey(plaats + roll))
alert.show();
+ //We gaan alleen niet over 100 heen...
if (roll + plaats > 100) {
return;
}
+ //We gebruiken een TranslateTransition om de speler te verplaatsen
TranslateTransition tt = new TranslateTransition(Duration.millis(200), getImageView());
tt.setFromX(coords[0]);
tt.setFromY(coords[1]);
@@ -77,16 +96,19 @@ public class Player {
tt.setToY(coords[1] = Game.locations[plaats + 1][1] + add[1]);
TranslateTransition last = tt;
+ //Dit is voor alles hoger dan 1
for (int i = plaats + 2; i < roll + plaats + 1; i++) {
TranslateTransition tl = new TranslateTransition(Duration.millis(200), getImageView());
tl.setFromX(coords[0]);
tl.setFromY(coords[1]);
tl.setToX(coords[0] = Game.locations[i][0] + add[0]);
tl.setToY(coords[1] = Game.locations[i][1] + add[1]);
+ //Als we meer dan 1 beweging willen moet dat er na afgespeeld worden, anders gaan ze tegelijk
last.setOnFinished(e -> tl.play());
last = tl;
}
plaats += roll;
+ //Als er een waterval of klimop is
if (Game.specials.containsKey(plaats)) {
TranslateTransition tl = new TranslateTransition(Duration.millis(200), getImageView());
tl.setFromX(coords[0]);
@@ -96,21 +118,23 @@ public class Player {
last.setOnFinished(e -> tl.play());
String text;
+ //We passen de tekst aan
if (plaats < Game.specials.get(plaats)) {
- text = alert.getContentText() + "\n\nRoltrappen!\nJe mag " + (Game.specials.get(plaats) - plaats) + " plaatsen vooruit!";
+ text = alert.getContentText() + "\n\nKlimop!\nJe mag " + (Game.specials.get(plaats) - plaats) + " plaatsen vooruit!";
} else {
- text = alert.getContentText() + "\n\nSlangen!\nJe moet " + (plaats - Game.specials.get(plaats)) + " plaatsen terug!";
+ text = alert.getContentText() + "\n\nWaterval!\nJe moet " + (plaats - Game.specials.get(plaats)) + " plaatsen terug!";
}
Alert alert1 = new Alert(Alert.AlertType.NONE, text, ButtonType.OK);
alert1.show();
+ //Laten we de plaats van de speler ook even aanpassen
plaats = Game.specials.get(plaats);
}
tt.play();
-
+ //Bij 100 heeft er iemand gewonnen!
if (plaats == 100) {
System.out.println("Een speler heeft gewonnen!");
Alert alert2 = new Alert(Alert.AlertType.WARNING, "Speler " + Menu.names[getCh()], ButtonType.OK);
diff --git a/src/main/resources/images/bord.png b/src/main/resources/images/bord.png
new file mode 100644
index 0000000..10dcd5f
Binary files /dev/null and b/src/main/resources/images/bord.png differ
diff --git a/src/main/resources/text/locations.properties b/src/main/resources/text/locations.properties
index 6ae0c99..7ba3bc2 100644
--- a/src/main/resources/text/locations.properties
+++ b/src/main/resources/text/locations.properties
@@ -1,102 +1,101 @@
-#format: nummer:x,y
-0:438,52
-1:496,53
-2:548,53
-3:609,52
-4:664,53
-5:704,111
-6:639,109
-7:583,110
-8:529,110
-9:472,107
-10:418,105
-11:381,166
-12:446,173
-13:499,168
-14:554,169
-15:605,168
-16:670,167
-17:721,168
-18:758,220
-19:704,228
-20:635,226
-21:578,223
-22:521,223
-23:451,222
-24:413,222
-25:346,224
-26:323,281
-27:379,281
-28:434,281
-29:490,281
-30:545,281
-31:603,280
-32:665,281
-33:720,280
-34:782,280
-35:809,330
-36:755,335
-37:703,336
-38:646,337
-39:588,337
-40:527,338
-41:470,339
-42:408,336
-43:361,336
-44:289,339
-45:265,399
-46:322,397
-47:372,395
-48:439,395
-49:500,393
-50:554,393
-51:606,396
-52:675,396
-53:721,396
-54:792,396
-55:835,397
-56:817,452
-57:755,455
-58:695,457
-59:648,457
-60:581,455
-61:528,454
-62:467,454
-63:401,454
-64:358,452
-65:302,453
-66:320,511
-67:378,515
-68:442,513
-69:486,512
-70:551,513
-71:607,514
-72:671,515
-73:732,515
-74:782,514
-75:758,572
-76:687,573
-77:633,572
-78:575,573
-79:533,574
-80:471,572
-81:407,570
-82:357,570
-83:382,639
-84:437,636
-85:503,633
-86:548,631
-87:605,630
-88:660,627
-89:733,628
-90:695,681
-91:648,681
-92:582,682
-93:526,682
-94:479,682
-95:411,683
-96:444,736
-97:497,751
-98:549,749
-99:607,748
-100:674,746
\ No newline at end of file
+0=711,718
+1=658,716
+2=602,713
+3=555,713
+4=506,711
+5=475,656
+6=528,663
+7=577,663
+8=627,665
+9=677,666
+10=737,661
+11=762,619
+12=707,614
+13=653,608
+14=610,608
+15=561,608
+16=499,607
+17=444,606
+18=428,558
+19=474,557
+20=522,557
+21=582,559
+22=632,562
+23=682,558
+24=730,557
+25=786,559
+26=812,505
+27=751,505
+28=705,508
+29=655,508
+30=607,508
+31=554,509
+32=499,508
+33=453,506
+34=402,508
+35=376,460
+36=424,457
+37=477,459
+38=529,457
+39=581,458
+40=628,458
+41=678,458
+42=730,455
+43=784,456
+44=831,457
+45=859,410
+46=807,409
+47=756,408
+48=706,407
+49=655,406
+50=601,406
+51=554,406
+52=503,406
+53=452,406
+54=400,406
+55=345,406
+56=373,351
+57=424,349
+58=474,352
+59=525,356
+60=577,357
+61=629,356
+62=684,357
+63=733,358
+64=781,359
+65=835,355
+66=809,307
+67=758,304
+68=709,304
+69=656,303
+70=606,303
+71=551,303
+72=507,301
+73=454,303
+74=401,303
+75=427,253
+76=478,253
+77=528,254
+78=580,252
+79=630,252
+80=680,255
+81=731,255
+82=781,255
+83=757,204
+84=706,204
+85=655,204
+86=604,203
+87=553,202
+88=503,202
+89=451,203
+90=477,152
+91=529,151
+92=581,151
+93=630,152
+94=678,153
+95=732,154
+96=709,99
+97=657,99
+98=604,102
+99=552,102
+100=500,102
\ No newline at end of file
diff --git a/src/main/resources/text/specials.properties b/src/main/resources/text/specials.properties
index cb6d268..6a80baa 100644
--- a/src/main/resources/text/specials.properties
+++ b/src/main/resources/text/specials.properties
@@ -1,14 +1,12 @@
-5=10
-7=4
-18=13
-20=27
-30=24
-42=88
-50=43
-57=65
-63=52
-71=62
-80=82
-88=87
-92=97
-98=90
+1=27
+17=32
+21=4
+22=30
+47=68
+52=59
+61=39
+70=79
+74=53
+76=91
+81=64
+92=71
\ No newline at end of file