├── .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 | 
3 | 
4 | 
5 | 
6 | [](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 | [
](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'
--------------------------------------------------------------------------------