├── .gitignore ├── .travis.yml ├── CHANGELOG.md ├── README.md ├── android.jks.enc ├── android ├── AndroidManifest.xml ├── assets │ ├── backgrounds │ │ ├── background1.png │ │ └── background2.png │ ├── decks │ │ ├── fra │ │ │ ├── 10c.png │ │ │ ├── 10d.png │ │ │ ├── 10h.png │ │ │ ├── 10s.png │ │ │ ├── 11c.png │ │ │ ├── 11d.png │ │ │ ├── 11h.png │ │ │ ├── 11s.png │ │ │ ├── 12c.png │ │ │ ├── 12d.png │ │ │ ├── 12h.png │ │ │ ├── 12s.png │ │ │ ├── 13c.png │ │ │ ├── 13d.png │ │ │ ├── 13h.png │ │ │ ├── 13s.png │ │ │ ├── 1c.png │ │ │ ├── 1d.png │ │ │ ├── 1h.png │ │ │ ├── 1s.png │ │ │ ├── 2c.png │ │ │ ├── 2d.png │ │ │ ├── 2h.png │ │ │ ├── 2s.png │ │ │ ├── 3c.png │ │ │ ├── 3d.png │ │ │ ├── 3h.png │ │ │ ├── 3s.png │ │ │ ├── 4c.png │ │ │ ├── 4d.png │ │ │ ├── 4h.png │ │ │ ├── 4s.png │ │ │ ├── 5c.png │ │ │ ├── 5d.png │ │ │ ├── 5h.png │ │ │ ├── 5s.png │ │ │ ├── 6c.png │ │ │ ├── 6d.png │ │ │ ├── 6h.png │ │ │ ├── 6s.png │ │ │ ├── 7c.png │ │ │ ├── 7d.png │ │ │ ├── 7h.png │ │ │ ├── 7s.png │ │ │ ├── 8c.png │ │ │ ├── 8d.png │ │ │ ├── 8h.png │ │ │ ├── 8s.png │ │ │ ├── 9c.png │ │ │ ├── 9d.png │ │ │ ├── 9h.png │ │ │ ├── 9s.png │ │ │ └── back.png │ │ ├── int │ │ │ ├── 10c.png │ │ │ ├── 10d.png │ │ │ ├── 10h.png │ │ │ ├── 10s.png │ │ │ ├── 11c.png │ │ │ ├── 11d.png │ │ │ ├── 11h.png │ │ │ ├── 11s.png │ │ │ ├── 12c.png │ │ │ ├── 12d.png │ │ │ ├── 12h.png │ │ │ ├── 12s.png │ │ │ ├── 13c.png │ │ │ ├── 13d.png │ │ │ ├── 13h.png │ │ │ ├── 13s.png │ │ │ ├── 1c.png │ │ │ ├── 1d.png │ │ │ ├── 1h.png │ │ │ ├── 1s.png │ │ │ ├── 2c.png │ │ │ ├── 2d.png │ │ │ ├── 2h.png │ │ │ ├── 2s.png │ │ │ ├── 3c.png │ │ │ ├── 3d.png │ │ │ ├── 3h.png │ │ │ ├── 3s.png │ │ │ ├── 4c.png │ │ │ ├── 4d.png │ │ │ ├── 4h.png │ │ │ ├── 4s.png │ │ │ ├── 5c.png │ │ │ ├── 5d.png │ │ │ ├── 5h.png │ │ │ ├── 5s.png │ │ │ ├── 6c.png │ │ │ ├── 6d.png │ │ │ ├── 6h.png │ │ │ ├── 6s.png │ │ │ ├── 7c.png │ │ │ ├── 7d.png │ │ │ ├── 7h.png │ │ │ ├── 7s.png │ │ │ ├── 8c.png │ │ │ ├── 8d.png │ │ │ ├── 8h.png │ │ │ ├── 8s.png │ │ │ ├── 9c.png │ │ │ ├── 9d.png │ │ │ ├── 9h.png │ │ │ ├── 9s.png │ │ │ └── back.png │ │ ├── psu │ │ │ ├── 10c.png │ │ │ ├── 10d.png │ │ │ ├── 10h.png │ │ │ ├── 10s.png │ │ │ ├── 11c.png │ │ │ ├── 11d.png │ │ │ ├── 11h.png │ │ │ ├── 11s.png │ │ │ ├── 12c.png │ │ │ ├── 12d.png │ │ │ ├── 12h.png │ │ │ ├── 12s.png │ │ │ ├── 13c.png │ │ │ ├── 13d.png │ │ │ ├── 13h.png │ │ │ ├── 13s.png │ │ │ ├── 1c.png │ │ │ ├── 1d.png │ │ │ ├── 1h.png │ │ │ ├── 1s.png │ │ │ ├── 2c.png │ │ │ ├── 2d.png │ │ │ ├── 2h.png │ │ │ ├── 2s.png │ │ │ ├── 3c.png │ │ │ ├── 3d.png │ │ │ ├── 3h.png │ │ │ ├── 3s.png │ │ │ ├── 4c.png │ │ │ ├── 4d.png │ │ │ ├── 4h.png │ │ │ ├── 4s.png │ │ │ ├── 5c.png │ │ │ ├── 5d.png │ │ │ ├── 5h.png │ │ │ ├── 5s.png │ │ │ ├── 6c.png │ │ │ ├── 6d.png │ │ │ ├── 6h.png │ │ │ ├── 6s.png │ │ │ ├── 7c.png │ │ │ ├── 7d.png │ │ │ ├── 7h.png │ │ │ ├── 7s.png │ │ │ ├── 8c.png │ │ │ ├── 8d.png │ │ │ ├── 8h.png │ │ │ ├── 8s.png │ │ │ ├── 9c.png │ │ │ ├── 9d.png │ │ │ ├── 9h.png │ │ │ ├── 9s.png │ │ │ └── back.png │ │ └── rus │ │ │ ├── 10c.png │ │ │ ├── 10d.png │ │ │ ├── 10h.png │ │ │ ├── 10s.png │ │ │ ├── 11c.png │ │ │ ├── 11d.png │ │ │ ├── 11h.png │ │ │ ├── 11s.png │ │ │ ├── 12c.png │ │ │ ├── 12d.png │ │ │ ├── 12h.png │ │ │ ├── 12s.png │ │ │ ├── 13c.png │ │ │ ├── 13d.png │ │ │ ├── 13h.png │ │ │ ├── 13s.png │ │ │ ├── 1c.png │ │ │ ├── 1d.png │ │ │ ├── 1h.png │ │ │ ├── 1s.png │ │ │ ├── 2c.png │ │ │ ├── 2d.png │ │ │ ├── 2h.png │ │ │ ├── 2s.png │ │ │ ├── 3c.png │ │ │ ├── 3d.png │ │ │ ├── 3h.png │ │ │ ├── 3s.png │ │ │ ├── 4c.png │ │ │ ├── 4d.png │ │ │ ├── 4h.png │ │ │ ├── 4s.png │ │ │ ├── 5c.png │ │ │ ├── 5d.png │ │ │ ├── 5h.png │ │ │ ├── 5s.png │ │ │ ├── 6c.png │ │ │ ├── 6d.png │ │ │ ├── 6h.png │ │ │ ├── 6s.png │ │ │ ├── 7c.png │ │ │ ├── 7d.png │ │ │ ├── 7h.png │ │ │ ├── 7s.png │ │ │ ├── 8c.png │ │ │ ├── 8d.png │ │ │ ├── 8h.png │ │ │ ├── 8s.png │ │ │ ├── 9c.png │ │ │ ├── 9d.png │ │ │ ├── 9h.png │ │ │ ├── 9s.png │ │ │ └── back.png │ ├── fonts │ │ └── 8835.otf │ ├── holidays │ │ ├── hammersickle.png │ │ └── santahat.png │ ├── i18n │ │ ├── OpenFool.properties │ │ ├── OpenFool_cs.properties │ │ ├── OpenFool_de.properties │ │ ├── OpenFool_en.properties │ │ └── OpenFool_ru.properties │ ├── logos │ │ ├── logo.png │ │ ├── logo.xcf │ │ ├── logo0.png │ │ ├── logo0.xcf │ │ ├── logo_128.png │ │ ├── logo_16.png │ │ ├── logo_32.png │ │ └── mm_logo.png │ ├── suits │ │ ├── clubs.png │ │ ├── diamonds.png │ │ ├── hearts.png │ │ └── spades.png │ └── ui │ │ ├── font-24.fnt │ │ ├── font-24_0.png │ │ ├── temp-skin.atlas │ │ ├── temp-skin.json │ │ ├── temp-skin.png │ │ └── temp-skin.usl ├── build.gradle ├── ic_launcher-web.png ├── proguard-project.txt ├── project.properties ├── res │ ├── drawable-hdpi │ │ └── ic_launcher.png │ ├── drawable-mdpi │ │ └── ic_launcher.png │ ├── drawable-xhdpi │ │ └── ic_launcher.png │ ├── drawable-xxhdpi │ │ └── ic_launcher.png │ ├── drawable-xxxhdpi │ │ └── ic_launcher.png │ └── values │ │ ├── strings.xml │ │ └── styles.xml └── src │ └── ru │ └── hyst329 │ └── openfool │ ├── AndroidLauncher.kt │ └── AndroidOrientationHelper.kt ├── build.gradle ├── core ├── build.gradle └── src │ ├── OpenFoolGame.gwt.xml │ └── ru │ └── hyst329 │ └── openfool │ ├── Card.kt │ ├── CardActor.kt │ ├── Deck.kt │ ├── GameScreen.kt │ ├── Holiday.kt │ ├── MainMenuScreen.kt │ ├── NewGameScreen.kt │ ├── OpenFoolGame.kt │ ├── OrientationHelper.kt │ ├── Player.kt │ ├── PlayerTesting.kt │ ├── Rank.kt │ ├── ResultScreen.kt │ ├── RuleSet.kt │ ├── SettingsScreen.kt │ └── Suit.kt ├── desktop ├── build.gradle └── src │ └── ru │ └── hyst329 │ └── openfool │ └── desktop │ ├── DesktopLauncher.kt │ └── DesktopOrientationHelper.kt ├── gradle.properties ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── ios ├── Info.plist.xml ├── build.gradle ├── data │ ├── Default-1024w-1366h@2x~ipad.png │ ├── Default-375w-667h@2x.png │ ├── Default-414w-736h@3x.png │ ├── Default-568h@2x.png │ ├── Default.png │ ├── Default@2x.png │ ├── Default@2x~ipad.png │ ├── Default~ipad.png │ ├── Icon-72.png │ ├── Icon-72@2x.png │ ├── Icon.png │ └── Icon@2x.png ├── robovm.properties ├── robovm.xml └── src │ └── ru │ └── hyst329 │ └── openfool │ ├── IOSLauncher.java │ └── IOSOrientationHelper.kt ├── metadata ├── en-US │ ├── full_description.txt │ └── short_description.txt └── ru-RU │ ├── full_description.txt │ └── short_description.txt └── settings.gradle /.gitignore: -------------------------------------------------------------------------------- 1 | ## Java 2 | 3 | *.class 4 | *.war 5 | *.ear 6 | hs_err_pid* 7 | 8 | ## Robovm 9 | /ios/robovm-build/ 10 | 11 | ## GWT 12 | /html/war/ 13 | /html/gwt-unitCache/ 14 | .apt_generated/ 15 | .gwt/ 16 | gwt-unitCache/ 17 | www-test/ 18 | .gwt-tmp/ 19 | 20 | ## Android Studio and Intellij and Android in general 21 | /android/libs/armeabi/ 22 | /android/libs/armeabi-v7a/ 23 | /android/libs/arm64-v8a/ 24 | /android/libs/x86/ 25 | /android/libs/x86_64/ 26 | /android/gen/ 27 | .idea/ 28 | *.ipr 29 | *.iws 30 | *.iml 31 | /android/out/ 32 | com_crashlytics_export_strings.xml 33 | 34 | ## Eclipse 35 | 36 | .classpath 37 | .project 38 | .metadata/ 39 | /android/bin/ 40 | /core/bin/ 41 | /desktop/bin/ 42 | /html/bin/ 43 | /ios/bin/ 44 | /ios-moe/bin/ 45 | *.tmp 46 | *.bak 47 | *.swp 48 | *~.nib 49 | .settings/ 50 | .loadpath 51 | .externalToolBuilders/ 52 | *.launch 53 | 54 | ## NetBeans 55 | 56 | /nbproject/private/ 57 | /android/nbproject/private/ 58 | /core/nbproject/private/ 59 | /desktop/nbproject/private/ 60 | /html/nbproject/private/ 61 | /ios/nbproject/private/ 62 | /ios-moe/nbproject/private/ 63 | 64 | /build/ 65 | /android/build/ 66 | /core/build/ 67 | /desktop/build/ 68 | /html/build/ 69 | /ios/build/ 70 | /ios-moe/build/ 71 | 72 | /nbbuild/ 73 | /android/nbbuild/ 74 | /core/nbbuild/ 75 | /desktop/nbbuild/ 76 | /html/nbbuild/ 77 | /ios/nbbuild/ 78 | /ios-moe/nbbuild/ 79 | 80 | /dist/ 81 | /android/dist/ 82 | /core/dist/ 83 | /desktop/dist/ 84 | /html/dist/ 85 | /ios/dist/ 86 | /ios-moe/dist/ 87 | 88 | /nbdist/ 89 | /android/nbdist/ 90 | /core/nbdist/ 91 | /desktop/nbdist/ 92 | /html/nbdist/ 93 | /ios/nbdist/ 94 | /ios-moe/nbdist/ 95 | 96 | nbactions.xml 97 | nb-configuration.xml 98 | 99 | ## Gradle 100 | 101 | /local.properties 102 | .gradle/ 103 | gradle-app.setting 104 | /build/ 105 | /android/build/ 106 | /core/build/ 107 | /desktop/build/ 108 | /html/build/ 109 | /ios/build/ 110 | /ios-moe/build/ 111 | 112 | ## OS Specific 113 | .DS_Store 114 | Thumbs.db 115 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: android 2 | android: 3 | components: 4 | - tools 5 | - platform-tools 6 | - android-28 7 | - tools 8 | - build-tools-28.0.3 9 | licenses: 10 | - android-sdk-license-.+ 11 | jdk: oraclejdk8 12 | before_install: 13 | - openssl aes-256-cbc -K $encrypted_e0a83df23fd5_key -iv $encrypted_e0a83df23fd5_iv 14 | -in android.jks.enc -out android.jks -d 15 | - chmod +x gradlew 16 | - yes | sdkmanager "platforms;android-28" 17 | before_deploy: 18 | - cp $TRAVIS_BUILD_DIR/.keystore $HOME 19 | - cd android/build/release/apk 20 | - jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore $HOME/android.jks -storepass $storepass -keypass $keypass android-release-unsigned.apk android-signing 21 | - jarsigner -verify android-release-unsigned.apk 22 | script: travis_wait 30 ./gradlew clean assembleQa 23 | env: 24 | global: 25 | - secure: GbwGC+BsOLOYYGtGpUspaPCNNW2KvTA1EzfFQ7JT8Npd80OD+XxcwCGHPk/3ugk6sPGrvWllHEaZehQECsxGB+3M3dL9W8dT2EOYlItXWJSrljxcyAfFr4Z8YZpxEWm4mvZiy2/V6N8w+O/P6P+Fkj3S0crg3jINpDg+Vv+zPkT3oWt7XpWX0DW1DJI+ARbI/wkUDGmy2+dfyS8P3a/IAFTn6wTm9ioQxuTw9A2MqpuvRAwGg7KhCza5uRyvKQCgQP4W7Vwioh48cjIPQEvXXmu84fXJ+nX0Q/UfRp5WIXu/bW+vm3YC7bUkpdge31uKZVEPpuo0RKCPUGqGGJJ3Ln0GCAeSH6kdjoKMTtUB2kUVPCwcm1Eg0tVPjZCDH8/MaNcNyggKnpIryi4/iLZ3c5E0iXa/T07LV1rmMDoVcj+jMYIxEtiaB+E6/dpU/7fywZIYuVWZ043PPk74QSllPKqn/R6Z7UjMrnYS5w2d9Bq5BCaK/tAi6gUTBbThokgOqc2FWHmpcbBa/Smt54J9CQxmI4/LIygo/MxhtxJaJDqOKktNTm8O4A0/yf/r5w6yKAHYFT9ATmdJCFoNgViMIBTCEy7FR9CoSJoFizEooGNDYFpt39lgFJaqUN4Z1SUjyQaEJyVgLrEjmY2emrLSaWL1RgC6huGYRmQBgAcgBm4= 26 | - secure: WRsg93Pi8eUNdYOxLby+y4JxH/2qAqkaaxe4CC3YbzOYE/3M1Sr329UuendgNMkfZ8NYK4jZLKZTeDZfNM6e04fSbba4R4TCtm+abdFJ9ZBe0EZ3jChPCP0bKzxj2vB4OewEqqZdetid3RxDHe5ij52NtFotxWszMe4E9RMEnAmoHLUed6BzAzsADtbUETQuxVnCgRc56Ao/wsGZoYEjc46TPXq8xaCNDoRQCwaJmLBAXVqp8j50wFHn4xmhB//ZTePo9utYcrGyMHRZMMQ8n2ghakKNk/By4gZ1C1GlGD+zzvRM0tG12VB3KqmNqqMUzaf/LqonIupHjXo0Vtuy5YcaPpuWYPLmS5S/RRD5NOZxP8evK0ZjmRJCwhycmbL9wYOldljuAnZvvxIFn5BgwmDfPQm1DopCU94D2N0sNb+AvYPtox5D+ygfjjJj+ETIOpg0G/JKgaQwfmn1Mpe0o6W6PJiX/BPFLCbVgwAwRKvX51rkgsA8KTrboeZR0ASIEMUQN3dLAWRBM0s2hMGijx+xWOB7oUAyR7+zanpV3BkILFsiG40aqvezncHzfVRY1SVun2mCJZT/fkY1MjInntmzZa5Ax+waaS5w1+H14Z5bi7gYZb69uDKYNDYd0pSqYSmSs0j6N/3dRXgTGpBqbSRu185d78LU15ZjTKgAUPY= 27 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # Changelog 2 | 3 | ## 0.3.1 (unreleased, planned 2019-12-25) 4 | - New localisations: Polish (WIP), French (WIP) 5 | - Online mode preview (not yet started) 6 | 7 | ## 0.3.0 (2019-12-15) 8 | - Bug fixes 9 | - New portrait orientation layout (useful for phones) 10 | - Some UI reworks (changed main font) 11 | - Localisation fixes 12 | 13 | ## 0.2.9 (2019-08-17) 14 | - New deck 15 | - New localisations: German 16 | - Updated library versions 17 | - Logging 18 | 19 | ## 0.2.8 (2018-11-07) 20 | - Added passing 21 | - Now click on a card while passing/throwing causes no action. 22 | 23 | ## 0.2.7 (2018-09-22) 24 | - Cards which cannot be used now are greyed out (highly experimental) 25 | - Stripped decks (24, 32 or 36 cards) cas be used along with 52-card deck 26 | - Fixed issue #34 (team play checkbox was inaccessible when using Russian) 27 | 28 | ## 0.2.6 (2018-08-11) 29 | - Fixed issue #32 when individual play could not finish sometimes 30 | - Added information about places taken by the players onto the result screen. 31 | 32 | ## 0.2.5 (2017-12-31) 33 | - Fixed issue #31 with improper UI elements positioning on Android devices (on desktop, there's now a fixed-size window). 34 | 35 | ## 0.2.4 (2017-12-24) 36 | - Christmas Edition: Santa Hat and blue background during Christmas and New Year holidays (24/12 to 9/1). 37 | 38 | ## 0.2.3 (2017-11-07) 39 | - Revolution Edition: Hammer and Sickle logo and red background during October Revolution holidays (5/11 to 10/11). 40 | 41 | ## 0.2.2 (2017-08-30/2017-09-09) 42 | - Some minor bug fixes. 43 | - Added iOS build (for jailbroken devices only). 44 | 45 | ## 0.2.1 (2017-07-27) 46 | - Fixed issue #10, throwing rules up to 5 players are properly implemented. 47 | 48 | ## 0.2.0 (2017-07-19) 49 | - Fixed issue #28, 4-player individual mode is now possible. 50 | - Maximum player count increased to 5. 51 | - Result screen text are different for individual and team modes. 52 | 53 | ## 0.1.9 (2017-07-13) 54 | - Added individual mode for 2 and 3 players (experimental). 55 | - Trump suit name on the game screen replaced with symbol. 56 | - Application icon added. 57 | - The rules are customisable in some extent. 58 | 59 | ## 0.1.8 (2017-06-12) 60 | - Added Underdog font as main UI font (until new skin). 61 | - Fixed Czech localisation display. 62 | 63 | ## 0.1.7 (2017-05-25) 64 | - Added Czech localisation. 65 | - Code cleanup. 66 | 67 | ## 0.1.6 (2017-04-09) 68 | - Fixed issue #23, when throw limit checking (and possibly other things) was broken. 69 | - Added turn information display (who attacks/defends) 70 | - Added player information (when someone takes or says _Done_). 71 | - Fixed issue #25, when the game crashed if the background was not set. 72 | 73 | ## 0.1.5 (2017-04-06) 74 | - The game is rewritten to Kotlin. 75 | - Added background selection (2 backgrounds now available). 76 | - VisUI updated to 1.3.0. 77 | 78 | ## 0.1.4 (2017-03-30) 79 | - Fixed issue with card throwing (#23). 80 | - Tweaked discard pile cards placement. 81 | - Back button is now functional. 82 | 83 | ## 0.1.3 (2017-03-26) 84 | - Added background (currently checkerboard). 85 | - Added card sorting (by suit or rank, ascending or descending). 86 | - Cards in the discard pile are now placed unevenly. 87 | 88 | ## 0.1.2 (2017-03-19) 89 | - Fixed issue #17 (throwing more cards then allowed). 90 | - Added localisation. 91 | - Fixed issue #22 (a problem running on devices with aspect ratio other than 5:3). 92 | 93 | ## 0.1.1 (2017-03-18) 94 | - Re-added settings (background color and deck selection) 95 | - Added result screen (won/lost/drawn). 96 | 97 | ## 0.1.0 (2017-03-16) 98 | - Full rewrite to Java and libGDX. Some features still missing. 99 | 100 | ## 0.0.9 (2017-03-01) 101 | - Added French card deck (by David Bellot) 102 | - Added card sorting 103 | 104 | ## 0.0.8 (2017-02-23) 105 | - Fixed bug: app now properly exits if quit during the game 106 | - Fixed bug when cards went to the same place when playing too fast 107 | - Added background color selection 108 | 109 | ## 0.0.7 (2017-02-19) 110 | - application icon 111 | - language can be selected from settings 112 | - fixed bug with card throw limit 113 | 114 | ## 0.0.6 (2017-02-17) 115 | - Android version (VERY EXPERIMENTAL) 116 | - Now binaries ship with Qt 5.8 117 | 118 | ## 0.0.5 (2017-02-16) 119 | - Improved AI 120 | - (Probably) fixed bug, when the game could not finish 121 | 122 | ## 0.0.4 (2017-02-08) 123 | - Added player bubbles with info text such as "I take", "Done" 124 | 125 | ## 0.0.3 (2017-02-05) 126 | - Fixed bug with rendering on Windows 127 | - Added settings dialog (deck, rendering settings and player names) 128 | - Added international deck 129 | 130 | ## 0.0.2 (2017-02-01) 131 | - Fixed bug with AI (mainly higher cards were thrown, tending to beat with higher cards). 132 | - Added locale support, translated to Russian 133 | 134 | ## 0.0.1 (2017-01-31) 135 | - First public release 136 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # OpenFool 2 | ![Travis](https://img.shields.io/travis/trolley813/OpenFool) 3 | ![Github All Releases](https://img.shields.io/github/downloads/trolley813/OpenFool/total.svg) 4 | ![Github Releases](https://img.shields.io/github/downloads/trolley813/OpenFool/latest/total.svg) 5 | ![GitHub release](https://img.shields.io/github/release/trolley813/OpenFool.svg) 6 | [![Gitter](https://img.shields.io/gitter/room/OpenFoolCommunity/Lobby.svg)](https://gitter.im/OpenFoolCommunity/Lobby) 7 | 8 | OpenFool - free and open source (MIT licensed) Fool (Durak) card game implementation for desktop and Android. 9 | 10 | [Get it on F-Droid](https://f-droid.org/packages/ru.hyst329.openfool/) 13 | 14 | ## Features 15 | ### Implemented 16 | - 4-players partnership game (2 vs 2), individual game for 2-5 players 17 | - 52-card decks: Standard Russian (designed by A. Charlemagne in 19th century, public domain - from Wikimedia), 18 | international (by Chris Aguilar - LGPL v3), French deck (by David Bellot - LGPL v3), stripped deck variants (24, 32 and 36 cards) 19 | - Standard rules for throwing in and passing (the latter is optional) 20 | - Some conventions may be customised 21 | 22 | ### Planned 23 | - Individual and partnership play for 6 players (3 vs 3) 24 | - Customisable player names (both AI and human) 25 | - Statistics 26 | - Online play (via custom server) 27 | - More deck designs 28 | - More customisable rules (e.g. Japanese fool or spade-on-spade) 29 | 30 | ## How to build 31 | It's a Gradle project. Run 32 | ```bash 33 | ./gradlew :desktop:run 34 | ``` 35 | to run the desktop version 36 | -------------------------------------------------------------------------------- /android.jks.enc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android.jks.enc -------------------------------------------------------------------------------- /android/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 12 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | -------------------------------------------------------------------------------- /android/assets/backgrounds/background1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/backgrounds/background1.png -------------------------------------------------------------------------------- /android/assets/backgrounds/background2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/backgrounds/background2.png -------------------------------------------------------------------------------- /android/assets/decks/fra/10c.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/decks/fra/10c.png -------------------------------------------------------------------------------- /android/assets/decks/fra/10d.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/decks/fra/10d.png -------------------------------------------------------------------------------- /android/assets/decks/fra/10h.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/decks/fra/10h.png -------------------------------------------------------------------------------- /android/assets/decks/fra/10s.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/decks/fra/10s.png -------------------------------------------------------------------------------- /android/assets/decks/fra/11c.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/decks/fra/11c.png -------------------------------------------------------------------------------- /android/assets/decks/fra/11d.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/decks/fra/11d.png -------------------------------------------------------------------------------- /android/assets/decks/fra/11h.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/decks/fra/11h.png -------------------------------------------------------------------------------- /android/assets/decks/fra/11s.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/decks/fra/11s.png -------------------------------------------------------------------------------- /android/assets/decks/fra/12c.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/decks/fra/12c.png -------------------------------------------------------------------------------- /android/assets/decks/fra/12d.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/decks/fra/12d.png -------------------------------------------------------------------------------- /android/assets/decks/fra/12h.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/decks/fra/12h.png -------------------------------------------------------------------------------- /android/assets/decks/fra/12s.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/decks/fra/12s.png -------------------------------------------------------------------------------- /android/assets/decks/fra/13c.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/decks/fra/13c.png -------------------------------------------------------------------------------- /android/assets/decks/fra/13d.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/decks/fra/13d.png -------------------------------------------------------------------------------- /android/assets/decks/fra/13h.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/decks/fra/13h.png -------------------------------------------------------------------------------- /android/assets/decks/fra/13s.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/decks/fra/13s.png -------------------------------------------------------------------------------- /android/assets/decks/fra/1c.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/decks/fra/1c.png -------------------------------------------------------------------------------- /android/assets/decks/fra/1d.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/decks/fra/1d.png -------------------------------------------------------------------------------- /android/assets/decks/fra/1h.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/decks/fra/1h.png -------------------------------------------------------------------------------- /android/assets/decks/fra/1s.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/decks/fra/1s.png -------------------------------------------------------------------------------- /android/assets/decks/fra/2c.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/decks/fra/2c.png -------------------------------------------------------------------------------- /android/assets/decks/fra/2d.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/decks/fra/2d.png -------------------------------------------------------------------------------- /android/assets/decks/fra/2h.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/decks/fra/2h.png -------------------------------------------------------------------------------- /android/assets/decks/fra/2s.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/decks/fra/2s.png -------------------------------------------------------------------------------- /android/assets/decks/fra/3c.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/decks/fra/3c.png -------------------------------------------------------------------------------- /android/assets/decks/fra/3d.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/decks/fra/3d.png -------------------------------------------------------------------------------- /android/assets/decks/fra/3h.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/decks/fra/3h.png -------------------------------------------------------------------------------- /android/assets/decks/fra/3s.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/decks/fra/3s.png -------------------------------------------------------------------------------- /android/assets/decks/fra/4c.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/decks/fra/4c.png -------------------------------------------------------------------------------- /android/assets/decks/fra/4d.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/decks/fra/4d.png -------------------------------------------------------------------------------- /android/assets/decks/fra/4h.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/decks/fra/4h.png -------------------------------------------------------------------------------- /android/assets/decks/fra/4s.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/decks/fra/4s.png -------------------------------------------------------------------------------- /android/assets/decks/fra/5c.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/decks/fra/5c.png -------------------------------------------------------------------------------- /android/assets/decks/fra/5d.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/decks/fra/5d.png -------------------------------------------------------------------------------- /android/assets/decks/fra/5h.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/decks/fra/5h.png -------------------------------------------------------------------------------- /android/assets/decks/fra/5s.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/decks/fra/5s.png -------------------------------------------------------------------------------- /android/assets/decks/fra/6c.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/decks/fra/6c.png -------------------------------------------------------------------------------- /android/assets/decks/fra/6d.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/decks/fra/6d.png -------------------------------------------------------------------------------- /android/assets/decks/fra/6h.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/decks/fra/6h.png -------------------------------------------------------------------------------- /android/assets/decks/fra/6s.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/decks/fra/6s.png -------------------------------------------------------------------------------- /android/assets/decks/fra/7c.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/decks/fra/7c.png -------------------------------------------------------------------------------- /android/assets/decks/fra/7d.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/decks/fra/7d.png -------------------------------------------------------------------------------- /android/assets/decks/fra/7h.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/decks/fra/7h.png -------------------------------------------------------------------------------- /android/assets/decks/fra/7s.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/decks/fra/7s.png -------------------------------------------------------------------------------- /android/assets/decks/fra/8c.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/decks/fra/8c.png -------------------------------------------------------------------------------- /android/assets/decks/fra/8d.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/decks/fra/8d.png -------------------------------------------------------------------------------- /android/assets/decks/fra/8h.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/decks/fra/8h.png -------------------------------------------------------------------------------- /android/assets/decks/fra/8s.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/decks/fra/8s.png -------------------------------------------------------------------------------- /android/assets/decks/fra/9c.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/decks/fra/9c.png -------------------------------------------------------------------------------- /android/assets/decks/fra/9d.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/decks/fra/9d.png -------------------------------------------------------------------------------- /android/assets/decks/fra/9h.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/decks/fra/9h.png -------------------------------------------------------------------------------- /android/assets/decks/fra/9s.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/decks/fra/9s.png -------------------------------------------------------------------------------- /android/assets/decks/fra/back.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/decks/fra/back.png -------------------------------------------------------------------------------- /android/assets/decks/int/10c.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/decks/int/10c.png -------------------------------------------------------------------------------- /android/assets/decks/int/10d.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/decks/int/10d.png -------------------------------------------------------------------------------- /android/assets/decks/int/10h.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/decks/int/10h.png -------------------------------------------------------------------------------- /android/assets/decks/int/10s.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/decks/int/10s.png -------------------------------------------------------------------------------- /android/assets/decks/int/11c.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/decks/int/11c.png -------------------------------------------------------------------------------- /android/assets/decks/int/11d.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/decks/int/11d.png -------------------------------------------------------------------------------- /android/assets/decks/int/11h.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/decks/int/11h.png -------------------------------------------------------------------------------- /android/assets/decks/int/11s.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/decks/int/11s.png -------------------------------------------------------------------------------- /android/assets/decks/int/12c.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/decks/int/12c.png -------------------------------------------------------------------------------- /android/assets/decks/int/12d.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/decks/int/12d.png -------------------------------------------------------------------------------- /android/assets/decks/int/12h.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/decks/int/12h.png -------------------------------------------------------------------------------- /android/assets/decks/int/12s.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/decks/int/12s.png -------------------------------------------------------------------------------- /android/assets/decks/int/13c.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/decks/int/13c.png -------------------------------------------------------------------------------- /android/assets/decks/int/13d.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/decks/int/13d.png -------------------------------------------------------------------------------- /android/assets/decks/int/13h.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/decks/int/13h.png -------------------------------------------------------------------------------- /android/assets/decks/int/13s.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/decks/int/13s.png -------------------------------------------------------------------------------- /android/assets/decks/int/1c.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/decks/int/1c.png -------------------------------------------------------------------------------- /android/assets/decks/int/1d.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/decks/int/1d.png -------------------------------------------------------------------------------- /android/assets/decks/int/1h.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/decks/int/1h.png -------------------------------------------------------------------------------- /android/assets/decks/int/1s.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/decks/int/1s.png -------------------------------------------------------------------------------- /android/assets/decks/int/2c.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/decks/int/2c.png -------------------------------------------------------------------------------- /android/assets/decks/int/2d.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/decks/int/2d.png -------------------------------------------------------------------------------- /android/assets/decks/int/2h.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/decks/int/2h.png -------------------------------------------------------------------------------- /android/assets/decks/int/2s.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/decks/int/2s.png -------------------------------------------------------------------------------- /android/assets/decks/int/3c.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/decks/int/3c.png -------------------------------------------------------------------------------- /android/assets/decks/int/3d.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/decks/int/3d.png -------------------------------------------------------------------------------- /android/assets/decks/int/3h.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/decks/int/3h.png -------------------------------------------------------------------------------- /android/assets/decks/int/3s.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/decks/int/3s.png -------------------------------------------------------------------------------- /android/assets/decks/int/4c.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/decks/int/4c.png -------------------------------------------------------------------------------- /android/assets/decks/int/4d.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/decks/int/4d.png -------------------------------------------------------------------------------- /android/assets/decks/int/4h.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/decks/int/4h.png -------------------------------------------------------------------------------- /android/assets/decks/int/4s.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/decks/int/4s.png -------------------------------------------------------------------------------- /android/assets/decks/int/5c.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/decks/int/5c.png -------------------------------------------------------------------------------- /android/assets/decks/int/5d.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/decks/int/5d.png -------------------------------------------------------------------------------- /android/assets/decks/int/5h.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/decks/int/5h.png -------------------------------------------------------------------------------- /android/assets/decks/int/5s.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/decks/int/5s.png -------------------------------------------------------------------------------- /android/assets/decks/int/6c.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/decks/int/6c.png -------------------------------------------------------------------------------- /android/assets/decks/int/6d.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/decks/int/6d.png -------------------------------------------------------------------------------- /android/assets/decks/int/6h.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/decks/int/6h.png -------------------------------------------------------------------------------- /android/assets/decks/int/6s.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/decks/int/6s.png -------------------------------------------------------------------------------- /android/assets/decks/int/7c.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/decks/int/7c.png -------------------------------------------------------------------------------- /android/assets/decks/int/7d.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/decks/int/7d.png -------------------------------------------------------------------------------- /android/assets/decks/int/7h.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/decks/int/7h.png -------------------------------------------------------------------------------- /android/assets/decks/int/7s.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/decks/int/7s.png -------------------------------------------------------------------------------- /android/assets/decks/int/8c.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/decks/int/8c.png -------------------------------------------------------------------------------- /android/assets/decks/int/8d.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/decks/int/8d.png -------------------------------------------------------------------------------- /android/assets/decks/int/8h.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/decks/int/8h.png -------------------------------------------------------------------------------- /android/assets/decks/int/8s.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/decks/int/8s.png -------------------------------------------------------------------------------- /android/assets/decks/int/9c.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/decks/int/9c.png -------------------------------------------------------------------------------- /android/assets/decks/int/9d.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/decks/int/9d.png -------------------------------------------------------------------------------- /android/assets/decks/int/9h.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/decks/int/9h.png -------------------------------------------------------------------------------- /android/assets/decks/int/9s.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/decks/int/9s.png -------------------------------------------------------------------------------- /android/assets/decks/int/back.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/decks/int/back.png -------------------------------------------------------------------------------- /android/assets/decks/psu/10c.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/decks/psu/10c.png -------------------------------------------------------------------------------- /android/assets/decks/psu/10d.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/decks/psu/10d.png -------------------------------------------------------------------------------- /android/assets/decks/psu/10h.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/decks/psu/10h.png -------------------------------------------------------------------------------- /android/assets/decks/psu/10s.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/decks/psu/10s.png -------------------------------------------------------------------------------- /android/assets/decks/psu/11c.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/decks/psu/11c.png -------------------------------------------------------------------------------- /android/assets/decks/psu/11d.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/decks/psu/11d.png -------------------------------------------------------------------------------- /android/assets/decks/psu/11h.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/decks/psu/11h.png -------------------------------------------------------------------------------- /android/assets/decks/psu/11s.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/decks/psu/11s.png -------------------------------------------------------------------------------- /android/assets/decks/psu/12c.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/decks/psu/12c.png -------------------------------------------------------------------------------- /android/assets/decks/psu/12d.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/decks/psu/12d.png -------------------------------------------------------------------------------- /android/assets/decks/psu/12h.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/decks/psu/12h.png -------------------------------------------------------------------------------- /android/assets/decks/psu/12s.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/decks/psu/12s.png -------------------------------------------------------------------------------- /android/assets/decks/psu/13c.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/decks/psu/13c.png -------------------------------------------------------------------------------- /android/assets/decks/psu/13d.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/decks/psu/13d.png -------------------------------------------------------------------------------- /android/assets/decks/psu/13h.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/decks/psu/13h.png -------------------------------------------------------------------------------- /android/assets/decks/psu/13s.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/decks/psu/13s.png -------------------------------------------------------------------------------- /android/assets/decks/psu/1c.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/decks/psu/1c.png -------------------------------------------------------------------------------- /android/assets/decks/psu/1d.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/decks/psu/1d.png -------------------------------------------------------------------------------- /android/assets/decks/psu/1h.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/decks/psu/1h.png -------------------------------------------------------------------------------- /android/assets/decks/psu/1s.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/decks/psu/1s.png -------------------------------------------------------------------------------- /android/assets/decks/psu/2c.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/decks/psu/2c.png -------------------------------------------------------------------------------- /android/assets/decks/psu/2d.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/decks/psu/2d.png -------------------------------------------------------------------------------- /android/assets/decks/psu/2h.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/decks/psu/2h.png -------------------------------------------------------------------------------- /android/assets/decks/psu/2s.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/decks/psu/2s.png -------------------------------------------------------------------------------- /android/assets/decks/psu/3c.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/decks/psu/3c.png -------------------------------------------------------------------------------- /android/assets/decks/psu/3d.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/decks/psu/3d.png -------------------------------------------------------------------------------- /android/assets/decks/psu/3h.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/decks/psu/3h.png -------------------------------------------------------------------------------- /android/assets/decks/psu/3s.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/decks/psu/3s.png -------------------------------------------------------------------------------- /android/assets/decks/psu/4c.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/decks/psu/4c.png -------------------------------------------------------------------------------- /android/assets/decks/psu/4d.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/decks/psu/4d.png -------------------------------------------------------------------------------- /android/assets/decks/psu/4h.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/decks/psu/4h.png -------------------------------------------------------------------------------- /android/assets/decks/psu/4s.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/decks/psu/4s.png -------------------------------------------------------------------------------- /android/assets/decks/psu/5c.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/decks/psu/5c.png -------------------------------------------------------------------------------- /android/assets/decks/psu/5d.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/decks/psu/5d.png -------------------------------------------------------------------------------- /android/assets/decks/psu/5h.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/decks/psu/5h.png -------------------------------------------------------------------------------- /android/assets/decks/psu/5s.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/decks/psu/5s.png -------------------------------------------------------------------------------- /android/assets/decks/psu/6c.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/decks/psu/6c.png -------------------------------------------------------------------------------- /android/assets/decks/psu/6d.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/decks/psu/6d.png -------------------------------------------------------------------------------- /android/assets/decks/psu/6h.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/decks/psu/6h.png -------------------------------------------------------------------------------- /android/assets/decks/psu/6s.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/decks/psu/6s.png -------------------------------------------------------------------------------- /android/assets/decks/psu/7c.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/decks/psu/7c.png -------------------------------------------------------------------------------- /android/assets/decks/psu/7d.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/decks/psu/7d.png -------------------------------------------------------------------------------- /android/assets/decks/psu/7h.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/decks/psu/7h.png -------------------------------------------------------------------------------- /android/assets/decks/psu/7s.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/decks/psu/7s.png -------------------------------------------------------------------------------- /android/assets/decks/psu/8c.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/decks/psu/8c.png -------------------------------------------------------------------------------- /android/assets/decks/psu/8d.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/decks/psu/8d.png -------------------------------------------------------------------------------- /android/assets/decks/psu/8h.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/decks/psu/8h.png -------------------------------------------------------------------------------- /android/assets/decks/psu/8s.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/decks/psu/8s.png -------------------------------------------------------------------------------- /android/assets/decks/psu/9c.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/decks/psu/9c.png -------------------------------------------------------------------------------- /android/assets/decks/psu/9d.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/decks/psu/9d.png -------------------------------------------------------------------------------- /android/assets/decks/psu/9h.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/decks/psu/9h.png -------------------------------------------------------------------------------- /android/assets/decks/psu/9s.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/decks/psu/9s.png -------------------------------------------------------------------------------- /android/assets/decks/psu/back.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/decks/psu/back.png -------------------------------------------------------------------------------- /android/assets/decks/rus/10c.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/decks/rus/10c.png -------------------------------------------------------------------------------- /android/assets/decks/rus/10d.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/decks/rus/10d.png -------------------------------------------------------------------------------- /android/assets/decks/rus/10h.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/decks/rus/10h.png -------------------------------------------------------------------------------- /android/assets/decks/rus/10s.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/decks/rus/10s.png -------------------------------------------------------------------------------- /android/assets/decks/rus/11c.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/decks/rus/11c.png -------------------------------------------------------------------------------- /android/assets/decks/rus/11d.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/decks/rus/11d.png -------------------------------------------------------------------------------- /android/assets/decks/rus/11h.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/decks/rus/11h.png -------------------------------------------------------------------------------- /android/assets/decks/rus/11s.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/decks/rus/11s.png -------------------------------------------------------------------------------- /android/assets/decks/rus/12c.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/decks/rus/12c.png -------------------------------------------------------------------------------- /android/assets/decks/rus/12d.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/decks/rus/12d.png -------------------------------------------------------------------------------- /android/assets/decks/rus/12h.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/decks/rus/12h.png -------------------------------------------------------------------------------- /android/assets/decks/rus/12s.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/decks/rus/12s.png -------------------------------------------------------------------------------- /android/assets/decks/rus/13c.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/decks/rus/13c.png -------------------------------------------------------------------------------- /android/assets/decks/rus/13d.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/decks/rus/13d.png -------------------------------------------------------------------------------- /android/assets/decks/rus/13h.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/decks/rus/13h.png -------------------------------------------------------------------------------- /android/assets/decks/rus/13s.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/decks/rus/13s.png -------------------------------------------------------------------------------- /android/assets/decks/rus/1c.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/decks/rus/1c.png -------------------------------------------------------------------------------- /android/assets/decks/rus/1d.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/decks/rus/1d.png -------------------------------------------------------------------------------- /android/assets/decks/rus/1h.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/decks/rus/1h.png -------------------------------------------------------------------------------- /android/assets/decks/rus/1s.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/decks/rus/1s.png -------------------------------------------------------------------------------- /android/assets/decks/rus/2c.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/decks/rus/2c.png -------------------------------------------------------------------------------- /android/assets/decks/rus/2d.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/decks/rus/2d.png -------------------------------------------------------------------------------- /android/assets/decks/rus/2h.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/decks/rus/2h.png -------------------------------------------------------------------------------- /android/assets/decks/rus/2s.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/decks/rus/2s.png -------------------------------------------------------------------------------- /android/assets/decks/rus/3c.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/decks/rus/3c.png -------------------------------------------------------------------------------- /android/assets/decks/rus/3d.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/decks/rus/3d.png -------------------------------------------------------------------------------- /android/assets/decks/rus/3h.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/decks/rus/3h.png -------------------------------------------------------------------------------- /android/assets/decks/rus/3s.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/decks/rus/3s.png -------------------------------------------------------------------------------- /android/assets/decks/rus/4c.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/decks/rus/4c.png -------------------------------------------------------------------------------- /android/assets/decks/rus/4d.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/decks/rus/4d.png -------------------------------------------------------------------------------- /android/assets/decks/rus/4h.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/decks/rus/4h.png -------------------------------------------------------------------------------- /android/assets/decks/rus/4s.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/decks/rus/4s.png -------------------------------------------------------------------------------- /android/assets/decks/rus/5c.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/decks/rus/5c.png -------------------------------------------------------------------------------- /android/assets/decks/rus/5d.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/decks/rus/5d.png -------------------------------------------------------------------------------- /android/assets/decks/rus/5h.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/decks/rus/5h.png -------------------------------------------------------------------------------- /android/assets/decks/rus/5s.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/decks/rus/5s.png -------------------------------------------------------------------------------- /android/assets/decks/rus/6c.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/decks/rus/6c.png -------------------------------------------------------------------------------- /android/assets/decks/rus/6d.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/decks/rus/6d.png -------------------------------------------------------------------------------- /android/assets/decks/rus/6h.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/decks/rus/6h.png -------------------------------------------------------------------------------- /android/assets/decks/rus/6s.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/decks/rus/6s.png -------------------------------------------------------------------------------- /android/assets/decks/rus/7c.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/decks/rus/7c.png -------------------------------------------------------------------------------- /android/assets/decks/rus/7d.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/decks/rus/7d.png -------------------------------------------------------------------------------- /android/assets/decks/rus/7h.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/decks/rus/7h.png -------------------------------------------------------------------------------- /android/assets/decks/rus/7s.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/decks/rus/7s.png -------------------------------------------------------------------------------- /android/assets/decks/rus/8c.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/decks/rus/8c.png -------------------------------------------------------------------------------- /android/assets/decks/rus/8d.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/decks/rus/8d.png -------------------------------------------------------------------------------- /android/assets/decks/rus/8h.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/decks/rus/8h.png -------------------------------------------------------------------------------- /android/assets/decks/rus/8s.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/decks/rus/8s.png -------------------------------------------------------------------------------- /android/assets/decks/rus/9c.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/decks/rus/9c.png -------------------------------------------------------------------------------- /android/assets/decks/rus/9d.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/decks/rus/9d.png -------------------------------------------------------------------------------- /android/assets/decks/rus/9h.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/decks/rus/9h.png -------------------------------------------------------------------------------- /android/assets/decks/rus/9s.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/decks/rus/9s.png -------------------------------------------------------------------------------- /android/assets/decks/rus/back.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/decks/rus/back.png -------------------------------------------------------------------------------- /android/assets/fonts/8835.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/fonts/8835.otf -------------------------------------------------------------------------------- /android/assets/holidays/hammersickle.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/holidays/hammersickle.png -------------------------------------------------------------------------------- /android/assets/holidays/santahat.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/holidays/santahat.png -------------------------------------------------------------------------------- /android/assets/i18n/OpenFool.properties: -------------------------------------------------------------------------------- 1 | NewGame=New game 2 | Settings=Settings 3 | Quit=Quit 4 | LoadingAssets=Loading assets {0}% 5 | ChangeBackgroundColor=Change background color 6 | SaveSettings=Save settings 7 | Cards=Cards: 8 | CardsRussian=Russian 9 | CardsInternational=International 10 | CardsFrench=French 11 | Language=Language: 12 | LanguageRussian=Russian 13 | LanguageEnglish=English 14 | LanguageCzech=Czech 15 | TeamVictoryHeader=Victory! 16 | TeamVictoryText=Your team has defeated the opponents! 17 | TeamDefeatHeader=Defeat :( 18 | TeamDefeatText=Your team has lost the game. 19 | TeamPartnerDefeatHeader=Still a defeat... 20 | TeamPartnerDefeatText=You have managed to finish the game, but your partner hasn't. 21 | TeamDrawHeader=It's a draw. 22 | TeamDrawText=You and your opponents achieved a peaceful result. 23 | Sorting=Card sorting: 24 | SortingUnsorted=Unsorted 25 | SortingSuitAscending=By suit, ascending 26 | SortingSuitDescending=By suit, descending 27 | SortingRankAscending=By rank, ascending 28 | SortingRankDescending=By rank, descending 29 | Background=Background: 30 | YourTurn=Your turn! 31 | Defend=Defend! 32 | PlayerTakes=I take 33 | PlayerDone=Done 34 | PlayerNames=Player Names 35 | GameplaySettings=Gameplay settings 36 | OK=OK 37 | Cancel=Cancel 38 | SinglePlayer=Single player 39 | DeuceBeatsAce=Deuce beats ace 40 | LimitTo5Cards=Limit first discard to 5 cards 41 | PlayerCount=Player count: 42 | TeamPlay=Team play (4 players only) 43 | VictoryHeader=Victory! 44 | VictoryText=You won the game! 45 | DefeatHeader=Defeat :( 46 | DefeatText=You lost the game. 47 | DrawHeader=It's a draw. 48 | DrawText=Friendship won! 49 | PlayerPlace={0} took {1,choice,1#1st|2#2nd|3#3rd|3<{1,number,integer}th} place 50 | DeckCardsCount=Number of cards: 51 | PassingGame=Allow passing 52 | LanguageGerman=German 53 | CardsPeoples=Peoples of the USSR 54 | PortraitOrientation=Portrait screen orientation 55 | -------------------------------------------------------------------------------- /android/assets/i18n/OpenFool_cs.properties: -------------------------------------------------------------------------------- 1 | NewGame=Nová hra 2 | Settings=Nastavení 3 | LoadingAssets=Načítání zdrojů {0}% 4 | Quit=Opustit 5 | ChangeBackgroundColor=Změnit barvu pozadí 6 | SaveSettings=Uložit 7 | Cards=Karty: 8 | CardsRussian=Ruské 9 | CardsInternational=Mezinárodní 10 | CardsFrench=Francouzské 11 | Language=Jazyk: 12 | LanguageRussian=Ruština 13 | LanguageEnglish=Angličtina 14 | LanguageCzech=Čeština 15 | TeamVictoryHeader=Výhra! 16 | TeamDefeatHeader=Prohra :( 17 | TeamPartnerDefeatHeader=To je ještě prohra... 18 | TeamDrawHeader=Remíza. 19 | SortingUnsorted=Bez třídění 20 | SortingSuitAscending=Podle barvy, vzestupně 21 | SortingSuitDescending=Podle barvy, sestupně 22 | SortingRankAscending=Podle hodnoty, vzestupně 23 | SortingRankDescending=Podle hodnoty, sestupně 24 | Background=Pozadí: 25 | YourTurn=Řada je na vás! 26 | Defend=Přebíjejte! 27 | PlayerTakes=Beru 28 | PlayerDone=Bito 29 | PlayerNames=Jména hráčů 30 | TeamVictoryText=Vaš tým porazil protihráčů! 31 | TeamDefeatText=Vaš tým prohrál. 32 | TeamPartnerDefeatText=Jste dosáhli konce hry, ale vaš spoluhráč není. 33 | TeamDrawText=Vaš tým a protihráče dosáhli remízy. 34 | Sorting=Třídění karet: 35 | GameplaySettings=Nastavení hratelnosti 36 | OK=OK 37 | Cancel=Zrušit 38 | SinglePlayer=Hra pro jednoho hráče 39 | DeuceBeatsAce=Dvojka přebíjí eso 40 | LimitTo5Cards=První vejbit 5 karet 41 | PlayerCount=Počet hráčů: 42 | TeamPlay=Týmová hra (jen 4 hráčů) 43 | VictoryHeader=Výhra! 44 | DefeatHeader=Prohra :( 45 | DrawHeader=Remíza. 46 | VictoryText=Jste vyhráli! 47 | DefeatText=Jste prohráli. 48 | DrawText=Přátelství vyhrálo! 49 | PlayerPlace={0} obsadil(a) {1}. místo 50 | DeckCardsCount=Počet karet: 51 | PassingGame=Přenosná hrá 52 | LanguageGerman=Německý 53 | CardsPeoples=Národy SSSR 54 | PortraitOrientation=Orientace obrazovky na výšku -------------------------------------------------------------------------------- /android/assets/i18n/OpenFool_de.properties: -------------------------------------------------------------------------------- 1 | NewGame=Neues Spiel 2 | Quit=Beenden 3 | Settings=Einstellungen 4 | ChangeBackgroundColor=Hintergrundfarbe wechseln 5 | SaveSettings=Speichern 6 | Cards=Karten: 7 | CardsRussian=Russische 8 | CardsInternational=Internationale 9 | CardsFrench=Französische 10 | Language=Sprache 11 | LanguageRussian=Russisch 12 | LanguageEnglish=Englisch 13 | LanguageCzech=Tschechisch 14 | TeamVictoryHeader=Sieg! 15 | TeamVictoryText=Ihrer Team hat die Gegner besiegt! 16 | TeamDefeatHeader=Niederlage :( 17 | TeamDefeatText=Ihrer Team hat verloren. 18 | TeamPartnerDefeatHeader=Noch eine Niederlage... 19 | TeamPartnerDefeatText=Sie haben das Spiel beendet, aber Ihrer Partner hat nicht. 20 | TeamDrawHeader=Remis. 21 | LoadingAssets=Laden die Assets {0}% 22 | TeamDrawText=Zusammen mit Ihren Gegnern, haben Sie 23 | Sorting=Karten-Sortierung: 24 | SortingUnsorted=Ohne Sortierung 25 | SortingSuitAscending=Nach Farbe, aufsteigend 26 | SortingSuitDescending=Nach Farbe, absteigend 27 | SortingRankAscending=Nach Rank, aufsteigend 28 | SortingRankDescending=Nach Rank, absteigend 29 | Background=Hintergrund: 30 | YourTurn=Ihr Zug! 31 | Defend=Verteidigen! 32 | PlayerTakes=Nehme auf 33 | PlayerDone=Fertig 34 | PlayerNames=Namen der Spieler 35 | GameplaySettings=Gameplay-Einstellungen 36 | OK=OK 37 | Cancel=Abbrechen 38 | SinglePlayer=Einzelspieler 39 | DeuceBeatsAce=Zwei schlagt As 40 | LimitTo5Cards=Einschr 41 | PlayerCount=Anzahl der Spieler: 42 | TeamPlay=Teamspiel (nur 4 Spieler) 43 | VictoryHeader=Sieg! 44 | VictoryText=Sie haben die Partie gewonnen! 45 | DefeatHeader=Niederlage :( 46 | DefeatText=Sie haben die Partie verloren. 47 | DrawHeader=Remis. 48 | DrawText=Die Freundschaft hat gewonnen! 49 | PlayerPlace={0} hat den {1}. Platz genommen 50 | PassingGame=Schieben 51 | DeckCardsCount=Anzahl der Karten: 52 | LanguageGerman=Deutsch 53 | CardsPeoples=Völker der UdSSR 54 | PortraitOrientation=Bildschirm-Hochformat -------------------------------------------------------------------------------- /android/assets/i18n/OpenFool_en.properties: -------------------------------------------------------------------------------- 1 | PlayerTakes=I take 2 | NewGame=New game 3 | Settings=Settings 4 | Quit=Quit 5 | LoadingAssets=Loading assets {0}% 6 | ChangeBackgroundColor=Change background color 7 | SaveSettings=Save settings 8 | Cards=Cards: 9 | CardsRussian=Russian 10 | CardsInternational=International 11 | CardsFrench=French 12 | Language=Language: 13 | LanguageRussian=Russian 14 | LanguageEnglish=English 15 | TeamVictoryHeader=Victory! 16 | TeamVictoryText=Your team has defeated the opponents! 17 | TeamDefeatHeader=Defeat :( 18 | TeamDefeatText=Your team has lost the game. 19 | TeamPartnerDefeatHeader=Still a defeat... 20 | TeamPartnerDefeatText=You have managed to finish the game, but your partner hasn't. 21 | TeamDrawHeader=It's a draw. 22 | TeamDrawText=You and your opponents achieved a peaceful result. 23 | Sorting=Card sorting: 24 | SortingUnsorted=Unsorted 25 | SortingSuitAscending=By suit, ascending 26 | SortingSuitDescending=By suit, descending 27 | SortingRankAscending=By rank, ascending 28 | SortingRankDescending=By rank, ascending 29 | Background=Background: 30 | YourTurn=Your turn! 31 | Defend=Defend! 32 | PlayerDone=Done 33 | PlayerNames=Player Names 34 | LanguageCzech=Czech 35 | GameplaySettings=Gameplay settings 36 | OK=OK 37 | Cancel=Cancel 38 | SinglePlayer=Single player 39 | DeuceBeatsAce=Deuce beats ace 40 | LimitTo5Cards=Limit first discard to 5 cards 41 | PlayerCount=Player count: 42 | TeamPlay=Team play (4 players only) 43 | VictoryHeader=Victory! 44 | DefeatHeader=Defeat :( 45 | DrawHeader=It's a draw. 46 | VictoryText=You won the game! 47 | DefeatText=You lost the game. 48 | DrawText=Friendship won! 49 | PlayerPlace={0} took {1,choice,1#1st|2#2nd|3#3rd|3<{1,number,integer}th} place 50 | DeckCardsCount=Number of cards: 51 | PassingGame=Allow passing 52 | LanguageGerman=German 53 | CardsPeoples=Peoples of the USSR 54 | PortraitOrientation=Portrait screen orientation -------------------------------------------------------------------------------- /android/assets/i18n/OpenFool_ru.properties: -------------------------------------------------------------------------------- 1 | PlayerTakes=Беру 2 | NewGame=Новая игра 3 | Settings=Настройки 4 | Quit=Выйти 5 | LoadingAssets=Загрузка ресурсов {0}% 6 | ChangeBackgroundColor=Сменить цвет фона 7 | SaveSettings=Сохранить 8 | Cards=Карты: 9 | CardsRussian=Русские 10 | CardsInternational=Международные 11 | CardsFrench=Французские 12 | Language=Язык: 13 | LanguageRussian=Русский 14 | LanguageEnglish=Английский 15 | TeamVictoryHeader=Победа! 16 | TeamVictoryText=Ваша команда нанесла поражение оппонентам! 17 | TeamDefeatHeader=Поражение :( 18 | TeamDefeatText=Ваша команда проиграла. 19 | TeamPartnerDefeatHeader=Это все еще поражение... 20 | TeamPartnerDefeatText=Вам удалось выйти из игры, но вашему партнеру - нет. 21 | TeamDrawHeader=Ничья. 22 | TeamDrawText=Совместно с противником вы завершили игру миром. 23 | Sorting=Сортировка карт: 24 | SortingUnsorted=Без сортировки 25 | SortingSuitAscending=По масти (возр.) 26 | SortingSuitDescending=По масти (убыв.) 27 | SortingRankAscending=По рангу (возр.) 28 | SortingRankDescending=По рангу (убыв.) 29 | Background=Фон: 30 | YourTurn=Ваш ход! 31 | Defend=Отбивайтесь! 32 | PlayerDone=Бито 33 | PlayerNames=Имена игроков 34 | LanguageCzech=Чешский 35 | GameplaySettings=Настройки геймплея 36 | OK=OK 37 | Cancel=Отменить 38 | SinglePlayer=Одиночная игра 39 | DeuceBeatsAce=Двойка бьет туза 40 | LimitTo5Cards=Первый отбой 5 карт 41 | PlayerCount=Кол-во игроков: 42 | TeamPlay=Командная игра (только 4 игрока) 43 | VictoryHeader=Победа! 44 | DefeatHeader=Поражение :( 45 | DrawHeader=Ничья. 46 | VictoryText=Вы выиграли! 47 | DefeatText=Вы проиграли. 48 | DrawText=Победила дружба! 49 | PlayerPlace={0} занял(а) {1}-е место 50 | DeckCardsCount=Количество карт: 51 | PassingGame=Переводной 52 | LanguageGerman=Немецкий 53 | CardsPeoples=Народности СССР 54 | PortraitOrientation=Вертикальная ориентация экрана -------------------------------------------------------------------------------- /android/assets/logos/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/logos/logo.png -------------------------------------------------------------------------------- /android/assets/logos/logo.xcf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/logos/logo.xcf -------------------------------------------------------------------------------- /android/assets/logos/logo0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/logos/logo0.png -------------------------------------------------------------------------------- /android/assets/logos/logo0.xcf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/logos/logo0.xcf -------------------------------------------------------------------------------- /android/assets/logos/logo_128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/logos/logo_128.png -------------------------------------------------------------------------------- /android/assets/logos/logo_16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/logos/logo_16.png -------------------------------------------------------------------------------- /android/assets/logos/logo_32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/logos/logo_32.png -------------------------------------------------------------------------------- /android/assets/logos/mm_logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/logos/mm_logo.png -------------------------------------------------------------------------------- /android/assets/suits/clubs.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/suits/clubs.png -------------------------------------------------------------------------------- /android/assets/suits/diamonds.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/suits/diamonds.png -------------------------------------------------------------------------------- /android/assets/suits/hearts.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/suits/hearts.png -------------------------------------------------------------------------------- /android/assets/suits/spades.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/suits/spades.png -------------------------------------------------------------------------------- /android/assets/ui/font-24_0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/ui/font-24_0.png -------------------------------------------------------------------------------- /android/assets/ui/temp-skin.atlas: -------------------------------------------------------------------------------- 1 | 2 | temp-skin.png 3 | size: 512,256 4 | format: RGBA8888 5 | filter: Nearest,Nearest 6 | repeat: none 7 | border 8 | rotate: false 9 | xy: 296, 122 10 | size: 3, 3 11 | split: 1, 1, 1, 1 12 | orig: 3, 3 13 | offset: 0, 0 14 | index: -1 15 | border-circle 16 | rotate: false 17 | xy: 407, 241 18 | size: 14, 14 19 | orig: 14, 14 20 | offset: 0, 0 21 | index: -1 22 | border-circle-error 23 | rotate: false 24 | xy: 422, 241 25 | size: 14, 14 26 | orig: 14, 14 27 | offset: 0, 0 28 | index: -1 29 | border-dark-blue 30 | rotate: false 31 | xy: 50, 1 32 | size: 3, 3 33 | split: 1, 1, 1, 1 34 | orig: 3, 3 35 | offset: 0, 0 36 | index: -1 37 | border-error 38 | rotate: false 39 | xy: 54, 1 40 | size: 3, 3 41 | split: 1, 1, 1, 1 42 | orig: 3, 3 43 | offset: 0, 0 44 | index: -1 45 | button 46 | rotate: false 47 | xy: 309, 162 48 | size: 12, 20 49 | split: 5, 5, 5, 4 50 | pad: 4, 4, 1, 1 51 | orig: 12, 20 52 | offset: 0, 0 53 | index: -1 54 | button-blue 55 | rotate: false 56 | xy: 256, 50 57 | size: 12, 20 58 | split: 5, 5, 5, 4 59 | pad: 4, 4, 1, 1 60 | orig: 12, 20 61 | offset: 0, 0 62 | index: -1 63 | button-down 64 | rotate: false 65 | xy: 256, 50 66 | size: 12, 20 67 | split: 5, 5, 5, 4 68 | pad: 4, 4, 1, 1 69 | orig: 12, 20 70 | offset: 0, 0 71 | index: -1 72 | button-blue-down 73 | rotate: false 74 | xy: 256, 92 75 | size: 12, 20 76 | split: 5, 5, 5, 4 77 | pad: 4, 4, 1, 1 78 | orig: 12, 20 79 | offset: 0, 0 80 | index: -1 81 | button-blue-over 82 | rotate: false 83 | xy: 256, 71 84 | size: 12, 20 85 | split: 5, 5, 5, 4 86 | pad: 4, 4, 1, 1 87 | orig: 12, 20 88 | offset: 0, 0 89 | index: -1 90 | button-over 91 | rotate: false 92 | xy: 256, 29 93 | size: 12, 20 94 | split: 5, 5, 5, 4 95 | pad: 4, 4, 1, 1 96 | orig: 12, 20 97 | offset: 0, 0 98 | index: -1 99 | button-red 100 | rotate: false 101 | xy: 256, 8 102 | size: 12, 20 103 | split: 5, 5, 5, 4 104 | pad: 4, 4, 1, 1 105 | orig: 12, 20 106 | offset: 0, 0 107 | index: -1 108 | button-window-bg 109 | rotate: false 110 | xy: 296, 161 111 | size: 12, 20 112 | split: 5, 5, 5, 4 113 | pad: 4, 4, 1, 1 114 | orig: 12, 20 115 | offset: 0, 0 116 | index: -1 117 | check-off 118 | rotate: false 119 | xy: 437, 241 120 | size: 14, 14 121 | orig: 14, 14 122 | offset: 0, 0 123 | index: -1 124 | textfield 125 | rotate: false 126 | xy: 437, 241 127 | size: 14, 14 128 | split: 1, 1, 1, 1 129 | orig: 14, 14 130 | offset: 0, 0 131 | index: -1 132 | vis-check 133 | rotate: false 134 | xy: 437, 241 135 | size: 14, 14 136 | orig: 14, 14 137 | offset: 0, 0 138 | index: -1 139 | check-on 140 | rotate: false 141 | xy: 452, 241 142 | size: 14, 14 143 | orig: 14, 14 144 | offset: 0, 0 145 | index: -1 146 | color-picker-bar-selector 147 | rotate: false 148 | xy: 292, 137 149 | size: 7, 14 150 | orig: 7, 14 151 | offset: 0, 0 152 | index: -1 153 | color-picker-cross 154 | rotate: false 155 | xy: 333, 220 156 | size: 5, 5 157 | orig: 5, 5 158 | offset: 0, 0 159 | index: -1 160 | color-picker-selector-horizontal 161 | rotate: false 162 | xy: 339, 220 163 | size: 3, 1 164 | orig: 3, 1 165 | offset: 0, 0 166 | index: -1 167 | color-picker-selector-vertical 168 | rotate: false 169 | xy: 300, 148 170 | size: 1, 3 171 | orig: 1, 3 172 | offset: 0, 0 173 | index: -1 174 | cursor 175 | rotate: false 176 | xy: 329, 178 177 | size: 1, 1 178 | orig: 1, 1 179 | offset: 0, 0 180 | index: -1 181 | default 182 | rotate: false 183 | xy: 1, 116 184 | size: 254, 139 185 | orig: 256, 256 186 | offset: 0, 117 187 | index: -1 188 | default-pane 189 | rotate: false 190 | xy: 44, 1 191 | size: 5, 3 192 | split: 1, 1, 1, 1 193 | orig: 5, 3 194 | offset: 0, 0 195 | index: -1 196 | default-pane-noborder 197 | rotate: false 198 | xy: 322, 181 199 | size: 1, 1 200 | split: 0, 0, 0, 0 201 | orig: 1, 1 202 | offset: 0, 0 203 | index: -1 204 | default-select 205 | rotate: false 206 | xy: 256, 152 207 | size: 27, 24 208 | split: 4, 16, 0, 24 209 | orig: 27, 24 210 | offset: 0, 0 211 | index: -1 212 | default-select-selection 213 | rotate: false 214 | xy: 307, 133 215 | size: 3, 3 216 | split: 1, 1, 1, 1 217 | orig: 3, 3 218 | offset: 0, 0 219 | index: -1 220 | font-small 221 | rotate: false 222 | xy: 1, 10 223 | size: 254, 105 224 | orig: 256, 128 225 | offset: 0, 22 226 | index: -1 227 | grey 228 | rotate: false 229 | xy: 284, 94 230 | size: 1, 1 231 | orig: 1, 1 232 | offset: 0, 0 233 | index: -1 234 | menu-bg 235 | rotate: false 236 | xy: 284, 94 237 | size: 1, 1 238 | orig: 1, 1 239 | offset: 0, 0 240 | index: -1 241 | icon-arrow-left 242 | rotate: false 243 | xy: 256, 136 244 | size: 21, 15 245 | orig: 22, 22 246 | offset: 1, 4 247 | index: -1 248 | icon-arrow-right 249 | rotate: false 250 | xy: 284, 182 251 | size: 21, 15 252 | orig: 22, 22 253 | offset: 1, 4 254 | index: -1 255 | icon-close 256 | rotate: false 257 | xy: 302, 148 258 | size: 10, 10 259 | orig: 22, 22 260 | offset: 6, 6 261 | index: -1 262 | icon-close-titlebar 263 | rotate: false 264 | xy: 313, 151 265 | size: 10, 10 266 | orig: 22, 22 267 | offset: 6, 6 268 | index: -1 269 | icon-drive 270 | rotate: false 271 | xy: 268, 113 272 | size: 18, 5 273 | orig: 22, 22 274 | offset: 2, 8 275 | index: -1 276 | icon-file-audio 277 | rotate: false 278 | xy: 467, 237 279 | size: 14, 18 280 | orig: 22, 22 281 | offset: 4, 2 282 | index: -1 283 | icon-file-image 284 | rotate: false 285 | xy: 497, 239 286 | size: 14, 16 287 | orig: 22, 22 288 | offset: 4, 3 289 | index: -1 290 | icon-file-pdf 291 | rotate: false 292 | xy: 482, 237 293 | size: 14, 18 294 | orig: 22, 22 295 | offset: 4, 2 296 | index: -1 297 | icon-file-text 298 | rotate: false 299 | xy: 497, 222 300 | size: 14, 16 301 | orig: 22, 22 302 | offset: 4, 3 303 | index: -1 304 | icon-folder 305 | rotate: false 306 | xy: 371, 242 307 | size: 18, 13 308 | orig: 22, 22 309 | offset: 2, 6 310 | index: -1 311 | icon-folder-new 312 | rotate: false 313 | xy: 312, 221 314 | size: 18, 15 315 | orig: 22, 22 316 | offset: 2, 3 317 | index: -1 318 | icon-folder-parent 319 | rotate: false 320 | xy: 306, 183 321 | size: 18, 14 322 | orig: 22, 22 323 | offset: 2, 5 324 | index: -1 325 | icon-folder-star 326 | rotate: false 327 | xy: 352, 241 328 | size: 18, 14 329 | orig: 22, 22 330 | offset: 2, 4 331 | index: -1 332 | icon-list-settings 333 | rotate: false 334 | xy: 312, 237 335 | size: 20, 18 336 | orig: 22, 22 337 | offset: 2, 1 338 | index: -1 339 | icon-maximize 340 | rotate: false 341 | xy: 333, 226 342 | size: 12, 12 343 | orig: 22, 22 344 | offset: 5, 5 345 | index: -1 346 | icon-minimize 347 | rotate: false 348 | xy: 44, 5 349 | size: 10, 4 350 | orig: 22, 22 351 | offset: 6, 5 352 | index: -1 353 | icon-refresh 354 | rotate: false 355 | xy: 268, 119 356 | size: 14, 16 357 | orig: 22, 22 358 | offset: 4, 3 359 | index: -1 360 | icon-restore 361 | rotate: false 362 | xy: 278, 136 363 | size: 13, 15 364 | orig: 22, 22 365 | offset: 5, 3 366 | index: -1 367 | icon-star 368 | rotate: false 369 | xy: 390, 241 370 | size: 16, 14 371 | orig: 22, 22 372 | offset: 3, 4 373 | index: -1 374 | icon-star-outline 375 | rotate: false 376 | xy: 333, 239 377 | size: 18, 16 378 | orig: 22, 22 379 | offset: 2, 3 380 | index: -1 381 | icon-trash 382 | rotate: false 383 | xy: 283, 119 384 | size: 12, 16 385 | orig: 22, 22 386 | offset: 5, 3 387 | index: -1 388 | list-selection 389 | rotate: false 390 | xy: 311, 146 391 | size: 1, 1 392 | orig: 1, 1 393 | offset: 0, 0 394 | index: -1 395 | vis-blue 396 | rotate: false 397 | xy: 311, 146 398 | size: 1, 1 399 | orig: 1, 1 400 | offset: 0, 0 401 | index: -1 402 | padded-list-selection 403 | rotate: false 404 | xy: 352, 239 405 | size: 10, 1 406 | split: 4, 4, 0, 1 407 | orig: 10, 1 408 | offset: 0, 0 409 | index: -1 410 | progressbar 411 | rotate: false 412 | xy: 284, 96 413 | size: 1, 16 414 | orig: 1, 16 415 | offset: 0, 0 416 | index: -1 417 | progressbar-filled 418 | rotate: false 419 | xy: 331, 220 420 | size: 1, 16 421 | orig: 1, 16 422 | offset: 0, 0 423 | index: -1 424 | progressbar-filled-vertical 425 | rotate: false 426 | xy: 19, 8 427 | size: 16, 1 428 | orig: 16, 1 429 | offset: 0, 0 430 | index: -1 431 | progressbar-vertical 432 | rotate: false 433 | xy: 296, 159 434 | size: 16, 1 435 | orig: 16, 1 436 | offset: 0, 0 437 | index: -1 438 | radio-off 439 | rotate: false 440 | xy: 269, 98 441 | size: 14, 14 442 | orig: 14, 14 443 | offset: 0, 0 444 | index: -1 445 | radio-on 446 | rotate: false 447 | xy: 269, 83 448 | size: 14, 14 449 | orig: 14, 14 450 | offset: 0, 0 451 | index: -1 452 | scroll 453 | rotate: false 454 | xy: 19, 1 455 | size: 17, 6 456 | split: 2, 2, 2, 2 457 | orig: 17, 6 458 | offset: 0, 0 459 | index: -1 460 | scroll-horizontal 461 | rotate: false 462 | xy: 325, 180 463 | size: 6, 17 464 | split: 2, 2, 0, 17 465 | pad: -1, -1, 2, 2 466 | orig: 6, 17 467 | offset: 0, 0 468 | index: -1 469 | scroll-knob-horizontal 470 | rotate: false 471 | xy: 322, 162 472 | size: 6, 17 473 | split: 2, 2, 0, 17 474 | pad: -1, -1, 6, 6 475 | orig: 6, 17 476 | offset: 0, 0 477 | index: -1 478 | scroll-knob-vertical 479 | rotate: false 480 | xy: 284, 152 481 | size: 17, 6 482 | split: 6, 6, 2, 2 483 | orig: 17, 6 484 | offset: 0, 0 485 | index: -1 486 | select-box-list-bg 487 | rotate: false 488 | xy: 331, 212 489 | size: 1, 1 490 | orig: 1, 1 491 | offset: 0, 0 492 | index: -1 493 | window-bg 494 | rotate: false 495 | xy: 331, 212 496 | size: 1, 1 497 | orig: 1, 1 498 | offset: 0, 0 499 | index: -1 500 | select-down 501 | rotate: false 502 | xy: 287, 114 503 | size: 7, 4 504 | orig: 7, 4 505 | offset: 0, 0 506 | index: -1 507 | select-up 508 | rotate: false 509 | xy: 346, 234 510 | size: 7, 4 511 | orig: 7, 4 512 | offset: 0, 0 513 | index: -1 514 | selection 515 | rotate: false 516 | xy: 337, 218 517 | size: 1, 1 518 | orig: 1, 1 519 | offset: 0, 0 520 | index: -1 521 | separator 522 | rotate: false 523 | xy: 296, 120 524 | size: 1, 1 525 | orig: 1, 1 526 | offset: 0, 0 527 | index: -1 528 | tree-over 529 | rotate: false 530 | xy: 296, 120 531 | size: 1, 1 532 | orig: 1, 1 533 | offset: 0, 0 534 | index: -1 535 | separator-menu 536 | rotate: false 537 | xy: 300, 124 538 | size: 1, 1 539 | orig: 1, 1 540 | offset: 0, 0 541 | index: -1 542 | slider 543 | rotate: false 544 | xy: 55, 5 545 | size: 1, 4 546 | orig: 1, 4 547 | offset: 0, 0 548 | index: -1 549 | slider-knob 550 | rotate: false 551 | xy: 307, 198 552 | size: 11, 22 553 | orig: 11, 22 554 | offset: 0, 0 555 | index: -1 556 | slider-knob-disabled 557 | rotate: false 558 | xy: 256, 113 559 | size: 11, 22 560 | orig: 11, 22 561 | offset: 0, 0 562 | index: -1 563 | slider-knob-down 564 | rotate: false 565 | xy: 284, 159 566 | size: 11, 22 567 | orig: 11, 22 568 | offset: 0, 0 569 | index: -1 570 | slider-knob-over 571 | rotate: false 572 | xy: 319, 198 573 | size: 11, 22 574 | orig: 11, 22 575 | offset: 0, 0 576 | index: -1 577 | slider-vertical 578 | rotate: false 579 | xy: 313, 149 580 | size: 4, 1 581 | orig: 4, 1 582 | offset: 0, 0 583 | index: -1 584 | splitpane 585 | rotate: false 586 | xy: 363, 239 587 | size: 4, 1 588 | orig: 4, 1 589 | offset: 0, 0 590 | index: -1 591 | splitpane-over 592 | rotate: false 593 | xy: 324, 152 594 | size: 4, 1 595 | orig: 4, 1 596 | offset: 0, 0 597 | index: -1 598 | splitpane-vertical 599 | rotate: false 600 | xy: 57, 5 601 | size: 1, 4 602 | orig: 1, 4 603 | offset: 0, 0 604 | index: -1 605 | splitpane-vertical-over 606 | rotate: false 607 | xy: 59, 5 608 | size: 1, 4 609 | orig: 1, 4 610 | offset: 0, 0 611 | index: -1 612 | sub-menu 613 | rotate: false 614 | xy: 324, 154 615 | size: 4, 7 616 | orig: 4, 7 617 | offset: 0, 0 618 | index: -1 619 | textfield-over 620 | rotate: false 621 | xy: 269, 68 622 | size: 14, 14 623 | split: 1, 1, 1, 1 624 | orig: 14, 14 625 | offset: 0, 0 626 | index: -1 627 | vis-check-over 628 | rotate: false 629 | xy: 269, 68 630 | size: 14, 14 631 | orig: 14, 14 632 | offset: 0, 0 633 | index: -1 634 | tooltip-bg 635 | rotate: false 636 | xy: 58, 1 637 | size: 3, 3 638 | split: 1, 1, 1, 1 639 | orig: 3, 3 640 | offset: 0, 0 641 | index: -1 642 | touchpad-knob 643 | rotate: false 644 | xy: 284, 198 645 | size: 22, 22 646 | orig: 22, 22 647 | offset: 0, 0 648 | index: -1 649 | tree-minus 650 | rotate: false 651 | xy: 331, 214 652 | size: 5, 5 653 | orig: 8, 8 654 | offset: 1, 2 655 | index: -1 656 | tree-plus 657 | rotate: false 658 | xy: 37, 1 659 | size: 6, 8 660 | orig: 8, 8 661 | offset: 1, 0 662 | index: -1 663 | tree-selection 664 | rotate: false 665 | xy: 354, 235 666 | size: 3, 3 667 | split: 1, 1, 1, 1 668 | orig: 3, 3 669 | offset: 0, 0 670 | index: -1 671 | vis-check-down 672 | rotate: false 673 | xy: 269, 53 674 | size: 14, 14 675 | orig: 14, 14 676 | offset: 0, 0 677 | index: -1 678 | vis-check-tick 679 | rotate: false 680 | xy: 300, 137 681 | size: 10, 10 682 | orig: 14, 14 683 | offset: 2, 2 684 | index: -1 685 | vis-check-tick-disabled 686 | rotate: false 687 | xy: 296, 126 688 | size: 10, 10 689 | orig: 14, 14 690 | offset: 2, 2 691 | index: -1 692 | vis-radio 693 | rotate: false 694 | xy: 269, 38 695 | size: 14, 14 696 | orig: 14, 14 697 | offset: 0, 0 698 | index: -1 699 | vis-radio-down 700 | rotate: false 701 | xy: 269, 23 702 | size: 14, 14 703 | orig: 14, 14 704 | offset: 0, 0 705 | index: -1 706 | vis-radio-over 707 | rotate: false 708 | xy: 269, 8 709 | size: 14, 14 710 | orig: 14, 14 711 | offset: 0, 0 712 | index: -1 713 | vis-radio-tick 714 | rotate: false 715 | xy: 1, 1 716 | size: 8, 8 717 | orig: 14, 14 718 | offset: 3, 3 719 | index: -1 720 | vis-radio-tick-disabled 721 | rotate: false 722 | xy: 10, 1 723 | size: 8, 8 724 | orig: 14, 14 725 | offset: 3, 3 726 | index: -1 727 | vis-red 728 | rotate: false 729 | xy: 307, 131 730 | size: 1, 1 731 | orig: 1, 1 732 | offset: 0, 0 733 | index: -1 734 | white 735 | rotate: false 736 | xy: 346, 230 737 | size: 3, 3 738 | orig: 3, 3 739 | offset: 0, 0 740 | index: -1 741 | window 742 | rotate: false 743 | xy: 284, 221 744 | size: 27, 34 745 | split: 5, 4, 26, 3 746 | orig: 27, 34 747 | offset: 0, 0 748 | index: -1 749 | window-border-bg 750 | rotate: false 751 | xy: 339, 222 752 | size: 3, 3 753 | split: 1, 1, 1, 1 754 | orig: 3, 3 755 | offset: 0, 0 756 | index: -1 757 | window-noborder 758 | rotate: false 759 | xy: 256, 177 760 | size: 27, 34 761 | split: 5, 4, 26, 3 762 | orig: 27, 34 763 | offset: 0, 0 764 | index: -1 765 | window-resizable 766 | rotate: false 767 | xy: 256, 212 768 | size: 27, 43 769 | split: 5, 12, 3, 12 770 | pad: 5, 5, 25, 3 771 | orig: 27, 43 772 | offset: 0, 0 773 | index: -1 774 | -------------------------------------------------------------------------------- /android/assets/ui/temp-skin.json: -------------------------------------------------------------------------------- 1 | { 2 | com.badlogic.gdx.graphics.g2d.BitmapFont: { 3 | default-font: {file: font-24.fnt }, 4 | small-font: {file: font-24.fnt } 5 | }, 6 | com.badlogic.gdx.graphics.Color: { 7 | black: {a: 1, b: 0, g: 0, r: 0 }, 8 | white: {a: 1, b: 1, g: 1, r: 1 }, 9 | green: {a: 1, b: 0, g: 1, r: 0 }, 10 | red: {a: 1, b: 0, g: 0, r: 1 }, 11 | blue: {a: 1, b: 1, g: 0, r: 0 }, 12 | grey: {a: 1, b: 0.32, g: 0.32, r: 0.32 }, 13 | vis-blue: {a: 1, b: 0.886, g: 0.631, r: 0.105 }, 14 | vis-red: {a: 1, b: 0.047, g: 0, r: 0.862 }, 15 | menuitem: {a: 1, b: 0.65, g: 0.65, r: 0.65 }, 16 | link-label: {a: 1, b: 0.886, g: 0.631, r: 0.105 } 17 | }, 18 | com.badlogic.gdx.scenes.scene2d.ui.Skin$TintedDrawable: { 19 | dialogDim: {name: white, color: {r: 0, g: 0, b: 0, a: 0.45} } 20 | }, 21 | com.badlogic.gdx.scenes.scene2d.ui.Button$ButtonStyle: { 22 | default: {down: button-down, up: button }, 23 | blue: {down: button-blue-down, up: button-blue }, 24 | toggle: {checked: button-down, down: button-down, up: button } 25 | }, 26 | com.badlogic.gdx.scenes.scene2d.ui.TextButton$TextButtonStyle: { 27 | default: {over: button-over, disabled: button, font: default-font, fontColor: white, disabledFontColor: grey, down: button-down, up: button }, 28 | blue: {over: button-blue-over, disabled: button, font: default-font, fontColor: white, disabledFontColor: grey, down: button-blue-down, up: button-blue }, 29 | toggle: {font: default-font, fontColor: white, checked: button-down, down: button-down, up: button, over: button-over, disabled: button, disabledFontColor: grey } 30 | }, 31 | com.badlogic.gdx.scenes.scene2d.ui.ImageButton$ImageButtonStyle: { 32 | default: {down: button-down, up: button }, 33 | blue: {down: button-blue-down, up: button-blue }, 34 | toggle: {checked: button-down, down: button-down, up: button } 35 | }, 36 | com.badlogic.gdx.scenes.scene2d.ui.ImageTextButton$ImageTextButtonStyle: { 37 | default: {down: button-down, up: button, over: button-over, disabled: button, font: default-font, fontColor: white, disabledFontColor: grey }, 38 | blue: {down: button-blue-down, up: button-blue, over: button-blue-over, disabled: button, font: default-font, fontColor: white, disabledFontColor: grey }, 39 | toggle: {checked: button-down, down: button-down, up: button, font: default-font, fontColor: white, over: button-over, disabled: button, disabledFontColor: grey } 40 | }, 41 | com.badlogic.gdx.scenes.scene2d.ui.ScrollPane$ScrollPaneStyle: { 42 | list: {vScroll: scroll, vScrollKnob: scroll-knob-vertical, hScroll: scroll-horizontal, hScrollKnob: scroll-knob-horizontal }, 43 | default: {background: border, vScroll: scroll, vScrollKnob: scroll-knob-vertical, hScroll: scroll-horizontal, hScrollKnob: scroll-knob-horizontal } 44 | }, 45 | com.badlogic.gdx.scenes.scene2d.ui.SelectBox$SelectBoxStyle: { 46 | default: {background: default-select, scrollStyle: default, listStyle: {font: default-font, selection: padded-list-selection, background: select-box-list-bg}, font: default-font, fontColor: white, disabledFontColor: grey } 47 | }, 48 | com.badlogic.gdx.scenes.scene2d.ui.SplitPane$SplitPaneStyle: { 49 | default-vertical: {handle: splitpane-vertical }, 50 | default-horizontal: {handle: splitpane } 51 | }, 52 | com.badlogic.gdx.scenes.scene2d.ui.Window$WindowStyle: { 53 | default: {titleFont: default-font, background: window, titleFontColor: white }, 54 | resizable: {background: window-resizable, titleFont: default-font, titleFontColor: white }, 55 | noborder: {background: window-noborder, titleFont: default-font, titleFontColor: white }, 56 | dialog: {stageBackground: dialogDim, titleFont: default-font, background: window, titleFontColor: white } 57 | }, 58 | com.badlogic.gdx.scenes.scene2d.ui.ProgressBar$ProgressBarStyle: { 59 | default-horizontal: {background: progressbar, knob: progressbar-filled, knobBefore: progressbar-filled }, 60 | default-vertical: {background: progressbar-vertical, knob: progressbar-filled-vertical, knobBefore: progressbar-filled-vertical } 61 | }, 62 | com.badlogic.gdx.scenes.scene2d.ui.Slider$SliderStyle: { 63 | default-horizontal: {background: slider, knob: slider-knob, knobOver: slider-knob-over, knobDown: slider-knob-down, disabledKnob: slider-knob-disabled }, 64 | default-vertical: {background: slider-vertical, knob: slider-knob, knobOver: slider-knob-over, knobDown: slider-knob-down, disabledKnob: slider-knob-disabled } 65 | }, 66 | com.badlogic.gdx.scenes.scene2d.ui.Label$LabelStyle: { 67 | default: {font: default-font, fontColor: white }, 68 | link-label: {fontColor: link-label, font: default-font }, 69 | small: {font: small-font, fontColor: white }, 70 | menuitem-shortcut: {font: default-font, fontColor: menuitem } 71 | }, 72 | com.badlogic.gdx.scenes.scene2d.ui.TextField$TextFieldStyle: { 73 | default: {font: default-font, fontColor: white, disabledFontColor: grey, selection: selection, background: textfield, cursor: cursor, messageFont: default-font, messageFontColor: grey }, 74 | small: {font: small-font, fontColor: white, disabledFontColor: grey, selection: selection, background: textfield, cursor: cursor, messageFont: default-font, messageFontColor: grey } 75 | }, 76 | com.badlogic.gdx.scenes.scene2d.ui.CheckBox$CheckBoxStyle: { 77 | default: {checkboxOn: check-on, checkboxOff: check-off, font: default-font, fontColor: white, disabledFontColor: grey }, 78 | radio: {checkboxOn: radio-on, checkboxOff: radio-off, font: default-font, fontColor: white, disabledFontColor: grey } 79 | }, 80 | com.badlogic.gdx.scenes.scene2d.ui.List$ListStyle: { 81 | default: {fontColorUnselected: white, selection: padded-list-selection, fontColorSelected: white, font: default-font } 82 | }, 83 | com.badlogic.gdx.scenes.scene2d.ui.Touchpad$TouchpadStyle: { 84 | default: {background: default-pane, knob: touchpad-knob } 85 | }, 86 | com.badlogic.gdx.scenes.scene2d.ui.Tree$TreeStyle: { 87 | default: {minus: tree-minus, plus: tree-plus, selection: tree-selection, over: tree-over } 88 | }, 89 | com.badlogic.gdx.scenes.scene2d.ui.TextTooltip$TextTooltipStyle: { 90 | default: {background: default-pane, label: {font: default-font, fontColor: white} } 91 | }, 92 | com.kotcrab.vis.ui.Sizes: { 93 | default: {scaleFactor: 1, spacingBottom: 8, spacingRight: 6, buttonBarSpacing: 10, menuItemIconSize: 22, borderSize: 1, spinnerButtonHeight: 12, spinnerFieldSize: 40, fileChooserViewModeBigIconsSize: 200, fileChooserViewModeMediumIconsSize: 128, fileChooserViewModeSmallIconsSize: 64, fileChooserViewModeListWidthSize: 155 }, 94 | x2: {scaleFactor: 2, menuItemIconSize: 44, spinnerButtonHeight: 24, spinnerFieldSize: 80, spacingBottom: 8, spacingRight: 6, buttonBarSpacing: 10, borderSize: 1, fileChooserViewModeBigIconsSize: 200, fileChooserViewModeMediumIconsSize: 128, fileChooserViewModeSmallIconsSize: 64, fileChooserViewModeListWidthSize: 155 } 95 | }, 96 | com.kotcrab.vis.ui.widget.VisTextField$VisTextFieldStyle: { 97 | default: {focusBorder: border, errorBorder: border-error, font: default-font, fontColor: white, disabledFontColor: grey, selection: selection, background: textfield, backgroundOver: textfield-over, cursor: cursor }, 98 | textArea: {errorBorder: border-error, font: default-font, fontColor: white, disabledFontColor: grey, selection: selection, background: textfield, cursor: cursor }, 99 | small: {focusBorder: border, errorBorder: border-error, font: small-font, fontColor: white, disabledFontColor: grey, selection: selection, background: textfield, backgroundOver: textfield-over, cursor: cursor }, 100 | label: {selection: selection, errorBorder: border-error, font: default-font, fontColor: white, disabledFontColor: grey } 101 | }, 102 | com.kotcrab.vis.ui.widget.VisTextButton$VisTextButtonStyle: { 103 | default: {focusBorder: border, down: button-down, up: button, over: button-over, disabled: button, font: default-font, fontColor: white, disabledFontColor: grey }, 104 | toggle: {focusBorder: border, checked: button-down, down: button-down, up: button, font: default-font, fontColor: white, over: button-over, disabled: button, disabledFontColor: grey }, 105 | blue: {focusBorder: border-dark-blue, down: button-blue-down, up: button-blue, over: button-blue-over, disabled: button, font: default-font, fontColor: white, disabledFontColor: grey }, 106 | menu-bar: {over: button-down, font: default-font, fontColor: white, down: button-down, up: button, disabled: button, disabledFontColor: grey } 107 | }, 108 | com.kotcrab.vis.ui.widget.VisImageButton$VisImageButtonStyle: { 109 | default: {down: button-down, up: button, over: button-over, disabled: button, focusBorder: border }, 110 | blue: {down: button-blue-down, up: button-blue, over: button-blue-over, disabled: button-blue, focusBorder: border-dark-blue }, 111 | toggle: {checked: button-down, focusBorder: border, down: button-down, up: button, over: button-over, disabled: button }, 112 | close: {down: button-red, up: button, over: button-over, imageUp: icon-close, disabled: button }, 113 | close-active-tab: {down: button-red, imageUp: icon-close, up: button-blue, over: button-blue-over, disabled: button-blue }, 114 | close-window: {up: button-window-bg, down: button-red, over: button-over, imageUp: icon-close, disabled: button }, 115 | close-titlebar: {imageUp: icon-close-titlebar, down: button-red, up: button, over: button-over, disabled: button } 116 | }, 117 | com.kotcrab.vis.ui.widget.VisImageTextButton$VisImageTextButtonStyle: { 118 | default: {down: button-down, up: button, over: button-over, disabled: button, font: default-font, fontColor: white, disabledFontColor: grey, focusBorder: border }, 119 | toggle: {checked: button-down, down: button-down, up: button, font: default-font, fontColor: white, over: button-over, disabled: button, disabledFontColor: grey, focusBorder: border }, 120 | blue: {down: button-blue-down, up: button-blue, over: button-blue-over, disabled: button, font: default-font, fontColor: white, disabledFontColor: grey, focusBorder: border-dark-blue }, 121 | default-noborder: {down: button-down, up: button, over: button-over, disabled: button, font: default-font, fontColor: white, disabledFontColor: grey }, 122 | toggle-noborder: {checked: button-down, down: button-down, up: button, font: default-font, fontColor: white, over: button-over, disabled: button, disabledFontColor: grey }, 123 | menu-bar: {over: button-down, font: default-font, fontColor: white, down: button-down, up: button, disabled: button, disabledFontColor: grey } 124 | }, 125 | com.kotcrab.vis.ui.widget.VisCheckBox$VisCheckBoxStyle: { 126 | default: {checkBackground: vis-check, checkBackgroundOver: vis-check-over, checkBackgroundDown: vis-check-down, tick: vis-check-tick, tickDisabled: vis-check-tick-disabled, focusBorder: border, errorBorder: border-error, font: default-font, fontColor: white, disabledFontColor: grey }, 127 | radio: {checkBackground: vis-radio, checkBackgroundOver: vis-radio-over, checkBackgroundDown: vis-radio-down, tick: vis-radio-tick, tickDisabled: vis-radio-tick-disabled, focusBorder: border-circle, errorBorder: border-circle-error, font: default-font, fontColor: white, disabledFontColor: grey } 128 | }, 129 | com.kotcrab.vis.ui.widget.PopupMenu$PopupMenuStyle: { 130 | noborder: {background: button }, 131 | default: {background: button, border: border } 132 | }, 133 | com.kotcrab.vis.ui.widget.Menu$MenuStyle: { 134 | default: {background: button, border: border, openButtonStyle: menu-bar }, 135 | noborder: {background: button, openButtonStyle: menu-bar } 136 | }, 137 | com.kotcrab.vis.ui.widget.MenuBar$MenuBarStyle: { 138 | default: {background: menu-bg } 139 | }, 140 | com.kotcrab.vis.ui.widget.Separator$SeparatorStyle: { 141 | default: {background: separator, thickness: 4 }, 142 | menu: {background: separator-menu, thickness: 3 } 143 | }, 144 | com.kotcrab.vis.ui.widget.VisSplitPane$VisSplitPaneStyle: { 145 | default-vertical: {handle: splitpane-vertical, handleOver: splitpane-vertical-over }, 146 | default-horizontal: {handle: splitpane, handleOver: splitpane-over } 147 | }, 148 | com.kotcrab.vis.ui.widget.MultiSplitPane$MultiSplitPaneStyle: { 149 | default-vertical: {handle: splitpane-vertical, handleOver: splitpane-vertical-over }, 150 | default-horizontal: {handle: splitpane, handleOver: splitpane-over } 151 | }, 152 | com.kotcrab.vis.ui.widget.MenuItem$MenuItemStyle: { 153 | default: {subMenu: sub-menu, down: button-down, up: button, over: button-over, disabled: button, font: default-font, fontColor: white, disabledFontColor: grey }, 154 | blue: {down: button-blue-down, up: button-blue, over: button-blue-over, disabled: button, font: default-font, fontColor: white, disabledFontColor: grey }, 155 | toggle: {checked: button-down, down: button-down, up: button, font: default-font, fontColor: white, over: button-over, disabled: button, disabledFontColor: grey, subMenu: sub-menu } 156 | }, 157 | com.kotcrab.vis.ui.widget.Tooltip$TooltipStyle: { 158 | default: {background: tooltip-bg } 159 | }, 160 | com.kotcrab.vis.ui.widget.LinkLabel$LinkLabelStyle: { 161 | default: {fontColor: link-label, underline: white, font: default-font } 162 | }, 163 | com.kotcrab.vis.ui.widget.tabbedpane.TabbedPane$TabbedPaneStyle: { 164 | default: {background: menu-bg, separatorBar: list-selection, vertical: false, buttonStyle: {down: button-down, up: button, checked: button-down, over: button-over, disabled: button, font: default-font, fontColor: white, disabledFontColor: grey} }, 165 | vertical: {vertical: true, background: menu-bg, separatorBar: list-selection, buttonStyle: {down: button-down, up: button, checked: button-down, over: button-over, disabled: button, font: default-font, fontColor: white, disabledFontColor: grey} } 166 | }, 167 | com.kotcrab.vis.ui.widget.spinner.Spinner$SpinnerStyle: { 168 | default: {down: select-down, up: select-up } 169 | }, 170 | com.kotcrab.vis.ui.widget.file.FileChooserStyle: { 171 | default: {highlight: list-selection, popupMenuStyle: "default", iconArrowLeft: icon-arrow-left, iconArrowRight: icon-arrow-right, iconFolder: icon-folder, iconFolderParent: icon-folder-parent, iconFolderNew: icon-folder-new, iconDrive: icon-drive, iconFolderStar: icon-folder-star, iconTrash: icon-trash, iconStar: icon-star, iconStarOutline: icon-star-outline, iconRefresh: icon-refresh, iconFileText: icon-file-text, iconFileImage: icon-file-image, iconFilePdf: icon-file-pdf, iconFileAudio: icon-file-audio, iconListSettings: icon-list-settings, contextMenuSelectedItem: vis-radio-tick, expandDropdown: select-down } 172 | }, 173 | com.kotcrab.vis.ui.widget.color.ColorPickerWidgetStyle: { 174 | default: {barSelector: color-picker-bar-selector, cross: color-picker-cross, iconArrowRight: icon-arrow-right, verticalSelector: color-picker-selector-vertical, horizontalSelector: color-picker-selector-horizontal } 175 | }, 176 | com.kotcrab.vis.ui.widget.color.ColorPickerStyle: { 177 | default: {pickerStyle: {barSelector: color-picker-bar-selector, cross: color-picker-cross, iconArrowRight: icon-arrow-right, verticalSelector: color-picker-selector-vertical, horizontalSelector: color-picker-selector-horizontal}, titleFont: default-font, background: window, titleFontColor: white } 178 | }, 179 | com.kotcrab.vis.ui.widget.toast.Toast$ToastStyle: { 180 | default: {background: tooltip-bg, closeButtonStyle: close }, 181 | dark: {background: window-border-bg, closeButtonStyle: close-window } 182 | }, 183 | com.kotcrab.vis.ui.widget.BusyBar$BusyBarStyle: { 184 | default: {height: 2, segment: vis-blue, segmentWidth: 100, segmentOverflow: 50 }, 185 | slim: {height: 1, segment: vis-blue, segmentWidth: 100, segmentOverflow: 50 }, 186 | thick: {height: 6, segment: vis-blue, segmentWidth: 100, segmentOverflow: 50 } 187 | }, 188 | com.kotcrab.vis.ui.widget.ListViewStyle: { 189 | default: {scrollPaneStyle: list } 190 | }, 191 | com.kotcrab.vis.ui.util.form.SimpleFormValidator$FormValidatorStyle: { 192 | default: {errorLabelColor: vis-red, validLabelColor: white }, 193 | smooth: {colorTransitionDuration: 0.3, errorLabelColor: vis-red, validLabelColor: white } 194 | }, 195 | com.kotcrab.vis.ui.util.adapter.SimpleListAdapter$SimpleListAdapterStyle: { 196 | default: {background: window-bg, selection: list-selection } 197 | } 198 | 199 | } -------------------------------------------------------------------------------- /android/assets/ui/temp-skin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/assets/ui/temp-skin.png -------------------------------------------------------------------------------- /android/assets/ui/temp-skin.usl: -------------------------------------------------------------------------------- 1 | include 2 | 3 | #com.badlogic.gdx.graphics.g2d.BitmapFont: { 4 | default-font: { file: font-24.fnt } 5 | small-font: { file: font-24.fnt } 6 | } -------------------------------------------------------------------------------- /android/build.gradle: -------------------------------------------------------------------------------- 1 | android { 2 | buildToolsVersion "28.0.3" 3 | compileSdkVersion 28 4 | sourceSets { 5 | main { 6 | manifest.srcFile 'AndroidManifest.xml' 7 | java.srcDirs = ['src'] 8 | aidl.srcDirs = ['src'] 9 | renderscript.srcDirs = ['src'] 10 | res.srcDirs = ['res'] 11 | assets.srcDirs = ['assets'] 12 | jniLibs.srcDirs = ['libs'] 13 | } 14 | 15 | androidTest.setRoot('tests') 16 | } 17 | packagingOptions { 18 | exclude 'META-INF/robovm/ios/robovm.xml' 19 | } 20 | defaultConfig { 21 | applicationId "ru.hyst329.openfool" 22 | minSdkVersion 14 23 | targetSdkVersion 28 24 | multiDexEnabled true 25 | } 26 | productFlavors { 27 | } 28 | signingConfigs { 29 | } 30 | buildTypes { 31 | debug { 32 | 33 | } 34 | dev { 35 | 36 | } 37 | qa { 38 | 39 | } 40 | rc { 41 | 42 | } 43 | release { 44 | 45 | } 46 | } 47 | packagingOptions { 48 | exclude 'META-INF/android_debug.kotlin_module' 49 | } 50 | } 51 | // called every time gradle gets executed, takes the native dependencies of 52 | // the natives configuration, and extracts them to the proper libs/ folders 53 | // so they get packed with the APK. 54 | task copyAndroidNatives() { 55 | doFirst { 56 | file("libs/armeabi/").mkdirs(); 57 | file("libs/armeabi-v7a/").mkdirs(); 58 | file("libs/arm64-v8a/").mkdirs(); 59 | file("libs/x86_64/").mkdirs(); 60 | file("libs/x86/").mkdirs(); 61 | 62 | configurations.natives.files.each { jar -> 63 | def outputDir = null 64 | if (jar.name.endsWith("natives-arm64-v8a.jar")) outputDir = file("libs/arm64-v8a") 65 | if (jar.name.endsWith("natives-armeabi-v7a.jar")) outputDir = file("libs/armeabi-v7a") 66 | if (jar.name.endsWith("natives-armeabi.jar")) outputDir = file("libs/armeabi") 67 | if (jar.name.endsWith("natives-x86_64.jar")) outputDir = file("libs/x86_64") 68 | if (jar.name.endsWith("natives-x86.jar")) outputDir = file("libs/x86") 69 | if (outputDir != null) { 70 | copy { 71 | from zipTree(jar) 72 | into outputDir 73 | include "*.so" 74 | } 75 | } 76 | } 77 | } 78 | } 79 | task run(type: Exec) { 80 | def path 81 | def localProperties = project.file("../local.properties") 82 | if (localProperties.exists()) { 83 | Properties properties = new Properties() 84 | localProperties.withInputStream { instr -> 85 | properties.load(instr) 86 | } 87 | def sdkDir = properties.getProperty('sdk.dir') 88 | if (sdkDir) { 89 | path = sdkDir 90 | } else { 91 | path = "$System.env.ANDROID_HOME" 92 | } 93 | } else { 94 | path = "$System.env.ANDROID_HOME" 95 | } 96 | 97 | def adb = path + "/platform-tools/adb" 98 | commandLine "$adb", 'shell', 'am', 'start', '-n', 'ru.hyst329.openfool/ru.hyst329.openfool.AndroidLauncher' 99 | } 100 | // sets up the Android Eclipse project, using the old Ant based build. 101 | eclipse { 102 | // need to specify Java source sets explicitly, SpringSource Gradle Eclipse plugin 103 | // ignores any nodes added in classpath.file.withXml 104 | sourceSets { 105 | main { 106 | java.srcDirs "src", 'gen' 107 | } 108 | } 109 | 110 | jdt { 111 | sourceCompatibility = 1.7 112 | targetCompatibility = 1.7 113 | } 114 | 115 | classpath { 116 | plusConfigurations += [project.configurations.compile] 117 | containers 'com.android.ide.eclipse.adt.ANDROID_FRAMEWORK', 'com.android.ide.eclipse.adt.LIBRARIES' 118 | } 119 | 120 | project { 121 | name = appName + "-android" 122 | natures 'com.android.ide.eclipse.adt.AndroidNature' 123 | buildCommands.clear(); 124 | buildCommand "com.android.ide.eclipse.adt.ResourceManagerBuilder" 125 | buildCommand "com.android.ide.eclipse.adt.PreCompilerBuilder" 126 | buildCommand "org.eclipse.jdt.core.javabuilder" 127 | buildCommand "com.android.ide.eclipse.adt.ApkBuilder" 128 | } 129 | } 130 | // sets up the Android Idea project, using the old Ant based build. 131 | idea { 132 | module { 133 | sourceDirs += file("src"); 134 | scopes = [COMPILE: [plus: [project.configurations.compile]]] 135 | 136 | iml { 137 | withXml { 138 | def node = it.asNode() 139 | def builder = NodeBuilder.newInstance(); 140 | builder.current = node; 141 | builder.component(name: "FacetManager") { 142 | facet(type: "android", name: "Android") { 143 | configuration { 144 | option(name: "UPDATE_PROPERTY_FILES", value: "true") 145 | } 146 | } 147 | } 148 | } 149 | } 150 | } 151 | } 152 | dependencies { 153 | } -------------------------------------------------------------------------------- /android/ic_launcher-web.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/ic_launcher-web.png -------------------------------------------------------------------------------- /android/proguard-project.txt: -------------------------------------------------------------------------------- 1 | # To enable ProGuard in your project, edit project.properties 2 | # to define the proguard.config property as described in that file. 3 | # 4 | # Add project specific ProGuard rules here. 5 | # By default, the flags in this file are appended to flags specified 6 | # in ${sdk.dir}/tools/proguard/proguard-android.txt 7 | # You can edit the include path and order by changing the ProGuard 8 | # include property in project.properties. 9 | # 10 | # For more details, see 11 | # http://developer.android.com/guide/developing/tools/proguard.html 12 | 13 | # Add any project specific keep options here: 14 | 15 | # If your project uses WebView with JS, uncomment the following 16 | # and specify the fully qualified class name to the JavaScript interface 17 | # class: 18 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 19 | # public *; 20 | #} 21 | 22 | -verbose 23 | 24 | -dontwarn android.support.** 25 | -dontwarn com.badlogic.gdx.backends.android.AndroidFragmentApplication 26 | -dontwarn com.badlogic.gdx.utils.GdxBuild 27 | -dontwarn com.badlogic.gdx.physics.box2d.utils.Box2DBuild 28 | -dontwarn com.badlogic.gdx.jnigen.BuildTarget* 29 | -dontwarn com.badlogic.gdx.graphics.g2d.freetype.FreetypeBuild 30 | 31 | -keep class com.badlogic.gdx.controllers.android.AndroidControllers 32 | 33 | -keepclassmembers class com.badlogic.gdx.backends.android.AndroidInput* { 34 | (com.badlogic.gdx.Application, android.content.Context, java.lang.Object, com.badlogic.gdx.backends.android.AndroidApplicationConfiguration); 35 | } 36 | 37 | -keepclassmembers class com.badlogic.gdx.physics.box2d.World { 38 | boolean contactFilter(long, long); 39 | void beginContact(long); 40 | void endContact(long); 41 | void preSolve(long, long); 42 | void postSolve(long, long); 43 | boolean reportFixture(long); 44 | float reportRayFixture(long, float, float, float, float, float); 45 | } 46 | -------------------------------------------------------------------------------- /android/project.properties: -------------------------------------------------------------------------------- 1 | # This file is automatically generated by Android Tools. 2 | # Do not modify this file -- YOUR CHANGES WILL BE ERASED! 3 | # 4 | # This file must be checked in Version Control Systems. 5 | # 6 | # To customize properties used by the Ant build system edit 7 | # "ant.properties", and override values to adapt the script to your 8 | # project structure. 9 | # 10 | # To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home): 11 | #proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt 12 | 13 | # Project target. 14 | target=android-19 15 | -------------------------------------------------------------------------------- /android/res/drawable-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/res/drawable-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/res/drawable-mdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/res/drawable-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/res/drawable-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/res/drawable-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/res/drawable-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/res/drawable-xxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/res/drawable-xxxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/android/res/drawable-xxxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/res/values/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | OpenFool 5 | 6 | 7 | -------------------------------------------------------------------------------- /android/res/values/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /android/src/ru/hyst329/openfool/AndroidLauncher.kt: -------------------------------------------------------------------------------- 1 | package ru.hyst329.openfool 2 | 3 | import android.os.Bundle 4 | import com.badlogic.gdx.backends.android.AndroidApplication 5 | import com.badlogic.gdx.backends.android.AndroidApplicationConfiguration 6 | 7 | class AndroidLauncher : AndroidApplication() { 8 | override fun onCreate(savedInstanceState: Bundle?) { 9 | super.onCreate(savedInstanceState) 10 | val config = AndroidApplicationConfiguration() 11 | config.useAccelerometer = false 12 | config.useCompass = false 13 | initialize(OpenFoolGame(AndroidOrientationHelper(this)), config) 14 | } 15 | } -------------------------------------------------------------------------------- /android/src/ru/hyst329/openfool/AndroidOrientationHelper.kt: -------------------------------------------------------------------------------- 1 | package ru.hyst329.openfool 2 | 3 | import OrientationHelper 4 | import android.app.Activity 5 | import android.content.pm.ActivityInfo 6 | 7 | class AndroidOrientationHelper(val activity: Activity) : OrientationHelper { 8 | override fun requestOrientation(orientation: OrientationHelper.Orientation?): Boolean { 9 | this.orientation = orientation 10 | //return when (orientation) { 11 | if (orientation == OrientationHelper.Orientation.LANDSCAPE) { 12 | activity.requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE 13 | return true 14 | } 15 | if (orientation == OrientationHelper.Orientation.PORTRAIT) { 16 | activity.requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT 17 | return true 18 | } 19 | else { 20 | return false 21 | } 22 | //} 23 | } 24 | 25 | override var orientation: OrientationHelper.Orientation? = OrientationHelper.Orientation.LANDSCAPE 26 | } -------------------------------------------------------------------------------- /build.gradle: -------------------------------------------------------------------------------- 1 | buildscript { 2 | ext.kotlinVersion = '1.3.61' 3 | 4 | repositories { 5 | mavenLocal() 6 | mavenCentral() 7 | maven { url "https://oss.sonatype.org/content/repositories/snapshots/" } 8 | maven { url "https://maven.google.com" } 9 | maven { url "https://plugins.gradle.org/m2/" } 10 | jcenter() 11 | google() 12 | } 13 | dependencies { 14 | classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlinVersion" 15 | classpath 'de.richsource.gradle.plugins:gwt-gradle-plugin:0.6' 16 | classpath 'com.android.tools.build:gradle:3.5.3' 17 | classpath 'com.mobidevelop.robovm:robovm-gradle-plugin:2.3.3' 18 | classpath "gradle.plugin.com.palantir.graal:gradle-graal:0.6.0" 19 | } 20 | } 21 | 22 | allprojects { 23 | apply plugin: "eclipse" 24 | apply plugin: "idea" 25 | 26 | version = '0.3.0' 27 | ext { 28 | appName = "OpenFool" 29 | gdxVersion = '1.9.10' 30 | roboVMVersion = '2.3.7' 31 | box2DLightsVersion = '1.4' 32 | ashleyVersion = '1.7.3' 33 | aiVersion = '1.8.2' 34 | visuiVersion = '1.4.3' 35 | uslVersion = '0.2.1' 36 | kotlinLoggingVersion = '1.7.4' 37 | slf4jVersion = '1.7.26' 38 | logbackVersion = '1.2.3' 39 | } 40 | 41 | repositories { 42 | mavenLocal() 43 | mavenCentral() 44 | maven { url "https://oss.sonatype.org/content/repositories/snapshots/" } 45 | maven { url "https://oss.sonatype.org/content/repositories/releases/" } 46 | jcenter() 47 | google() 48 | } 49 | } 50 | 51 | project(":desktop") { 52 | apply plugin: "kotlin" 53 | apply plugin: "com.palantir.graal" 54 | 55 | dependencies { 56 | api project(":core") 57 | api "com.badlogicgames.gdx:gdx-backend-lwjgl:$gdxVersion" 58 | api "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-desktop" 59 | api "com.badlogicgames.gdx:gdx-box2d-platform:$gdxVersion:natives-desktop" 60 | api "com.badlogicgames.gdx:gdx-freetype-platform:$gdxVersion:natives-desktop" 61 | api "org.jetbrains.kotlin:kotlin-stdlib:$kotlinVersion" 62 | } 63 | } 64 | 65 | project(":android") { 66 | apply plugin: "android" 67 | apply plugin: "kotlin-android" 68 | 69 | configurations { natives } 70 | 71 | dependencies { 72 | api project(":core") 73 | api "com.badlogicgames.gdx:gdx-backend-android:$gdxVersion" 74 | natives "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-armeabi" 75 | natives "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-armeabi-v7a" 76 | natives "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-arm64-v8a" 77 | natives "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-x86" 78 | natives "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-x86_64" 79 | api "com.badlogicgames.gdx:gdx-box2d:$gdxVersion" 80 | natives "com.badlogicgames.gdx:gdx-box2d-platform:$gdxVersion:natives-armeabi" 81 | natives "com.badlogicgames.gdx:gdx-box2d-platform:$gdxVersion:natives-armeabi-v7a" 82 | natives "com.badlogicgames.gdx:gdx-box2d-platform:$gdxVersion:natives-arm64-v8a" 83 | natives "com.badlogicgames.gdx:gdx-box2d-platform:$gdxVersion:natives-x86" 84 | natives "com.badlogicgames.gdx:gdx-box2d-platform:$gdxVersion:natives-x86_64" 85 | api "com.badlogicgames.gdx:gdx-freetype:$gdxVersion" 86 | natives "com.badlogicgames.gdx:gdx-freetype-platform:$gdxVersion:natives-armeabi" 87 | natives "com.badlogicgames.gdx:gdx-freetype-platform:$gdxVersion:natives-armeabi-v7a" 88 | natives "com.badlogicgames.gdx:gdx-freetype-platform:$gdxVersion:natives-arm64-v8a" 89 | natives "com.badlogicgames.gdx:gdx-freetype-platform:$gdxVersion:natives-x86" 90 | natives "com.badlogicgames.gdx:gdx-freetype-platform:$gdxVersion:natives-x86_64" 91 | } 92 | } 93 | 94 | project(":ios") { 95 | apply plugin: "robovm" 96 | apply plugin: "kotlin" 97 | 98 | dependencies { 99 | api project(":core") 100 | api "com.mobidevelop.robovm:robovm-rt:$roboVMVersion" 101 | api "com.mobidevelop.robovm:robovm-cocoatouch:$roboVMVersion" 102 | api "com.badlogicgames.gdx:gdx-backend-robovm:$gdxVersion" 103 | api "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-ios" 104 | api "com.badlogicgames.gdx:gdx-box2d-platform:$gdxVersion:natives-ios" 105 | api "com.badlogicgames.gdx:gdx-freetype-platform:$gdxVersion:natives-ios" 106 | } 107 | } 108 | 109 | project(":core") { 110 | apply plugin: "kotlin" 111 | 112 | dependencies { 113 | api "com.badlogicgames.gdx:gdx:$gdxVersion" 114 | api "com.badlogicgames.gdx:gdx-box2d:$gdxVersion" 115 | api "com.badlogicgames.gdx:gdx-freetype:$gdxVersion" 116 | api "com.kotcrab.vis:vis-ui:$visuiVersion" 117 | api "com.kotcrab.vis:vis-usl:$uslVersion" 118 | api "io.github.microutils:kotlin-logging:$kotlinLoggingVersion" 119 | api "org.slf4j:slf4j-api:$slf4jVersion" 120 | api "ch.qos.logback:logback-classic:$logbackVersion" 121 | } 122 | } 123 | 124 | tasks.eclipse.doLast { 125 | delete ".project" 126 | } -------------------------------------------------------------------------------- /core/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'kotlin' 2 | 3 | sourceCompatibility = 1.7 4 | [compileJava, compileTestJava]*.options*.encoding = 'UTF-8' 5 | 6 | sourceSets.main.java.srcDirs = [ "src/" ] 7 | 8 | 9 | eclipse.project { 10 | name = appName + "-core" 11 | } 12 | buildscript { 13 | ext.kotlinVersion = '1.3.41' 14 | repositories { 15 | mavenCentral() 16 | } 17 | dependencies { 18 | classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlinVersion" 19 | } 20 | } 21 | repositories { 22 | mavenCentral() 23 | } 24 | dependencies { 25 | compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlinVersion" 26 | } 27 | -------------------------------------------------------------------------------- /core/src/OpenFoolGame.gwt.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /core/src/ru/hyst329/openfool/Card.kt: -------------------------------------------------------------------------------- 1 | package ru.hyst329.openfool 2 | 3 | import java.util.Locale 4 | 5 | class Card(internal val suit: Suit, internal val rank: Rank) { 6 | 7 | internal fun beats(other: Card, trumpSuit: Suit, deuceBeatsAce: Boolean): Boolean { 8 | val thisRankValue = (this.rank.value + 11) % 13 9 | val otherRankValue = (other.rank.value + 11) % 13 10 | if (this.suit === other.suit) { 11 | // deuce: (2 + 11) % 13 == 0, ace: (1 + 11) % 13 == 12 12 | return thisRankValue >= otherRankValue || (deuceBeatsAce && thisRankValue == 0 && otherRankValue == 12) 13 | } else 14 | return this.suit === trumpSuit 15 | } 16 | 17 | override fun toString(): String { 18 | return "${rank.value}${suit.name.toLowerCase()[0]}" 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /core/src/ru/hyst329/openfool/CardActor.kt: -------------------------------------------------------------------------------- 1 | package ru.hyst329.openfool 2 | 3 | import com.badlogic.gdx.graphics.Color 4 | import com.badlogic.gdx.graphics.Texture 5 | import com.badlogic.gdx.graphics.g2d.Batch 6 | import com.badlogic.gdx.graphics.g2d.Sprite 7 | import com.badlogic.gdx.scenes.scene2d.Actor 8 | 9 | /** 10 | * Created by main on 13.03.2017. 11 | * Licensed under MIT License. 12 | */ 13 | 14 | internal class CardActor(game: OpenFoolGame, val card: Card, deckStyle: String) : Actor() { 15 | var isFaceUp: Boolean = false 16 | private val face: Sprite = Sprite(game.assetManager.get("decks/$deckStyle/$card.png", Texture::class.java)) 17 | private val back: Sprite = Sprite(game.assetManager.get("decks/$deckStyle/back.png", Texture::class.java)) 18 | 19 | init { 20 | setSize(face.width, face.height) 21 | face.setOrigin(face.width / 2, face.height / 2) 22 | back.setOrigin(back.width / 2, back.height / 2) 23 | } 24 | 25 | override fun positionChanged() { 26 | face.setCenter(x + width * scaleX / 2, 27 | y + height * scaleY / 2) 28 | back.setCenter(x + width * scaleX / 2, 29 | y + height * scaleY / 2) 30 | super.positionChanged() 31 | } 32 | 33 | override fun rotationChanged() { 34 | face.rotation = rotation 35 | back.rotation = rotation 36 | super.rotationChanged() 37 | } 38 | 39 | override fun sizeChanged() { 40 | face.setSize(width, height) 41 | back.setSize(width, height) 42 | super.sizeChanged() 43 | } 44 | 45 | override fun draw(batch: Batch?, alpha: Float) { 46 | super.draw(batch, alpha) 47 | face.setScale(this.scaleX, this.scaleY) 48 | back.setScale(this.scaleX, this.scaleY) 49 | // System.out.printf("actor %s %s %s %s\n", getX(), getY(), getWidth(), getHeight()); 50 | (if (isFaceUp) face else back).draw(batch!!) 51 | } 52 | 53 | fun tint(color: Color) { 54 | face.color = color 55 | } 56 | 57 | fun untint() { 58 | face.color = Color.WHITE 59 | } 60 | } 61 | -------------------------------------------------------------------------------- /core/src/ru/hyst329/openfool/Deck.kt: -------------------------------------------------------------------------------- 1 | package ru.hyst329.openfool 2 | 3 | import java.security.SecureRandom 4 | import java.util.ArrayList 5 | import java.util.Collections 6 | 7 | /** 8 | * Created by main on 13.03.2017. 9 | * Licensed under MIT License. 10 | */ 11 | 12 | internal class Deck(private val lowestRank: Rank = Rank.TWO) { 13 | var cards: ArrayList? = null 14 | private set 15 | 16 | init { 17 | this.cards = ArrayList() 18 | this.reset() 19 | this.shuffle() 20 | } 21 | 22 | private fun reset() { 23 | this.cards!!.clear() 24 | this.cards = ArrayList() 25 | for (r in Rank.values()) 26 | for (s in Suit.values()) 27 | if (r >= lowestRank || r == Rank.ACE) 28 | cards!!.add(Card(s, r)) 29 | } 30 | 31 | private fun shuffle() { 32 | val random = SecureRandom() 33 | cards!!.shuffle(random) 34 | } 35 | 36 | fun draw(): Card? { 37 | return try { 38 | cards!!.removeAt(cards!!.size - 1) 39 | } catch (e: IndexOutOfBoundsException) { 40 | null 41 | } 42 | 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /core/src/ru/hyst329/openfool/Holiday.kt: -------------------------------------------------------------------------------- 1 | package ru.hyst329.openfool 2 | 3 | import java.util.* 4 | import java.util.Calendar.* 5 | 6 | enum class Holiday { 7 | OCTOBER_REVOLUTION, 8 | NEW_YEAR 9 | } 10 | 11 | fun getCurrentHoliday(date: Calendar = Calendar.getInstance()): Holiday? { 12 | val month = date.get(Calendar.MONTH) 13 | val day = date.get(Calendar.DAY_OF_MONTH) 14 | if (month == NOVEMBER && day in 5..10) { 15 | return Holiday.OCTOBER_REVOLUTION 16 | } 17 | if (month == DECEMBER && day in 24..31 || month == JANUARY && day in 1..9) { 18 | return Holiday.NEW_YEAR 19 | } 20 | return null 21 | } -------------------------------------------------------------------------------- /core/src/ru/hyst329/openfool/MainMenuScreen.kt: -------------------------------------------------------------------------------- 1 | package ru.hyst329.openfool 2 | 3 | import com.badlogic.gdx.Gdx 4 | import com.badlogic.gdx.Input 5 | import com.badlogic.gdx.Screen 6 | import com.badlogic.gdx.graphics.GL20 7 | import com.badlogic.gdx.graphics.Texture 8 | import com.badlogic.gdx.graphics.g2d.Sprite 9 | import com.badlogic.gdx.scenes.scene2d.InputEvent 10 | import com.badlogic.gdx.scenes.scene2d.Stage 11 | import com.badlogic.gdx.scenes.scene2d.utils.ClickListener 12 | import com.badlogic.gdx.utils.viewport.FitViewport 13 | import com.kotcrab.vis.ui.widget.VisProgressBar 14 | import com.kotcrab.vis.ui.widget.VisTextButton 15 | 16 | 17 | /** 18 | * Created by hyst329 on 13.03.2017. 19 | * Licensed under MIT License. 20 | */ 21 | 22 | internal class MainMenuScreen(private val game: OpenFoolGame) : Screen { 23 | private val stage: Stage = Stage(FitViewport(800f, 480f)) 24 | private var logo: Sprite = Sprite(Texture(Gdx.files.internal("logos/mm_logo.png"))) 25 | private var hammerAndSickle: Sprite = Sprite(Texture(Gdx.files.internal("holidays/hammersickle.png"))) 26 | private var santaHat: Sprite = Sprite(Texture(Gdx.files.internal("holidays/santahat.png"))) 27 | private var canStart: Boolean = false 28 | private val newGameButton: VisTextButton 29 | private val settingsButton: VisTextButton 30 | private val quitButton: VisTextButton 31 | private val progressBar: VisProgressBar 32 | 33 | init { 34 | // Initialise the stage 35 | Gdx.input.inputProcessor = stage 36 | game.orientationHelper.requestOrientation(OrientationHelper.Orientation.LANDSCAPE) 37 | 38 | newGameButton = VisTextButton(game.localeBundle.get("NewGame")) 39 | newGameButton.setBounds(40f, 300f, 250f, 80f) 40 | newGameButton.addListener(object : ClickListener() { 41 | override fun clicked(event: InputEvent?, x: Float, y: Float) { 42 | // super.clicked(event, x, y); 43 | if (canStart) 44 | newGame() 45 | } 46 | }) 47 | stage.addActor(newGameButton) 48 | settingsButton = VisTextButton(game.localeBundle.get("Settings")) 49 | settingsButton.setBounds(40f, 200f, 250f, 80f) 50 | settingsButton.addListener(object : ClickListener() { 51 | override fun clicked(event: InputEvent?, x: Float, y: Float) { 52 | // super.clicked(event, x, y); 53 | showSettings() 54 | } 55 | }) 56 | stage.addActor(settingsButton) 57 | quitButton = VisTextButton(game.localeBundle.get("Quit")) 58 | quitButton.setBounds(40f, 100f, 250f, 80f) 59 | quitButton.addListener(object : ClickListener() { 60 | override fun clicked(event: InputEvent?, x: Float, y: Float) { 61 | // super.clicked(event, x, y); 62 | quit() 63 | } 64 | }) 65 | stage.addActor(quitButton) 66 | progressBar = VisProgressBar(0f, 1f, 1e-3f, false) 67 | progressBar.setBounds(40f, 40f, 720f, 60f) 68 | progressBar.setAnimateDuration(0.2f) 69 | stage.addActor(progressBar) 70 | } 71 | 72 | override fun show() { 73 | 74 | } 75 | 76 | override fun render(delta: Float) { 77 | when (getCurrentHoliday()) { 78 | Holiday.OCTOBER_REVOLUTION -> Gdx.gl.glClearColor(0.8f, 0.0f, 0.0f, 1f) 79 | Holiday.NEW_YEAR -> Gdx.gl.glClearColor(0.0f, 0.6f, 0.9f, 1f) 80 | null -> Gdx.gl.glClearColor(0.2f, 0.8f, 0.3f, 1f) 81 | } 82 | 83 | Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT) 84 | stage.act(delta) 85 | stage.draw() 86 | game.batch.transformMatrix = stage.viewport.camera.view 87 | game.batch.projectionMatrix = stage.viewport.camera.projection 88 | game.batch.begin() 89 | if (game.assetManager.update()) { 90 | canStart = true 91 | logo.setCenter(stage.viewport.worldWidth * 560f / 840f, stage.viewport.worldHeight * 250f / 480f) 92 | logo.draw(game.batch) 93 | when (getCurrentHoliday()) { 94 | Holiday.OCTOBER_REVOLUTION -> { 95 | hammerAndSickle.setCenter(stage.viewport.worldWidth * 165f / 840f, stage.viewport.worldHeight * 430f / 480f) 96 | hammerAndSickle.setScale(0.35f) 97 | hammerAndSickle.draw(game.batch) 98 | } 99 | Holiday.NEW_YEAR -> { 100 | santaHat.setCenter(stage.viewport.worldWidth * 165f / 840f, stage.viewport.worldHeight * 430f / 480f) 101 | santaHat.setScale(0.3f) 102 | santaHat.draw(game.batch) 103 | } 104 | null -> { 105 | 106 | } 107 | } 108 | 109 | } else { 110 | val progress = game.assetManager.progress 111 | game.font.draw(game.batch, game.localeBundle.format("LoadingAssets", 112 | Math.round(progress * 100)), stage.viewport.worldWidth / 2.8f, stage.viewport.worldHeight / 4.4f) 113 | progressBar.value = progress 114 | } 115 | game.batch.end() 116 | newGameButton.isVisible = canStart 117 | settingsButton.isVisible = canStart 118 | quitButton.isVisible = canStart 119 | progressBar.isVisible = !canStart 120 | if (Gdx.input.isKeyJustPressed(Input.Keys.BACK) || Gdx.input.isKeyJustPressed(Input.Keys.ESCAPE)) { 121 | Gdx.app.exit() 122 | } 123 | 124 | } 125 | 126 | override fun resize(width: Int, height: Int) { 127 | stage.viewport.update(width, height, true) 128 | stage.viewport.camera.update() 129 | } 130 | 131 | override fun pause() { 132 | 133 | } 134 | 135 | override fun resume() { 136 | 137 | } 138 | 139 | override fun hide() { 140 | 141 | } 142 | 143 | override fun dispose() { 144 | 145 | } 146 | 147 | private fun newGame() { 148 | game.screen = NewGameScreen(game) 149 | dispose() 150 | } 151 | 152 | private fun showSettings() { 153 | game.screen = SettingsScreen(game) 154 | dispose() 155 | } 156 | 157 | private fun quit() { 158 | dispose() 159 | Gdx.app.exit() 160 | } 161 | } 162 | -------------------------------------------------------------------------------- /core/src/ru/hyst329/openfool/NewGameScreen.kt: -------------------------------------------------------------------------------- 1 | package ru.hyst329.openfool 2 | 3 | import com.badlogic.gdx.Gdx 4 | import com.badlogic.gdx.Screen 5 | import com.badlogic.gdx.graphics.GL20 6 | import com.badlogic.gdx.scenes.scene2d.Actor 7 | import com.badlogic.gdx.scenes.scene2d.InputEvent 8 | import com.badlogic.gdx.scenes.scene2d.Stage 9 | import com.badlogic.gdx.scenes.scene2d.utils.ChangeListener 10 | import com.badlogic.gdx.scenes.scene2d.utils.ClickListener 11 | import com.badlogic.gdx.utils.viewport.FitViewport 12 | import com.kotcrab.vis.ui.widget.VisCheckBox 13 | import com.kotcrab.vis.ui.widget.VisLabel 14 | import com.kotcrab.vis.ui.widget.VisSelectBox 15 | import com.kotcrab.vis.ui.widget.VisTextButton 16 | import com.kotcrab.vis.ui.widget.spinner.IntSpinnerModel 17 | import com.kotcrab.vis.ui.widget.spinner.Spinner 18 | 19 | internal class NewGameScreen(private val game: OpenFoolGame) : Screen { 20 | private val stage: Stage = Stage(FitViewport(800f, 480f)) 21 | private val singlePlayerButton: VisTextButton 22 | private val gameplayLabel: VisLabel 23 | private val deuceCheckBox: VisCheckBox 24 | private val limitCheckBox: VisCheckBox 25 | private val passCheckBox: VisCheckBox 26 | private val playerCountSpinner: Spinner 27 | private val teamCheckBox: VisCheckBox 28 | private val cardCountLabel: VisLabel 29 | private val cardCountSelectBox: VisSelectBox 30 | private val ruleSet: RuleSet = RuleSet(game.preferences) 31 | 32 | init { 33 | Gdx.input.inputProcessor = stage 34 | game.orientationHelper.requestOrientation(OrientationHelper.Orientation.LANDSCAPE) 35 | singlePlayerButton = VisTextButton(game.localeBundle.get("SinglePlayer")) 36 | singlePlayerButton.setBounds(40f, 300f, 250f, 80f) 37 | singlePlayerButton.addListener(object : ClickListener() { 38 | override fun clicked(event: InputEvent?, x: Float, y: Float) { 39 | // super.clicked(event, x, y); 40 | startGame() 41 | } 42 | }) 43 | stage.addActor(singlePlayerButton) 44 | gameplayLabel = VisLabel(game.localeBundle.get("GameplaySettings")) 45 | gameplayLabel.setBounds(340f, 400f, 400f, 40f) 46 | stage.addActor(gameplayLabel) 47 | deuceCheckBox = VisCheckBox(game.localeBundle.get("DeuceBeatsAce")) 48 | deuceCheckBox.setBounds(340f, 350f, 400f, 40f) 49 | deuceCheckBox.isChecked = ruleSet.deuceBeatsAce 50 | stage.addActor(deuceCheckBox) 51 | limitCheckBox = VisCheckBox(game.localeBundle.get("LimitTo5Cards")) 52 | limitCheckBox.setBounds(340f, 300f, 400f, 40f) 53 | stage.addActor(limitCheckBox) 54 | limitCheckBox.isChecked = ruleSet.loweredFirstDiscardLimit 55 | passCheckBox = VisCheckBox(game.localeBundle.get("PassingGame")) 56 | passCheckBox.setBounds(340f, 250f, 400f, 40f) 57 | stage.addActor(passCheckBox) 58 | passCheckBox.isChecked = ruleSet.allowPass 59 | val intSpinnerModel = IntSpinnerModel(ruleSet.playerCount, 2, 5, 1) 60 | playerCountSpinner = Spinner(game.localeBundle.get("PlayerCount"), intSpinnerModel) 61 | playerCountSpinner.setBounds(340f, 200f, 400f, 40f) 62 | playerCountSpinner.addListener(object : ChangeListener() { 63 | override fun changed(event: ChangeListener.ChangeEvent, actor: Actor) { 64 | ruleSet.playerCount = intSpinnerModel.value 65 | } 66 | }) 67 | stage.addActor(playerCountSpinner) 68 | teamCheckBox = VisCheckBox(game.localeBundle.get("TeamPlay")) 69 | teamCheckBox.setBounds(340f, 150f, 400f, 40f) 70 | stage.addActor(teamCheckBox) 71 | teamCheckBox.isChecked = ruleSet.teamPlay 72 | cardCountLabel = VisLabel(game.localeBundle.get("DeckCardsCount")) 73 | cardCountLabel.setBounds(340f, 100f, 180f, 40f) 74 | stage.addActor(cardCountLabel) 75 | cardCountSelectBox = VisSelectBox() 76 | cardCountSelectBox.setItems(24, 32, 36, 52) 77 | println("card count is ${ruleSet.cardCount}") 78 | cardCountSelectBox.selected = ruleSet.cardCount 79 | println("selected is ${cardCountSelectBox.selected}") 80 | cardCountSelectBox.setBounds(540f, 100f, 200f, 40f) 81 | stage.addActor(cardCountSelectBox) 82 | } 83 | 84 | 85 | override fun hide() { 86 | } 87 | 88 | override fun show() { 89 | } 90 | 91 | override fun render(delta: Float) { 92 | Gdx.gl.glClearColor(0.2f, 0.8f, 0.3f, 1f) 93 | Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT) 94 | stage.act(delta) 95 | stage.draw() 96 | } 97 | 98 | override fun pause() { 99 | 100 | } 101 | 102 | override fun resume() { 103 | 104 | } 105 | 106 | override fun resize(width: Int, height: Int) { 107 | stage.viewport.update(width, height, true) 108 | stage.viewport.camera.update() 109 | } 110 | 111 | override fun dispose() { 112 | 113 | } 114 | 115 | private fun startGame() { 116 | ruleSet.deuceBeatsAce = deuceCheckBox.isChecked 117 | ruleSet.loweredFirstDiscardLimit = limitCheckBox.isChecked 118 | ruleSet.teamPlay = teamCheckBox.isChecked 119 | ruleSet.allowPass = passCheckBox.isChecked 120 | ruleSet.playerCount = (playerCountSpinner.model as IntSpinnerModel).value 121 | ruleSet.cardCount = cardCountSelectBox.selected 122 | ruleSet.save(game.preferences) 123 | game.screen = GameScreen(game) 124 | dispose() 125 | } 126 | } -------------------------------------------------------------------------------- /core/src/ru/hyst329/openfool/OpenFoolGame.kt: -------------------------------------------------------------------------------- 1 | package ru.hyst329.openfool 2 | 3 | import OrientationHelper 4 | import com.badlogic.gdx.Game 5 | import com.badlogic.gdx.Gdx 6 | import com.badlogic.gdx.Preferences 7 | import com.badlogic.gdx.assets.AssetManager 8 | import com.badlogic.gdx.assets.loaders.I18NBundleLoader 9 | import com.badlogic.gdx.assets.loaders.TextureLoader 10 | import com.badlogic.gdx.graphics.Texture 11 | import com.badlogic.gdx.graphics.g2d.BitmapFont 12 | import com.badlogic.gdx.graphics.g2d.SpriteBatch 13 | import com.badlogic.gdx.graphics.g2d.freetype.FreeTypeFontGenerator 14 | import com.badlogic.gdx.graphics.g2d.freetype.FreeTypeFontGenerator.FreeTypeFontParameter 15 | import com.badlogic.gdx.scenes.scene2d.ui.Skin 16 | 17 | import com.badlogic.gdx.utils.I18NBundle 18 | import com.kotcrab.vis.ui.VisUI 19 | import com.kotcrab.vis.usl.USL 20 | 21 | import java.util.Locale 22 | import kotlin.properties.Delegates 23 | import java.nio.file.Files.size 24 | 25 | /** 26 | * Created by hyst329 on 12.03.2017. 27 | * Licensed under MIT License. 28 | */ 29 | 30 | class OpenFoolGame(val orientationHelper: OrientationHelper) : Game() { 31 | internal var batch: SpriteBatch by Delegates.notNull() 32 | internal var assetManager: AssetManager by Delegates.notNull() 33 | internal var font: BitmapFont by Delegates.notNull() 34 | internal var smallFont: BitmapFont by Delegates.notNull() 35 | internal var preferences: Preferences by Delegates.notNull() 36 | internal var localeBundle: I18NBundle by Delegates.notNull() 37 | 38 | override fun create() { 39 | batch = SpriteBatch() 40 | assetManager = AssetManager() 41 | val generator = FreeTypeFontGenerator(Gdx.files.internal("fonts/8835.otf")) 42 | val parameter = FreeTypeFontParameter() 43 | var chars: String = "" 44 | for (i in 0x21..0x2040) { 45 | chars += i.toChar() 46 | } 47 | parameter.characters = chars 48 | parameter.size = 24 49 | font = generator.generateFont(parameter) 50 | parameter.size = 12 51 | smallFont = generator.generateFont(parameter) 52 | 53 | VisUI.load(Gdx.files.internal("ui/temp-skin.json")) 54 | preferences = Gdx.app.getPreferences("OpenFool") 55 | Gdx.input.isCatchBackKey = true 56 | // Deal with localisation 57 | var localeString: String? = preferences.getString("Language", null) 58 | val locale = if (localeString == null) Locale.getDefault() else Locale(localeString) 59 | assetManager.load("i18n/OpenFool", I18NBundle::class.java, 60 | I18NBundleLoader.I18NBundleParameter(locale)) 61 | if (localeString == null) { 62 | localeString = locale.language 63 | preferences.putString("Language", localeString) 64 | preferences.flush() 65 | } 66 | assetManager.finishLoadingAsset("i18n/OpenFool") 67 | localeBundle = assetManager.get("i18n/OpenFool", I18NBundle::class.java) 68 | val param: TextureLoader.TextureParameter = TextureLoader.TextureParameter() 69 | param.minFilter = Texture.TextureFilter.MipMap 70 | param.genMipMaps = true 71 | val decks = arrayOf("fra", "int", "rus", "psu") 72 | val suits = "cdhs" 73 | val fullSuits = arrayOf("clubs", "diamonds", "hearts", "spades") 74 | for (d in decks) { 75 | for (i in 1..13) { 76 | for (s in suits.toCharArray()) { 77 | assetManager.load("decks/$d/$i$s.png", Texture::class.java, param) 78 | } 79 | } 80 | assetManager.load("decks/$d/back.png", Texture::class.java, param) 81 | } 82 | for (i in 1..2) { 83 | assetManager.load("backgrounds/background$i.png", Texture::class.java, param) 84 | } 85 | for (s in fullSuits) { 86 | assetManager.load("suits/$s.png", Texture::class.java, param) 87 | } 88 | assetManager.load("holidays/hammersickle.png", Texture::class.java, param) 89 | assetManager.load("holidays/santahat.png", Texture::class.java, param) 90 | this.setScreen(MainMenuScreen(this)) 91 | } 92 | 93 | override fun dispose() { 94 | batch.dispose() 95 | font.dispose() 96 | VisUI.dispose() 97 | } 98 | } 99 | -------------------------------------------------------------------------------- /core/src/ru/hyst329/openfool/OrientationHelper.kt: -------------------------------------------------------------------------------- 1 | interface OrientationHelper { 2 | enum class Orientation { 3 | LANDSCAPE, PORTRAIT 4 | } 5 | 6 | fun requestOrientation(orientation: Orientation?): Boolean 7 | var orientation: Orientation? 8 | } -------------------------------------------------------------------------------- /core/src/ru/hyst329/openfool/PlayerTesting.kt: -------------------------------------------------------------------------------- 1 | package ru.hyst329.openfool 2 | 3 | import java.awt.Event 4 | import java.util.* 5 | import com.badlogic.gdx.scenes.scene2d.EventListener 6 | import ru.hyst329.openfool.PlayerTesting.GameState.BEATEN 7 | import ru.hyst329.openfool.PlayerTesting.GameState.FINISHED 8 | import ru.hyst329.openfool.PlayerTesting.GameState.READY 9 | import ru.hyst329.openfool.PlayerTesting.GameState.THROWN 10 | 11 | class PlayerTesting(val gameId: Int, val ruleSet: RuleSet, val lowestRank: Rank) : EventListener { 12 | 13 | // The same as in GameScreen, but without transition states 14 | internal enum class GameState { 15 | READY, 16 | THROWN, 17 | BEATEN, 18 | FINISHED 19 | } 20 | 21 | private lateinit var players: Array 22 | private lateinit var trumpSuit: Suit 23 | val DEAL_LIMIT = 6 24 | internal var attackCards = arrayOfNulls(DEAL_LIMIT) 25 | private set 26 | internal var defenseCards = arrayOfNulls(DEAL_LIMIT) 27 | private set 28 | internal var places = IntArray(DEAL_LIMIT) { 0 } 29 | private var deck = Deck() 30 | private var playersSaidDone: Int = 0 31 | private var playerDoneStatuses: BooleanArray 32 | private val outOfPlay: BooleanArray 33 | private var currentAttackerIndex: Int = 0 34 | private var currentThrowerIndex: Int = 0 35 | private var isPlayerTaking: Boolean = false 36 | private var gameState = READY 37 | private var oldGameState = FINISHED 38 | private val discardPile = ArrayList() 39 | private var throwLimit = DEAL_LIMIT 40 | 41 | init { 42 | playerDoneStatuses = BooleanArray(ruleSet.playerCount) 43 | outOfPlay = BooleanArray(ruleSet.playerCount) 44 | } 45 | 46 | fun runGame() : Pair { 47 | deck = Deck(lowestRank) 48 | trumpSuit = deck.cards?.get(0)!!.suit 49 | 50 | println("[$gameId] Trump suit is $trumpSuit") 51 | players = Array(ruleSet.playerCount) { i -> Player(ruleSet, "Player $i", i) } 52 | for (p in 0..players.size - 1) { 53 | drawCardsToPlayer(p, DEAL_LIMIT) 54 | } 55 | for (i in 0 until ruleSet.playerCount) { 56 | players[i].addListener(this) 57 | //stage.addActor(players[i]) 58 | } 59 | printPlayerHands() 60 | val handsSizes = players.map { it.hand.size }.toTypedArray() 61 | val initialHands = players.map { p -> p.currentHandValue(trumpSuit, deck.cards?.size ?: 0, handsSizes) } 62 | // determine the lowest trump card and the first attacker 63 | var lowestTrump = Rank.ACE 64 | var firstAttacker = 0 65 | for (p in players) { 66 | for (c in p.hand) { 67 | if (c.suit === trumpSuit && (c.rank !== Rank.ACE && c.rank.value < lowestTrump.value || lowestTrump === Rank.ACE)) { 68 | firstAttacker = p.index 69 | lowestTrump = c.rank 70 | } 71 | } 72 | } 73 | println("[$gameId] ${players[firstAttacker].name}" + 74 | " (${players[firstAttacker].index})" + 75 | " has the lowest trump $lowestTrump") 76 | currentAttackerIndex = firstAttacker 77 | currentThrowerIndex = firstAttacker 78 | while (!isGameOver) { 79 | step() 80 | } 81 | print("Places are: ") 82 | for (p in 0 until ruleSet.playerCount) { 83 | if (!outOfPlay[p]) places[p] = ruleSet.playerCount // assign last place 84 | print("$p -> ${places[p]}, ") 85 | } 86 | println() 87 | return Pair(initialHands.toIntArray(), places) 88 | } 89 | 90 | private fun drawCardsToPlayer(playerIndex: Int, cardCount: Int) { 91 | val player = players[playerIndex] 92 | for (i in 0 until cardCount) { 93 | if (deck.cards!!.isEmpty()) 94 | break 95 | val card = deck.draw() as Card 96 | player.addCard(card) 97 | } 98 | } 99 | 100 | private fun printPlayerHands() { 101 | val hands = players.map { it.hand.size }.toTypedArray() 102 | for (p in 0..players.size - 1) { 103 | print("[$gameId] Player $p hand is: ") 104 | for (c in players[p].hand) { 105 | print("$c ") 106 | } 107 | print("hand value = ${players[p].currentHandValue(trumpSuit, deck.cards?.size ?: 0, hands)}") 108 | println() 109 | } 110 | } 111 | 112 | override fun handle(event: com.badlogic.gdx.scenes.scene2d.Event?): Boolean { 113 | // TODO: reduce code duplication, don't repeat yourself 114 | if (event is Player.CardThrownEvent) { 115 | // Handle when card is thrown 116 | playersSaidDone = 0 117 | playerDoneStatuses = BooleanArray(ruleSet.playerCount) 118 | var throwIndex = 0 119 | while (attackCards[throwIndex] != null) throwIndex++ 120 | val throwCard = event.card 121 | attackCards[throwIndex] = throwCard 122 | val thrower = event.getTarget() as Player 123 | println("[$gameId] ${thrower.name} (${thrower.index}) throws $throwCard") 124 | gameState = THROWN 125 | return true 126 | } 127 | if (event is Player.CardBeatenEvent) { 128 | // Handle when card is beaten 129 | playersSaidDone = 0 130 | playerDoneStatuses = BooleanArray(ruleSet.playerCount) 131 | var beatIndex = 0 132 | while (defenseCards[beatIndex] != null) beatIndex++ 133 | val beatCard = event.card 134 | defenseCards[beatIndex] = beatCard 135 | val beater = event.getTarget() as Player 136 | println("[$gameId] ${beater.name} (${beater.index}) beats with $beatCard") 137 | gameState = BEATEN 138 | return true 139 | } 140 | if (event is Player.TakeEvent) { 141 | // Handle when player takes 142 | playersSaidDone = 0 143 | playerDoneStatuses = BooleanArray(ruleSet.playerCount) 144 | isPlayerTaking = true 145 | val player = event.getTarget() as Player 146 | println("[$gameId] ${player.name} (${player.index}) decides to take") 147 | return true 148 | 149 | } 150 | if (event is Player.DoneEvent) { 151 | // Handle when player says done 152 | playersSaidDone++ 153 | currentThrowerIndex += 2 154 | currentThrowerIndex %= ruleSet.playerCount 155 | val player = event.getTarget() as Player 156 | playerDoneStatuses[player.index] = true 157 | println("[$gameId] ${player.name} (${player.index}) says done") 158 | return true 159 | } 160 | return false 161 | } 162 | 163 | val isGameOver: Boolean 164 | get() { 165 | // Simply check if only one player remains 166 | return (outOfPlay.map { if (it) 0 else 1 }.fold(initial = 0) { total, current -> total + current }) <= 1 167 | } 168 | 169 | fun step() { 170 | val opponents = 171 | when { 172 | ruleSet.teamPlay -> (if (outOfPlay[currentAttackerIndex]) 0 else 1) + if (outOfPlay[(currentAttackerIndex + 2) % ruleSet.playerCount]) 0 else 1 173 | (outOfPlay.map { if (it) 0 else 1 }.fold(initial = 0) { total, current -> total + current }) > 2 -> 2 174 | else -> 1 175 | } 176 | if (playersSaidDone == opponents) { 177 | System.out.println("[$gameId] Done - all players said done!") 178 | gameState = FINISHED 179 | } 180 | if (oldGameState != gameState) { 181 | println("[$gameId] Game state is $gameState") 182 | oldGameState = gameState 183 | } 184 | when (gameState) { 185 | READY -> { 186 | throwLimit = Math.min((if (ruleSet.loweredFirstDiscardLimit 187 | && discardPile.isEmpty()) 188 | DEAL_LIMIT else DEAL_LIMIT - 1) 189 | , currentDefender.hand.size) 190 | currentAttacker.startTurn(trumpSuit, cardsRemaining(), players.map { it.hand.size }.toTypedArray()) 191 | } 192 | THROWN -> { 193 | if (!isPlayerTaking) { 194 | currentDefender.tryBeat(attackCards, defenseCards, trumpSuit, cardsRemaining(), players.map { it.hand.size }.toTypedArray()) 195 | } else { 196 | currentDefender.sayTake() 197 | } 198 | if (isPlayerTaking) 199 | gameState = BEATEN 200 | } 201 | BEATEN -> { 202 | val forcedFinish = 203 | if (currentDefender.hand.size == 0 || attackCards[throwLimit - 1] != null) { 204 | println("[$gameId] Forced to finish the turn") 205 | gameState = FINISHED 206 | true 207 | } else false 208 | if (!forcedFinish) 209 | currentThrower.throwOrDone(attackCards, defenseCards, trumpSuit, cardsRemaining(), players.map { it.hand.size }.toTypedArray()) 210 | else 211 | currentThrower.sayDone() 212 | } 213 | FINISHED -> { 214 | val playerTook = isPlayerTaking 215 | val currentDefenderIndex = currentDefender.index 216 | endTurn(if (isPlayerTaking) currentDefender.index else -1) 217 | if (isGameOver) { 218 | println("GAME OVER") 219 | return 220 | } 221 | currentAttackerIndex += if (playerTook) 2 else 1 222 | currentAttackerIndex %= ruleSet.playerCount 223 | if (!ruleSet.teamPlay) 224 | // Defender who took cannot attack anyway! 225 | while (outOfPlay[currentAttackerIndex] || 226 | (playerTook && currentAttackerIndex == currentDefenderIndex)) { 227 | currentAttackerIndex++ 228 | if (currentAttackerIndex == ruleSet.playerCount) 229 | currentAttackerIndex = 0 230 | } 231 | currentThrowerIndex = currentAttackerIndex 232 | println("[$gameId] ${currentAttacker.name} (${currentAttacker.index}) -> ${currentDefender.name} (${currentDefender.index})") 233 | } 234 | } 235 | } 236 | 237 | private val currentAttacker: Player 238 | get() { 239 | if (outOfPlay[currentAttackerIndex]) { 240 | return players[(currentAttackerIndex + 2) % ruleSet.playerCount] 241 | } 242 | return players[currentAttackerIndex] 243 | } 244 | 245 | private val currentDefender: Player 246 | get() { 247 | var currentDefenderIndex = (currentAttackerIndex + 1) % ruleSet.playerCount 248 | if (!ruleSet.teamPlay) 249 | while (outOfPlay[currentDefenderIndex]) { 250 | currentDefenderIndex++ 251 | if (currentDefenderIndex == ruleSet.playerCount) 252 | currentDefenderIndex = 0 253 | } 254 | else if (outOfPlay[currentDefenderIndex]) { 255 | return players[(currentDefenderIndex + 2) % ruleSet.playerCount] 256 | } 257 | return players[currentDefenderIndex] 258 | } 259 | 260 | private val currentThrower: Player 261 | get() { 262 | if (outOfPlay[currentThrowerIndex]) { 263 | return players[(currentThrowerIndex + 2) % ruleSet.playerCount] 264 | } 265 | return players[currentThrowerIndex] 266 | } 267 | 268 | internal fun cardsRemaining(): Int { 269 | return deck.cards?.size ?: 0 270 | } 271 | 272 | private fun endTurn(playerIndex: Int) { 273 | playersSaidDone = 0 274 | playerDoneStatuses = BooleanArray(ruleSet.playerCount) 275 | val tableCards = ArrayList() 276 | for (i in attackCards.indices) { 277 | if (attackCards[i] != null) { 278 | tableCards.add(attackCards[i] as Card) 279 | //attackCards[i] = null; 280 | } 281 | if (defenseCards[i] != null) { 282 | tableCards.add(defenseCards[i] as Card) 283 | //defenseCards[i] = null; 284 | } 285 | } 286 | attackCards = arrayOfNulls(DEAL_LIMIT) 287 | defenseCards = arrayOfNulls(DEAL_LIMIT) 288 | if (deck.cards?.isEmpty() == false) { 289 | for (i in 0 until ruleSet.playerCount) { 290 | val cardsToDraw = DEAL_LIMIT - players[i].hand.size 291 | if (cardsToDraw > 0) { 292 | drawCardsToPlayer(i, cardsToDraw) 293 | } 294 | if (deck.cards?.isEmpty() != false) 295 | break 296 | } 297 | } 298 | // Check if someone is out of play 299 | if (deck.cards?.isEmpty() != false) { 300 | for (i in 0 until ruleSet.playerCount) { 301 | val oldOutOfPlay = outOfPlay[i] 302 | outOfPlay[i] = players[i].hand.size == 0 303 | if (outOfPlay[i] && !oldOutOfPlay) { 304 | places[i] = outOfPlay.count { it } 305 | } 306 | } 307 | } 308 | isPlayerTaking = false 309 | gameState = READY 310 | println("[$gameId] Turn ended, remaining ${cardsRemaining()} cards, $isGameOver") 311 | } 312 | } -------------------------------------------------------------------------------- /core/src/ru/hyst329/openfool/Rank.kt: -------------------------------------------------------------------------------- 1 | package ru.hyst329.openfool 2 | 3 | /** 4 | * Created by main on 13.03.2017. 5 | * Licensed under MIT License. 6 | */ 7 | 8 | enum class Rank constructor(val value: Int) { 9 | ACE(1), 10 | TWO(2), 11 | THREE(3), 12 | FOUR(4), 13 | FIVE(5), 14 | SIX(6), 15 | SEVEN(7), 16 | EIGHT(8), 17 | NINE(9), 18 | TEN(10), 19 | JACK(11), 20 | QUEEN(12), 21 | KING(13); 22 | 23 | companion object { 24 | private val map = values().associateBy(Rank::value) 25 | fun fromInt(type: Int) = map[type] 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /core/src/ru/hyst329/openfool/ResultScreen.kt: -------------------------------------------------------------------------------- 1 | package ru.hyst329.openfool 2 | 3 | import com.badlogic.gdx.Gdx 4 | import com.badlogic.gdx.Input 5 | import com.badlogic.gdx.Screen 6 | import com.badlogic.gdx.graphics.Color 7 | import com.badlogic.gdx.graphics.GL20 8 | import com.badlogic.gdx.graphics.g2d.GlyphLayout 9 | import com.badlogic.gdx.scenes.scene2d.Stage 10 | import com.badlogic.gdx.utils.viewport.FitViewport 11 | 12 | /** 13 | * Created by main on 18.03.2017. 14 | * Licensed under MIT License. 15 | */ 16 | internal class ResultScreen(private val game: OpenFoolGame, 17 | private val result: ResultScreen.Result, 18 | private val playersPlaces: Map) : Screen { 19 | 20 | private val stage: Stage 21 | 22 | internal enum class Result { 23 | TEAM_WON, 24 | TEAM_LOST, 25 | TEAM_PARTNER_LOST, 26 | TEAM_DRAW, 27 | WON, 28 | LOST, 29 | DRAW 30 | } 31 | 32 | init { 33 | game.orientationHelper.requestOrientation(OrientationHelper.Orientation.LANDSCAPE) 34 | stage = Stage(FitViewport(800f, 480f)) 35 | } 36 | 37 | override fun show() { 38 | 39 | } 40 | 41 | override fun render(delta: Float) { 42 | var color = Color.BLACK 43 | var header = "" 44 | var text = "" 45 | when (result) { 46 | ResultScreen.Result.TEAM_WON -> { 47 | color = Color(0.2f, 0.6f, 0.125f, 1f) 48 | header = game.localeBundle.get("TeamVictoryHeader") 49 | text = game.localeBundle.get("TeamVictoryText") 50 | } 51 | ResultScreen.Result.TEAM_LOST -> { 52 | color = Color(0.6f, 0.2f, 0.125f, 1f) 53 | header = game.localeBundle.get("TeamDefeatHeader") 54 | text = game.localeBundle.get("TeamDefeatText") 55 | } 56 | ResultScreen.Result.TEAM_PARTNER_LOST -> { 57 | color = Color(0.6f, 0.4f, 0.125f, 1f) 58 | header = game.localeBundle.get("TeamPartnerDefeatHeader") 59 | text = game.localeBundle.get("TeamPartnerDefeatText") 60 | } 61 | ResultScreen.Result.TEAM_DRAW -> { 62 | color = Color(0.6f, 0.6f, 0.125f, 1f) 63 | header = game.localeBundle.get("TeamDrawHeader") 64 | text = game.localeBundle.get("TeamDrawText") 65 | } 66 | ResultScreen.Result.WON -> { 67 | color = Color(0.2f, 0.6f, 0.125f, 1f) 68 | header = game.localeBundle.get("VictoryHeader") 69 | text = game.localeBundle.get("VictoryText") 70 | } 71 | ResultScreen.Result.LOST -> { 72 | color = Color(0.6f, 0.2f, 0.125f, 1f) 73 | header = game.localeBundle.get("DefeatHeader") 74 | text = game.localeBundle.get("DefeatText") 75 | } 76 | ResultScreen.Result.DRAW -> { 77 | color = Color(0.6f, 0.6f, 0.125f, 1f) 78 | header = game.localeBundle.get("DrawHeader") 79 | text = game.localeBundle.get("DrawText") 80 | } 81 | } 82 | var places = "" 83 | for ((p, n) in playersPlaces.entries.toList().sortedBy { it.key }) { 84 | places += game.localeBundle.format("PlayerPlace", n, p) + "\n" 85 | } 86 | val headerLayout = GlyphLayout(game.font, header) 87 | val textLayout = GlyphLayout(game.font, text) 88 | val placesLayout = GlyphLayout(game.font, places) 89 | Gdx.gl.glClearColor(color.r, color.g, color.b, color.a) 90 | Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT) 91 | game.batch.transformMatrix = stage.viewport.camera.view 92 | game.batch.projectionMatrix = stage.viewport.camera.projection 93 | game.batch.begin() 94 | game.font.draw(game.batch, headerLayout, 95 | stage.viewport.worldWidth * 0.5f - headerLayout.width / 2, 96 | stage.viewport.worldHeight * 0.833f - headerLayout.height / 2) 97 | game.font.draw(game.batch, textLayout, 98 | stage.viewport.worldWidth * 0.5f - textLayout.width / 2, 99 | stage.viewport.worldHeight * 0.58f - textLayout.height / 2) 100 | game.font.draw(game.batch, placesLayout, 101 | stage.viewport.worldWidth * 0.5f - textLayout.width / 2, 102 | stage.viewport.worldHeight * 0.4f - textLayout.height / 2) 103 | game.batch.end() 104 | if (Gdx.input.isKeyJustPressed(Input.Keys.BACK) || Gdx.input.isKeyJustPressed(Input.Keys.ESCAPE)) { 105 | game.screen = MainMenuScreen(game) 106 | dispose() 107 | } 108 | } 109 | 110 | override fun resize(width: Int, height: Int) { 111 | 112 | } 113 | 114 | override fun pause() { 115 | 116 | } 117 | 118 | override fun resume() { 119 | 120 | } 121 | 122 | override fun hide() { 123 | 124 | } 125 | 126 | override fun dispose() { 127 | 128 | } 129 | 130 | } 131 | -------------------------------------------------------------------------------- /core/src/ru/hyst329/openfool/RuleSet.kt: -------------------------------------------------------------------------------- 1 | package ru.hyst329.openfool 2 | 3 | /** 4 | * Created by trolley813 on 20.06.17. 5 | * Licensed under MIT License. 6 | */ 7 | 8 | import com.badlogic.gdx.Preferences 9 | import kotlin.math.max 10 | 11 | class RuleSet(var deuceBeatsAce: Boolean = false, 12 | var loweredFirstDiscardLimit: Boolean = false, 13 | var allowPass: Boolean = false, 14 | playerCount: Int = 4, 15 | var teamPlay: Boolean = true, 16 | var cardCount: Int = 52) { 17 | var playerCount: Int = playerCount 18 | set(value) { 19 | field = value 20 | teamPlay = teamPlay && (playerCount > 2 && playerCount % 2 == 0) 21 | } 22 | constructor(preferences: Preferences) : this() { 23 | deuceBeatsAce = preferences.getBoolean("Rules/DeuceBeatsAce", false) 24 | loweredFirstDiscardLimit = preferences.getBoolean("Rules/LoweredFirstDiscardLimit", false) 25 | allowPass = preferences.getBoolean("Rules/AllowPass", false) 26 | playerCount = preferences.getInteger("Rules/PlayerCount", 4) 27 | cardCount = preferences.getInteger("Rules/CardCount", 52) 28 | teamPlay = preferences.getBoolean("Rules/TeamPlay", true) 29 | // Team play only for even number of players (4 or 6 actually) 30 | teamPlay = teamPlay && (playerCount > 2 && playerCount % 2 == 0) 31 | // Card count must be a multiple of 4 and not less than 6 * cardCount 32 | cardCount = max(6 * playerCount, (cardCount + 3) / 4 * 4) 33 | } 34 | 35 | fun save(preferences: Preferences) { 36 | preferences.putBoolean("Rules/DeuceBeatsAce", deuceBeatsAce) 37 | preferences.putBoolean("Rules/LoweredFirstDiscardLimit", loweredFirstDiscardLimit) 38 | preferences.putBoolean("Rules/AllowPass", allowPass) 39 | preferences.putInteger("Rules/PlayerCount", playerCount) 40 | preferences.putInteger("Rules/CardCount", cardCount) 41 | preferences.putBoolean("Rules/TeamPlay", teamPlay) 42 | preferences.flush() 43 | } 44 | 45 | val lowestRank: Rank 46 | get() = Rank.fromInt((14 - (cardCount / 4)) % 13 + 1)!! 47 | } -------------------------------------------------------------------------------- /core/src/ru/hyst329/openfool/SettingsScreen.kt: -------------------------------------------------------------------------------- 1 | package ru.hyst329.openfool 2 | 3 | import com.badlogic.gdx.Gdx 4 | import com.badlogic.gdx.Input 5 | import com.badlogic.gdx.Screen 6 | import com.badlogic.gdx.assets.loaders.I18NBundleLoader 7 | import com.badlogic.gdx.graphics.Color 8 | import com.badlogic.gdx.graphics.GL20 9 | import com.badlogic.gdx.graphics.Texture 10 | import com.badlogic.gdx.graphics.g2d.Sprite 11 | import com.badlogic.gdx.scenes.scene2d.Actor 12 | import com.badlogic.gdx.scenes.scene2d.InputEvent 13 | import com.badlogic.gdx.scenes.scene2d.Stage 14 | import com.badlogic.gdx.scenes.scene2d.utils.ChangeListener 15 | import com.badlogic.gdx.scenes.scene2d.utils.ClickListener 16 | import com.badlogic.gdx.utils.I18NBundle 17 | import com.badlogic.gdx.utils.viewport.FitViewport 18 | import com.kotcrab.vis.ui.widget.* 19 | import com.kotcrab.vis.ui.widget.color.ColorPicker 20 | import com.kotcrab.vis.ui.widget.color.ColorPickerAdapter 21 | import com.kotcrab.vis.ui.widget.spinner.IntSpinnerModel 22 | import com.kotcrab.vis.ui.widget.spinner.Spinner 23 | 24 | import java.util.ArrayList 25 | import java.util.HashMap 26 | import java.util.Locale 27 | import kotlin.properties.Delegates 28 | 29 | /** 30 | * Created by main on 18.03.2017. 31 | * Licensed under MIT License. 32 | */ 33 | internal class SettingsScreen(private val game: OpenFoolGame) : Screen { 34 | private val DECKS: MutableMap 35 | private val LANGUAGES: MutableMap 36 | private val stage: Stage 37 | private var backgroundColor: Color? = null 38 | private var deck: String? = null 39 | private var language: String? = null 40 | private var sortingMode: Player.SortingMode? = null 41 | private var background: Int 42 | private var orientation: Boolean 43 | private val picker: ColorPicker 44 | private val deckSelectBox: VisSelectBox 45 | private val languageSelectBox: VisSelectBox 46 | private val sortingSelectBox: VisSelectBox 47 | private val backgroundSpinner: Spinner 48 | private val portraitOrientationCheckBox: VisCheckBox 49 | private var back: Sprite by Delegates.notNull() 50 | private var ace: Sprite by Delegates.notNull() 51 | private var queen: Sprite by Delegates.notNull() 52 | private var ten: Sprite by Delegates.notNull() 53 | private var deuce: Sprite by Delegates.notNull() 54 | 55 | 56 | init { 57 | game.orientationHelper.requestOrientation(OrientationHelper.Orientation.LANDSCAPE) 58 | // Initialise DECKS 59 | DECKS = HashMap() 60 | DECKS.put(game.localeBundle.get("CardsRussian"), "rus") 61 | DECKS.put(game.localeBundle.get("CardsInternational"), "int") 62 | DECKS.put(game.localeBundle.get("CardsFrench"), "fra") 63 | DECKS.put(game.localeBundle.get("CardsPeoples"), "psu") 64 | // Initialise LANGUAGES 65 | LANGUAGES = HashMap() 66 | LANGUAGES.put(game.localeBundle.get("LanguageRussian"), "ru") 67 | LANGUAGES.put(game.localeBundle.get("LanguageEnglish"), "en") 68 | LANGUAGES.put(game.localeBundle.get("LanguageCzech"), "cs") 69 | LANGUAGES.put(game.localeBundle.get("LanguageGerman"), "de") 70 | // Initialise SORTING_MODES 71 | val SORTING_MODES = ArrayList() 72 | SORTING_MODES.add(game.localeBundle.get("SortingUnsorted")) 73 | SORTING_MODES.add(game.localeBundle.get("SortingSuitAscending")) 74 | SORTING_MODES.add(game.localeBundle.get("SortingSuitDescending")) 75 | SORTING_MODES.add(game.localeBundle.get("SortingRankAscending")) 76 | SORTING_MODES.add(game.localeBundle.get("SortingRankDescending")) 77 | // Initialise the stage 78 | stage = Stage(FitViewport(800f, 480f)) 79 | Gdx.input.inputProcessor = stage 80 | 81 | backgroundColor = Color(game.preferences.getInteger(BACKGROUND_COLOR, 0x33cc4dff)) 82 | deck = game.preferences.getString(DECK, "rus") 83 | language = game.preferences.getString(LANGUAGE, "en") 84 | sortingMode = Player.SortingMode.fromInt(game.preferences.getInteger(SORTING_MODE, 0)) 85 | background = game.preferences.getInteger(BACKGROUND, 1) 86 | orientation = game.preferences.getBoolean(ORIENTATION, false) 87 | picker = ColorPicker("Choose background color", object : ColorPickerAdapter() { 88 | override fun finished(newColor: Color?) { 89 | backgroundColor = newColor 90 | } 91 | 92 | }) 93 | 94 | val changeColorButton = VisTextButton(game.localeBundle.get("ChangeBackgroundColor")) 95 | changeColorButton.setBounds(40f, 350f, 250f, 80f) 96 | changeColorButton.addListener(object : ClickListener() { 97 | override fun clicked(event: InputEvent?, x: Float, y: Float) { 98 | // super.clicked(event, x, y); 99 | picker.color = backgroundColor 100 | stage.addActor(picker.fadeIn()) 101 | } 102 | }) 103 | stage.addActor(changeColorButton) 104 | val saveButton = VisTextButton(game.localeBundle.get("SaveSettings")) 105 | saveButton.setBounds(40f, 250f, 250f, 80f) 106 | saveButton.addListener(object : ClickListener() { 107 | override fun clicked(event: InputEvent?, x: Float, y: Float) { 108 | // super.clicked(event, x, y); 109 | saveAndQuit() 110 | 111 | } 112 | }) 113 | stage.addActor(saveButton) 114 | // val gameplaySettingsButton = VisTextButton(game.localeBundle.get("GameplaySettings")) 115 | // gameplaySettingsButton.setBounds(40f, 150f, 250f, 80f) 116 | // gameplaySettingsButton.addListener(object : ClickListener() { 117 | // override fun clicked(event: InputEvent?, x: Float, y: Float) { 118 | // // super.clicked(event, x, y); 119 | // // TODO: Add real gameplay settings 120 | // val win = VisDialog(game.localeBundle.get("GameplaySettings")) 121 | // win.button(game.localeBundle.get("OK"), true) 122 | // win.button(game.localeBundle.get("Cancel"), false) 123 | // win.key(Input.Keys.ENTER, true).key(Input.Keys.ESCAPE, false) 124 | // // Adding checkboxes for rules 125 | // win.show(stage) 126 | // } 127 | // }) 128 | // stage.addActor(gameplaySettingsButton) 129 | val backgroundSelectLabel = VisLabel(game.localeBundle.get("Background")) 130 | backgroundSelectLabel.setBounds(340f, 250f, 100f, 40f) 131 | stage.addActor(backgroundSelectLabel) 132 | val deckSelectLabel = VisLabel(game.localeBundle.get("Cards")) 133 | deckSelectLabel.setBounds(340f, 300f, 100f, 40f) 134 | stage.addActor(deckSelectLabel) 135 | val languageSelectLabel = VisLabel(game.localeBundle.get("Language")) 136 | languageSelectLabel.setBounds(340f, 350f, 100f, 40f) 137 | stage.addActor(languageSelectLabel) 138 | val sortingSelectLabel = VisLabel(game.localeBundle.get("Sorting")) 139 | sortingSelectLabel.setBounds(340f, 400f, 100f, 40f) 140 | stage.addActor(sortingSelectLabel) 141 | portraitOrientationCheckBox = VisCheckBox(game.localeBundle.get("PortraitOrientation")) 142 | portraitOrientationCheckBox.setBounds(340f, 200f, 400f, 40f) 143 | portraitOrientationCheckBox.isChecked = orientation 144 | portraitOrientationCheckBox.addListener(object : ChangeListener() { 145 | override fun changed(event: ChangeListener.ChangeEvent, actor: Actor) { 146 | orientation = portraitOrientationCheckBox.isChecked 147 | // updateSprites() 148 | } 149 | }) 150 | stage.addActor(portraitOrientationCheckBox) 151 | val intSpinnerModel = IntSpinnerModel(background, 1, 2, 1) 152 | backgroundSpinner = Spinner("", intSpinnerModel) 153 | backgroundSpinner.setBounds(530f, 250f, 230f, 40f) 154 | backgroundSpinner.addListener(object : ChangeListener() { 155 | override fun changed(event: ChangeListener.ChangeEvent, actor: Actor) { 156 | background = intSpinnerModel.value 157 | // updateSprites() 158 | } 159 | 160 | 161 | }) 162 | stage.addActor(backgroundSpinner) 163 | deckSelectBox = VisSelectBox() 164 | deckSelectBox.setBounds(530f, 300f, 230f, 40f) 165 | deckSelectBox.setItems(*DECKS.keys.toTypedArray()) 166 | deckSelectBox.addListener(object : ChangeListener() { 167 | override fun changed(event: ChangeListener.ChangeEvent, actor: Actor) { 168 | deck = DECKS[deckSelectBox.selected] 169 | updateSprites() 170 | } 171 | 172 | 173 | }) 174 | var deckName = "" 175 | for ((key, value) in DECKS) { 176 | if (value == deck) { 177 | deckName = key 178 | } 179 | } 180 | deckSelectBox.setSelected(deckName) 181 | stage.addActor(deckSelectBox) 182 | languageSelectBox = VisSelectBox() 183 | languageSelectBox.setBounds(530f, 350f, 230f, 40f) 184 | languageSelectBox.setItems(*LANGUAGES.keys.toTypedArray()) 185 | languageSelectBox.addListener(object : ChangeListener() { 186 | override fun changed(event: ChangeListener.ChangeEvent, actor: Actor) { 187 | language = LANGUAGES[languageSelectBox.selected] 188 | reloadLocale() 189 | } 190 | 191 | 192 | }) 193 | var languageName = "" 194 | for ((key, value) in LANGUAGES) { 195 | if (value == language) { 196 | languageName = key 197 | } 198 | } 199 | languageSelectBox.setSelected(languageName) 200 | stage.addActor(languageSelectBox) 201 | sortingSelectBox = VisSelectBox() 202 | sortingSelectBox.setBounds(530f, 400f, 230f, 40f) 203 | sortingSelectBox.setItems(*SORTING_MODES.toTypedArray()) 204 | sortingSelectBox.addListener(object : ChangeListener() { 205 | override fun changed(event: ChangeListener.ChangeEvent, actor: Actor) { 206 | sortingMode = Player.SortingMode.fromInt(sortingSelectBox.selectedIndex) 207 | } 208 | 209 | 210 | }) 211 | sortingSelectBox.selectedIndex = sortingMode!!.value 212 | stage.addActor(sortingSelectBox) 213 | updateSprites() 214 | 215 | } 216 | 217 | override fun show() { 218 | 219 | } 220 | 221 | override fun render(delta: Float) { 222 | Gdx.gl.glClearColor(backgroundColor!!.r, backgroundColor!!.g, backgroundColor!!.b, backgroundColor!!.a) 223 | Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT) 224 | stage.act(delta) 225 | stage.draw() 226 | game.batch.transformMatrix = stage.viewport.camera.view 227 | game.batch.projectionMatrix = stage.viewport.camera.projection 228 | game.batch.begin() 229 | if (!stage.actors.contains(picker, true)) { 230 | back.draw(game.batch) 231 | ace.draw(game.batch) 232 | queen.draw(game.batch) 233 | ten.draw(game.batch) 234 | deuce.draw(game.batch) 235 | } 236 | game.batch.end() 237 | if (Gdx.input.isKeyJustPressed(Input.Keys.BACK) || Gdx.input.isKeyJustPressed(Input.Keys.ESCAPE)) { 238 | saveAndQuit() 239 | } 240 | } 241 | 242 | override fun resize(width: Int, height: Int) { 243 | stage.viewport.update(width, height, true) 244 | } 245 | 246 | override fun pause() { 247 | 248 | } 249 | 250 | override fun resume() { 251 | 252 | } 253 | 254 | override fun hide() { 255 | 256 | } 257 | 258 | override fun dispose() { 259 | picker.dispose() 260 | } 261 | 262 | 263 | private fun saveAndQuit() { 264 | game.preferences.putInteger(BACKGROUND_COLOR, Color.rgba8888(backgroundColor!!)) 265 | game.preferences.putString(DECK, deck) 266 | game.preferences.putString(LANGUAGE, language) 267 | game.preferences.putInteger(SORTING_MODE, sortingMode!!.value) 268 | game.preferences.putInteger(BACKGROUND, background) 269 | game.preferences.putBoolean(ORIENTATION, orientation) 270 | game.preferences.flush() 271 | game.screen = MainMenuScreen(game) 272 | dispose() 273 | } 274 | 275 | private fun updateSprites() { 276 | back = Sprite(game.assetManager.get( 277 | String.format("decks/%s/back.png", deck), Texture::class.java)) 278 | ace = Sprite(game.assetManager.get( 279 | String.format("decks/%s/1s.png", deck), Texture::class.java)) 280 | queen = Sprite(game.assetManager.get( 281 | String.format("decks/%s/12d.png", deck), Texture::class.java)) 282 | ten = Sprite(game.assetManager.get( 283 | String.format("decks/%s/10h.png", deck), Texture::class.java)) 284 | deuce = Sprite(game.assetManager.get( 285 | String.format("decks/%s/2c.png", deck), Texture::class.java)) 286 | for ((index, sprite) in arrayOf(back, ace, queen, ten, deuce).withIndex()) { 287 | sprite.setScale(CARD_SCALE) 288 | sprite.setCenter((360f + 90f * index), 100f) 289 | } 290 | } 291 | 292 | private fun reloadLocale() { 293 | game.assetManager.unload("i18n/OpenFool") 294 | game.assetManager.load("i18n/OpenFool", I18NBundle::class.java, 295 | I18NBundleLoader.I18NBundleParameter(Locale(language))) 296 | game.assetManager.finishLoadingAsset("i18n/OpenFool") 297 | game.localeBundle = game.assetManager.get("i18n/OpenFool", I18NBundle::class.java) 298 | } 299 | 300 | companion object { 301 | val BACKGROUND_COLOR = "BackgroundColor" 302 | val DECK = "Deck" 303 | private val LANGUAGE = "Language" 304 | val SORTING_MODE = "SortingMode" 305 | val BACKGROUND = "Background" 306 | val ORIENTATION = "Orientation" 307 | private val CARD_SCALE = 0.25f 308 | } 309 | } 310 | -------------------------------------------------------------------------------- /core/src/ru/hyst329/openfool/Suit.kt: -------------------------------------------------------------------------------- 1 | package ru.hyst329.openfool 2 | 3 | /** 4 | * Created by main on 13.03.2017. 5 | * Licensed under MIT License. 6 | */ 7 | 8 | enum class Suit constructor(val value: Int) { 9 | SPADES(0), 10 | DIAMONDS(1), 11 | CLUBS(2), 12 | HEARTS(3) 13 | } 14 | -------------------------------------------------------------------------------- /desktop/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: "kotlin" 2 | apply plugin: "com.palantir.graal" 3 | 4 | sourceCompatibility = 1.7 5 | sourceSets.main.java.srcDirs = [ "src/" ] 6 | 7 | 8 | graal { 9 | graalVersion "19.2.0" 10 | } 11 | 12 | 13 | project.ext.mainClassName = "ru.hyst329.openfool.desktop.DesktopLauncher" 14 | project.ext.assetsDir = new File("../android/assets"); 15 | 16 | task run(dependsOn: classes, type: JavaExec) { 17 | main = project.mainClassName 18 | classpath = sourceSets.main.runtimeClasspath 19 | standardInput = System.in 20 | workingDir = project.assetsDir 21 | ignoreExitValue = true 22 | } 23 | 24 | task debug(dependsOn: classes, type: JavaExec) { 25 | main = project.mainClassName 26 | classpath = sourceSets.main.runtimeClasspath 27 | standardInput = System.in 28 | workingDir = project.assetsDir 29 | ignoreExitValue = true 30 | debug = true 31 | } 32 | 33 | task dist(type: Jar) { 34 | from files(sourceSets.main.output.classesDirs) 35 | from files(sourceSets.main.output.resourcesDir) 36 | from {configurations.compile.collect {zipTree(it)}} 37 | from files(project.assetsDir); 38 | 39 | manifest { 40 | attributes 'Main-Class': project.mainClassName 41 | } 42 | } 43 | 44 | dist.dependsOn classes 45 | 46 | eclipse { 47 | project { 48 | name = appName + "-desktop" 49 | linkedResource name: 'assets', type: '2', location: 'PARENT-1-PROJECT_LOC/android/assets' 50 | } 51 | } 52 | 53 | task afterEclipseImport(description: "Post processing after project generation", group: "IDE") { 54 | doLast { 55 | def classpath = new XmlParser().parse(file(".classpath")) 56 | new Node(classpath, "classpathentry", [ kind: 'src', path: 'assets' ]); 57 | def writer = new FileWriter(file(".classpath")) 58 | def printer = new XmlNodePrinter(new PrintWriter(writer)) 59 | printer.setPreserveWhitespace(true) 60 | printer.print(classpath) 61 | } 62 | } 63 | -------------------------------------------------------------------------------- /desktop/src/ru/hyst329/openfool/desktop/DesktopLauncher.kt: -------------------------------------------------------------------------------- 1 | package ru.hyst329.openfool.desktop 2 | 3 | import com.badlogic.gdx.Files 4 | import com.badlogic.gdx.backends.lwjgl.LwjglApplication 5 | import com.badlogic.gdx.backends.lwjgl.LwjglApplicationConfiguration 6 | 7 | import ru.hyst329.openfool.OpenFoolGame 8 | import ru.hyst329.openfool.RuleSet 9 | import ru.hyst329.openfool.PlayerTesting 10 | import java.io.PrintWriter 11 | 12 | object DesktopLauncher { 13 | @JvmStatic 14 | fun main(arg: Array) { 15 | if (arg.isNotEmpty() && arg[0]=="--test-players") { 16 | val players = arg[1].toInt() 17 | val games = arg[2].toInt() 18 | println("Testing players") 19 | for (c in listOf(24, 32, 36, 52)) { 20 | val ruleSet = RuleSet(false, false, false, players, false, c) 21 | val rank = ruleSet.lowestRank 22 | val log = PrintWriter("out_${players}_${ruleSet.cardCount}.csv") 23 | for (i in 1..games) { 24 | println("Running game $i") 25 | val (initialHands, places) = PlayerTesting(i, ruleSet, rank).runGame() 26 | for (p in 0 until players) { 27 | log.println("${initialHands[p]},${players + 1 - places[p]}") 28 | } 29 | } 30 | log.close() 31 | } 32 | System.exit(0) 33 | } 34 | val config = LwjglApplicationConfiguration() 35 | config.title = "OpenFool" 36 | config.width = 800 37 | config.height = 480 38 | //config.resizable = false 39 | config.addIcon("logos/logo_128.png", Files.FileType.Internal) 40 | config.addIcon("logos/logo_32.png", Files.FileType.Internal) 41 | config.addIcon("logos/logo_16.png", Files.FileType.Internal) 42 | LwjglApplication(OpenFoolGame(DesktopOrientationHelper()), config) 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /desktop/src/ru/hyst329/openfool/desktop/DesktopOrientationHelper.kt: -------------------------------------------------------------------------------- 1 | package ru.hyst329.openfool.desktop 2 | 3 | import OrientationHelper 4 | import com.badlogic.gdx.Gdx 5 | 6 | class DesktopOrientationHelper : OrientationHelper { 7 | 8 | 9 | override fun requestOrientation(orientation: OrientationHelper.Orientation?): Boolean { 10 | this.orientation = orientation 11 | return when (orientation) { 12 | OrientationHelper.Orientation.LANDSCAPE -> { 13 | if (!Gdx.graphics.isFullscreen) 14 | Gdx.graphics.setWindowedMode(800, 480) 15 | true 16 | } 17 | OrientationHelper.Orientation.PORTRAIT -> { 18 | if (!Gdx.graphics.isFullscreen) 19 | Gdx.graphics.setWindowedMode(480, 800) 20 | true 21 | } 22 | null -> { 23 | false 24 | } 25 | } 26 | } 27 | 28 | override var orientation: OrientationHelper.Orientation? = OrientationHelper.Orientation.LANDSCAPE 29 | } -------------------------------------------------------------------------------- /gradle.properties: -------------------------------------------------------------------------------- 1 | org.gradle.daemon=true 2 | org.gradle.jvmargs=-Xms128m -Xmx1536m 3 | org.gradle.configureondemand=false -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | #Tue Aug 13 10:16:44 MSK 2019 2 | distributionUrl=https\://services.gradle.org/distributions/gradle-5.5.1-all.zip 3 | distributionBase=GRADLE_USER_HOME 4 | distributionPath=wrapper/dists 5 | zipStorePath=wrapper/dists 6 | zipStoreBase=GRADLE_USER_HOME 7 | -------------------------------------------------------------------------------- /gradlew: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env sh 2 | 3 | # 4 | # Copyright 2015 the original author or authors. 5 | # 6 | # Licensed under the Apache License, Version 2.0 (the "License"); 7 | # you may not use this file except in compliance with the License. 8 | # You may obtain a copy of the License at 9 | # 10 | # https://www.apache.org/licenses/LICENSE-2.0 11 | # 12 | # Unless required by applicable law or agreed to in writing, software 13 | # distributed under the License is distributed on an "AS IS" BASIS, 14 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 15 | # See the License for the specific language governing permissions and 16 | # limitations under the License. 17 | # 18 | 19 | ############################################################################## 20 | ## 21 | ## Gradle start up script for UN*X 22 | ## 23 | ############################################################################## 24 | 25 | # Attempt to set APP_HOME 26 | # Resolve links: $0 may be a link 27 | PRG="$0" 28 | # Need this for relative symlinks. 29 | while [ -h "$PRG" ] ; do 30 | ls=`ls -ld "$PRG"` 31 | link=`expr "$ls" : '.*-> \(.*\)$'` 32 | if expr "$link" : '/.*' > /dev/null; then 33 | PRG="$link" 34 | else 35 | PRG=`dirname "$PRG"`"/$link" 36 | fi 37 | done 38 | SAVED="`pwd`" 39 | cd "`dirname \"$PRG\"`/" >/dev/null 40 | APP_HOME="`pwd -P`" 41 | cd "$SAVED" >/dev/null 42 | 43 | APP_NAME="Gradle" 44 | APP_BASE_NAME=`basename "$0"` 45 | 46 | # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 47 | DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' 48 | 49 | # Use the maximum available, or set MAX_FD != -1 to use that value. 50 | MAX_FD="maximum" 51 | 52 | warn () { 53 | echo "$*" 54 | } 55 | 56 | die () { 57 | echo 58 | echo "$*" 59 | echo 60 | exit 1 61 | } 62 | 63 | # OS specific support (must be 'true' or 'false'). 64 | cygwin=false 65 | msys=false 66 | darwin=false 67 | nonstop=false 68 | case "`uname`" in 69 | CYGWIN* ) 70 | cygwin=true 71 | ;; 72 | Darwin* ) 73 | darwin=true 74 | ;; 75 | MINGW* ) 76 | msys=true 77 | ;; 78 | NONSTOP* ) 79 | nonstop=true 80 | ;; 81 | esac 82 | 83 | CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar 84 | 85 | # Determine the Java command to use to start the JVM. 86 | if [ -n "$JAVA_HOME" ] ; then 87 | if [ -x "$JAVA_HOME/jre/sh/java" ] ; then 88 | # IBM's JDK on AIX uses strange locations for the executables 89 | JAVACMD="$JAVA_HOME/jre/sh/java" 90 | else 91 | JAVACMD="$JAVA_HOME/bin/java" 92 | fi 93 | if [ ! -x "$JAVACMD" ] ; then 94 | die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME 95 | 96 | Please set the JAVA_HOME variable in your environment to match the 97 | location of your Java installation." 98 | fi 99 | else 100 | JAVACMD="java" 101 | which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 102 | 103 | Please set the JAVA_HOME variable in your environment to match the 104 | location of your Java installation." 105 | fi 106 | 107 | # Increase the maximum file descriptors if we can. 108 | if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then 109 | MAX_FD_LIMIT=`ulimit -H -n` 110 | if [ $? -eq 0 ] ; then 111 | if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then 112 | MAX_FD="$MAX_FD_LIMIT" 113 | fi 114 | ulimit -n $MAX_FD 115 | if [ $? -ne 0 ] ; then 116 | warn "Could not set maximum file descriptor limit: $MAX_FD" 117 | fi 118 | else 119 | warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" 120 | fi 121 | fi 122 | 123 | # For Darwin, add options to specify how the application appears in the dock 124 | if $darwin; then 125 | GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" 126 | fi 127 | 128 | # For Cygwin, switch paths to Windows format before running java 129 | if $cygwin ; then 130 | APP_HOME=`cygpath --path --mixed "$APP_HOME"` 131 | CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` 132 | JAVACMD=`cygpath --unix "$JAVACMD"` 133 | 134 | # We build the pattern for arguments to be converted via cygpath 135 | ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` 136 | SEP="" 137 | for dir in $ROOTDIRSRAW ; do 138 | ROOTDIRS="$ROOTDIRS$SEP$dir" 139 | SEP="|" 140 | done 141 | OURCYGPATTERN="(^($ROOTDIRS))" 142 | # Add a user-defined pattern to the cygpath arguments 143 | if [ "$GRADLE_CYGPATTERN" != "" ] ; then 144 | OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" 145 | fi 146 | # Now convert the arguments - kludge to limit ourselves to /bin/sh 147 | i=0 148 | for arg in "$@" ; do 149 | CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` 150 | CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option 151 | 152 | if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition 153 | eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` 154 | else 155 | eval `echo args$i`="\"$arg\"" 156 | fi 157 | i=$((i+1)) 158 | done 159 | case $i in 160 | (0) set -- ;; 161 | (1) set -- "$args0" ;; 162 | (2) set -- "$args0" "$args1" ;; 163 | (3) set -- "$args0" "$args1" "$args2" ;; 164 | (4) set -- "$args0" "$args1" "$args2" "$args3" ;; 165 | (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; 166 | (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; 167 | (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; 168 | (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; 169 | (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; 170 | esac 171 | fi 172 | 173 | # Escape application args 174 | save () { 175 | for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done 176 | echo " " 177 | } 178 | APP_ARGS=$(save "$@") 179 | 180 | # Collect all arguments for the java command, following the shell quoting and substitution rules 181 | eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" 182 | 183 | # by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong 184 | if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then 185 | cd "$(dirname "$0")" 186 | fi 187 | 188 | exec "$JAVACMD" "$@" 189 | -------------------------------------------------------------------------------- /gradlew.bat: -------------------------------------------------------------------------------- 1 | @rem 2 | @rem Copyright 2015 the original author or authors. 3 | @rem 4 | @rem Licensed under the Apache License, Version 2.0 (the "License"); 5 | @rem you may not use this file except in compliance with the License. 6 | @rem You may obtain a copy of the License at 7 | @rem 8 | @rem https://www.apache.org/licenses/LICENSE-2.0 9 | @rem 10 | @rem Unless required by applicable law or agreed to in writing, software 11 | @rem distributed under the License is distributed on an "AS IS" BASIS, 12 | @rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | @rem See the License for the specific language governing permissions and 14 | @rem limitations under the License. 15 | @rem 16 | 17 | @if "%DEBUG%" == "" @echo off 18 | @rem ########################################################################## 19 | @rem 20 | @rem Gradle startup script for Windows 21 | @rem 22 | @rem ########################################################################## 23 | 24 | @rem Set local scope for the variables with windows NT shell 25 | if "%OS%"=="Windows_NT" setlocal 26 | 27 | set DIRNAME=%~dp0 28 | if "%DIRNAME%" == "" set DIRNAME=. 29 | set APP_BASE_NAME=%~n0 30 | set APP_HOME=%DIRNAME% 31 | 32 | @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 33 | set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" 34 | 35 | @rem Find java.exe 36 | if defined JAVA_HOME goto findJavaFromJavaHome 37 | 38 | set JAVA_EXE=java.exe 39 | %JAVA_EXE% -version >NUL 2>&1 40 | if "%ERRORLEVEL%" == "0" goto init 41 | 42 | echo. 43 | echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 44 | echo. 45 | echo Please set the JAVA_HOME variable in your environment to match the 46 | echo location of your Java installation. 47 | 48 | goto fail 49 | 50 | :findJavaFromJavaHome 51 | set JAVA_HOME=%JAVA_HOME:"=% 52 | set JAVA_EXE=%JAVA_HOME%/bin/java.exe 53 | 54 | if exist "%JAVA_EXE%" goto init 55 | 56 | echo. 57 | echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 58 | echo. 59 | echo Please set the JAVA_HOME variable in your environment to match the 60 | echo location of your Java installation. 61 | 62 | goto fail 63 | 64 | :init 65 | @rem Get command-line arguments, handling Windows variants 66 | 67 | if not "%OS%" == "Windows_NT" goto win9xME_args 68 | 69 | :win9xME_args 70 | @rem Slurp the command line arguments. 71 | set CMD_LINE_ARGS= 72 | set _SKIP=2 73 | 74 | :win9xME_args_slurp 75 | if "x%~1" == "x" goto execute 76 | 77 | set CMD_LINE_ARGS=%* 78 | 79 | :execute 80 | @rem Setup the command line 81 | 82 | set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar 83 | 84 | @rem Execute Gradle 85 | "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% 86 | 87 | :end 88 | @rem End local scope for the variables with windows NT shell 89 | if "%ERRORLEVEL%"=="0" goto mainEnd 90 | 91 | :fail 92 | rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of 93 | rem the _cmd.exe /c_ return code! 94 | if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 95 | exit /b 1 96 | 97 | :mainEnd 98 | if "%OS%"=="Windows_NT" endlocal 99 | 100 | :omega 101 | -------------------------------------------------------------------------------- /ios/Info.plist.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleDisplayName 8 | ${app.name} 9 | CFBundleExecutable 10 | ${app.executable} 11 | CFBundleIdentifier 12 | ${app.id} 13 | CFBundleInfoDictionaryVersion 14 | 6.0 15 | CFBundleName 16 | ${app.name} 17 | CFBundlePackageType 18 | APPL 19 | CFBundleShortVersionString 20 | ${app.version} 21 | CFBundleSignature 22 | ???? 23 | CFBundleVersion 24 | ${app.build} 25 | LSRequiresIPhoneOS 26 | 27 | UIViewControllerBasedStatusBarAppearance 28 | 29 | UIStatusBarHidden 30 | 31 | UIDeviceFamily 32 | 33 | 1 34 | 2 35 | 36 | UIRequiredDeviceCapabilities 37 | 38 | armv7 39 | opengles-2 40 | 41 | UISupportedInterfaceOrientations 42 | 43 | UIInterfaceOrientationPortrait 44 | UIInterfaceOrientationLandscapeLeft 45 | UIInterfaceOrientationLandscapeRight 46 | 47 | CFBundleIcons 48 | 49 | CFBundlePrimaryIcon 50 | 51 | CFBundleIconFiles 52 | 53 | Icon 54 | Icon-72 55 | 56 | 57 | 58 | 59 | 60 | -------------------------------------------------------------------------------- /ios/build.gradle: -------------------------------------------------------------------------------- 1 | sourceSets.main.java.srcDirs = [ "src/" ] 2 | 3 | sourceCompatibility = '1.7' 4 | [compileJava, compileTestJava]*.options*.encoding = 'UTF-8' 5 | 6 | ext { 7 | mainClassName = "ru.hyst329.openfool.IOSLauncher" 8 | } 9 | 10 | launchIPhoneSimulator.dependsOn build 11 | launchIPadSimulator.dependsOn build 12 | launchIOSDevice.dependsOn build 13 | createIPA.dependsOn build 14 | 15 | robovm { 16 | archs = "thumbv7:arm64" 17 | iosSkipSigning = true 18 | } 19 | 20 | eclipse.project { 21 | name = appName + "-ios" 22 | natures 'org.robovm.eclipse.RoboVMNature' 23 | } 24 | buildscript { 25 | ext.kotlinVersion = '1.3.41' 26 | repositories { 27 | mavenCentral() 28 | } 29 | dependencies { 30 | classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlinVersion" 31 | } 32 | } 33 | apply plugin: 'kotlin' 34 | repositories { 35 | mavenCentral() 36 | } 37 | dependencies { 38 | compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlinVersion" 39 | } -------------------------------------------------------------------------------- /ios/data/Default-1024w-1366h@2x~ipad.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/ios/data/Default-1024w-1366h@2x~ipad.png -------------------------------------------------------------------------------- /ios/data/Default-375w-667h@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/ios/data/Default-375w-667h@2x.png -------------------------------------------------------------------------------- /ios/data/Default-414w-736h@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/ios/data/Default-414w-736h@3x.png -------------------------------------------------------------------------------- /ios/data/Default-568h@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/ios/data/Default-568h@2x.png -------------------------------------------------------------------------------- /ios/data/Default.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/ios/data/Default.png -------------------------------------------------------------------------------- /ios/data/Default@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/ios/data/Default@2x.png -------------------------------------------------------------------------------- /ios/data/Default@2x~ipad.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/ios/data/Default@2x~ipad.png -------------------------------------------------------------------------------- /ios/data/Default~ipad.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/ios/data/Default~ipad.png -------------------------------------------------------------------------------- /ios/data/Icon-72.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/ios/data/Icon-72.png -------------------------------------------------------------------------------- /ios/data/Icon-72@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/ios/data/Icon-72@2x.png -------------------------------------------------------------------------------- /ios/data/Icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/ios/data/Icon.png -------------------------------------------------------------------------------- /ios/data/Icon@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trolley813/OpenFool/4029db9950f1cd152386a2cc53ec654e6c24e0b1/ios/data/Icon@2x.png -------------------------------------------------------------------------------- /ios/robovm.properties: -------------------------------------------------------------------------------- 1 | app.version=1.0 2 | app.id=ru.hyst329.openfool 3 | app.mainclass=ru.hyst329.openfool.IOSLauncher 4 | app.executable=IOSLauncher 5 | app.build=1 6 | app.name=OpenFool 7 | -------------------------------------------------------------------------------- /ios/robovm.xml: -------------------------------------------------------------------------------- 1 | 2 | ${app.executable} 3 | ${app.mainclass} 4 | ios 5 | thumbv7 6 | ios 7 | Info.plist.xml 8 | 9 | 10 | ../android/assets 11 | 12 | ** 13 | 14 | true 15 | 16 | 17 | data 18 | 19 | 20 | 21 | com.badlogic.gdx.scenes.scene2d.ui.* 22 | com.badlogic.gdx.graphics.g3d.particles.** 23 | com.android.okhttp.HttpHandler 24 | com.android.okhttp.HttpsHandler 25 | com.android.org.conscrypt.** 26 | com.android.org.bouncycastle.jce.provider.BouncyCastleProvider 27 | com.android.org.bouncycastle.jcajce.provider.keystore.BC$Mappings 28 | com.android.org.bouncycastle.jcajce.provider.keystore.bc.BcKeyStoreSpi 29 | com.android.org.bouncycastle.jcajce.provider.keystore.bc.BcKeyStoreSpi$Std 30 | com.android.org.bouncycastle.jce.provider.PKIXCertPathValidatorSpi 31 | com.android.org.bouncycastle.crypto.digests.AndroidDigestFactoryOpenSSL 32 | org.apache.harmony.security.provider.cert.DRLCertFactory 33 | org.apache.harmony.security.provider.crypto.CryptoProvider 34 | 35 | 36 | z 37 | 38 | 39 | UIKit 40 | OpenGLES 41 | QuartzCore 42 | CoreGraphics 43 | OpenAL 44 | AudioToolbox 45 | AVFoundation 46 | 47 | 48 | -------------------------------------------------------------------------------- /ios/src/ru/hyst329/openfool/IOSLauncher.java: -------------------------------------------------------------------------------- 1 | package ru.hyst329.openfool; 2 | 3 | import org.robovm.apple.foundation.NSAutoreleasePool; 4 | import org.robovm.apple.uikit.UIApplication; 5 | 6 | import com.badlogic.gdx.backends.iosrobovm.IOSApplication; 7 | import com.badlogic.gdx.backends.iosrobovm.IOSApplicationConfiguration; 8 | 9 | import ru.hyst329.openfool.OpenFoolGame; 10 | 11 | public class IOSLauncher extends IOSApplication.Delegate { 12 | @Override 13 | protected IOSApplication createApplication() { 14 | IOSApplicationConfiguration config = new IOSApplicationConfiguration(); 15 | return new IOSApplication(new OpenFoolGame(new IOSOrientationHelper()), config); 16 | } 17 | 18 | public static void main(String[] argv) { 19 | NSAutoreleasePool pool = new NSAutoreleasePool(); 20 | UIApplication.main(argv, null, IOSLauncher.class); 21 | pool.close(); 22 | } 23 | } -------------------------------------------------------------------------------- /ios/src/ru/hyst329/openfool/IOSOrientationHelper.kt: -------------------------------------------------------------------------------- 1 | package ru.hyst329.openfool 2 | 3 | import OrientationHelper 4 | 5 | class IOSOrientationHelper : OrientationHelper { 6 | 7 | // Dummy 8 | override fun requestOrientation(orientation: OrientationHelper.Orientation?): Boolean { 9 | this.orientation = orientation 10 | return when (orientation) { 11 | OrientationHelper.Orientation.LANDSCAPE -> { 12 | true 13 | } 14 | OrientationHelper.Orientation.PORTRAIT -> { 15 | true 16 | } 17 | null -> { 18 | false 19 | } 20 | } 21 | } 22 | 23 | override var orientation: OrientationHelper.Orientation? = OrientationHelper.Orientation.LANDSCAPE 24 | } -------------------------------------------------------------------------------- /metadata/en-US/full_description.txt: -------------------------------------------------------------------------------- 1 | OpenFool is a free and open source Fool (Durak) card game for desktop and Android. 2 | 3 | Features 4 | * Individual game for 2 to 5 players and 4-players partnership game 5 | * 52-card decks: Standard Russian (designed by A. Charlemagne in 19th century, public domain - from Wikimedia), international (by Chris Aguilar - LGPL v3), French deck (by David Bellot - LGPL v3) 6 | * Standard rules for throwing in (some convention can be customized) 7 | -------------------------------------------------------------------------------- /metadata/en-US/short_description.txt: -------------------------------------------------------------------------------- 1 | Russian national Fool (Durak) card game. 2 | -------------------------------------------------------------------------------- /metadata/ru-RU/full_description.txt: -------------------------------------------------------------------------------- 1 | OpenFool - полностью свободная реализация игры в подкидного дурака для настольных ПК и Android. 2 | 3 | Возможности: 4 | * От 2 до 5 игроков в режиме "каждый сам за себя", командная игра (2 на 2) для 4 игроков. 5 | * 3 колоды карт (52 карты): атласная, международная, французская. 6 | * Стандартные правила для подкидного дурака (некоторые правила могут быть изменены пользователем). 7 | -------------------------------------------------------------------------------- /metadata/ru-RU/short_description.txt: -------------------------------------------------------------------------------- 1 | Игра в подкидного дурака. 2 | -------------------------------------------------------------------------------- /settings.gradle: -------------------------------------------------------------------------------- 1 | include 'desktop', 'android', 'ios', 'core' --------------------------------------------------------------------------------