1
0
Fork 0
mirror of https://github.com/shlomif/PySolFC.git synced 2025-04-15 02:54:09 -04:00

Compare commits

..

No commits in common. "master" and "pysolfc-2.5.5" have entirely different histories.

3587 changed files with 41003 additions and 133597 deletions

View file

@ -1,27 +1,29 @@
---
image: Visual Studio 2022
environment:
matrix:
- PYTHON: "C:\\Python313"
- PYTHON: "C:\\PYTHON34"
# Shamelessly taken from https://github.com/plicease/Dist-Zilla-PluginBundle-Author-Plicease/blob/master/.appveyor.yml
# Thanks!
install:
# - choco install strawberryperl
- choco install strawberryperl
- copy %PYTHON%\python.exe %PYTHON%\python3.exe
- SET PATH=%PYTHON%;%PYTHON%\Scripts;C:\strawberry\c\bin;C:\strawberry\perl\site\bin;C:\strawberry\perl\bin;%PATH%
- python3 -mpip install Pillow attrs configobj flake8 flake8-import-order
pycotap pygame pyinstaller pysol-cards setuptools six
ttkthemes
- SET PATH=%PYTHON%;C:\strawberry\c\bin;C:\strawberry\perl\site\bin;C:\strawberry\perl\bin;%PATH%
- python3 -mpip install flake8
- python3 -mpip install random2
- python3 -mpip install py2exe
- python3 -mpip install pycotap
- python3 -mpip install six
- python3 -mpip install Pillow
- python3 -mpip install pygame
- perl -v
- copy C:\msys64\mingw64\bin\mingw32-make.exe C:\msys64\mingw64\bin\make.exe
- SET PATH=C:\strawberry\c\bin;C:\strawberry\perl\site\bin;C:\strawberry\perl\bin;%PATH%
- SET PERL5LIB=C:/_P5/lib/perl5
- SET PERL_LOCAL_LIB_ROOT=C:/_P5
- SET PERL_MB_OPT=--install_base C:/_P5
- SET PERL_MM_OPT=INSTALL_BASE=C:/_P5
- perl -v
- cpanm --notest Code::TidyAll::Plugin::Flake8 File::Find::Object
Perl::Tidy Task::FreecellSolver::Testing Test::Code::TidyAll
Test::TrailingSpace
- cpanm --notest Code::TidyAll::Plugin::Flake8 File::Find::Object Perl::Tidy Task::FreecellSolver::Testing Test::Code::TidyAll Test::TrailingSpace
- echo %PATH%
build: off
test_script:
@ -32,40 +34,35 @@ test_script:
- gmake pretest
- perl run-tests.pl
- gmake rules
#- gmake pot
#- gmake mo
- pyinstaller pysol.py --windowed --icon=data\pysol.ico
- python3 setup.py install_data -d dist\pysol
- appveyor DownloadFile https://sourceforge.net/projects/pysolfc/files/PySolFC-Cardsets/minimal/PySolFC-Cardsets--Minimal-3.0.0.tar.xz/download -FileName cardsets.tar.xz
- 7z x cardsets.tar.xz -so | 7z x -si -ttar
- mv PySolFC-Cardsets--Minimal-3.0.0/cardset-* dist/pysol/data
- gmake pot
- gmake mo
- python3 setup.py py2exe
- appveyor DownloadFile https://sourceforge.net/projects/pysolfc/files/PySolFC-Cardsets/PySolFC-Cardsets-2.0/PySolFC-Cardsets-2.0.tar.bz2/download -FileName cardsets.tar.bz2
- tar xf cardsets.tar.bz2
- xargs -ta scripts\cardsets_to_bundle -I file cp -rt dist\data\ PySolFC-Cardsets-2.0\file
- appveyor DownloadFile https://sourceforge.net/projects/pysolfc/files/PySol-Music/PySol-Music-4.50/pysol-music-4.50.tar.xz/download -FileName music.tar.xz
- 7z x music.tar.xz -so | 7z x -si -ttar
- move pysol-music-4.50\data\music dist\pysol\data\music
# - ps: |
# $apiUrl = 'https://ci.appveyor.com/api'
# $project = Invoke-RestMethod -Method Get -Uri "$apiUrl/projects/shlomif/fc-solve"
# $jobId = $project.build.jobs[0].jobId
# Invoke-RestMethod -Method Get -Uri "$apiUrl/buildjobs/$jobId/artifacts/fc-solve/pkg-build/fc-solve-for-pysol.zip" -OutFile fc-solve.zip
#
# For reproducible builds:
# See: https://reproducible-builds.org/ .
- SET FC_SOLVE_VER=5.20.0
- appveyor DownloadFile https://sourceforge.net/projects/fc-solve/files/fc-solve/DO-NOT-USE--fc-solve-for-pysol/fc-solve-for-pysol--v%FC_SOLVE_VER%.zip -FileName fc-solve.zip
- move pysol-music-4.50\data\music dist\data\music
- ps: |
$apiUrl = 'https://ci.appveyor.com/api'
$project = Invoke-RestMethod -Method Get -Uri "$apiUrl/projects/shlomif/fc-solve"
$jobId = $project.build.jobs[0].jobId
Invoke-RestMethod -Method Get -Uri "$apiUrl/buildjobs/$jobId/artifacts/fc-solve/pkg-build/fc-solve-for-pysol.zip" -OutFile fc-solve.zip
- 7z x fc-solve.zip
- move fcs-pysol dist\pysol\freecell-solver
- 7z a -r pysol_win_dist.7z dist\pysol\
- move fcs-pysol dist\freecell-solver
- 7z a -r pysol_win_dist.7z dist\
- SET PYTHONPATH=%cd%
- python3 scripts\create_iss.py
- appveyor DownloadFile https://download.microsoft.com/download/C/6/D/C6D0FD4E-9E53-4897-9B91-836EBA2AACD3/vcredist_x86.exe -FileName vcredist_x86.exe
- SET PATH=%PATH%;"C:\\Program Files (x86)\\Inno Setup 6"
- SET PATH=%PATH%;"C:\\Program Files (x86)\\Inno Setup 5"
- ISCC /Q setup.iss
artifacts:
- path: pysol_win_dist.7z
name: pysol_win_dist
- path: dist\pysol\PySolFC_*_setup.exe
- path: dist\PySolFC_*_setup.exe
name: pysol_win_installer
cache:
# - C:\_P5 -> .appveyor.yml
# - C:\strawberry -> .appveyor.yml
- C:\_P5 -> .appveyor.yml
- C:\strawberry -> .appveyor.yml
shallow_clone: true

View file

