Commit 7283f3b5 authored by Drahomír Karchňák's avatar Drahomír Karchňák

Merge branch 'V3.5.1' into feature-desktop-controls

parents 19e2de2d 5fa0d53a
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.geometry.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.image.*?>
<?import java.lang.*?>
<?import javafx.scene.layout.*?>
<!--
~ Copyright (C) 2017 CZ.NIC, z.s.p.o. (http://www.nic.cz/)
~
~ This program is free software: you can redistribute it and/or modify
~ it under the terms of the GNU General Public License as published by
~ the Free Software Foundation, either version 3 of the License, or
~ (at your option) any later version.
~
~ This program is distributed in the hope that it will be useful,
~ but WITHOUT ANY WARRANTY; without even the implied warranty of
~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
~ GNU General Public License for more details.
~
~ You should have received a copy of the GNU General Public License
~ along with this program. If not, see <http://www.gnu.org/licenses/>.
-->
<Pane prefHeight="200.0" prefWidth="300.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1">
<children>
<VBox minHeight="-Infinity" minWidth="-Infinity" prefHeight="200.0" prefWidth="300.0">
<children>
<BorderPane prefHeight="200.0" prefWidth="200.0">
<center>
<ImageView fitHeight="150.0" fitWidth="200.0" pickOnBounds="true" preserveRatio="true" BorderPane.alignment="CENTER">
<image>
<Image url="@tablexia.png" />
</image>
</ImageView>
</center>
<VBox.margin>
<Insets bottom="5.0" left="5.0" right="5.0" top="5.0" />
</VBox.margin>
</BorderPane>
<FlowPane prefHeight="200.0" prefWidth="200.0">
<children>
<Label prefHeight="53.0" prefWidth="119.0" text="Resolution">
<padding>
<Insets right="50.0" />
</padding>
</Label>
<ChoiceBox fx:id="resolutionChoiceBox" prefWidth="150.0" />
<Label prefHeight="15.0" prefWidth="119.0" text="Fullscreen">
<padding>
<Insets right="30.0" />
</padding>
</Label>
<CheckBox fx:id="fullscreenCheckBox" mnemonicParsing="false" />
</children>
<VBox.margin>
<Insets bottom="10.0" left="10.0" right="10.0" top="10.0" />
</VBox.margin>
</FlowPane>
<Button fx:id="launchButton" mnemonicParsing="false" prefHeight="45.0" prefWidth="50.0" text="Run">
<VBox.margin>
<Insets bottom="10.0" left="10.0" right="10.0" top="10.0" />
</VBox.margin>
</Button>
</children>
</VBox>
</children>
</Pane>
......@@ -103,6 +103,7 @@ game_kidnapping_preloader3=Se sluchátky zvuky lépe uslyšíš.
game_pursuit_title=Pronásledování
game_pursuit_description=Procvičování prostorové orientace
game_pursuit_preloader=Sestav mapu přemisťováním a\u00A0otáčením jednotlivých dílků.
game_pursuit_preloader_desktop=Sestav mapu přemisťováním a\u00A0otáčením jednotlivých dílků. Diely môžeš otáčať dvojklikom alebo pravým tlačidlom myši.
game_night_watch_title=Hlídka
game_night_watch_description=Procvičování zrakové paměti
game_night_watch_preloader=Dávej pozor, která okna se po setmění rozsvítí a\u00A0v\u00A0kolik hodin.\r\n\r\nPo rozednění nastav na hodinách čas a\u00A0označ okna, která byla rozsvícená.
......@@ -114,10 +115,12 @@ game_in_the_darkness_title=Potmě
game_in_the_darkness_description=Procvičování seriality
game_in_the_darkness_preloader1=Naplánuj krok za krokem průchod labyrintem.
game_in_the_darkness_preloader2=Přetahuj správné úkony do pásu vpravo a\u00A0dávej pozor na všechny překážky. Teprve až budeš mít naplánovanou celou trasu, stiskni tlačítko HOTOVO.
game_in_the_darkness_preloader_desktop_1=Přetahuj správné úkony do pásu vpravo a\u00A0dávej pozor na všechny překážky. Teprve až budeš mít naplánovanou celou trasu, stiskni tlačítko HOTOVO. Akce můžeš přidat nebo odebrat dvojklikem myši.
game_crime_scene_title=Místo činu
game_crime_scene_description=Procvičování sluchové paměti
game_crime_scene_preloader_1=Poslechni si pozorně zvuky a zapamatuj si jejich pořadí.
game_crime_scene_preloader_2=Poté poskládej předměty z místa činu ve správném pořadí do pásu vpravo.
game_crime_scene_preloader_desktop_1=Poté poskládej předměty z místa činu ve správném pořadí do pásu vpravo. Akce můžeš přidat nebo odebrat dvojklikem myši.
game_runes_title = Symboly
game_runes_description = Procvičování zrakového rozlišování
game_runes_preloader1=Podívej se na symboly v\u00A0pásu vpravo.
......
......@@ -104,6 +104,7 @@ game_kidnapping_preloader3=Mit Kopfhörern hörst du die\u00A0Geräusche besser.
game_pursuit_title=Verfolgung
game_pursuit_description=Training der räumlichen Orientierung
game_pursuit_preloader=Stelle die\u00A0Karte zusammen, indem du einzelne Teile verschiebst und\u00A0drehst.
game_pursuit_preloader_desktop=Stelle die\u00A0Karte zusammen, indem du einzelne Teile verschiebst und\u00A0drehst. Die Teile kannst du mit einem Doppelklick oder der rechten Maustaste drehen.
game_night_watch_title=Wache
game_night_watch_description=Training des Sehgedächtnisses
game_night_watch_preloader=Pass auf, welche Fenster nach Einbruch der Dunkelheit leuchten und um wieviel Uhr.\r\n\r\nStelle nach Tageseinbruch in der Uhr die Zeit ein und markiere die Fenster, die geleuchtet haben.
......@@ -115,10 +116,12 @@ game_in_the_darkness_title=Im Dunkeln
game_in_the_darkness_description=Training der Serialität
game_in_the_darkness_preloader1=Plane Schritt für Schritt den\u00A0Weg duch das\u00A0Labyrinth.
game_in_the_darkness_preloader2=Ziehe die\u00A0richtigen Handlungen auf die\u00A0rechte Seite und\u00A0pass auf alle Hindernisse auf. Sobald du die\u00A0ganze Route geplant hast, drücke den\u00A0Knopf FERTIG.
game_in_the_darkness_preloader_desktop_1=Ziehe die\u00A0richtigen Handlungen auf die\u00A0rechte Seite und\u00A0pass auf alle Hindernisse auf. Sobald du die\u00A0ganze Route geplant hast, drücke den\u00A0Knopf FERTIG. *de* Akce můžeš přidat nebo odebrat dvojklikem myši.
game_crime_scene_title=Tatort
game_crime_scene_description=Training des auditiven Kurzzeitgedächtnisses
game_crime_scene_preloader_1=Hör dir die Geräusche aufmerksam an und merke dir ihre Reihenfolge.
game_crime_scene_preloader_2=Nimm dann die Gegenstände vom Tatort die die Geräusche erzeugt haben und lege sie in der richtigen Reihenfolge im rechten Balken ab.
game_crime_scene_preloader_desktop_1=Nimm dann die Gegenstände vom Tatort die die Geräusche erzeugt haben und lege sie in der richtigen Reihenfolge im rechten Balken ab. Akce můžeš přidat nebo odebrat dvojklikem myši.
game_runes_title=Symbole
game_runes_description=Training der Visuellen Unterscheidung
game_runes_preloader1=Sieh dir die Symbole auf dem rechten Balken an.
......
......@@ -98,12 +98,13 @@ game_robbery_description=Precvičovanie pracovnej pamäti
game_robbery_preloader=Prečítaj a zapamätaj si pravidlo, podľa ktorého spoznáš lupiča. Sleduj ľudí prichádzajúcich do miestnosti a dotykom lupiča označ.
game_kidnapping_title=Únos
game_kidnapping_description=Precvičovanie sluchového rozlišovania
game_kidnapping_preloader1=Vypočuj a\u00A0zapamätaj si zvuk, ktorý si počul na križovatke.
game_kidnapping_preloader1=Vypočuj a\u00A0zapamätaj si zvuk, ktorý si počul na ulici.
game_kidnapping_preloader2=Potom si vypočuj zvuky okolitých ulíc a\u00A0urči, ktorú ste prešli.
game_kidnapping_preloader3=So slúchadlami budeš zvuky počuť lepšie.
game_pursuit_title=Prenasledovanie
game_pursuit_description=Precvičovanie priestorovej orientácie
game_pursuit_preloader=Zostav mapu priemiestňovaniam a\u00A0otáčaniam jednotlivých dielcov.
game_pursuit_preloader_desktop=Zostav mapu priemiestňovaniam a\u00A0otáčaniam jednotlivých dielcov. Diely môžeš otáčať dvojklikom alebo pravým tlačidlom myši.
game_night_watch_title=Hliadka
game_night_watch_description=Precvičovanie zrakovej pamäti
game_night_watch_preloader=Dávaj pozor, ktoré okná sa po zotmení rozsvietia a\u00A0o\u00A0ktorej hodine.\r\n\r\nPo svitaní nastav na hodinách čas a\u00A0označ okná, ktoré boli rozsvietené.
......@@ -115,10 +116,12 @@ game_in_the_darkness_title=Potme
game_in_the_darkness_description=Precvičovanie seriality
game_in_the_darkness_preloader1=Naplánuj krok za krokom prechod labyrintom.
game_in_the_darkness_preloader2=Preťahuj správne úkony do pásu vpravo a\u00A0dávaj pozor na všetky prekážky. Až keď budeš mať naplánovanú celú trasu, stlač tlačítko HOTOVO.
game_in_the_darkness_preloader_desktop_1=Preťahuj správne úkony do pásu vpravo a\u00A0dávaj pozor na všetky prekážky. Až keď budeš mať naplánovanú celú trasu, stlač tlačítko HOTOVO. Akce můžeš přidat nebo odebrat dvojklikem myši.
game_crime_scene_title=Miesto činu
game_crime_scene_description=Precvičovanie sluchovej pamäte
game_crime_scene_preloader_1=Vypočuj si pozorne zvuky a zapamätaj si ich poradie.
game_crime_scene_preloader_2=Potom poskladaj predmety z miesta činu v správnom poradí do pásu vpravo.
game_crime_scene_preloader_desktop_1=Potom poskladaj predmety z miesta činu v správnom poradí do pásu vpravo. Akce můžeš přidat nebo odebrat dvojklikem myši.
game_runes_title=Symboly
game_runes_description=Precvičovanie zrakového rozlišovania
game_runes_preloader1=Pozri sa na symboly v páse vpravo.
......
......@@ -97,7 +97,7 @@ spatial_orientation=Priestorová orientácia
spatial_orientation_definition=Orientácia v priestore znamená uvedomenie si pozície vľavo, vpravo, vpredu, vzadu, hore, dole a správne určenie smeru.
spatial_orientation_paragraph_1=Niektorí ľudia s dyslexiou (neplatí to samozrejme všeobecne pre všetkých) čelia v tejto oblasti určitým oslabeniam. Je pre nich ťažšie rýchlo určiť, kde je napravo a naľavo. Keď sa ocitnú v novom prostredí, nepamätajú si trasu akou prišli, nedokázali by bez pomoci znovu nájsť cestu a podobne. Často sa im stáva, že sa niekde stratia, prichádzajú neskôr, pretože si neuvedomili, že majú odbočiť, nedokážu nájsť rovnakú cestu späť, nepamätajú si, kde zaparkovali auto a podobne. Orientáciu v priestore však potrebujeme tiež preto, aby sme sa dokázali správne orientovať na stránke v texte, aby sme si uvedomili, že čítame vždy sprava doľava, odhora dole či akým smerom vedieme čiaru pri písaní.
spatial_orientation_paragraph_1=Niektorí ľudia s dyslexiou (neplatí to samozrejme všeobecne pre všetkých) čelia v tejto oblasti určitým oslabeniam. Je pre nich ťažšie rýchlo určiť, kde je napravo a naľavo. Keď sa ocitnú v novom prostredí, nepamätajú si trasu akou prišli, nedokázali by bez pomoci znovu nájsť cestu a podobne. Často sa im stáva, že sa niekde stratia, prichádzajú neskôr, pretože si neuvedomili, že majú odbočiť, nedokážu nájsť rovnakú cestu späť, nepamätajú si, kde zaparkovali auto a podobne. Orientáciu v priestore však potrebujeme tiež preto, aby sme sa dokázali správne orientovať na stránke v texte, aby sme si uvedomili, že čítame vždy zľava doprava, odhora dole či akým smerom vedieme čiaru pri písaní.
spatial_orientation_paragraph_2=Priestorovú orientáciu je tiež možné veľmi dobre trénovať. Aj ľudia, ktorí nemajú žiadny orientačný zmysel sa v priestore môžu naučiť orientovať, ale vyžaduje to viac úsilia, driny, tréningu a cieleného premýšľania o priestore okolo nás. Ak rezignujeme a budeme iba hlásať, že priestorovú orientáciu nemáme, pravdepodobne to tak aj ostane. Medzi najjednoduchšie postupy na začiatku tréningu môžu patriť zámerné vyhľadávania nápovedí (bodov a miest v okolí), ktoré nám umožnia cielene sledovať, kam ideme a čo bolo v okolí. Tomu cieľu je však potrebné venovať pozornosť! Inou užitočnou nápoveďou môže byť uvedomenie si, kde majú ľudia srdce, keď sa nich dívame. Skoro každý z nás to dokáže určiť a spoznať, jednoducho to na ľuďoch vidíme. Je to ich ľavá strana, od ktorej môžeme odvodiť, ktorá je tá line 83pravá a tým pádom čo je naľavo, napravo, pred a za dotyčnou osobou.
......
......@@ -29,6 +29,10 @@ import net.engio.mbassy.bus.error.IPublicationErrorHandler;
import net.engio.mbassy.bus.error.PublicationError;
import net.engio.mbassy.listener.Handler;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.PrintStream;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
......@@ -38,6 +42,7 @@ import java.util.concurrent.CountDownLatch;
import cz.nic.tablexia.bus.ApplicationBus;
import cz.nic.tablexia.bus.ApplicationBus.ApplicationEvent;
import cz.nic.tablexia.game.ranksystem.UserRankManager;
import cz.nic.tablexia.loader.TablexiaAbstractFileManager;
import cz.nic.tablexia.loader.application.ApplicationAtlasManager;
import cz.nic.tablexia.loader.application.ApplicationAvatarManager;
import cz.nic.tablexia.loader.application.TablexiaBadgesManager;
......@@ -54,6 +59,7 @@ import cz.nic.tablexia.screen.loader.IConnectionManager;
import cz.nic.tablexia.util.CameraOpener;
import cz.nic.tablexia.util.IFileSystemManager;
import cz.nic.tablexia.util.Log;
import cz.nic.tablexia.util.TeeStream;
import cz.nic.tablexia.util.Utility;
import cz.nic.tablexia.util.ui.button.StandardTablexiaButton;
import cz.nic.tablexia.util.ui.QRCodeScanner;
......@@ -97,6 +103,8 @@ public class Tablexia extends TablexiaApplication {
private static final boolean LOADER_ERROR_DIALOG_HIDE_ANIMATION = false;
private static final String LOG_FILE_NAME = "session.log";
private static IConnectionManager connectionManager;
private static CameraOpener cameraOpener;
private static IFileSystemManager fileSystemManager;
......@@ -115,6 +123,8 @@ public class Tablexia extends TablexiaApplication {
private TablexiaComponentDialog errorDialog;
private TablexiaComponentDialog languageDialog;
private String sentryDSN;
public static class SQLConnectionType {
private String driver;
......@@ -142,22 +152,41 @@ public class Tablexia extends TablexiaApplication {
this.qrCodeScanner = qrCodeScanner;
this.sqlConnectionType = sqlConnectionType;
this.cameraOpener = cameraOpener;
this.sentryDSN = sentryDSN;
TablexiaSettings.init(buildType, systemLocale, hasSoftBackButton, supportAlternativeControls, hwSerial);
}
private void initializeBugReporting() {
if(TablexiaSettings.getInstance().getBuildType().isBugReport()) {
@SuppressWarnings("ConstantConditions")
String DSN = (TablexiaBuildConfig.SENTRY_DSN_FALLBACK == null || sentryDSN == null || TablexiaBuildConfig.SENTRY_DSN_FALLBACK.equals(sentryDSN)) ? null : sentryDSN;
TablexiaRaven.start(DSN);
// register error handler for exceptions in event bus handler methods
ApplicationBus.getInstance().addErrorHandler(new IPublicationErrorHandler() {
@Override
public void handleError(PublicationError error) {
Log.err(ApplicationBus.class, error.getMessage(), error.getCause());
TablexiaRaven.sendCustomException(TablexiaRaven.ExceptionType.JavaApplicationBusException, error.getMessage(), error.getCause());
}
});
}
}
// register error handler for exceptions in event bus handler methods
ApplicationBus.getInstance().addErrorHandler(new IPublicationErrorHandler() {
@Override
public void handleError(PublicationError error) {
Log.err(ApplicationBus.class, error.getMessage(), error.getCause());
TablexiaRaven.sendCustomException(TablexiaRaven.ExceptionType.JavaApplicationBusException, error.getMessage(), error.getCause());
private void initializeLogging() {
if(TablexiaSettings.getInstance().getBuildType().isLogFile()) {
try {
File file = new File(TablexiaAbstractFileManager.RootStorageType.LOCAL.getStoragePath(), LOG_FILE_NAME);
if(file.exists()) file.mkdirs();
PrintStream stream = new PrintStream(new FileOutputStream(file));
TeeStream teeStream = new TeeStream(System.out, stream);
System.setOut(new PrintStream(teeStream));
} catch (FileNotFoundException e) {
Log.info(getClass(), "Cannot create a log file!");
e.printStackTrace();
}
});
}
}
private void loadingComplete() {
......@@ -371,6 +400,9 @@ public class Tablexia extends TablexiaApplication {
public void create() {
super.create();
initializeBugReporting();
initializeLogging();
TablexiaRaven.sendSavedReports();
// init data storage
......
......@@ -199,7 +199,7 @@ public class TablexiaRaven {
public void storeRavenEvent(Event event) {
try {
String fileName = (HIDE_REPORT_FILES ? "" : "") + event.getId().toString() + REPORT_FILE_EXTENSION;
String fileName = (HIDE_REPORT_FILES ? "." : "") + event.getId().toString() + REPORT_FILE_EXTENSION;
File dir = TablexiaAbstractFileManager.getFileStoragePathFileHandle(ReportStorageType.EXTERNAL).file();
if(!dir.exists()) dir.mkdir();
......
......@@ -123,10 +123,10 @@ public class TablexiaSettings {
public enum BuildType {
// boxes aInfo sInfo dMenu btName bReport debugBtn syncDTB
RELEASE (1, "release", false, false, false, false, false, true, false, true, Log.TablexiaLogLevel.ERROR),
DEBUG (2, "debug", false, true, true, true, true, true, true, true, Log.TablexiaLogLevel.DEBUG),
DEVEL (3, "devel", true, true, true, true, true, false, true, true, Log.TablexiaLogLevel.DEBUG),
ITEST (4, "itest", false, true, true, false, true, false, false, false, Log.TablexiaLogLevel.DEBUG);
RELEASE (1, "release", false, false, false, false, false, true, false, true, false, Log.TablexiaLogLevel.ERROR),
DEBUG (2, "debug", false, true, true, true, true, true, true, true, true, Log.TablexiaLogLevel.DEBUG),
DEVEL (3, "devel", true, true, true, true, true, false, true, true, true, Log.TablexiaLogLevel.DEBUG),
ITEST (4, "iTest", false, true, true, false, true, false, false, false, false, Log.TablexiaLogLevel.DEBUG);
private final static BuildType FALLBACK_VARIANT = BuildType.DEVEL;
......@@ -140,10 +140,11 @@ public class TablexiaSettings {
private boolean bugReport;
private boolean showDebugButtons;
private boolean syncWithDTB;
private boolean logFile;
private final Log.TablexiaLogLevel logLevel;
BuildType(int id, String key, boolean boundingBoxes, boolean applicationInfo, boolean screenInfo, boolean debugMenu, boolean showBuildTypeInName, boolean bugReport, boolean showDebugButtons, boolean syncWithDTB, Log.TablexiaLogLevel logLevel) {
BuildType(int id, String key, boolean boundingBoxes, boolean applicationInfo, boolean screenInfo, boolean debugMenu, boolean showBuildTypeInName, boolean bugReport, boolean showDebugButtons, boolean syncWithDTB, boolean logFile, Log.TablexiaLogLevel logLevel) {
this.id = id;
this.key = key;
this.boundingBoxes = boundingBoxes;
......@@ -154,6 +155,7 @@ public class TablexiaSettings {
this.bugReport = bugReport;
this.showDebugButtons = showDebugButtons;
this.syncWithDTB = syncWithDTB;
this.logFile = logFile;
this.logLevel = logLevel;
}
......@@ -197,6 +199,8 @@ public class TablexiaSettings {
return syncWithDTB;
}
public boolean isLogFile() { return logFile; }
public Log.TablexiaLogLevel getLogLevel() {
return logLevel;
}
......
......@@ -39,27 +39,31 @@ import java.util.Timer;
import java.util.TimerTask;
import cz.nic.tablexia.TablexiaApplication;
import cz.nic.tablexia.TablexiaSettings;
import cz.nic.tablexia.game.AbstractTablexiaGame;
import cz.nic.tablexia.game.difficulty.GameDifficulty;
import cz.nic.tablexia.game.games.crime_scene.actors.PlaySoundScreen;
import cz.nic.tablexia.game.games.crime_scene.assets.CrimeSceneAssets;
import cz.nic.tablexia.game.games.crime_scene.listeners.CrimeSceneDragListener;
import cz.nic.tablexia.game.games.crime_scene.gameobject.GameObject;
import cz.nic.tablexia.game.games.crime_scene.gameobject.GameObjectType;
import cz.nic.tablexia.game.games.crime_scene.model.*;
import cz.nic.tablexia.game.games.crime_scene.listeners.CrimeSceneDragListener;
import cz.nic.tablexia.game.games.crime_scene.listeners.DesktopCrimeSceneDragListener;
import cz.nic.tablexia.game.games.crime_scene.model.CrimeSceneDifficulty;
import cz.nic.tablexia.game.games.crime_scene.model.CrimeSceneGameState;
import cz.nic.tablexia.game.games.crime_scene.model.LevelDefinition;
import cz.nic.tablexia.game.games.crime_scene.model.ResultMapping;
import cz.nic.tablexia.loader.application.ApplicationAtlasManager;
import cz.nic.tablexia.loader.application.ApplicationInternalTextureManager;
import cz.nic.tablexia.screen.AbstractTablexiaScreen;
import cz.nic.tablexia.loader.application.ApplicationTextManager;
import cz.nic.tablexia.shared.model.Game;
import cz.nic.tablexia.shared.model.resolvers.CrimeSceneScoreResolver;
import cz.nic.tablexia.util.ScaleUtil;
import cz.nic.tablexia.util.ui.AnimatedImage;
import cz.nic.tablexia.util.ui.actionwidget.Action;
import cz.nic.tablexia.util.ui.actionwidget.ActionContainer;
import cz.nic.tablexia.util.ui.actionwidget.ActionsStripWidget;
import cz.nic.tablexia.util.ui.button.GameImageTablexiaButton;
import cz.nic.tablexia.util.ui.button.TablexiaButton;
import cz.nic.tablexia.util.ui.actionwidget.ActionsStripWidget;
import cz.nic.tablexia.loader.application.ApplicationTextManager;
import cz.nic.tablexia.shared.model.Game;
import cz.nic.tablexia.util.ui.dialog.components.AnimatedImageContentDialogComponent;
import cz.nic.tablexia.util.ui.dialog.components.FixedSpaceContentDialogComponent;
import cz.nic.tablexia.util.ui.dialog.components.TablexiaDialogComponentAdapter;
......@@ -199,6 +203,12 @@ public class CrimeSceneGame extends AbstractTablexiaGame<CrimeSceneGameState> {
setUpSizeAndPositionOfComponents();
}
@Override
public void setScrollableLayoutFocus() {
if(actionsStripWidget != null)
actionsStripWidget.setScrollFocus();
}
@Override
protected List<SummaryMessage> getSummaryMessageForGameResult(Game game) {
return Arrays.asList(new SummaryMessage(SummaryImage.STATS,
......@@ -319,6 +329,15 @@ public class CrimeSceneGame extends AbstractTablexiaGame<CrimeSceneGameState> {
}
}
}
@Override
public void onActionDoubleTap(Action action) {
if (!TablexiaSettings.getInstance().isRunningOnMobileDevice()) {
removeActionAndUpdateView(action.getOrderNumber());
addGameObject(createGameObject(GameObjectType.getGameObjectTypeForActionNumber(action.getActionNumber())));
if (actionsStripWidget.isNotFull()) startButton.setEnabled(false);
}
}
};
actionsStripWidget.setPosition(getViewportWidth() - ACTIONS_PANEL_WIDTH, getViewportBottomY());
actionsStripWidget.setSize(ACTIONS_PANEL_WIDTH, getViewportHeight());
......@@ -423,7 +442,9 @@ public class CrimeSceneGame extends AbstractTablexiaGame<CrimeSceneGameState> {
}
private void setHighLightGameObjectListener(GameObject gameObject) {
gameObject.addListener(new CrimeSceneDragListener(gameObject, this));
gameObject.addListener(TablexiaSettings.getInstance().isRunningOnMobileDevice() ?
new CrimeSceneDragListener(gameObject, this) :
new DesktopCrimeSceneDragListener(gameObject, this));
}
public void resolveClickOnGameObject(GameObject gameObject, float clickX, float clickY) {
......@@ -605,6 +626,13 @@ public class CrimeSceneGame extends AbstractTablexiaGame<CrimeSceneGameState> {
music.dispose();
}
}
public void addGameObjectToStrip(GameObject gameObject){
removeDuplicateObject(gameObject);
gameObject.changeToCardDrawable();
actionsStripWidget.addSelectedAction(GameObjectType.getGameObjectTypeForActionNumber(gameObject.getAction().getActionNumber()).getActionTexturePath(), actionsStripWidget.getSelectedActions().size(), this, gameObject.getAction().getActionNumber());
}
////////////////////// SET EVENT FOR TESTING
public void setPlayStopEvent(){
......@@ -652,7 +680,7 @@ public class CrimeSceneGame extends AbstractTablexiaGame<CrimeSceneGameState> {
return highlightedGameObject;
}
private void setHighlightedGameObject(GameObject highlightedGameObject) {
public void setHighlightedGameObject(GameObject highlightedGameObject) {
this.highlightedGameObject = highlightedGameObject;
}
......@@ -669,8 +697,9 @@ public class CrimeSceneGame extends AbstractTablexiaGame<CrimeSceneGameState> {
private static final int PRELOADER_ANIM_2_FRAMES = 18;
private static final float PRELOADER_ANIM_2_FRAME_DURATION = 2 / 5f;
private static final String PRELOADER_TEXT_KEY_1 = ApplicationTextManager.ApplicationTextsAssets.CRIME_SCENE_GAME_PRELOADER_TEXT_1;
private static final String PRELOADER_TEXT_KEY_2 = ApplicationTextManager.ApplicationTextsAssets.CRIME_SCENE_GAME_PRELOADER_TEXT_2;
private static final String PRELOADER_TEXT_KEY_1 = ApplicationTextManager.ApplicationTextsAssets.GAME_CRIME_SCENE_PRELOADER_TEXT_1;
private static final String PRELOADER_TEXT_KEY_2 = ApplicationTextManager.ApplicationTextsAssets.GAME_CRIME_SCENE_PRELOADER_TEXT_2;
private static final String PRELOADER_TEXT_KEY_2_DESKTOP = ApplicationTextManager.ApplicationTextsAssets.GAME_CRIME_SCENE_PRELOADER_TEXT_2_DESKTOP;
private static final Scaling PRELOADER_IMAGE_SCALING = Scaling.fit;
private static final int PRELOADER_TEXT_ALIGN = Align.left;
......@@ -698,7 +727,7 @@ public class CrimeSceneGame extends AbstractTablexiaGame<CrimeSceneGameState> {
AnimatedImage preloaderImage2 = new AnimatedImage(preloaderAssetsManager.getAnimation(PRELOADER_ANIM_2_IMAGE, PRELOADER_ANIM_2_FRAMES, PRELOADER_ANIM_2_FRAME_DURATION), false);
preloaderImage2.startAnimationLoop();
String preloaderText2 = preloaderAssetsManager.getText(PRELOADER_TEXT_KEY_2);
String preloaderText2 = TablexiaSettings.getInstance().isRunningOnMobileDevice() ? preloaderAssetsManager.getText(PRELOADER_TEXT_KEY_2) : preloaderAssetsManager.getText(PRELOADER_TEXT_KEY_2_DESKTOP);
components.add(new TwoColumnContentDialogComponent(
new TextContentDialogComponent(preloaderText2, PRELOADER_TEXT_ALIGN, PRELOADER_TEXT_PADDING),
new AnimatedImageContentDialogComponent(preloaderImage2, PRELOADER_IMAGE_SCALING),
......@@ -706,4 +735,5 @@ public class CrimeSceneGame extends AbstractTablexiaGame<CrimeSceneGameState> {
PRELOADER_IMAGE_COLUMN_WIDTH_RATIO,
PRELOADER_ROW_HEIGHT));
}
}
\ No newline at end of file
......@@ -28,8 +28,8 @@ import cz.nic.tablexia.util.ui.actionwidget.Action;
*/
class CrimeSceneAction extends Action {
private final GameObject gameObject;
private final int actionCardSize;
protected final GameObject gameObject;
protected final int actionCardSize;
public CrimeSceneAction(String texturePath, int orderNumber, int actionSize, AbstractTablexiaGame tablexiaGame, int actionNumber, GameObject gameObject) {
super(texturePath, orderNumber, actionSize, 0, 0, true, tablexiaGame, actionNumber);
......
/*
*
* * Copyright (C) 2017 CZ.NIC, z.s.p.o. (http://www.nic.cz/)
* *
* * This program is free software: you can redistribute it and/or modify
* * it under the terms of the GNU General Public License as published by
* * the Free Software Foundation, either version 3 of the License, or
* * (at your option) any later version.
* *
* * This program is distributed in the hope that it will be useful,
* * but WITHOUT ANY WARRANTY; without even the implied warranty of
* * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* * GNU General Public License for more details.
* *
* * You should have received a copy of the GNU General Public License
* * along with this program. If not, see <http://www.gnu.org/licenses/>.
* *
*
*/
package cz.nic.tablexia.game.games.crime_scene.gameobject;
import com.badlogic.gdx.scenes.scene2d.InputEvent;
import com.badlogic.gdx.scenes.scene2d.utils.DragListener;
import com.badlogic.gdx.utils.Timer;
import cz.nic.tablexia.game.AbstractTablexiaGame;
import cz.nic.tablexia.util.entity.Touch;
class DesktopCrimeSceneAction extends CrimeSceneAction {
private static final float DELAY = 0.15f;
private Touch lastRecordedTouchDown;
private boolean lastTapValid;
private Touch lastRecordedTap;
private Timer timer;
private boolean delayedActionStarted = false;
public DesktopCrimeSceneAction(String texturePath, int orderNumber, int actionSize, AbstractTablexiaGame tablexiaGame, int actionNumber, GameObject gameObject) {
super(texturePath, orderNumber, actionSize, tablexiaGame, actionNumber, gameObject);
timer = new Timer();
}
@Override
public void setDragListener() {
addListener(new DragListener() {
@Override
public boolean touchDown(InputEvent event, float x, float y, int pointer, int button) {
lastRecordedTouchDown = new Touch(event.getListenerActor(), System.currentTimeMillis());
setDelayedActionStarted(false);
timer.scheduleTask(new Timer.Task() {
@Override
public void run() {
setDelayedActionStarted(true);
downAction(x, y, true);
}
}, DELAY);
return true;
}
@Override
public void touchUp(InputEvent event, float x, float y, int pointer, int button) {
timer.clear();
Touch touchUp = new Touch(event.getListenerActor(), System.currentTimeMillis());
lastTapValid = Touch.isTap(lastRecordedTouchDown, touchUp);
if (lastTapValid) {
if (lastRecordedTap == null) {
lastRecordedTap = touchUp;
} else {
if (Touch.isDoubleTap(lastRecordedTap, touchUp)) {
timer.clear();
lastRecordedTap = null;
} else {
lastRecordedTap = touchUp;
resetDelayedUpAction();
}
}
} else {
if (gameObject.isDragging()) {
if (isDelayedActionStarted()) {
upAction(false);
} else {
gameObject.resetPosition();
}
}
}
}
@Override
public void touchDragged(InputEvent event, float x, float y, int pointer) {
dragAction(x, y);
}
});
}
private void resetDelayedUpAction() {
timer.clear();
timer.scheduleTask(new Timer.Task() {
@Override
public void run() {
upAction(false);
}
}, DELAY);
}
private synchronized void setDelayedActionStarted(boolean value) {
delayedActionStarted = value;
}
private synchronized boolean isDelayedActionStarted() {
return delayedActionStarted;
}
}
\ No newline at end of file
......@@ -20,6 +20,7 @@ package cz.nic.tablexia.game.games.crime_scene.gameobject;
import com.badlogic.gdx.scenes.scene2d.Group;
import com.badlogic.gdx.scenes.scene2d.utils.TextureRegionDrawable;
import cz.nic.tablexia.TablexiaSettings;
import cz.nic.tablexia.game.games.crime_scene.CrimeSceneGame;
import cz.nic.tablexia.util.ui.actionwidget.Action;
import cz.nic.tablexia.util.ui.actionwidget.ActionsStripWidget;
......@@ -51,7 +52,8 @@ public class GameObject extends Group implements Action.ActionListener {
}
private void createGameObject(final int actionCardSize) {
action = new CrimeSceneAction(gameObjectType.getResource(), 0, actionCardSize, crimeSceneGame, gameObjectType.getActionNumber(), this);
action = TablexiaSettings.getInstance().isRunningOnMobileDevice() ? new CrimeSceneAction(gameObjectType.getResource(), 0, actionCardSize, crimeSceneGame, gameObjectType.getActionNumber(), this) :
new DesktopCrimeSceneAction(gameObjectType.getResource(), 0, actionCardSize, crimeSceneGame, gameObjectType.getActionNumber(), this);
action.getListeners().removeAll(action.getListeners(), false);
action.setDragListener();
action.addActionListener(this);
......@@ -66,11 +68,15 @@ public class GameObject extends Group implements Action.ActionListener {
changeToCardDrawable();
}
@Override
public void onActionDoubleTap(Action action) {
}
@Override
public void onActionDrop(Action action, int collidesWithNumber) {
if (collidesWithNumber != Action.NO_COLLISION_NUMBER) {
// FIXME: 10/30/17 why to store action number if using ordinal?
if (!crimeSceneGame.isActionAdded(action)) actionsStripWidget.addSelectedAction(GameObjectType.values()[action.getActionNumber()].getActionTexturePath(), collidesWithNumber, crimeSceneGame, action.getActionNumber());
if (!actionsStripWidget.isNotFull()) crimeSceneGame.getStartButton().setEnabled(true);
......@@ -91,10 +97,16 @@ public class GameObject extends Group implements Action.ActionListener {
}
private void changeToCardDrawable() {
public void changeToCardDrawable() {
action.setDrawable(new TextureRegionDrawable(crimeSceneGame.getScreenTextureRegion(gameObjectType.getActionTexturePath())));
action.setSize(CrimeSceneGame.ACTION_CARD_DRAG_SIZE, CrimeSceneGame.ACTION_CARD_DRAG_SIZE);
}
public void resetPosition(){
crimeSceneGame.setHighlightedGameObject(this);
crimeSceneGame.highlightGameObject(this);
onActionDrop(action, Action.NO_COLLISION_NUMBER);
}
public Action getAction() {
return action;
......@@ -125,4 +137,5 @@ public class GameObject extends Group implements Action.ActionListener {
public Position getMapPosition() {
return mapPosition;
}
}
\ No newline at end of file
......@@ -30,8 +30,8 @@ public class CrimeSceneDragListener extends DragListener {
private static final int DRAG_THRESHOLD = 10;
private int dragDeltaTime = 0;
private GameObject gameObject;
private CrimeSceneGame crimeSceneGame;
protected GameObject gameObject;
protected CrimeSceneGame crimeSceneGame;
public CrimeSceneDragListener(GameObject gameObject, CrimeSceneGame crimeSceneGame) {
this.gameObject = gameObject;
......@@ -61,13 +61,13 @@ public class CrimeSceneDragListener extends DragListener {
* users touch or drag on screen
* @param gameObject dragged game object
*/
private void increaseDragDeltaTime(GameObject gameObject) {
protected void increaseDragDeltaTime(GameObject gameObject) {
if(dragDeltaTime++ == DRAG_THRESHOLD) {
gameObject.setDragging(true);
}
}
private void resetDragDeltaTime() {
protected void resetDragDeltaTime() {
dragDeltaTime = 0;
}
}
/*
*
* * Copyright (C) 2017 CZ.NIC, z.s.p.o. (http://www.nic.cz/)
* *
* * This program is free software: you can redistribute it and/or modify
* * it under the terms of the GNU General Public License as published by
* * the Free Software Foundation, either version 3 of the License, or
* * (at your option) any later version.
* *
* * This program is distributed in the hope that it will be useful,
* * but WITHOUT ANY WARRANTY; without even the implied warranty of
* * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* * GNU General Public License for more details.
* *
* * You should have received a copy of the GNU General Public License
* * along with this program. If not, see <http://www.gnu.org/licenses/>.
* *
*
*/
package cz.nic.tablexia.game.games.crime_scene.listeners;
import com.badlogic.gdx.scenes.scene2d.InputEvent;
import com.badlogic.gdx.utils.Timer;