--- a/settings.gradle +++ b/settings.gradle @@ -1 +1 @@ -include 'desktop', 'android', 'html', 'core' \ No newline at end of file +include 'html', 'core' --- a/build.gradle +++ b/build.gradle @@ -1,7 +1,6 @@ buildscript { repositories { - mavenLocal() mavenCentral() gradlePluginPortal() maven { @@ -12,7 +11,6 @@ dependencies { classpath 'org.wisepersist:gwt-gradle-plugin:1.1.16' classpath 'org.gretty:gretty:4.1.6' - classpath 'com.android.tools.build:gradle:8.4.2' } } @@ -28,7 +26,6 @@ } repositories { - mavenLocal() mavenCentral() google() gradlePluginPortal() @@ -44,34 +41,6 @@ } } -project(":desktop") { - apply plugin: "java-library" - - - dependencies { - implementation project(":core") - api "com.badlogicgames.gdx:gdx-backend-lwjgl3:$gdxVersion" - api "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-desktop" - - } -} - -project(":android") { - apply plugin: "com.android.application" - - configurations { natives } - - dependencies { - implementation project(":core") - api "com.badlogicgames.gdx:gdx-backend-android:$gdxVersion" - natives "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-armeabi-v7a" - natives "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-arm64-v8a" - natives "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-x86" - natives "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-x86_64" - - } -} - project(":html") { apply plugin: "java-library" apply plugin: "gwt" @@ -95,6 +64,5 @@ dependencies { api "com.badlogicgames.gdx:gdx:$gdxVersion" implementation 'com.github.raeleus.TenPatch:tenpatch:5.2.3' - implementation 'io.sentry:sentry:8.8.0' } } --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,7 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-9.6.1-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.14.3-bin.zip networkTimeout=10000 zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists +distributionSha256Sum=bd71102213493060956ec229d946beee57158dbd89d0e62b91bca0fa2c5f3531 --- a/html/build.gradle +++ b/html/build.gradle @@ -1,92 +1,93 @@ -gwt { - gwtVersion='2.10.0' // Should match the gwt version used for building the gwt backend - maxHeapSize="1G" // Default 256m is not enough for gwt compiler. GWT is HUNGRY - minHeapSize="1G" - - src = files(file("src/")) // Needs to be in front of "modules" below. - modules 'app.halma.GdxDefinition' - devModules 'app.halma.GdxDefinitionSuperdev' - project.webAppDirName = 'webapp' - - compiler { - strict = true; - disableCastChecking = true; - } -} - -import org.wisepersist.gradle.plugins.gwt.GwtSuperDev -import org.akhikhl.gretty.AppBeforeIntegrationTestTask - -gretty.httpPort = 8080 -gretty.resourceBase = project.buildDir.path + "/gwt/draftOut" -gretty.contextPath = "/" -gretty.portPropertiesFileName = "TEMP_PORTS.properties" - -task startHttpServer () { - dependsOn draftCompileGwt - - doFirst { - copy { - from "webapp" - into gretty.resourceBase - } - - copy { - from "war" - into gretty.resourceBase - } - } -} - -task beforeRun(type: AppBeforeIntegrationTestTask, dependsOn: startHttpServer) { - // The next line allows ports to be reused instead of - // needing a process to be manually terminated. - file("build/TEMP_PORTS.properties").delete() - // Somewhat of a hack; uses Gretty's support for wrapping a task in - // a start and then stop of a Jetty server that serves files while - // also running the SuperDev code server. - integrationTestTask 'superDev' - - interactive false -} - -task superDev (type: GwtSuperDev) { - dependsOn startHttpServer - doFirst { - gwt.modules = gwt.devModules - } -} - -task dist(dependsOn: [clean, compileGwt]) { - doLast { - file("build/dist").mkdirs() - copy { - from "build/gwt/out" - into "build/dist" - } - copy { - from "webapp" - into "build/dist" - } - copy { - from "war" - into "build/dist" - } - } -} - -task addSource { - doLast { - sourceSets.main.compileClasspath += files(project(':core').sourceSets.main.allJava.srcDirs) - } -} - -tasks.compileGwt.dependsOn(addSource) -tasks.draftCompileGwt.dependsOn(addSource) -tasks.checkGwt.dependsOn(addSource) -checkGwt.war = file("war") - -sourceCompatibility = 8 -sourceSets.main.java.srcDirs = [ "src/" ] - -eclipse.project.name = appName + "-html" +gwt { + gwtVersion='2.10.0' // Should match the gwt version used for building the gwt backend + maxHeapSize="1G" // Default 256m is not enough for gwt compiler. GWT is HUNGRY + minHeapSize="1G" + + src = files(file("src/")) // Needs to be in front of "modules" below. + modules 'app.halma.GdxDefinition' + devModules 'app.halma.GdxDefinitionSuperdev' + project.webAppDirName = 'webapp' + + compiler { + strict = true; + disableCastChecking = true; + localWorkers = 1 // one worker thread: with several the generated JavaScript differs from build to build + } +} + +import org.wisepersist.gradle.plugins.gwt.GwtSuperDev +import org.akhikhl.gretty.AppBeforeIntegrationTestTask + +gretty.httpPort = 8080 +gretty.resourceBase = project.buildDir.path + "/gwt/draftOut" +gretty.contextPath = "/" +gretty.portPropertiesFileName = "TEMP_PORTS.properties" + +task startHttpServer () { + dependsOn draftCompileGwt + + doFirst { + copy { + from "webapp" + into gretty.resourceBase + } + + copy { + from "war" + into gretty.resourceBase + } + } +} + +task beforeRun(type: AppBeforeIntegrationTestTask, dependsOn: startHttpServer) { + // The next line allows ports to be reused instead of + // needing a process to be manually terminated. + file("build/TEMP_PORTS.properties").delete() + // Somewhat of a hack; uses Gretty's support for wrapping a task in + // a start and then stop of a Jetty server that serves files while + // also running the SuperDev code server. + integrationTestTask 'superDev' + + interactive false +} + +task superDev (type: GwtSuperDev) { + dependsOn startHttpServer + doFirst { + gwt.modules = gwt.devModules + } +} + +task dist(dependsOn: [clean, compileGwt]) { + doLast { + file("build/dist").mkdirs() + copy { + from "build/gwt/out" + into "build/dist" + } + copy { + from "webapp" + into "build/dist" + } + copy { + from "war" + into "build/dist" + } + } +} + +task addSource { + doLast { + sourceSets.main.compileClasspath += files(project(':core').sourceSets.main.allJava.srcDirs) + } +} + +tasks.compileGwt.dependsOn(addSource) +tasks.draftCompileGwt.dependsOn(addSource) +tasks.checkGwt.dependsOn(addSource) +checkGwt.war = file("war") + +sourceCompatibility = 8 +sourceSets.main.java.srcDirs = [ "src/" ] + +eclipse.project.name = appName + "-html" --- a/assets/halma.json +++ b/assets/halma.json @@ -1,13 +1,13 @@ { "com.badlogic.gdx.graphics.g2d.BitmapFont": { "font": { - "file": "font-export.fnt" + "file": "FontButton.fnt" }, "HALMA": { - "file": "HALMA.fnt" + "file": "FontLabel.fnt" }, "title": { - "file": "font-title-export.fnt" + "file": "FontTitle.fnt" } }, "com.badlogic.gdx.graphics.Color": { --- a/core/src/app/halma/Halma.java +++ b/core/src/app/halma/Halma.java @@ -1,6 +1,5 @@ package app.halma; -import app.halma.redesign.Settings; import app.halma.utils.ErrorMonitoring; import app.halma.utils.HalmaPreferences; import com.badlogic.gdx.Game; @@ -25,13 +24,13 @@ } // Override to specific language with new Locale("de"), "en", etc. - Locale locale = Locale.getDefault(); + Locale locale = Locale.ENGLISH; // browser edition: English only (the glyphs of the other languages are not in the bitmap fonts) System.out.println("your language is:"); System.out.println(locale); I18NBundle.setSimpleFormatter(true); // Ensure same behaviour on GWT and other platforms bundle = I18NBundle.createBundle(Gdx.files.internal("strings"), locale); - setScreen(HalmaPreferences.isFirstRun() ? new Settings(this) : new MainMenu(this)); + setScreen(new MainMenu(this)); // the original opens the (unused) difficulty screen on the first run } I18NBundle getBundle() { --- a/core/src/app/halma/RulesScreen.java +++ b/core/src/app/halma/RulesScreen.java @@ -3,233 +3,16 @@ import com.badlogic.gdx.scenes.scene2d.InputEvent; import com.badlogic.gdx.scenes.scene2d.ui.Label; import com.badlogic.gdx.scenes.scene2d.utils.ClickListener; -import app.halma.menu.Menu; +import app.halma.redesign.MainMenu; public class RulesScreen extends BaseScreen{ private Label text; private int index = 0; private String[] texts = new String[]{ - "Spieltyp: Taktikspiel\n" + - "Spielerzahl: 1-4\n" + - "Altersempfehlung: 8-88\n" + - "Spieldauer: ca. 30-45 Minuten\n" + - "\n", - "SPIELZIEL:\n" + - "\n" + - "Wer es zuerst schafft, seine Holz-\n" + - "kegel durch geschickte Züge in\n" + - "den gegenüberliegenden Hof zu brin-\n" + - "gen, gewinnt das Spiel.\n" + - "\n" , - "SPIELMATERIAL:\n" + - "\n" + - "1 Doppelspielplan\n" + - "66 Halmakegel:\n" + - "19 schwarze\n" + - "19 rote\n" + - "15 grüne\n" + - "13 gelbe\n" + - "\n" , - "SPIELVORBEREITUNG\n" + - "\n" + - "Das Spiel kann von 2, 3 oder 4\n" + - "Personen gespielt werden. Mit dem\n" + - "Karoplan können 2 oder 4 Spieler,\n" + - "mit dem Sternplan 2 oder 3 Spieler\n" + - "spielen.\n" + - "\n" , - "Es spielen:\n" + - "2 Personen mit 2 x 19 Kegeln\n" + - "3 Personen mit 3 x 15 Kegeln\n" + - "4 Personen mit 4 x 13 Kegeln\n" + - "\n" , - "Auf dem Karoplan befinden sich\n" + - "4 Ecken mit 13 Feldern, die durch ei-\n" + - "ne blaue Linie abgegrenzt sind.\n" + - "Diese 13 Felder werden zusammen\n" + - "der “kleine Hof” genannt.\n" + - "\n" + - "Beteiligen sich 4 Personen\n" + - "am Spiel, so besetzt jeder\n" + - "Spieler die 13 Felder eines sol-\n" + - "chen “kleinen Hofes” mit 13\n" + - "Kegeln derselben Farbe.\n" + - "\n" , - "Spielen nur 2 Personen, so\n" + - "werden die beiden sich schräg\n" + - "gegenüberliegende “großen Hö-\n" + - "fe” bis zur schwarzen Linie\n" + - "mit 19 Kegeln besetzt.\n" + - "\n" + - "Die Aufstellung der Kegel auf dem\n" + - "sternförmigen Plan und die sich\n" + - "daraus ergebenden Regeln werden\n" + - "in einem eigenen Abschnitt (Stern-\n" + - "halma) beschrieben.\n" + - "\n" , - "SPIELABLAUF:\n" + - "\n" + - "Jeder Spieler versucht, so schnell\n" + - "und geschickt wie möglich, seine\n" + - "Kegel in den gegenüberliegenden\n" + - "Hof zu bringen.\n" + - "\n" + - "Die einzelnen Spieler bewegen der\n" + - "Reihe nach abwechselnd einen ei-\n" + - "genen Kegel. Gespielt wird im\n" + - "Uhrzeigersinn.\n" + - "\n" + - "Mit einem Kegel kann man entwe-\n" + - "der ziehen oder springen.\n" + - "\n" , - "ZIEHEN\n" + - "\n" + - "Alle Zugrichtungen sind erlaubt: ein\n" + - "Feld waagerecht, senkrecht, diago-\n" + - "nal, rückwärts oder seitwärts, je\n" + - "nach Belieben. Auf jedem Feld darf\n" + - "nur 1 Kegel stehen.\n" + - "\n" , - "SPRINGEN\n" + - "\n" + - "Ein gegnerischer, aber auch ein ei-\n" + - "gener Kegel, der direkt vor oder ne-\n" + - "ben einem steht, kann überspungen\n" + - "werden, wenn unmittelbar dahinter\n" + - "ein freies Feld ist. Dabei kann in je-\n" + - "de Richtung gesprungen werden.\n" + - "\n" + - "Aber aufgepaßt: Obwohl die Kegel\n" + - "wie beim Damespiel übersprungen\n" + - "werden, werden sie nicht aus dem\n" + - "Spiel herausgenommen.\n" + - "\n" , - "KETTENSPRÜNGE\n" + - "\n" + - "Kettensprünge sind aufeinan-\n" + - "derfolgende Sprünge. In einem\n" + - "Zug können dabei mehrere Kegel\n" + - "übersprungen werden. Hinter jedem\n" + - "Kegel muß sich dabei ein freies Feld\n" + - "befinden.\n" + - "\n" + - "Die Richtungen zwischen den ein-\n" + - "zelnen Sprüngen können beliebig\n" + - "gewechselt werden, auch Zick-\n" + - "zacksprünge sind erlaubt. Wie\n" + - "weit ein Spieler bei einem Ket-\n" + - "tensprung springt, bleibt ihm selber\n" + - "überlassen.\n" + - "\n" , - "Jeder Spieler sollte versuchen, mit\n" + - "den eigenen Kegeln Ketten aufzu-\n" + - "bauen, damit die eigene Mann-\n" + - "schaft schneller vorankommt. Der\n" + - "andere profitiert davon natürlich auch.\n" + - "\n" , - "TAKTISCHE SPIELTIPS\n" + - "\n" + - "Es liegt im Interesse eines jeden\n" + - "Spielers, in seinem Zug so viel wie\n" + - "möglich zu springen, um schnel-\n" + - "ler im gegenüberliegenden Hof an-\n" + - "zukommen. Er sollte darauf achten,\n" + - "seine Gegenspieler am Springen zu\n" + - "hindern. Seine Kegel stellt er dabei\n" + - "so auf, daß sich hinter ihnen kein\n" + - "freies Feld befindet.\n" + - "\n" , - "Ein gegnerischer Kegel kann bis\n" + - "zuletzt in seinem Hof eingeschlos-\n" + - "sen werden. Ebenso kann ein Spie-\n" + - "ler im eigenen Hof einen Kegel\n" + - "zurücklassen, damit der Gegner den\n" + - "Hof nicht vollständig besetzen kann.\n" + - "Dennoch sollte jeder dafür sorgen,\n" + - "daß dieser letzte Kegel mit wenigen\n" + - "Zügen folgen kann, damit nicht der\n" + - "eigene Sieg vereitelt wird.\n" + - "\n" , - "Beteiligen sich 4 Personen am\n" + - "Spiel, so kann jeder Spieler für sich\n" + - "versuchen, einen der Höfe zu er-\n" + - "obern. Eventuell empfiehlt es sich,\n" + - "wenn zwei sich schräg gegenüber-\n" + - "liegende Spieler zusammenspie-\n" + - "len. Sie versuchen, ihre Höfe so\n" + - "schnell wie möglich zu vertauschen,\n" + - "indem sie sich gegenseitig Ge-\n" + - "legenheit zum Springen geben und\n" + - "dabei die beiden anderen Spieler\n" + - "möglichst am Vorwärtskommen hin-\n" + - "dern.\n" + - "\n" , - "SPIELENDE\n" + - "\n" + - "Spiel ist sofort beendet, wenn\n" + - "ein Spieler mit seinem letzten\n" + - "Kegel das letzte noch freie Zielfeld\n" + - "\n" + - "im gegenüberliegenden Hof besetzt\n" + - "hat.\n" + - "\n" , - "STERNHALMA\n" + - "FÜR 2 BIS 3 PERSONEN\n" + - "\n" + - "eim Halma-Spiel für 3 Personen\n" + - "\n" + - "wird mit dem 6zackigen Stern auf\n" + - "der Rückseite des Spielplans ge-\n" + - "spielt. Jeder setzt 15 Kegel einer\n" + - "Farbe auf eine Sternspitze. Dabei\n" + - "muß zwischen den Startplätzen der\n" + - "Spieler jeweils eine Sternspitze un-\n" + - "besetzt bleiben. Die Spieler müssen\n" + - "nun versuchen, zuerst mit allen Ke-\n" + - "geln den gegenüberliegenden gleich-\n" + - "farbigen Zielbereich zu erreichen.\n" + - "\n" , - "im Gegensatz zum Karoplan zieht\n" + - "\n" + - "man seine Kegel nicht auf Feldern\n" + - "sondern über Linien von Punkt\n" + - "zu Punkt. Fremde oder eigene\n" + - "Kegel kann man überspringen, wenn\n" + - "die durch eine Linie verbundenen\n" + - "Punkte direkt dahinter frei sind. Das\n" + - "Zielfeld ist hierbei anfangs - im\n" + - "Gegensatz zum Spiel auf dem\n" + - "Karoplan - unbesetzt. Ansonsten\n" + - "\n" + - "gelten hierfür die gleichen Regeln\n" + - "wie bei dem Spiel auf dem Karoplan.\n" + - "\n" + - "Mit diesem Plan können auch 2\n" + - "Personen spielen.\n" + - "\n" , - "HALMA SOLO\n" + - "FÜR 1 SPIELER\n" + - "\n" + - "Halma kann man auch auf dem\n" + - "Karoplan alleine spielen.\n" + - "\n" + - "Mit 19 Kegeln besetzt man einen\n" + - "\n" + - "Hof und versucht, mit wenigen\n" + - "Zügen den diagonal gegenüberlie-\n" + - "genden Hof zu erreichen. Dabei\n" + - "zählt man mit, wie viele Züge bzw.\n" + - "Sprünge man braucht, um das\n" + - "Zielfeld mit allen Kegeln zu errei-\n" + - "chen. Man versucht, es in der näch-\n" + - "sten Partie besser zu machen und\n" + - "noch günstigere Möglichkeiten her-\n" + - "auszubekommen.\n" + - "\n" , - "Diese Variante kann man natürlich\n" + - "auch mit 15 Kegeln auf dem\n" + - "Sternplan spielen.", - "Alles verstanden? Dann tippe nochmal, \n um zurueck zu kehren :)" + "HALMA - HOW TO PLAY\n\nBring all of your pieces from your home\ncorner to the opposite corner\nbefore the others do.\n\n(Tap to read on)", + "ON YOUR TURN\n\nTap one of your pieces: every hole it can\nreach is highlighted. Tap a highlighted\nhole to move there.", + "STEPS AND JUMPS\n\nA piece can step to a neighbouring empty\nhole, or jump over a neighbouring piece\ninto the empty hole just behind it.\nJumps can be chained in one turn.", + "KEYS\n\nBackspace (or the Back key) returns\nto the main menu from any screen.\n\nGood luck!" }; public RulesScreen(Halma halma) { super(halma); @@ -241,7 +24,7 @@ public void clicked(InputEvent event, float x, float y) { index++; if(index == texts.length) - halma.setScreen(new Menu(halma)); + halma.setScreen(new MainMenu(halma)); else text.setText(texts[index]); //text position --- a/core/src/app/halma/ResultScreen.java +++ b/core/src/app/halma/ResultScreen.java @@ -1,7 +1,7 @@ package app.halma; import com.badlogic.gdx.scenes.scene2d.Actor; -import app.halma.menu.Menu; +import app.halma.redesign.MainMenu; import app.halma.play.Player; public class ResultScreen extends BaseScreen{ @@ -12,12 +12,12 @@ create(); } public void create(){ - layout.add(player.getName() + " hat gewonnen! \n GLÜCKWUNSCH \n drücke um zurück zu kommen"); + layout.add(player.getName() + " wins!\n\nCongratulations!\n\nTap to go back to the menu"); stage.addListener(listener); } @Override public void clicked(Actor a) { - halma.setScreen(new Menu(halma)); + halma.setScreen(new MainMenu(halma)); } } --- a/core/src/app/halma/ErgebnisScreen.java +++ b/core/src/app/halma/ErgebnisScreen.java @@ -1,7 +1,7 @@ package app.halma; import com.badlogic.gdx.scenes.scene2d.Actor; -import app.halma.menu.Menu; +import app.halma.redesign.MainMenu; import app.halma.play.Player; public class ErgebnisScreen extends BaseScreen{ @@ -12,12 +12,12 @@ create(); } public void create(){ - layout.add(player.getName() + " hat gewonnen! \n GLÜCKWUNSCH \n drücke um zurück zu kommen"); + layout.add(player.getName() + " wins!\n\nCongratulations!\n\nTap to go back to the menu"); stage.addListener(listener); } @Override public void clicked(Actor a) { - halma.setScreen(new Menu(halma)); + halma.setScreen(new MainMenu(halma)); } } --- a/core/src/app/halma/utils/ErrorMonitoring.java +++ b/core/src/app/halma/utils/ErrorMonitoring.java @@ -1,31 +1,16 @@ package app.halma.utils; -import io.sentry.Sentry; -import io.sentry.SentryLevel; - +/** + * Browser edition: the original reports errors to a Sentry server; here every method does nothing, so the game + * never contacts anyone (the setting that turned it on is gone from the Settings screen too). + */ public class ErrorMonitoring { public static void init() { - Sentry.init(options -> { - options.setDsn("https://378ae0f63eb29c1e801856858805a0f9@o282785.ingest.us.sentry.io/4506740692811776"); - - // Configure the background worker which sends events to sentry: - // Wait up to 5 seconds before shutdown while there are events to send. - options.setShutdownTimeoutMillis(5000); - - // Enable SDK logging with Debug level - options.setDebug(true); - // To change the verbosity, use: - options.setDiagnosticLevel(SentryLevel.ERROR); - }); } public static void startMonitoring() { - Sentry.startSession(); } public static void stopMonitoring() { - Sentry.endSession(); - Sentry.close(); - HalmaPreferences.monitorErrors(false); } } --- a/core/src/app/halma/redesign/Settings.java +++ b/core/src/app/halma/redesign/Settings.java @@ -3,7 +3,6 @@ import app.halma.BaseScreen; import app.halma.Halma; import app.halma.Uncheck; -import app.halma.utils.ErrorMonitoring; import app.halma.utils.HalmaPreferences; import com.badlogic.gdx.Gdx; import com.badlogic.gdx.graphics.Color; @@ -46,43 +45,6 @@ content.add(difficulty).padRight(10); content.add(easy, medium, hard).row(); - // Error monitoring switch - // Load the images for the switch - TextureRegionDrawable switchOn = new TextureRegionDrawable(new TextureRegion(new Texture(Gdx.files.internal("redesign/tick.png")))); - TextureRegionDrawable switchOff = new TextureRegionDrawable(new TextureRegion(new Texture(Gdx.files.internal("redesign/cross.png")))); - - // Create a custom style for the CheckBox - CheckBox.CheckBoxStyle switchStyle = new CheckBox.CheckBoxStyle(); - switchStyle.checkboxOn = switchOn; - switchStyle.checkboxOff = switchOff; - switchStyle.font = skin.getFont("font"); - - // Create a CheckBox with the custom style - CheckBox errorMonitoringSwitch = new CheckBox("", switchStyle); - errorMonitoringSwitch.setChecked(Gdx.app.getPreferences("settings").getBoolean("errorMonitor")); - errorMonitoringSwitch.background(skin.getDrawable("GrayButton10")); - - // Add a ClickListener to the CheckBox - errorMonitoringSwitch.addListener(new ClickListener() { - @Override - public void clicked(InputEvent event, float x, float y) { - // Toggle the error monitoring feature - if (errorMonitoringSwitch.isChecked()) { - // Enable error monitoring - HalmaPreferences.monitorErrors(true); - Gdx.app.getPreferences("settings") - .putBoolean("errorMonitor", true); - ErrorMonitoring.startMonitoring(); - } else { - // Disable error monitoring - ErrorMonitoring.stopMonitoring(); - } - } - }); - - content.add(lbl(getString("errorMonitor"))).colspan(3); - content.add(errorMonitoringSwitch).pad(5); - Table backButtonTable = new Table(); backButton = new ImageButton(new TextureRegionDrawable(new TextureRegion(new Texture(Gdx.files.internal("redesign/back.png"))))); backButtonTable.add(backButton).top().left().pad(10); --- a/core/src/app/halma/redesign/About.java +++ b/core/src/app/halma/redesign/About.java @@ -2,24 +2,19 @@ import app.halma.BaseScreen; import app.halma.Halma; -import app.halma.Uncheck; import com.badlogic.gdx.Gdx; import com.badlogic.gdx.graphics.Color; import com.badlogic.gdx.graphics.Texture; import com.badlogic.gdx.graphics.g2d.TextureRegion; import com.badlogic.gdx.scenes.scene2d.Actor; -import com.badlogic.gdx.scenes.scene2d.ui.Image; +import com.badlogic.gdx.scenes.scene2d.ui.ImageButton; import com.badlogic.gdx.scenes.scene2d.ui.Label; import com.badlogic.gdx.scenes.scene2d.ui.Table; -import com.badlogic.gdx.scenes.scene2d.ui.TextButton; -import com.badlogic.gdx.utils.Scaling; +import com.badlogic.gdx.scenes.scene2d.utils.TextureRegionDrawable; public class About extends BaseScreen { private Table content; - private TextButton code; - private TextButton translations; - private TextButton terms; - private TextButton privacy; + private ImageButton backButton; public About(Halma halma) { super(halma); @@ -29,10 +24,10 @@ private void create() { bgColor = Color.WHITE; - code = tb(getString("viewSource")); - translations = tbw(getString("translations")); - terms = tbw(getString("terms")); - privacy = tbw(getString("privacy")); + Table backButtonTable = new Table(); + backButton = new ImageButton(new TextureRegionDrawable(new TextureRegion(new Texture(Gdx.files.internal("redesign/back.png"))))); + backButtonTable.add(backButton).top().left().pad(10); + layout.add(backButtonTable).top().left().expandX().pad(10).row(); content = new Table(skin); @@ -43,48 +38,17 @@ content.add(lbl(coDev[0] + ":"), lbl(coDev[1])); content.pad(stage.getWidth() / 35); - layout.add(content).row(); - layout.add(code).expandX(); - layout.row(); - - Table bottomRow = new Table(); - bottomRow.defaults().pad(10); - // Add the buttons and dots to the bottomRow - bottomRow.add(translations); - bottomRow.add(getDot()).width(10); // Set size here - bottomRow.add(terms); - bottomRow.add(getDot()).width(10); // Set size here - bottomRow.add(privacy); - layout.add(bottomRow).padTop(20); + layout.add(content).expand().row(); - addButtonsToListener(code, translations, terms, privacy); - Uncheck.addButtons(code, translations, terms, privacy); - } - - private static Image getDot() { - Texture dotTexture = new Texture("circle.png"); - - TextureRegion dotRegion = new TextureRegion(dotTexture); - - Image dot = new Image(dotRegion); - dot.setColor(Color.GRAY); - dot.setScaling(Scaling.fit); - dot.setWidth(10); - dot.setHeight(10); - - return dot; - } - - private TextButton tb(String content) { - TextButton tb = new TextButton(content, skin); - tb.getLabel().setColor(Color.BLACK); - return tb; - } + // Browser edition: no links to other sites; credits are plain text. + Table credits = new Table(skin); + credits.defaults().pad(3); + credits.add(lbl("Free software, Apache License 2.0")).row(); + credits.add(lbl("UI skin: Flat Earth UI by Raymond \"Raeleus\" Buckley (CC BY 4.0)")).row(); + credits.add(lbl("Web edition by FredyGames")); + layout.add(credits).padBottom(40); - private TextButton tbw(String content) { - TextButton tb = new TextButton(content, skin, "White"); - tb.getLabel().setColor(Color.BLACK); - return tb; + addButtonsToListener(backButton); } private Label lbl(String content) { @@ -95,9 +59,6 @@ @Override public void clicked(Actor a) { - if (code == a) Gdx.net.openURI(getString("repoURL")); - if (translations == a) Gdx.net.openURI(getString("translationsURL")); - if (terms == a) Gdx.net.openURI(getString("termsURL")); - if (privacy == a) Gdx.net.openURI(getString("privacyURL")); + if (backButton == a) halma.setScreen(new MainMenu(halma)); } } --- a/core/src/app/halma/redesign/PlayConfig.java +++ b/core/src/app/halma/redesign/PlayConfig.java @@ -44,7 +44,7 @@ onlineOffline.add(online, offline); boardType.add(square, star); botCountTable.add(lbl(" "), botDown, lbl(" "), botCount, lbl(" "), botUp, lbl(" ")); peopleCountTable.add(lbl(" "), peopleDown, lbl(" "), peopleCount, lbl(" "), peopleUp, lbl(" ")); - settings.add(mode, onlineOffline).row(); settings.add(board, boardType).row(); + settings.add(board, boardType).row(); settings.add(bots, botCountTable).row(); settings.add(people, peopleCountTable); layout.add(settings).row(); layout.add(startButton); --- a/core/src/app/halma/redesign/MainMenu.java +++ b/core/src/app/halma/redesign/MainMenu.java @@ -14,7 +14,7 @@ public class MainMenu extends BaseScreen { //variables private Image icon; - private TextButton newGame, about, help, settings; + private TextButton newGame, about, help; public MainMenu(Halma halma) { super(halma); @@ -28,10 +28,9 @@ newGame = new TextButton(getString("newGame"), skin, "Blue"); about = new TextButton(getString("about"), skin, "default"); help = new TextButton(getString("help"), skin, "default"); - settings = new TextButton(getString("settings"), skin, "default"); - addActorsToStage(icon, newGame, about, help, settings); - addButtonsToListener(help, about, newGame, settings); + addActorsToStage(icon, newGame, about, help); + addButtonsToListener(help, about, newGame); layout(); } @@ -39,9 +38,9 @@ private void layout() { setBounds(icon, 272, 172, 176, 176); setBounds(newGame, 126, 72, 468, 36); - setBounds(settings, 126, 24, 152, 36); - setBounds(about, 286, 24, 152, 36); - setBounds(help, 446, 24, 152, 36); + // browser edition: no Settings button (its only option, the difficulty, was never used by the game) + setBounds(about, 126, 24, 230, 36); + setBounds(help, 364, 24, 230, 36); } private void setBounds(Actor actor, float x, float y, float width, float height) { @@ -72,7 +71,6 @@ if (a == help) halma.setScreen(new RulesScreen(halma)); if (a == about) halma.setScreen(new About(halma)); if (a == newGame) halma.setScreen(new PlayConfig(halma)); - if (a == settings) halma.setScreen(new Settings(halma)); } @Override