@ -1,37 +0,0 @@
name: CI tests at GitHub
on:
push:
branches: [ master ]
pull_request:
branches: [ master ]
jobs:
check:
runs-on: ubuntu-latest
strategy:
fail-fast: false
steps:
- uses: actions/checkout@v2
- name: Set up Python
uses: actions/setup-python@v2
with:
python-version: '3.x'
- name: Install dependencies
run: |
python -m pip install --upgrade pip
python -m pip install flake8 flake8-import-order \
attrs configobj pycotap pysol-cards setuptools six
if [ -f requirements.txt ]; then pip install -r requirements.txt; fi
- name: Lint with flake8
run: |
flake8 . --show-source
- name: Run unit tests
run: |
python -m unittest -v
- name: Individually import each Python module
run: |
python scripts/gen_individual_importing_tests.py
prove tests/individually-importing/*.py

View file

@ -1,60 +0,0 @@
name: macOS package
on:
push:
tags: [ '**' ]
workflow_dispatch:
jobs:
build:
runs-on: macos-14
steps:
- uses: actions/checkout@v2
- name: Set up python
env:
PYVER: '3.9.7'
PYVER_SHORT: '3.9'
run: |
wget -O python.pkg "https://www.python.org/ftp/python/${PYVER}/python-${PYVER}-macosx10.9.pkg"
sudo installer -pkg python.pkg -target /
echo "/Library/Frameworks/Python.framework/Versions/${PYVER_SHORT}/bin" >> $GITHUB_PATH
- name: Install dependencies
run: |
python3 -m pip install --upgrade pip
python3 -m pip install --no-binary=Pillow \
Pillow attrs configobj py2app pycotap pygame pysol-cards setuptools six ttkthemes
if [ -f requirements.txt ]; then pip install -r requirements.txt; fi
brew install create-dmg
- name: Get cardsets
run: |
wget -O cardsets-pack.tar.xz "https://sourceforge.net/projects/pysolfc/files/PySolFC-Cardsets/minimal/PySolFC-Cardsets--Minimal-3.0.0.tar.xz/download"
tar -xJf cardsets-pack.tar.xz
mv PySolFC-Cardsets--Minimal-3.0.0/cardset-* data
- name: Prepare game rules (process the HTML) and translations
run: |
make rules mo
- name: Create the executable .app
run: |
PYTHONPATH="." python3 setup_osx.py py2app
zip -q -r -X PySolFC-app.zip dist
- name: Make the .dmg for easy installation
run:
create-dmg --volname "Install PySolFC"
--volicon data/PySol.icns
--background html-src/images/pysollogo01.png
--window-size 800 400
--icon PySolFC.app 200 185
--app-drop-link 600 185
--skip-jenkins
PySolFC.dmg dist
- name: Upload zipped app
uses: actions/upload-artifact@v4
with:
name: pysolfc-app
path: PySolFC-app.zip
- name: Upload dmg
uses: actions/upload-artifact@v4
with:
name: pysolfc-dmg
path: PySolFC.dmg

25
.gitignore vendored
View file

@ -1,7 +1,6 @@
*.pyc
/.tidyall.d/
/MANIFEST
/_Inline/
/build/*
/data/cardsets/*
/data/html/*
@ -10,31 +9,9 @@
/html
/html-src/html/*
/images
/po/de.po
/po/fr.po
/locale/*
/po/it.po
/po/pl.po
/po/ru.po
/po/pt_BR.po
/tests/individually-importing/*.py
/tests/unit-generated/*.py
PySolFC-Cardsets--Minimal-2.0.*
PySolFC-Cardsets--Minimal-2.0/
PySolFC-Cardsets-2.0.*
PySolFC-Cardsets-2.0/
PySolFC-Cardsets--Minimal-3.0.*
PySolFC-Cardsets--Minimal-3.0/
PySolFC-Cardsets-3.0.*
PySolFC-Cardsets-3.0/
android/*.apk
android/*.zip
android/bin/keystore
buildozer/.buildozer*
buildozer/PySolFC-Cardsets*
buildozer/cardsets
buildozer/bin
buildozer/tmp
buildozer/support*
buildozer/ENV
buildozer/VENV
venv*

View file

@ -3,6 +3,6 @@ ignore = tests/individually-importing/*
select = **/*.py
[PerlTidy]
argv = -ci=4 -bl -cti=0 --character-encoding=none
argv = -ci=4 -bl -cti=0
ignore = **/{cmpdigest,valgrind,verify}--*.t
select = **/*.{pl,pm,t}

View file

@ -1,65 +1,45 @@
language: generic
dist: trusty
os:
- linux
- osx
dist: bionic
osx_image: xcode12.2
addons:
apt:
- cpanminus
- python3-pip
- python3-setuptools
- python3-tk
homebrew:
- perl
- cpanminus
- create-dmg
cache:
directories:
- $HOME/perl_modules
- $HOME/tidyall_d
before_install:
- if test "$TRAVIS_OS_NAME" = "linux" ; then sudo apt-get update -qq ; sudo apt-get install -y ack-grep cpanminus libperl-dev make perl python-glade2 python-gnome2 python-gnome2-dev python-gtk2 python-setuptools python-tk python3 python3-pip python3-setuptools python3-tk ; sudo dpkg-divert --local --divert /usr/bin/ack --rename --add /usr/bin/ack-grep ; fi
- if test "$TRAVIS_OS_NAME" = "osx" ; then brew update; fi
- if test "$TRAVIS_OS_NAME" = "osx" ; then brew list python &>/dev/null || brew install python; fi
- if test "$TRAVIS_OS_NAME" = "osx" ; then brew list python3 &>/dev/null || brew install python3; fi
- if test "$TRAVIS_OS_NAME" = "osx" ; then brew install pyenv-virtualenv; fi
- if test "$TRAVIS_OS_NAME" = "osx" ; then brew bundle ; brew link gettext --force ; export PATH="$PATH:/usr/local/bin" ; export DYLD_LIBRARY_PATH="/usr/local/opt/curl/lib:/usr/local/opt/openssl/lib:${DYLD_LIBRARY_PATH}" ; export PATH="/usr/local/opt/openssl/bin:$PATH" ; export LDFLAGS="$LDFLAGS -L/usr/local/opt/openssl/lib" ; export CPPFLAGS="$CPPFLAGS -I/usr/local/opt/openssl/include" ; export CPPFLAGS="$CPPFLAGS -I$(brew --prefix openssl)/include" PKG_CONFIG_PATH="$(brew --prefix openssl)/lib/pkgconfig:$PKG_CONFIG_PATH" LDFLAGS="$LDFLAGS -L$(brew --prefix openssl)/lib" ;fi
install:
- sudo cpanm Code::TidyAll::Plugin::Flake8 Perl::Tidy Test::Code::TidyAll Test::Differences Test::TrailingSpace
- export PY_MODS='pycotap random2 six'
- "`which python3` -m pip install --upgrade flake8 $PY_MODS"
- "sudo /usr/bin/python3 -m pip install --upgrade $PY_MODS || true"
- "sudo `which python2` -m pip install --upgrade $PY_MODS"
- which python
- which python2
language: python
python:
- "3.6"
matrix:
exclude:
- os: osx
python: "3.6"
include:
- os: osx
language: generic
env: TOXENV=py35
script:
- "sh -x scripts/travis-ci-build"
- if test "$TRAVIS_OS_NAME" = "osx" ; then PYTHONPATH="`pwd`" python3 setup_osx.py py2app ; fi
- if test "$TRAVIS_OS_NAME" = "osx" ; then find . -iname '*.app' ; fi
- if test "$TRAVIS_OS_NAME" = "osx" ; then (cd dist; tar -cvf ../PySolFC.app.tar PySolFC.app/ ; ); xz PySolFC.app.tar ; fi
deploy:
provider: releases
token:
api_key:
secure: SrKnXigL/oUHNbqpbGx0DB1o+LAEkfPA2QTBllXxg4V+1vGAHBT9FRecp8Do+no/zSPRttH+sPDEPBXMMAV0BWVKKw5Mxas/S5ulVkNdfxpTq1bKjI3EjZbVsS1zZlHe0P77TDFDAj8zyeiYecBM08suhd9OvScieiPlpFPE1UYp9vvNKaBgc66IRNnIDRBdktW4YLsgvkrpXnxGPy8gGwylsTeOzNs5/r5dzHswGdksJl46kqCIbV+s4/Xcx+BEnfibWzEFZmLQoGKhoukbSis3YXGIlERcgiVU6v7S2D4wbwUXSAKOj/Io7z/88Co2P3Qbm538kf/pjeR9+DaM1HsHQQcL0detCjjLog+ekKr2fM00QI1yRmqOiZtuXxTMpneYX73EBmPt4la4rjKmnlhS+NTxrynHcPZD8QopCPvoZ3sUD6dQCrbi8kcGxe13srfdJ3KjuWZXdedLIOgNELbj5o6GNivsanWna59yoJzChC5/H5Jjllncvzbp56TZfEkM1NJkE84jjSS8Sn2KLXjD0woHIsuUSkRNExrCt/6QmIub/QxZPUhwQ2J0xCv1IJPdd0XvO3gCqasG3UA2Q0OlP172x92ocOV/wm1/4wfoG6v/mn+bX5ZwvrsMmm+r3FKKlM8L3T33yFjMzgG/YMoRN8w7pXUIkdtZK8EEDVg=
file: PySolFC.dmg
# file: dist/PySolFC.app
file: PySolFC.app.tar.xz
on:
repo: shlomif/PySolFC
tags: true
skip_cleanup: true
before_install:
- if test "$TRAVIS_OS_NAME" = "osx" ; then
wget --content-disposition https://sourceforge.net/projects/pysolfc/files/PySolFC-Cardsets/minimal/PySolFC-Cardsets--Minimal-2.2.0.tar.xz/download &&
tar xJf PySolFC-Cardsets--Minimal-3.0.0.tar.xz &&
mv PySolFC-Cardsets--Minimal-3.0.0/cardset-* data ;
fi
- if test "$TRAVIS_OS_NAME" = "osx" ; then
PYVER=3.9.1 &&
PYVER_SHORT=3.9 &&
wget -O python.pkg "https://www.python.org/ftp/python/${PYVER}/python-${PYVER}-macosx10.9.pkg" &&
sudo installer -pkg python.pkg -target / &&
export PATH="/Library/Frameworks/Python.framework/Versions/${PYVER_SHORT}/bin:${PATH}" ;
fi
- cpanm local::lib
- eval "$(perl -Mlocal::lib=${HOME}/perl_modules)"
install:
# Tests are failing for them sometimes
- cpanm --notest Capture::Tiny IPC::System::Simple
- cpanm Code::TidyAll::Plugin::Flake8 Perl::Tidy Test::Code::TidyAll Test::Differences Test::TrailingSpace
- export PY_MODS='attrs configobj pycotap pysol-cards setuptools six'
- if test "$TRAVIS_OS_NAME" = "osx" ; then export PY_MODS="--no-binary=Pillow Pillow $PY_MODS" ; fi
- sudo -H pip3 install --upgrade wheel
- sudo -H pip3 install --upgrade $PY_MODS flake8 flake8-import-order
script:
- export TIDYALL_DATA_DIR="$HOME/tidyall_d"
- bash -x scripts/travis-ci-build
- if test "$TRAVIS_OS_NAME" = "osx" ; then PYTHONPATH="." python3 setup_osx.py py2app ; fi
- if test "$TRAVIS_OS_NAME" = "osx" ; then
create-dmg --volname "Install PySolFC"
--volicon data/PySol.icns
--background html-src/images/pysollogo01.png
--window-size 800 400
--icon PySolFC.app 200 185
--app-drop-link 600 185
--skip-jenkins
PySolFC.dmg dist ; fi

37
AUTHORS Normal file
View file

@ -0,0 +1,37 @@
Main Authors
============
Markus Franz Xaver Johannes Oberhumer <markus@oberhumer.com>
author of PySol
T. Kirk
author of Ultrasol
Skomoroh <skomoroh@users.sourceforge.net>
author of PySolFC
Brian Lenihan <brianl@users.sourceforge.net>
macOS package maintainer
Shlomi Fish ( http://www.shlomifish.org/ )
Continued PySolFC maintenance, port to python 3, test suite
(Note: he places all his changes under the MIT/Expat licence).
https://github.com/lufebe16
Added the Kivy toolkit
Roderik Ploszek ( https://github.com/Programator2 )
Fixes and enhancements
Games contributors
==================
Mark Andrews
Galen Brooks <galen@nine.com>
Andrew Csillag <drew_csillag@geocities.com>
Michael Foord
Matthew Hohlfeld <hohlfeld@cs.ucsd.edu>
Nicola Larosa
John Stoneham <obijohn99@aol.com>
David Svoboda <svoboda@users.sourceforge.net>
Translations
============
Holger Schäkel <Holger@Schaekel-row.de> (de)
Jerzy Trzeciak <artusek@wp.pl> (pl)

View file

@ -1,45 +0,0 @@
Main Authors
============
* Markus Franz Xaver Johannes Oberhumer https://www.oberhumer.com/
* Author of PySol
* T. Kirk
* Author of Ultrasol
* [Skomoroh](https://sourceforge.net/u/skomoroh/profile/)
* Author of PySolFC
* [Brian Lenihan](https://sourceforge.net/u/brianl/profile/)
* macOS package maintainer
* [Shlomi Fish](https://www.shlomifish.org/)
* Continued PySolFC maintenance, port to python 3, test suite (Note: he places all his changes under the Expat licence).
* [lufebe16](https://github.com/lufebe16)
* Added the Kivy toolkit and all the Android app related code and build procedures.
* [Roderik Ploszek](https://github.com/Programator2)
* Fixes and enhancements
* [Joe R.](https://github.com/joeraz)
* Many new games and continued PySolFC maintenance and development.
Games contributors
==================
* Mark Andrews
* Galen Brooks <galen@nine.com>
* Andrew Csillag <drew@thecsillags.com>
* Michael Foord
* Matthew Hohlfeld <hohlfeld@cs.ucsd.edu>
* Nicola Larosa
* John Stoneham <obijohn99@aol.com>
* David Svoboda <svoboda@users.sourceforge.net>
Enhancements
============
* [ghostofiht](https://github.com/ghostofiht) - Contributed a new logo design.
* [Trueno font](https://fontlibrary.org/en/font/trueno) under the [OFL](https://en.wikipedia.org/wiki/SIL_Open_Font_License) by [Julieta Ulanovsky](http://www.zkysky.com.ar/) - used in the logo.
* [Remix Icon](https://remixicon.com/) - used for many icons throughout the app.
Translations
============
* Holger Schäkel <Holger@Schaekel-row.de> (de)
* Jerzy Trzeciak <artusek@wp.pl> (pl)

5
Brewfile Normal file
View file

@ -0,0 +1,5 @@
brew "cpanminus"
brew "gettext"
brew "gnutls"
brew "openssl"
brew "tcl-tk"

View file

@ -5,14 +5,13 @@ for general guidelines for contributing to open source.
# Contribution constraints
- The [GitHub Actions CI build](https://github.com/shlomif/PySolFC/actions) and [AppVeyor build](https://ci.appveyor.com/project/shlomif/pysolfc) (which also run the test suite) should pass on each commit.
- The [Travis-CI build](https://travis-ci.org/shlomif/PySolFC) and [AppVeyor build](https://ci.appveyor.com/project/shlomif/pysolfc) (which also run the test suite) should pass on each commit.
- Your contributions should be under [GPLv3+](https://en.wikipedia.org/wiki/GNU_General_Public_License#Version_3) or a [compatible free software licence](https://www.gnu.org/licenses/license-list.html#GPLCompatibleLicenses), but please don't put them under the [AGPL](https://en.wikipedia.org/wiki/Affero_General_Public_License), which adds additional restrictions.
- The code should be compatible with Python 3.7 and above.
- The code should be compatible with both Python 2.7.x and Python 3.4.x-and-above.
# How you can contribute
- Translate PySol to a human language you know.
- Test the "master" branch version of the version control repository or other prereleases.
- Try to reproduce [open issues](https://github.com/shlomif/PySolFC/issues)
- Try to fix bugs.
- Add new games.
@ -21,7 +20,6 @@ for general guidelines for contributing to open source.
- Add new features.
- Contribute graphics
- Improve the site
- Package PySol for a new package repository or OS, or update existing packages.
- Make a monetary donation.
- [Star](https://help.github.com/articles/about-stars/) or [Watch](https://help.github.com/articles/watching-and-unwatching-repositories/) the repository on GitHub
@ -32,49 +30,6 @@ custom variants. It lives in the Edit menu.
Otherwise, the games' sources live under
[the pysollib/games/](pysollib/games/) directory in the repository, and are
written in Python 3.x and you can try inheriting from an existing
written in Python 2.7/3.x and you can try inheriting from an existing
variant [class](https://en.wikipedia.org/wiki/Class_%28computer_programming%29).
In addition to adding the game's source code, be sure to add the game's metadata. At minimum, you should:
- In html-src/rules, create a rules file for the game in question. Use an existing rules file as a guideline. Ideally, each set of game rules should be written in such a way that a non-PySol user can read the rules and know how to play the game with their own deck of cards. For games that are only slightly different from other games, referencing the more common variant's rules is okay.
- In the pysollib/gamedb.py file, update the GAMES_BY_PYSOL_VERSION dictionary to include the new game's ID for the "dev" key. If the "dev" entry does not exist, add it.
- If you know the inventor for the game, update the inventor's entry in the GAMES_BY_INVENTORS dictionary in the same file.
## Contributing changesets / patches / diffs
One can contribute changesets either by opening [pull-requests](https://docs.github.com/en/desktop/contributing-and-collaborating-using-github-desktop/creating-an-issue-or-pull-request) or merge requests,
or by submitting patches generated by [git diff](https://git-scm.com/docs/git-diff) or [git format-patch](https://git-scm.com/docs/git-format-patch)
to a developer's email (e.g [@shlomif's](https://www.shlomifish.org/me/contact-me/) ) or uploading it to a web service (e.g: a pastesite, dropbox,
or Google Drive).
# The Release Process
Before publishing a release, please open an issue in GitHub, indicating your intent to do so, to confirm with any other developers if they have any objections, or any WIP features/tickets that should be included in the upcoming release. It's best to do this a week or two before you plan to actually publish the release. No responses on this for a couple weeks can be considered approval to proceed. Releases tagged without verifying with other developers may be removed.
In order to publish a new version, follow these steps:
1. Update `NEWS.asciidoc`. The release notes should also be added to `html-src/news.html`, along with `templates/index.html` in the website repo.
2. Update the `VERSION_TUPLE =` line in `pysollib/settings.py`.
3. Check the `GAMES_BY_PYSOL_VERSION` dictionary in the `pysollib/gamedb.py` file. If there's a "dev" entry in this dictionary, change that entry's key to be the new version number. If there isn't a "dev" entry, ignore this step.
4. Test using `gmake test` .
5. `git commit` the changes .
6. `git tag pysolfc-2.6.5` (or equivalent version).
7. `git push` and `git push --tags` to https://github.com/shlomif/PySolFC .
8. Wait for the AppVeyor build for the tag to complete and scan the .exe using https://www.virustotal.com/ .
9. Grab the macOS installer (.dmg) from [GitHub Actions](https://github.com/shlomif/PySolFC/actions/workflows/macos-package.yml) (look for an artifact called `pysolfc-dmg`).
10. Run `gmake dist`.
11. Use [rexz9](https://github.com/shlomif/shlomif-computer-settings/blob/567b6ab3f4272ad66bf331536dc80bf58bfff3af/shlomif-settings/bash-aliases/user_aliases.bash#L57) on `dist/PySol*.tar.xz`.
12. Go to https://sourceforge.net/projects/pysolfc/files/PySolFC/ and add a folder called PySolFC-2.6.5 (note the capitalisation).
13. Add the tar.xz, the .exe and the .dmg there and mark them as defaults for the right OSes.
# Long-term, large-scale, tasks
Support SVG cardsets.
An optional [REPL](https://en.wikipedia.org/wiki/Read%E2%80%93eval%E2%80%93print_loop) (Read-eval-print loop)
Listen on a TCP / HTTP+REST port.
A web-based version.
Support a more secure saved-games format than the pickle-based-one.

View file

@ -4,36 +4,30 @@
## code
##
include pysol.py setup.py setup_osx.py setup.cfg MANIFEST.in Makefile
include COPYING README.md AUTHORS.md README.android README.kivy
include NEWS.asciidoc
include COPYING README.md AUTHORS README.android README.kivy
#recursive-include pysollib *.py
include pysollib/*.py
include pysollib/*.py pysollib/macosx/*.py pysollib/configobj/*.py
include pysollib/winsystems/*.py
include pysollib/tk/*.py pysollib/tile/*.py pysollib/pysolgtk/*.py
include pysollib/game/*.py
include pysollib/games/*.py pysollib/games/special/*.py
include pysollib/games/mahjongg/*.py
include pysollib/games/ultra/*.py pysollib/games/mahjongg/*.py
include data/tcl/*.tcl
include data/pysol.desktop
include data/pysolfc.glade
graft data/themes
recursive-exclude data/themes *.py
include scripts/create_iss.py scripts/mahjongg_utils.py
include scripts/all_games.py scripts/cardset_viewer.py
include scripts/cardconv
include scripts/build.bat scripts/create_iss.py scripts/mahjongg_utils.py
include scripts/pygettext.py scripts/all_games.py scripts/cardset_viewer.py
include scripts/cardconv scripts/cardsetsgiftobmp
include scripts/gen_individual_importing_tests.py
recursive-include tests/ *.pm *.py *.t *.yml
exclude tests/individually-importing/*
include tests/individually-importing/PLACEHOLDER
recursive-include tests/lib *.pm *.py
recursive-include tests/unit/data *
include tests/style/*.t
include tests/unit-generated/PLACEHOLDER
include .tidyallrc
include android/*.py
include android/mk*
include android/initsdk
include android/initsupport
include android/debian/*
#graft data/plugins
##
@ -48,7 +42,7 @@ graft html-src
#graft data/images
recursive-include data/images *.gif *.png *.jpg
graft data/tiles
include data/pysol.ico data/PySol.icns
include data/pysol.xbm data/pysol.xpm data/pysol.ico data/PySol.icns
##
## data - sound
##
@ -85,16 +79,6 @@ graft data/cardset-standard
graft data/cardset-tuxedo
graft data/cardset-vienna-2k
graft data/cardset-dondorf
graft data/cardset-neo
graft data/cardset-neo-hex
graft data/cardset-neo-tarock
graft data/cardset-uni-mahjongg
graft data/cardset-louie-mantia-hanafuda
graft data/cardset-mughal-ganjifa-xl
graft data/cardset-dashavatara-ganjifa-xl
graft data/cardset-next-matrix
graft data/cardset-matching
graft data/cardset-matching-xl
##
## exclude dirs
##

View file

@ -1,72 +1,82 @@
# Makefile for PySolFC
ifeq ($(OS),Windows_NT)
path_sep = ;
else
path_sep = :
endif
export PYTHONPATH := $(PYTHONPATH)$(path_sep)$(CURDIR)
override LANG=C
override PYSOL_DEBUG=1
.PHONY: all install dist rpm all_games_html rules pot mo pretest test runtest
PYSOLLIB_FILES=pysollib/tk/*.py pysollib/tile/*.py pysollib/*.py \
pysollib/games/*.py pysollib/games/special/*.py \
pysollib/games/ultra/*.py pysollib/games/mahjongg/*.py \
pysollib/kivy/*.py
.PHONY : all install dist all_games_html rules pot mo
all:
@echo "No default target"
install:
python3 setup.py install
python setup.py install
dist: all_games_html rules mo
python3 setup.py sdist
rpm: all_games_html rules mo
python3 setup.py bdist_rpm
python setup.py bdist_rpm
DOCS_DIR = docs
HTML_DIR = data/html
ALL_GAMES_HTML_BASE = all_games.html
ALL_GAMES_HTML = $(HTML_DIR)/$(ALL_GAMES_HTML_BASE)
ALL_GAMES_HTML__FOR_WEBSITE = $(DOCS_DIR)/$(ALL_GAMES_HTML_BASE)
all_games_html: $(ALL_GAMES_HTML)
$(ALL_GAMES_HTML) $(ALL_GAMES_HTML__FOR_WEBSITE): rules
cd $(HTML_DIR) && $(CURDIR)/scripts/all_games.py html id rules > $(ALL_GAMES_HTML_BASE)
./scripts/all_games.py html id doc/rules bare > $(ALL_GAMES_HTML__FOR_WEBSITE)
all_games_html:
PYTHONPATH=`pwd` ./scripts/all_games.py html id doc/rules bare > docs/all_games.html
rules:
cd html-src && ./gen-html.py
export PYTHONPATH=`pwd`; (cd html-src && ./gen-html.py)
cp -r html-src/images html-src/html
rm -rf data/html
mv html-src/html data
pot:
./scripts/all_games.py gettext > po/games.pot
xgettext --keyword=n_ --add-comments=TRANSLATORS: -o po/pysol.pot \
pysollib/*.py pysollib/*/*.py pysollib/*/*/*.py data/pysolfc.glade
set -e; \
for lng in de fr pl it ru pt_BR; do \
msgmerge --update --quiet --backup=none po/$${lng}_pysol.po po/pysol.pot; \
msgmerge --update --quiet --backup=none po/$${lng}_games.po po/games.pot; \
PYTHONPATH=`pwd` ./scripts/all_games.py gettext > po/games.pot
PYTHONPATH=`pwd` ./scripts/pygettext.py -k n_ --ngettext-keyword ungettext -o po/pysol-1.pot $(PYSOLLIB_FILES)
xgettext -L C --keyword=N_ -o po/pysol-2.pot data/glade-translations
msgcat po/pysol-1.pot po/pysol-2.pot > po/pysol.pot
rm -f po/pysol-1.pot po/pysol-2.pot
for lng in ru pl; do \
mv -f po/$${lng}_pysol.po po/$${lng}_pysol.old.po; \
msgmerge po/$${lng}_pysol.old.po po/pysol.pot > po/$${lng}_pysol.po; \
rm -f po/$${lng}_pysol.old.po; \
mv -f po/$${lng}_games.po po/$${lng}_games.old.po; \
msgmerge po/$${lng}_games.old.po po/games.pot > po/$${lng}_games.po; \
rm -f po/$${lng}_games.old.po; \
done
mo:
set -e; \
for lang in de fr pl it ru pt_BR; do \
mkdir -p locale/$${lang}/LC_MESSAGES; \
msgcat --use-first po/$${lang}_games.po po/$${lang}_pysol.po > po/$${lang}.po; \
msgfmt --check -o locale/$${lang}/LC_MESSAGES/pysol.mo po/$${lang}.po; \
for loc in ru ru_RU de de_AT de_BE de_DE de_LU de_CH pl pl_PL it it_IT; do \
test -d locale/$${loc}/LC_MESSAGES || mkdir -p locale/$${loc}/LC_MESSAGES; \
done
for lang in ru pl it; do \
msgcat --use-first po/$${lang}_games.po po/$${lang}_pysol.po > po/$${lang}.po 2>/dev/null; \
done
for lang in ru de pl it; do \
msgfmt -o locale/$${lang}/LC_MESSAGES/pysol.mo po/$${lang}.po; \
done
cp -f locale/ru/LC_MESSAGES/pysol.mo locale/ru_RU/LC_MESSAGES/pysol.mo
for dir in de_AT de_BE de_DE de_LU de_CH; do \
cp -f locale/de/LC_MESSAGES/pysol.mo locale/$${dir}/LC_MESSAGES/pysol.mo; \
done
cp -f locale/pl/LC_MESSAGES/pysol.mo locale/pl_PL/LC_MESSAGES/pysol.mo
cp -f locale/it/LC_MESSAGES/pysol.mo locale/it_IT/LC_MESSAGES/pysol.mo
pretest:
rm -f tests/individually-importing/*.py tests/unit-generated/*.py # To avoid stray files
python3 scripts/gen_individual_importing_tests.py
@rm -f tests/individually-importing/*.py # To avoid stray files
python scripts/gen_individual_importing_tests.py
TEST_ENV_PATH = $(CURDIR)$(path_sep)$(CURDIR)/tests/lib
TEST_FILES = tests/style/*.t tests/t/*.py tests/individually-importing/*.py
TEST_ENV_PATH = "`pwd`:`pwd`/tests/lib"
TEST_ENV = PYTHONPATH=$(TEST_ENV_PATH) PERL5LIB=$(TEST_ENV_PATH)
TEST_FILES = tests/style/*.t tests/unit-generated/*.py tests/individually-importing/*.py
test runtest: export PERL5LIB := $(PERL5LIB)$(path_sep)$(TEST_ENV_PATH)
define RUN_TESTS
$(TEST_ENV) $1 $(TEST_FILES)
endef
test: pretest
prove $(TEST_FILES)
$(call RUN_TESTS,prove)
runtest: pretest
runprove $(TEST_FILES)
$(call RUN_TESTS,runprove)

View file

@ -1,241 +0,0 @@
[[news]]
=== News
* _11 January, 2025:_ There is a new stable release
https://sourceforge.net/projects/pysolfc/files/PySolFC/PySolFC-3.2.0/[PySolFC
v3.2.0]. New in this release:
** New fullscreen mode, accessible by pressing F11.
** Easy option to clear advanced search options.
** Lots of bugfixes and enhancements.
* _19 October, 2024:_ There is a new stable release
https://sourceforge.net/projects/pysolfc/files/PySolFC/PySolFC-3.1.0/[PySolFC
v3.1.0]. New in this release:
** Ten new games.
** Cleanup of duplicate images to reduce package size.
** Some extra cardset/table tile filter options.
** Many enhancements, bugfixes, etc.
* _31 March, 2024:_ There is a new stable release
https://sourceforge.net/projects/pysolfc/files/PySolFC/PySolFC-3.0.0/[PySolFC
v3.0.0] - the biggest release in over 15 years. Additionally, there is a new Cardsets release
https://sourceforge.net/projects/pysolfc/files/PySolFC-Cardsets/PySolFC-Cardsets-3.0/[PySolFC-Cardsets v.3.0]. New in this release:
** 120 new games.
** Support for several new types of games/decks, including tile puzzles, Ishido-type tile matching games, joker deck games, and more.
** New game and cardset categories.
** Ability to change the style of virtually any of the graphics in PySol.
** Some UI/Quality of Life improvements.
** Bugfixes.
* _10 July, 2023:_ There is a new beta release
https://sourceforge.net/projects/pysolfc/files/PySolFC/PySolFC-2.21.0/[PySolFC
v2.21.0]. New in this release:
** Ten new games.
** Compatibility with Pillow 10.0.
** Several new display options.
** Other bugfixes and enhancements.
* _16 April, 2023:_ There is a new stable release
https://sourceforge.net/projects/pysolfc/files/PySolFC/PySolFC-2.20.1/[PySolFC
v2.20.1]. New in this release:
** The release packages have been updated to use the latest version of Python, and all the dependent libraries.
** New alternate release packages for Windows and Mac that include the full cardsets library (these are larger and may take longer to download/install).
** Bugfixes and other enhancements.
* _26 February, 2023:_ There is a new stable release
https://sourceforge.net/projects/pysolfc/files/PySolFC/PySolFC-2.20.0/[PySolFC
v2.20.0]. Additionally, there is a new Cardsets release
https://sourceforge.net/projects/pysolfc/files/PySolFC-Cardsets/PySolFC-Cardsets-2.2/[PySolFC-Cardsets v.2.2]. New in this release:
** Over 40 new games, bringing the total to 1,200!
** Memory games can now use any type of cardset, including new Matching type cardsets.
** New options in the Solitaire Wizard.
** Additional documentation for a number of PySol's features.
** Bugfixes and other enhancements.
* _11 October, 2022:_ Linux users, PySolFC is now available https://flathub.org/apps/details/io.sourceforge.pysolfc.PySolFC[on Flathub].
* _9 October, 2022:_ There is a new stable release
https://sourceforge.net/projects/pysolfc/files/PySolFC/PySolFC-2.18.0/[PySolFC
v2.18.0]. New in this release:
** Advanced search feature - the ability to search for games, cardsets, or table tiles based on many different criteria.
** Complete documentation containing rules for all 1,100+ games.
** Revamped status bar, displaying more info.
** The Find Card feature now supports all types of games.
** Many new display and assist options.
** Bugfixes, code cleanup, etc.
* _10 May, 2022_ There is a new stable release
https://sourceforge.net/projects/pysolfc/files/PySolFC/PySolFC-2.16.0/[PySolFC
v2.16.0]. Anyone upgrading from a version prior to 2.15.0 should read the notes for that version before upgrading. New in this release:
** Enhancements to many images and graphical displays.
** More game rules in the documentation.
** Bugfixes, cleanup, and other enhancements.
* _12 March, 2022_ There is a new beta release
https://sourceforge.net/projects/pysolfc/files/PySolFC/PySolFC-2.15.0/[PySolFC
v2.15.0]. Additionally, there is a new Cardsets release https://sourceforge.net/projects/pysolfc/files/PySolFC-Cardsets/PySolFC-Cardsets-2.1/[PySolFC-Cardsets v.2.1]
(required to run 2.15). This is a pretty sizable release, so this beta version
is being offered before a stable 2.16 in the next couple months. Any https://github.com/shlomif/PySolFC/issues[feedback
and bug reports] are greatly appreciated. The full list of changes for this release
is quite long, but here are the highlights:
** 35 new games, plus enhancements and fixes to many existing games.
** Many new game rules added to the documentation.
** New high resolution default display. This new display uses high resolution
cardsets and scaling to make the games look impressive on larger monitors.
*** Note that the new high-resolution options will not override your currently selected
options for existing users. If you want to use the new settings, you can delete or
rename your options.cfg file.
*** Also note that because of these changes, upgrading your version of PySolFC Cardsets
is required even if you're using the minimal package. If you are using the Windows or
Mac installer, this will be handled automatically, but you'll need to upgrade if you're
setting it up manually.
** New feature to search for games, cardsets, and table tiles by name.
** Many new display options.
** Bugfixes and cleanup.
** And more.
* _10 December, 2021:_ There is a new stable release
https://sourceforge.net/projects/pysolfc/files/PySolFC/PySolFC-2.14.1/[PySolFC
v2.14.1]. This release fixes a number of bugs, including one that causes
crashes for some users when opening the select game/cardset/table tile window.
* _19 September, 2021:_ There is a new stable release
https://sourceforge.net/projects/pysolfc/files/PySolFC/PySolFC-2.14.0/[PySolFC
v2.14.0]. New in this release:
** 16 new games
** Support for Python 3.10 (Minimum requirement is still Python 2.7)
** A new macOS package.
** Enhancements to the tree select dialogs for selecting games, cardsets, and table tiles.
** Further additions/improvements to the documentation.
** Many bugfixes and cleanups.
* _11 July, 2021:_ There is a new stable release
https://sourceforge.net/projects/pysolfc/files/PySolFC/PySolFC-2.12.0/[PySolFC
v2.12.0]. New in this release:
** 40 new games!
** Support for using higher resolution cardsets. The high resolution "Neo"
cardset has been added to the Windows Installer package and is available in
https://sourceforge.net/projects/pysolfc/files/PySolFC-Cardsets/PySolFC-Cardsets-2.1PRE/[a preview release of
PySolFC-Cardsets 2.1].
** Improved organization and categorization of the games list.
** New display options - added option to center the game layout in the window.
** New audio options - can now disable music without disabling sound effects.
** Improved documentation - added rules to a large number of games that were missing them.
** Bugfixes and cleanup.
* _22 June, 2020:_ There is a new stable release
https://sourceforge.net/projects/pysolfc/files/PySolFC/PySolFC-2.10.0/[PySolFC
v2.10.0]. New in this release:
** Fix moving cards in the Scorpion Tail game.
** Make use of https://pypi.org/project/pysol-cards/[the pysol-cards PyPI module]
** One can optionally load the Freecell Solver and the Black Hole Solver using their DLLs.
** Test Windows Version in the installer: https://github.com/shlomif/PySolFC/issues/161
** Pause when showing statistics: https://github.com/shlomif/PySolFC/pull/162
* _5 March, 2020:_ There is a new stable release
https://sourceforge.net/projects/pysolfc/files/PySolFC/PySolFC-2.8.0/[PySolFC
v2.8.0]. New in this release:
** Better kivy/Android support
** Using ttk and configobj as shipped in the python dist (instead of forked versions)
** Requiring https://pypi.org/project/attrs/[attrs] and https://pypi.org/project/pysol-cards/[pysol-cards] from PyPI
** Added tests, bug fixes and refactorings.
** Add the +-g+ and +--deal+ command line options.
* _25 April, 2019:_ There is a new stable release
https://sourceforge.net/projects/pysolfc/files/PySolFC/PySolFC-2.6.4/[PySolFC
v2.6.4]. New in this release:
** A https://github.com/shlomif/PySolFC/issues/107[new logo] thanks to @ghostofiht.
** Fix for https://github.com/shlomif/PySolFC/issues/110[Freezes] (pygame upgrade)
** Fixed https://github.com/shlomif/PySolFC/issues/111[Three Peaks scoring].
* _7 April, 2019:_ There is a new stable release
https://sourceforge.net/projects/pysolfc/files/PySolFC/PySolFC-2.6.3/[PySolFC
v2.6.3]. New in this release:
** Compatibility with Pillow 6.x - https://github.com/shlomif/PySolFC/issues/108
** Restore the "Save games geometry" feature - https://github.com/shlomif/PySolFC/issues/84
** Added a NEWS.asciidoc file.
* _4 March, 2019:_ There is a new stable release
https://sourceforge.net/projects/pysolfc/files/PySolFC/PySolFC-2.6.2/[PySolFC
v2.6.2]. New in this release:
** Fixes for the Windows and macOS packages.
** Forbid illegal moves in Spider and some other variants.
* _14 February, 2019:_ There is a new stable release
https://sourceforge.net/projects/pysolfc/files/PySolFC/PySolFC-2.6.0/[PySolFC
v2.6.0]. New in this release:
** Support for solving
https://en.wikipedia.org/wiki/Golf_(patience)[Golf] using
https://github.com/shlomif/black-hole-solitaire[a solver]
** An untested macOS package (we need testers)
** A https://sourceforge.net/p/pysolfc/bugs/31/[bug] fix
** Ability to run the test suite without python 2.x and/or pygtk
** Code cleanups.
* _23 June, 2018:_ There is a new stable release
https://sourceforge.net/projects/pysolfc/files/PySolFC/PySolFC-2.4.0/[PySolFC
v2.4.0]. New in this release:
** The Windows installer now includes the revitalised PySol-music
package. For more info, see
https://github.com/shlomif/PySolFC/issues/82[this bug].
** Many improvements to the test suite and the board import
functionality.
** Some bug fixes.
* _16 April, 2018:_ There is a new stable release
https://sourceforge.net/projects/pysolfc/files/PySolFC/PySolFC-2.2.0/[PySolFC
v2.2.0]. New in this release:
** The Microsoft Windows binary installer now contains and supports the
solver for Freecell and other games.
** Many bug fixes.
* _31 March, 2018:_ There is a new beta release
https://sourceforge.net/projects/pysolfc/files/PySolFC/PySolFC-2.1/[PySolFC
v2.1.4]. New in this release:
** We now provide a Microsoft Windows binary installer again, thanks to
the great work of https://github.com/Programator2[Roderik Ploszek]. Note
that the solvers (for FreeCell/etc.) are not installed as part of it
yet, but they are available separately.
** https://github.com/shlomif/pysol-sound-server[pysol-sound-server] was
updated to support Python 3.x.
** Fixes for the board export / solver input, and for redealing upon
restart of the "ms*" deals.
** Various cleanups.
* _5 March, 2018:_ There is a new beta source release
https://sourceforge.net/projects/pysolfc/files/PySolFC/PySolFC-2.1/[PySolFC
v2.1.3]. New in this release:
** Support for the https://kivy.org/[kivy] toolkit for running under
Android-based devices (currently python 2.7-only)
** Fixed the help system and removed the need for the sgmllib module.
** Other fixes and cleanups.
** Currently there is no Microsoft Windows binary package. Help or
insights will be appreciated.
* _19 November, 2017:_ There is a new beta source release
https://sourceforge.net/projects/pysolfc/files/PySolFC/PySolFC-2.1/[PySolFC
v2.1.0], the first one in almost 8 years. New in this release:
** The code is now compatible with both Python 2.7.x and Python 3.x
** One can deal all
https://fc-solve.shlomifish.org/faq.html#what_are_ms_deals[MS
FreeCell/FC-pro deals] by specifying e.g: "ms100000" as the seed.
** Support for Black Hole and All in a Row solver was added.
** Test suite and CI were added to the repository.
** The code now passes flake8 validation.
** Some improvements to the solver dialog.
* _15 November, 2017:_ Development of the Python sources has recently
resumed using a https://github.com/shlomif/PySolFC[a GitHub project] and
other resources and Shlomi Fish (@shlomif) has received an admin status
on the SourceForge project and this site. A new source release which
adds compatibility with Python version 3.x and some other improvements
is expected soon.
* _04 December, 2009:_
https://sourceforge.net/projects/pysolfc/files/PySolFC/PySolFC-2.0/[PySolFC
v.2.0] (1061 games) and
https://sourceforge.net/projects/pysolfc/files/PySolFC-Cardsets/PySolFC-Cardsets-2.0/[PySolFC-Cardsets
v.2.0] (153 cardsets)
** The license was changed to the GPLv3 or newer.
** 13 new games.
** Migration to new
https://code.google.com/archive/p/python-ttk/[python-ttk] module.
** Improved the look of the deck (required
http://effbot.org/downloads/#pil[python-imaging v.1.1.7]).
** Fixed Hanafuda games
(https://sourceforge.net/p/pysolfc/bugs/9/[ticket]).
** New config-file option: sound_sample_buffer_size
(https://sourceforge.net/p/pysolfc/bugs/10/[ticket]).
** Portable version for windows
(https://sourceforge.net/p/pysolfc/patches/3/[ticket]).
** Many other bugfixes.
* _06 September, 2007:_
https://sourceforge.net/projects/pysolfc/files/PySolFC/PySolFC-1.1/[PySolFC
v.1.1] (1048 games)
** 48 new games (one game was removed)
** Solitaire Wizard
** improved Mahjongg games
** human readable config file (options.cfg)
** stack becomes compact when a card goes off screen
** Clearlooks theme for Tile widget set
** a huge number of other improvements
* _30 August, 2007:_
https://sourceforge.net/projects/pysolfc/files/PySolFC-Cardsets/PySolFC-Cardsets-1.1/[PySolFC-Cardsets
v.1.1] (152 cardsets)
* _21 February, 2007:_
https://sourceforge.net/projects/pysolfc/files/PySolFC/PySolFC-1.0/[PySolFC
v.1.0] (1001 games)

View file

@ -1,28 +1,7 @@
History:
--------
Prerequisites (needs root):
The Android project was created in 2016 as a separate project (on Bitbucket)
forked from a long inactive Sourceforge repository by lufebe16. The first
version (as 0.8) was released with fdroid in March 2017.
In 2016, shlomif started working diligently on the official project.
Following his request to combine these two projects, the Android version
was merged into his repo (now on github) in February 2018. The
first joint version (as 2.2.0) was released in April 2018.
Build Prerequisites (needs root):
---------------------------------
You need a linux workstation (either native or virtual). It needs
x86 hardware (either intel or amd). No graphic desktop is needed,
cmdline only is sufficient.
On freshly installed systems you will need to add about the
following packages:
On a 'freshly installed' Ubuntu or Debian, the following
On a 'freshly installed' Ubuntu 16.04 (32bit), the following
additional packages had to be installed:
- python-setuptools
@ -34,6 +13,10 @@ Build Prerequisites (needs root):
- virtualenv (python-virtualenv)
- zip,unzip
On a freshly installed debian stretch/xfce:
-> consult script files in directory android/debian.
On a 'simple' gentoo installation the following packages had to be
installed in addition:
@ -48,7 +31,10 @@ Build Prerequisites (needs root):
- dev-vcs/git
- dev-java/ant
For detailed instructions consult buildozer/build-instruction.txt.
and python modules:
- python3 -m pip install requests --user.
- python3 -m pip install clint --user.
NOTES:
1) This information is supplied to give you a hint, when running into
@ -56,28 +42,48 @@ Build Prerequisites (needs root):
2) All builds need an working (fairly fast) internet connection and
6 GB of free disk space.
Build with 'python-for-android' (as user):
go to the android directory, then
$ ./mkp4a.init [<sdkdir>] [<ndkdir>] # prepare sdk and p4a installation
$ ./mkkeystore # if you want to build a release version.
$ ./mkp4a.debug # build debug apk
$ ./mkp4a.release <passwd1> [<passwd2>] # build release apk
$ ./mkp4a.unsigned # build an unsigned release apk
The build system will download all required additional
packages (such as the android sdk and more). Do the first build will
take a while. All in all you will need up to 6 GB of free disk space.
If you have Android Studio installed, you may call mkp4a.init
with optional parameter <sdk-dir> and ev. in addition as
second parameter <ndk-dir> (if not default) to prevent them
from downloading a new. (Note that currently android ndk version
should be less 14, otherwise the build will fail).
Resulted apks will appear in directory android.
Cardsets:
---------
The Apk includes a minimal set of cards for playing.
Cardsets should be installed in ${HOME}/.PySolFC/cardsets/. On an
android device this is equivalent to /sdcard/.PySolFC/cardsets/.
Cardsets must use the bmp image format. Use scripts/cardsetsgiftobmp
(on a linux system) to convert them, before copying to the device.
Additional user supplied data:
------------------------------
Possible known build issues:
NOTE:
To be able to add additional resources to your app, you need to
enable storage access in the android settings for the app. Go to
Settings/Apps/PySolFC/Permissions.
2) for android ndk: needs a Version <=13 (because needs ant support).
Resources are stored in ~/.PySolFC/. On an android device this is
equivalent to /sdcard/.PySolFC/.
3) python-for-android, on downloading recipes:
Additional cardsets can be installed in ~/.PySolFC/cardsets/.
Important: Cardsets must use the 'png' image format. Use
scripts/cardconv (on a gnu/linux system) to convert, before copying
them to the device.
('CA CERTIFICATE VALIDATION FAILED' when downloading python.2.7 or
some 'recipes')
Byond cardsets you may also wish to add your own backgrounds. You can
add them to ~/.PySolFC/data/tiles (patterns) and to
~/.PySolFC/data/tiles/save-aspect/ (images). 'png' and 'jpg' image
formats are supported.
Solution:
Try the download address with firefox. if it works, view the
site certificate and download (export) it from the browser.
Copy the resulting *.crt to /usr/local/ca-certificates and
run update-ca-certificates.

View file

@ -2,7 +2,7 @@
Introduction
------------
This is a version of the PySolFC open source project
This is a version of the PySol FC open source project
(http://pysolfc.sourceforge.net)
Early investigations of the code showed, that it would not be
@ -25,18 +25,24 @@ Images
The original images supplied by the collection are of type
gif. In kivy, that image type loads very slowly. Moreover, many
cards cannot be loaded, because of decoding errors.
To prevent these problems, the kivy version was modified to not read
any gif images.
To prevent these problems, the kivy version was
modified to not read any gif images.
For all GIF images in the directories data/images and data/tiles,
corresponding images in the PNG format have been added.
Some cardsets have been translated to PNG, a format
that is processed by both the tk and the kivy versions.
To convert the cardsets to png format, a shell script, 'cardconv' , has been
added to the scripts directory. It requires Bash and ImageMagick
to be installed.
Some others, for which transparency information is not
processed correctly even from the PBF images, have been translated
to the BMP image format (while keeping their GIF variant for
the tk version). BMP format is only processed by the
kivy version.
Additional cardsets are available from the SourceForge project. To use
them with kivy, make sure they to also convert them to the png format if
needed.
Additional cardsets are available from the SourceForge
project. To use them with kivy, they need to be converted to
the BMP format. A shell script, 'cardsetsgiftobmp' , has been added
to the scripts directory (it requires Bash and ImageMagick).
LB230126.
For all GIF images in the directories data/images and data/tiles ,
corresponding images in the PNG format have been added too.
LB170321.

109
README.md
View file

@ -1,54 +1,42 @@
<p align="center"><img src="html-src/images/high_res/logo_horizontal.png" alt="PySol FC logo" height="180px"></p>
# PySol Fan Club edition
This is an open source and portable (Windows, Linux and Mac OS X) collection
of Card Solitaire/Patience games written in Python. Its homepage is
https://pysolfc.sourceforge.io/.
http://pysolfc.sourceforge.net/ .
The maintenance branch of PySol FC on GitHub by [Shlomi
Fish](https://www.shlomifish.org/) and by some other
Fish](http://www.shlomifish.org/) and by some other
people, has gained official status, ported the code to Python 3,
and implemented some other enhancements.
- [![CI tests at GitHub](https://github.com/shlomif/PySolFC/actions/workflows/ci.yml/badge.svg)](https://github.com/shlomif/PySolFC/actions/workflows/ci.yml)
- [![Build Status](https://travis-ci.org/shlomif/PySolFC.svg)](https://travis-ci.org/shlomif/PySolFC)
[![AppVeyor Build status](https://ci.appveyor.com/api/projects/status/04re7umgl3yuukmh?svg=true)](https://ci.appveyor.com/project/shlomif/pysolfc)
## Call for Contributors
[Shlomi Fish](https://github.com/shlomif), who adopted PySol FC, and maintained
it for several years, has stepped down as its primary maintainer
due to the fact he no longer plays PySol, or other computer card games too
much and that it has been a time sink for him. (Also see
[this Twitter discussion](https://twitter.com/bagder/status/1336793880709238786)
). We are looking for other contributors and there are still
[some large-scale features](https://github.com/shlomif/PySolFC/issues) that
can be implemented.
# Screenshots
![Screenshot of PySol FC](https://i.imgur.com/jQkTGwf.jpg)
![Image](<http://i.imgur.com/jQkTGwf.jpg>)
## Requirements.
- Python (3.7 or later)
- Python (2.7 or 3.x)
- Tkinter (Tcl/Tk 8.4 or later)
- For sound support (optional)
- PySol-Sound-Server fork: https://github.com/shlomif/pysol-sound-server (mp3, wav, tracker music)
- (or: ) PyGame: https://www.pygame.org/ (mp3, ogg, wav, midi, tracker music)
- (or: ) PyGame: http://www.pygame.org/ (mp3, ogg, wav, midi, tracker music)
- Other packages (optional):
- Pillow (Python Imaging Library): https://pillow.readthedocs.io/
- TTKThemes: https://ttkthemes.readthedocs.io/
- Freecell Solver: https://fc-solve.shlomifish.org/
- [Black Hole Solitaire Solver](https://www.shlomifish.org/open-source/projects/black-hole-solitaire-solver/)
- Tile (ttk): http://tktable.sourceforge.net/tile/ (0.8.0 or later)
- PIL (Python Imaging Library): http://www.pythonware.com/products/pil
- Freecell Solver: http://fc-solve.shlomifish.org/ .
- [Black Hole Solitaire Solver](http://www.shlomifish.org/open-source/projects/black-hole-solitaire-solver/)
## Installation.
We provide an [installer for Windows](https://sourceforge.net/projects/pysolfc/files/PySolFC/)
(requires Windows XP SP3 or higher) as well as an
[Android package on F-droid](https://f-droid.org/packages/org.lufebe16.pysolfc/).
as well as an Android package on F-droid.
For installation from source, see: http://www.python.org/doc/current/inst/
### Running from source without installation.
@ -64,12 +52,6 @@ After following steps similar to these (on
#### Step 1 - install the dependencies
On Fedora you can do:
```
sudo dnf builddep PySolFC
```
On Mageia you can do:
```
@ -79,17 +61,11 @@ sudo urpmi git make pygtk2 pygtk2.0-libglade gnome-python-canvas tkinter
On Debian / Ubuntu / etc. you can do:
```
sudo apt-get install cpanminus make perl python3-setuptools python3-tk
sudo apt-get install -y ack-grep cpanminus libperl-dev make perl python-glade2 python-gnome2 python-gnome2-dev python-gtk2 python-setuptools python-tk
```
#### Step 2 - build PySol.
You can try running:
```
python3 scripts/linux-install.py
```
```
git clone https://github.com/shlomif/PySolFC.git
cd PySolFC
@ -97,15 +73,15 @@ cd PySolFC
gmake test
gmake rules
ln -s data/images images
tar -xvf PySolFC-Cardsets-3.0.tar.bz2 # Needs to be downloaded from sourceforge
tar -xvf PySolFC-Cardsets-2.0.tar.bz2 # Need to be downloaded from sourceforge
mkdir -p ~/.PySolFC
rmdir ~/.PySolFC/cardsets
ln -s "`pwd`/PySolFC-Cardsets-3.0" ~/.PySolFC/cardsets
ln -s "`pwd`/PySolFC-Cardsets-2.0" ~/.PySolFC/cardsets
python pysol.py
```
<b>Note!</b> If you are using a Debian derivative (e.g: Debian, Ubuntu, or
Linux Mint) and you are getting an error of "No cardsets were found !!! Main
Linu Mint) and you are getting an error of "No cardsets were found !!! Main
data directory is `[insert dir here]` Please check your PySol installation.",
then you likely installed the cardsets package which has removed some files
that are needed by pysol from source (without the debian modifications).
@ -118,24 +94,20 @@ per the instructions above.
At the moment, this only works on POSIX (Linux, FreeBSD and similar) systems.
Windows and Mac users - you'll need to chip in with a script for your system.
#### 1 - Install build prerequisite: pysol-cards
#### 1 - Install build prerequisites: six and random2
This is kind of stupid and maybe it can be fixed in the future, but for now:
```
pip install pysol-cards
pip install six
pip install random2
```
You may want to use your OS distribution package system instead, for example:
```
sudo apt-get install python3-pysol-cards
```
For Pillow compilation, libjpeg headers and libraries need to be available:
```
sudo apt-get install libjpeg-dev
sudo apt-get install python-six
sudo apt-get install python-random2
```
#### 2 - Clone the source from version control
@ -148,10 +120,10 @@ cd PySolFC
#### 3 - Create your virtual environment.
```
PKGTREE=/usr/local/packages/PySolFC # or whatever
export PKGTREE
mkdir -p "$PKGTREE"
( cd "$PKGTREE" && python -m venv ./env )
PKGDIR=/usr/local/packages/PySolFC # or whatever
export PKGDIR
mkdir -p "$PKGDIR"
( cd "$PKGDIR" && python -m venv ./env )
```
#### 4 - Run the install script
@ -165,38 +137,28 @@ mkdir -p "$PKGTREE"
#### 6 - Enjoy playing
```
"$PKGTREE"/env/bin/pysol.py
"$PKGDIR"/env/bin/pysol.py
```
### Alternate toolkit.
## Alternate toolkit.
- Python2 (2.7 or later)
- Kivy (10.0 or later)
- Kivy
- Features:
- Sound support integrated.
- Android apk build support.
- Running from source without installation:
```
python pysol.py --kivy
python2 pysol.py --kivy
```
### Android App
On the basis of Kivy an Android App is also available. You may build
your own using appropriate build instructions in README.android and
in Directory buildozer.
Some versions will also be published on F-droid.
[<img src="https://fdroid.gitlab.io/artwork/badge/get-it-on.png"
alt="Get it on F-Droid"
height="80">](https://f-droid.org/packages/org.lufebe16.pysolfc/)
### Configuring Freecell Solver
If you want to use the solver, you should configure freecell-solver
( https://fc-solve.shlomifish.org/ ) by passing the following options
( http://fc-solve.shlomifish.org/ ) by passing the following options
to its CMake-based build-system:
`-DMAX_NUM_FREECELLS=8 -DMAX_NUM_STACKS=20 -DMAX_NUM_INITIAL_CARDS_IN_A_STACK=60`.
@ -219,7 +181,6 @@ to its CMake-based build-system:
- [PySol-Sound-Server fork](https://github.com/shlomif/pysol-sound-server)
- [Sources for the PySolFC web site](https://github.com/shlomif/pysolfc-website)
- [PySolFC Announcements Drafts](https://github.com/shlomif/pysolfc-announcements)
- [PySolFC-Cardsets tarballs sources repo](https://github.com/shlomif/PySolFC-Cardsets)
- [Extra mahjongg cardsets for PySolFC - originally for flowersol](https://github.com/shlomif/PySol-Extra-Mahjongg-Cardsets)
- [The old "pysol-music" distribution](https://github.com/shlomif/pysol-music)
@ -246,7 +207,7 @@ To facilitate coordination about contributing to PySol, please join us for a
real time Internet chat on
the <a href="irc://irc.freenode.net/##pysol">##pysol</a> chat room on
[Freenode](http://freenode.net/) (note the double
octothorpe/hash-sign/pound-sign). We may set up
octothorpe/hash-sign/pound-sign) . We may set up
chat rooms on different services in the future.
In addition, we set up a

Binary file not shown.

Before

Width:  |  Height:  |  Size: 972 KiB

After

Width:  |  Height:  |  Size: 1,001 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 MiB

After

Width:  |  Height:  |  Size: 1.2 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 642 KiB

After

Width:  |  Height:  |  Size: 660 KiB

19
android/debian/README Normal file
View file

@ -0,0 +1,19 @@
Actions to take upon a freshly installed Debian stretch/xfce (virtualbox).
Do something like:
user$ su
- enter root password.
root$ ./apt-install.sh
- .... some output.
root$ exit
user$ ./pip-install.sh
- .....some output.
Now all required packages are installed to proceed with the
android build.
LB170709.

12
android/debian/apt-installs.sh Executable file
View file

@ -0,0 +1,12 @@
#!/bin/bash
# als root ausführen!
apt-get install -y mercurial git default-jdk
apt-get install -y cython cython3
apt-get install -y python3-pip
apt-get install -y python3-yaml
apt-get install -y virtualenv
apt-get install -y pkg-config
apt-get install -y automake autoconf libtool
apt-get install -y zlib1g-dev
apt-get install -y libsdl2-dev libsdl2-image-dev libsdl2-mixer-dev libsdl2-ttf-dev

8
android/debian/pip-installs.sh Executable file
View file

@ -0,0 +1,8 @@
#!/bin/bash
# als user installieren !
python3 -m pip install --user pyasn1
python3 -m pip install --user pyasn1_modules
python3 -m pip install --user requests
python3 -m pip install --user clint

240
android/initsdk.py Executable file
View file

@ -0,0 +1,240 @@
#! /usr/bin/env python3
# -*- coding: iso-8859-1 -*-
import sys
import os
import requests
import logging
import hashlib
import glob
from zipfile import ZipFile, ZipInfo
from clint.textui import progress
cachefiles = [
('https://dl.google.com/android/repository/platform-tools-latest-linux.zip',
'',
'platform-tools'),
('https://dl.google.com/android/repository/tools_r25.2.5-linux.zip',
'577516819c8b5fae680f049d39014ff1ba4af870b687cab10595783e6f22d33e',
'tools'),
('https://dl.google.com/android/repository/android-19_r04.zip',
'5efc3a3a682c1d49128daddb6716c433edf16e63349f32959b6207524ac04039',
'platform'),
('https://dl.google.com/android/repository/build-tools_r26-linux.zip',
'7422682f92fb471d4aad4c053c9982a9a623377f9d5e4de7a73cd44ebf2f3c61',
'build-tools'),
('https://dl.google.com/'
'android/repository/android-ndk-r12b-linux-x86_64.zip',
'eafae2d614e5475a3bcfd7c5f201db5b963cc1290ee3e8ae791ff0c66757781e',
'ndk'),
]
# https://stackoverflow.com/questions/39296101:
class MyZipFile(ZipFile):
def extract(self, member, path=None, pwd=None):
if not isinstance(member, ZipInfo):
member = self.getinfo(member)
if path is None:
path = os.getcwd()
ret_val = self._extract_member(member, path, pwd)
attr = member.external_attr >> 16
os.chmod(ret_val, attr)
return ret_val
# Reused from fdroidserver:
def sha256_for_file(path):
with open(path, 'rb') as f:
s = hashlib.sha256()
while True:
data = f.read(4096)
if not data:
break
s.update(data)
return s.hexdigest()
# Adapted from fdroidserver:
def update_cache(cachedir, cachefiles):
for srcurl, shasum, typ in cachefiles:
filename = os.path.basename(srcurl)
local_filename = os.path.join(cachedir, filename)
if os.path.exists(local_filename):
local_length = os.path.getsize(local_filename)
else:
local_length = -1
if (typ == 'ndk') and (ndkloc is not None):
continue
elif (typ != 'tools') and (sdkloc is not None):
continue
resume_header = {}
download = True
try:
r = requests.head(srcurl, allow_redirects=True, timeout=60)
if r.status_code == 200:
content_length = int(r.headers.get('content-length'))
else:
content_length = local_length # skip the download
except requests.exceptions.RequestException as e:
content_length = local_length # skip the download
logger.warn('%s', e)
if local_length == content_length:
download = False
elif local_length > content_length:
logger.info('deleting corrupt file from cache: %s',
local_filename)
os.remove(local_filename)
logger.info("Downloading %s to cache", filename)
elif local_length > -1 and local_length < content_length:
logger.info("Resuming download of %s", local_filename)
resume_header = {
'Range': 'bytes=%d-%d' % (local_length, content_length)}
else:
logger.info("Downloading %s to cache", filename)
if download:
r = requests.get(srcurl, headers=resume_header,
stream=True, verify=False, allow_redirects=True)
content_length = int(r.headers.get('content-length'))
with open(local_filename, 'ab') as f:
for chunk in progress.bar(
r.iter_content(chunk_size=65536),
expected_size=(content_length / 65536) + 1):
if chunk: # filter out keep-alive new chunks
f.write(chunk)
if not shasum == '':
v = sha256_for_file(local_filename)
if v == shasum:
logger.info("Shasum verified for %s", local_filename)
else:
logger.critical(
"Invalid shasum of '%s' detected for %s", v, local_filename)
os.remove(local_filename)
sys.exit(1)
# Build the sdk from zips.
def build_sdk(sdkdir, cachedir, cachfiles):
for srcurl, shasum, typ in cachefiles:
filename = os.path.basename(srcurl)
local_filename = os.path.join(cachedir, filename)
if typ == 'tools':
if os.path.exists(local_filename):
print('Extract: %s' % local_filename)
zf = MyZipFile(local_filename)
zf.extractall(sdkdir)
elif typ == 'platform-tools':
if (sdkloc is None) and (os.path.exists(local_filename)):
print('Extract: %s' % local_filename)
zf = MyZipFile(local_filename)
zf.extractall(sdkdir)
else:
print('Link to: %s' % sdkloc)
os.symlink(sdkloc + '/platform-tools',
sdkdir + '/platform-tools')
elif typ == 'platform':
if (sdkloc is None) and (os.path.exists(local_filename)):
print('Extract: %s' % local_filename)
zf = MyZipFile(local_filename)
zf.extractall(sdkdir + '/platforms')
else:
print('Link to: %s' % sdkloc)
os.symlink(sdkloc + '/platforms', sdkdir + '/platforms')
elif typ == 'build-tools':
if (sdkloc is None) and (os.path.exists(local_filename)):
print('Extract: %s' % local_filename)
zf = MyZipFile(local_filename)
zf.extractall(sdkdir + '/build-tools')
else:
print('Link to: %s' % sdkloc)
os.symlink(sdkloc + '/build-tools', sdkdir + '/build-tools')
elif typ == 'ndk':
if ndkloc is None:
print('Extract: %s' % local_filename)
zf = MyZipFile(local_filename)
zf.extractall(sdkdir)
lst = glob.glob(sdkdir + '/*-ndk-*')
print(lst)
os.rename(lst[0], sdkdir + '/ndk-bundle')
else:
print('Link to: %s' % ndkloc)
os.symlink(ndkloc, sdkdir + '/ndk-bundle')
logger = logging.getLogger('prepare-fdroid-build')
logging.basicConfig(format='%(message)s', level=logging.INFO)
logger.setLevel(logging.INFO)
# command line arguments
sdkloc = None
ndkloc = None
if len(sys.argv) > 1:
sdkloc = sys.argv[1]
if (len(sdkloc) > 0) and (sdkloc[-1] == '/'):
sdkloc = sdkloc[:-1]
if not os.path.isdir(sdkloc):
sdkloc = None
if len(sys.argv) > 2:
ndkloc = sys.argv[2]
if (len(ndkloc) > 0) and (ndkloc[-1] == '/'):
ndkloc = ndkloc[:-1]
if not os.path.isdir(ndkloc):
ndkloc = None
fdroidmode = None
if len(sys.argv) > 3:
fdroidmode = sys.argv[3]
if (len(fdroidmode) > 0):
fdroidmode = '1'
if sdkloc == "":
sdkloc = None
if ndkloc == "":
ndkloc = None
logger.info('sdkloc = %s' % sdkloc)
logger.info('ndkloc = %s' % ndkloc)
# sdkloc and ndkloc already set by the user and fdroidmode:
# nothing to do.
if (sdkloc is not None) and (ndkloc is not None) and (fdroidmode is not None):
sys.exit(0)
# cache dir (using the same as in fdroidserver/buildserver)
cachedir = os.path.join(os.getenv('HOME'), '.cache', 'fdroidserver')
logger.info('cachedir name is: %s', cachedir)
if not os.path.exists(cachedir):
os.makedirs(cachedir, 0o755)
logger.info('created cachedir %s', cachedir)
# sdkdir location
sdkdir = os.path.join(os.getenv('HOME'), '.cache', 'sdk-for-p4a')
logger.info('sdkdir name is: %s', sdkdir)
if not os.path.exists(sdkdir):
os.makedirs(sdkdir, 0o755)
logger.debug('created sdkdir %s', sdkdir)
update_cache(cachedir, cachefiles)
build_sdk(sdkdir, cachedir, cachefiles)
else:
logger.info('sdkdir %s already exists', sdkdir)

View file

@ -1,4 +1,4 @@
#!/usr/bin/env python3
#!/usr/bin/env python2.7
# ---------------------------------------------------------------------------
#
# PySol -- a Python Solitaire game
@ -23,7 +23,6 @@
# Starter for kivy/android using buildozer: Needs an explizitly
# named main.py as startpoint.
import os
import sys
if '--kivy' not in sys.argv:
sys.argv.append('--kivy')
@ -35,6 +34,4 @@ init()
if runmain:
from pysollib.main import main
os.environ['KIVY_NO_CONSOLELOG'] = "No"
sys.exit(main(sys.argv))

46
android/mkcards Executable file
View file

@ -0,0 +1,46 @@
#!/bin/bash
echo '### prepare cardsets'
if [ ! -f ./PySolFC-Cardsets-2.0.tar.bz2 ]
then
echo '### downloading cardets'
# wget http://downloads.sourceforge.net/pysolfc/PySolFC-Cardsets-2.0.tar.bz2
wget https://netix.dl.sourceforge.net/project/pysolfc/PySolFC-Cardsets/PySolFC-Cardsets-2.0/PySolFC-Cardsets-2.0.tar.bz2
fi
if [ -f ./PySolFC-Cardsets-2.0.tar.bz2 ]
then
if [ ! -d ./PySolFC-Cardsets-2.0 ]
then
echo '### extracting selected cardets'
tar -xjvf PySolFC-Cardsets-2.0.tar.bz2 \
PySolFC-Cardsets-2.0/cardset-crystal-mahjongg \
PySolFC-Cardsets-2.0/cardset-dashavatara-ganjifa \
PySolFC-Cardsets-2.0/cardset-dondorf \
PySolFC-Cardsets-2.0/cardset-hexadeck \
PySolFC-Cardsets-2.0/cardset-kintengu \
PySolFC-Cardsets-2.0/cardset-matrix \
PySolFC-Cardsets-2.0/cardset-mughal-ganjifa \
PySolFC-Cardsets-2.0/cardset-oxymoron \
PySolFC-Cardsets-2.0/cardset-standard \
PySolFC-Cardsets-2.0/cardset-vienna-2k \
PySolFC-Cardsets-2.0/cardset-greywyvern
fi
if [ -d ./PySolFC-Cardsets-2.0 ]
then
echo '### processing cardets'
cd PySolFC-Cardsets-2.0
../../scripts/cardsetsgiftobmp
for i in cardset-*-bmp
do
rm -rf `basename $i -bmp`
done
cd ..
fi
else
echo '### error downloading cardsets'
fi
echo '### end cardsets'

17
android/mkkeystore Executable file
View file

@ -0,0 +1,17 @@
#!/bin/bash
# memo:
# keytool -genkey -v -keystore my-release-keystore -alias alias_name -keyalg RSA -keysize 2048 -validity 12000
if [ ! -d bin ]
then
echo "mkdir bin"
mkdir bin
fi
if [ -f ./bin/keystore ]
then
echo "keystore is already defined"
else
keytool -genkey -v -keystore ./bin/keystore -alias python -keyalg RSA -keysize 2048 -validity 12000
fi

8
android/mkp4a.clean Executable file
View file

@ -0,0 +1,8 @@
#!/bin/bash
rm -rf tmp
python3 -m pythonforandroid.toolchain clean_dists
python3 -m pythonforandroid.toolchain clean_builds
rm -f *.apk
rm -rf PySolFC-Cardsets-2.0

12
android/mkp4a.cleanall Executable file
View file

@ -0,0 +1,12 @@
#!/bin/bash
rm -rf tmp
rm -f *.apk
rm -f *.bz2
rm -f *.zip
rm -rf PySolFC-Cardsets-2.0
rm -rf ~/.local/share/python-for-android/packages
rm -rf ~/.local/share/python-for-android/build
rm -rf ~/.local/share/python-for-android/dists
python3 -m pip uninstall python-for-android -y
exit 0

32
android/mkp4a.debug Executable file
View file

@ -0,0 +1,32 @@
#!/bin/bash
package='org.lufebe16.pysolfc'
version=`./version.py`
name='PySolFC'
tmpdir=${HOME}/.cache/tmp-for-p4a/pysolfc/src
if [ "$1" ]
then
package=${package}.dbg
name=${name}dbg
fi
python3 -m pythonforandroid.toolchain apk \
--sdk-dir ${HOME}/.cache/sdk-for-p4a \
--ndk-dir ${HOME}/.cache/sdk-for-p4a/ndk-bundle \
--android-api 19 \
--ndk-version r12b \
--arch armeabi-v7a \
--dist-name pysolfc \
--name ${name} \
--bootstrap=sdl2 \
--requirements kivy,hostpython2,random2 \
--minsdk 14 \
--private ${tmpdir} \
--package ${package} \
--version ${version} \
--orientation sensor \
--color=always \
--icon ${tmpdir}/data/images/misc/pysol01.png \
--presplash ${tmpdir}/data/images/misc/pysol06.png \
--copy-libs

56
android/mkp4a.init Executable file
View file

@ -0,0 +1,56 @@
#!/bin/bash
echo '### prepare sdk'
./initsdk.py $1 $2 $3
echo '### install p4a'
p4adir=${HOME}/.cache/tmp-for-p4a
mkdir -p ${p4adir}
p4aversion='0.5.3'
if [ ! -f ${p4adir}/${p4aversion}.zip ]
then
wget "https://github.com/kivy/python-for-android/archive/${p4aversion}.zip"
cp -a ./${p4aversion}.zip ${p4adir}/${p4aversion}.zip
rm -f ./${p4aversion}.zip
fi
if [ -f ${p4adir}/${p4aversion}.zip ]
then
python3 -m pip install -q --user "${p4adir}/${p4aversion}.zip"
else
echo "### download of ${p4aversion}.zip failed"
fi
echo '### prepare source'
srcdir=${HOME}/.cache/tmp-for-p4a/pysolfc/src
mkdir -p ${srcdir}
rm -rf ${srcdir}
cp -a .. ${srcdir}
rm -rf ${srcdir}/android
rm -rf ${srcdir}/src
cp -a main.py ${srcdir}/main.py
mkdir -p ${srcdir}/data/images/cards/bottoms/trumps-only
echo "" > ${srcdir}/data/images/cards/bottoms/trumps-only/.keep
echo '### prepare cardsets'
cardsdir=${HOME}/.cache/tmp-for-p4a/pysolfc
if [ ! -d ${cardsdir}/PySolFC-Cardsets-2.0 ]
then
./mkcards
mv PySolFC-Cardsets-2.0 ${cardsdir}/
rm -f PySolFC-Cardsets-2.0.tar.bz2
fi
if [ -d ${cardsdir}/PySolFC-Cardsets-2.0 ]
then
echo '### copying cardsets'
cp -a ${cardsdir}/PySolFC-Cardsets-2.0/* ${srcdir}/data
fi
echo '### end init'

64
android/mkp4a.release Executable file
View file

@ -0,0 +1,64 @@
#!/bin/bash
pass1=""
pass2=""
keyalias="python"
keystore="${PWD}/bin/keystore"
if [ $1 ]
then
pass1=$1
pass2=$1
else
echo "usage: ./mkp4a.release <keystore-password> [<keyalias-password>] [<keyalias>] [<keystore-path>]"
echo " (use ./mkkeystore to create one in default location)"
exit
fi
if [ $2 ]
then
pass2=$2
fi
if [ $3 ]
then
keyalias=$3
fi
if [ $4 ]
then
keystore=$4
fi
export P4A_RELEASE_KEYSTORE="$keystore"
export P4A_RELEASE_KEYSTORE_PASSWD="$pass1"
export P4A_RELEASE_KEYALIAS_PASSWD="$pass2"
export P4A_RELEASE_KEYALIAS="$keyalias"
version=`./version.py`
tmpdir=${HOME}/.cache/tmp-for-p4a/pysolfc/src
python3 -m pythonforandroid.toolchain apk \
--sdk-dir ${HOME}/.cache/sdk-for-p4a \
--ndk-dir ${HOME}/.cache/sdk-for-p4a/ndk-bundle \
--android-api 19 \
--ndk-version r12b \
--arch armeabi-v7a \
--dist-name pysolfc \
--name PySolFC \
--bootstrap=sdl2 \
--requirements kivy,hostpython2,random2 \
--release \
--sign \
--minsdk 14 \
--private ${tmpdir} \
--package org.lufebe16.pysolfc \
--version ${version} \
--orientation sensor \
--color=always \
--icon ${tmpdir}/data/images/misc/pysol01.png \
--presplash ${tmpdir}/data/images/misc/pysol06.png \
--copy-libs
# keystore options (instead environment vars):
#
# keystore: --keystore <file>
# key alias --signkey <keyalias>
# keystore passwd --keystorepw <pass1>
# key passwd --signkeypw <pass2>

57
android/mkp4a.unsigned Executable file
View file

@ -0,0 +1,57 @@
#!/bin/bash
echo '### p4a started'
# sdk-dir and nkd-dir from command line (fdroid mode)
sdkdir="${HOME}/.cache/sdk-for-p4a"
ndkdir="${HOME}/.cache/sdk-for-p4a/ndk-bundle"
if [ $1 ]
then
echo "set sdk to: $1"
sdkdir="$1"
fi
if [ $2 ]
then
echo "set ndk to: $2"
ndkdir="$2"
fi
echo '### run toolchain'
version=`./version.py`
tmpdir=${HOME}/.cache/tmp-for-p4a/pysolfc/src
python3 -m pythonforandroid.toolchain apk \
--sdk-dir ${sdkdir} \
--ndk-dir ${ndkdir} \
--android-api 19 \
--ndk-version r12b \
--arch armeabi-v7a \
--dist-name pysolfc \
--name PySolFC \
--bootstrap=sdl2 \
--requirements kivy,hostpython2,random2 \
--release \
--minsdk 14 \
--private ${tmpdir} \
--package org.lufebe16.pysolfc \
--version ${version} \
--orientation sensor \
--color=always \
--icon ${tmpdir}/data/images/misc/pysol01.png \
--presplash ${tmpdir}/data/images/misc/pysol06.png \
--copy-libs
# python3 -m pythonforandroid.toolchain apk
# ...
# --release #1
# --sign #2
# ...
#
# ad 1,2:
# ohne: -> debug version
# 1: -> release unsigned
# 1 und 2: -> release version.
echo '### p4a finished'

33
android/version.py Executable file
View file

@ -0,0 +1,33 @@
#!/usr/bin/env python3
# ---------------------------------------------------------------------------
#
# PySol -- a Python Solitaire game
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; see the file COPYING.
# If not, write to the Free Software Foundation, Inc.,
# 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#
# ---------------------------------------------------------------------------
# import pychecker.checker
# Starter for kivy/android using buildozer: Needs an explizitly
# named main.py as startpoint.
if True:
import sys
sys.path.insert(0, '..')
if True:
from pysollib.settings import VERSION
print(VERSION)

View file

@ -1,306 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- Copyright 2022 Stephan Sokolow -->
<!-- Copyright 2021-2022 Joe R. (@joeraz) -->
<!-- Copyright 2017-2021 Shlomi Fish -->
<component type="desktop-application">
<id>io.sourceforge.pysolfc.PySolFC</id>
<metadata_license>FSFAP</metadata_license>
<project_license>GPL-3.0-or-later</project_license>
<name>PySolFC</name>
<summary>Solitaire game compilation</summary>
<description>
<p>A collection of more than 1200 Solitaire games, using various deck types
including international standard, hex-a-deck, mahjongg, and hanafuda.</p>
</description>
<launchable type="desktop-id">pysol.desktop</launchable>
<categories>
<category>Game</category>
<category>CardGame</category>
</categories>
<keywords>
<keyword>cards</keyword>
<keyword>klondike</keyword>
<keyword>patience</keyword>
<!-- "pysolfc" omitted because it's also the title.
Possibly remove from .desktop file Keywords field. -->
<keyword>solitaire</keyword>
</keywords>
<screenshots>
<screenshot type="default">
<image>https://pysolfc.sourceforge.io/img/PySolFC_2.18_1.png</image>
<caption>Klondike with default theme</caption>
</screenshot>
<screenshot>
<image>https://pysolfc.sourceforge.io/img/PySolFC_2.18_2.png</image>
<caption>Clock, Neo cards, Fractal Blue table, custom backs</caption>
</screenshot>
<screenshot>
<image>https://pysolfc.sourceforge.io/img/PySolFC_2.18_3.png</image>
<caption>Bits n Bytes, Neo Hex cards, Felt Green table, custom backs</caption>
</screenshot>
<screenshot>
<image>https://pysolfc.sourceforge.io/img/PySolFC_2.18_4.png</image>
<caption>Firecracker, Louie Mantia Hanafuda cards, Mountains table</caption>
</screenshot>
<screenshot>
<image>https://pysolfc.sourceforge.io/img/PySolFC_2.18_5.png</image>
<caption>Mahjongg Taipei, Uni Mahjongg Tiles, Wood table</caption>
</screenshot>
<screenshot>
<image>https://pysolfc.sourceforge.io/img/PySolFC_2.18_6.png</image>
<caption>Shisen-Sho 24x12, KMahjongg tileset, Nostalgy table</caption>
</screenshot>
</screenshots>
<content_rating type="oars-1.1"/>
<url type="homepage">https://pysolfc.sourceforge.io/</url>
<url type="bugtracker">https://github.com/shlomif/PySolFC/issues</url>
<url type="help">https://pysolfc.sourceforge.io/doc/index.html</url>
<url type="vcs-browser">https://github.com/shlomif/PySolFC</url>
<url type="contribute">https://github.com/shlomif/PySolFC/blob/master/CONTRIBUTING.md</url>
<provides>
<binary>pysol.py</binary>
<python3>pysollib</python3>
<python3>pysol_cards</python3>
</provides>
<requires>
<!-- Meaning: Requires one of pointing, tablet, or touch -->
<control>pointing</control>
<control>tablet</control>
<control>touch</control>
</requires>
<requires>
<!-- Meaning: Will never use Internet access even if offered -->
<internet>offline-only</internet>
</requires>
<supports>
<control>keyboard</control>
</supports>
<releases>
<release version="2.18.0" date="2022-09-09">
<description>
<ul>
<li>Advanced search feature - the ability to search for games, cardsets, or table tiles based on many different criteria.</li>
<li>Complete documentation containing rules for all 1,100+ games.</li>
<li>Revamped status bar, displaying more info.</li>
<li>The Find Card feature now supports all types of games.</li>
<li>Many new display and assist options.</li>
<li>Bugfixes, code cleanup, etc.</li>
</ul>
</description>
</release>
<release version="2.16.0" date="2022-05-10">
<description>
<p>Anyone upgrading from a version prior to 2.15.0 should read the notes for that version before upgrading. New in this release:</p>
<ul>
<li>Enhancements to many images and graphical displays.</li>
<li>More game rules in the documentation.</li>
<li>Bugfixes, cleanup, and other enhancements.</li>
</ul>
</description>
</release>
<release version="2.15.0" date="2022-03-12" type="development">
<description>
<p>
This is a pretty sizable release, so this beta version is being
offered before a stable 2.16 in the next month or two. Any feedback
and bug reports are greatly appreciated. The full list of changes for
this release is quite long, but here are the highlights:
</p>
<ul>
<li>
There is a new Cardsets release - PySolFC-Cardsets v.2.1 (required
to run 2.15).
</li>
<li>
35 new games, plus enhancements and fixes to many existing games.
</li>
<li>
New high resolution default display. This new display uses high
resolution cardsets and scaling to make the games look impressive
on larger monitors, but will still scale for smaller displays
too.
</li>
<li>
Note that the new high-resolution options will not override your
currently selected options for existing users. If you want to use
the new settings, you can delete or rename your options.cfg file.
</li>
<li>
New feature to search for games, cardsets, and table tiles by
name.
</li>
<li>Many new display options.</li>
<li>Many missing game rules added to the documentation.</li>
<li>Bugfixes and cleanup.</li>
<li>And more.</li>
</ul>
</description>
</release>
<release version="2.14.1" date="2021-12-10">
<p>
This release fixes a number of bugs, including one that causes crashes
for some users when opening the select game/cardset/table tile window.
</p>
</release>
<release version="2.14.0" date="2021-09-19">
<description>
<ul>
<li>16 new games</li>
<li>
Support for Python 3.10 (Minimum requirement is still Python 2.7)
</li>
<li>A new macOS package.</li>
<li>
Enhancements to the tree select dialogs for selecting games,
cardsets, and table tiles.
</li>
<li>Further additions/improvements to the documentation.</li>
<li>Many bugfixes and cleanups.</li>
</ul>
</description>
</release>
<release version="2.12.0" date="2021-07-11">
<description>
<ul>
<li>40 new games!</li>
<li>
Support for using higher resolution cardsets. The high resolution
"Neo" cardset has been added to the Windows Installer package and
is available in a preview release of PySolFC-Cardsets 2.1
</li>
<li>Improved organization and categorization of the games list.</li>
<li>
New display options - added option to center the game layout in
the window.
</li>
<li>
New audio options - can now disable music without disabling sound
effects.
</li>
<li>
Improved documentation - added rules to a large number of games
that were missing them.
</li>
<li>Bugfixes and cleanup.</li>
</ul>
</description>
</release>
<release version="2.10.0" date="2020-06-22">
<description>
<ul>
<li>Fix moving cards in the Scorpion Tail game.</li>
<li>One can optionally load the Freecell Solver and the Black Hole
Solver using their DLLs (for better speed).</li>
<li>Test Windows Version in the installer</li>
<li>Pause when showing statistics</li>
<li>Some cleanups and refactoring.</li>
</ul>
</description>
</release>
<release version="2.8.0" date="2020-03-05">
<description>
<ul>
<li>A new logo thanks to @ghostofiht.</li>
<li>Fix for freezes (pygame upgrade)</li>
<li>Fixed Three Peaks scoring</li>
<li>Compatibility with Pillow 6.x</li>
<li>Restore the "Save games geometry" feature</li>
<li>Added a NEWS.asciidoc file.</li>
<li>Better kivy/Android support</li>
<li>Using ttk and configobj as shipped in the python dist (instead of
forked versions)</li>
<li>Requiring <code>attrs</code> and <code>pysol-cards</code> from
PyPI</li>
<li>Added tests, bug fixes and refactorings.</li>
<li>Add the -g and --deal command line options.</li>
</ul>
</description>
</release>
<release version="2.6.2" date="2019-03-04">
<description>
<ul>
<li>Fixes for the Windows and macOS packages.</li>
<li>Forbid illegal moves in Spider and some other variants.</li>
</ul>
</description>
</release>
<release version="2.6.0" date="2019-02-14">
<description>
<ul>
<li>Support for solving Golf using a solver</li>
<li>An untested macOS package (we need testers)</li>
<li>A bug fix</li>
<li>Ability to run the test suite without python 2.x and/or
pygtk</li>
<li>Code cleanups.</li>
</ul>
</description>
</release>
<release version="2.4.0" date="2018-06-23">
<description>
<ul>
<li>The Windows installer now includes the revitalised PySol-music
package. For more info, see shlomif/PySolFC#82.</li>
<li>Many improvements to the test suite and the board import
functionality.</li>
<li>Some bug fixes.</li>
</ul>
</description>
</release>
<release version="2.2.0" date="2018-04-16">
<description>
<ul>
<li>The Microsoft Windows binary installer now contains and supports
the solver for Freecell and other games.</li>
<li>Many bug fixes.</li>
</ul>
</description>
</release>
<release version="2.1.4" date="2018-03-31" type="development">
<description>
<ul>
<li>We now provide a Microsoft Windows binary installer again, thanks
to the great work of Roderik Ploszek. Note that the solvers (for
FreeCell/etc.) are not installed as part of it yet, but they are
available separately.</li>
<li><code>pysol-sound-server</code> was updated to support Python
3.x.</li>
<li>Fixes for the board export / solver input, and for redealing upon
restart of the "ms*" deals.</li>
<li>Various cleanups.</li>
</ul>
</description>
</release>
<release version="2.1.3" date="2018-03-05" type="development">
<description>
<ul>
<li>Support for the kivy toolkit for running under Android-based
devices (currently python 2.7-only)</li>
<li>Fixed the help system and removed the need for the sgmllib
module.</li>
<li>Other fixes and cleanups.</li>
<li>Currently there is no Microsoft Windows binary package. Help or
insights will be appreciated.</li>
</ul>
</description>
</release>
<release version="2.1.0" date="2017-11-19" type="development">
<description>
<ul>
<li>The code is now compatible with both Python 2.7.x and Python
3.x</li>
<li>One can deal all MS FreeCell/FC-pro deals by specifying e.g:
"ms100000" as the seed.</li>
<li>Support for Black Hole and All in a Row solver was added.</li>
<li>Test suite and CI were added to the repository.</li>
<li>The code now passes flake8 validation.</li>
<li>Some improvements to the solver dialog.</li>
</ul>
</description>
</release>
<release version="2.0" date="2009-12-04"/>
<release version="1.1" date="2007-09-06"/>
<release version="1.0" date="2007-02-21"/>
</releases>
<translation type="gettext">pysol</translation>
</component>

View file

@ -1,19 +0,0 @@
#!/bin/bash
appdir=""
if [ "$1" ]
then
appdir=$1
else
exit 1
fi
# current android version mumber.
version="3.2.0"
sversion=$(echo $version | sed -E "s:(.*)\..*:\1:")
tuple=$(echo $version | sed -E "s:(.*)\.(.*)\.(.*):(\1, \2, \3):")
# patch different version info accordingly.
sed -E "s:VERSION_TUPLE =.*:VERSION_TUPLE = $tuple:" -i $appdir/pysollib/settings.py
sed -E "s:(.*\(')dev(',.*):\1fc-$sversion\2:" -i $appdir/pysollib/gamedb.py
echo "VERSION = $version"

View file

@ -1,89 +0,0 @@
MEMO:
-----
This is a memo on how to proceed to get an android
app out of the repo.
You should have python and virtualenv installed on
your system. You might need to add missing
packages to your system with your os package manager
and through pip.
Prepare
-------
Move to directory buildozer.
First create and enter a virtualenv and load the
required python modules using pip install.
$> virtualenv --system-site-packages ENV
$> . ENV/bin/activate
$> pip install -r pipreq.txt
Then prepare the source package. The script
assembles all necessary files in the
subdirectory ./tmp/. It also includes a minimal
set of cards.
$> ./buildozer.init
Up to this point it should work fine.
Make a debug version
--------------------
Run the buildozer command. Its work is
defined in the file buildozer.spec. Only
minimal changes have been made to the default
setup, to reflect the local situation.
Execution of buildozer needs some time. You
will have to accept a lizense from google.
$> ./buildozer.run
Finally if all worked fine, the apk file is found in
directory ./bin/.
If it fails, set the log_level in buildozer.spec to 2
to get better information on what to do.
Make a release Version:
-----------------------
$> ./buildozer.run release
Without signing information the result apk is a
'release-unsigned' that can be signed afterwards
with jarsigner.
Alternatively signing information could be supplied
through Environment vars. See buildozer and
python-for-android documentatin for further
instructions.
test notes:
----------
1) on a debian testing desktop developer installation
zip archiver was missing. apt install zip solved
that.
2) on a gentoo linux recipe pyjnius didnt find
javac, the java compiler. Added a link to it
in ENV/bin.
3) built apks worked on android 7 and android 8.
(no newer devices had been available)
4) on fdroid, that provided a light weight build server
with debian bullseye the following additional packages had
to be installed (apt-get):
- ant autoconf build-essential ccache gettext imagemagick
- libffi-dev libltdl-dev libssl-dev libtool python3-tk
- virtualenv wget zlib1g-dev

View file

@ -1,39 +0,0 @@
#!/bin/bash
set -eux
tmpdir=./tmp
# NOTE: $1 will be set with fdroid builds only.
echo '### prepare source'
(cd .. && make rules && make all_games_html && make mo)
mkdir -p ${tmpdir}
rm -rf ${tmpdir}/*
cp -a ../data ${tmpdir}
cp -a ../docs ${tmpdir}
cp -a ../html-src ${tmpdir}
cp -a ../locale ${tmpdir}
cp -a ../po ${tmpdir}
cp -a ../pysollib ${tmpdir}
cp -a ../scripts ${tmpdir}
cp -a ../pysol.py ${tmpdir}
cp -a main.py ${tmpdir}
mkdir -p ${tmpdir}/data/images/cards/bottoms/trumps-only
echo "" > ${tmpdir}/data/images/cards/bottoms/trumps-only/.keep
echo '### prepare cardsets'
./mkcards
./resize4k ${tmpdir}/data/tiles
cp -a cardsets/* ${tmpdir}/data
echo '### eval version'
./aversion ${tmpdir} > ${tmpdir}/version.txt
echo '### end init'

View file

@ -1,27 +0,0 @@
#!/bin/bash
#set -eux
echo '### prepare jvm heap for gradle'
export GRADLE_OPTS="-Xms1724m -Xmx5048m -Dorg.gradle.jvmargs='-Xms1724m -Xmx5048m'"
echo '### run buildozer'
if [ "$1" == "test" ]
then
echo '### ... release.test'
buildozer --profile test android release
exit 0
fi
if [ "$1" ]
then
echo '### ... release'
buildozer android release
else
echo '### ... debug'
buildozer android debug
fi
echo '### end run'

View file

@ -1,447 +0,0 @@
[app]
# (str) Title of your application
title = PySolFC
# (str) Package name
package.name = pysolfc
# (str) Package domain (needed for android/ios packaging)
package.domain = org.lufebe16
# (str) Source code where the main.py live
source.dir = ./tmp
# (list) Source files to include (let empty to include all the files)
#source.include_exts = py,png,jpg,kv,atlas
# (list) List of inclusions using pattern matching
#source.include_patterns = assets/*,images/*.png
# (list) Source files to exclude (let empty to not exclude anything)
#source.exclude_exts = spec
source.exclude_exts = spec,gif
# (list) List of directory to exclude (let empty to not exclude anything)
#source.exclude_dirs = tests, bin, venv
# (list) List of exclusions using pattern matching
# Do not prefix with './'
#source.exclude_patterns = license,images/*/*.jpg
# (str) Application versioning (method 1)
# version = 0.1
# (str) Application versioning (method 2)
version.regex = VERSION = (.*)
version.filename = %(source.dir)s/version.txt
# (list) Application requirements
# comma separated e.g. requirements = sqlite3,kivy
requirements = python3,kivy,pysol-cards,configobj,attrs
# (str) Custom source folders for requirements
# Sets custom source for any requirements with recipes
# requirements.source.kivy = ../../kivy
# (str) Presplash of the application
#presplash.filename = %(source.dir)s/data/presplash.png
presplash.filename = %(source.dir)s/data/images/logo-with-margin-1024.png
# (str) Icon of the application
#icon.filename = %(source.dir)s/data/icon.png
icon.filename = %(source.dir)s/data/images/icons/48x48/pysol.png
# (str) Supported orientation (one of landscape, sensorLandscape, portrait or all)
orientation = portrait, landscape
# (list) List of service to declare
#services = NAME:ENTRYPOINT_TO_PY,NAME2:ENTRYPOINT2_TO_PY
#
# OSX Specific
#
#
# author = © Copyright Info
# change the major version of python used by the app
osx.python_version = 3
# Kivy version to use
osx.kivy_version = 1.9.1
#
# Android specific
#
# (bool) Indicate if the application should be fullscreen or not
fullscreen = 0
# (string) Presplash background color (for android toolchain)
# Supported formats are: #RRGGBB #AARRGGBB or one of the following names:
# red, blue, green, black, white, gray, cyan, magenta, yellow, lightgray,
# darkgray, grey, lightgrey, darkgrey, aqua, fuchsia, lime, maroon, navy,
# olive, purple, silver, teal.
android.presplash_color = #101010
# (string) Presplash animation using Lottie format.
# see https://lottiefiles.com/ for examples and https://airbnb.design/lottie/
# for general documentation.
# Lottie files can be created using various tools, like Adobe After Effect or Synfig.
#android.presplash_lottie = "path/to/lottie/file.json"
# (str) Adaptive icon of the application (used if Android API level is 26+ at runtime)
#icon.adaptive_foreground.filename = %(source.dir)s/data/icon_fg.png
#icon.adaptive_background.filename = %(source.dir)s/data/icon_bg.png
# (list) Permissions
#android.permissions = INTERNET
android.permissions = WRITE_EXTERNAL_STORAGE, MANAGE_EXTERNAL_STORAGE
# (list) features (adds uses-feature -tags to manifest)
#android.features = android.hardware.usb.host
# (int) Target Android API, should be as high as possible.
android.api = 34
# (int) Minimum API your APK / AAB will support.
#android.minapi = 21
# (int) Android SDK version to use
#android.sdk = 20
# (str) Android NDK version to use
#android.ndk = 23b
# (int) Android NDK API to use. This is the minimum API your app will support, it should usually match android.minapi.
#android.ndk_api = 21
# (bool) Use --private data storage (True) or --dir public storage (False)
#android.private_storage = True
# (str) Android NDK directory (if empty, it will be automatically downloaded.)
#android.ndk_path =
# (str) Android SDK directory (if empty, it will be automatically downloaded.)
#android.sdk_path =
# (str) ANT directory (if empty, it will be automatically downloaded.)
#android.ant_path =
# (bool) If True, then skip trying to update the Android sdk
# This can be useful to avoid excess Internet downloads or save time
# when an update is due and you just want to test/build your package
# android.skip_update = False
# (bool) If True, then automatically accept SDK license
# agreements. This is intended for automation only. If set to False,
# the default, you will be shown the license when first running
# buildozer.
# android.accept_sdk_license = False
# (str) Android entry point, default is ok for Kivy-based app
#android.entrypoint = org.kivy.android.PythonActivity
# (str) Full name including package path of the Java class that implements Android Activity
# use that parameter together with android.entrypoint to set custom Java class instead of PythonActivity
#android.activity_class_name = org.kivy.android.PythonActivity
# (str) Extra xml to write directly inside the <manifest> element of AndroidManifest.xml
# use that parameter to provide a filename from where to load your custom XML code
#android.extra_manifest_xml = ./src/android/extra_manifest.xml
# (str) Extra xml to write directly inside the <manifest><application> tag of AndroidManifest.xml
# use that parameter to provide a filename from where to load your custom XML arguments:
android.extra_manifest_application_arguments = ./src/manifest/extra_attributes.xml
# (str) Full name including package path of the Java class that implements Python Service
# use that parameter to set custom Java class instead of PythonService
#android.service_class_name = org.kivy.android.PythonService
# (str) Android app theme, default is ok for Kivy-based app
# android.apptheme = "@android:style/Theme.NoTitleBar"
# (list) Pattern to whitelist for the whole project
#android.whitelist =
# (str) Path to a custom whitelist file
#android.whitelist_src =
# (str) Path to a custom blacklist file
#android.blacklist_src =
# (list) List of Java .jar files to add to the libs so that pyjnius can access
# their classes. Don't add jars that you do not need, since extra jars can slow
# down the build process. Allows wildcards matching, for example:
# OUYA-ODK/libs/*.jar
#android.add_jars = foo.jar,bar.jar,path/to/more/*.jar
# (list) List of Java files to add to the android project (can be java or a
# directory containing the files)
#android.add_src =
# (list) Android AAR archives to add
#android.add_aars =
# (list) Put these files or directories in the apk assets directory.
# Either form may be used, and assets need not be in 'source.include_exts'.
# 1) android.add_assets = source_asset_relative_path
# 2) android.add_assets = source_asset_path:destination_asset_relative_path
#android.add_assets =
# (list) Gradle dependencies to add
#android.gradle_dependencies =
android.gradle_dependencies =
androidx.appcompat:appcompat:1.4.2
# (bool) Enable AndroidX support. Enable when 'android.gradle_dependencies'
# contains an 'androidx' package, or any package from Kotlin source.
# android.enable_androidx requires android.api >= 28
#android.enable_androidx = False
android.enable_androidx = True
# (list) add java compile options
# this can for example be necessary when importing certain java libraries using the 'android.gradle_dependencies' option
# see https://developer.android.com/studio/write/java8-support for further information
# android.add_compile_options = "sourceCompatibility = 1.8", "targetCompatibility = 1.8"
# (list) Gradle repositories to add {can be necessary for some android.gradle_dependencies}
# please enclose in double quotes
# e.g. android.gradle_repositories = "maven { url 'https://kotlin.bintray.com/ktor' }"
#android.add_gradle_repositories =
# (list) packaging options to add
# see https://google.github.io/android-gradle-dsl/current/com.android.build.gradle.internal.dsl.PackagingOptions.html
# can be necessary to solve conflicts in gradle_dependencies
# please enclose in double quotes
# e.g. android.add_packaging_options = "exclude 'META-INF/common.kotlin_module'", "exclude 'META-INF/*.kotlin_module'"
#android.add_packaging_options =
# (list) Java classes to add as activities to the manifest.
#android.add_activities = com.example.ExampleActivity
# (str) OUYA Console category. Should be one of GAME or APP
# If you leave this blank, OUYA support will not be enabled
#android.ouya.category = GAME
# (str) Filename of OUYA Console icon. It must be a 732x412 png image.
#android.ouya.icon.filename = %(source.dir)s/data/ouya_icon.png
# (str) XML file to include as an intent filters in <activity> tag
#android.manifest.intent_filters =
# (str) launchMode to set for the main activity
#android.manifest.launch_mode = standard
# (list) Android additional libraries to copy into libs/armeabi
#android.add_libs_armeabi = libs/android/*.so
#android.add_libs_armeabi_v7a = libs/android-v7/*.so
#android.add_libs_arm64_v8a = libs/android-v8/*.so
#android.add_libs_x86 = libs/android-x86/*.so
#android.add_libs_mips = libs/android-mips/*.so
# (bool) Indicate whether the screen should stay on
# Don't forget to add the WAKE_LOCK permission if you set this to True
#android.wakelock = False
# (list) Android application meta-data to set (key=value format)
#android.meta_data =
# (list) Android library project to add (will be added in the
# project.properties automatically.)
#android.library_references =
# (list) Android shared libraries which will be added to AndroidManifest.xml using <uses-library> tag
#android.uses_library =
# (str) Android logcat filters to use
#android.logcat_filters = *:S python:D
# (bool) Android logcat only display log for activity's pid
#android.logcat_pid_only = False
# (str) Android additional adb arguments
#android.adb_args = -H host.docker.internal
# (bool) Copy library instead of making a libpymodules.so
#android.copy_libs = 1
# (list) The Android archs to build for, choices: armeabi-v7a, arm64-v8a, x86, x86_64
# In past, was `android.arch` as we weren't supporting builds for multiple archs at the same time.
android.archs = arm64-v8a, armeabi-v7a
#android.archs = x86
#android.archs = x86_64
#android.archs = armeabi-v7a
# (int) overrides automatic versionCode computation (used in build.gradle)
# this is not the same as app version and should only be edited if you know what you're doing
# android.numeric_version = 1
# (bool) enables Android auto backup feature (Android API >=23)
android.allow_backup = True
# (str) XML file for custom backup rules (see official auto backup documentation)
# android.backup_rules =
# (str) If you need to insert variables into your AndroidManifest.xml file,
# you can do so with the manifestPlaceholders property.
# This property takes a map of key-value pairs. (via a string)
# Usage example : android.manifest_placeholders = [myCustomUrl:\"org.kivy.customurl\"]
# android.manifest_placeholders = [:]
# (bool) disables the compilation of py to pyc/pyo files when packaging
# android.no-compile-pyo = True
# (str) The format used to package the app for release mode (aab or apk or aar).
# android.release_artifact = aab
android.release_artifact = apk
# (str) The format used to package the app for debug mode (apk or aar).
# android.debug_artifact = apk
android.debug_artifact = apk
#
# Python for android (p4a) specific
#
# (str) python-for-android URL to use for checkout
#p4a.url =
# (str) python-for-android fork to use in case if p4a.url is not specified, defaults to upstream (kivy)
#p4a.fork = kivy
# (str) python-for-android branch to use, defaults to master
#p4a.branch = master
# (str) python-for-android specific commit to use, defaults to HEAD, must be within p4a.branch
p4a.commit = v2024.01.21
# (str) python-for-android git clone directory (if empty, it will be automatically cloned from github)
#p4a.source_dir =
#p4a.source_dir = /home/lb/SourcePackages/python-for-android/python-for-android
# (str) The directory in which python-for-android should look for your own build recipes (if any)
#p4a.local_recipes =
# (str) Filename to the hook for p4a
#p4a.hook =
# (str) Bootstrap to use for android builds
# p4a.bootstrap = sdl2
# (int) port number to specify an explicit --port= p4a argument (eg for bootstrap flask)
#p4a.port =
# Control passing the --use-setup-py vs --ignore-setup-py to p4a
# "in the future" --use-setup-py is going to be the default behaviour in p4a, right now it is not
# Setting this to false will pass --ignore-setup-py, true will pass --use-setup-py
# NOTE: this is general setuptools integration, having pyproject.toml is enough, no need to generate
# setup.py if you're using Poetry, but you need to add "toml" to source.include_exts.
#p4a.setup_py = false
# (str) extra command line arguments to pass when invoking pythonforandroid.toolchain
#p4a.extra_args =
#
# iOS specific
#
# (str) Path to a custom kivy-ios folder
#ios.kivy_ios_dir = ../kivy-ios
# Alternately, specify the URL and branch of a git checkout:
ios.kivy_ios_url = https://github.com/kivy/kivy-ios
ios.kivy_ios_branch = master
# Another platform dependency: ios-deploy
# Uncomment to use a custom checkout
#ios.ios_deploy_dir = ../ios_deploy
# Or specify URL and branch
ios.ios_deploy_url = https://github.com/phonegap/ios-deploy
ios.ios_deploy_branch = 1.10.0
# (bool) Whether or not to sign the code
ios.codesign.allowed = false
# (str) Name of the certificate to use for signing the debug version
# Get a list of available identities: buildozer ios list_identities
#ios.codesign.debug = "iPhone Developer: <lastname> <firstname> (<hexstring>)"
# (str) The development team to use for signing the debug version
#ios.codesign.development_team.debug = <hexstring>
# (str) Name of the certificate to use for signing the release version
#ios.codesign.release = %(ios.codesign.debug)s
# (str) The development team to use for signing the release version
#ios.codesign.development_team.release = <hexstring>
# (str) URL pointing to .ipa file to be installed
# This option should be defined along with `display_image_url` and `full_size_image_url` options.
#ios.manifest.app_url =
# (str) URL pointing to an icon (57x57px) to be displayed during download
# This option should be defined along with `app_url` and `full_size_image_url` options.
#ios.manifest.display_image_url =
# (str) URL pointing to a large icon (512x512px) to be used by iTunes
# This option should be defined along with `app_url` and `display_image_url` options.
#ios.manifest.full_size_image_url =
[buildozer]
# (int) Log level (0 = error only, 1 = info, 2 = debug (with command output))
log_level = 2
# (int) Display warning if buildozer is run as root (0 = False, 1 = True)
warn_on_root = 1
# (str) Path to build artifact storage, absolute or relative to spec file
# build_dir = ./.buildozer
# (str) Path to build output (i.e. .apk, .aab, .ipa) storage
# bin_dir = ./bin
# -----------------------------------------------------------------------------
# List as sections
#
# You can define all the "list" as [section:key].
# Each line will be considered as a option to the list.
# Let's take [app] / source.exclude_patterns.
# Instead of doing:
#
#[app]
#source.exclude_patterns = license,data/audio/*.wav,data/images/original/*
#
# This can be translated into:
#
#[app:source.exclude_patterns]
#license
#data/audio/*.wav
#data/images/original/*
#
# -----------------------------------------------------------------------------
# Profiles
#
# You can extend section / key with a profile
# For example, you want to deploy a demo version of your application without
# HD content. You could first change the title to add "(demo)" in the name
# and extend the excluded directories to remove the HD content.
#
#[app@demo]
#title = My Application (demo)
#
#[app:source.exclude_patterns@demo]
#images/hd/*
#
# Then, invoke the command line with the "demo" profile:
#
#buildozer --profile demo android debug
[app@test]
title = PySolFC.test
package.name = pysolfc.test

View file

@ -1,51 +0,0 @@
#!/bin/bash
set -eux
if [[ -z ${AAPI+x} ]]
then
exit 1
fi
python3 -m venv FINIT
source FINIT/bin/activate
pip3 install attrs
pip3 install pysol_cards
tmpdir=..
echo '### prepare source'
(cd .. && make rules && make all_games_html && make mo)
cp -a main.py ${tmpdir}
mkdir -p ${tmpdir}/data/images/cards/bottoms/trumps-only
echo "" > ${tmpdir}/data/images/cards/bottoms/trumps-only/.keep
echo '### prepare cardsets'
./mkcards
cp -a cardsets/* ${tmpdir}/data
echo '### resize 4k images'
./resize4k ${tmpdir}/data/tiles
echo '### eval version'
./aversion ${tmpdir} > ${tmpdir}/version.txt
echo '### prepare buildozer'
sed -r "s:#? ?source\.dir =.*:source.dir = ..:" -i buildozer.spec
sed -r "s:#? ?source\.exclude_dirs =.*:source.exclude_dirs = Screenshots,android,buildozer,contrib,tests,fastlane:" -i buildozer.spec
sed -r "s:#? ?source\.exclude_patterns =.*:source.exclude_patterns = README.*,AUTHORS.md,CONTRIBUTING.md,COPYING,MANIFEST.in,Makefile,NEWS.asciidoc,appdata.xml,pysol.py,run-tests.pl,setup.cfg,setup.py,setup_osx.py,local.properties,p4a_env_vars.txt:" -i buildozer.spec
sed -r "s:#? ?android\.skip_update =.*:android.skip_update = True:" -i buildozer.spec
sed -r "s:#? ?android\.accept_sdk_license =.*:android.accept_sdk_license = False:" -i buildozer.spec
sed -r "s:#? ?log_level =.*:log_level = 2:" -i buildozer.spec
sed -r "s:#? ?warn_on_root =.*:warn_on_root = 0:" -i buildozer.spec
echo '### end init'
deactivate
rm -rf FINIT

View file

@ -1,5 +0,0 @@
#!/bin/sh
# Fake avdmanager. Runs in the context of a python-for-android build.
# (maybe useful in f-droid builds, do not use otherwise)
platforms=$(ls -1 $ANDROIDSDK/platforms
echo $platforms | sed -e "s/android-/\nAPI level: /g"

View file

@ -1,7 +0,0 @@
#!/bin/sh
# produces a fake avdmanager from buildozer settings
# may be useful with fdroid build scripts (outputs a fake avdmanager script)
echo "#!/bin/bash"
cat buildozer.spec | \
grep -e "^android[.]api" | \
sed -e "s/android.api\(.*\)/echo 'API level:\1'/"

View file

@ -1,8 +0,0 @@
#!/bin/sh
VP4A='v2024.01.21'
VBUILDOZER='3ebc09e885457db4747e67a1250c2aea1ca7a046'
VCPYTHON='v3.11.5'
VCYTHON='3.0.10'
AAPI=$(cat buildozer.spec | grep -e "^android[.]api" | sed -E "s/^.*([0-9].).*/\1/")
export AAPI

View file

@ -1,35 +0,0 @@
cardset-2000
cardset-blaren-7x7
cardset-crystal-mahjongg
cardset-dashavatara-ganjifa
cardset-dashavatara-ganjifa-xl
cardset-dojouji-3x3
cardset-dondorf
cardset-eternal-dragon-10x10
cardset-gnome-mahjongg-1
cardset-gpl
cardset-hanafuda-200-years
cardset-hexadeck
cardset-hofamterspiel-9x9
cardset-hokusai-6x6
cardset-knave-of-hearts-4x4
cardset-louie-mantia-hanafuda
cardset-matching
cardset-matching-xl
cardset-matrix
cardset-mid-winter-eve-8x8
cardset-mini-ishido
cardset-mughal-ganjifa
cardset-mughal-ganjifa-xl
cardset-neo
cardset-neo-hex
cardset-neo-tarock
cardset-next-matrix
cardset-oxymoron
cardset-simple-ishido
cardset-standard
cardset-tuxedo
cardset-uni-mahjongg
cardset-victoria-falls-5x5
cardset-vienna-2k
cardset-z-minimal

View file

@ -1,52 +0,0 @@
#!/bin/bash
#set -eux
rm -rf cardsets
if [ 1 ]; then
cardsets_dir=PySolFC-Cardsets
if [ ! -d ${cardsets_dir} ]; then
echo '### downloading cardset repo'
mkdir ${cardsets_dir}
pushd ${cardsets_dir}
mkdir repo
pushd repo
git init
git remote add -t master origin https://github.com/shlomif/PySolFC-Cardsets.git
git fetch --depth 1 origin 3.0
git checkout -q FETCH_HEAD
popd
echo '### choose a minimal set'
for d in $(cat ../minimal.txt)
do
mv repo/${d} .
done
rm repo -rf
echo '### processing cardsets'
../../scripts/cardconv gif png
for i in cardset-*-png; do
rm -rf `basename $i -png`
done
popd
fi
# cp -a ${cardsets_dir} ${cardsets_dir}-orig
ln -s ${cardsets_dir} cardsets
fi
pushd cardsets
echo '### resize big cardsets'
for i in cardset-*; do
../resizecards $i
done
popd
echo '### end cardsets'

View file

@ -1,12 +0,0 @@
attrs==23.2.0
build==1.2.1
-e git+https://github.com/kivy/buildozer.git@3ebc09e885457db4747e67a1250c2aea1ca7a046#egg=buildozer
certifi==2024.2.2
colorama==0.4.6
configobj==5.0.8
Kivy==2.3.0
pip==24.0
pysol_cards==0.16.0
setuptools==69.1.1
toml==0.10.2
wheel==0.42.0

View file

@ -1,20 +0,0 @@
{
"version": 3,
"artifactType": {
"type": "APK",
"kind": "Directory"
},
"applicationId": "org.lufebe16.pysolfc",
"variantName": "release",
"elements": [
{
"type": "SINGLE",
"filters": [],
"attributes": [],
"versionCode": 102130200,
"versionName": "3.2.0",
"outputFile": "pysolfc-release.apk"
}
],
"elementType": "File"
}

View file

@ -1,37 +0,0 @@
#!/usr/bin/bash
location='.'
if [ $1 ]
then
location=$1
fi
pushd $location
dir='save-aspect-4k'
if [ -d $dir ]
then
pushd 'save-aspect-4k'
for f in *.jpg
do
echo $f
convert $f -resize 1920x1920 -quality 65 temp_$f
mv -f temp_$f $f
done
popd
fi
dir='stretch-4k'
if [ -d $dir ]
then
pushd 'stretch-4k'
for f in *.jpg
do
echo $f
convert $f -resize 1920x1920 -quality 65 temp_$f
mv -f temp_$f $f
done
popd
fi
popd

View file

@ -1,119 +0,0 @@
#!/usr/bin/env python3
# -*- mode: python; coding: utf-8; -*-
import sys
import os
import math
carddir = ""
filename = ""
maxw = 100
maxh = 150
# arguments:
# 1: cardset directory
# 2: maximum card width
# 3: maximum card height
if len(sys.argv) < 2:
exit (1)
if len(sys.argv) > 1:
carddir = sys.argv[1]
filename = sys.argv[1]+"/config.txt"
if len(sys.argv) > 2:
maxw = int(sys.argv[2])
if len(sys.argv) > 3:
maxh = int(sys.argv[3])
#print (filename)
#print (carddir)
#print (maxw,"x",maxh)
# 1: read the config file line by line and extract x,y, xoffset, yoffset.
lines_list = None
with open(filename, "rt") as f:
lines_list = f.readlines()
lines_list = [line.strip() for line in lines_list]
if not lines_list[0].startswith("PySol"):
exit (1)
#print (lines_list)
cardw, cardh, cardd = (int(x) for x in lines_list[2].split())
xoffs, yoffs, sxoffs, syoffs = (int(x) for x in lines_list[3].split())
#print (cardw,cardh)
#print (xoffs,yoffs)
# 2: calculate scale factor.
scale = maxw / cardw
scaleh = maxh / cardh
if scaleh < scale:
scale = scaleh
#print (scale)
if scale >= 1.0:
exit (0)
# 3: convert all images to (width)x(height) with imagemagick if needed.
def img_size(f):
stream = os.popen('identify '+f)
info = stream.read().split()
dims = info[2].split('x')
w = int(dims[0])
h = int(dims[1])
return (w,h)
cardw = int(math.floor(cardw*scale))
cardh = int(math.floor(cardh*scale))
xoffs = int(math.ceil(xoffs*scale))
yoffs = int(math.ceil(yoffs*scale))
#print (cardw,cardh)
#print (xoffs,yoffs)
first = True
effw = cardw
effh = cardh
for fn in os.listdir(path=carddir):
file = carddir+'/'+fn
fileo = carddir+'/conv-'+fn
if fn.endswith('.png') and not fn.startswith('shadow'):
cmd = "convert "+file+" -resize "+str(cardw)+"x"+str(cardh)+" "+fileo
cmd2 = "mv -f "+fileo+" "+file
#print (cmd)
os.system(cmd)
os.system(cmd2)
if first:
effw,effh = img_size(file)
#print ('eff-size:',effw,effh)
first = False
if fn.endswith('.png') and fn.startswith('shadow'):
w,h = img_size(file)
if w>h:
w = int(w*scale)
else:
h = int(h*scale)
cmd = "convert "+file+" -resize '"+str(w)+"x"+str(h)+"!' "+fileo
cmd2 = "mv -f "+fileo+" "+file
#print (cmd)
os.system(cmd)
os.system(cmd2)
# 4: rewrite the config file.
print ('rescaled by',scale,':',carddir)
cardw = effw
cardh = effh
lines_list[2] = str(cardw)+" "+str(cardh)+" "+str(cardd)
lines_list[3] = str(xoffs)+" "+str(yoffs)+" "+str(sxoffs)+" "+str(syoffs)
#print (lines_list)
with open(carddir+"/config.txt", "w") as f:
for l in lines_list:
f.write(l+"\n")

View file

@ -1 +0,0 @@
android:requestLegacyExternalStorage="true"

View file

@ -1,8 +0,0 @@
#!/usr/bin/env python3
# ---------------------------------------------------------------------------
import sys
sys.path.insert(0, str(".."))
from pysollib.settings import VERSION # noqa: E402,I202
print("VERSION =", VERSION)

View file

@ -1,207 +0,0 @@
Cardset Customization Tutorial
==============================
:Author: Eric Rausch
:Email: <neelix570@gmail.com>
Setting up a Cardset
--------------------
The easiest way to create a cardset would be to copy an existing cardset folder of the same type in your cardsets directory. All cardsets need a number of files to work.
* An image for each card - these images should be the same format and the same size, as defined in the config.txt file (described below). These files should be named something like 01s.png for the ace of spades. The first two (or more) digits represent the rank, and the letter after represents the suit. The suits are labeled hcds in French decks or decks that use French suits (i.e. Hex A or Tarock decks), and the suits are alphabetical for other decks. The suit letter z is used for jokers or trumps.
* A shade file - shade.png, for example.
* At least one back image, as defined in the config.txt file below.
* A config.txt file, the format described below.
* A copyright file, containing copyright info.
The following optional files may also be added, but are only used under certain circumstances.
* Bottom images. A number of images for the bottoms of stacks. These are not used unless your PySol install does not support generating stack bottoms, or you enable them manually (currently only possible through editing the options.cfg file). Which bottoms are used depend on the cardset type. Each bottom has a version with a suffix of -n, indicating the negative bottom that gets used if the appropriate option is enabled.
* Shadow images. These will only be used if your PySol install does not support auto-generated shadows.
config.txt template
-------------------
....
PySolFC solitaire cardset;$A;$FMT;$B;$C;$D,$E;$F;$G;$H
<internal_name>;<cardset_name>
X Y D
XOFF YOFF SXOFF SYOFF
back01.ext
back01.ext;back02.ext;back03.ext
....
Line 1
------
*$A:* The cardset version number that belongs to the number of fields divided through ";" on the first line (e.g. `.gif;1;78;8,1016` -> `$A=4`)
( *WARNING:* For Mahjongg, $A must always be 6 or 7 and the $F field must be included in the line; however, you can put `0` in `$F` if you wish, in that case. )
( *NOTE:* $D and $E are comma separated and count for one field )
*$FMT:* The format of the images used - .gif, .png, .jpg, .ppm, and .bmp are supported
*$B:* The type of the cardset (see types below)
Cardsets Types:
~~~~~~~~~~~~~~~
* French = 1
* Hanafuda = 2
* Tarock = 3
* Mahjongg = 4
* Hex A Deck = 5
* Mughal Ganjifa = 6
* Navagraha Ganjiga = 7
* Dashavatara Ganjifa = 8
* Trumps Only = 9
* Matching = 10
* Puzzle = 11
* Ishido = 12
*$C:* The number of cards in the cardset, generally 42, 48, 52, 68, 78, 96 or 120
*$D:* The Style of the cardset (this field can hold one or more comma separated values)
Cardsets Styles:
~~~~~~~~~~~~~~~~
* Abstract = 35
* Adult = 1
* Animals = 2
* Anime = 3
* Art = 4
* Cartoons = 5
* Children = 6
* Classic Look = 7
* Collectors = 8
* Computers = 9
* Divination = 36
* Engines = 10
* Fantasy = 11
* Four Color = 37
* Ganjifa= 30
* Hanafuda = 12
* Hex A Deck = 29
* Holiday = 13
* Ishido = 34
* Mahjongg = 28
* Matching = 32
* Monochrome = 38
* Movies = 14
* Matrix = 31
* Music = 15
* Nature = 16
* Operating Systems = 17
* People = 19
* Places = 20
* Plain = 21
* Products = 22
* Puzzle = 33
* Round Cardsets = 18
* Science Fiction = 23
* Sports = 24
* Tarock = 27
* Vehicles = 25
* Video Games = 26
*$E:* The origin (country) of the cardset
Cardsets Origins:
~~~~~~~~~~~~~~~~~
* Australia = 1021
* Austria = 1001
* Belgium = 1019
* Canada = 1010
* China = 1011
* Czech Republic = 1012
* Denmark = 1013
* England = 1003
* France = 1004
* Germany = 1006
* Great Britain = 1014
* Hungary = 1015
* India = 1020
* Italy = 1005
* Japan = 1016
* Netherlands = 1002
* Portugal = 1022
* Russia = 1007
* Spain = 1008
* Sweden = 1017
* Switzerland = 1009
* USA = 1018
*$F:* The Year the cardset was created (in the range 1000 to 2299)
*$G:* The subtype of the cardset. Usually 0 - for French type cardsets, a value of 1 is used if there are jokers. For Puzzle type cardsets, it is the number of pieces per row/column.
*$H:* Whether the cardset is a 3D Mahjongg cardset - 1 if it is, 0 if it isn't. For cardsets with a version less than 7, version 6 cardsets treat this value as 1, and older version cardsets treat it as 0.
Line 2
------
`<internal_name>`: A name for PySolFC to identify your cardset (without spaces)
( *TIP:* You could add a number prefix (e.g. 123-cardset-name) )
`<cardset_name>`: Your cardset name as it should appear in the cardset manager. Note that a cardset name of more than 30 characters will be truncated.
Line 3
------
* *X:* The cards' width (the card image width)
* *Y:* The cards' height (the card image height)
* *D:* The color depth (mostly 8)
Line 4
------
* *XOFF:* The horizontal offset of the cards
* *YOFF:* The vertical offset of the cards
* *SXOFF:* The offset of the horizontal shadow (mostly 7)
* *SYOFF:* The offset of the vertical shadow (mostly 7)
Line 5
------
`back01.ext`: The name of the default back image (where `ext` means the file extension
e.g: `png` or `gif`.)
Line 6
------
`back01.ext;back02.ext;back03.ext;…``: The name of the other back images, including the default one.
About this document:
--------------------
*NOTE:*
This tutorial may be incomplete. It is given as is, without any warranty,
to help players customize their own cardsets.
You are welcome to send any suggestions to: mailto:neelix570@gmail.com[the Author's E-mail],
https://github.com/shlomif/PySolFC/issues[PySol FC's GitHub issue tracker] or
https://sourceforge.net/p/pysolfc/_list/tickets[PySol FC's Sourceforge issue tracker].
*NOTE 2:*
You should also place a file called `COPYRIGHT` in the same directory as `config.txt`,
containing the text that can be accessed via `Info/Settings`.
License:
~~~~~~~~
This tutorial was created under the terms of the GNU General Public License
version 3 or later. You can redistribute it as is and/or modify it.
Shlomi Fish, hereby puts his modifications to this document under
https://github.com/shlomif/shlomif-computer-settings/blob/master/shlomif-settings/git/commit-messages/cc0-copyright-disclaimer.txt[CC0 / Public Domain / MIT License / GPL terms]
Credits:
~~~~~~~~
Credits go to:
mailto:andsa@web.de[Andreas Sauer] for clarifying certain points +
https://www.shlomifish.org/[Shlomi Fish] for making some improvements to this tutorial

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -1,131 +0,0 @@
<h2>Remerciements pour PySol à</h2>
<ul>
<li> Volker Weidner pour l'avoir fait connaître le Solitaire
</li><li> Guido van Rossum pour le programme initial
</li><li> <a href="http://www.inetarena.com/~grania/">T. Kirk</a> pour les nombreux jeux et styles de cartes
</li><li> the Gnome AisleRiot team pour sa contribution à la documentation
</li><li> Les équipes AfterStep et KDE pour certaines icônes.
</li><li> Python, Tcl/Tk &amp; les équipes Linux pour avoir rendu possible la conception de ce programme
</li></ul>
<h2>Les contributeurs sont</h2>
<ul>
<li> T. Kirk &lt;grania@mailcity.com&gt;<br> beaucoup de Ganjifa <a href="ganjifa.html">Ganjifa</a>, <a href="hanafuda.html">Hanafuda</a> et de jeux de type Tarot.
</li><li> Andrew Csillag &lt;drew@thecsillags.com&gt;
<ul>
<li> <a href="rules/canfield.html">Canfield</a>
</li></ul>
</li><li> Deon Ramsey &lt;miavir@furry.de&gt;
<ul>
<li> <a href="rules/nomad.html">Nomad</a>
</li></ul>
</li><li> Galen Brooks &lt;galen@nine.com&gt;
<ul>
<li> <a href="rules/numerica.html">Numerica</a>
</li></ul>
</li><li> Matthew Hohlfeld &lt;hohlfeld@cs.ucsd.edu&gt;
<ul>
<li> <a href="rules/larasgame.html">Lara's Game</a>
</li></ul>
</li></ul>
<h2>Les contributeurs pour les styles de cartes sont</h2>
<ul>
<li> Bao Trinh &lt;bao@cs.umd.edu&gt;
</li><li> DJ Delorie &lt;dj@delorie.com&gt;
</li><li> Donald R. Woods &lt;woods@sun.com&gt;
</li><li> Felix Bellaby &lt;felix@pooh.u-net.com&gt;
</li><li> Heiko Eissfeldt &lt;heiko@colossus.escape.de&gt;
</li><li> Jochen Tuchbreiter &lt;whynot@mabi.de&gt;
</li><li> John Fitzgibbon
</li><li> John Heidemann &lt;johnh@isi.edu&gt;
</li><li> Jonathan Blandford &lt;jrb@mit.edu&gt;
</li><li> Joseph L. Traub &lt;jtraub@zso.dec.com&gt;
</li><li> Michael Bischoff &lt;mbi@mo.math.nat.tu-bs.de&gt;
</li><li> Mike Naylor &lt;mike.naylor@5x5poker.com&gt;
</li><li> Oliver Xymoron &lt;oxymoron@waste.org&gt;
</li><li> Rene Seindal &lt;rene@seindal.dk&gt;
</li><li> Rudy Muller &lt;rudy.muller@net.HCC.nl&gt;
</li><li> Ryu Changwoo &lt;cwryu@eve.kaist.ac.kr&gt;
</li><li> T. Kirk &lt;grania@mailcity.com&gt;
</li><li> The Papa &lt;papalini@biancaneve.ing.unifi.it&gt;
</li></ul>
<h2>Les contributeurs pour la musique sont</h2>
<ul>
<li> <a href="http://hem.passagen.se/dachande/">Carl Larsson</a> aka <i>Nightbeat</i>
&lt;nightbeat@traxinspace.com&gt;
</li></ul>
<h2>Remerciements spéciaux à</h2>
<ul>
<li> Andy Markebo &lt;flognat@fukt.hk-r.se&gt;
</li><li> Charles B. Dorsett
</li><li> Christian Tismer &lt;tismer@tismer.com&gt;
</li><li> Dylan Thurston &lt;Dylan.Thurston@math.unige.ch&gt;
</li><li> Jan Nijtmans &lt;j.nijtmans@chello.nl&gt;
</li><li> Jordan Russel &lt;jordanr@iname.com&gt;
</li><li> Kevin O'Connor &lt;koconnor@cse.Buffalo.EDU&gt;
</li><li> Marc-Andre Lemburg &lt;mal@lemburg.com&gt;
</li><li> Mark Hammond &lt;MHammond@skippinet.com.au&gt;
</li><li> Neil Schemenauer &lt;nascheme@enme.ucalgary.ca&gt;
</li><li> Thomas Gellekum &lt;tg@ihf.rwth-aachen.de&gt;
</li><li> Vladimir Marangozov &lt;Vladimir.Marangozov@inrialpes.fr&gt;
</li><li> Zachary Roadhouse &lt;Zachary_Roadhouse@brown.edu&gt;
</li><li> Natascha
</li></ul>
<h2>PySol utilise les technologies OpenSource suivantes</h2>
<ul>
<li> <a href="http://www.python.org/">Le langage de programmation Python</a>
</li><li> <a href="http://www.scriptics.com/">The Tcl/Tk GUI Toolkit</a>
</li><li> <a href="http://www.devolution.com/~slouken/projects/SDL/index.html">The SDL Simple DirectMedia Layer</a>
</li><li> <a href="http://www.lokigames.com/development/smpeg.php3">The SDL MPEG Player Library</a>
</li><li> <a href="http://mikmod.darkorb.net/">The MikMod Sound Library</a>
</li></ul>
<h2>PySol a été développé à l'aide des technologies OpenSource suivantes</h2>
<ul>
<li> <a href="http://www.linux.org/">Le système d'exploitation Linux</a>
</li><li> <a href="http://www.xfree86.org/">The XFree86 X Window System</a>
</li><li> <a href="http://www.kde.org/">L'environnement de bureau KDE</a>
</li><li> <a href="http://fte.sourceforge.net/">L'éditeur de texte FTE</a>
</li><li> <a href="http://www.jordanr.dhs.org/">The Inno Setup Win32 Installer</a>
</li></ul>

View file

@ -1,3 +0,0 @@
<h1>Règles générales du jeu de Ganjifa</h1>
Le Ganjifa est un jeu de cartes provenant d'Inde et d'autre pays de cette région. Généralement ronds, mais certains jeux sont de forme rectangulaire. La différence la plus significative entre le Ganjifa et les autres types de jeux de cartes est que ces cartes sont traditionnellement peinte une par une à la main. Les jeux comportent généralement 8 à 12 familles de cartes, chaque famille comportant généralement 12 valeurs. Les deux jeux les plus courants sont le Mughal qui compte 8 suites et le Dashavatara en qui en compte 10. Les suites contiennent des cartes de pépin allant d'as au 10 et deux cartes de cour, le Wazir et le Mir. L'ordre des suites est: Matsya, Kuchha, Varaha, Narsingha, Vamana, Parashurama, Rama, Krishna, Buddha, and Kalanki. Les jeux de Ganjifa solitaires se jouent de la même façon que les jeux standards, mais leur plus grand nombre de cartes (96 ou 120) y ajoutent de la complexité. Le fait que chaque suite a sa propre couleur rend le jeu plus intéressant dans les jeux disposés en colonnes de "couleurs alternées".
<img alt="" src="images/ganjifa.gif">

View file

@ -1,270 +0,0 @@
#!/usr/bin/env python3
import builtins
import os
import sys
from pysollib.gamedb import GAME_DB
from pysollib.gamedb import GI
from pysollib.mfxutil import latin1_normalize
from pysollib.mygettext import fix_gettext
# outdir = '../html'
pysollib_dir = '../'
builtins._ = lambda x: x
builtins.n_ = lambda x: x
import pysollib.games # noqa: E402,F402,I100,I202
import pysollib.games.mahjongg # noqa: E402,F402
import pysollib.games.special # noqa: E402,F401,F402
try:
os.mkdir('html')
except Exception:
pass
try:
os.mkdir('html/rules')
except Exception:
pass
def merge_dicts(x, y):
ret = x.copy()
ret.update(y)
return ret
pysollib_path = os.path.join(sys.path[0], pysollib_dir)
sys.path[0] = os.path.normpath(pysollib_path)
# print sys.path
fix_gettext()
files = [
('credits.html', 'PySol Credits'),
('ganjifa.html', 'PySol - Règles générales du Ganjifa'),
('general_rules.html', 'PySol - Règles générales'),
('glossary.html', 'PySol - Glossaire'),
('hanafuda.html', 'PySol - Règles générales des jeux de cartes à fleurs'),
('hexadeck.html', 'PySol - Règles générales du jeu Hex A Deck'),
('howtoplay.html', 'Comment jouer à PySol'),
('index.html', 'PySol - une collection de jeux de solitaire'),
('install.html', 'PySol - Installation'),
('intro.html', 'PySol - Introduction'),
('license.html', 'Licence de PySol'),
('news.html', 'PySol - une collection de jeux de solitaire'),
# ('rules_alternate.html', 'PySol - a Solitaire Game Collection'),
# ('rules.html', 'PySol - a Solitaire Game Collection'),
]
rules_files = [
# ('hanoipuzzle.html', ),
('mahjongg.html', 'PySol - Règles du Mahjongg'),
('matrix.html', 'PySol - Règles du Matrix'),
('pegged.html', 'PySol - Règles du Pegged'),
('shisensho.html', 'PySol - Règles du Shisen-Sho'),
('spider.html', 'PySol - Règles du Spider'),
('freecell.html', 'PySol - Règles du FreeCell'),
]
wikipedia_files = [
('houseinthewood.html', 'PySol - Règles de House in the Woods'),
('fourseasons.html', 'PySol - Règles du Four Seasons'),
]
def _fmt(fmt, params):
return fmt % merge_dicts(params, {'logo_url': "images/pysollogo03.png",
'logo_alt': "PySol FC Logo"})
main_header = '''<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN">
<html>
<head>
<title>%(title)s</title>
<meta name="license" content="GNU General Public License">
<meta http-equiv="content-type" content="text/html; charset=utf-8">
</head>
<body text="#000000" bgcolor="#F7F3FF" link="#0000FF" vlink="#660099"
alink="#FF0000">
<img src="%(logo_url)s" alt="%(logo_alt)s">
<br>
'''
main_footer = '''
<p>
<br>
%(back_to_index_link)s
</body>
</html>'''
rules_header = '''<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN">
<html>
<head>
<title>%(title)s</title>
<meta name="license" content="GNU General Public License">
<meta http-equiv="content-type" content="text/html; charset=utf-8">
</head>
<body text="#000000" bgcolor="#F7F3FF" link="#0000FF" vlink="#660099"
link="#FF0000">
<img src="../%(logo_url)s" alt="%(logo_alt)s">
<br>
'''
rules_footer = '''
<p>
%(footer)s
<br>
<a href="../glossary.html">Glossaire</a>
<br>
<a href="../general_rules.html">Règles générales</a>
<p>
<a href="../index.html">Sommaire</a>
</body>
</html>'''
wikipedia_header = '''<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN">
<html>
<head>
<title>%(title)s</title>
<meta name="license" content="GNU General Public License">
<meta http-equiv="content-type" content="text/html; charset=utf-8">
</head>
<body text="#000000" bgcolor="#F7F3FF" link="#0000FF" vlink="#660099"
alink="#FF0000">
<img src="../%(logo_url)s" alt="%(logo_alt)s">
<br>
'''
def getGameRulesFilename(n):
if n.startswith('Mahjongg'):
return 'mahjongg.html'
return latin1_normalize(n) + '.html'
def gen_main_html():
for infile, title in files:
outfile = open(os.path.join('html', infile), 'w')
print(_fmt(main_header, {'title': title}), file=outfile)
with open(infile, 'r') as file:
print(file.read(), file=outfile)
s = '<a href="index.html">Sommaire</a>'
if infile == 'index.html':
s = ''
print(_fmt(main_footer, {'back_to_index_link': s}), file=outfile)
outfile.close()
def gen_rules_html():
# ls = glob(os.path.join('rules', '*.html'))
rules_ls = os.listdir('rules')
rules_ls.sort()
wikipedia_ls = os.listdir('wikipedia')
wikipedia_ls.sort()
games = GAME_DB.getGamesIdSortedByName()
rules_list = []
files_list = []
for fn, tt in rules_files:
rules_list.append(('rules', fn, tt, ''))
files_list.append(fn)
for fn, tt in wikipedia_files:
rules_list.append(('wikipedia', fn, tt, ''))
files_list.append(fn)
altnames = []
# open file of list of all rules
out_rules = open(os.path.join('html', 'rules.html'), 'w')
print(_fmt(
main_header,
{'title': 'PySol - une collection de jeux de solitaire'}),
file=out_rules)
with open('rules.html', 'r') as file:
print(file.read(), file=out_rules)
for id in games:
# create list of rules
gi = GAME_DB.get(id)
rules_fn = gi.rules_filename
if not rules_fn:
rules_fn = getGameRulesFilename(gi.name)
if rules_fn in files_list:
continue
if rules_fn in rules_ls:
rules_dir = 'rules'
elif rules_fn in wikipedia_ls:
rules_dir = 'wikipedia'
else:
print('missing rules for %s (file: %s)'
% (gi.name, rules_fn))
continue
# print '>>>', rules_fn
title = 'PySol - Règles pour ' + gi.name
s = ''
if gi.si.game_type == GI.GT_HANAFUDA:
s = '<a href="../hanafuda.html">' + \
'Règles générales des jeux de cartes à fleurs</a>'
elif gi.si.game_type == GI.GT_DASHAVATARA_GANJIFA:
s = '<a href="../ganjifa.html">A-propos du Ganjifa</a>'
elif gi.si.game_type == GI.GT_HEXADECK:
s = '<a href="../hexadeck.html">' + \
'Règles générales du jeu Hex A Deck</a>'
elif gi.si.game_type == GI.GT_MUGHAL_GANJIFA:
s = '<a href="../ganjifa.html">A-propos du Ganjifa</a>'
# print '***', gi.name, '***'
rules_list.append((rules_dir, rules_fn, title, s))
files_list.append(rules_fn)
# rules_list.append((rules_fn, gi.name))
print('<li><a href="rules/%s">%s</a>'
% (rules_fn, gi.name), file=out_rules)
for n in gi.altnames:
altnames.append((n, rules_fn))
print('</ul>\n' + _fmt(main_footer,
{'back_to_index_link':
'<a href="index.html">Sommaire</a>'}),
file=out_rules)
out_rules.close()
# create file of altnames
out_rules_alt = open(os.path.join('html', 'rules_alternate.html'), 'w')
print(_fmt(
main_header, {'title': 'PySol - une collection de jeux de solitaire'}),
file=out_rules_alt)
with open('rules_alternate.html', 'r') as file:
print(file.read(), file=out_rules_alt)
altnames.sort()
for name, fn in altnames:
print('<li> <a href="rules/%s">%s</a>'
% (fn, name), file=out_rules_alt)
print('</ul>\n' + _fmt(main_footer,
{'back_to_index_link':
'<a href="index.html">Sommaire</a>'}),
file=out_rules_alt)
out_rules_alt.close()
# create rules
for dir, filename, title, footer in rules_list:
outfile = open(
os.path.join('html', 'rules', filename), 'w', encoding='utf-8')
if dir == 'rules':
print(_fmt(rules_header, {'title': title}), file=outfile)
else: # d == 'wikipedia'
print(_fmt(wikipedia_header, {'title': title}), file=outfile)
with open(os.path.join(dir, filename), 'r', encoding='utf-8') as file:
print(file.read(), file=outfile)
print(_fmt(rules_footer, {'footer': footer}), file=outfile)
outfile.close()
gen_main_html()
gen_rules_html()

View file

@ -1,15 +0,0 @@
<h1>Règles générales</h1>
<p>
Certaines caractéristiques sont communes à tous les jeux inclus dans cet ensemble. La plupart utilisent un ou deux jeux de 52 cartes standard. Le Roi est toujours la carte la plus forte. K signifie Roi, Q signifie Dame et J signifie Valet. Les cartes sont toujours empilées par ordre croissant ou décroissant, dans la zone principale de jeu, appelée le tableau, ou empilées de côtés, sur des emplacements appelés fondations. Certaines piles sont formées par ordre de valeurs de la même couleur de cartes, d'autres sont formées en alternant les couleurs.
<p>
Le talon est formé par les cartes restantes. Certaines personnes l'appellent le stock ou la main.
<p>
Le but commun à tous ces jeux est d'utiliser toutes les cartes dans les fondations ou toutes celles du talon selon les règles du jeu. Quand toutes les cartes sont utilisées, la partie est gagnée. Sinon, vous perdez.
<p>
Les cartes sont prises au talon d'un clic gauche ou en appuyant sur &lt;D&gt;. Pour certain jeu, il est possible de retourner les cartes d'un clic gauche. Pour déplacer une carte, cliquez dessus et glissez-là jusqu'à lemplacement de destination. Si un mouvement n'est pas autorisé, la carte ne bougera pas. Si une ou plusieurs cartes peuvent être déplacées vers les fondations ou les défausse d'as, un appui sur la touche &lt;A&gt; le fera automatiquement. Quelquefois, la touche &lt;A&gt; déplacera plus de cartes que vous ne voulez vers les fondations. Il vous est possible de renvoyer des cartes vers le tableau. Vous pouvez aussi utiliser la touche "annuler" &lt;Z&gt;.
<p>
Pour mieux comprendre ces règles, vous pouvez toujours regarder le jeu de démonstration :-)

View file

@ -1,185 +0,0 @@
<h1>Glossaire</h1>
<p>Note de l'auteur: Ces définitions sont données à titre de de référence uniquement. Voir les règles des jeux pour plus de détails. Chaque jeu définit ses propres règles.</p>
<dl>
<dt><b>CARTE DE DEPART</b></dt>
<dd>
<p>La première carte placée sur une fondation. Généralement, les autres fondations commencent par une carte de même valeur. Voir: FONDATION</p>
</dd>
<dt><b>COULEUR DE CARTES</b></dt>
<dd>
<p>Quatre types différents dans un JEU STANDARD. Généralement Trèfles, Piques, Coeurs et Carreaux.</p>
</dd>
<dt><b>DEFAUSSE</b></dt>
<dd>
<p>Une pile de cartes, face visible, généralement située près du Talon. La carte du dessus est généralement jouable.</p>
</dd>
<dt><b>EMPILEMENT INDEPENDAMMENT DE LA COULEUR DE CARTES</b></dt>
<dd>
<p>Voir EMPILEMENT PAR ORDRE DE VALEUR.</p>
</dd>
<dt><b>EMPILEMENT PAR COULEUR</b></dt>
<dd>
<p>On peur placer une carte uniquement sur un carte de même couleur. Exemple: Placer un Carreau sur un Coeur est valide, placer un Carreau sur un Trèfle ne l'est pas.</p>
</dd>
<dt><b>EMPILEMENT PAR COULEURS ALTERNEES</b></dt>
<dd>
<p>On place les cartes en alternant les couleurs. Exemple: Placer un Carreau sur un Pique est accepté, placer un Carreau sir un Coeur ne l'est pas.</p>
</dd>
<dt><b>EMPILEMENT PAR COULEUR DE CARTES</b></dt>
<dd>
<p>On peut placer une carte uniquement sur un carte de même couleur de cartes. Exemple: Placer un Pique sur un Pique est valide, placer un Pique sur un Trèfle ne l'est pas.</p>
</dd>
<dt><b>EMPILEMENT PAR ORDRE DE VALEUR</b></dt>
<dd>
<p>EMPILEMENT Par ordre CROISSANT ou DECROISSANT indépendamment de la couleur ou de la couleur de cartes.</p>
</dd>
<dt><b>EMPILEMENT PAR SUITE DE MÊME COULEURS</b></dt>
<dd>
<p>On ne peut placer une carte que sur une pile de la même couleur. Exemple: Placer un Carreau sur un Coeur est valide, placer un Coeur sur un autre ne l'est pas.</p>
</dd>
<dt><b>EMPILEMENT PAR ORDRE CROISSANT OU DECROISSANT</b></dt>
<dd>
<p>On peut placer une carte sur une autre d'une valeur immédiatement supérieure ou inférieure. Exemple: Placer un Valet sur une Dame ou un 10 est valide, placer un 10 sur une Dame ne l'est pas.</p>
</dd>
<dt><b>EMPILEMENT PAR ORDRE CROISSANT</b></dt>
<dd>
<p>On place toujours une carte, sur une carte de valeur inférieure. Généralement, on place une carte de valeur immédiatement supérieure à la précédente. Exemple: Placer une Dame sur un Valet est valide, placer une Dame sur un Roi ne l'est pas.</p>
</dd>
<dt><b>EMPILEMENT PAR ORDRE CROISSANT PAR ECART DE *</b></dt>
<dd>
<p>On place toujours une carte, sur une carte de valeur inférieure par écart de *. Exemple: Si * est 2, placer un 10 sur un 8 est valide, placer un 10 sur un 9 ne l'est pas.</p>
</dd>
<dt><b>EMPILEMENT PAR ORDRE DECROISSANT</b></dt>
<dd>
<p>On place toujours une carte, sur une carte de valeur supérieure. Généralement, on place une carte de valeur immédiatement supérieure à la précédente. Exemple: Placer un 10 sur un Valet est valide, placer un 10 sur un 9 ne l'est pas.</p>
</dd>
<dt><b>EMPILEMENT PAR ORDRE DECROISSANT PAR ECART DE *</b></dt>
<dd>
<p>On place toujours une carte, sur une carte de valeur supérieure par écart de *. Exemple: Si * est 2, placer un 10 sur une Dame est valide, placer un 10 sur un Valet ne l'est pas.</p>
</dd>
<dt><b>EMPILER</b></dt>
<dd>
<p>La possibilité de placer une carte (ou un groupe de cartes) sur une autre. Par rapport à la valeur, vous pouvez empiler les cartes par ordre CROISSANT, DECROISSANT ou CROISSANT/DECROISSANT par *. Par rapport à la couleur/couleur de cartes, vous pouvez empiler les cartes par COULEUR DE CARTES, COULEUR, par COULEURS ALTERNEES, par SUITES DE MEME COULEUR ou INDEPENDAMMENT DE LA COULEUR DE CARTES. Notez que tous les jeux d'empilement suivent deux de ces règles, dont un de chaque liste.</p>
</dd>
<dt><b>EMPLACEMENT</b></dt>
<dd>
<p>Voir PILE.</p>
</dd>
<dt><b>FONDATION</b></dt>
<dd>
<p>Si un jeu comporte une fondation, le jeu est généralement gagné une fois les toutes les cartes placées sur la(les) fondation(s).</p>
</dd>
<dt><b>JEU</b></dt>
<dd>
<p>Le jeu de cartes utilisé. La plupart des jeux se jouent avec un JEU STANDARD, mais les jeux se jouant avec un JEU DOUBLE, un JEU A JOKER ou un JEU TRONQUÉ ne sont pas rare.</p>
</dd>
<dt><b>JEU A JOKER</b></dt>
<dd>
<p>Un jeu de cartes consistant en un JEU STANDARD et deux Jokers, comptant 54 cartes.</p>
</dd>
<dt><b>JEU DOUBLE</b></dt>
<dd>
<p>Un jeu de cartes consistant en deux JEUX STANDARDS, comptant 104 cartes.</p>
</dd>
<dt><b>JEU STANDARD</b></dt>
<dd>
<p>Un jeu de 52 cartes. Il comporte 4 couleurs de cartes comptant 13 cartes chacune. Chaque couleur de cartes compte un As, 2 à 10, Valet, Dame, et Roi. Les couleurs de cartes sont généralement Trèfles, Piques, Coeurs et Carreaux. Ces couleurs de cartes peuvent être regroupées en deux couleurs, généralement noir et rouge. Les Trèfles et les Piques sont noires, les Coeurs et les Carreaux sont rouges. PySol offre la possibilité d'utiliser des jeux différents. Dans ce cas, les nouvelles couleurs et/ou couleurs de cartes sont substituées par ces modèles.</p>
</dd>
<dt><b>JEU TRONQUÉ</b></dt>
<dd>
<p>Un jeu de 32 cartes. Il comporte 4 couleurs de cartes comptant 8 cartes chacune. Chaque couleur de cartes compte un As, 7 à 10, Valet, Dame, et Roi.</p>
</dd>
<dt><b>PILE</b></dt>
<dd>
<p>Une zone désignée dans laquelle des cartes peuvent être placées.</p>
</dd>
<dt><b>RANG</b></dt>
<dd>
<p>Voir VALEUR.</p>
</dd>
<dt><b>RÉSERVE</b></dt>
<dd>
<p>Les cartes de la réserve peuvent généralement être jouées n'importe où. On ne peut généralement pas empiler de cartes dessus.</p>
</dd>
<dt><b>STOCK</b></dt>
<dd>
<p>Voir TALON.</p>
</dd>
<dt><b>SUITE CONTINUE</b></dt>
<dd>
<p>Dans certains jeux, les empilements de cartes peuvent continuer après avoir posé la carte la plus forte ou la plus faible. Dans les empilements par ORDRE CROISSANT, vous pouvez placer un As sur un Roi. Dans les empilements par ORDRE DECROISSANT, vous pouvez placer un Roi sur un AS.</p>
</dd>
<dt><b>TABLEAU</b></dt>
<dd>
<p>La zone de jeu dans laquelle se déroule la plus grande partie du jeu. Accepte généralement les emplacements de cartes.</p>
</dd>
<dt><b>TALON</b></dt>
<dd>
<p>Ce qu'il reste de cartes après la distribution, qui se fait généralement face cachée.</p>
</dd>
<dt><b>VALEUR</b></dt>
<dd>
<p>La valeur de la carte. Les cartes numérotés ont généralement la valeur associée au chiffre qui y figure. Les As peuvent prendre la plus forte ou la plus faible valeur. S'ils ont la valeur la plus forte, ils valent 1. S'ils ont la valeur la pus faible, il valent 14. J, Q et K prennent généralement les valeurs 11, 12 et 13 respectivement. Certains jeux peuvent fixer les valeurs de ces cartes à 10. Dans ce cas un As ayant la valeur la plus forte prend la valeur 11.</p>
</dd>
</dl>

View file

@ -1,8 +0,0 @@
<h1>Règles générales des jeux de cartes à fleurs.</h1>
<p>
Certaines caractéristiques sont communes à tous les jeux se jouant avec des cartes de Hanafuda. Tous se jouent avec un ou plusieurs jeux à fleurs asiatiques. On trouve ce jeu dans de nombreuse régions du Pacifique, ainsi qu'à Hawaii. Il comprend 12 couleurs de cartes comptant 4 cartes chacune. Les couleurs de cartes sont associées aux 12 mois de l'année. Pour une bonne explication de ce que sont les couleurs de cartes, visitez le<a href="http://hanafubuki.org/">site Hanafuda et Kabufuda de Graham Leonard</a>.
<p>
La plupart des jeux de cartes à fleurs solitaires se jouent comme les jeux de cartes de western, à quelques différences près. Voir les <a href="general_rules.html">Règles Générales</a> pour les instructions de base sur les jeux de solitaire. Le but du jeu est généralement de déplacer toutes les cartes du tableau vers les fondations. Le plus difficile lorsqu'on découvre les cartes de Hanafuda, est de retenir quelles cartes appartiennent à quelle couleur de cartes ainsi que leurs valeurs. La valeur des couleurs de cartes est quelquefois aussi important que la valeur des cartes dans leurs suites de couleurs. Essayez de garder cette image d'aide du hanafuda afficher afin de pouvoir vous y référer an jouant.
<img alt="" src="images/hanahelp.gif">

View file

@ -1,2 +0,0 @@
<h1>Règles générales du jeu Hex A Deck</h1>
Le jeu Hex A Deck est similaire à quelques jeux de cartes parus au début du XXème siècle, comptant 16 cartes dans chaque couleur de cartes. Ces jeux étaient prévus pour être joués du temps ou des jeux populaires tels que le Whist, étaient joués à 5 ou 6 joueurs. Les cartes supplémentaires étaient autant de cartes en plus dans les mains de chaque joueur, ce qui rendait le jeu plus intéressant. Les Magiciens du Hex A Deck correspondent aux Jokers des jeux classiques. Le rôle principal du Magicien dans ce jeu, est de bloquer la défausse au plus mauvais moment. Soit au meilleur moment. Ils y réussissent toujours très bien. Dans les jeux utilisant des piles de couleurs alternées, ils peuvent remplacer n'importe quelle couleur. Leurs valeurs vont de 1 à 4 et ne peuvent quelquefois être placée que par ordre de valeur. Les valeurs peuvent ne pas être indiquées sur les cartes. Si c'est le cas, il existe généralement un moyen de les identifier. Leur valeur peut-être déterminée par certains éléments de comparaison visuels. Le Magicien ayant la valeur la plus élevée est le plus complet ou le plus gros, ou encore le chapeau le plus grand. Ils se placent sur leur fondation respective s'il y en a une, et par ordre décroissant. Du premier au quatrième. Dans certains cas, les Magiciens ne peuvent être retirés du tableau que quand toutes les autres cartes ont rejoint les fondations. Dans certains jeux, ils ne peuvent pas être joués. Ils sont présents pour rendre le jeu plus intéressant. Ce qui rend le jeu plus difficile. En cela, ils sont très efficaces.

View file

@ -1,114 +0,0 @@
<h1>Comment jouer à PySol</h1>
<h2>Utilisation de la souris</h2>
<p>
Bouton Gauche:
<ul type="disc">
<li> Déplacer les cartes
</li><li> Cliquez sur le talon pour distribuer de nouvelles cartes.
</li></ul>
<p>
Bouton Droit (ou double-clic Gauche)
<ul type="disc">
<li> Déplacer les cartes vers les fondations
</li><li> Jeu rapide (si activé)
</li></ul>
<p>
Bouton du Milieu (ou Ctrl+clic Droit):
<ul type="disc">
<li> Voir les cartes partiellement cachées
</li></ul>
<p>
Ctrl+Clic Gauche:
<ul type="disc">
<li> Affiche en surbrillance toutes les cartes correspondantes.
</li></ul>
<p>
Maj+Clic Gauche:
<ul type="disc">
<li> Affiche en surbrillance toutes les cartes de même valeur.
</li></ul>
<h2>Jeu à deux mains</h2>
<p>
Placer trois doigts sur '<i>A</i>' (déplacer auto), '<i>S</i>' (annuler) et '<i>D</i>' (distribuer). Vous pouvez ainsi atteindre '<i>R</i>' (répéter).
<p>
Les gauchers préféreront '<i>L</i>' (déplacer auto), '<i>K</i>' (annuler) et '<i>J</i>' (distribuer).
<!--
<h2>Point-and-Click play</h2>
<p>
If you prefer Point-and-Click over Drag-and-Drop you can enable
<i>Quick play</i> and use the right mouse button. See below.
-->
<h2>Jeu automatique</h2>
<p>
Notez que le jeu automatique peut gâcher le jeu. Évitez de l'activer. Ou n'utilisez que le <i>retournement automatique</i>. Certains jeux désactivent automatiquement cette fonctionnalité, sinon ils n'ont plus aucun intérêt.
<p>
Retourner automatiquement
<ul type="disc">
<li> Retourne automatiquement toutes les cartes.
</li></ul>
Déplacement automatiquement
<ul type="disc">
<li> Déplace automatiquement les cartes vers les fondations.
</li></ul>
Distribuer automatiquement
<ul type="disc">
<li> Distribue automatiquement les cartes à la défausse si elle est vide.
</li></ul>
Jeu rapide
<ul type="disc">
<li> Utilisez le bouton droit de la souris pour déplacer rapidement les piles de cartes. Ce système n'est pas très intuitif, il n'utilise pas le système d'indice.
</li></ul>
<h2>L'animation est trop lente...</h2>
<p>
Malheureusement, il manque un concept de sprite à Tcl/Tk toolkit, ce qui provoque (double-buffer invisible), beaucoup de répétition de dessin lors du déplacement des cartes.
<p>
Désactiver l'<i>ombre des cartes</i>, l'<i>ombrage des mouvements possibles</i>, la mosaïque d'arrière-plan de table et les sons améliorera l'affichage.
<h2>Les arrière-plans de table sont de mauvaise qualité</h2>
<p>
Ils ne doivent être activés qu'en mode couleurs vraies - sinon la qualité sera mauvaise en raison du tramage.
<p>
Vous pouvez ajouter vos propres mosaïques d'arrière-plan. Pour ce faire, copiez les images dans le répertoire <i>data/tiles</i> ou dans <i>~/.PySolFC/tiles</i> de votre répertoire personnel.
<!-- They must be in GIF or PPM format. -->
<h2>Notes à propos du système de score</h2>
<p>
<ul type="disc">
<li> La prise en compte des scores commence après le premier mouvement. Même si vous annulez tous les mouvements, les scores ne sera pas annulé.
</li><li> Vous perdrez la partie si vous utilisez un indice ou si vous démarrer la démo.
</li><li> Vous pouvez recommencer à tout moment pour avoir une chance supplémentaire de gagner.
</li><li> Si vous ne voulez pas enregistrer le score d'un jeu perdu, vous pouvez temporairement modifiez les paramètres du joueur.
</li><li> Les parties chargées ne comptent pas.
</li><li> Si vous gagnez une partie sans utiliser <i>Annuler</i>, <i>Jeu rapide</i> ni aucune des autres fonctions d'assistance, vous recevrez une récompense spéciale.
<!--
<li> There are no score values in PySol - you win a game, or you lose it.
And don't even think about asking me to implement this nonsense - get
a nice pinball game if you're a highscore freak...
-->
</li><li> Enfin, gardez toujours à l'esprit que ceci est un jeu de <b>Patience</b>. Détendez-vos et amusez-vous.
</li></ul>
<h2>Raccourcis clavier non-documentés</h2>
<ul type="disc">
<li> <i>Space</i> - Distribuer
</li><li> <i>S</i> - Annuler
</li><li> <i>Retour arrière</i> - Annuler
</li><li>
<i>Ctrl-A</i> - Déplacement + Retournement automatique
</li><li> <i>Ctrl-B</i> - Changer l'arrière-plan des cartes
</li><li> <i>Ctrl-H</i> - Afficher le classement interne en donnant un indice
</li><li> <i>Ctrl-I</i> - Changer de mosaïque de table
</li><li> <i>Ctrl-N</i> - Débuter une nouvelle partie avec le numéro de jeu suivant
</li><li> <i>Ctrl-P</i> - Modifier le nom du joueur
</li><li> <i>Ctrl-U</i> - Jouer la musique suivante
</li></ul>

View file

@ -1,32 +0,0 @@
<h1>PySol - une collection de jeux de solitaire</h1>
<p> <a href="intro.html">Introduction</a>
<p> <a href="install.html">Installation</a>
<p> <a href="howtoplay.html">Comment jouer</a>
<h2>Règles</h2>
<ul>
<li> <a href="glossary.html">Glossaire</a>
</li><li> <a href="general_rules.html">Règles générales</a>
</li><li> <a href="rules.html">Règles individuelles des jeux</a>
</li><li> <a href="rules_alternate.html">Noms alternatifs</a>
</li></ul><!-- <p> <a href="news.html">What's new ?</a> -->
<p> <a href="license.html">Licence de PySol</a>
<p>
<hr>
<p> Visitez le <a href="http://pysolfc.sourceforge.net/">site officiel de PySolFC</a>.
<!--
<p>
Copyright (C) 1998-2003 by <a href="mailto:markus@oberhumer.com">Markus
F.X.J. Oberhumer</a>.<br>
Copyright (C) 2003 by Mt. Hood Playing Card Co.<br>
Copyright (C) 2005 by <a href="mailto:skomoroh@gmail.com">Skomoroh</a>.<br>
All Rights Reserved.
-->
<p>
PySol est distribué sous la licence
<a href="license.html">GNU General Public Licence</a>.

View file

@ -1,32 +0,0 @@
<h1>Installation</h1>
<p>
Le programme étant un script Pyrhon, il n'est pas nécessaire de le compiler. Il suffit de le lancer.
<p>
PySol nécessite Python 2.3 et Tcl/Tk 8.4 ou supérieur. Tous deux peuvent être téléchargés librement pour les plateformes Unix, Windows et Macintosh.
<p>
PySol est un logiciel libre et <i>Open Source</i> distribué sous la licence
<a href="license.html">GNU General Public Licence</a>.
<h2>Windows 95/98/ME/NT/2000</h2>
PySol est distribué sous la forme d'un fichier dinstallation autonome, il n'a besoin d'aune installation supplémentaire.
<p>
Su vous souhaitez modifier le code source de PySol ou écrire vos propres programmes en Python, vous pouvez télécharger le système de développement à l'adresse <a href="http://www.python.org/download/download_windows.html">http://www.python.org/download/download_windows.html</a>.
<h2>Unix</h2>
En principe, votre système est fourni avec Python et Tcl/Tk.<br> Sinon visitez <a href="http://www.python.org/download/">http://www.python.org/download/</a> pour récupérer le code source.
<p>
Il existe également des paquets installables pour toutes les distributions les plus courantes de Linux, FreeBSD et HPUX.
<h2>Macintosh</h2>
Des fichiers d'installation autonomes sont disponibles pour Python et Tcl/Tk à l'adresse<br> <a href="http://www.python.org/download/download_mac.html">http://www.python.org/download/download_mac.html</a>
<p>
N'ayant pas accès à une machine Mac, tous les commentaires concernant l'installation et l'apparence sont les bienvenus. Le "Portage' de X11 à Windows n'a nécessité que quelques changements mineurs dans les paramètres de police, j'espère qu'il en est de même sous Mac.
<p>
[ On m'a rapporté que PySol fonctionne bien sous Mac - il suffit de placer 'pysol.py' dans l'interpréteur Python. Il vous faudra simplement allouer beaucoup de mémoire à l'interpréteur Python. ]

View file

@ -1,39 +0,0 @@
<h1>Introduction</h1>
<p>
Vous vous demandez peut-être "Pourquoi encore un autre jeu de solitaire". La réponse est simple...
<h3>Avantages de PySol</h3>
<ul>
<li> il contient actuellement plus de 1000 jeux de solitaire différents
</li><li> il est basé sur moteur de solitaire extensible
</li><li> beaucoup de jeux classiques comme le Forty Thieves, le FreeCell, le Klondike et le Spider
</li><li> des jeux spéciaux tels que le Ganjifa, le Hanafuda, le Poker ainsi que des jeux de type Tarot
</li><li> une interface moderne
</li><li> de multiples style de cartes et arrière-plans
</li><li> des mosaïques d'arrière-plan de table
</li><li> annuler et répéter illimités
</li><li> des marques-pages persistant
</li><li> chargement et sauvegarde des jeux
</li><li> des statistiques pour le joueur
</li><li> un système d'indices pour se débloquer
</li><li> des jeux en mode démo
</li><li> un assistant de création de jeux de solitaire
</li><li> il supporte les plug-ins écrits par les utilisateurs
</li><li> des échantillons de sons et des musiques de fond
</li><li> un navigateur d'aide HTML intégré
</li><li> beaucoup de documentation
</li><li> il est compatible avec tous les systèmes Unix/X11, Windows 95/98/2000/XP et Mac OSX
</li><li> il est écrit en 100% pur Python
</li><li> il est distribué sous licence GNU General Public Licence
</li><li> <i>il s'agit d'un Freeware de qualité commerciale</i>
</li></ul><!--
<h3>Legal terms</h3>
<p>
PySol is Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003 by <a href="mailto:markus@oberhumer.com">Markus F.X.J. Oberhumer</a>.<br>
All Rights Reserved.
<p>
PySol is distributed under the terms of the
<a href="license.html">GNU General Public License</a>.
-->

View file

@ -1,657 +0,0 @@
<p align="center">
<b>GNU GENERAL PUBLIC LICENSE</b><br>
Version 3, 29 June 2007
<p>
Copyright (C) 2007 <a href="http://fsf.org/">Free Software Foundation, Inc.</a>
<p>
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
<p align="center">
<b>TERMS AND CONDITIONS</b>
<p>
0. Definitions.
<p>
"This License" refers to version 3 of the GNU General Public License.
<p>
"Copyright" also means copyright-like laws that apply to other kinds of
works, such as semiconductor masks.
<p>
"The Program" refers to any copyrightable work licensed under this
License. Each licensee is addressed as "you". "Licensees" and
"recipients" may be individuals or organizations.
<p>
To "modify" a work means to copy from or adapt all or part of the work
in a fashion requiring copyright permission, other than the making of an
exact copy. The resulting work is called a "modified version" of the
earlier work or a work "based on" the earlier work.
<p>
A "covered work" means either the unmodified Program or a work based
on the Program.
<p>
To "propagate" a work means to do anything with it that, without
permission, would make you directly or secondarily liable for
infringement under applicable copyright law, except executing it on a
computer or modifying a private copy. Propagation includes copying,
distribution (with or without modification), making available to the
public, and in some countries other activities as well.
<p>
To "convey" a work means any kind of propagation that enables other
parties to make or receive copies. Mere interaction with a user through
a computer network, with no transfer of a copy, is not conveying.
<p>
An interactive user interface displays "Appropriate Legal Notices"
to the extent that it includes a convenient and prominently visible
feature that (1) displays an appropriate copyright notice, and (2)
tells the user that there is no warranty for the work (except to the
extent that warranties are provided), that licensees may convey the
work under this License, and how to view a copy of this License. If
the interface presents a list of user commands or options, such as a
menu, a prominent item in the list meets this criterion.
<p>
1. Source Code.
<p>
The "source code" for a work means the preferred form of the work
for making modifications to it. "Object code" means any non-source
form of a work.
<p>
A "Standard Interface" means an interface that either is an official
standard defined by a recognized standards body, or, in the case of
interfaces specified for a particular programming language, one that
is widely used among developers working in that language.
<p>
The "System Libraries" of an executable work include anything, other
than the work as a whole, that (a) is included in the normal form of
packaging a Major Component, but which is not part of that Major
Component, and (b) serves only to enable use of the work with that
Major Component, or to implement a Standard Interface for which an
implementation is available to the public in source code form. A
"Major Component", in this context, means a major essential component
(kernel, window system, and so on) of the specific operating system
(if any) on which the executable work runs, or a compiler used to
produce the work, or an object code interpreter used to run it.
<p>
The "Corresponding Source" for a work in object code form means all
the source code needed to generate, install, and (for an executable
work) run the object code and to modify the work, including scripts to
control those activities. However, it does not include the work's
System Libraries, or general-purpose tools or generally available free
programs which are used unmodified in performing those activities but
which are not part of the work. For example, Corresponding Source
includes interface definition files associated with source files for
the work, and the source code for shared libraries and dynamically
linked subprograms that the work is specifically designed to require,
such as by intimate data communication or control flow between those
subprograms and other parts of the work.
<p>
The Corresponding Source need not include anything that users
can regenerate automatically from other parts of the Corresponding
Source.
<p>
The Corresponding Source for a work in source code form is that
same work.
<p>
2. Basic Permissions.
<p>
All rights granted under this License are granted for the term of
copyright on the Program, and are irrevocable provided the stated
conditions are met. This License explicitly affirms your unlimited
permission to run the unmodified Program. The output from running a
covered work is covered by this License only if the output, given its
content, constitutes a covered work. This License acknowledges your
rights of fair use or other equivalent, as provided by copyright law.
<p>
You may make, run and propagate covered works that you do not
convey, without conditions so long as your license otherwise remains
in force. You may convey covered works to others for the sole purpose
of having them make modifications exclusively for you, or provide you
with facilities for running those works, provided that you comply with
the terms of this License in conveying all material for which you do
not control copyright. Those thus making or running the covered works
for you must do so exclusively on your behalf, under your direction
and control, on terms that prohibit them from making any copies of
your copyrighted material outside their relationship with you.
<p>
Conveying under any other circumstances is permitted solely under
the conditions stated below. Sublicensing is not allowed; section 10
makes it unnecessary.
<p>
3. Protecting Users' Legal Rights From Anti-Circumvention Law.
<p>
No covered work shall be deemed part of an effective technological
measure under any applicable law fulfilling obligations under article
11 of the WIPO copyright treaty adopted on 20 December 1996, or
similar laws prohibiting or restricting circumvention of such
measures.
<p>
When you convey a covered work, you waive any legal power to forbid
circumvention of technological measures to the extent such circumvention
is effected by exercising rights under this License with respect to
the covered work, and you disclaim any intention to limit operation or
modification of the work as a means of enforcing, against the work's
users, your or third parties' legal rights to forbid circumvention of
technological measures.
<p>
4. Conveying Verbatim Copies.
<p>
You may convey verbatim copies of the Program's source code as you
receive it, in any medium, provided that you conspicuously and
appropriately publish on each copy an appropriate copyright notice;
keep intact all notices stating that this License and any
non-permissive terms added in accord with section 7 apply to the code;
keep intact all notices of the absence of any warranty; and give all
recipients a copy of this License along with the Program.
<p>
You may charge any price or no price for each copy that you convey,
and you may offer support or warranty protection for a fee.
<p>
5. Conveying Modified Source Versions.
<p>
You may convey a work based on the Program, or the modifications to
produce it from the Program, in the form of source code under the
terms of section 4, provided that you also meet all of these conditions:
<p>
a) The work must carry prominent notices stating that you modified
it, and giving a relevant date.
<p>
b) The work must carry prominent notices stating that it is
released under this License and any conditions added under section
7. This requirement modifies the requirement in section 4 to
"keep intact all notices".
<p>
c) You must license the entire work, as a whole, under this
License to anyone who comes into possession of a copy. This
License will therefore apply, along with any applicable section 7
additional terms, to the whole of the work, and all its parts,
regardless of how they are packaged. This License gives no
permission to license the work in any other way, but it does not
invalidate such permission if you have separately received it.
<p>
d) If the work has interactive user interfaces, each must display
Appropriate Legal Notices; however, if the Program has interactive
interfaces that do not display Appropriate Legal Notices, your
work need not make them do so.
<p>
A compilation of a covered work with other separate and independent
works, which are not by their nature extensions of the covered work,
and which are not combined with it such as to form a larger program,
in or on a volume of a storage or distribution medium, is called an
"aggregate" if the compilation and its resulting copyright are not
used to limit the access or legal rights of the compilation's users
beyond what the individual works permit. Inclusion of a covered work
in an aggregate does not cause this License to apply to the other
parts of the aggregate.
<p>
6. Conveying Non-Source Forms.
<p>
You may convey a covered work in object code form under the terms
of sections 4 and 5, provided that you also convey the
machine-readable Corresponding Source under the terms of this License,
in one of these ways:
<p>
a) Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by the
Corresponding Source fixed on a durable physical medium
customarily used for software interchange.
<p>
b) Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by a
written offer, valid for at least three years and valid for as
long as you offer spare parts or customer support for that product
model, to give anyone who possesses the object code either (1) a
copy of the Corresponding Source for all the software in the
product that is covered by this License, on a durable physical
medium customarily used for software interchange, for a price no
more than your reasonable cost of physically performing this
conveying of source, or (2) access to copy the
Corresponding Source from a network server at no charge.
<p>
c) Convey individual copies of the object code with a copy of the
written offer to provide the Corresponding Source. This
alternative is allowed only occasionally and noncommercially, and
only if you received the object code with such an offer, in accord
with subsection 6b.
<p>
d) Convey the object code by offering access from a designated
place (gratis or for a charge), and offer equivalent access to the
Corresponding Source in the same way through the same place at no
further charge. You need not require recipients to copy the
Corresponding Source along with the object code. If the place to
copy the object code is a network server, the Corresponding Source
may be on a different server (operated by you or a third party)
that supports equivalent copying facilities, provided you maintain
clear directions next to the object code saying where to find the
Corresponding Source. Regardless of what server hosts the
Corresponding Source, you remain obligated to ensure that it is
available for as long as needed to satisfy these requirements.
<p>
e) Convey the object code using peer-to-peer transmission, provided
you inform other peers where the object code and Corresponding
Source of the work are being offered to the general public at no
charge under subsection 6d.
<p>
A separable portion of the object code, whose source code is excluded
from the Corresponding Source as a System Library, need not be
included in conveying the object code work.
<p>
A "User Product" is either (1) a "consumer product", which means any
tangible personal property which is normally used for personal, family,
or household purposes, or (2) anything designed or sold for incorporation
into a dwelling. In determining whether a product is a consumer product,
doubtful cases shall be resolved in favor of coverage. For a particular
product received by a particular user, "normally used" refers to a
typical or common use of that class of product, regardless of the status
of the particular user or of the way in which the particular user
actually uses, or expects or is expected to use, the product. A product
is a consumer product regardless of whether the product has substantial
commercial, industrial or non-consumer uses, unless such uses represent
the only significant mode of use of the product.
<p>
"Installation Information" for a User Product means any methods,
procedures, authorization keys, or other information required to install
and execute modified versions of a covered work in that User Product from
a modified version of its Corresponding Source. The information must
suffice to ensure that the continued functioning of the modified object
code is in no case prevented or interfered with solely because
modification has been made.
<p>
If you convey an object code work under this section in, or with, or
specifically for use in, a User Product, and the conveying occurs as
part of a transaction in which the right of possession and use of the
User Product is transferred to the recipient in perpetuity or for a
fixed term (regardless of how the transaction is characterized), the
Corresponding Source conveyed under this section must be accompanied
by the Installation Information. But this requirement does not apply
if neither you nor any third party retains the ability to install
modified object code on the User Product (for example, the work has
been installed in ROM).
<p>
The requirement to provide Installation Information does not include a
requirement to continue to provide support service, warranty, or updates
for a work that has been modified or installed by the recipient, or for
the User Product in which it has been modified or installed. Access to a
network may be denied when the modification itself materially and
adversely affects the operation of the network or violates the rules and
protocols for communication across the network.
<p>
Corresponding Source conveyed, and Installation Information provided,
in accord with this section must be in a format that is publicly
documented (and with an implementation available to the public in
source code form), and must require no special password or key for
unpacking, reading or copying.
<p>
7. Additional Terms.
<p>
"Additional permissions" are terms that supplement the terms of this
License by making exceptions from one or more of its conditions.
Additional permissions that are applicable to the entire Program shall
be treated as though they were included in this License, to the extent
that they are valid under applicable law. If additional permissions
apply only to part of the Program, that part may be used separately
under those permissions, but the entire Program remains governed by
this License without regard to the additional permissions.
<p>
When you convey a copy of a covered work, you may at your option
remove any additional permissions from that copy, or from any part of
it. (Additional permissions may be written to require their own
removal in certain cases when you modify the work.) You may place
additional permissions on material, added by you to a covered work,
for which you have or can give appropriate copyright permission.
<p>
Notwithstanding any other provision of this License, for material you
add to a covered work, you may (if authorized by the copyright holders of
that material) supplement the terms of this License with terms:
<p>
a) Disclaiming warranty or limiting liability differently from the
terms of sections 15 and 16 of this License; or
<p>
b) Requiring preservation of specified reasonable legal notices or
author attributions in that material or in the Appropriate Legal
Notices displayed by works containing it; or
<p>
c) Prohibiting misrepresentation of the origin of that material, or
requiring that modified versions of such material be marked in
reasonable ways as different from the original version; or
<p>
d) Limiting the use for publicity purposes of names of licensors or
authors of the material; or
<p>
e) Declining to grant rights under trademark law for use of some
trade names, trademarks, or service marks; or
<p>
f) Requiring indemnification of licensors and authors of that
material by anyone who conveys the material (or modified versions of
it) with contractual assumptions of liability to the recipient, for
any liability that these contractual assumptions directly impose on
those licensors and authors.
<p>
All other non-permissive additional terms are considered "further
restrictions" within the meaning of section 10. If the Program as you
received it, or any part of it, contains a notice stating that it is
governed by this License along with a term that is a further
restriction, you may remove that term. If a license document contains
a further restriction but permits relicensing or conveying under this
License, you may add to a covered work material governed by the terms
of that license document, provided that the further restriction does
not survive such relicensing or conveying.
<p>
If you add terms to a covered work in accord with this section, you
must place, in the relevant source files, a statement of the
additional terms that apply to those files, or a notice indicating
where to find the applicable terms.
<p>
Additional terms, permissive or non-permissive, may be stated in the
form of a separately written license, or stated as exceptions;
the above requirements apply either way.
<p>
8. Termination.
<p>
You may not propagate or modify a covered work except as expressly
provided under this License. Any attempt otherwise to propagate or
modify it is void, and will automatically terminate your rights under
this License (including any patent licenses granted under the third
paragraph of section 11).
<p>
However, if you cease all violation of this License, then your
license from a particular copyright holder is reinstated (a)
provisionally, unless and until the copyright holder explicitly and
finally terminates your license, and (b) permanently, if the copyright
holder fails to notify you of the violation by some reasonable means
prior to 60 days after the cessation.
<p>
Moreover, your license from a particular copyright holder is
reinstated permanently if the copyright holder notifies you of the
violation by some reasonable means, this is the first time you have
received notice of violation of this License (for any work) from that
copyright holder, and you cure the violation prior to 30 days after
your receipt of the notice.
<p>
Termination of your rights under this section does not terminate the
licenses of parties who have received copies or rights from you under
this License. If your rights have been terminated and not permanently
reinstated, you do not qualify to receive new licenses for the same
material under section 10.
<p>
9. Acceptance Not Required for Having Copies.
<p>
You are not required to accept this License in order to receive or
run a copy of the Program. Ancillary propagation of a covered work
occurring solely as a consequence of using peer-to-peer transmission
to receive a copy likewise does not require acceptance. However,
nothing other than this License grants you permission to propagate or
modify any covered work. These actions infringe copyright if you do
not accept this License. Therefore, by modifying or propagating a
covered work, you indicate your acceptance of this License to do so.
<p>
10. Automatic Licensing of Downstream Recipients.
<p>
Each time you convey a covered work, the recipient automatically
receives a license from the original licensors, to run, modify and
propagate that work, subject to this License. You are not responsible
for enforcing compliance by third parties with this License.
<p>
An "entity transaction" is a transaction transferring control of an
organization, or substantially all assets of one, or subdividing an
organization, or merging organizations. If propagation of a covered
work results from an entity transaction, each party to that
transaction who receives a copy of the work also receives whatever
licenses to the work the party's predecessor in interest had or could
give under the previous paragraph, plus a right to possession of the
Corresponding Source of the work from the predecessor in interest, if
the predecessor has it or can get it with reasonable efforts.
<p>
You may not impose any further restrictions on the exercise of the
rights granted or affirmed under this License. For example, you may
not impose a license fee, royalty, or other charge for exercise of
rights granted under this License, and you may not initiate litigation
(including a cross-claim or counterclaim in a lawsuit) alleging that
any patent claim is infringed by making, using, selling, offering for
sale, or importing the Program or any portion of it.
<p>
11. Patents.
<p>
A "contributor" is a copyright holder who authorizes use under this
License of the Program or a work on which the Program is based. The
work thus licensed is called the contributor's "contributor version".
<p>
A contributor's "essential patent claims" are all patent claims
owned or controlled by the contributor, whether already acquired or
hereafter acquired, that would be infringed by some manner, permitted
by this License, of making, using, or selling its contributor version,
but do not include claims that would be infringed only as a
consequence of further modification of the contributor version. For
purposes of this definition, "control" includes the right to grant
patent sublicenses in a manner consistent with the requirements of
this License.
<p>
Each contributor grants you a non-exclusive, worldwide, royalty-free
patent license under the contributor's essential patent claims, to
make, use, sell, offer for sale, import and otherwise run, modify and
propagate the contents of its contributor version.
<p>
In the following three paragraphs, a "patent license" is any express
agreement or commitment, however denominated, not to enforce a patent
(such as an express permission to practice a patent or covenant not to
sue for patent infringement). To "grant" such a patent license to a
party means to make such an agreement or commitment not to enforce a
patent against the party.
<p>
If you convey a covered work, knowingly relying on a patent license,
and the Corresponding Source of the work is not available for anyone
to copy, free of charge and under the terms of this License, through a
publicly available network server or other readily accessible means,
then you must either (1) cause the Corresponding Source to be so
available, or (2) arrange to deprive yourself of the benefit of the
patent license for this particular work, or (3) arrange, in a manner
consistent with the requirements of this License, to extend the patent
license to downstream recipients. "Knowingly relying" means you have
actual knowledge that, but for the patent license, your conveying the
covered work in a country, or your recipient's use of the covered work
in a country, would infringe one or more identifiable patents in that
country that you have reason to believe are valid.
<p>
If, pursuant to or in connection with a single transaction or
arrangement, you convey, or propagate by procuring conveyance of, a
covered work, and grant a patent license to some of the parties
receiving the covered work authorizing them to use, propagate, modify
or convey a specific copy of the covered work, then the patent license
you grant is automatically extended to all recipients of the covered
work and works based on it.
<p>
A patent license is "discriminatory" if it does not include within
the scope of its coverage, prohibits the exercise of, or is
conditioned on the non-exercise of one or more of the rights that are
specifically granted under this License. You may not convey a covered
work if you are a party to an arrangement with a third party that is
in the business of distributing software, under which you make payment
to the third party based on the extent of your activity of conveying
the work, and under which the third party grants, to any of the
parties who would receive the covered work from you, a discriminatory
patent license (a) in connection with copies of the covered work
conveyed by you (or copies made from those copies), or (b) primarily
for and in connection with specific products or compilations that
contain the covered work, unless you entered into that arrangement,
or that patent license was granted, prior to 28 March 2007.
<p>
Nothing in this License shall be construed as excluding or limiting
any implied license or other defenses to infringement that may
otherwise be available to you under applicable patent law.
<p>
12. No Surrender of Others' Freedom.
<p>
If conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License. If you cannot convey a
covered work so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you may
not convey it at all. For example, if you agree to terms that obligate you
to collect a royalty for further conveying from those to whom you convey
the Program, the only way you could satisfy both those terms and this
License would be to refrain entirely from conveying the Program.
<p>
13. Use with the GNU Affero General Public License.
<p>
Notwithstanding any other provision of this License, you have
permission to link or combine any covered work with a work licensed
under version 3 of the GNU Affero General Public License into a single
combined work, and to convey the resulting work. The terms of this
License will continue to apply to the part which is the covered work,
but the special requirements of the GNU Affero General Public License,
section 13, concerning interaction through a network will apply to the
combination as such.
<p>
14. Revised Versions of this License.
<p>
The Free Software Foundation may publish revised and/or new versions of
the GNU General Public License from time to time. Such new versions will
be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.
<p>
Each version is given a distinguishing version number. If the
Program specifies that a certain numbered version of the GNU General
Public License "or any later version" applies to it, you have the
option of following the terms and conditions either of that numbered
version or of any later version published by the Free Software
Foundation. If the Program does not specify a version number of the
GNU General Public License, you may choose any version ever published
by the Free Software Foundation.
<p>
If the Program specifies that a proxy can decide which future
versions of the GNU General Public License can be used, that proxy's
public statement of acceptance of a version permanently authorizes you
to choose that version for the Program.
<p>
Later license versions may give you additional or different
permissions. However, no additional obligations are imposed on any
author or copyright holder as a result of your choosing to follow a
later version.
<p>
15. Disclaimer of Warranty.
<p>
THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
<p>
16. Limitation of Liability.
<p>
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
SUCH DAMAGES.
<p>
17. Interpretation of Sections 15 and 16.
<p>
If the disclaimer of warranty and limitation of liability provided
above cannot be given local legal effect according to their terms,
reviewing courts shall apply local law that most closely approximates
an absolute waiver of all civil liability in connection with the
Program, unless a warranty or assumption of liability accompanies a
copy of the Program in return for a fee.
<p align="center">
<b>END OF TERMS AND CONDITIONS</b>

View file

@ -1,221 +0,0 @@
<pre>
==================================================================
User visible changes for PySol - a solitaire game collection
==================================================================
Changes in 4.82 (02 Sep 2003, 202 games)
* support Python 2.3
- a number of small bug fixes
+ stay tuned for Pysol 5 with *lots* of improvements :-)
Changes in 4.81 (24 Jun 2002, 202 games)
* adapted for new pysol-sound-server 3.00
- fixed Spider-type games
Changes in 4.80 (28 Nov 2001, 202 games)
* support Python 2.2
Changes in 4.73 (28 Sep 2001, 202 games)
- fixed rules of Irmgard
- a number of other bug fixes
Changes in 4.72 (31 May 2001, 202 games)
- fixed a problem when using hints in Black Hole
Changes in 4.71 (20 Apr 2001, 202 games)
* improved dynamic scrollbar handling
* support both Python 1.5, Python 2.0 and Python 2.1 within one package
Changes in 4.70 (05 Mar 2001, 202 games)
* 1 new game
* added dynamic scrollbars
* support both Python 1.5 and Python 2.0 within one package
* fixed some minor problems
Changes in 4.60 (02 Aug 2000, 201 games)
* 6 new games
* added persistent bookmarks
* implemented smart playing that keeps the redo history
* new statistics dialog featuring real 3D bar charts
- Windows: fixed a problem where the sound could cause crashes
- corrected a number of game rules and descriptions
Changes in 4.50 (11 Jun 2000, 195 games)
* added support for small toolbar icons
* added "Alternate Names" to the game selection dialog
* improved the sound dialog
- moved the Mahjongg games to the new PyJongg package
Changes in 4.41 (30 May 2000, 195 games)
* 6 new games
- Windows: avoid loading incompatible DLLs from the system directory
Changes in 4.30 (23 May 2000, 189 games)
* 6 new games
- fixed an internal error in Grasshopper and Double Grasshopper
- corrected rules of Penguin
Changes in 4.20 (27 Apr 2000, 183 games)
* 14 new games, including HexADeck and Memory type variants
* added a "Recent games" menubar entry
* improved statistics dialog
- really fixed the detection of Straights in Poker type games
- fixed a problem when changing the card background
Changes in 4.10 (18 Apr 2000, 169 games)
- fixed a memory leak
Changes in 4.00 (12 Apr 2000, 169 games)
* PySol now plays Tarock type games
* display a floating "Demo" logo while playing demo games
* options are now saved automatically at program exit
- Poker type games: cards for a Straight can now be in any sequence
- fixed a scoring problem in Casino Klondike and Vegas Klondike
Changes in 3.40 (12 Feb 2000, 161 games)
* 3 new games
* updated the pysol-sound-server
- fixed a problem with winning in Golf type games
- some other minor fixes
Changes in 3.30 (26 Jan 2000, 158 games)
* 7 new games
* converted the pysol-sound-server into a Python extension module
Changes in 3.21 (21 Jan 2000, 151 games)
* 2 new games
* updated the pysol-sound-server
- Windows: added the missing PyWinTypes15.dll to the setup file
Changes in 3.20 (18 Jan 2000, 149 games)
* added 8 Hanafuda type games (Oonsoo, Pagoda, MatsuKiri, ...)
* added 2 Poker type games (Poker Shuffle, Poker Square)
* added 13 other new games (Der Katzenschwanz, Perpetual Motion,
Die Schlange, Three Shuffles and a Draw, Vegas Klondike, ...)
* background music is supported under Win32 as well
- corrected redeal rules of La Belle Lucie and Trefoil
- corrected rules of Aces Up
Changes in 3.10 (21 Dec 1999, 126 games)
* 17 new games
* new sound support (including background MP3 and MOD music under Unix)
* added a playable preview dialog (yes, you can play games there :-)
* nice cardset and table-tile select dialogs
* added "Hold and quit" to continue a game on next start
- quite a number of bug and feature fixes
Changes in 3.00 (04 Nov 1999, 111 games)
* bought a new solitaire book and implemented 67 new games :-)
* added a menubar entry for popular games
* new assist function: highlight all cards with the same rank
(shift-click the left mouse button)
* added images for the Talon redeal state
* FreeCell game numbers are now compatible to the FreeCell FAQ
* added a "Next number" button to the game number dialog
* improved statistics and log views
* the bundled version now ships as pre-compiled Python bytecode
because it loads faster and uses much less memory
- corrected some layout problems
Changes in 2.99 (13 Oct 1999, 44 games)
* 1 new game: Lara's Game
* re-enabled the relaxed game variants
* due to popular demand I've finally implemented "Quick play"
* statistics and logs can be exported to a file
* a huge number of other improvements
- saved games are not compatible with previous versions
- some changes in key and mouse bindings
Changes in 2.91 (23 Jun 1999, 43 games)
- check for Python 1.5.2 at program startup
- some other minor fixes
Changes in 2.90 (16 Jun 1999, 43 games)
* added 19 new games (2 games disabled)
* implemented a nice select-game tree dialog
* starting a new game is noticeably faster now
* documentation updated
- PySol now requires Python 1.5.2
Changes in 2.14 (26 May 1999, 24 games)
- fixed rules of Calculation which got broken in 2.02
Changes in 2.13 (13 May 1999, 24 games)
- fixed a small bug in "Select game by number..."
Changes in 2.12 (20 Apr 1999, 24 games)
- another small bug fix
Changes in 2.11 (07 Apr 1999, 24 games)
- some finor fixes
Changes in 2.10 (11 Mar 1999, 24 games)
* major display speed improvements
* added support for background table tiles
* rearranged source code to prepare for a future Gnome, KDE,
wxWindows or JPython/Swing version
- fixed rules of Spider and Divorce which got broken in 2.02
Changes in 2.02 (20 Jan 1999, 24 games)
* 1 new game: Canfield
* new assist function: autoplay
* new assist function: automatic face up
* new assist function: highlight all matching cards
(control-click the left mouse button)
* can change card background
* support for timer-based animations
* improved interaction with the window manager (X11)
Changes in 2.01 (21 Dec 1998, 23 games)
* 4 new games: Eight Off, Dead King Golf, Relaxed Golf and Grandfather's Clock
* created new package PySol-Cardsets - get it from the PySol home page
* implemented a statusbar
* new assist function: highlight all moveable piles
* enabled tearoff menus under Unix
* improved table layout with small and large cardsets
Changes in 2.00 (30 Nov 1998, 19 games)
* 2 new games: Calculation and Numerica
* implemented support for plugins - now you can easily add your own games
* new option to automatically shade legal moves
* added additional cardsets for low and high screen resolutions
* major source code rearrangements
Changes in 1.12 (13 Oct 1998, 17 games)
* display a progress bar during startup
Changes in 1.11 (09 Oct 1998, 17 games)
* 3 new games: Big Harp, Eiffel Tower and Matriarchy
* enhanced statistics, can change player name
* added "Select game by number"
* implemented tooltips
- some fixes for Windows (vanishing menubar, problems when $HOME was
not set, better toplevel geometry)
- corrected rules of Ground for a Divorce
Changes in 1.10 (02 Oct 1998, 14 games)
* 1 new game: Ground for a Divorce
* added a toolbar
* implemented shadows
Changes in 1.03 (26 Sep 1998, 13 games)
* 4 new games: Spider, Relaxed Spider, Braid and Forty Thieves
* middle mouse button (or Control-left) shows partially hidden cards
* menus restructured
* major source code rearrangements
Changes in 1.02 (16 Sep 1998, 9 games)
* 1 new game: Picture Gallery
* added strict-rules variants of FreeCell and Seahaven Towers
* added a small manual page
* improved animation speed
Changes in 1.01 (14 Sep 1998, 6 games)
* 2 new games: FreeCell and Seahaven Towers
* the Undo key is now bound both to 'z' as well as 's'
Changes in 1.00 (10 Sep 1998, 4 games)
* includes 4 games: Gypsy, Irmgard, 8x8 and Klondike
* first public release
</pre>

View file

@ -1,11 +0,0 @@
<h1>PySol - Règles des jeux</h1>
<hr>
<h2>Concepts de base</h2>
<ul>
<li> <a href="glossary.html">Glossaire</a>
</li><li> <a href="general_rules.html">Règles générales</a>
</li></ul>
<h2>Règles des jeux</h2>
<ul>
</ul>

View file

@ -1,13 +0,0 @@
<h1>10 x 8</h1>
Type Klondike. Deux jeux. Donnes illimitées.
<h3>But du jeu</h3>
Déplacez toutes les cartes vers les fondations.
<h3>Description rapide</h3>
Similaire au <a href="8x8.html">8 x 8</a> avec 8 lignes et aux variantes du <a href="../hexadeck.html">Hex A Deck</a>.
<h3>Règles</h3>
Le jeu se joue comme le 8 x 8. Les combinaisons sont formées par ordre décroissant en alternant les couleurs. Les magiciens se jouent dans l'ordre de leur valeur dans le tableau, alternant rouge et noir. Chaque carte ou suite de cartes peut être déposée sur un emplacement vide. Les cartes du talon sont retournées une par une. Les cartes des fondations peuvent être replacées sur le tableau.
<h3>Stratégie</h3>
Essayez de libérer des emplacements.

View file

@ -1,21 +0,0 @@
<h1>8 x 8</h1>
<p>
Type Klondike. 2 jeux. Donnes illimitées.
<h3>But du jeu</h3>
<p>
Déplacez toutes les cartes vers les fondations.
<h3>Règles</h3>
<p>
Les huit piles de cartes dans le tableau sont toutes recouvertes d'une carte visible.
<p>
Les suites sont formées par ordre décroissant, en alternant les couleurs. N'importe quelle carte ou suite de cartes peut être placée sur un emplacement vide.
<p>
Cliquez sur le talon pour retourner une carte. Le nombre de donnes est illimité.
<p>
Les cartes des fondations peuvent être replacées sur le tableau.
<h3>Stratégie</h3>
<p>
Essayez de libérer des emplacements.

View file

@ -1,27 +0,0 @@
<h1>Abacus</h1>
<p>
Type Yukon. 1 jeu. 1 donne.
<h3>But du jeu</h3>
<p>
Déplacez toutes les cartes vers les fondations.
<h3>Description rapide</h3>
<p>
Une combinaison d'éléments de <a href="yukon.html">type Yukon</a> et de <a href="calculation.html">type Calculation</a>.
<h3>Règles</h3>
<p>
Les quatre fondations se construisent par suite croissante de la manière suivante: La première pile en partant de l'As et en ajoutant 1. La seconde pile en partant de 2 et en ajoutant 2. La troisième pile en partant de trois et en ajoutant 3. La quatrième pile en partant de 4 et en ajoutant 4.
<pRE>
Trèfle: A 2 3 4 5 6 7 8 9 10 V D R
Pique: 2 4 6 8 10 D A 3 5 7 9 V R
Cœur: 3 6 9 D 2 5 8 V A 4 7 10 R
Carreau: 4 8 D 3 7 V 2 6 10 A 5 9 R
</pRE>
<p>
Les cartes du tableau doivent former une suite décroissante dans le sens inverse des fondations: Trèfle, en retirant 1, Pique, en retirant 2, Cœur, en retirant 3 et Carreau en retirant 4.
<p>
Les groupes de cartes peuvent être déplacés indépendamment. N'importe quelle carte ou suite de cartes peut être placée sur un emplacement vide.
<p>
Si aucun mouvement n'est possible, cliquez sur le talon. Une carte sera distribuée à chaque pile.

View file

@ -1,23 +0,0 @@
<h1>Aces Up</h1>
<p>
Type 1 jeu de cartes. 1 jeu. 1 donne.
<h3>But du jeu</h3>
<p>
Déplacez toutes les cartes, sauf les As, vers la fondation.
<h3>Règles</h3>
<p>
Déplacez les cartes de valeur plus faible d'une couleur donnée vers la fondation. L'As est la carte ayant la valeur la plus élevée.
<p>
Aucune carte ne peut être déplacée sur le tableau. Une carte peut être placée sur un emplacement vide.
<p>
Si aucun mouvement n'est possible, cliquez sur le talon. Une carte sera distribuée à chaque pile.
<h3>Notes</h3>
<p>
La fonction <i>Déplacer auto</i> est désactivée pour ce jeu.
<h3>Pour info</h3>
<p>
Ce jeu est aussi connu sous les appellations <i>Aces High</i>, <i>Drivel</i> ou <i>Idiot's Delight</i>.

View file

@ -1,16 +0,0 @@
<h1>Ace Up 5</h1>
<p>
Type 1 jeu de cartes. 1 jeu. 1 donne.
<h3>But du jeu</h3>
<p>
Déplacez toutes les cartes, sauf les As, vers la fondation.
<h3>Description rapide</h3>
<p>
Similaire à <a href="acesup.html">Aces Up</a>, avec cinq piles.
<h3>Règles</h3>
<p>
<i>[À venir]
</i>

View file

@ -1,19 +0,0 @@
<h1>Agnes Sorel</h1>
<p>
Type Gypsy. 1 jeu. 1 donne.
<h3>But du jeu</h3>
<p>
Déplacez toutes les cartes vers les fondations.
<h3>Règles</h3>
<p>
Les cartes de mêmes couleurs forment une suite décroissante. Les groupes de cartes de couleurs identiques peuvent être déplacés entièrement.
<p>
Une carte sera distribuée à chaque pile. Il n'y a qu'une seule donne.
<p>
Les fondations sont construites en suite croissante, allant du Roi à l'As Les cartes déposées sur les fondations peuvent être replacées dans le tableau. Double-cliquez sur une carte du tableau pour la placer vers l'une des fondations.
<h3>Stratégie</h3>
<p>
Essayez, autant que possible, de former des suites de couleur de cartes. Essayez d'obtenir un maximum de points, ce jeu étant très difficile.

View file

@ -1,14 +0,0 @@
<h1>Akbar's Conquest</h1>
Type Braid. Deux jeux. Trois donnes.
<h3>But du jeu</h3>
Déplacez toutes les cartes vers les fondations.
<h3>Description rapide</h3>
Similaire au <a href="braid.html">Braid</a> joué avec deux jeux de Mughal <a href="../ganjifa.html">Ganjifa</a>.
<h3>Règles</h3>
Le jeu se joue comme le Braid. Dans cette variante, vous avez deux cordes, dont chacune a sa corde de réserve. Les fondations sont au nombre de seize, placées aux deux extrémités. Les deux colonnes suivantes sont les huit cordes de réserve. Il y a encore deux colonnes contenant quatre réserves générales chacune. Les deux colonnes intérieures sont les deux cordes. Chaque corde reçoit seize cartes. Lorsqu'une corde de réserve se libère, la carte en haut de la corde correspondante y est déposée. Lorsque toutes les cartes d'une corde sont retirées, une carte de l'autre corde est utilisée.
<p>
Le jeu doit son nom à l'inventeur d'un splendide jeu de Ganija à douze couleurs. Ce jeu fût sculpté dans de l'ivoire et peint à la main par des artisans de la cour. Toutes les cartes de ce jeu ont aujourd'hui disparues.
<h3>Stratégie</h3>
Créez des suites où vous pouvez, après avoir tiré une carte correcte du talon. Ce type de jeu est très stratégique et demande beaucoup d'attention.

View file

@ -1,14 +0,0 @@
<h1>Akbar's Triumph</h1>
Type Braid. 1 jeu. Trois donnes.
<h3>But du jeu</h3>
Déplacez toutes les cartes vers les fondations.
<h3>Description rapide</h3>
Similaire au <a href="braid.html">Braid</a> joué avec un jeu de Mughal <a href="../ganjifa.html">Ganjifa</a>.
<h3>Règles</h3>
Le jeu se joue comme le Braid. Dans cette variante, vous avez deux cordes, dont chacune a sa corde de réserve. Les fondations sont au nombre de huit, placées aux deux extrémités. Les deux colonnes suivantes sont les huit cordes de réserve. Il y a encore deux colonnes contenant quatre réserves générales chacune. Les deux colonnes intérieures sont les deux cordes. Chaque corde reçoit douze cartes. Lorsqu'une corde de réserve se libère, la carte en haut de la corde correspondante y est déposée. Lorsque toutes les cartes d'une corde sont retirées, une carte de l'autre corde est utilisée.
<p>
Le jeu doit son nom à l'inventeur d'un splendide jeu de Ganija à douze couleurs. Ce jeu fût sculpté dans de l'ivoire et peint à la main par des artisans de la cour. Toutes les cartes de ce jeu ont aujourd'hui disparues.
<h3>Stratégie</h3>
Créez des suites où vous pouvez, après avoir tiré une carte correcte du talon. Ce type de jeu est très stratégique et demande beaucoup d'attention.

View file

@ -1,16 +0,0 @@
<h1>Alaska</h1>
<p>
Type Yukon. 1 jeu. 1 donne.
<h3>But du jeu</h3>
<p>
Déplacez toutes les cartes vers les fondations.
<h3>Description rapide</h3>
<p>
Similaire au <a href="yukon.html">Yukon</a>, à la différence que les suites peuvent être formées par ordre <b>croissant ou décroissant</b> par couleur de cartes.
<h3>Règles</h3>
<p>
<i>[À venir]
</i>

View file

@ -1,26 +0,0 @@
<h1>All in a Row</h1>
<p>
Type Fan 1 jeu. 1 donne.
<h3>But du jeu</h3>
<p>
Move all cards to the bottom in a single row.
<h3>Règles</h3>
<p>
Les cartes sont empilées dans l'ordre croissant ou décroissant de valeur sans tenir compte des couleurs ni de la couleur de cartes, en enchaînant les suites de manière circulaire, du Roi à l'As et de l'As au Roi.(
<p>
Aucune formation n'est possible dans le tableau. Seule la première carte de chaque pile peu être déplacée.
<p>
N'importe quelle carte peut être jouée en début de jeu.
<h3>Notes</h3>
<p>
La fonction <i>Déplacer auto</i> est désactivée pour ce jeu.
<h3>Stratégie</h3>
<p>
Planifiez votre jeu à l'avance. Un seul mauvais mouvement peu vous empêcher de gagner la partie.

View file

@ -1,16 +0,0 @@
<h1>American Toad</h1>
<p>
Type Canfield. 2 jeux. Deux donnes.
<h3>But du jeu</h3>
<p>
Déplacez toutes les cartes vers les fondations.
<h3>Description rapide</h3>
<p>
Similaire au <a href="doublecanfield.html">Double Canfield</a>, à la différence que les cartes se rangent par couleur de cartes, les cartes sont distribuées une par une, la réserve est ouverte et il n'y a que deux donnes.
<h3>Règles</h3>
<p>
<i>[À venir]
</i>

View file

@ -1,13 +0,0 @@
<h1>Appachan's Waterfall</h1>
Type Dashavatara Ganjifa. 1 jeu. 1 donne.
<h3>But du jeu</h3>
Déplacez toutes les cartes vers la fondation.
<h3>Description rapide</h3>
Formez des suites complètes par ordre décroissant de valeur dans le tableau, puis, déplacez-les ver la fondation par ordre croissant de valeur et par couleur de cartes. Référez-vous à la description générale du <a href="../ganjifa.html">Ganjifa</a> pour l'ordre de couleur de cartes utilisé.
<h3>Règles</h3>
Les cartes sont déplacées sur le tableau par ordre décroissant de valeur sans tenir compte de la couleur de cartes. Les cartes ne peuvent être déplacées vers la fondation que lorsqu'une suite de douze cartes est complétée et seulement par ordre croissant de couleur de cartes. L'ordre des couleurs est le suivant: Le poisson, la tortue, etc. Lorsqu'une suite de couleur peut être déplacée vers la fondation, appuyez sur (a)uto ou jouer avec la fonction Déplacer auto et les douze cartes seront déplacées dans l'ordre. Quatre cartes sont distribuées sur chacune des dix colonnes au début du jeu. Appuyez sur (d)istribuer ou cliquez sur le talon pour distribuer la série suivante de cartes. Les réserves situées de chaque côté de la fondation peuvent recevoir une carte chacune. Les cartes placées dans les réserves ne peuvent être jouées que sur les colonnes.
<h3>Stratégie</h3>
Essayez de rendre jouable chaque colonne avant de distribuer les cartes suivantes. Les cartes ne se rangent que par valeur, il est donc aisé d'essayer de les trier directement par couleur de cartes.

View file

@ -1,14 +0,0 @@
<h1>Ashrafi</h1>
Type Mughal Ganjifa 1 jeu. 1 donne.
<h3>But du jeu</h3>
Déplacez toutes les cartes vers les fondations.
<h3>Description rapide</h3>
Ce jeu est similaire au <a href="freecell.html">Free Cell</a>. Les colonnes sont rangées par valeur uniquement, pas plus de douze cartes par colonne.
<h3>Règles</h3>
Sur le tableau, les cartes sont rangées par ordre décroissant de valeur, sans tenir compte de la couleur de cartes. Chaque colonne est limitée à douze cartes. Les quatre réserves situées sous les fondations peuvent recevoir une carte chacune. Les fondations se construisent par ordre croissant et par couleur de cartes, en commençant par l'As. Seuls les Mirs (rois), peuvent être déposés sur un emplacement vide.
<h3>Stratégie</h3>
Essayez de libérer d'abord les As. Garder les réserves libres autant que possible. Construisez vos suites sur les Mirs, pour dégager le maximum de colonnes.

View file

@ -1,26 +0,0 @@
<h1>Ashta Dikapala</h1>
<p>
Un jeu de Moghul Ganjifa 1 donne.
<h3>But du jeu</h3>
<p>
Ranger les huit gardiens dans l'ordre.
<h3>Règles</h3>
<p>
Ce jeu est similaire à <a href="picturegallery.html">Picture Gallery</a>. On dispose trois colonnes de jeu, une colonne contenant les cartes distribuées du talon et trois réserves acceptant une carte chacune.
<p>
Les cartes doivent être placées dans les trois lignes du haut comme suit:
<ul>
<li>La première ligne commence par un Trois et est construite par des suites incrémentées par trois.
</li><li>La seconde, commence par un deux.
</li><li>La troisième commence par un As.
</li></ul>
<p>
Si vous libérez un espace en bas, il y sera automatiquement placé une carte du talon. Si le talon est vide, vous pouvez placer n'importe quelle carte sur un emplacement vide. Vous pouvez déplacer n'importe quelle carte du vers les cellules vides tant qu'il reste des cartes au talon. Quand le talon est vide, vous pouvez toujours encore déplacer les cartes se trouvant sur les cellules vides. Si plus aucun déplacement n'est possible, cliquez sur le talon pour distribuer une rangée de cartes.
<p>
Vous gagnez si toutes les suites sont rangées dans l'ordre.
<h3>Stratégie</h3>
<p>
Du fait du nombre de piles, le jeu requiert beaucoup de concentration, mais il n'est pas très difficile de réussir.

View file

@ -1,16 +0,0 @@
<h1>Ashwapati</h1>
Type Mughal Ganjifa 1 jeu. Donnes illimitées.
<h3>But du jeu</h3>
Déplacez toutes les cartes vers les fondations.
<h3>Description rapide</h3>
Ce jeu est similaire au <a href="klondike.html">Klondike</a>. Les suites sont formées en ordre décroissant et par couleur de cartes.
<h3>Règles</h3>
Sur le tableau, les cartes sont rangées par ordre décroissant de valeur, dans la même couleur de cartes. Les fondations se construisent par ordre croissant et par couleur de cartes, en commençant par l'As. N'importe quel carte ou suite de cartes peut être déposée sur un emplacement vide. Les cartes du talon sont retournées une par une. Il n'y a pas de limite au nombre de donnes. Les cartes des fondations peuvent être replacées sur le tableau.
<p>
Ce jeu fait partie d'une série de jeux dont les noms finissent par "pati", ce qui signifie "seigneur de". Ashwapati signifie "Lord of Horses", en français 'Seigneur des chevaux". Les noms sont les noms des couleurs de cartes d'un jeu de Ganjifa à douze couleurs.
<h3>Stratégie</h3>
Déplacez les cartes vers les piles les plus basses.

View file

@ -1,19 +0,0 @@
<h1>Auld Lang Syne</h1>
<p>
Type Numerica 1 jeu. 1 donne.
<h3>But du jeu</h3>
<p>
Déplacez toutes les cartes vers les fondations.
<h3>Règles</h3>
<p>
Les fondations se construisent par ordre croissant de valeur sans tenir compte de la couleur de cartes. Les As sont placés en début de partie.
<p>
Il n'y a pas de jeu sur le tableau. Les cartes sont placées directement sur les fondations et les emplacements vides ne peuvent pas être utilisés.
<p>
Si aucun mouvement n'est possible, cliquez sur le talon. Une carte sera distribuée à chaque pile.
<h3>Notes</h3>
<p>
La fonction <i>Déplacer auto</i> est désactivée pour ce jeu.

View file

@ -1,16 +0,0 @@
<h1>Baby Spiderette</h1>
<p>
Type Spider 1 jeu. 1 donne.
<h3>But du jeu</h3>
<p>
Regroupez toutes les cartes par ensemble de 13 cartes par ordre décroissant et par couleur de cartes du Roi jusqu'à l'As et placez ces ensembles sur les fondations.
<h3>Description rapide</h3>
<p>
Similaire à <a href="spiderette.html">Spiderette</a>, mais un peu plus simple, car les groupes formés par <i>&gt;valeur décroissante</i>&gt; peuvent être déplacés.
<h3>Règles</h3>
<p>
<i>[À venir]
</i>

View file

@ -1,14 +0,0 @@
<h1>Bad Seven (Die böse Sieben)</h1>
<p>
Type 2 jeux de cartes. 2 paquets réduits. Deux donnes.
<h3>But du jeu</h3>
<p>
Déplacez toutes les cartes vers les fondations.
<h3>Règles</h3>
<p>
Ce jeu se joue avec deux jeux de cartes réduits.
<p>
<i>[À venir]
</i>

View file

@ -1,13 +0,0 @@
<h1>Type Baker's Dozen</h1>
<p>
Type Baker's Dozen 1 jeu. 1 donne.
<h3>But du jeu</h3>
<p>
Déplacez toutes les cartes vers les fondations.
<h3>Règles</h3>
<p>
Les suites sont formées par ordre décroissant, sans tenir compte de la couleur de cartes. Une seule carte peut être déplacée à la fois.
<p>
Les emplacements libres ne peuvent pas être utilisés. Les Rois sont placés au bas des colonnes de cartes dès le début de la partie.

View file

@ -1,23 +0,0 @@
<h1>Baker's Game</h1>
<p>
Type FreeCell 1 jeu. 1 donne.
<h3>But du jeu</h3>
<p>
Déplacez toutes les cartes vers les fondations.
<h3>Description rapide</h3>
<p>
Similaire au <a href="freecell.html">FreeCell</a>, les suites étant formées par ordre décroissant, par couleur de cartes.
<h3>Règles</h3>
<p>
Toutes les cartes sont distribuées en début de partie. 4 cellules libres sont à votre disposition, qui peuvent recevoir chacune une carte.
<p>
Une carte ne peut être placée que sur une carte de la même couleur de cartes.
<p>
Les cartes ne peuvent être déplacées que par groupe contenant le même nombre de cartes que de cellules libres disponibles. C'est-à-dire que s'il ne reste plus que deux cellules libres, vous ne pourrez déplacer qu'un groupe de deux cartes.
<h3>Pour info</h3>
<p>
Le jeu <i>Baker's Game</i> doit son nom du mathématicien C.L. Baker et fût d'abord publié dans la colonne <i>Mathematical Games</i> de juin 1968 de Martin Gardner dans le journal <i>Scientific American</i>.

View file

@ -1,10 +0,0 @@
<h1>Balarama</h1>
Type Dashavatara Ganjifa 1 jeu. 1 donne.
<h3>But du jeu</h3>
Déplacez toutes les cartes vers les fondations.
<h3>Description rapide</h3>
Les suites sont formées par ordre décroissant, en alternant les couleurs. Pas plus de douze par colonne. Chaque carte ou suite de cartes peut être déposée sur un emplacement vide.
<h3>Règles</h3>
Toutes les cartes sont distribuées aux seize colonnes en début de partie. Les sont regroupées par ordre décroissant en alternant les couleurs. Vois les règles générales du jeu de <a href="../ganjifa.html">Ganjifa</a>, pour plus de détails. Les fondations sont construites par ordre croissant et par couleur. Chaque carte ou suite de cartes peut être déposée sur un emplacement vide. Les quatre réserves peuvent recevoir une carte chacune.
<h3>Stratégie</h3>
Un emplacement libre peut s'avérer plus utile que les réserves. Essayez de libérer des emplacements.

View file

@ -1,16 +0,0 @@
<h1>Batsford</h1>
<p>
Type Klondike. 2 jeux. 1 donne.
<h3>But du jeu</h3>
<p>
Déplacez toutes les cartes vers les fondations.
<h3>Description rapide</h3>
<p>
Similaire au <a href="doubleklondike.html">Double Klondike</a>, avec 10 colonnes, une seule donne et une réserve pouvant recevoir jusqu'à 3 Rois.
<h3>Règles</h3>
<p>
<i>[À venir]
</i>

View file

@ -1,17 +0,0 @@
<h1>Type Beleaguered Castle</h1>
<p>
Type Beleaguered Castle 1 jeu. 1 donne.
<h3>But du jeu</h3>
<p>
Déplacez toutes les cartes vers les fondations.
<h3>Règles</h3>
<p>
Les As sont placés sure les fondations en début de partie.
<p>
Les suites sont formées par ordre décroissant, sans tenir compte de la couleur de cartes. Une seule carte peut-être déplacée à la fois et les emplacements libres ne peuvent recevoir qu'une seule carte.
<h3>Stratégie</h3>
<p>
Formez les fondations équitablement. Essayez de garder toujours, au moins un emplacement de libre.

View file

@ -1,29 +0,0 @@
<h1>Betsy Ross</h1>
<p>
Type 1 jeu de cartes. 1 jeu. 3 donnes.
<h3>But du jeu</h3>
<p>
Déplacez toutes les cartes vers les fondations.
<h3>Description rapide</h3>
<p>
Similaire à <a href="calculation.html">Calculation</a>, utilise une défausse et 3 donnes.
<h3>Règles</h3>
<p>
Les quatre fondations, situées en haut, ne sont pas jouables.
<p>
Les quatre fondations du bas sont formées sans tenir compte de la couleur de cartes et de la manière suivante: La première pile commence par 4, est incrémenté de 2. La troisième pile commence par 6, est incrémentée de 3. La quatrième pile commence par 8, est incrémentée de 4.
<pRE>
1: 2 3 4 5 6 7 8 9 10 V D R
2: 4 6 8 10 D A 3 5 7 9 V R
3: 6 9 D 2 5 8 V A 4 7 10 R
4: 8 D 3 7 V 2 6 10 A 5 9 R
</pRE>
<p>
Cliquez sur le talon pour retourner une carte. Il y a 3 donnes.
<h3>Pour info</h3>
<p>
Ce jeu est connu sous d'autres noms, tels que <i>Fairest</i>, <i>Four Kings</i>, <i>Musical Patience</i>, <i>Quadruple Alliance</i> ou <i>Plus Belle</i>.

View file

@ -1,16 +0,0 @@
<h1>Big Braid</h1>
<p>
Type Napoléon Trois jeux. 3 donnes.
<h3>But du jeu</h3>
<p>
Déplacez toutes les cartes vers les fondations.
<h3>Description rapide</h3>
<p>
Similaire au jeu <a href="braid.html">Braid</a>, avec 3 jeux.
<h3>Règles</h3>
<p>
<i>[À venir]
</i>

View file

@ -1,16 +0,0 @@
<h1>Big Divorce</h1>
<p>
Type Spider Trois jeux. 1 donne.
<h3>But du jeu</h3>
<p>
Déplacez toutes les cartes vers les fondations.
<h3>Description rapide</h3>
<p>
Similaire à <a href="groundsforadivorce.html">Grounds for a Divorce</a>, avec trois jeux et 13 piles de cartes.
<h3>Règles</h3>
<p>
<i>[À venir]
</i>

View file

@ -1,17 +0,0 @@
<h1>Big Easy</h1>
Type Hanafuda 2 jeux. Donnes illimitées.
<h3>But du jeu</h3>
Déplacez toutes les cartes vers les fondations.
<h3>Description rapide</h3>
Il s'agit d'une version double jeu de cartes de <a href="littleeasy.html">Little Easy</a>. Les suites sont formées en ordre décroissant et par couleur de cartes. Les fondations sont formées de cartes de rangs identiques, dans l'ordre des couleurs de cartes. Seule une carte de premier rang peut être placée sur un emplacement libre.
<h3>Règles</h3>
Les règles sont les mêmes que pour le jeu <a href="littleeasy.html">Little Easy</a>.
<h3>Stratégie</h3>
Désactivez "Déplacer auto" et travaillez sur les colonnes du tableau jusqu'à ce que toutes les cartes soient ouvertes. Ces jeux semblent simples par leurs noms et par la façon d'y jouer, mais sont plus difficiles à gagner qu'ils en ont l'air.
<h3>Auteur</h3>
Ce jeu et sa documentation originale sont écrits par <a href="mailto:grania@mailcity.com">T. Kirk</a>.

View file

@ -1,23 +0,0 @@
<h1>Big Harp (Die große Harfe)</h1>
<p>
Type Klondike. 2 jeux. 1 donne.
<h3>But du jeu</h3>
<p>
Déplacez toutes les cartes vers les fondations.
<h3>Description rapide</h3>
<p>
Similaire au <a href="doubleklondike.html">Double Klondike</a>, avec dix piles de cartes, n'importe quelle carte peut être déposée sur un emplacement vide et une seule donne.
<h3>Règles</h3>
<p>
Les suites sont formées par ordre décroissant, en alternant les couleurs. N'importe quelle carte ou suite de cartes peut être placée sur un emplacement vide.
<p>
Les cartes du talon sont retournée sur la défausse, une par une. La première carte de la défausse peut être placée sur l'une des piles du tableau ou sur une des fondations. Il n'y a qu'une seule donne.
<p>
Les cartes des fondations peuvent être replacées sur le tableau.
<h3>Pour info</h3>
<p>
Les jeux <i>Small Harp</i> et <i>Big Harp</i> sont les versions allemandes des jeux <i>Klondike</i> et <i>Double Klondike</i>.

View file

@ -1,16 +0,0 @@
<h1>Big Spider</h1>
<p>
Type Spider Trois jeux. 1 donne.
<h3>But du jeu</h3>
<p>
Déplacez toutes les cartes vers les fondations.
<h3>Description rapide</h3>
<p>
Similaire au <a href="spider.html">Spider</a>, avec trois jeux de cartes et 13 piles de cartes au tableau.
<h3>Règles</h3>
<p>
<i>[À venir]
</i>

View file

@ -1,18 +0,0 @@
<h1>Big Sumo</h1>
Type Hanafuda 2 jeux. 1 donne.
<h3>But du jeu</h3>
Déplacez toutes les cartes vers les fondations.
<h3>Description rapide</h3>
Ce jeu est similaire au <a href="freecell.html">Free Cell</a>. Les suites du tableau sont formées de la première à la quatrième valeur par couleur de cartes et de la quatrième à la première dans les fondations. Seule une carte de premier rang peut être placée sur un emplacement libre.
<h3>Règles</h3>
Ceci est une version à deux jeux de cartes du <a href="sumo.html">Sumo</a>. Les suites sont formées par ordre décroissant de valeur dans le tableau et par ordre croissant dans les fondations. Les cartes de troisième et quatrième rang (ordures), ne sont pas interchangeables. Seule une carte de premier rang ou une série de cartes ordonnées peuvent être placées sur un emplacement vide.
<h3>Stratégie</h3>
Ne placez dans les réserves que des cartes qui peuvent en être retirées.
<h3>Auteur</h3>
<p>
Ce jeu et sa documentation originale sont écrits par <a href="mailto:grania@mailcity.com">T. Kirk</a>.

View file

@ -1,27 +0,0 @@
<h1>Bits n Bytes</h1>
<p>
Type Hex A Deck. 1 jeu. 2 donnes.
<h3>But du jeu</h3>
<p>
Remplissez tous les emplacements du tableau.
<h3>Description rapide</h3>
<p>
Placez sur les cases non-marquées une carte de valeur correspondante à celle placée sur la fondation et sur celle marquée d'une valeur en bit les cartes de valeurs correspondantes.
<h3>Règles</h3>
<p>
En début de partie, la première colonne reçoit quatre cartes de valeurs différentes, une de chaque couleur de cartes, ce sont les cartes "objectif". Les deux colonnes suivantes sont les cases "octet". Elles sont recouvertes par des cartes de valeur égale à celles des cartes "objectif". Les quatre colonnes de droite sont les cases "bit". Elles sont recouvertes par de cartes de couleur identiques à elles des cartes "objectif", dont le bit significatif le plus faible correspond avec celui de la carte "objectif".
<p>
Les cartes du talon sont retournée sur la défausse, deux par deux. Vous avez droit à deux donnes.
<p>
L'unique fonction du magicien dans ce jeu, est de bloquer la défausse au mauvais moment.
<h3>Stratégie</h3>
<p>
Comme il n'y a que quatre cartes de chaque valeur, essayez d'occuper les cases "octet" en premier.
<h3>Auteur</h3>
<p>
Ce jeu et sa documentation originale sont écrits par <a href="mailto:grania@mailcity.com">T. Kirk</a> et font partie intégrante de la version officielle de PySol.

View file

@ -1,21 +0,0 @@
<h1>Black Hole</h1>
<p>
Type Fan 1 jeu. 1 donne.
<h3>But du jeu</h3>
<p>
Déplacez toutes les cartes vers la fondation.
<h3>Règles</h3>
<p>
La fondation the <i>Black Hole</i> ou "trou noir") peu se construire dans l'ordre croissant ou décroissant de valeur sans tenir compte des couleurs ni de la couleur de cartes, en enchaînant les suites de manière circulaire, du Roi à l'As et de l'As au Roi.(
<p>
Aucune formation n'est possible dans le tableau. Seule la carte du dessus peut être déplacée.
<h3>Notes</h3>
<p>
La fonction <i>Déplacer auto</i> est désactivée pour ce jeu.
<h3>Stratégie</h3>
<p>
Planifiez votre jeu à l'avance. Un seul mauvais mouvement peu vous empêcher de gagner la partie.

Some files were not shown because too many files have changed in this diff Show more