├── .github ├── ISSUE_TEMPLATE │ ├── bug_report.yml │ └── feature_request.yml └── workflows │ ├── build.yml │ └── reuse.yml ├── .gitignore ├── .reuse └── dep5 ├── .tx ├── config └── config.license ├── BUILDING.md ├── CODE_OF_CONDUCT.md ├── CONTRIBUTING.md ├── LICENSE ├── LICENSES ├── CC-BY-SA-4.0.txt ├── CC0-1.0.txt ├── LGPL-2.1-only.txt ├── LicenseRef-inno-setup.txt ├── LicenseRef-unrar.txt ├── LicenseRef-visual-cpp-build-tools.txt └── MIT.txt ├── README.md ├── alembicrepo ├── README ├── env.py ├── script.py.mako └── versions │ ├── 0e35fff276f3_stable_versions.py │ └── 402ce1583e3f_initial_config_model.py ├── cddagl ├── VERSION ├── VERSION.license ├── __init__.py ├── __main__.py ├── constants.py ├── functions.py ├── i18n.py ├── launcher.py ├── locale │ ├── es │ │ └── LC_MESSAGES │ │ │ └── cddagl.po │ ├── fr │ │ └── LC_MESSAGES │ │ │ └── cddagl.po │ ├── it │ │ └── LC_MESSAGES │ │ │ └── cddagl.po │ ├── ja │ │ └── LC_MESSAGES │ │ │ └── cddagl.po │ ├── mapping.cfg │ ├── mapping.cfg.license │ └── ru │ │ └── LC_MESSAGES │ │ └── cddagl.po ├── resources │ ├── btc-qr.png │ ├── btc-qr.png.license │ ├── eth-qr.png │ ├── eth-qr.png.license │ ├── launcher.ico │ └── launcher.ico.license ├── sql │ ├── __init__.py │ ├── functions.py │ └── model.py ├── ui │ ├── __init__.py │ └── views │ │ ├── __init__.py │ │ ├── backups.py │ │ ├── dialogs.py │ │ ├── fonts.py │ │ ├── main.py │ │ ├── mods.py │ │ ├── settings.py │ │ ├── soundpacks.py │ │ ├── statistics.py │ │ ├── tabbed.py │ │ └── tilesets.py └── win32.py ├── data ├── mods.json ├── mods.json.license ├── soundpacks.json └── soundpacks.json.license ├── launcher.iss ├── launcher.iss.license ├── requirements-dev.txt ├── requirements.txt ├── setup.py └── third-party ├── inno-setup └── 6.2.0 │ ├── Compil32.exe │ ├── Default.isl │ ├── Examples │ ├── 64Bit.iss │ ├── 64BitThreeArch.iss │ ├── 64BitTwoArch.iss │ ├── AllPagesExample.iss │ ├── CodeAutomation.iss │ ├── CodeAutomation2.iss │ ├── CodeClasses.iss │ ├── CodeDlg.iss │ ├── CodeDll.iss │ ├── CodeDownloadFiles.iss │ ├── CodeExample1.iss │ ├── CodePrepareToInstall.iss │ ├── Components.iss │ ├── Example1.iss │ ├── Example2.iss │ ├── Example3.iss │ ├── ISPPExample1.iss │ ├── ISPPExample1License.txt │ ├── Languages.iss │ ├── License.txt │ ├── MyDll.dll │ ├── MyDll │ │ ├── C# │ │ │ ├── MyDll.cs │ │ │ ├── MyDll.csproj │ │ │ ├── MyDll.sln │ │ │ ├── Properties │ │ │ │ └── AssemblyInfo.cs │ │ │ └── packages.config │ │ ├── C │ │ │ ├── MyDll.c │ │ │ ├── MyDll.def │ │ │ └── MyDll.dsp │ │ └── Delphi │ │ │ └── MyDll.dpr │ ├── MyProg-ARM64.exe │ ├── MyProg-x64.exe │ ├── MyProg.chm │ ├── MyProg.exe │ ├── Readme-Dutch.txt │ ├── Readme-German.txt │ ├── Readme.txt │ ├── UnicodeExample1.iss │ └── UninstallCodeExample1.iss │ ├── ISCC.exe │ ├── ISCmplr.dll │ ├── ISPP.chm │ ├── ISPP.dll │ ├── ISPPBuiltins.iss │ ├── ISetup.chm │ ├── Languages │ ├── Armenian.isl │ ├── BrazilianPortuguese.isl │ ├── Bulgarian.isl │ ├── Catalan.isl │ ├── Corsican.isl │ ├── Czech.isl │ ├── Danish.isl │ ├── Dutch.isl │ ├── Finnish.isl │ ├── French.isl │ ├── German.isl │ ├── Hebrew.isl │ ├── Icelandic.isl │ ├── Italian.isl │ ├── Japanese.isl │ ├── Norwegian.isl │ ├── Polish.isl │ ├── Portuguese.isl │ ├── Russian.isl │ ├── Slovak.isl │ ├── Slovenian.isl │ ├── Spanish.isl │ ├── Turkish.isl │ └── Ukrainian.isl │ ├── Setup.e32 │ ├── SetupClassicIcon.ico │ ├── SetupLdr.e32 │ ├── WizClassicImage-IS.bmp │ ├── WizClassicImage.bmp │ ├── WizClassicSmallImage-IS.bmp │ ├── WizClassicSmallImage.bmp │ ├── isbunzip.dll │ ├── isbzip.dll │ ├── isfaq.url │ ├── islzma.dll │ ├── islzma32.exe │ ├── islzma64.exe │ ├── isscint.dll │ ├── isunzlib.dll │ ├── iszlib.dll │ ├── license.txt │ ├── unins000.dat │ ├── unins000.exe │ ├── unins000.msg │ └── whatsnew.htm ├── pylzma ├── pylzma-0.5.0-cp39-cp39-win_amd64.whl └── pylzma-0.5.0-cp39-cp39-win_amd64.whl.license ├── unrar-command-line-tool ├── UnRAR.exe ├── UnRAR.exe.license ├── license.txt └── license.txt.license └── vs-build-tools ├── .vsconfig ├── .vsconfig.license ├── vs_BuildTools.exe └── vs_BuildTools.exe.license /.github/ISSUE_TEMPLATE/bug_report.yml: -------------------------------------------------------------------------------- 1 | # SPDX-FileCopyrightText: 2022 Gonzalo López 2 | # 3 | # SPDX-License-Identifier: MIT 4 | 5 | name: Bug Report 6 | description: Create a report to help improve the Launcher 7 | # title: "" 8 | labels: ["bug"] 9 | 10 | body: 11 | - type: markdown 12 | attributes: 13 | value: | 14 | Before submitting this issue, please do the following: 15 | - Do a web search for your error. This usually leads to a much better understanding of the issue. 16 | - Prove that the error is indeed a Launcher bug, with a specific set of steps to reproduce. 17 | - Search both the issue tracker (even closed issues) and discussion forums. 18 | - Try to fix it yourself. Keep a list of things you have done to fix the problem. 19 | 20 | If after doing all the above, the problem remains, please continue with this ticket providing *all* the information requested. 21 | 22 | - type: textarea 23 | id: description 24 | attributes: 25 | label: Description 26 | description: A clear and concise description of what the bug is. 27 | placeholder: A clear and concise description of what the bug is. 28 | # value: "" 29 | validations: 30 | required: true 31 | - type: textarea 32 | id: reproduce 33 | attributes: 34 | label: To Reproduce 35 | description: Steps to reproduce the behaviour 36 | placeholder: | 37 | 1. Go to '...' 38 | 2. Click on '....' 39 | 3. Scroll down to '....' 40 | 4. See error 41 | validations: 42 | required: true 43 | - type: textarea 44 | id: expected-behaviour 45 | attributes: 46 | label: Expected behaviour 47 | description: A clear and concise description of what you expected to happen. 48 | placeholder: A clear and concise description of what you expected to happen. 49 | validations: 50 | required: true 51 | - type: textarea 52 | id: screenshots 53 | attributes: 54 | label: Screenshots 55 | description: If applicable, add screenshots to help explain your problem. 56 | placeholder: If applicable, add screenshots to help explain your problem. 57 | validations: 58 | required: false 59 | - type: textarea 60 | id: attempted-fixes 61 | attributes: 62 | label: Attempted Fixes 63 | description: A list of things you have tried to fix the problem, including search engine links. 64 | placeholder: A list of things you have tried to fix the problem, including search engine links. 65 | validations: 66 | required: false 67 | - type: textarea 68 | id: systemetails 69 | attributes: 70 | label: System Details 71 | description: Please add details of your system here. 72 | render: shell 73 | validations: 74 | required: true 75 | - type: textarea 76 | id: additional-context 77 | attributes: 78 | label: Additional context 79 | description: Add any other context about the problem here. 80 | placeholder: Add any other context about the problem here. 81 | validations: 82 | required: false 83 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/feature_request.yml: -------------------------------------------------------------------------------- 1 | # SPDX-FileCopyrightText: 2022 Gonzalo López 2 | # 3 | # SPDX-License-Identifier: MIT 4 | 5 | name: Feature request 6 | description: Suggest an idea for the Launcher 7 | # title: "" 8 | labels: ["enhancement"] 9 | 10 | body: 11 | - type: textarea 12 | attributes: 13 | label: Is your feature request related to a problem? Please describe. 14 | description: A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] 15 | validations: 16 | required: false 17 | 18 | - type: textarea 19 | attributes: 20 | label: Describe the solution you'd like 21 | description: A clear and concise description of what you want to happen. 22 | validations: 23 | required: true 24 | 25 | - type: textarea 26 | attributes: 27 | label: Describe alternatives you've considered 28 | description: A clear and concise description of any alternative solutions or features you've considered. 29 | validations: 30 | required: false 31 | 32 | - type: textarea 33 | attributes: 34 | label: Additional context 35 | description: Add any other context or screenshots about the feature request here. 36 | validations: 37 | required: false 38 | -------------------------------------------------------------------------------- /.github/workflows/build.yml: -------------------------------------------------------------------------------- 1 | # SPDX-FileCopyrightText: 2022 Gonzalo López 2 | # 3 | # SPDX-License-Identifier: MIT 4 | 5 | name: build 6 | 7 | # inspired from https://github.com/wkentaro/labelme/actions/runs/255102432/workflow 8 | 9 | on: 10 | push: 11 | pull_request: 12 | 13 | jobs: 14 | build: 15 | runs-on: ${{ matrix.os }} 16 | strategy: 17 | matrix: 18 | os: [windows-latest] 19 | include: 20 | - os: windows-latest 21 | path: ~\AppData\Local\pip\Cache 22 | python-version: ['3.9'] 23 | 24 | steps: 25 | - uses: actions/checkout@v2 26 | with: 27 | submodules: true 28 | 29 | - uses: actions/setup-python@v2 30 | with: 31 | python-version: ${{ matrix.python-version }} 32 | 33 | - name: Get pip cache dir 34 | id: pip-cache 35 | run: | 36 | echo "::set-output name=dir::$(pip cache dir)" 37 | - name: pip cache 38 | uses: actions/cache@v2 39 | with: 40 | path: ${{ steps.pip-cache.outputs.dir }} 41 | key: ${{ runner.os }}-pip-${{ hashFiles('**/requirements.txt') }} 42 | restore-keys: | 43 | ${{ runner.os }}-pip- 44 | - name: Set up Python 45 | shell: bash -l {0} 46 | env: 47 | PYTHON_VERSION: ${{ matrix.PYTHON_VERSION }} 48 | run: | 49 | which python 50 | python --version 51 | pip --version 52 | pip install SQLAlchemy alembic PyQt5 PyInstaller html5lib cssselect arrow rarfile Babel pypiwin32 pywinutils Markdown Werkzeug httpx 53 | - name: Install dependencies 54 | shell: bash -l {0} 55 | run: | 56 | pip install third-party/pylzma/pylzma-0.5.0-cp39-cp39-win_amd64.whl 57 | - name: Run installer 58 | shell: bash -l {0} 59 | run: | 60 | # Build the standalone executable 61 | python setup.py create_installer -------------------------------------------------------------------------------- /.github/workflows/reuse.yml: -------------------------------------------------------------------------------- 1 | # SPDX-FileCopyrightText: 2022 Free Software Foundation Europe e.V. 2 | # 3 | # SPDX-License-Identifier: CC0-1.0 4 | 5 | name: REUSE Compliance Check 6 | 7 | on: [push, pull_request] 8 | 9 | jobs: 10 | test: 11 | runs-on: ubuntu-latest 12 | steps: 13 | - uses: actions/checkout@v2 14 | - name: REUSE Compliance Check 15 | uses: fsfe/reuse-action@v1 -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # SPDX-FileCopyrightText: 2015-2021 Rémy Roy 2 | # 3 | # SPDX-License-Identifier: MIT 4 | 5 | # Byte-compiled / optimized / DLL files 6 | __pycache__/ 7 | *.py[cod] 8 | 9 | # C extensions 10 | *.so 11 | 12 | # Distribution / packaging 13 | .Python 14 | env/ 15 | .venv/ 16 | build/ 17 | develop-eggs/ 18 | dist/ 19 | downloads/ 20 | eggs/ 21 | .eggs/ 22 | lib/ 23 | lib64/ 24 | parts/ 25 | sdist/ 26 | var/ 27 | *.egg-info/ 28 | .installed.cfg 29 | *.egg 30 | 31 | # PyInstaller 32 | # Usually these files are written by a python script from a template 33 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 34 | *.manifest 35 | *.spec 36 | 37 | # Installer logs 38 | pip-log.txt 39 | pip-delete-this-directory.txt 40 | 41 | # Unit test / coverage reports 42 | htmlcov/ 43 | .tox/ 44 | .coverage 45 | .coverage.* 46 | .cache 47 | nosetests.xml 48 | coverage.xml 49 | *,cover 50 | 51 | # Translations 52 | *.mo 53 | *.pot 54 | 55 | # Django stuff: 56 | *.log 57 | 58 | # Sphinx documentation 59 | docs/_build/ 60 | 61 | # PyBuilder 62 | target/ 63 | 64 | # VS Code 65 | .vscode/* 66 | cddagl/.vs/* 67 | 68 | # PyCharm 69 | .idea/ 70 | -------------------------------------------------------------------------------- /.reuse/dep5: -------------------------------------------------------------------------------- 1 | Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/ 2 | 3 | Files: third-party/inno-setup/* 4 | Copyright: 1997-2022 Jordan Russell. All rights reserved 2000-2022 Martijn Laan. All rights reserved. 5 | License: LicenseRef-inno-setup 6 | -------------------------------------------------------------------------------- /.tx/config: -------------------------------------------------------------------------------- 1 | [main] 2 | host = https://www.transifex.com 3 | 4 | [cdda-game-launcher-project.cddagl-pot] 5 | file_filter = cddagl/locale//LC_MESSAGES/cddagl.po 6 | minimum_perc = 0 7 | source_file = cddagl/locale/cddagl.pot 8 | source_lang = en 9 | type = PO 10 | 11 | -------------------------------------------------------------------------------- /.tx/config.license: -------------------------------------------------------------------------------- 1 | SPDX-FileCopyrightText: 2015-2021 Rémy Roy 2 | 3 | SPDX-License-Identifier: MIT -------------------------------------------------------------------------------- /BUILDING.md: -------------------------------------------------------------------------------- 1 | 6 | 7 | # Building guide 8 | 9 | CDDA Game Launcher is developed using Python. In order to run or build the launcher, you will need to download a recent version of Python and install all the requirements. 10 | 11 | ## Requirements 12 | 13 | The full list of requirements is available in [requirements.txt](requirements.txt). Most of these requirements are Python packages that can be installed using [pip](https://en.wikipedia.org/wiki/Pip_%28package_manager%29). Unfortunately, some of these requirements need build tools which are not easy to use nor easy to install on Windows. Here are those special requirements: 14 | 15 | * pylzma 16 | * Microsoft C++ Build Tools 17 | * Windows 10 SDK 18 | * Inno Setup 19 | 20 | Compiled binaries for lxml and pylzma can be found on [Christoph Gohlke's Unofficial Windows Binaries](http://www.lfd.uci.edu/~gohlke/pythonlibs/). If you are using Python >= 3.5, scandir should already be included. If you are using Python <= 3.4, you can also find compiled binaries for scandir on that website. 21 | 22 | ## Running the launcher 23 | 24 | Once you have Python installed and all the requirements, you can run the launcher by going into the project directory and by running `python -m cddagl`. 25 | 26 | ## Building the launcher installer for distribution 27 | 28 | Once you have Python installed and all the requirements, you can build the launcher installer for distribution by going into the project directory and running `python setup.py create_installer`. This will use the PyInstaller package to create a frozen stand-alone executable with all the dependencies alongside. Afterwards, it will build the installer using Inno Setup. If you want the executable to support RAR archives, you will also need to have the [UnRAR command line tool](http://www.rarlab.com/rar_add.htm) in your PATH (note: a local copy of this utility is already provided in `./third-party/unrar-command-line-tool`) 29 | 30 | The resulting launcher installer should be in the `dist\innosetup` directory. 31 | 32 | ## Step by step guide to run and build the launcher executable 33 | 34 | 1. Download and install Python 3.9 from [python.org](https://www.python.org/downloads/release/python-3910/). The rest of this guide will assume that you are using the 64-bit (x64) version of Python 3.9. 35 | 1. **_Optional but thoroughly recommended_**: Setup a [virtual environment](https://docs.python.org/3.9/library/venv.html). It will make your development experience immensely easier. 36 | 2. Install most requirements by typing the following `pip` command in your command line window: `pip install SQLAlchemy alembic PyQt5 PyInstaller html5lib cssselect arrow rarfile Babel pypiwin32 pywinutils Markdown Werkzeug httpx markdown2 requests` and press `↵ Enter`. 37 | 3. Alternatively, install all the dependencies specified in `requirements.txt`. 38 | 3. Install the `pylzma` package from [Christoph Gohlke's Unofficial Windows Binaries](http://www.lfd.uci.edu/~gohlke/pythonlibs/). `cp39` means CPython 3.9 and `amd64` means 64-bit and in Christoph Gohlke's packages naming convention. The package name you are looking for should be similar to `pylzma-0.5.0-cp39-cp39-win_amd64.whl`. To install `.whl` packages from Christoph Gohlke's Unofficial Windows Binaries page, you can use pip. In your command line window, type: `pip install [path to .whl]` and press `↵ Enter`. 39 | 1. A local copy of a usable pylzma package can be found in `./third-party/pylzma/pylzma-0.5.0-cp39-cp39-win_amd64.whl`, so you can go ahead and `pip install` that one if you have Python 3.9 and a 64-bit Windows installation. 40 | 4. Download the CDDA Game Launcher source code. If you have git installed, you can type the following command in your command line window: `git clone https://github.com/DazedNConfused-/CDDA-Game-Launcher.git`. You can also download the source code from [https://github.com/DazedNConfused-/CDDA-Game-Launcher/archive/master.zip](https://github.com/DazedNConfused-/CDDA-Game-Launcher/archive/master.zip). Make sure to extract the zip file somewhere before trying to run the code. 41 | 5. In your command line window, change directory to the source code directory. Type `cd [path to source code]` and press `↵ Enter`. 42 | 6. See if you can run the launcher by typing the following command in your command line window: `python -m cddagl` and press `↵ Enter`. If you have everything installed correctly, you should see the launcher running. 43 | 7. A local copy of [Inno Setup](http://www.jrsoftware.org/isinfo.php) is already provided in `./third-party/inno-setup/`. It will get automatically picked up during the build process. 44 | 1. If you do not use the default installation provided (ie: you want to use your own local version of Inno Setup), you will have to use the `--compiler=[path to Compil32.exe]` option with the `create_installer` command. 45 | 8. Install the [Microsoft C++ Build Tools](https://visualstudio.microsoft.com/es/visual-cpp-build-tools/), they are required for `pylzma`'s compilation during the build process. 46 | 1. A local offline copy of the Build Tools' installer is already provided in `./third-party/vs-build-tools/vs_BuildTools.exe`. You should mark the [Visual C++ Build Tools](https://stackoverflow.com/a/55370133) and the [Windows 10 SDK](https://developer.microsoft.com/en-US/windows/downloads/windows-10-sdk) (listed in the optional components) for installation. 47 | 1. Alternatively, you can import the needed configuration already exported as `./third-party/vs-build-tools/.vsconfig` and the Build Tools' installer shall take care of the rest without further user input. 48 | 10. To build the launcher installer, type the following command in your command line window: `python setup.py create_installer` and press `↵ Enter`. The resulting launcher installer should be in the `dist\innosetup` subdirectory. 49 | -------------------------------------------------------------------------------- /CODE_OF_CONDUCT.md: -------------------------------------------------------------------------------- 1 | 6 | 7 | # Contributor Covenant Code of Conduct 8 | 9 | ## Our Pledge 10 | 11 | In the interest of fostering an open and welcoming environment, we as 12 | contributors and maintainers pledge to making participation in our project and 13 | our community a harassment-free experience for everyone, regardless of age, body 14 | size, disability, ethnicity, sex characteristics, gender identity and expression, 15 | level of experience, education, socio-economic status, nationality, personal 16 | appearance, race, religion, or sexual identity and orientation. 17 | 18 | ## Our Standards 19 | 20 | Examples of behavior that contributes to creating a positive environment 21 | include: 22 | 23 | * Using welcoming and inclusive language 24 | * Being respectful of differing viewpoints and experiences 25 | * Gracefully accepting constructive criticism 26 | * Focusing on what is best for the community 27 | * Showing empathy towards other community members 28 | 29 | Examples of unacceptable behavior by participants include: 30 | 31 | * The use of sexualized language or imagery and unwelcome sexual attention or 32 | advances 33 | * Trolling, insulting/derogatory comments, and personal or political attacks 34 | * Public or private harassment 35 | * Publishing others' private information, such as a physical or electronic 36 | address, without explicit permission 37 | * Other conduct which could reasonably be considered inappropriate in a 38 | professional setting 39 | 40 | ## Our Responsibilities 41 | 42 | Project maintainers are responsible for clarifying the standards of acceptable 43 | behavior and are expected to take appropriate and fair corrective action in 44 | response to any instances of unacceptable behavior. 45 | 46 | Project maintainers have the right and responsibility to remove, edit, or 47 | reject comments, commits, code, wiki edits, issues, and other contributions 48 | that are not aligned to this Code of Conduct, or to ban temporarily or 49 | permanently any contributor for other behaviors that they deem inappropriate, 50 | threatening, offensive, or harmful. 51 | 52 | ## Scope 53 | 54 | This Code of Conduct applies within all project spaces, and it also applies when 55 | an individual is representing the project or its community in public spaces. 56 | Examples of representing a project or community include using an official 57 | project e-mail address, posting via an official social media account, or acting 58 | as an appointed representative at an online or offline event. Representation of 59 | a project may be further defined and clarified by project maintainers. 60 | 61 | ## Enforcement 62 | 63 | Instances of abusive, harassing, or otherwise unacceptable behavior may be 64 | reported by contacting the project team at remyroy@remyroy.com . All 65 | complaints will be reviewed and investigated and will result in a response that 66 | is deemed necessary and appropriate to the circumstances. The project team is 67 | obligated to maintain confidentiality with regard to the reporter of an incident. 68 | Further details of specific enforcement policies may be posted separately. 69 | 70 | Project maintainers who do not follow or enforce the Code of Conduct in good 71 | faith may face temporary or permanent repercussions as determined by other 72 | members of the project's leadership. 73 | 74 | ## Attribution 75 | 76 | This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, 77 | available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html 78 | 79 | [homepage]: https://www.contributor-covenant.org 80 | 81 | For answers to common questions about this code of conduct, see 82 | https://www.contributor-covenant.org/faq 83 | 84 | -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | 6 | 7 | # Contributing to this project 8 | 9 | Please take a moment to review this document in order to make the contribution 10 | process easy and effective for everyone involved. 11 | 12 | Following these guidelines helps to communicate that you respect the time of 13 | the developers managing and developing this open source project. In return, 14 | they should reciprocate that respect in addressing your issue or assessing 15 | patches and features. 16 | 17 | 18 | ## Using the issue tracker 19 | 20 | The issue tracker is the preferred channel for [bug reports](#bugs), 21 | [features requests](#features) and [submitting pull 22 | requests](#pull-requests), but please respect the following restrictions: 23 | 24 | * Please **do not** use the issue tracker for personal support requests (use 25 | [Stack Overflow](http://stackoverflow.com) or IRC). 26 | 27 | * Please **do not** derail or troll issues. Keep the discussion on topic and 28 | respect the opinions of others. 29 | 30 | 31 | 32 | ## Translations 33 | 34 | CDDA Game Launcher translations are hosted in Transifex. Transifex is a service 35 | with a straightforward web interface to let contributors help with untranslated text. 36 | 37 | Anyone is welcome to create or improve translations directly from 38 | [our project's page in Transifex](https://www.transifex.com/cdda-game-launcher/cdda-game-launcher-project/) 39 | after a simple registration process. 40 | 41 | 42 | 43 | ## Bug reports 44 | 45 | A bug is a _demonstrable problem_ that is caused by the code in the repository. 46 | Good bug reports are extremely helpful - thank you! 47 | 48 | Guidelines for bug reports: 49 | 50 | 1. **Use the GitHub issue search** — check if the issue has already been 51 | reported. 52 | 53 | 2. **Check if the issue has been fixed** — try to reproduce it using the 54 | latest `master` or development branch in the repository. 55 | 56 | 3. **Isolate the problem** — create a [reduced test 57 | case](http://css-tricks.com/reduced-test-cases/) and a live example. 58 | 59 | A good bug report shouldn't leave others needing to chase you up for more 60 | information. Please try to be as detailed as possible in your report. What is 61 | your environment? What steps will reproduce the issue? What browser(s) and OS 62 | experience the problem? What would you expect to be the outcome? All these 63 | details will help people to fix any potential bugs. [Report bugs effectively](https://www.chiark.greenend.org.uk/~sgtatham/bugs.html). 64 | 65 | Example: 66 | 67 | > Short and descriptive example bug report title 68 | > 69 | > A summary of the issue and the browser/OS environment in which it occurs. If 70 | > suitable, include the steps required to reproduce the bug. 71 | > 72 | > 1. This is the first step 73 | > 2. This is the second step 74 | > 3. Further steps, etc. 75 | > 76 | > `` - a link to the reduced test case 77 | > 78 | > Any other information you want to share that is relevant to the issue being 79 | > reported. This might include the lines of code that you have identified as 80 | > causing the bug, and potential solutions (and your opinions on their 81 | > merits). 82 | 83 | 84 | 85 | ## Feature requests 86 | 87 | Feature requests are welcome. But take a moment to find out whether your idea 88 | fits with the scope and aims of the project. It's up to *you* to make a strong 89 | case to convince the project's developers of the merits of this feature. Please 90 | provide as much detail and context as possible. 91 | 92 | 93 | 94 | ## Pull requests 95 | 96 | Good pull requests - patches, improvements, new features - are a fantastic 97 | help. They should remain focused in scope and avoid containing unrelated 98 | commits. 99 | 100 | **Please ask first** before embarking on any significant pull request (e.g. 101 | implementing features, refactoring code, porting to a different language), 102 | otherwise you risk spending a lot of time working on something that the 103 | project's developers might not want to merge into the project. 104 | 105 | Please adhere to the coding conventions used throughout a project (indentation, 106 | accurate comments, etc.) and any other requirements (such as test coverage). 107 | 108 | Follow this process if you'd like your work considered for inclusion in the 109 | project: 110 | 111 | 1. [Fork](http://help.github.com/fork-a-repo/) the project, clone your fork, 112 | and configure the remotes: 113 | 114 | ```bash 115 | # Clone your fork of the repo into the current directory 116 | git clone https://github.com// 117 | # Navigate to the newly cloned directory 118 | cd 119 | # Assign the original repo to a remote called "upstream" 120 | git remote add upstream https://github.com// 121 | ``` 122 | 123 | 2. If you cloned a while ago, get the latest changes from upstream: 124 | 125 | ```bash 126 | git checkout 127 | git pull upstream 128 | ``` 129 | 130 | 3. Create a new topic branch (off the main project development branch) to 131 | contain your feature, change, or fix: 132 | 133 | ```bash 134 | git checkout -b 135 | ``` 136 | 137 | 4. Commit your changes in logical chunks. Please adhere to these [git commit 138 | message guidelines](http://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html) 139 | or your code is unlikely be merged into the main project. Use Git's 140 | [interactive rebase](https://help.github.com/articles/interactive-rebase) 141 | feature to tidy up your commits before making them public. 142 | 143 | 5. Locally merge (or rebase) the upstream development branch into your topic branch: 144 | 145 | ```bash 146 | git pull [--rebase] upstream 147 | ``` 148 | 149 | 6. Push your topic branch up to your fork: 150 | 151 | ```bash 152 | git push origin 153 | ``` 154 | 155 | 7. [Open a Pull Request](https://help.github.com/articles/using-pull-requests/) 156 | with a clear title and description. 157 | 158 | **IMPORTANT**: By submitting a patch, you agree to allow the project owner to 159 | license your work under the same license as that used by the project. 160 | 161 | ## Code of conduct 162 | 163 | Participants in this projet are expected to follow [the Code of Conduct](CODE_OF_CONDUCT.md). 164 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2015-2021 Rémy Roy 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /LICENSES/CC0-1.0.txt: -------------------------------------------------------------------------------- 1 | Creative Commons Legal Code 2 | 3 | CC0 1.0 Universal 4 | 5 | CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE 6 | LEGAL SERVICES. DISTRIBUTION OF THIS DOCUMENT DOES NOT CREATE AN 7 | ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS 8 | INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES 9 | REGARDING THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS 10 | PROVIDED HEREUNDER, AND DISCLAIMS LIABILITY FOR DAMAGES RESULTING FROM 11 | THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS PROVIDED 12 | HEREUNDER. 13 | 14 | Statement of Purpose 15 | 16 | The laws of most jurisdictions throughout the world automatically confer 17 | exclusive Copyright and Related Rights (defined below) upon the creator 18 | and subsequent owner(s) (each and all, an "owner") of an original work of 19 | authorship and/or a database (each, a "Work"). 20 | 21 | Certain owners wish to permanently relinquish those rights to a Work for 22 | the purpose of contributing to a commons of creative, cultural and 23 | scientific works ("Commons") that the public can reliably and without fear 24 | of later claims of infringement build upon, modify, incorporate in other 25 | works, reuse and redistribute as freely as possible in any form whatsoever 26 | and for any purposes, including without limitation commercial purposes. 27 | These owners may contribute to the Commons to promote the ideal of a free 28 | culture and the further production of creative, cultural and scientific 29 | works, or to gain reputation or greater distribution for their Work in 30 | part through the use and efforts of others. 31 | 32 | For these and/or other purposes and motivations, and without any 33 | expectation of additional consideration or compensation, the person 34 | associating CC0 with a Work (the "Affirmer"), to the extent that he or she 35 | is an owner of Copyright and Related Rights in the Work, voluntarily 36 | elects to apply CC0 to the Work and publicly distribute the Work under its 37 | terms, with knowledge of his or her Copyright and Related Rights in the 38 | Work and the meaning and intended legal effect of CC0 on those rights. 39 | 40 | 1. Copyright and Related Rights. A Work made available under CC0 may be 41 | protected by copyright and related or neighboring rights ("Copyright and 42 | Related Rights"). Copyright and Related Rights include, but are not 43 | limited to, the following: 44 | 45 | i. the right to reproduce, adapt, distribute, perform, display, 46 | communicate, and translate a Work; 47 | ii. moral rights retained by the original author(s) and/or performer(s); 48 | iii. publicity and privacy rights pertaining to a person's image or 49 | likeness depicted in a Work; 50 | iv. rights protecting against unfair competition in regards to a Work, 51 | subject to the limitations in paragraph 4(a), below; 52 | v. rights protecting the extraction, dissemination, use and reuse of data 53 | in a Work; 54 | vi. database rights (such as those arising under Directive 96/9/EC of the 55 | European Parliament and of the Council of 11 March 1996 on the legal 56 | protection of databases, and under any national implementation 57 | thereof, including any amended or successor version of such 58 | directive); and 59 | vii. other similar, equivalent or corresponding rights throughout the 60 | world based on applicable law or treaty, and any national 61 | implementations thereof. 62 | 63 | 2. Waiver. To the greatest extent permitted by, but not in contravention 64 | of, applicable law, Affirmer hereby overtly, fully, permanently, 65 | irrevocably and unconditionally waives, abandons, and surrenders all of 66 | Affirmer's Copyright and Related Rights and associated claims and causes 67 | of action, whether now known or unknown (including existing as well as 68 | future claims and causes of action), in the Work (i) in all territories 69 | worldwide, (ii) for the maximum duration provided by applicable law or 70 | treaty (including future time extensions), (iii) in any current or future 71 | medium and for any number of copies, and (iv) for any purpose whatsoever, 72 | including without limitation commercial, advertising or promotional 73 | purposes (the "Waiver"). Affirmer makes the Waiver for the benefit of each 74 | member of the public at large and to the detriment of Affirmer's heirs and 75 | successors, fully intending that such Waiver shall not be subject to 76 | revocation, rescission, cancellation, termination, or any other legal or 77 | equitable action to disrupt the quiet enjoyment of the Work by the public 78 | as contemplated by Affirmer's express Statement of Purpose. 79 | 80 | 3. Public License Fallback. Should any part of the Waiver for any reason 81 | be judged legally invalid or ineffective under applicable law, then the 82 | Waiver shall be preserved to the maximum extent permitted taking into 83 | account Affirmer's express Statement of Purpose. In addition, to the 84 | extent the Waiver is so judged Affirmer hereby grants to each affected 85 | person a royalty-free, non transferable, non sublicensable, non exclusive, 86 | irrevocable and unconditional license to exercise Affirmer's Copyright and 87 | Related Rights in the Work (i) in all territories worldwide, (ii) for the 88 | maximum duration provided by applicable law or treaty (including future 89 | time extensions), (iii) in any current or future medium and for any number 90 | of copies, and (iv) for any purpose whatsoever, including without 91 | limitation commercial, advertising or promotional purposes (the 92 | "License"). The License shall be deemed effective as of the date CC0 was 93 | applied by Affirmer to the Work. Should any part of the License for any 94 | reason be judged legally invalid or ineffective under applicable law, such 95 | partial invalidity or ineffectiveness shall not invalidate the remainder 96 | of the License, and in such case Affirmer hereby affirms that he or she 97 | will not (i) exercise any of his or her remaining Copyright and Related 98 | Rights in the Work or (ii) assert any associated claims and causes of 99 | action with respect to the Work, in either case contrary to Affirmer's 100 | express Statement of Purpose. 101 | 102 | 4. Limitations and Disclaimers. 103 | 104 | a. No trademark or patent rights held by Affirmer are waived, abandoned, 105 | surrendered, licensed or otherwise affected by this document. 106 | b. Affirmer offers the Work as-is and makes no representations or 107 | warranties of any kind concerning the Work, express, implied, 108 | statutory or otherwise, including without limitation warranties of 109 | title, merchantability, fitness for a particular purpose, non 110 | infringement, or the absence of latent or other defects, accuracy, or 111 | the present or absence of errors, whether or not discoverable, all to 112 | the greatest extent permissible under applicable law. 113 | c. Affirmer disclaims responsibility for clearing rights of other persons 114 | that may apply to the Work or any use thereof, including without 115 | limitation any person's Copyright and Related Rights in the Work. 116 | Further, Affirmer disclaims responsibility for obtaining any necessary 117 | consents, permissions or other rights required for any use of the 118 | Work. 119 | d. Affirmer understands and acknowledges that Creative Commons is not a 120 | party to this document and has no duty or obligation with respect to 121 | this CC0 or use of the Work. 122 | -------------------------------------------------------------------------------- /LICENSES/LicenseRef-inno-setup.txt: -------------------------------------------------------------------------------- 1 | Inno Setup License 2 | ================== 3 | 4 | Except where otherwise noted, all of the documentation and software included in the Inno Setup 5 | package is copyrighted by Jordan Russell. 6 | 7 | Copyright (C) 1997-2021 Jordan Russell. All rights reserved. 8 | Portions Copyright (C) 2000-2021 Martijn Laan. All rights reserved. 9 | 10 | This software is provided "as-is," without any express or implied warranty. In no event shall the 11 | author be held liable for any damages arising from the use of this software. 12 | 13 | Permission is granted to anyone to use this software for any purpose, including commercial 14 | applications, and to alter and redistribute it, provided that the following conditions are met: 15 | 16 | 1. All redistributions of source code files must retain all copyright notices that are currently in 17 | place, and this list of conditions without modification. 18 | 19 | 2. All redistributions in binary form must retain all occurrences of the above copyright notice and 20 | web site addresses that are currently in place (for example, in the About boxes). 21 | 22 | 3. The origin of this software must not be misrepresented; you must not claim that you wrote the 23 | original software. If you use this software to distribute a product, an acknowledgment in the 24 | product documentation would be appreciated but is not required. 25 | 26 | 4. Modified versions in source or binary form must be plainly marked as such, and must not be 27 | misrepresented as being the original software. 28 | 29 | 30 | Jordan Russell 31 | jr-2020 AT jrsoftware.org 32 | https://jrsoftware.org/ -------------------------------------------------------------------------------- /LICENSES/LicenseRef-unrar.txt: -------------------------------------------------------------------------------- 1 | ****** ***** ****** UnRAR - free utility for RAR archives 2 | ** ** ** ** ** ** ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3 | ****** ******* ****** License for use and distribution of 4 | ** ** ** ** ** ** ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 5 | ** ** ** ** ** ** FREEWARE version 6 | ~~~~~~~~~~~~~~~~ 7 | 8 | The UnRAR utility is freeware. This means: 9 | 10 | 1. All copyrights to RAR and the utility UnRAR are exclusively 11 | owned by the author - Alexander Roshal. 12 | 13 | 2. The UnRAR utility may be freely distributed. It is allowed 14 | to distribute UnRAR inside of other software packages. 15 | 16 | 3. THE RAR ARCHIVER AND THE UnRAR UTILITY ARE DISTRIBUTED "AS IS". 17 | NO WARRANTY OF ANY KIND IS EXPRESSED OR IMPLIED. YOU USE AT 18 | YOUR OWN RISK. THE AUTHOR WILL NOT BE LIABLE FOR DATA LOSS, 19 | DAMAGES, LOSS OF PROFITS OR ANY OTHER KIND OF LOSS WHILE USING 20 | OR MISUSING THIS SOFTWARE. 21 | 22 | 4. Neither RAR binary code, WinRAR binary code, UnRAR source or UnRAR 23 | binary code may be used or reverse engineered to re-create the RAR 24 | compression algorithm, which is proprietary, without written 25 | permission of the author. 26 | 27 | 5. If you don't agree with terms of the license you must remove 28 | UnRAR files from your storage devices and cease to use the 29 | utility. 30 | 31 | Thank you for your interest in RAR and UnRAR. 32 | 33 | 34 | Alexander L. Roshal -------------------------------------------------------------------------------- /LICENSES/LicenseRef-visual-cpp-build-tools.txt: -------------------------------------------------------------------------------- 1 | MICROSOFT SOFTWARE LICENSE TERMS 2 | 3 | MICROSOFT VISUAL C++ BUILD TOOLS 4 | 5 | These license terms are an agreement between Microsoft Corporation (or based on where you live, one of its affiliates) and you. They apply to the software named above. The terms also apply to any Microsoft services or updates for the software, except to the extent those have different terms. 6 | 7 | IF YOU COMPLY WITH THESE LICENSE TERMS, YOU HAVE THE RIGHTS BELOW. 8 | 9 | INSTALLATION AND USE RIGHTS. 10 | One user may use copies of the software to develop and test their applications. 11 | DATA. The software may collect information about you and your use of the software, and send that to Microsoft. Microsoft may use this information to provide services and improve our products and services. You may opt-out of many of these scenarios, but not all, as described in the product documentation. There are also some features in the software that may enable you to collect data from users of your applications. If you use these features to enable data collection in your applications, you must comply with applicable law, including providing appropriate notices to users of your applications. You can learn more about data collection and use in the help documentation and the privacy statement at http://go.microsoft.com/fwlink/?LinkID=528096 . Your use of the software operates as your consent to these practices. 12 | TERMS FOR SPECIFIC COMPONENTS. 13 | Build Server. The software may contain some Build Server components listed in BuildServer.TXT files, and/or any files listed on the BuildeServer list located following this Microsoft Software License Terms. You may copy and install those items, if included in the software, onto your build machines. You and others in your organization may use these items on your build machines solely for the purpose of compiling, building, verifying and archiving your applications or running quality or performance tests as part of the build process. 14 | Microsoft Platforms. The software may include components from Microsoft Windows; Microsoft Windows Server; Microsoft SQL Server; Microsoft Exchange; Microsoft Office; and Microsoft SharePoint. These components are governed by separate agreements and their own product support policies, as described in the license terms found in the installation directory for that component or in the “Licenses” folder accompanying the software. 15 | Third Party Components. The software may include third party components with separate legal notices or governed by other agreements, as described in the ThirdPartyNotices file accompanying the software. Even if such components are governed by other agreements, the disclaimers and the limitations on and exclusions of damages below also apply. 16 | Package Managers. The software may include package managers, like Nuget, that give you the option to download other Microsoft and third party software packages to use with your application. Those packages are under their own licenses, and not this agreement. Microsoft does not distribute, license or provide any warranties for any of the third party packages. 17 | SCOPE OF LICENSE. The software is licensed, not sold. This agreement only gives you some rights to use the software. Microsoft reserves all other rights. Unless applicable law gives you more rights despite this limitation, you may use the software only as expressly permitted in this agreement. In doing so, you must comply with any technical limitations in the software that only allow you to use it in certain ways. . For more information, see www.microsoft.com/licensing. You may not 18 | work around any technical limitations in the software; 19 | reverse engineer, decompile or disassemble the software, or attempt to do so, except and only to the extent required by third party licensing terms governing use of certain open source components that may be included with the software; 20 | remove, minimize, block or modify any notices of Microsoft or its suppliers; 21 | use the software in any way that is against the law; or 22 | share, publish, rent or lease the software, or provide the software as a stand-alone hosted as solution for others to use. 23 | EXPORT RESTRICTIONS. You must comply with all domestic and international export laws and regulations that apply to the software, which include restrictions on destinations, end users and end use. For further information on export restrictions, visit (aka.ms/exporting). 24 | SUPPORT SERVICES. Because this software is “as is,” we may not provide support services for it. 25 | ENTIRE AGREEMENT. This agreement, and the terms for supplements, updates, Internet-based services and support services that you use, are the entire agreement for the software and support services. 26 | APPLICABLE LAW. If you acquired the software in the United States, Washington law applies to interpretation of and claims for breach of this agreement, and the laws of the state where you live apply to all other claims. If you acquired the software in any other country, its laws apply. 27 | CONSUMER RIGHTS; REGIONAL VARIATIONS. This agreement describes certain legal rights. You may have other rights, including consumer rights, under the laws of your state or country. Separate and apart from your relationship with Microsoft, you may also have rights with respect to the party from which you acquired the software. This agreement does not change those other rights if the laws of your state or country do not permit it to do so. For example, if you acquired the software in one of the below regions, or mandatory country law applies, then the following provisions apply to you: 28 | Australia. You have statutory guarantees under the Australian Consumer Law and nothing in this agreement is intended to affect those rights. 29 | Canada. If you acquired this software in Canada, you may stop receiving updates by turning off the automatic update feature, disconnecting your device from the Internet (if and when you re-connect to the Internet, however, the software will resume checking for and installing updates), or uninstalling the software. The product documentation, if any, may also specify how to turn off updates for your specific device or software. 30 | Germany and Austria. 31 | Warranty. The properly licensed software will perform substantially as described in any Microsoft materials that accompany the software. However, Microsoft gives no contractual guarantee in relation to the licensed software. 32 | Limitation of Liability. In case of intentional conduct, gross negligence, claims based on the Product Liability Act, as well as, in case of death or personal or physical injury, Microsoft is liable according to the statutory law.Subject to the foregoing clause (ii), Microsoft will only be liable for slight negligence if Microsoft is in breach of such material contractual obligations, the fulfillment of which facilitate the due performance of this agreement, the breach of which would endanger the purpose of this agreement and the compliance with which a party may constantly trust in (so-called “cardinal obligations”). In other cases of slight negligence, Microsoft will not be liable for slight negligence. 33 | LEGAL EFFECT. This agreement describes certain legal rights. You may have other rights under the laws of your state or country. This agreement does not change your rights under the laws of your state or country if the laws of your state or country do not permit it to do so. Without limitation of the foregoing, for Australia, YOU HAVE STATUTORY GUARANTEES UNDER THE AUSTRALIAN CONSUMER LAW AND NOTHING IN THESE TERMS IS INTENDED TO AFFECT THOSE RIGHTS 34 | DISCLAIMER OF WARRANTY. THE SOFTWARE IS LICENSED “AS-IS.” YOU BEAR THE RISK OF USING IT. MICROSOFT GIVES NO EXPRESS WARRANTIES, GUARANTEES OR CONDITIONS. TO THE EXTENT PERMITTED UNDER YOUR LOCAL LAWS, MICROSOFT EXCLUDES THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 35 | LIMITATION ON AND EXCLUSION OF DAMAGES. YOU CAN RECOVER FROM MICROSOFT AND ITS SUPPLIERS ONLY DIRECT DAMAGES UP TO U.S. $5.00. YOU CANNOT RECOVER ANY OTHER DAMAGES, INCLUDING CONSEQUENTIAL, LOST PROFITS, SPECIAL, INDIRECT OR INCIDENTAL DAMAGES. 36 | This limitation applies to (a) anything related to the software, services, content (including code) on third party Internet sites, or third party applications; and (b) claims for breach of contract, breach of warranty, guarantee or condition, strict liability, negligence, or other tort to the extent permitted by applicable law.It also applies even if Microsoft knew or should have known about the possibility of the damages. The above limitation or exclusion may not apply to you because your country may not allow the exclusion or limitation of incidental, consequential or other damages. 37 | 38 | Please note: As this software is distributed in Quebec, Canada, some of the clauses in this agreement are provided below in French. 39 | 40 | Remarque : Ce logiciel étant distribué au Québec, Canada, certaines des clauses dans ce contrat sont fournies ci-dessous en français. 41 | 42 | 43 | 44 | EXONÉRATION DE GARANTIE. Le logiciel visé par une licence est offert « tel quel ». Toute utilisation de ce logiciel est à votre seule risque et péril. Microsoft n’accorde aucune autre garantie expresse. Vous pouvez bénéficier de droits additionnels en vertu du droit local sur la protection des consommateurs, que ce contrat ne peut modifier. La ou elles sont permises par le droit locale, les garanties implicites de qualité marchande, d’adéquation à un usage particulier et d’absence de contrefaçon sont exclues. 45 | 46 | 47 | 48 | LIMITATION DES DOMMAGES-INTÉRÊTS ET EXCLUSION DE RESPONSABILITÉ POUR LES DOMMAGES. Vous pouvez obtenir de Microsoft et de ses fournisseurs une indemnisation en cas de dommages directs uniquement à hauteur de 5,00 $ US. Vous ne pouvez prétendre à aucune indemnisation pour les autres dommages, y compris les dommages spéciaux, indirects ou accessoires et pertes de bénéfices. 49 | 50 | Cette limitation concerne: 51 | 52 | tout ce qui est relié au logiciel, aux services ou au contenu (y compris le code) figurant sur des sites Internet tiers ou dans des programmes tiers ; etet 53 | 54 | les réclamations au titre de violation de contrat ou de garantie, ou au titre de responsabilité stricte, de négligence ou d’une autre faute dans la limite autorisée par la loi en vigueur. 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | Elle s’applique également, même si Microsoft connaissait ou devrait connaître l’éventualité d’un tel dommage. Si votre pays n’autorise pas l’exclusion ou la limitation de responsabilité pour les dommages indirects, accessoires ou de quelque nature que ce soit, il se peut que la limitation ou l’exclusion ci-dessus ne s’appliquera pas à votre égard. 67 | 68 | EFFET JURIDIQUE. Le présent contrat décrit certains droits juridiques. Vous pourriez avoir d’autres droits prévus par les lois de votre pays. Le présent contrat ne modifie pas les droits que vous confèrent les lois de votre pays si celles-ci ne le permettent pas. 69 | -------------------------------------------------------------------------------- /LICENSES/MIT.txt: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: 6 | 7 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 8 | 9 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 10 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 6 | 7 | # CDDA Game Launcher 8 | 9 | A [Cataclysm: Dark Days Ahead](https://cataclysmdda.org/) launcher with additional features. 10 | 11 | ![GitHub Workflow Status (master)](https://img.shields.io/github/actions/workflow/status/DazedNConfused-/CDDA-Game-Launcher/build.yml?branch=master) 12 | ![GitHub Workflow Status (develop)](https://img.shields.io/github/actions/workflow/status/DazedNConfused-/CDDA-Game-Launcher/build.yml?branch=develop) 13 | 14 | ![GitHub release (latest by date)](https://img.shields.io/github/v/release/DazedNConfused-/CDDA-Game-Launcher) 15 | ![GitHub all releases](https://img.shields.io/github/downloads/DazedNConfused-/CDDA-Game-Launcher/total) 16 | [![GitHub forks](https://img.shields.io/github/forks/DazedNConfused-/CDDA-Game-Launcher)](https://github.com/DazedNConfused-/CDDA-Game-Launcher/network) 17 | [![REUSE status](https://api.reuse.software/badge/github.com/DazedNConfused-/CDDA-Game-Launcher)](https://api.reuse.software/info/github.com/DazedNConfused-/CDDA-Game-Launcher) 18 | 19 | [Download here](https://github.com/DazedNConfused-/CDDA-Game-Launcher/releases). 20 | 21 | ## ~~Un~~maintained 22 | 23 | ~~Maintenance and support for this application has now ended. You might still be able to use it but no guarantee is provided. Feel free to fork it, change it, rebuild it or leave it as you please.~~ 24 | 25 | Maintenance and support for this application has resumed _**in limited capacity**_. Until I learn more about both the launcher codebase _and the game itself_, expect mostly fixes for the bugs I have encountered myself during my CDDA play sessions. 26 | 27 | Bug reports and feature requests are still welcome and encouraged, with the tacit understanding that I may not be able to attend them all until I get more seasoned with both game and launcher. 28 | 29 | ## Implemented features 30 | 31 | * Launching the game 32 | * Detecting the game version and build number 33 | * Retreiving the available update builds 34 | * Automatically updating the game while preserving the user modifications 35 | * Soundpack manager 36 | * Mod manager 37 | * Save backups and automatic backups 38 | 39 | ## ~~Planned features~~ 40 | 41 | * ~~Tileset manager~~ 42 | * ~~Font presets~~ 43 | 44 | No planed features, only maintenance and bugfixes in the short term. Although having a Tileset manager would indeed be nice, it may be a scope far too ambitious for a project just resurrected from beyond the grave. We shall see. 45 | 46 | ## FAQ 47 | 48 | ### What happened to the previous CDDA Game Launcher? 49 | 50 | It has become unmaintained. Nevertheless, praise and gratitude go to [remyroy](https://github.com/remyroy) & [the rest of contributors](https://github.com/remyroy/CDDA-Game-Launcher/graphs/contributors) for their work on the launcher thus far, and for giving such a useful tool free of charge to the CDDA community. 51 | 52 | ### Where is my previous version? 53 | 54 | Is it stored in the `previous_version` directory inside your game directory. 55 | 56 | ### How does the launcher update my game? 57 | 58 | * The launcher downloads the archive for the new version. 59 | * If the `previous_version` subdirectory exists, the launcher moves it in the recycle bin. 60 | * The launcher moves everything from the game directory in the `previous_version` subdirectory. 61 | * The launcher extracts the downloaded archive in the game directory. 62 | * The launcher inspect what is in the `previous_version` directory and it copies the saves, the mods, the tilesets, the soundpacks and a bunch of others useful files from the `previous_version` directory that are missing from the downloaded archive to the real game directory. It will assume that mods that are included in the downloaded archive are the newest and latest version and it will keep those by comparing their unique ident value. 63 | 64 | ### I think the launcher just deleted my files. What can I do? 65 | 66 | The launcher goes to great lengths not to delete any file that could be important to you. With the default and recommended settings, the launcher will always move files instead of deleting them. If you think you lost files during an update, check out the `previous_version` subdirectory. That is where you should be able to find your previous game version. You can also check for files in your recycle bin. Those are the main 2 places where files are moved and where you should be able to find them. 67 | 68 | ### My antivirus product detected the launcher as a threat. What can I do? 69 | 70 | Poor antivirus products are known to detect the launcher as a threat and block its execution or delete the launcher. A simple workaround is to add the launcher binary in your antivirus whitelist or select the action to trust this binary when detected. 71 | 72 | If you are paranoid, you can always inspect the source code yourself and build the launcher from the source code. You are still likely to get false positives. There is little productive efforts we can do as software developers with these. We have [a nice building guide](https://github.com/DazedNConfused-/CDDA-Game-Launcher/blob/master/BUILDING.md) for those who want to build the launcher from the source code. 73 | 74 | Many people are dying to know why antivirus products are identifying the launcher as a threat. There has been many wild speculations to try to pinpoint the root cause for this. The best way to find out would be to ask those antivirus product developers. Unfortunatly, they are unlikely to respond for many good reasons. We could also speculate on this for days on end. Our current best speculation is because we use a component called PyInstaller [that is commonly flagged as a threat](https://github.com/pyinstaller/pyinstaller/issues/4633). Now, if you want see how deep the rabbit hole goes, you can keep on searching or speculating on why PyInstaller itself is commonly flagged as a threat. This research is left as an exercise to the reader. 75 | 76 | Many people are also asking why not simply report the launcher as a false positive to those antivirus products. We welcome anyone who wants to take the time to do it, but we believe it is mostly unproductive. Those processes are often time-consuming and ignored. Someone would also have to do them all over again each time we make a new release or when one of the component we use is updated or changed. The current state of threat detection on PC is quite messy and sad especially for everyone using *free* antivirus products. 77 | 78 | ### I found an issue with the game itself or I would like to make a suggestion for the game itself. What should I do? 79 | 80 | You should [contact the game developpers](https://cataclysmdda.org/#ive-found-a-bug--i-would-like-to-make-a-suggestion-what-should-i-do) about this. We are mainly providing a tool to help with the game. We cannot provide support for the game itself. 81 | 82 | ### How do I update to a new version of the game launcher? 83 | 84 | The launcher will automatically check for updated version on start. If it finds one, the launcher will prompt you to update. You can always download [the latest version on github](https://github.com/DazedNConfused-/CDDA-Game-Launcher/releases). Those using the portable version will have to manually download and manually update the launcher. From the help menu, you can also check for new updates. 85 | 86 | ### The launcher keeps crashing when I start it. What can I do? 87 | 88 | You might need to delete your configs file to work around this issue. That filename is `configs.db` and it is located in `%LOCALAPPDATA%\CDDA Game Launcher\`. Some users have reported and encountered unrelated starting issues. In some cases, running a debug version of the launcher to get more logs might help to locate the issue. [Creating an issue about this](https://github.com/DazedNConfused-/CDDA-Game-Launcher/issues) is probably the way to go. 89 | 90 | ### I just installed the game and it already has a big list of mods. Is there something wrong? 91 | 92 | The base game is bundled with a good number of mods. You can view them more like modules that you can activate or ignore when creating a new world in game. These mods or modules can provide a different game experience by adding new items, buildings, mobs, by disabling some game mechanics or by changing how you play the game. They are a simple way of having a distinctive playthrough using the same game engine. The game is quite enjoyable without any of these additional mods or by using the default mods when creating a new world. You should probably avoid using additional mods if you are new to the game for your first playthrough to get familiar with the game mechanics. Once you are comfortable, after one or a few playthroughs, I suggest you check back the base game mods or even some external mods for your next world. 93 | 94 | ### A mod in the repository is broken or is crashing my game when enabled. What can I do? ### 95 | 96 | It is frequent for game updates to break mods especially on the experimental branch. You could try to see if there is an update for that mod. You could try updating that mod by removing it and installing it again. You could try to contact the mod author and ask him to update his mod. 97 | 98 | Maintaining external mods can be a difficult task for an ever expanding and changing base game. The only sure and *official* way to have good working mods is to have them included in the base game. If you are concerned about having a reliable gaming experience, you should consider using the base game mods exclusivly and you should consider using the stable branch. 99 | 100 | If you find out a mod in the repository is clearly abandonned and not working anymore, please [open an issue](https://github.com/DazedNConfused-/CDDA-Game-Launcher/issues) about it so it can be removed. 101 | 102 | ### Will you make a Linux or macOS version? 103 | 104 | Most likely not. You can check [the linux issue](https://github.com/DazedNConfused-/CDDA-Game-Launcher/issues/329) and [the mac issue](https://github.com/DazedNConfused-/CDDA-Game-Launcher/issues/73) for more information. 105 | 106 | ### It does not work? Can you help me? 107 | 108 | Submit your issues [on Github](https://github.com/DazedNConfused-/CDDA-Game-Launcher/issues). Try to [report bugs effectively](http://www.chiark.greenend.org.uk/~sgtatham/bugs.html). 109 | 110 | ## Building 111 | 112 | You can learn how to run and build the launcher by checking our [building guide](BUILDING.md). 113 | 114 | ## License 115 | 116 | This project is licensed under the terms of [the MIT license](LICENSE). 117 | 118 | Permission to use [the launcher icon](cddagl/resources/launcher.ico) was given by [Paul Davey aka Mattahan](http://mattahan.deviantart.com/). 119 | 120 | ## Contributing to this project 121 | 122 | Anyone and everyone is welcome to contribute. Please take a moment to review the [guidelines for contributing](CONTRIBUTING.md). 123 | 124 | * [Bug reports](CONTRIBUTING.md#bugs) 125 | * [Feature requests](CONTRIBUTING.md#features) 126 | * [Pull requests](CONTRIBUTING.md#pull-requests) 127 | * [Translation contributions](CONTRIBUTING.md#translations) 128 | 129 | ## Code of conduct 130 | 131 | Participants in this projet are expected to follow [the Code of Conduct](CODE_OF_CONDUCT.md). 132 | -------------------------------------------------------------------------------- /alembicrepo/README: -------------------------------------------------------------------------------- 1 | SPDX-FileCopyrightText: 2015-2021 Rémy Roy 2 | 3 | SPDX-License-Identifier: MIT 4 | 5 | Generic single-database configuration. 6 | -------------------------------------------------------------------------------- /alembicrepo/env.py: -------------------------------------------------------------------------------- 1 | # SPDX-FileCopyrightText: 2015-2021 Rémy Roy 2 | # 3 | # SPDX-License-Identifier: MIT 4 | 5 | from __future__ import with_statement 6 | from alembic import context 7 | from sqlalchemy import engine_from_config, pool 8 | #from logging.config import fileConfig 9 | 10 | # this is the Alembic Config object, which provides 11 | # access to the values within the .ini file in use. 12 | config = context.config 13 | 14 | # Interpret the config file for Python logging. 15 | # This line sets up loggers basically. 16 | #fileConfig(config.config_file_name) 17 | 18 | # add your model's MetaData object here 19 | # for 'autogenerate' support 20 | # from myapp import mymodel 21 | # target_metadata = mymodel.Base.metadata 22 | target_metadata = None 23 | 24 | # other values from the config, defined by the needs of env.py, 25 | # can be acquired: 26 | # my_important_option = config.get_main_option("my_important_option") 27 | # ... etc. 28 | 29 | 30 | def run_migrations_offline(): 31 | """Run migrations in 'offline' mode. 32 | 33 | This configures the context with just a URL 34 | and not an Engine, though an Engine is acceptable 35 | here as well. By skipping the Engine creation 36 | we don't even need a DBAPI to be available. 37 | 38 | Calls to context.execute() here emit the given string to the 39 | script output. 40 | 41 | """ 42 | url = config.get_main_option("sqlalchemy.url") 43 | context.configure( 44 | url=url, target_metadata=target_metadata, literal_binds=True) 45 | 46 | with context.begin_transaction(): 47 | context.run_migrations() 48 | 49 | 50 | def run_migrations_online(): 51 | """Run migrations in 'online' mode. 52 | 53 | In this scenario we need to create an Engine 54 | and associate a connection with the context. 55 | 56 | """ 57 | connectable = engine_from_config( 58 | config.get_section(config.config_ini_section), 59 | prefix='sqlalchemy.', 60 | poolclass=pool.NullPool) 61 | 62 | with connectable.connect() as connection: 63 | context.configure( 64 | connection=connection, 65 | target_metadata=target_metadata 66 | ) 67 | 68 | with context.begin_transaction(): 69 | context.run_migrations() 70 | 71 | if context.is_offline_mode(): 72 | run_migrations_offline() 73 | else: 74 | run_migrations_online() 75 | -------------------------------------------------------------------------------- /alembicrepo/script.py.mako: -------------------------------------------------------------------------------- 1 | # SPDX-FileCopyrightText: 2015-2021 Rémy Roy 2 | # 3 | # SPDX-License-Identifier: MIT 4 | 5 | """${message} 6 | 7 | Revision ID: ${up_revision} 8 | Revises: ${down_revision | comma,n} 9 | Create Date: ${create_date} 10 | 11 | """ 12 | 13 | # revision identifiers, used by Alembic. 14 | revision = ${repr(up_revision)} 15 | down_revision = ${repr(down_revision)} 16 | branch_labels = ${repr(branch_labels)} 17 | depends_on = ${repr(depends_on)} 18 | 19 | from alembic import op 20 | import sqlalchemy as sa 21 | ${imports if imports else ""} 22 | 23 | def upgrade(): 24 | ${upgrades if upgrades else "pass"} 25 | 26 | 27 | def downgrade(): 28 | ${downgrades if downgrades else "pass"} 29 | -------------------------------------------------------------------------------- /alembicrepo/versions/0e35fff276f3_stable_versions.py: -------------------------------------------------------------------------------- 1 | # SPDX-FileCopyrightText: 2015-2021 Rémy Roy 2 | # 3 | # SPDX-License-Identifier: MIT 4 | 5 | """stable versions 6 | 7 | Revision ID: 0e35fff276f3 8 | Revises: 402ce1583e3f 9 | Create Date: 2019-08-26 10:55:16.968432 10 | 11 | """ 12 | 13 | # revision identifiers, used by Alembic. 14 | revision = '0e35fff276f3' 15 | down_revision = '402ce1583e3f' 16 | branch_labels = None 17 | depends_on = None 18 | 19 | from alembic import op 20 | import sqlalchemy as sa 21 | 22 | def upgrade(): 23 | with op.batch_alter_table("game_version") as batch_op: 24 | batch_op.add_column(sa.Column('stable', sa.Boolean, nullable=True)) 25 | 26 | op.execute('UPDATE game_version SET stable = 0') 27 | 28 | with op.batch_alter_table("game_version") as batch_op: 29 | batch_op.alter_column('stable', nullable=False) 30 | 31 | op.execute("UPDATE game_version SET stable = 1 WHERE sha256 in (" 32 | "'2d7bbf426572e2b21aede324c8d89c9ad84529a05a4ac99a914f22b2b1e1405e'," 33 | "'0454ed2bbc4a6c1c8cca5c360533513eb2a1d975816816d7c13ff60e276d431b'," 34 | "'7f914145248cebfd4d1a6d4b1ff932a478504b1e7e4c689aab97b8700e079f61')") 35 | 36 | def downgrade(): 37 | with op.batch_alter_table("game_version") as batch_op: 38 | batch_op.drop_column('stable') 39 | -------------------------------------------------------------------------------- /alembicrepo/versions/402ce1583e3f_initial_config_model.py: -------------------------------------------------------------------------------- 1 | # SPDX-FileCopyrightText: 2015-2021 Rémy Roy 2 | # 3 | # SPDX-License-Identifier: MIT 4 | 5 | """Initial config model 6 | 7 | Revision ID: 402ce1583e3f 8 | Revises: 9 | Create Date: 2015-12-23 15:05:36.841153 10 | 11 | """ 12 | 13 | # revision identifiers, used by Alembic. 14 | revision = '402ce1583e3f' 15 | down_revision = None 16 | branch_labels = None 17 | depends_on = None 18 | 19 | from alembic import op 20 | import sqlalchemy as sa 21 | 22 | 23 | def upgrade(): 24 | op.create_table('config_value', 25 | sa.Column('id', sa.Integer, primary_key=True), 26 | sa.Column('name', sa.String(32), nullable=False, index=True), 27 | sa.Column('value', sa.Text(), nullable=False), 28 | sa.Column('created_on', sa.DateTime, nullable=False), 29 | ) 30 | 31 | op.create_table('game_version', 32 | sa.Column('id', sa.Integer, primary_key=True), 33 | sa.Column('sha256', sa.String(64), nullable=False, index=True), 34 | sa.Column('version', sa.String(32), nullable=False), 35 | sa.Column('discovered_on', sa.DateTime, nullable=False), 36 | ) 37 | 38 | op.create_table('game_build', 39 | sa.Column('id', sa.Integer, primary_key=True), 40 | sa.Column('version', sa.Integer, sa.ForeignKey('game_version.id'), 41 | nullable=False, index=True, unique=True), 42 | sa.Column('build', sa.String(16), nullable=False), 43 | sa.Column('released_on', sa.DateTime, nullable=False), 44 | sa.Column('discovered_on', sa.DateTime, nullable=False), 45 | ) 46 | 47 | 48 | def downgrade(): 49 | op.drop('game_build') 50 | op.drop('game_version') 51 | op.drop('config_value') 52 | -------------------------------------------------------------------------------- /cddagl/VERSION: -------------------------------------------------------------------------------- 1 | 1.6.10 -------------------------------------------------------------------------------- /cddagl/VERSION.license: -------------------------------------------------------------------------------- 1 | SPDX-FileCopyrightText: 2015-2021 Rémy Roy 2 | 3 | SPDX-License-Identifier: CC0-1.0 4 | -------------------------------------------------------------------------------- /cddagl/__init__.py: -------------------------------------------------------------------------------- 1 | # SPDX-FileCopyrightText: 2015-2021 Rémy Roy 2 | # 3 | # SPDX-License-Identifier: MIT 4 | 5 | import pkgutil 6 | 7 | 8 | __version__ = pkgutil.get_data('cddagl', 'VERSION').decode("utf8").strip() 9 | -------------------------------------------------------------------------------- /cddagl/__main__.py: -------------------------------------------------------------------------------- 1 | # SPDX-FileCopyrightText: 2015-2021 Rémy Roy 2 | # 3 | # SPDX-License-Identifier: MIT 4 | 5 | def fix_pywin32_loading(): 6 | try: 7 | import pywintypes 8 | except ImportError: 9 | import sys 10 | sys.path.append(r'win32') 11 | sys.path.append(r'win32\lib') 12 | import pywin32_bootstrap 13 | 14 | fix_pywin32_loading() 15 | 16 | import cddagl.launcher 17 | cddagl.launcher.run_cddagl() 18 | -------------------------------------------------------------------------------- /cddagl/functions.py: -------------------------------------------------------------------------------- 1 | # SPDX-FileCopyrightText: 2015-2021 Rémy Roy 2 | # 3 | # SPDX-License-Identifier: MIT 4 | 5 | import logging 6 | import os 7 | import re 8 | import traceback 9 | from io import StringIO 10 | 11 | import winutils 12 | from pywintypes import com_error 13 | 14 | import cddagl 15 | from cddagl.i18n import proxy_gettext as _ 16 | from cddagl.sql.functions import get_config_value, config_true 17 | 18 | from string import Formatter 19 | from datetime import timedelta 20 | 21 | version = cddagl.__version__ 22 | logger = logging.getLogger('cddagl') 23 | 24 | 25 | def log_exception(extype, value, tb): 26 | tb_io = StringIO() 27 | traceback.print_tb(tb, file=tb_io) 28 | 29 | logger.critical(_('Global error:\nLauncher version: {version}\nType: ' 30 | '{extype}\nValue: {value}\nTraceback:\n{traceback}').format( 31 | version=cddagl.__version__, extype=str(extype), value=str(value), 32 | traceback=tb_io.getvalue())) 33 | 34 | def ensure_slash(path): 35 | """Return path making sure it has a trailing slash at the end.""" 36 | return os.path.join(path, '') 37 | 38 | def unique(seq): 39 | """Return unique entries in a unordered sequence while original order.""" 40 | seen = set() 41 | for x in seq: 42 | if x not in seen: 43 | seen.add(x) 44 | yield x 45 | 46 | def clean_qt_path(path): 47 | return path.replace('/', '\\') 48 | 49 | def safe_filename(filename): 50 | keepcharacters = (' ', '.', '_', '-') 51 | return ''.join(c for c in filename if c.isalnum() or c in keepcharacters 52 | ).strip() 53 | 54 | def tryint(s): 55 | try: 56 | return int(s) 57 | except: 58 | return s 59 | 60 | def alphanum_key(s): 61 | """ Turn a string into a list of string and number chunks. 62 | "z23a" -> ["z", 23, "a"] 63 | """ 64 | return arstrip([tryint(c) for c in re.split('([0-9]+)', s)]) 65 | 66 | def arstrip(value): 67 | while len(value) > 1 and value[-1:] == ['']: 68 | value = value[:-1] 69 | return value 70 | 71 | def is_64_windows(): 72 | return 'PROGRAMFILES(X86)' in os.environ 73 | 74 | def bitness(): 75 | if is_64_windows(): 76 | return _('64-bit') 77 | else: 78 | return _('32-bit') 79 | 80 | def sizeof_fmt(num, suffix=None): 81 | if suffix is None: 82 | suffix = _('B') 83 | for unit in ['', _('Ki'), _('Mi'), _('Gi'), _('Ti'), _('Pi'), _('Ei'), 84 | _('Zi')]: 85 | if abs(num) < 1024.0: 86 | return "%3.1f %s%s" % (num, unit, suffix) 87 | num /= 1024.0 88 | return "%.1f %s%s" % (num, _('Yi'), suffix) 89 | 90 | def delete_path(path): 91 | ''' Move directory or file in the recycle bin (or permanently delete it 92 | depending on the settings used) using the built in Windows File 93 | operations dialog 94 | ''' 95 | 96 | # Make sure we have an absolute path first 97 | if not os.path.isabs(path): 98 | path = os.path.abspath(path) 99 | 100 | shellcon = winutils.shellcon 101 | 102 | permanently_delete_files = config_true( 103 | get_config_value('permanently_delete_files', 'False')) 104 | 105 | if permanently_delete_files: 106 | flags = 0 107 | else: 108 | flags = shellcon.FOF_ALLOWUNDO 109 | 110 | flags = (flags | 111 | shellcon.FOF_SILENT | 112 | shellcon.FOF_NOCONFIRMATION | 113 | shellcon.FOF_WANTNUKEWARNING 114 | ) 115 | 116 | try: 117 | return winutils.delete(path, flags) 118 | except com_error: 119 | return False 120 | 121 | def move_path(srcpath, dstpath): 122 | ''' Move srcpath to dstpath using using the built in Windows File 123 | operations dialog 124 | ''' 125 | 126 | # Make sure we have absolute paths first 127 | if not os.path.isabs(srcpath): 128 | srcpath = os.path.abspath(srcpath) 129 | if not os.path.isabs(dstpath): 130 | dstpath = os.path.abspath(dstpath) 131 | 132 | shellcon = winutils.shellcon 133 | 134 | flags = ( 135 | shellcon.FOF_ALLOWUNDO | 136 | shellcon.FOF_SILENT | 137 | shellcon.FOF_NOCONFIRMMKDIR | 138 | shellcon.FOF_NOCONFIRMATION | 139 | shellcon.FOF_WANTNUKEWARNING 140 | ) 141 | 142 | try: 143 | return winutils.move(srcpath, dstpath, flags) 144 | except com_error: 145 | return False 146 | 147 | def safe_humanize(arrow_date, other=None, locale='en_us', only_distance=False, granularity='auto'): 148 | try: 149 | # Can we use the normal humanize method? 150 | return arrow_date.humanize(other=other, locale=locale, only_distance=only_distance, 151 | granularity=granularity) 152 | except ValueError: 153 | # On first fail, let's try with day granularity 154 | try: 155 | return arrow_date.humanize(other=other, locale=locale, only_distance=only_distance, 156 | granularity='day') 157 | except ValueError: 158 | # On final fail, use en_us locale which should be translated 159 | return arrow_date.humanize(other=other, locale='en_us', only_distance=only_distance, 160 | granularity='auto') 161 | 162 | def strfdelta(tdelta, fmt='{D:02}d {H:02}h {M:02}m {S:02}s', inputtype='timedelta'): 163 | """Convert a datetime.timedelta object or a regular number to a custom- 164 | formatted string, just like the stftime() method does for datetime.datetime 165 | objects. 166 | 167 | The fmt argument allows custom formatting to be specified. Fields can 168 | include seconds, minutes, hours, days, and weeks. Each field is optional. 169 | 170 | Some examples: 171 | '{D:02}d {H:02}h {M:02}m {S:02}s' --> '05d 08h 04m 02s' (default) 172 | '{W}w {D}d {H}:{M:02}:{S:02}' --> '4w 5d 8:04:02' 173 | '{D:2}d {H:2}:{M:02}:{S:02}' --> ' 5d 8:04:02' 174 | '{H}h {S}s' --> '72h 800s' 175 | 176 | The inputtype argument allows tdelta to be a regular number instead of the 177 | default, which is a datetime.timedelta object. Valid inputtype strings: 178 | 's', 'seconds', 179 | 'm', 'minutes', 180 | 'h', 'hours', 181 | 'd', 'days', 182 | 'w', 'weeks' 183 | """ 184 | 185 | # Convert tdelta to integer seconds. 186 | if inputtype == 'timedelta': 187 | remainder = int(tdelta.total_seconds()) 188 | elif inputtype in ['s', 'seconds']: 189 | remainder = int(tdelta) 190 | elif inputtype in ['m', 'minutes']: 191 | remainder = int(tdelta)*60 192 | elif inputtype in ['h', 'hours']: 193 | remainder = int(tdelta)*3600 194 | elif inputtype in ['d', 'days']: 195 | remainder = int(tdelta)*86400 196 | elif inputtype in ['w', 'weeks']: 197 | remainder = int(tdelta)*604800 198 | 199 | f = Formatter() 200 | desired_fields = [field_tuple[1] for field_tuple in f.parse(fmt)] 201 | possible_fields = ('W', 'D', 'H', 'M', 'S') 202 | constants = {'W': 604800, 'D': 86400, 'H': 3600, 'M': 60, 'S': 1} 203 | values = {} 204 | for field in possible_fields: 205 | if field in desired_fields and field in constants: 206 | values[field], remainder = divmod(remainder, constants[field]) 207 | return f.format(fmt, **values) 208 | -------------------------------------------------------------------------------- /cddagl/i18n.py: -------------------------------------------------------------------------------- 1 | # SPDX-FileCopyrightText: 2015-2021 Rémy Roy 2 | # 3 | # SPDX-License-Identifier: MIT 4 | 5 | import builtins 6 | import gettext 7 | import logging 8 | import os 9 | 10 | logger = logging.getLogger(__name__) 11 | 12 | default_names_to_install = ('gettext', 'ngettext') 13 | 14 | 15 | def proxy_gettext(*args, **kwargs): 16 | """Proxy calls this function to the real built-in gettext() function. 17 | 18 | This is not required for normal operation of the application, could be not imported at all, 19 | but will help development. 20 | """ 21 | ### this would load gettext in case it wasn't done before use, but could hide an app bug. 22 | #if 'gettext' not in builtins.__dict__: 23 | # load_gettext_no_locale() 24 | return builtins.__dict__['gettext'](*args, **kwargs) 25 | 26 | 27 | def proxy_ngettext(*args, **kwargs): 28 | """Proxy calls to this function to the real built-in ngettext() function. 29 | 30 | This is not required for normal operation of the application, could be not imported at all, 31 | but will help development. 32 | """ 33 | ### this would load gettext in case it wasn't done before use, but could hide an app bug. 34 | #if 'ngettext' not in builtins.__dict__: 35 | # load_gettext_no_locale() 36 | return builtins.__dict__['ngettext'](*args, **kwargs) 37 | 38 | 39 | def get_available_locales(locale_dir): 40 | """Return a list of available locales in the specified directory.""" 41 | available_locales = {'en'} 42 | if os.path.isdir(locale_dir): 43 | entries = os.scandir(locale_dir) 44 | for entry in entries: 45 | if entry.is_dir(): 46 | available_locales.add(entry.name) 47 | 48 | return sorted(available_locales, key=lambda x: 0 if x == 'en' else 1) 49 | 50 | 51 | def load_gettext_no_locale(): 52 | """Load gettext into the application using base strings (no translations).""" 53 | translation = gettext.NullTranslations() 54 | translation.install(default_names_to_install) 55 | return translation 56 | 57 | 58 | def load_gettext_locale(locale_dir, locale, domain='cddagl'): 59 | """Load gettext into the application with specified locale file. 60 | 61 | Fallback to default untranslated strings if locale file is not found. 62 | """ 63 | if locale == 'en': 64 | return load_gettext_no_locale() 65 | 66 | try: 67 | translation = gettext.translation(domain, localedir=locale_dir, languages=[locale]) 68 | except FileNotFoundError as err: 69 | logger.warning( 70 | 'Could not get translations for {locale} in {locale_dir}. Error: {info}' 71 | .format(locale=locale, locale_dir=locale_dir, info=str(err)) 72 | ) 73 | return load_gettext_no_locale() 74 | 75 | translation.install(default_names_to_install) 76 | return translation 77 | -------------------------------------------------------------------------------- /cddagl/launcher.py: -------------------------------------------------------------------------------- 1 | # SPDX-FileCopyrightText: 2015-2021 Rémy Roy 2 | # 3 | # SPDX-License-Identifier: MIT 4 | 5 | import logging 6 | import os 7 | import sys 8 | import traceback 9 | from io import StringIO 10 | from logging.handlers import RotatingFileHandler 11 | 12 | from PyQt5.QtGui import QIcon 13 | from PyQt5.QtWidgets import QApplication 14 | from babel.core import Locale 15 | 16 | ### to avoid import errors when not setting PYTHONPATH 17 | if not getattr(sys, 'frozen', False): 18 | sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), '..'))) 19 | 20 | import cddagl.constants as cons 21 | from cddagl import __version__ as version 22 | from cddagl.constants import get_cddagl_path, get_locale_path, get_resource_path 23 | from cddagl.i18n import ( 24 | load_gettext_locale, load_gettext_no_locale, 25 | proxy_gettext as _, get_available_locales 26 | ) 27 | from cddagl.sql.functions import init_config, get_config_value, config_true 28 | from cddagl.ui.views.dialogs import ExceptionWindow 29 | from cddagl.ui.views.tabbed import TabbedWindow 30 | from cddagl.win32 import get_ui_locale, SingleInstance, write_named_pipe 31 | 32 | logger = logging.getLogger('cddagl') 33 | 34 | 35 | def init_single_instance(): 36 | if not config_true(get_config_value('allow_multiple_instances', 'False')): 37 | single_instance = SingleInstance() 38 | 39 | if single_instance.aleradyrunning(): 40 | write_named_pipe('cddagl_instance', b'dupe') 41 | sys.exit(0) 42 | 43 | return single_instance 44 | 45 | return None 46 | 47 | 48 | def get_preferred_locale(available_locales): 49 | preferred_locales = [] 50 | 51 | selected_locale = get_config_value('locale', None) 52 | if selected_locale == 'None': 53 | selected_locale = None 54 | if selected_locale is not None: 55 | preferred_locales.append(selected_locale) 56 | 57 | system_locale = get_ui_locale() 58 | if system_locale is not None: 59 | preferred_locales.append(system_locale) 60 | 61 | app_locale = Locale.negotiate(preferred_locales, available_locales) 62 | if app_locale is None: 63 | app_locale = 'en' 64 | else: 65 | app_locale = str(app_locale) 66 | 67 | return app_locale 68 | 69 | 70 | def init_logging(): 71 | # get root logger 72 | logger = logging.getLogger('cddagl') 73 | logger.setLevel(logging.DEBUG) 74 | 75 | # setup directory for written-to-file logs 76 | local_app_data = os.environ.get('LOCALAPPDATA', os.environ.get('APPDATA')) 77 | if local_app_data is None or not os.path.isdir(local_app_data): 78 | local_app_data = '' 79 | 80 | logging_dir = os.path.join(local_app_data, 'CDDA Game Launcher') 81 | if not os.path.isdir(logging_dir): 82 | os.makedirs(logging_dir) 83 | 84 | logging_file = os.path.join(logging_dir, 'app.log') 85 | 86 | # setup logging formatter 87 | log_formatter = logging.Formatter("%(asctime)s [%(threadName)-12.12s] [%(levelname)-5.5s] %(message)s") 88 | 89 | # setup file logger 90 | file_handler = RotatingFileHandler( 91 | logging_file, encoding='utf8', 92 | maxBytes=cons.MAX_LOG_SIZE, backupCount=cons.MAX_LOG_FILES 93 | ) 94 | file_handler.setFormatter(log_formatter) 95 | logger.addHandler(file_handler) 96 | 97 | # setup consoler logger 98 | console_handler = logging.StreamHandler() 99 | console_handler.setFormatter(log_formatter) 100 | logger.addHandler(console_handler) 101 | 102 | # initialize 103 | logger.info(_('CDDA Game Launcher started: {version}').format(version=version)) 104 | 105 | 106 | def handle_exception(extype, value, tb): 107 | logger = logging.getLogger('cddagl') 108 | 109 | tb_io = StringIO() 110 | traceback.print_tb(tb, file=tb_io) 111 | 112 | logger.critical( 113 | _('Global error:\n' 114 | 'Launcher version: {version}\n' 115 | 'Type: {extype}\n' 116 | 'Value: {value}\n' 117 | 'Traceback:\n{traceback}') 118 | .format(version=version, extype=str(extype), value=str(value),traceback=tb_io.getvalue()) 119 | ) 120 | ui_exception(extype, value, tb) 121 | 122 | 123 | def start_ui(locale, single_instance): 124 | load_gettext_locale(get_locale_path(), locale) 125 | 126 | main_app = QApplication(sys.argv) 127 | main_app.setWindowIcon(QIcon(get_resource_path('launcher.ico'))) 128 | 129 | main_app.single_instance = single_instance 130 | main_app.app_locale = locale 131 | 132 | main_win = TabbedWindow('CDDA Game Launcher') 133 | main_win.show() 134 | 135 | main_app.main_win = main_win 136 | 137 | sys.exit(main_app.exec_()) 138 | 139 | 140 | def ui_exception(extype, value, tb): 141 | main_app = QApplication.instance() 142 | 143 | if main_app is not None: 144 | main_app_still_up = True 145 | main_app.closeAllWindows() 146 | else: 147 | main_app_still_up = False 148 | main_app = QApplication(sys.argv) 149 | 150 | ex_win = ExceptionWindow(main_app, extype, value, tb) 151 | ex_win.show() 152 | main_app.ex_win = ex_win 153 | 154 | if not main_app_still_up: 155 | sys.exit(main_app.exec_()) 156 | 157 | 158 | def init_exception_catcher(): 159 | sys.excepthook = handle_exception 160 | 161 | 162 | def run_cddagl(): 163 | load_gettext_no_locale() 164 | init_logging() 165 | init_exception_catcher() 166 | 167 | init_config(get_cddagl_path()) 168 | 169 | start_ui(get_preferred_locale(get_available_locales(get_locale_path())), 170 | init_single_instance()) 171 | 172 | 173 | if __name__ == '__main__': 174 | run_cddagl() 175 | -------------------------------------------------------------------------------- /cddagl/locale/mapping.cfg: -------------------------------------------------------------------------------- 1 | # Extraction from Python source files 2 | 3 | [python: **.py] 4 | encoding = utf8 -------------------------------------------------------------------------------- /cddagl/locale/mapping.cfg.license: -------------------------------------------------------------------------------- 1 | SPDX-FileCopyrightText: 2015-2021 Rémy Roy 2 | 3 | SPDX-License-Identifier: MIT -------------------------------------------------------------------------------- /cddagl/resources/btc-qr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DazedNConfused-/CDDA-Game-Launcher/c52495a4d79a364d6c381042790bf33b5209d37c/cddagl/resources/btc-qr.png -------------------------------------------------------------------------------- /cddagl/resources/btc-qr.png.license: -------------------------------------------------------------------------------- 1 | SPDX-FileCopyrightText: 2015-2021 Rémy Roy 2 | 3 | SPDX-License-Identifier: CC0-1.0 -------------------------------------------------------------------------------- /cddagl/resources/eth-qr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DazedNConfused-/CDDA-Game-Launcher/c52495a4d79a364d6c381042790bf33b5209d37c/cddagl/resources/eth-qr.png -------------------------------------------------------------------------------- /cddagl/resources/eth-qr.png.license: -------------------------------------------------------------------------------- 1 | SPDX-FileCopyrightText: 2015-2021 Rémy Roy 2 | 3 | SPDX-License-Identifier: CC0-1.0 -------------------------------------------------------------------------------- /cddagl/resources/launcher.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DazedNConfused-/CDDA-Game-Launcher/c52495a4d79a364d6c381042790bf33b5209d37c/cddagl/resources/launcher.ico -------------------------------------------------------------------------------- /cddagl/resources/launcher.ico.license: -------------------------------------------------------------------------------- 1 | SPDX-FileCopyrightText: 2022 Aunt Su 2 | 3 | SPDX-License-Identifier: CC-BY-SA-4.0 4 | 5 | SPDX-FileComment: Launcher Icon By Aunt Su, edited by acepleiades from the CDDA tileset repo -------------------------------------------------------------------------------- /cddagl/sql/__init__.py: -------------------------------------------------------------------------------- 1 | # SPDX-FileCopyrightText: 2015-2021 Rémy Roy 2 | # 3 | # SPDX-License-Identifier: MIT -------------------------------------------------------------------------------- /cddagl/sql/functions.py: -------------------------------------------------------------------------------- 1 | # SPDX-FileCopyrightText: 2015-2021 Rémy Roy 2 | # 3 | # SPDX-License-Identifier: MIT 4 | 5 | import os 6 | import threading 7 | 8 | from alembic import command 9 | from alembic.config import Config 10 | 11 | from sqlalchemy import create_engine 12 | from sqlalchemy.exc import OperationalError 13 | from sqlalchemy.orm import sessionmaker, joinedload 14 | 15 | from cddagl.sql.model import ConfigValue, GameVersion, GameBuild 16 | 17 | 18 | class ThreadSafeSessionManager(): 19 | def __init__(self): 20 | self._lock = threading.Lock() 21 | self.sessions = {} 22 | 23 | def has_session(self, thread_id): 24 | return thread_id in self.sessions 25 | 26 | def get_session(self, thread_id): 27 | return self.sessions[thread_id] 28 | 29 | def save_session(self, thread_id, session): 30 | self._lock.acquire() 31 | self.sessions[thread_id] = session 32 | self._lock.release() 33 | 34 | 35 | def get_db_url(): 36 | return 'sqlite:///{0}'.format(get_config_path()) 37 | 38 | 39 | def init_config(basedir): 40 | alembic_dir = os.path.join(basedir, 'alembicrepo') 41 | 42 | alembic_cfg = Config() 43 | alembic_cfg.set_main_option('sqlalchemy.url', get_db_url()) 44 | alembic_cfg.set_main_option('script_location', alembic_dir) 45 | 46 | try: 47 | command.upgrade(alembic_cfg, "head") 48 | except OperationalError: 49 | # If we cannot upgrade the database, we remove it and try again 50 | os.remove(get_config_path()) 51 | command.upgrade(alembic_cfg, "head") 52 | 53 | 54 | def get_config_path(): 55 | local_app_data = os.environ.get('LOCALAPPDATA', os.environ.get('APPDATA')) 56 | if local_app_data is None or not os.path.isdir(local_app_data): 57 | local_app_data = '' 58 | 59 | config_dir = os.path.join(local_app_data, 'CDDA Game Launcher') 60 | 61 | if not os.path.isdir(config_dir): 62 | os.makedirs(config_dir) 63 | 64 | return os.path.join(config_dir, 'configs.db') 65 | 66 | 67 | def get_session(): 68 | global _session_manager 69 | try: 70 | _session_manager 71 | except NameError: 72 | _session_manager = ThreadSafeSessionManager() 73 | 74 | thread_id = threading.current_thread().ident 75 | if not _session_manager.has_session(thread_id): 76 | db_engine = create_engine(get_db_url()) 77 | Session = sessionmaker(bind=db_engine) 78 | _session_manager.save_session(thread_id, Session()) 79 | 80 | return _session_manager.get_session(thread_id) 81 | 82 | 83 | def get_config_value(name, default=None): 84 | session = get_session() 85 | 86 | db_value = session.query(ConfigValue).filter_by(name=name).first() 87 | 88 | if db_value is None: 89 | return default 90 | 91 | return db_value.value 92 | 93 | 94 | def set_config_value(name, value): 95 | session = get_session() 96 | 97 | db_value = session.query(ConfigValue).filter_by(name=name).first() 98 | 99 | if db_value is None: 100 | db_value = ConfigValue() 101 | db_value.name = name 102 | 103 | db_value.value = value 104 | session.add(db_value) 105 | session.commit() 106 | 107 | 108 | def new_version(version, sha256, stable): 109 | session = get_session() 110 | 111 | game_version = session.query(GameVersion).filter_by(sha256=sha256).first() 112 | 113 | if game_version is None: 114 | game_version = GameVersion() 115 | game_version.sha256 = sha256 116 | game_version.version = version 117 | game_version.stable = stable 118 | 119 | session.add(game_version) 120 | session.commit() 121 | elif game_version.version != version or game_version.stable != stable: 122 | # if info doesn't match, update it 123 | game_version.version = version 124 | game_version.stable = stable 125 | 126 | session.add(game_version) 127 | session.commit() 128 | 129 | 130 | def new_build(version, sha256, stable, number, release_date): 131 | session = get_session() 132 | 133 | game_version = (session 134 | .query(GameVersion) 135 | .filter_by(sha256=sha256) 136 | .options(joinedload(GameVersion.game_build)) 137 | .first()) 138 | 139 | if game_version is None: 140 | game_version = GameVersion() 141 | game_version.sha256 = sha256 142 | game_version.version = version 143 | game_version.stable = stable 144 | 145 | session.add(game_version) 146 | 147 | if game_version.game_build is None: 148 | game_build = GameBuild() 149 | game_build.build = number 150 | game_build.released_on = release_date 151 | 152 | game_version.game_build = game_build 153 | 154 | session.commit() 155 | 156 | 157 | def get_build_from_sha256(sha256): 158 | session = get_session() 159 | 160 | game_version = (session 161 | .query(GameVersion) 162 | .filter_by(sha256=sha256) 163 | .options(joinedload(GameVersion.game_build)) 164 | .first()) 165 | 166 | if game_version is not None and game_version.game_build is not None: 167 | game_build = game_version.game_build 168 | return { 169 | 'build': game_build.build, 170 | 'released_on': game_build.released_on 171 | } 172 | 173 | return None 174 | 175 | 176 | def config_true(value): 177 | return value == 'True' or value == '1' 178 | -------------------------------------------------------------------------------- /cddagl/sql/model.py: -------------------------------------------------------------------------------- 1 | # SPDX-FileCopyrightText: 2015-2021 Rémy Roy 2 | # 3 | # SPDX-License-Identifier: MIT 4 | 5 | from datetime import datetime 6 | 7 | import sqlalchemy as sa 8 | 9 | from sqlalchemy.orm import relationship 10 | from sqlalchemy.ext.declarative import declarative_base 11 | 12 | metadata = sa.MetaData() 13 | 14 | Base = declarative_base(metadata=metadata) 15 | 16 | 17 | class ConfigValue(Base): 18 | __tablename__ = 'config_value' 19 | 20 | id = sa.Column(sa.Integer, primary_key=True) 21 | name = sa.Column(sa.String(32), nullable=False) 22 | value = sa.Column(sa.Text(), nullable=False) 23 | created_on = sa.Column(sa.DateTime, nullable=False, default=datetime.utcnow) 24 | 25 | 26 | class GameVersion(Base): 27 | __tablename__ = 'game_version' 28 | 29 | id = sa.Column(sa.Integer, primary_key=True) 30 | sha256 = sa.Column(sa.String(64), nullable=False) 31 | version = sa.Column(sa.String(32), nullable=False) 32 | stable = sa.Column(sa.Boolean, nullable=False) 33 | 34 | game_build = relationship('GameBuild', uselist=False) 35 | 36 | discovered_on = sa.Column(sa.DateTime, nullable=False, 37 | default=datetime.utcnow) 38 | 39 | 40 | class GameBuild(Base): 41 | __tablename__ = 'game_build' 42 | 43 | id = sa.Column(sa.Integer, primary_key=True) 44 | version = sa.Column(sa.Integer, sa.ForeignKey(GameVersion.id), 45 | nullable=False) 46 | build = sa.Column(sa.String(16), nullable=False) 47 | released_on = sa.Column(sa.DateTime, nullable=False) 48 | discovered_on = sa.Column(sa.DateTime, nullable=False, 49 | default=datetime.utcnow) 50 | -------------------------------------------------------------------------------- /cddagl/ui/__init__.py: -------------------------------------------------------------------------------- 1 | # SPDX-FileCopyrightText: 2015-2021 Rémy Roy 2 | # 3 | # SPDX-License-Identifier: MIT -------------------------------------------------------------------------------- /cddagl/ui/views/__init__.py: -------------------------------------------------------------------------------- 1 | # SPDX-FileCopyrightText: 2015-2021 Rémy Roy 2 | # 3 | # SPDX-License-Identifier: MIT -------------------------------------------------------------------------------- /cddagl/ui/views/fonts.py: -------------------------------------------------------------------------------- 1 | # SPDX-FileCopyrightText: 2015-2021 Rémy Roy 2 | # 3 | # SPDX-License-Identifier: MIT 4 | 5 | import logging 6 | 7 | from PyQt5.QtCore import Qt, QSize, QRect 8 | from PyQt5.QtGui import QPainter, QColor, QFont 9 | from PyQt5.QtWidgets import QWidget, QGridLayout, QTabWidget 10 | 11 | logger = logging.getLogger('cddagl') 12 | 13 | 14 | class FontsTab(QTabWidget): 15 | def __init__(self): 16 | super(FontsTab, self).__init__() 17 | 18 | layout = QGridLayout() 19 | 20 | font_window = CataWindow(4, 4, QFont('Consolas'), 18, 9, 18, False) 21 | layout.addWidget(font_window, 0, 0) 22 | self.font_window = font_window 23 | 24 | self.setLayout(layout) 25 | 26 | def set_text(self): 27 | pass 28 | 29 | def get_main_window(self): 30 | return self.parentWidget().parentWidget().parentWidget() 31 | 32 | def get_main_tab(self): 33 | return self.parentWidget().parentWidget().main_tab 34 | 35 | 36 | class CataWindow(QWidget): 37 | def __init__(self, terminalwidth, terminalheight, font, fontsize, fontwidth, 38 | fontheight, fontblending): 39 | super(CataWindow, self).__init__() 40 | 41 | self.terminalwidth = terminalwidth 42 | self.terminalheight = terminalheight 43 | 44 | self.cfont = font 45 | self.fontsize = fontsize 46 | self.cfont.setPixelSize(fontsize) 47 | self.cfont.setStyle(QFont.StyleNormal) 48 | self.fontwidth = fontwidth 49 | self.fontheight = fontheight 50 | self.fontblending = fontblending 51 | 52 | #self.text = '@@@\nBBB\n@@@\nCCC' 53 | self.text = '####\n####\n####\n####\n' 54 | 55 | def sizeHint(self): 56 | return QSize(self.terminalwidth * self.fontwidth, 57 | self.terminalheight * self.fontheight) 58 | 59 | def paintEvent(self, event): 60 | painter = QPainter(self) 61 | painter.fillRect(0, 0, self.width(), self.height(), QColor(0, 0, 0)) 62 | painter.setPen(QColor(99, 99, 99)); 63 | painter.setFont(self.cfont) 64 | 65 | term_x = 0 66 | term_y = 0 67 | for char in self.text: 68 | if char == '\n': 69 | term_y += 1 70 | term_x = 0 71 | continue 72 | x = self.fontwidth * term_x 73 | y = self.fontheight * term_y 74 | 75 | rect = QRect(x, y, self.fontwidth, self.fontheight) 76 | painter.drawText(rect, 0, char) 77 | 78 | term_x += 1 79 | 80 | x = self.fontwidth * term_x 81 | y = self.fontheight * term_y 82 | 83 | rect = QRect(x, y, self.fontwidth, self.fontheight) 84 | 85 | painter.fillRect(rect, Qt.green) 86 | 87 | -------------------------------------------------------------------------------- /cddagl/ui/views/statistics.py: -------------------------------------------------------------------------------- 1 | # SPDX-FileCopyrightText: 2022 Gonzalo López 2 | # 3 | # SPDX-License-Identifier: MIT 4 | 5 | import logging 6 | from datetime import datetime 7 | from cddagl.functions import strfdelta 8 | from cddagl.constants import DURATION_FORMAT 9 | 10 | from PyQt5.QtCore import ( 11 | Qt, QTimer 12 | ) 13 | from PyQt5.QtWidgets import ( 14 | QTabWidget, QGroupBox, QGridLayout, QLabel, QVBoxLayout, QPushButton 15 | ) 16 | from cddagl.sql.functions import get_config_value, set_config_value 17 | 18 | logger = logging.getLogger('cddagl') 19 | 20 | class StatisticsTab(QTabWidget): 21 | def __init__(self): 22 | super(StatisticsTab, self).__init__() 23 | 24 | self.game_start_time = None 25 | self.last_game_duration = get_config_value('last_played', 0) 26 | 27 | current_played_group_box = CurrentPlayedGroupBox() 28 | self.current_played_group_box = current_played_group_box 29 | self.reset_current_button = current_played_group_box.reset_current_button 30 | 31 | total_game_duration_group_box = TotalPlayedGroupBox() 32 | self.total_game_duration_group_box = total_game_duration_group_box 33 | self.reset_total_button = total_game_duration_group_box.reset_total_button 34 | 35 | layout = QVBoxLayout() 36 | layout.addWidget(current_played_group_box) 37 | layout.addWidget(total_game_duration_group_box) 38 | self.setLayout(layout) 39 | 40 | def set_text(self): 41 | self.current_played_group_box.set_text() 42 | self.current_played_group_box.set_label_text() 43 | self.total_game_duration_group_box.set_text() 44 | 45 | def get_main_window(self): 46 | return self.parentWidget().parentWidget().parentWidget() 47 | 48 | def get_main_tab(self): 49 | return self.parentWidget().parentWidget().main_tab 50 | 51 | def game_started(self): 52 | self.game_start_time = datetime.now() 53 | game_timer = QTimer() 54 | game_timer.setInterval(1000) 55 | game_timer.timeout.connect(self.game_tick) 56 | self.game_timer = game_timer 57 | game_timer.start() 58 | self.reset_current_button.setEnabled(False) 59 | self.reset_total_button.setEnabled(False) 60 | 61 | def game_ended(self): 62 | total_game_duration = int(get_config_value('total_played',0)) 63 | total_game_duration += self.last_game_duration 64 | set_config_value('last_played', self.last_game_duration) 65 | set_config_value('total_played', total_game_duration) 66 | self.game_start_time = None 67 | self.game_timer.stop() 68 | self.reset_current_button.setEnabled(True) 69 | self.reset_total_button.setEnabled(True) 70 | 71 | def game_tick(self): 72 | elapsed = int(datetime.now().timestamp() - self.game_start_time.timestamp()) 73 | self.last_game_duration = elapsed 74 | self.current_played_group_box.set_label_text() 75 | self.total_game_duration_group_box.set_label_text() 76 | 77 | class CurrentPlayedGroupBox(QGroupBox): 78 | def __init__(self): 79 | super(CurrentPlayedGroupBox, self).__init__() 80 | 81 | layout = QGridLayout() 82 | 83 | current_played_label = QLabel() 84 | current_played_label.setStyleSheet("font-size: 32px;") 85 | layout.addWidget(current_played_label, 0, 0, Qt.AlignHCenter) 86 | self.current_played_label = current_played_label 87 | 88 | reset_current_button = QPushButton() 89 | reset_current_button.setStyleSheet("font-size: 20px;") 90 | reset_current_button.clicked.connect(self.reset_current) 91 | layout.addWidget(reset_current_button, 1, 0, Qt.AlignHCenter) 92 | self.reset_current_button = reset_current_button 93 | 94 | self.setLayout(layout) 95 | self.set_text() 96 | 97 | def reset_current(self): 98 | self.parentWidget().last_game_duration = 0 99 | set_config_value('last_played', 0) 100 | self.set_label_text() 101 | 102 | def get_main_tab(self): 103 | return self.parentWidget().get_main_tab() 104 | 105 | def set_text(self): 106 | self.reset_current_button.setText(_('RESET')) 107 | last_game_duration = int(get_config_value('last_played', 0)) 108 | fmt_last_game_duration = strfdelta(last_game_duration, _(DURATION_FORMAT), inputtype='s') 109 | self.current_played_label.setText(fmt_last_game_duration) 110 | self.setTitle(_('Last game duration:')) 111 | 112 | def set_label_text(self): 113 | last_game_duration = self.parentWidget().last_game_duration 114 | fmt_last_game_duration = strfdelta(last_game_duration, _(DURATION_FORMAT), inputtype='s') 115 | self.current_played_label.setText(fmt_last_game_duration) 116 | 117 | 118 | class TotalPlayedGroupBox(QGroupBox): 119 | def __init__(self): 120 | super(TotalPlayedGroupBox, self).__init__() 121 | 122 | layout = QGridLayout() 123 | 124 | total_game_duration_label = QLabel() 125 | total_game_duration_label.setStyleSheet("font-size: 32px;") 126 | layout.addWidget(total_game_duration_label, 0, 0, Qt.AlignHCenter) 127 | self.total_game_duration_label = total_game_duration_label 128 | 129 | reset_total_button = QPushButton() 130 | reset_total_button.setStyleSheet("font-size: 20px;") 131 | reset_total_button.clicked.connect(self.reset_total) 132 | layout.addWidget(reset_total_button, 1, 0, Qt.AlignHCenter) 133 | self.reset_total_button = reset_total_button 134 | 135 | self.setLayout(layout) 136 | self.set_text() 137 | 138 | def reset_total(self): 139 | set_config_value('total_played', 0) 140 | self.set_label_text() 141 | 142 | def get_main_tab(self): 143 | return self.parentWidget().get_main_tab() 144 | 145 | def set_text(self): 146 | self.reset_total_button.setText(_('RESET')) 147 | total_game_duration = int(get_config_value('total_played', 0)) 148 | fmt_total_game_duration = strfdelta(total_game_duration, _(DURATION_FORMAT), inputtype='s') 149 | self.total_game_duration_label.setText(fmt_total_game_duration) 150 | self.setTitle(_('Total time in game:')) 151 | 152 | def set_label_text(self): 153 | total_game_duration = int(get_config_value('total_played', 0)) + int(self.parentWidget().last_game_duration) 154 | fmt_total_game_duration = strfdelta(total_game_duration, _(DURATION_FORMAT), inputtype='s') 155 | self.total_game_duration_label.setText(fmt_total_game_duration) 156 | -------------------------------------------------------------------------------- /cddagl/ui/views/tilesets.py: -------------------------------------------------------------------------------- 1 | # SPDX-FileCopyrightText: 2015-2021 Rémy Roy 2 | # 3 | # SPDX-License-Identifier: MIT 4 | 5 | import logging 6 | 7 | from PyQt5.QtWidgets import QTabWidget 8 | 9 | logger = logging.getLogger('cddagl') 10 | 11 | 12 | class TilesetsTab(QTabWidget): 13 | def __init__(self): 14 | super(TilesetsTab, self).__init__() 15 | 16 | def set_text(self): 17 | pass 18 | 19 | def get_main_window(self): 20 | return self.parentWidget().parentWidget().parentWidget() 21 | 22 | def get_main_tab(self): 23 | return self.parentWidget().parentWidget().main_tab 24 | -------------------------------------------------------------------------------- /data/mods.json.license: -------------------------------------------------------------------------------- 1 | SPDX-FileCopyrightText: 2015-2021 Rémy Roy 2 | 3 | SPDX-License-Identifier: MIT -------------------------------------------------------------------------------- /data/soundpacks.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "type": "direct_download", 4 | "viewname": "ChestHole", 5 | "name": "ChestHole", 6 | "url": "http://chezzo.com/cdda/ChestHoleSoundSet.zip", 7 | "homepage": "https://discourse.cataclysmdda.org/t/ambient-sounds/9710/182" 8 | }, 9 | { 10 | "type": "direct_download", 11 | "viewname": "ChestOldTimey", 12 | "name": "ChestOldTimey", 13 | "url": "http://chezzo.com/cdda/ChestOldTimeyLessismore.zip", 14 | "homepage": "https://www.reddit.com/r/cataclysmdda/comments/53ndzx/music_recommendations_to_listen_to_while_playing/d7vfd7w" 15 | }, 16 | { 17 | "type": "direct_download", 18 | "viewname": "ChestHoleCC", 19 | "name": "ChestHoleCC", 20 | "url": "http://chezzo.com/cdda/ChestHoleCCSoundset.zip", 21 | "homepage": "https://www.reddit.com/r/cataclysmdda/comments/53ndzx/music_recommendations_to_listen_to_while_playing/d7vfd7w" 22 | }, 23 | { 24 | "type": "direct_download", 25 | "viewname": "RRFSounds", 26 | "name": "RRFSounds", 27 | "url": "https://www.dropbox.com/s/d8dfmb2facvkdh6/RRFSounds.zip?dl=1", 28 | "size": 80933991, 29 | "homepage": "https://discourse.cataclysmdda.org/t/ambient-sounds/9710/201" 30 | }, 31 | { 32 | "type": "direct_download", 33 | "viewname": "CDDA-Soundpack", 34 | "name": "CDDA-Soundpack", 35 | "url": "https://github.com/budg3/CDDA-Soundpack/archive/master.zip", 36 | "size": 48214543, 37 | "homepage": "https://github.com/budg3/CDDA-Soundpack" 38 | }, 39 | { 40 | "type": "direct_download", 41 | "viewname": "CO.AG SoundPack", 42 | "name": "CO.AG SoundPack", 43 | "url": "https://github.com/Fris0uman/CDDA-Soundpacks/releases/latest/download/CO.AG-Music-Only.zip", 44 | "homepage": "https://github.com/Fris0uman/CDDA-Soundpacks" 45 | }, 46 | { 47 | "type": "direct_download", 48 | "viewname": "CC-Sounds", 49 | "name": "CC-Sounds", 50 | "url": "https://github.com/Fris0uman/CDDA-Soundpacks/releases/latest/download/CC-Sounds.zip", 51 | "homepage": "https://github.com/Fris0uman/CDDA-Soundpacks" 52 | }, 53 | { 54 | "type": "direct_download", 55 | "viewname": "@'s soundpack", 56 | "name": "@'s soundpack", 57 | "url": "https://github.com/damalsk/damalsksoundpack/archive/v0.2.zip", 58 | "size": 164342384, 59 | "homepage": "https://github.com/damalsk/damalsksoundpack" 60 | }, 61 | { 62 | "type": "direct_download", 63 | "viewname": "Otopack", 64 | "name": "Otopack", 65 | "url": "https://github.com/Kenan2000/Otopack-Mods-Updates/archive/master.zip", 66 | "size": 139984997, 67 | "homepage": "https://github.com/Kenan2000/Otopack-Mods-Updates" 68 | } 69 | ] 70 | -------------------------------------------------------------------------------- /data/soundpacks.json.license: -------------------------------------------------------------------------------- 1 | SPDX-FileCopyrightText: 2015-2021 Rémy Roy 2 | 3 | SPDX-License-Identifier: MIT -------------------------------------------------------------------------------- /launcher.iss: -------------------------------------------------------------------------------- 1 | #define MyAppName "CDDA Game Launcher" 2 | #define MyAppVersion FileRead(FileOpen("cddagl\VERSION")) 3 | #define MyAppPublisher "Rémy Roy" 4 | #define MyAppURL "https://github.com/DazedNConfused-/CDDA-Game-Launcher" 5 | #define MyExecutable "Launcher.bat" 6 | #define MyIcon "cddagl\resources\launcher.ico" 7 | 8 | 9 | [Setup] 10 | AppId={{9EDF6480-19FB-4DE1-B2AB-353DCC636079} 11 | AppName={#MyAppName} 12 | AppVersion={#MyAppVersion} 13 | AppVerName={#MyAppName} v{#MyAppVersion} 14 | AppPublisher={#MyAppPublisher} 15 | AppPublisherURL={#MyAppURL} 16 | AppSupportURL={#MyAppURL} 17 | AppUpdatesURL={#MyAppURL} 18 | 19 | ;;;; Installer Behavior 20 | DefaultDirName={autopf}\{#MyAppName} 21 | DisableProgramGroupPage=yes 22 | UsedUserAreasWarning=no 23 | PrivilegesRequired=lowest 24 | PrivilegesRequiredOverridesAllowed=dialog 25 | Compression=lzma 26 | SolidCompression=yes 27 | WizardStyle=modern 28 | SourceDir=. 29 | 30 | ;;;; Installer Documentation 31 | LicenseFile=LICENSE 32 | ;InfoBeforeFile=README.md 33 | 34 | ;;;; Installer Icon, Filename & Path 35 | UninstallDisplayIcon={uninstallexe} 36 | SetupIconFile={#MyIcon} 37 | OutputDir=dist\innosetup 38 | OutputBaseFilename=cddagl_installer_v{#SetupSetting("AppVersion")} 39 | 40 | 41 | [Languages] 42 | Name: "english"; MessagesFile: "compiler:Default.isl" 43 | Name: "armenian"; MessagesFile: "compiler:Languages\Armenian.isl" 44 | Name: "brazilianportuguese"; MessagesFile: "compiler:Languages\BrazilianPortuguese.isl" 45 | Name: "catalan"; MessagesFile: "compiler:Languages\Catalan.isl" 46 | Name: "corsican"; MessagesFile: "compiler:Languages\Corsican.isl" 47 | Name: "czech"; MessagesFile: "compiler:Languages\Czech.isl" 48 | Name: "danish"; MessagesFile: "compiler:Languages\Danish.isl" 49 | Name: "dutch"; MessagesFile: "compiler:Languages\Dutch.isl" 50 | Name: "finnish"; MessagesFile: "compiler:Languages\Finnish.isl" 51 | Name: "french"; MessagesFile: "compiler:Languages\French.isl" 52 | Name: "german"; MessagesFile: "compiler:Languages\German.isl" 53 | Name: "hebrew"; MessagesFile: "compiler:Languages\Hebrew.isl" 54 | Name: "icelandic"; MessagesFile: "compiler:Languages\Icelandic.isl" 55 | Name: "italian"; MessagesFile: "compiler:Languages\Italian.isl" 56 | Name: "japanese"; MessagesFile: "compiler:Languages\Japanese.isl" 57 | Name: "norwegian"; MessagesFile: "compiler:Languages\Norwegian.isl" 58 | Name: "polish"; MessagesFile: "compiler:Languages\Polish.isl" 59 | Name: "portuguese"; MessagesFile: "compiler:Languages\Portuguese.isl" 60 | Name: "russian"; MessagesFile: "compiler:Languages\Russian.isl" 61 | Name: "slovenian"; MessagesFile: "compiler:Languages\Slovenian.isl" 62 | Name: "spanish"; MessagesFile: "compiler:Languages\Spanish.isl" 63 | Name: "turkish"; MessagesFile: "compiler:Languages\Turkish.isl" 64 | Name: "ukrainian"; MessagesFile: "compiler:Languages\Ukrainian.isl" 65 | 66 | 67 | [Dirs] 68 | Name: "{app}"; Flags: uninsalwaysuninstall; 69 | 70 | 71 | [Tasks] 72 | Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; 73 | 74 | 75 | [Files] 76 | Source: "build\archive\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs 77 | 78 | 79 | [Icons] 80 | Name: "{autoprograms}\{#MyAppName}"; Filename: "{app}\{#MyExecutable}"; IconFilename: "{app}\{#MyIcon}" 81 | Name: "{autodesktop}\{#MyAppName}"; Filename: "{app}\{#MyExecutable}"; IconFilename: "{app}\{#MyIcon}"; Tasks: desktopicon 82 | 83 | 84 | [Run] 85 | Filename: "{app}\{#MyExecutable}"; Description: "{cm:LaunchProgram,{#StringChange(MyAppName, '&', '&&')}}"; Flags: nowait postinstall skipifsilent 86 | 87 | 88 | [Code] 89 | //// NOTE: Code mostly "borrowed" from https://stackoverflow.com/a/2099805/236871 90 | 91 | function GetUninstallString(): String; 92 | var 93 | sUnInstPath: String; 94 | sUnInstallString: String; 95 | begin 96 | sUnInstPath := ExpandConstant('Software\Microsoft\Windows\CurrentVersion\Uninstall\{#SetupSetting("AppId")}_is1'); 97 | sUnInstallString := ''; 98 | 99 | if not RegQueryStringValue(HKLM, sUnInstPath, 'UninstallString', sUnInstallString) then 100 | RegQueryStringValue(HKCU, sUnInstPath, 'UninstallString', sUnInstallString); 101 | 102 | Result := sUnInstallString; 103 | end; 104 | 105 | 106 | function IsInstalled(): Boolean; 107 | begin 108 | Result := (GetUninstallString() <> ''); 109 | end; 110 | 111 | 112 | function UnInstallOldVersion(): Integer; 113 | var 114 | sUnInstallString: String; 115 | iResultCode: Integer; 116 | begin 117 | //// Return Values: 118 | //// 0 - successfully executed the UnInstallString 119 | //// 1 - UnInstallString is empty 120 | //// 2 - error executing the UnInstallString 121 | 122 | sUnInstallString := GetUninstallString(); 123 | if sUnInstallString = '' then 124 | Result := 1 125 | else 126 | begin 127 | sUnInstallString := RemoveQuotes(sUnInstallString); 128 | if Exec(sUnInstallString, '/SILENT /NORESTART /SUPPRESSMSGBOXES', '', SW_HIDE, ewWaitUntilTerminated, iResultCode) then 129 | Result := 0 130 | else 131 | Result := 2; 132 | end; 133 | end; 134 | 135 | 136 | function PrepareToInstall(var NeedsRestart: Boolean): String; 137 | var 138 | iMsgBoxAnswer: Integer; 139 | begin 140 | Result := ''; 141 | 142 | if IsInstalled() then 143 | begin 144 | iMsgBoxAnswer := MsgBox('{#SetupSetting("AppName")} is already installed.' + #13#10 145 | + 'Uninstall it before proceeding?', 146 | mbInformation, MB_YESNO); 147 | if iMsgBoxAnswer = IDYES then 148 | begin 149 | if UnInstallOldVersion() <> 0 then 150 | begin 151 | iMsgBoxAnswer := MsgBox('Failed to uninstall existing installation!' + #13#10 152 | + 'Try to reinstall anyways?' + #13#10 153 | + '(This has a good chance to fix it.)', 154 | mbInformation, MB_YESNO); 155 | if iMsgBoxAnswer = IDNO then 156 | Result := 'Failed to uninstall existing installation of {#SetupSetting("AppName")}!'; 157 | end 158 | end 159 | else 160 | Result := 'Please, uninstall existing installation of {#SetupSetting("AppName")} before running this setup!'; 161 | end; 162 | end; 163 | -------------------------------------------------------------------------------- /launcher.iss.license: -------------------------------------------------------------------------------- 1 | SPDX-FileCopyrightText: 2015-2021 Rémy Roy 2 | 3 | SPDX-License-Identifier: MIT -------------------------------------------------------------------------------- /requirements-dev.txt: -------------------------------------------------------------------------------- 1 | # SPDX-FileCopyrightText: 2015-2021 Rémy Roy 2 | # 3 | # SPDX-License-Identifier: MIT 4 | 5 | httpx 6 | transifex-client 7 | wheel 8 | -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | # SPDX-FileCopyrightText: 2015-2021 Rémy Roy 2 | # 3 | # SPDX-License-Identifier: MIT 4 | 5 | SQLAlchemy 6 | alembic 7 | PyQt5 8 | PyQt5-sip 9 | arrow 10 | rarfile 11 | Babel 12 | pywinutils 13 | markdown2 14 | Werkzeug 15 | pypiwin32 16 | pywin32 17 | httpx 18 | pylzma 19 | requests 20 | -------------------------------------------------------------------------------- /third-party/inno-setup/6.2.0/Compil32.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DazedNConfused-/CDDA-Game-Launcher/c52495a4d79a364d6c381042790bf33b5209d37c/third-party/inno-setup/6.2.0/Compil32.exe -------------------------------------------------------------------------------- /third-party/inno-setup/6.2.0/Examples/64Bit.iss: -------------------------------------------------------------------------------- 1 | ; -- 64Bit.iss -- 2 | ; Demonstrates installation of a program built for the x64 (a.k.a. AMD64) 3 | ; architecture. 4 | ; To successfully run this installation and the program it installs, 5 | ; you must have a "x64" edition of Windows. 6 | 7 | ; SEE THE DOCUMENTATION FOR DETAILS ON CREATING .ISS SCRIPT FILES! 8 | 9 | [Setup] 10 | AppName=My Program 11 | AppVersion=1.5 12 | WizardStyle=modern 13 | DefaultDirName={autopf}\My Program 14 | DefaultGroupName=My Program 15 | UninstallDisplayIcon={app}\MyProg.exe 16 | Compression=lzma2 17 | SolidCompression=yes 18 | OutputDir=userdocs:Inno Setup Examples Output 19 | ; "ArchitecturesAllowed=x64" specifies that Setup cannot run on 20 | ; anything but x64. 21 | ArchitecturesAllowed=x64 22 | ; "ArchitecturesInstallIn64BitMode=x64" requests that the install be 23 | ; done in "64-bit mode" on x64, meaning it should use the native 24 | ; 64-bit Program Files directory and the 64-bit view of the registry. 25 | ArchitecturesInstallIn64BitMode=x64 26 | 27 | [Files] 28 | Source: "MyProg-x64.exe"; DestDir: "{app}"; DestName: "MyProg.exe" 29 | Source: "MyProg.chm"; DestDir: "{app}" 30 | Source: "Readme.txt"; DestDir: "{app}"; Flags: isreadme 31 | 32 | [Icons] 33 | Name: "{group}\My Program"; Filename: "{app}\MyProg.exe" 34 | -------------------------------------------------------------------------------- /third-party/inno-setup/6.2.0/Examples/64BitThreeArch.iss: -------------------------------------------------------------------------------- 1 | ; -- 64BitThreeArch.iss -- 2 | ; Demonstrates how to install a program built for three different 3 | ; architectures (x86, x64, ARM64) using a single installer. 4 | 5 | ; SEE THE DOCUMENTATION FOR DETAILS ON CREATING .ISS SCRIPT FILES! 6 | 7 | [Setup] 8 | AppName=My Program 9 | AppVersion=1.5 10 | WizardStyle=modern 11 | DefaultDirName={autopf}\My Program 12 | DefaultGroupName=My Program 13 | UninstallDisplayIcon={app}\MyProg.exe 14 | Compression=lzma2 15 | SolidCompression=yes 16 | OutputDir=userdocs:Inno Setup Examples Output 17 | ; "ArchitecturesInstallIn64BitMode=x64 arm64" requests that the install 18 | ; be done in "64-bit mode" on x64 & ARM64, meaning it should use the 19 | ; native 64-bit Program Files directory and the 64-bit view of the 20 | ; registry. On all other architectures it will install in "32-bit mode". 21 | ArchitecturesInstallIn64BitMode=x64 arm64 22 | 23 | [Files] 24 | ; Install MyProg-x64.exe if running on x64, MyProg-ARM64.exe if 25 | ; running on ARM64, MyProg.exe otherwise. 26 | ; Place all x64 files here 27 | Source: "MyProg-x64.exe"; DestDir: "{app}"; DestName: "MyProg.exe"; Check: InstallX64 28 | ; Place all ARM64 files here, first one should be marked 'solidbreak' 29 | Source: "MyProg-ARM64.exe"; DestDir: "{app}"; DestName: "MyProg.exe"; Check: InstallARM64; Flags: solidbreak 30 | ; Place all x86 files here, first one should be marked 'solidbreak' 31 | Source: "MyProg.exe"; DestDir: "{app}"; Check: InstallOtherArch; Flags: solidbreak 32 | ; Place all common files here, first one should be marked 'solidbreak' 33 | Source: "MyProg.chm"; DestDir: "{app}"; Flags: solidbreak 34 | Source: "Readme.txt"; DestDir: "{app}"; Flags: isreadme 35 | 36 | [Icons] 37 | Name: "{group}\My Program"; Filename: "{app}\MyProg.exe" 38 | 39 | [Code] 40 | function InstallX64: Boolean; 41 | begin 42 | Result := Is64BitInstallMode and (ProcessorArchitecture = paX64); 43 | end; 44 | 45 | function InstallARM64: Boolean; 46 | begin 47 | Result := Is64BitInstallMode and (ProcessorArchitecture = paARM64); 48 | end; 49 | 50 | function InstallOtherArch: Boolean; 51 | begin 52 | Result := not InstallX64 and not InstallARM64; 53 | end; 54 | -------------------------------------------------------------------------------- /third-party/inno-setup/6.2.0/Examples/64BitTwoArch.iss: -------------------------------------------------------------------------------- 1 | ; -- 64BitTwoArch.iss -- 2 | ; Demonstrates how to install a program built for two different 3 | ; architectures (x86 and x64) using a single installer: on a "x86" 4 | ; edition of Windows the x86 version of the program will be 5 | ; installed but on a "x64" edition of Windows the x64 version will 6 | ; be installed. 7 | 8 | ; SEE THE DOCUMENTATION FOR DETAILS ON CREATING .ISS SCRIPT FILES! 9 | 10 | [Setup] 11 | AppName=My Program 12 | AppVersion=1.5 13 | DefaultDirName={autopf}\My Program 14 | DefaultGroupName=My Program 15 | UninstallDisplayIcon={app}\MyProg.exe 16 | WizardStyle=modern 17 | Compression=lzma2 18 | SolidCompression=yes 19 | OutputDir=userdocs:Inno Setup Examples Output 20 | ; "ArchitecturesInstallIn64BitMode=x64" requests that the install be 21 | ; done in "64-bit mode" on x64, meaning it should use the native 22 | ; 64-bit Program Files directory and the 64-bit view of the registry. 23 | ; On all other architectures it will install in "32-bit mode". 24 | ArchitecturesInstallIn64BitMode=x64 25 | ; Note: We don't set ProcessorsAllowed because we want this 26 | ; installation to run on all architectures (including Itanium, 27 | ; since it's capable of running 32-bit code too). 28 | 29 | [Files] 30 | ; Install MyProg-x64.exe if running in 64-bit mode (x64; see above), 31 | ; MyProg.exe otherwise. 32 | ; Place all x64 files here 33 | Source: "MyProg-x64.exe"; DestDir: "{app}"; DestName: "MyProg.exe"; Check: Is64BitInstallMode 34 | ; Place all x86 files here, first one should be marked 'solidbreak' 35 | Source: "MyProg.exe"; DestDir: "{app}"; Check: not Is64BitInstallMode; Flags: solidbreak 36 | ; Place all common files here, first one should be marked 'solidbreak' 37 | Source: "MyProg.chm"; DestDir: "{app}"; Flags: solidbreak 38 | Source: "Readme.txt"; DestDir: "{app}"; Flags: isreadme 39 | 40 | [Icons] 41 | Name: "{group}\My Program"; Filename: "{app}\MyProg.exe" 42 | -------------------------------------------------------------------------------- /third-party/inno-setup/6.2.0/Examples/AllPagesExample.iss: -------------------------------------------------------------------------------- 1 | ; -- AllPagesExample.iss -- 2 | ; Same as Example1.iss, but shows all the wizard pages Setup may potentially display 3 | 4 | ; SEE THE DOCUMENTATION FOR DETAILS ON CREATING .ISS SCRIPT FILES! 5 | 6 | [Setup] 7 | AppName=My Program 8 | AppVersion=1.5 9 | WizardStyle=modern 10 | DefaultDirName={autopf}\My Program 11 | DefaultGroupName=My Program 12 | UninstallDisplayIcon={app}\MyProg.exe 13 | Compression=lzma2 14 | SolidCompression=yes 15 | OutputDir=userdocs:Inno Setup Examples Output 16 | 17 | DisableWelcomePage=no 18 | LicenseFile=license.txt 19 | #define Password 'password' 20 | Password={#Password} 21 | InfoBeforeFile=readme.txt 22 | UserInfoPage=yes 23 | PrivilegesRequired=lowest 24 | DisableDirPage=no 25 | DisableProgramGroupPage=no 26 | InfoAfterFile=readme.txt 27 | 28 | [Files] 29 | Source: "MyProg.exe"; DestDir: "{app}" 30 | Source: "MyProg.chm"; DestDir: "{app}" 31 | Source: "Readme.txt"; DestDir: "{app}"; Flags: isreadme 32 | 33 | [Icons] 34 | Name: "{group}\My Program"; Filename: "{app}\MyProg.exe" 35 | 36 | [Components] 37 | Name: "component"; Description: "Component"; 38 | 39 | [Tasks] 40 | Name: "task"; Description: "Task"; 41 | 42 | [Code] 43 | var 44 | OutputProgressWizardPage: TOutputProgressWizardPage; 45 | OutputMarqueeProgressWizardPage: TOutputMarqueeProgressWizardPage; 46 | OutputProgressWizardPagesAfterID: Integer; 47 | 48 | procedure InitializeWizard; 49 | var 50 | InputQueryWizardPage: TInputQueryWizardPage; 51 | InputOptionWizardPage: TInputOptionWizardPage; 52 | InputDirWizardPage: TInputDirWizardPage; 53 | InputFileWizardPage: TInputFileWizardPage; 54 | OutputMsgWizardPage: TOutputMsgWizardPage; 55 | OutputMsgMemoWizardPage: TOutputMsgMemoWizardPage; 56 | AfterID: Integer; 57 | begin 58 | WizardForm.LicenseAcceptedRadio.Checked := True; 59 | WizardForm.PasswordEdit.Text := '{#Password}'; 60 | WizardForm.UserInfoNameEdit.Text := 'Username'; 61 | 62 | AfterID := wpSelectTasks; 63 | 64 | AfterID := CreateCustomPage(AfterID, 'CreateCustomPage', 'ADescription').ID; 65 | 66 | InputQueryWizardPage := CreateInputQueryPage(AfterID, 'CreateInputQueryPage', 'ADescription', 'ASubCaption'); 67 | InputQueryWizardPage.Add('&APrompt:', False); 68 | AfterID := InputQueryWizardPage.ID; 69 | 70 | InputOptionWizardPage := CreateInputOptionPage(AfterID, 'CreateInputOptionPage', 'ADescription', 'ASubCaption', False, False); 71 | InputOptionWizardPage.Add('&AOption'); 72 | AfterID := InputOptionWizardPage.ID; 73 | 74 | InputDirWizardPage := CreateInputDirPage(AfterID, 'CreateInputDirPage', 'ADescription', 'ASubCaption', False, 'ANewFolderName'); 75 | InputDirWizardPage.Add('&APrompt:'); 76 | InputDirWizardPage.Values[0] := 'C:\'; 77 | AfterID := InputDirWizardPage.ID; 78 | 79 | InputFileWizardPage := CreateInputFilePage(AfterID, 'CreateInputFilePage', 'ADescription', 'ASubCaption'); 80 | InputFileWizardPage.Add('&APrompt:', 'Executable files|*.exe|All files|*.*', '.exe'); 81 | AfterID := InputFileWizardPage.ID; 82 | 83 | OutputMsgWizardPage := CreateOutputMsgPage(AfterID, 'CreateOutputMsgPage', 'ADescription', 'AMsg'); 84 | AfterID := OutputMsgWizardPage.ID; 85 | 86 | OutputMsgMemoWizardPage := CreateOutputMsgMemoPage(AfterID, 'CreateOutputMsgMemoPage', 'ADescription', 'ASubCaption', 'AMsg'); 87 | AfterID := OutputMsgMemoWizardPage.ID; 88 | 89 | OutputProgressWizardPage := CreateOutputProgressPage('CreateOutputProgressPage', 'ADescription'); 90 | OutputMarqueeProgressWizardPage := CreateOutputMarqueeProgressPage('CreateOutputMarqueeProgressPage', 'ADescription'); 91 | OutputProgressWizardPagesAfterID := AfterID; 92 | 93 | { See CodeDownloadFiles.iss for a CreateDownloadPage example } 94 | end; 95 | 96 | function NextButtonClick(CurPageID: Integer): Boolean; 97 | var 98 | I, Max: Integer; 99 | begin 100 | if CurPageID = OutputProgressWizardPagesAfterID then begin 101 | try 102 | Max := 50; 103 | for I := 0 to Max do begin 104 | OutputProgressWizardPage.SetProgress(I, Max); 105 | if I = 0 then 106 | OutputProgressWizardPage.Show; 107 | Sleep(2000 div Max); 108 | end; 109 | finally 110 | OutputProgressWizardPage.Hide; 111 | end; 112 | try 113 | Max := 50; 114 | OutputMarqueeProgressWizardPage.Show; 115 | for I := 0 to Max do begin 116 | OutputMarqueeProgressWizardPage.Animate; 117 | Sleep(2000 div Max); 118 | end; 119 | finally 120 | OutputMarqueeProgressWizardPage.Hide; 121 | end; 122 | end; 123 | Result := True; 124 | end; 125 | 126 | function PrepareToInstall(var NeedsRestart: Boolean): String; 127 | begin 128 | if SuppressibleMsgBox('Do you want to stop Setup at the Preparing To Install wizard page?', mbConfirmation, MB_YESNO, IDNO) = IDYES then 129 | Result := 'Stopped by user'; 130 | end; -------------------------------------------------------------------------------- /third-party/inno-setup/6.2.0/Examples/CodeAutomation.iss: -------------------------------------------------------------------------------- 1 | ; -- CodeAutomation.iss -- 2 | ; 3 | ; This script shows how to use IDispatch based COM Automation objects. 4 | 5 | [Setup] 6 | AppName=My Program 7 | AppVersion=1.5 8 | WizardStyle=modern 9 | DisableWelcomePage=no 10 | CreateAppDir=no 11 | DisableProgramGroupPage=yes 12 | DefaultGroupName=My Program 13 | UninstallDisplayIcon={app}\MyProg.exe 14 | OutputDir=userdocs:Inno Setup Examples Output 15 | 16 | [Code] 17 | 18 | {--- SQLDMO ---} 19 | 20 | const 21 | SQLServerName = 'localhost'; 22 | SQLDMOGrowth_MB = 0; 23 | 24 | procedure SQLDMOButtonOnClick(Sender: TObject); 25 | var 26 | SQLServer, Database, DBFile, LogFile: Variant; 27 | IDColumn, NameColumn, Table: Variant; 28 | begin 29 | if MsgBox('Setup will now connect to Microsoft SQL Server ''' + SQLServerName + ''' via a trusted connection and create a database. Do you want to continue?', mbInformation, mb_YesNo) = idNo then 30 | Exit; 31 | 32 | { Create the main SQLDMO COM Automation object } 33 | 34 | try 35 | SQLServer := CreateOleObject('SQLDMO.SQLServer'); 36 | except 37 | RaiseException('Please install Microsoft SQL server connectivity tools first.'#13#13'(Error ''' + GetExceptionMessage + ''' occurred)'); 38 | end; 39 | 40 | { Connect to the Microsoft SQL Server } 41 | 42 | SQLServer.LoginSecure := True; 43 | SQLServer.Connect(SQLServerName); 44 | 45 | MsgBox('Connected to Microsoft SQL Server ''' + SQLServerName + '''.', mbInformation, mb_Ok); 46 | 47 | { Setup a database } 48 | 49 | Database := CreateOleObject('SQLDMO.Database'); 50 | Database.Name := 'Inno Setup'; 51 | 52 | DBFile := CreateOleObject('SQLDMO.DBFile'); 53 | DBFile.Name := 'ISData1'; 54 | DBFile.PhysicalName := 'c:\program files\microsoft sql server\mssql\data\IS.mdf'; 55 | DBFile.PrimaryFile := True; 56 | DBFile.FileGrowthType := SQLDMOGrowth_MB; 57 | DBFile.FileGrowth := 1; 58 | 59 | Database.FileGroups.Item('PRIMARY').DBFiles.Add(DBFile); 60 | 61 | LogFile := CreateOleObject('SQLDMO.LogFile'); 62 | LogFile.Name := 'ISLog1'; 63 | LogFile.PhysicalName := 'c:\program files\microsoft sql server\mssql\data\IS.ldf'; 64 | 65 | Database.TransactionLog.LogFiles.Add(LogFile); 66 | 67 | { Add the database } 68 | 69 | SQLServer.Databases.Add(Database); 70 | 71 | MsgBox('Added database ''' + Database.Name + '''.', mbInformation, mb_Ok); 72 | 73 | { Setup some columns } 74 | 75 | IDColumn := CreateOleObject('SQLDMO.Column'); 76 | IDColumn.Name := 'id'; 77 | IDColumn.Datatype := 'int'; 78 | IDColumn.Identity := True; 79 | IDColumn.IdentityIncrement := 1; 80 | IDColumn.IdentitySeed := 1; 81 | IDColumn.AllowNulls := False; 82 | 83 | NameColumn := CreateOleObject('SQLDMO.Column'); 84 | NameColumn.Name := 'name'; 85 | NameColumn.Datatype := 'varchar'; 86 | NameColumn.Length := '64'; 87 | NameColumn.AllowNulls := False; 88 | 89 | { Setup a table } 90 | 91 | Table := CreateOleObject('SQLDMO.Table'); 92 | Table.Name := 'authors'; 93 | Table.FileGroup := 'PRIMARY'; 94 | 95 | { Add the columns and the table } 96 | 97 | Table.Columns.Add(IDColumn); 98 | Table.Columns.Add(NameColumn); 99 | 100 | Database.Tables.Add(Table); 101 | 102 | MsgBox('Added table ''' + Table.Name + '''.', mbInformation, mb_Ok); 103 | end; 104 | 105 | {--- IIS ---} 106 | 107 | const 108 | IISServerName = 'localhost'; 109 | IISServerNumber = '1'; 110 | IISURL = 'http://127.0.0.1'; 111 | 112 | procedure IISButtonOnClick(Sender: TObject); 113 | var 114 | IIS, WebSite, WebServer, WebRoot, VDir: Variant; 115 | ErrorCode: Integer; 116 | begin 117 | if MsgBox('Setup will now connect to Microsoft IIS Server ''' + IISServerName + ''' and create a virtual directory. Do you want to continue?', mbInformation, mb_YesNo) = idNo then 118 | Exit; 119 | 120 | { Create the main IIS COM Automation object } 121 | 122 | try 123 | IIS := CreateOleObject('IISNamespace'); 124 | except 125 | RaiseException('Please install Microsoft IIS first.'#13#13'(Error ''' + GetExceptionMessage + ''' occurred)'); 126 | end; 127 | 128 | { Connect to the IIS server } 129 | 130 | WebSite := IIS.GetObject('IIsWebService', IISServerName + '/w3svc'); 131 | WebServer := WebSite.GetObject('IIsWebServer', IISServerNumber); 132 | WebRoot := WebServer.GetObject('IIsWebVirtualDir', 'Root'); 133 | 134 | { (Re)create a virtual dir } 135 | 136 | try 137 | WebRoot.Delete('IIsWebVirtualDir', 'innosetup'); 138 | WebRoot.SetInfo(); 139 | except 140 | end; 141 | 142 | VDir := WebRoot.Create('IIsWebVirtualDir', 'innosetup'); 143 | VDir.AccessRead := True; 144 | VDir.AppFriendlyName := 'Inno Setup'; 145 | VDir.Path := 'C:\inetpub\innosetup'; 146 | VDir.AppCreate(True); 147 | VDir.SetInfo(); 148 | 149 | MsgBox('Created virtual directory ''' + VDir.Path + '''.', mbInformation, mb_Ok); 150 | 151 | { Write some html and display it } 152 | 153 | if MsgBox('Setup will now write some HTML and display the virtual directory. Do you want to continue?', mbInformation, mb_YesNo) = idNo then 154 | Exit; 155 | 156 | ForceDirectories(VDir.Path); 157 | SaveStringToFile(VDir.Path + '/index.htm', 'Inno Setup rocks!', False); 158 | if not ShellExecAsOriginalUser('open', IISURL + '/innosetup/index.htm', '', '', SW_SHOWNORMAL, ewNoWait, ErrorCode) then 159 | MsgBox('Can''t display the created virtual directory: ''' + SysErrorMessage(ErrorCode) + '''.', mbError, mb_Ok); 160 | end; 161 | 162 | {--- MSXML ---} 163 | 164 | const 165 | XMLURL = 'http://jrsoftware.github.io/issrc/ISHelp/isxfunc.xml'; 166 | XMLFileName = 'isxfunc.xml'; 167 | XMLFileName2 = 'isxfuncmodified.xml'; 168 | 169 | procedure MSXMLButtonOnClick(Sender: TObject); 170 | var 171 | XMLHTTP, XMLDoc, NewNode, RootNode: Variant; 172 | Path: String; 173 | begin 174 | if MsgBox('Setup will now use MSXML to download XML file ''' + XMLURL + ''' and save it to disk.'#13#13'Setup will then load, modify and save this XML file. Do you want to continue?', mbInformation, mb_YesNo) = idNo then 175 | Exit; 176 | 177 | { Create the main MSXML COM Automation object } 178 | 179 | try 180 | XMLHTTP := CreateOleObject('MSXML2.ServerXMLHTTP'); 181 | except 182 | RaiseException('Please install MSXML first.'#13#13'(Error ''' + GetExceptionMessage + ''' occurred)'); 183 | end; 184 | 185 | { Download the XML file } 186 | 187 | XMLHTTP.Open('GET', XMLURL, False); 188 | XMLHTTP.Send(); 189 | 190 | Path := ExpandConstant('{src}\'); 191 | XMLHTTP.responseXML.Save(Path + XMLFileName); 192 | 193 | MsgBox('Downloaded the XML file and saved it as ''' + XMLFileName + '''.', mbInformation, mb_Ok); 194 | 195 | { Load the XML File } 196 | 197 | XMLDoc := CreateOleObject('MSXML2.DOMDocument'); 198 | XMLDoc.async := False; 199 | XMLDoc.resolveExternals := False; 200 | XMLDoc.load(Path + XMLFileName); 201 | if XMLDoc.parseError.errorCode <> 0 then 202 | RaiseException('Error on line ' + IntToStr(XMLDoc.parseError.line) + ', position ' + IntToStr(XMLDoc.parseError.linepos) + ': ' + XMLDoc.parseError.reason); 203 | 204 | MsgBox('Loaded the XML file.', mbInformation, mb_Ok); 205 | 206 | { Modify the XML document } 207 | 208 | NewNode := XMLDoc.createElement('isxdemo'); 209 | RootNode := XMLDoc.documentElement; 210 | RootNode.appendChild(NewNode); 211 | RootNode.lastChild.text := 'Hello, World'; 212 | 213 | { Save the XML document } 214 | 215 | XMLDoc.Save(Path + XMLFileName2); 216 | 217 | MsgBox('Saved the modified XML as ''' + XMLFileName2 + '''.', mbInformation, mb_Ok); 218 | end; 219 | 220 | 221 | {--- Word ---} 222 | 223 | procedure WordButtonOnClick(Sender: TObject); 224 | var 225 | Word: Variant; 226 | begin 227 | if MsgBox('Setup will now check whether Microsoft Word is running. Do you want to continue?', mbInformation, mb_YesNo) = idNo then 228 | Exit; 229 | 230 | { Try to get an active Word COM Automation object } 231 | 232 | try 233 | Word := GetActiveOleObject('Word.Application'); 234 | except 235 | end; 236 | 237 | if VarIsEmpty(Word) then 238 | MsgBox('Microsoft Word is not running.', mbInformation, mb_Ok) 239 | else 240 | MsgBox('Microsoft Word is running.', mbInformation, mb_Ok) 241 | end; 242 | 243 | {--- Windows Firewall ---} 244 | 245 | const 246 | NET_FW_IP_VERSION_ANY = 2; 247 | NET_FW_SCOPE_ALL = 0; 248 | 249 | procedure FirewallButtonOnClick(Sender: TObject); 250 | var 251 | Firewall, Application: Variant; 252 | begin 253 | if MsgBox('Setup will now add itself to Windows Firewall as an authorized application for the current profile (' + GetUserNameString + '). Do you want to continue?', mbInformation, mb_YesNo) = idNo then 254 | Exit; 255 | 256 | { Create the main Windows Firewall COM Automation object } 257 | 258 | try 259 | Firewall := CreateOleObject('HNetCfg.FwMgr'); 260 | except 261 | RaiseException('Please install Windows Firewall first.'#13#13'(Error ''' + GetExceptionMessage + ''' occurred)'); 262 | end; 263 | 264 | { Add the authorization } 265 | 266 | Application := CreateOleObject('HNetCfg.FwAuthorizedApplication'); 267 | Application.Name := 'Setup'; 268 | Application.IPVersion := NET_FW_IP_VERSION_ANY; 269 | Application.ProcessImageFileName := ExpandConstant('{srcexe}'); 270 | Application.Scope := NET_FW_SCOPE_ALL; 271 | Application.Enabled := True; 272 | 273 | Firewall.LocalPolicy.CurrentProfile.AuthorizedApplications.Add(Application); 274 | 275 | MsgBox('Setup is now an authorized application for the current profile', mbInformation, mb_Ok); 276 | end; 277 | 278 | {---} 279 | 280 | procedure CreateButton(ALeft, ATop: Integer; ACaption: String; ANotifyEvent: TNotifyEvent); 281 | begin 282 | with TNewButton.Create(WizardForm) do begin 283 | Left := ALeft; 284 | Top := ATop; 285 | Width := WizardForm.CancelButton.Width; 286 | Height := WizardForm.CancelButton.Height; 287 | Caption := ACaption; 288 | OnClick := ANotifyEvent; 289 | Parent := WizardForm.WelcomePage; 290 | end; 291 | end; 292 | 293 | procedure InitializeWizard(); 294 | var 295 | Left, LeftInc, Top, TopInc: Integer; 296 | begin 297 | Left := WizardForm.WelcomeLabel2.Left; 298 | LeftInc := WizardForm.CancelButton.Width + ScaleX(8); 299 | TopInc := WizardForm.CancelButton.Height + ScaleY(8); 300 | Top := WizardForm.WelcomeLabel2.Top + WizardForm.WelcomeLabel2.Height - 4*TopInc; 301 | 302 | CreateButton(Left, Top, '&SQLDMO...', @SQLDMOButtonOnClick); 303 | Top := Top + TopInc; 304 | CreateButton(Left + LeftInc, Top, '&Firewall...', @FirewallButtonOnClick); 305 | Top := Top + TopInc; 306 | CreateButton(Left, Top, '&IIS...', @IISButtonOnClick); 307 | Top := Top + TopInc; 308 | CreateButton(Left, Top, '&MSXML...', @MSXMLButtonOnClick); 309 | Top := Top + TopInc; 310 | CreateButton(Left, Top, '&Word...', @WordButtonOnClick); 311 | end; -------------------------------------------------------------------------------- /third-party/inno-setup/6.2.0/Examples/CodeDlg.iss: -------------------------------------------------------------------------------- 1 | ; -- CodeDlg.iss -- 2 | ; 3 | ; This script shows how to insert custom wizard pages into Setup and how to handle 4 | ; these pages. Furthermore it shows how to 'communicate' between the [Code] section 5 | ; and the regular Inno Setup sections using {code:...} constants. Finally it shows 6 | ; how to customize the settings text on the 'Ready To Install' page. 7 | 8 | [Setup] 9 | AppName=My Program 10 | AppVersion=1.5 11 | WizardStyle=modern 12 | DisableWelcomePage=no 13 | DefaultDirName={autopf}\My Program 14 | DisableProgramGroupPage=yes 15 | UninstallDisplayIcon={app}\MyProg.exe 16 | OutputDir=userdocs:Inno Setup Examples Output 17 | PrivilegesRequired=lowest 18 | 19 | [Files] 20 | Source: "MyProg.exe"; DestDir: "{app}" 21 | Source: "MyProg.chm"; DestDir: "{app}" 22 | Source: "Readme.txt"; DestDir: "{app}"; Flags: isreadme 23 | 24 | [Registry] 25 | Root: HKA; Subkey: "Software\My Company"; Flags: uninsdeletekeyifempty 26 | Root: HKA; Subkey: "Software\My Company\My Program"; Flags: uninsdeletekey 27 | Root: HKA; Subkey: "Software\My Company\My Program\Settings"; ValueType: string; ValueName: "Name"; ValueData: "{code:GetUser|Name}" 28 | Root: HKA; Subkey: "Software\My Company\My Program\Settings"; ValueType: string; ValueName: "Company"; ValueData: "{code:GetUser|Company}" 29 | Root: HKA; Subkey: "Software\My Company\My Program\Settings"; ValueType: string; ValueName: "DataDir"; ValueData: "{code:GetDataDir}" 30 | ; etc. 31 | 32 | [Dirs] 33 | Name: {code:GetDataDir}; Flags: uninsneveruninstall 34 | 35 | [Code] 36 | var 37 | UserPage: TInputQueryWizardPage; 38 | UsagePage: TInputOptionWizardPage; 39 | LightMsgPage: TOutputMsgWizardPage; 40 | KeyPage: TInputQueryWizardPage; 41 | ProgressPage: TOutputProgressWizardPage; 42 | DataDirPage: TInputDirWizardPage; 43 | 44 | procedure InitializeWizard; 45 | begin 46 | { Create the pages } 47 | 48 | UserPage := CreateInputQueryPage(wpWelcome, 49 | 'Personal Information', 'Who are you?', 50 | 'Please specify your name and the company for whom you work, then click Next.'); 51 | UserPage.Add('Name:', False); 52 | UserPage.Add('Company:', False); 53 | 54 | UsagePage := CreateInputOptionPage(UserPage.ID, 55 | 'Personal Information', 'How will you use My Program?', 56 | 'Please specify how you would like to use My Program, then click Next.', 57 | True, False); 58 | UsagePage.Add('Light mode (no ads, limited functionality)'); 59 | UsagePage.Add('Sponsored mode (with ads, full functionality)'); 60 | UsagePage.Add('Paid mode (no ads, full functionality)'); 61 | 62 | LightMsgPage := CreateOutputMsgPage(UsagePage.ID, 63 | 'Personal Information', 'How will you use My Program?', 64 | 'Note: to enjoy all features My Program can offer and to support its development, ' + 65 | 'you can switch to sponsored or paid mode at any time by selecting ''Usage Mode'' ' + 66 | 'in the ''Help'' menu of My Program after the installation has completed.'#13#13 + 67 | 'Click Back if you want to change your usage mode setting now, or click Next to ' + 68 | 'continue with the installation.'); 69 | 70 | KeyPage := CreateInputQueryPage(UsagePage.ID, 71 | 'Personal Information', 'What''s your registration key?', 72 | 'Please specify your registration key and click Next to continue. If you don''t ' + 73 | 'have a valid registration key, click Back to choose a different usage mode.'); 74 | KeyPage.Add('Registration key:', False); 75 | 76 | ProgressPage := CreateOutputProgressPage('Personal Information', 77 | 'What''s your registration key?'); 78 | 79 | DataDirPage := CreateInputDirPage(wpSelectDir, 80 | 'Select Personal Data Directory', 'Where should personal data files be installed?', 81 | 'Select the folder in which Setup should install personal data files, then click Next.', 82 | False, ''); 83 | DataDirPage.Add(''); 84 | 85 | { Set default values, using settings that were stored last time if possible } 86 | 87 | UserPage.Values[0] := GetPreviousData('Name', ExpandConstant('{sysuserinfoname}')); 88 | UserPage.Values[1] := GetPreviousData('Company', ExpandConstant('{sysuserinfoorg}')); 89 | 90 | case GetPreviousData('UsageMode', '') of 91 | 'light': UsagePage.SelectedValueIndex := 0; 92 | 'sponsored': UsagePage.SelectedValueIndex := 1; 93 | 'paid': UsagePage.SelectedValueIndex := 2; 94 | else 95 | UsagePage.SelectedValueIndex := 1; 96 | end; 97 | 98 | DataDirPage.Values[0] := GetPreviousData('DataDir', ''); 99 | end; 100 | 101 | procedure RegisterPreviousData(PreviousDataKey: Integer); 102 | var 103 | UsageMode: String; 104 | begin 105 | { Store the settings so we can restore them next time } 106 | SetPreviousData(PreviousDataKey, 'Name', UserPage.Values[0]); 107 | SetPreviousData(PreviousDataKey, 'Company', UserPage.Values[1]); 108 | case UsagePage.SelectedValueIndex of 109 | 0: UsageMode := 'light'; 110 | 1: UsageMode := 'sponsored'; 111 | 2: UsageMode := 'paid'; 112 | end; 113 | SetPreviousData(PreviousDataKey, 'UsageMode', UsageMode); 114 | SetPreviousData(PreviousDataKey, 'DataDir', DataDirPage.Values[0]); 115 | end; 116 | 117 | function ShouldSkipPage(PageID: Integer): Boolean; 118 | begin 119 | { Skip pages that shouldn't be shown } 120 | if (PageID = LightMsgPage.ID) and (UsagePage.SelectedValueIndex <> 0) then 121 | Result := True 122 | else if (PageID = KeyPage.ID) and (UsagePage.SelectedValueIndex <> 2) then 123 | Result := True 124 | else 125 | Result := False; 126 | end; 127 | 128 | function NextButtonClick(CurPageID: Integer): Boolean; 129 | var 130 | I: Integer; 131 | begin 132 | { Validate certain pages before allowing the user to proceed } 133 | if CurPageID = UserPage.ID then begin 134 | if UserPage.Values[0] = '' then begin 135 | MsgBox('You must enter your name.', mbError, MB_OK); 136 | Result := False; 137 | end else begin 138 | if DataDirPage.Values[0] = '' then 139 | DataDirPage.Values[0] := 'C:\' + UserPage.Values[0]; 140 | Result := True; 141 | end; 142 | end else if CurPageID = KeyPage.ID then begin 143 | { Just to show how 'OutputProgress' pages work. 144 | Always use a try..finally between the Show and Hide calls as shown below. } 145 | ProgressPage.SetText('Authorizing registration key...', ''); 146 | ProgressPage.SetProgress(0, 0); 147 | ProgressPage.Show; 148 | try 149 | for I := 0 to 10 do begin 150 | ProgressPage.SetProgress(I, 10); 151 | Sleep(100); 152 | end; 153 | finally 154 | ProgressPage.Hide; 155 | end; 156 | if GetSHA1OfString('codedlg' + KeyPage.Values[0]) = '8013f310d340dab18a0d0cda2b5b115d2dcd97e4' then 157 | Result := True 158 | else begin 159 | MsgBox('You must enter a valid registration key. (Hint: The key is "inno".)', mbError, MB_OK); 160 | Result := False; 161 | end; 162 | end else 163 | Result := True; 164 | end; 165 | 166 | function UpdateReadyMemo(Space, NewLine, MemoUserInfoInfo, MemoDirInfo, MemoTypeInfo, 167 | MemoComponentsInfo, MemoGroupInfo, MemoTasksInfo: String): String; 168 | var 169 | S: String; 170 | begin 171 | { Fill the 'Ready Memo' with the normal settings and the custom settings } 172 | S := ''; 173 | S := S + 'Personal Information:' + NewLine; 174 | S := S + Space + UserPage.Values[0] + NewLine; 175 | if UserPage.Values[1] <> '' then 176 | S := S + Space + UserPage.Values[1] + NewLine; 177 | S := S + NewLine; 178 | 179 | S := S + 'Usage Mode:' + NewLine + Space; 180 | case UsagePage.SelectedValueIndex of 181 | 0: S := S + 'Light mode'; 182 | 1: S := S + 'Sponsored mode'; 183 | 2: S := S + 'Paid mode'; 184 | end; 185 | S := S + NewLine + NewLine; 186 | 187 | S := S + MemoDirInfo + NewLine; 188 | S := S + Space + DataDirPage.Values[0] + ' (personal data files)' + NewLine; 189 | 190 | Result := S; 191 | end; 192 | 193 | function GetUser(Param: String): String; 194 | begin 195 | { Return a user value } 196 | { Could also be split into separate GetUserName and GetUserCompany functions } 197 | if Param = 'Name' then 198 | Result := UserPage.Values[0] 199 | else if Param = 'Company' then 200 | Result := UserPage.Values[1]; 201 | end; 202 | 203 | function GetDataDir(Param: String): String; 204 | begin 205 | { Return the selected DataDir } 206 | Result := DataDirPage.Values[0]; 207 | end; 208 | -------------------------------------------------------------------------------- /third-party/inno-setup/6.2.0/Examples/CodeDll.iss: -------------------------------------------------------------------------------- 1 | ; -- CodeDll.iss -- 2 | ; 3 | ; This script shows how to call functions in external DLLs (like Windows API functions) 4 | ; at runtime and how to perform direct callbacks from these functions to functions 5 | ; in the script. 6 | 7 | [Setup] 8 | AppName=My Program 9 | AppVersion=1.5 10 | WizardStyle=modern 11 | DefaultDirName={autopf}\My Program 12 | DisableProgramGroupPage=yes 13 | DisableWelcomePage=no 14 | UninstallDisplayIcon={app}\MyProg.exe 15 | OutputDir=userdocs:Inno Setup Examples Output 16 | 17 | [Files] 18 | Source: "MyProg.exe"; DestDir: "{app}" 19 | Source: "MyProg.chm"; DestDir: "{app}" 20 | Source: "Readme.txt"; DestDir: "{app}"; Flags: isreadme 21 | ; Install our DLL to {app} so we can access it at uninstall time. 22 | ; Use "Flags: dontcopy" if you don't need uninstall time access. 23 | Source: "MyDll.dll"; DestDir: "{app}" 24 | 25 | [Code] 26 | const 27 | MB_ICONINFORMATION = $40; 28 | 29 | // Importing a Unicode Windows API function. 30 | function MessageBox(hWnd: Integer; lpText, lpCaption: String; uType: Cardinal): Integer; 31 | external 'MessageBoxW@user32.dll stdcall'; 32 | 33 | // Importing an ANSI custom DLL function, first for Setup, then for uninstall. 34 | procedure MyDllFuncSetup(hWnd: Integer; lpText, lpCaption: AnsiString; uType: Cardinal); 35 | external 'MyDllFunc@files:MyDll.dll stdcall setuponly'; 36 | 37 | procedure MyDllFuncUninstall(hWnd: Integer; lpText, lpCaption: AnsiString; uType: Cardinal); 38 | external 'MyDllFunc@{app}\MyDll.dll stdcall uninstallonly'; 39 | 40 | // Importing an ANSI function for a DLL which might not exist at runtime. 41 | procedure DelayLoadedFunc(hWnd: Integer; lpText, lpCaption: AnsiString; uType: Cardinal); 42 | external 'DllFunc@DllWhichMightNotExist.dll stdcall delayload'; 43 | 44 | function NextButtonClick(CurPage: Integer): Boolean; 45 | var 46 | hWnd: Integer; 47 | begin 48 | if CurPage = wpWelcome then begin 49 | hWnd := StrToInt(ExpandConstant('{wizardhwnd}')); 50 | 51 | MessageBox(hWnd, 'Hello from Windows API function', 'MessageBoxA', MB_OK or MB_ICONINFORMATION); 52 | 53 | MyDllFuncSetup(hWnd, 'Hello from custom DLL function', 'MyDllFunc', MB_OK or MB_ICONINFORMATION); 54 | 55 | try 56 | // If this DLL does not exist (it shouldn't), an exception will be raised. Press F9 to continue. 57 | DelayLoadedFunc(hWnd, 'Hello from delay loaded function', 'DllFunc', MB_OK or MB_ICONINFORMATION); 58 | except 59 | // 60 | end; 61 | end; 62 | Result := True; 63 | end; 64 | 65 | procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep); 66 | begin 67 | // Call our function just before the actual uninstall process begins. 68 | if CurUninstallStep = usUninstall then begin 69 | MyDllFuncUninstall(0, 'Hello from custom DLL function', 'MyDllFunc', MB_OK or MB_ICONINFORMATION); 70 | 71 | // Now that we're finished with it, unload MyDll.dll from memory. 72 | // We have to do this so that the uninstaller will be able to remove the DLL and the {app} directory. 73 | UnloadDLL(ExpandConstant('{app}\MyDll.dll')); 74 | end; 75 | end; 76 | 77 | // The following shows how to use callbacks. 78 | 79 | function SetTimer(hWnd, nIDEvent, uElapse, lpTimerFunc: Longword): Longword; 80 | external 'SetTimer@user32.dll stdcall'; 81 | 82 | var 83 | TimerCount: Integer; 84 | 85 | procedure MyTimerProc(Arg1, Arg2, Arg3, Arg4: Longword); 86 | begin 87 | Inc(TimerCount); 88 | WizardForm.BeveledLabel.Caption := ' Timer! ' + IntToStr(TimerCount) + ' '; 89 | WizardForm.BeveledLabel.Visible := True; 90 | end; 91 | 92 | procedure InitializeWizard; 93 | begin 94 | SetTimer(0, 0, 1000, CreateCallback(@MyTimerProc)); 95 | end; 96 | -------------------------------------------------------------------------------- /third-party/inno-setup/6.2.0/Examples/CodeDownloadFiles.iss: -------------------------------------------------------------------------------- 1 | ; -- CodeDownloadFiles.iss -- 2 | ; 3 | ; This script shows how the CreateDownloadPage support function can be used to 4 | ; download temporary files while showing the download progress to the user. 5 | 6 | [Setup] 7 | AppName=My Program 8 | AppVersion=1.5 9 | WizardStyle=modern 10 | DefaultDirName={autopf}\My Program 11 | DefaultGroupName=My Program 12 | UninstallDisplayIcon={app}\MyProg.exe 13 | OutputDir=userdocs:Inno Setup Examples Output 14 | 15 | [Files] 16 | ; Place any regular files here 17 | Source: "MyProg.exe"; DestDir: "{app}"; 18 | Source: "MyProg.chm"; DestDir: "{app}"; 19 | Source: "Readme.txt"; DestDir: "{app}"; Flags: isreadme; 20 | ; These files will be downloaded 21 | Source: "{tmp}\innosetup-latest.exe"; DestDir: "{app}"; Flags: external 22 | Source: "{tmp}\ISCrypt.dll"; DestDir: "{app}"; Flags: external 23 | 24 | [Icons] 25 | Name: "{group}\My Program"; Filename: "{app}\MyProg.exe" 26 | 27 | [Code] 28 | var 29 | DownloadPage: TDownloadWizardPage; 30 | 31 | function OnDownloadProgress(const Url, FileName: String; const Progress, ProgressMax: Int64): Boolean; 32 | begin 33 | if Progress = ProgressMax then 34 | Log(Format('Successfully downloaded file to {tmp}: %s', [FileName])); 35 | Result := True; 36 | end; 37 | 38 | procedure InitializeWizard; 39 | begin 40 | DownloadPage := CreateDownloadPage(SetupMessage(msgWizardPreparing), SetupMessage(msgPreparingDesc), @OnDownloadProgress); 41 | end; 42 | 43 | function NextButtonClick(CurPageID: Integer): Boolean; 44 | begin 45 | if CurPageID = wpReady then begin 46 | DownloadPage.Clear; 47 | DownloadPage.Add('https://jrsoftware.org/download.php/is.exe', 'innosetup-latest.exe', ''); 48 | DownloadPage.Add('https://jrsoftware.org/download.php/iscrypt.dll', 'ISCrypt.dll', '2f6294f9aa09f59a574b5dcd33be54e16b39377984f3d5658cda44950fa0f8fc'); 49 | DownloadPage.Show; 50 | try 51 | try 52 | DownloadPage.Download; // This downloads the files to {tmp} 53 | Result := True; 54 | except 55 | if DownloadPage.AbortedByUser then 56 | Log('Aborted by user.') 57 | else 58 | SuppressibleMsgBox(AddPeriod(GetExceptionMessage), mbCriticalError, MB_OK, IDOK); 59 | Result := False; 60 | end; 61 | finally 62 | DownloadPage.Hide; 63 | end; 64 | end else 65 | Result := True; 66 | end; -------------------------------------------------------------------------------- /third-party/inno-setup/6.2.0/Examples/CodeExample1.iss: -------------------------------------------------------------------------------- 1 | ; -- CodeExample1.iss -- 2 | ; 3 | ; This script shows various things you can achieve using a [Code] section. 4 | 5 | [Setup] 6 | AppName=My Program 7 | AppVersion=1.5 8 | WizardStyle=modern 9 | DisableWelcomePage=no 10 | DefaultDirName={code:MyConst}\My Program 11 | DefaultGroupName=My Program 12 | UninstallDisplayIcon={app}\MyProg.exe 13 | InfoBeforeFile=Readme.txt 14 | OutputDir=userdocs:Inno Setup Examples Output 15 | 16 | [Files] 17 | Source: "MyProg.exe"; DestDir: "{app}"; Check: MyProgCheck; BeforeInstall: BeforeMyProgInstall('MyProg.exe'); AfterInstall: AfterMyProgInstall('MyProg.exe') 18 | Source: "MyProg.chm"; DestDir: "{app}"; Check: MyProgCheck; BeforeInstall: BeforeMyProgInstall('MyProg.chm'); AfterInstall: AfterMyProgInstall('MyProg.chm') 19 | Source: "Readme.txt"; DestDir: "{app}"; Flags: isreadme 20 | 21 | [Icons] 22 | Name: "{group}\My Program"; Filename: "{app}\MyProg.exe" 23 | 24 | [Code] 25 | var 26 | MyProgChecked: Boolean; 27 | MyProgCheckResult: Boolean; 28 | FinishedInstall: Boolean; 29 | 30 | function InitializeSetup(): Boolean; 31 | begin 32 | Log('InitializeSetup called'); 33 | Result := MsgBox('InitializeSetup:' #13#13 'Setup is initializing. Do you really want to start setup?', mbConfirmation, MB_YESNO) = idYes; 34 | if Result = False then 35 | MsgBox('InitializeSetup:' #13#13 'Ok, bye bye.', mbInformation, MB_OK); 36 | end; 37 | 38 | procedure InitializeWizard; 39 | begin 40 | Log('InitializeWizard called'); 41 | end; 42 | 43 | 44 | procedure InitializeWizard2; 45 | begin 46 | Log('InitializeWizard2 called'); 47 | end; 48 | 49 | procedure DeinitializeSetup(); 50 | var 51 | FileName: String; 52 | ResultCode: Integer; 53 | begin 54 | Log('DeinitializeSetup called'); 55 | if FinishedInstall then begin 56 | if MsgBox('DeinitializeSetup:' #13#13 'The [Code] scripting demo has finished. Do you want to uninstall My Program now?', mbConfirmation, MB_YESNO) = idYes then begin 57 | FileName := ExpandConstant('{uninstallexe}'); 58 | if not Exec(FileName, '', '', SW_SHOWNORMAL, ewNoWait, ResultCode) then 59 | MsgBox('DeinitializeSetup:' #13#13 'Execution of ''' + FileName + ''' failed. ' + SysErrorMessage(ResultCode) + '.', mbError, MB_OK); 60 | end else 61 | MsgBox('DeinitializeSetup:' #13#13 'Ok, bye bye.', mbInformation, MB_OK); 62 | end; 63 | end; 64 | 65 | procedure CurStepChanged(CurStep: TSetupStep); 66 | begin 67 | Log('CurStepChanged(' + IntToStr(Ord(CurStep)) + ') called'); 68 | if CurStep = ssPostInstall then 69 | FinishedInstall := True; 70 | end; 71 | 72 | procedure CurInstallProgressChanged(CurProgress, MaxProgress: Integer); 73 | begin 74 | Log('CurInstallProgressChanged(' + IntToStr(CurProgress) + ', ' + IntToStr(MaxProgress) + ') called'); 75 | end; 76 | 77 | function NextButtonClick(CurPageID: Integer): Boolean; 78 | var 79 | ResultCode: Integer; 80 | begin 81 | Log('NextButtonClick(' + IntToStr(CurPageID) + ') called'); 82 | case CurPageID of 83 | wpSelectDir: 84 | MsgBox('NextButtonClick:' #13#13 'You selected: ''' + WizardDirValue + '''.', mbInformation, MB_OK); 85 | wpSelectProgramGroup: 86 | MsgBox('NextButtonClick:' #13#13 'You selected: ''' + WizardGroupValue + '''.', mbInformation, MB_OK); 87 | wpReady: 88 | begin 89 | if MsgBox('NextButtonClick:' #13#13 'Using the script, files can be extracted before the installation starts. For example we could extract ''MyProg.exe'' now and run it.' #13#13 'Do you want to do this?', mbConfirmation, MB_YESNO) = idYes then begin 90 | ExtractTemporaryFile('myprog.exe'); 91 | if not ExecAsOriginalUser(ExpandConstant('{tmp}\myprog.exe'), '', '', SW_SHOWNORMAL, ewWaitUntilTerminated, ResultCode) then 92 | MsgBox('NextButtonClick:' #13#13 'The file could not be executed. ' + SysErrorMessage(ResultCode) + '.', mbError, MB_OK); 93 | end; 94 | BringToFrontAndRestore(); 95 | MsgBox('NextButtonClick:' #13#13 'The normal installation will now start.', mbInformation, MB_OK); 96 | end; 97 | end; 98 | 99 | Result := True; 100 | end; 101 | 102 | function BackButtonClick(CurPageID: Integer): Boolean; 103 | begin 104 | Log('BackButtonClick(' + IntToStr(CurPageID) + ') called'); 105 | Result := True; 106 | end; 107 | 108 | function ShouldSkipPage(PageID: Integer): Boolean; 109 | begin 110 | Log('ShouldSkipPage(' + IntToStr(PageID) + ') called'); 111 | { Skip wpInfoBefore page; show all others } 112 | case PageID of 113 | wpInfoBefore: 114 | Result := True; 115 | else 116 | Result := False; 117 | end; 118 | end; 119 | 120 | procedure CurPageChanged(CurPageID: Integer); 121 | begin 122 | Log('CurPageChanged(' + IntToStr(CurPageID) + ') called'); 123 | case CurPageID of 124 | wpWelcome: 125 | MsgBox('CurPageChanged:' #13#13 'Welcome to the [Code] scripting demo. This demo will show you some possibilities of the scripting support.' #13#13 'The scripting engine used is RemObjects Pascal Script by Carlo Kok. See http://www.remobjects.com/ps for more information.', mbInformation, MB_OK); 126 | wpFinished: 127 | MsgBox('CurPageChanged:' #13#13 'Welcome to final page of this demo. Click Finish to exit.', mbInformation, MB_OK); 128 | end; 129 | end; 130 | 131 | function PrepareToInstall(var NeedsRestart: Boolean): String; 132 | begin 133 | Log('PrepareToInstall() called'); 134 | if MsgBox('PrepareToInstall:' #13#13 'Setup is preparing to install. Using the script you can install any prerequisites, abort Setup on errors, and request restarts. Do you want to return an error now?', mbConfirmation, MB_YESNO or MB_DEFBUTTON2) = idYes then 135 | Result := '.' 136 | else 137 | Result := ''; 138 | end; 139 | 140 | function MyProgCheck(): Boolean; 141 | begin 142 | Log('MyProgCheck() called'); 143 | if not MyProgChecked then begin 144 | MyProgCheckResult := MsgBox('MyProgCheck:' #13#13 'Using the script you can decide at runtime to include or exclude files from the installation. Do you want to install MyProg.exe and MyProg.chm to ' + ExtractFilePath(CurrentFileName) + '?', mbConfirmation, MB_YESNO) = idYes; 145 | MyProgChecked := True; 146 | end; 147 | Result := MyProgCheckResult; 148 | end; 149 | 150 | procedure BeforeMyProgInstall(S: String); 151 | begin 152 | Log('BeforeMyProgInstall(''' + S + ''') called'); 153 | MsgBox('BeforeMyProgInstall:' #13#13 'Setup is now going to install ' + S + ' as ' + CurrentFileName + '.', mbInformation, MB_OK); 154 | end; 155 | 156 | procedure AfterMyProgInstall(S: String); 157 | begin 158 | Log('AfterMyProgInstall(''' + S + ''') called'); 159 | MsgBox('AfterMyProgInstall:' #13#13 'Setup just installed ' + S + ' as ' + CurrentFileName + '.', mbInformation, MB_OK); 160 | end; 161 | 162 | function MyConst(Param: String): String; 163 | begin 164 | Log('MyConst(''' + Param + ''') called'); 165 | Result := ExpandConstant('{autopf}'); 166 | end; 167 | 168 | -------------------------------------------------------------------------------- /third-party/inno-setup/6.2.0/Examples/CodePrepareToInstall.iss: -------------------------------------------------------------------------------- 1 | ; -- CodePrepareToInstall.iss -- 2 | ; 3 | ; This script shows how the PrepareToInstall event function can be used to 4 | ; install prerequisites and handle any reboots in between, while remembering 5 | ; user selections across reboots. 6 | 7 | [Setup] 8 | AppName=My Program 9 | AppVersion=1.5 10 | WizardStyle=modern 11 | DefaultDirName={autopf}\My Program 12 | DefaultGroupName=My Program 13 | UninstallDisplayIcon={app}\MyProg.exe 14 | OutputDir=userdocs:Inno Setup Examples Output 15 | 16 | [Files] 17 | ; Place any prerequisite files here, for example: 18 | ; Source: "MyProg-Prerequisite-setup.exe"; Flags: dontcopy 19 | ; Place any regular files here, so *after* all your prerequisites. 20 | Source: "MyProg.exe"; DestDir: "{app}"; 21 | Source: "MyProg.chm"; DestDir: "{app}"; 22 | Source: "Readme.txt"; DestDir: "{app}"; Flags: isreadme; 23 | 24 | [Icons] 25 | Name: "{group}\My Program"; Filename: "{app}\MyProg.exe" 26 | 27 | [Code] 28 | const 29 | (*** Customize the following to your own name. ***) 30 | RunOnceName = 'My Program Setup restart'; 31 | 32 | QuitMessageReboot = 'The installation of a prerequisite program was not completed. You will need to restart your computer to complete that installation.'#13#13'After restarting your computer, Setup will continue next time an administrator logs in.'; 33 | QuitMessageError = 'Error. Cannot continue.'; 34 | 35 | var 36 | Restarted: Boolean; 37 | 38 | function InitializeSetup(): Boolean; 39 | begin 40 | Restarted := ExpandConstant('{param:restart|0}') = '1'; 41 | 42 | if not Restarted then begin 43 | Result := not RegValueExists(HKA, 'Software\Microsoft\Windows\CurrentVersion\RunOnce', RunOnceName); 44 | if not Result then 45 | MsgBox(QuitMessageReboot, mbError, mb_Ok); 46 | end else 47 | Result := True; 48 | end; 49 | 50 | function DetectAndInstallPrerequisites: Boolean; 51 | begin 52 | (*** Place your prerequisite detection and extraction+installation code below. ***) 53 | (*** Return False if missing prerequisites were detected but their installation failed, else return True. ***) 54 | 55 | // 56 | //extraction example: ExtractTemporaryFile('MyProg-Prerequisite-setup.exe'); 57 | 58 | Result := True; 59 | 60 | (*** Remove the following block! Used by this demo to simulate a prerequisite install requiring a reboot. ***) 61 | if not Restarted then 62 | RestartReplace(ParamStr(0), ''); 63 | end; 64 | 65 | function Quote(const S: String): String; 66 | begin 67 | Result := '"' + S + '"'; 68 | end; 69 | 70 | function AddParam(const S, P, V: String): String; 71 | begin 72 | if V <> '""' then 73 | Result := S + ' /' + P + '=' + V; 74 | end; 75 | 76 | function AddSimpleParam(const S, P: String): String; 77 | begin 78 | Result := S + ' /' + P; 79 | end; 80 | 81 | procedure CreateRunOnceEntry; 82 | var 83 | RunOnceData: String; 84 | begin 85 | RunOnceData := Quote(ExpandConstant('{srcexe}')) + ' /restart=1'; 86 | RunOnceData := AddParam(RunOnceData, 'LANG', ExpandConstant('{language}')); 87 | RunOnceData := AddParam(RunOnceData, 'DIR', Quote(WizardDirValue)); 88 | RunOnceData := AddParam(RunOnceData, 'GROUP', Quote(WizardGroupValue)); 89 | if WizardNoIcons then 90 | RunOnceData := AddSimpleParam(RunOnceData, 'NOICONS'); 91 | RunOnceData := AddParam(RunOnceData, 'TYPE', Quote(WizardSetupType(False))); 92 | RunOnceData := AddParam(RunOnceData, 'COMPONENTS', Quote(WizardSelectedComponents(False))); 93 | RunOnceData := AddParam(RunOnceData, 'TASKS', Quote(WizardSelectedTasks(False))); 94 | 95 | (*** Place any custom user selection you want to remember below. ***) 96 | 97 | // 98 | 99 | RegWriteStringValue(HKA, 'Software\Microsoft\Windows\CurrentVersion\RunOnce', RunOnceName, RunOnceData); 100 | end; 101 | 102 | function PrepareToInstall(var NeedsRestart: Boolean): String; 103 | var 104 | ChecksumBefore, ChecksumAfter: String; 105 | begin 106 | ChecksumBefore := MakePendingFileRenameOperationsChecksum; 107 | if DetectAndInstallPrerequisites then begin 108 | ChecksumAfter := MakePendingFileRenameOperationsChecksum; 109 | if ChecksumBefore <> ChecksumAfter then begin 110 | CreateRunOnceEntry; 111 | NeedsRestart := True; 112 | Result := QuitMessageReboot; 113 | end; 114 | end else 115 | Result := QuitMessageError; 116 | end; 117 | 118 | function ShouldSkipPage(PageID: Integer): Boolean; 119 | begin 120 | Result := Restarted; 121 | end; 122 | 123 | -------------------------------------------------------------------------------- /third-party/inno-setup/6.2.0/Examples/Components.iss: -------------------------------------------------------------------------------- 1 | ; -- Components.iss -- 2 | ; Demonstrates a components-based installation. 3 | 4 | ; SEE THE DOCUMENTATION FOR DETAILS ON CREATING .ISS SCRIPT FILES! 5 | 6 | [Setup] 7 | AppName=My Program 8 | AppVersion=1.5 9 | WizardStyle=modern 10 | DefaultDirName={autopf}\My Program 11 | DefaultGroupName=My Program 12 | UninstallDisplayIcon={app}\MyProg.exe 13 | OutputDir=userdocs:Inno Setup Examples Output 14 | 15 | [Types] 16 | Name: "full"; Description: "Full installation" 17 | Name: "compact"; Description: "Compact installation" 18 | Name: "custom"; Description: "Custom installation"; Flags: iscustom 19 | 20 | [Components] 21 | Name: "program"; Description: "Program Files"; Types: full compact custom; Flags: fixed 22 | Name: "help"; Description: "Help File"; Types: full 23 | Name: "readme"; Description: "Readme File"; Types: full 24 | Name: "readme\en"; Description: "English"; Flags: exclusive 25 | Name: "readme\de"; Description: "German"; Flags: exclusive 26 | 27 | [Files] 28 | Source: "MyProg.exe"; DestDir: "{app}"; Components: program 29 | Source: "MyProg.chm"; DestDir: "{app}"; Components: help 30 | Source: "Readme.txt"; DestDir: "{app}"; Components: readme\en; Flags: isreadme 31 | Source: "Readme-German.txt"; DestName: "Liesmich.txt"; DestDir: "{app}"; Components: readme\de; Flags: isreadme 32 | 33 | [Icons] 34 | Name: "{group}\My Program"; Filename: "{app}\MyProg.exe" 35 | -------------------------------------------------------------------------------- /third-party/inno-setup/6.2.0/Examples/Example1.iss: -------------------------------------------------------------------------------- 1 | ; -- Example1.iss -- 2 | ; Demonstrates copying 3 files and creating an icon. 3 | 4 | ; SEE THE DOCUMENTATION FOR DETAILS ON CREATING .ISS SCRIPT FILES! 5 | 6 | [Setup] 7 | AppName=My Program 8 | AppVersion=1.5 9 | WizardStyle=modern 10 | DefaultDirName={autopf}\My Program 11 | DefaultGroupName=My Program 12 | UninstallDisplayIcon={app}\MyProg.exe 13 | Compression=lzma2 14 | SolidCompression=yes 15 | OutputDir=userdocs:Inno Setup Examples Output 16 | 17 | [Files] 18 | Source: "MyProg.exe"; DestDir: "{app}" 19 | Source: "MyProg.chm"; DestDir: "{app}" 20 | Source: "Readme.txt"; DestDir: "{app}"; Flags: isreadme 21 | 22 | [Icons] 23 | Name: "{group}\My Program"; Filename: "{app}\MyProg.exe" 24 | -------------------------------------------------------------------------------- /third-party/inno-setup/6.2.0/Examples/Example2.iss: -------------------------------------------------------------------------------- 1 | ; -- Example2.iss -- 2 | ; Same as Example1.iss, but creates its icon in the Programs folder of the 3 | ; Start Menu instead of in a subfolder, and also creates a desktop icon. 4 | 5 | ; SEE THE DOCUMENTATION FOR DETAILS ON CREATING .ISS SCRIPT FILES! 6 | 7 | [Setup] 8 | AppName=My Program 9 | AppVersion=1.5 10 | WizardStyle=modern 11 | DefaultDirName={autopf}\My Program 12 | ; Since no icons will be created in "{group}", we don't need the wizard 13 | ; to ask for a Start Menu folder name: 14 | DisableProgramGroupPage=yes 15 | UninstallDisplayIcon={app}\MyProg.exe 16 | Compression=lzma2 17 | SolidCompression=yes 18 | OutputDir=userdocs:Inno Setup Examples Output 19 | 20 | [Files] 21 | Source: "MyProg.exe"; DestDir: "{app}" 22 | Source: "MyProg.chm"; DestDir: "{app}" 23 | Source: "Readme.txt"; DestDir: "{app}"; Flags: isreadme 24 | 25 | [Icons] 26 | Name: "{autoprograms}\My Program"; Filename: "{app}\MyProg.exe" 27 | Name: "{autodesktop}\My Program"; Filename: "{app}\MyProg.exe" 28 | -------------------------------------------------------------------------------- /third-party/inno-setup/6.2.0/Examples/Example3.iss: -------------------------------------------------------------------------------- 1 | ; -- Example3.iss -- 2 | ; Same as Example1.iss, but creates some registry entries too and allows the end 3 | ; use to choose the install mode (administrative or non administrative). 4 | 5 | ; SEE THE DOCUMENTATION FOR DETAILS ON CREATING .ISS SCRIPT FILES! 6 | 7 | [Setup] 8 | AppName=My Program 9 | AppVersion=1.5 10 | WizardStyle=modern 11 | DefaultDirName={autopf}\My Program 12 | DefaultGroupName=My Program 13 | UninstallDisplayIcon={app}\MyProg.exe 14 | Compression=lzma2 15 | SolidCompression=yes 16 | OutputDir=userdocs:Inno Setup Examples Output 17 | ChangesAssociations=yes 18 | UserInfoPage=yes 19 | PrivilegesRequiredOverridesAllowed=dialog 20 | 21 | [Files] 22 | Source: "MyProg.exe"; DestDir: "{app}" 23 | Source: "MyProg.chm"; DestDir: "{app}" 24 | Source: "Readme.txt"; DestDir: "{app}"; Flags: isreadme 25 | 26 | [Icons] 27 | Name: "{group}\My Program"; Filename: "{app}\MyProg.exe" 28 | 29 | ; NOTE: Most apps do not need registry entries to be pre-created. If you 30 | ; don't know what the registry is or if you need to use it, then chances are 31 | ; you don't need a [Registry] section. 32 | 33 | [Registry] 34 | ; Create "Software\My Company\My Program" keys under CURRENT_USER or 35 | ; LOCAL_MACHINE depending on administrative or non administrative install 36 | ; mode. The flags tell it to always delete the "My Program" key upon 37 | ; uninstall, and delete the "My Company" key if there is nothing left in it. 38 | Root: HKA; Subkey: "Software\My Company"; Flags: uninsdeletekeyifempty 39 | Root: HKA; Subkey: "Software\My Company\My Program"; Flags: uninsdeletekey 40 | Root: HKA; Subkey: "Software\My Company\My Program\Settings"; ValueType: string; ValueName: "Language"; ValueData: "{language}" 41 | ; Associate .myp files with My Program (requires ChangesAssociations=yes) 42 | Root: HKA; Subkey: "Software\Classes\.myp\OpenWithProgids"; ValueType: string; ValueName: "MyProgramFile.myp"; ValueData: ""; Flags: uninsdeletevalue 43 | Root: HKA; Subkey: "Software\Classes\MyProgramFile.myp"; ValueType: string; ValueName: ""; ValueData: "My Program File"; Flags: uninsdeletekey 44 | Root: HKA; Subkey: "Software\Classes\MyProgramFile.myp\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\MyProg.exe,0" 45 | Root: HKA; Subkey: "Software\Classes\MyProgramFile.myp\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\MyProg.exe"" ""%1""" 46 | Root: HKA; Subkey: "Software\Classes\Applications\MyProg.exe\SupportedTypes"; ValueType: string; ValueName: ".myp"; ValueData: "" 47 | ; HKA (and HKCU) should only be used for settings which are compatible with 48 | ; roaming profiles so settings like paths should be written to HKLM, which 49 | ; is only possible in administrative install mode. 50 | Root: HKLM; Subkey: "Software\My Company"; Flags: uninsdeletekeyifempty; Check: IsAdminInstallMode 51 | Root: HKLM; Subkey: "Software\My Company\My Program"; Flags: uninsdeletekey; Check: IsAdminInstallMode 52 | Root: HKLM; Subkey: "Software\My Company\My Program\Settings"; ValueType: string; ValueName: "InstallPath"; ValueData: "{app}"; Check: IsAdminInstallMode 53 | ; User specific settings should always be written to HKCU, which should only 54 | ; be done in non administrative install mode. Also see ShouldSkipPage below. 55 | Root: HKCU; Subkey: "Software\My Company\My Program\Settings"; ValueType: string; ValueName: "UserName"; ValueData: "{userinfoname}"; Check: not IsAdminInstallMode 56 | Root: HKCU; Subkey: "Software\My Company\My Program\Settings"; ValueType: string; ValueName: "UserOrganization"; ValueData: "{userinfoorg}"; Check: not IsAdminInstallMode 57 | 58 | [Code] 59 | function ShouldSkipPage(PageID: Integer): Boolean; 60 | begin 61 | Result := IsAdminInstallMode and (PageID = wpUserInfo); 62 | end; 63 | -------------------------------------------------------------------------------- /third-party/inno-setup/6.2.0/Examples/ISPPExample1.iss: -------------------------------------------------------------------------------- 1 | // -- ISPPExample1.iss -- 2 | // 3 | // This script shows various basic things you can achieve using Inno Setup Preprocessor (ISPP). 4 | // To enable commented #define's, either remove the '//' or use ISCC with the /D switch. 5 | // 6 | #pragma verboselevel 9 7 | // 8 | //#define AppEnterprise 9 | // 10 | #ifdef AppEnterprise 11 | #define AppName "My Program Enterprise Edition" 12 | #else 13 | #define AppName "My Program" 14 | #endif 15 | // 16 | #define AppVersion GetVersionNumbersString(AddBackslash(SourcePath) + "MyProg.exe") 17 | // 18 | [Setup] 19 | AppName={#AppName} 20 | AppVersion={#AppVersion} 21 | WizardStyle=modern 22 | DefaultDirName={autopf}\{#AppName} 23 | DefaultGroupName={#AppName} 24 | UninstallDisplayIcon={app}\MyProg.exe 25 | LicenseFile={#file AddBackslash(SourcePath) + "ISPPExample1License.txt"} 26 | VersionInfoVersion={#AppVersion} 27 | OutputDir=userdocs:Inno Setup Examples Output 28 | 29 | [Files] 30 | Source: "MyProg.exe"; DestDir: "{app}" 31 | #ifdef AppEnterprise 32 | Source: "MyProg.chm"; DestDir: "{app}" 33 | #endif 34 | Source: "Readme.txt"; DestDir: "{app}"; \ 35 | Flags: isreadme 36 | 37 | [Icons] 38 | Name: "{group}\{#AppName}"; Filename: "{app}\MyProg.exe" 39 | -------------------------------------------------------------------------------- /third-party/inno-setup/6.2.0/Examples/ISPPExample1License.txt: -------------------------------------------------------------------------------- 1 | #pragma option -e+ 2 | {#AppName} version {#AppVersion} License 3 | 4 | Bla bla bla -------------------------------------------------------------------------------- /third-party/inno-setup/6.2.0/Examples/Languages.iss: -------------------------------------------------------------------------------- 1 | ; -- Languages.iss -- 2 | ; Demonstrates a multilingual installation. 3 | 4 | ; SEE THE DOCUMENTATION FOR DETAILS ON CREATING .ISS SCRIPT FILES! 5 | 6 | [Setup] 7 | AppName={cm:MyAppName} 8 | AppId=My Program 9 | AppVerName={cm:MyAppVerName,1.5} 10 | WizardStyle=modern 11 | DefaultDirName={autopf}\{cm:MyAppName} 12 | DefaultGroupName={cm:MyAppName} 13 | UninstallDisplayIcon={app}\MyProg.exe 14 | VersionInfoDescription=My Program Setup 15 | VersionInfoProductName=My Program 16 | OutputDir=userdocs:Inno Setup Examples Output 17 | MissingMessagesWarning=yes 18 | NotRecognizedMessagesWarning=yes 19 | ; Uncomment the following line to disable the "Select Setup Language" 20 | ; dialog and have it rely solely on auto-detection. 21 | ;ShowLanguageDialog=no 22 | 23 | [Languages] 24 | Name: en; MessagesFile: "compiler:Default.isl" 25 | Name: nl; MessagesFile: "compiler:Languages\Dutch.isl" 26 | Name: de; MessagesFile: "compiler:Languages\German.isl" 27 | 28 | [Messages] 29 | en.BeveledLabel=English 30 | nl.BeveledLabel=Nederlands 31 | de.BeveledLabel=Deutsch 32 | 33 | [CustomMessages] 34 | en.MyDescription=My description 35 | en.MyAppName=My Program 36 | en.MyAppVerName=My Program %1 37 | nl.MyDescription=Mijn omschrijving 38 | nl.MyAppName=Mijn programma 39 | nl.MyAppVerName=Mijn programma %1 40 | de.MyDescription=Meine Beschreibung 41 | de.MyAppName=Meine Anwendung 42 | de.MyAppVerName=Meine Anwendung %1 43 | 44 | [Files] 45 | Source: "MyProg.exe"; DestDir: "{app}" 46 | Source: "MyProg.chm"; DestDir: "{app}"; Languages: en 47 | Source: "Readme.txt"; DestDir: "{app}"; Languages: en; Flags: isreadme 48 | Source: "Readme-Dutch.txt"; DestName: "Leesmij.txt"; DestDir: "{app}"; Languages: nl; Flags: isreadme 49 | Source: "Readme-German.txt"; DestName: "Liesmich.txt"; DestDir: "{app}"; Languages: de; Flags: isreadme 50 | 51 | [Icons] 52 | Name: "{group}\{cm:MyAppName}"; Filename: "{app}\MyProg.exe" 53 | Name: "{group}\{cm:UninstallProgram,{cm:MyAppName}}"; Filename: "{uninstallexe}" 54 | 55 | [Tasks] 56 | ; The following task doesn't do anything and is only meant to show [CustomMessages] usage 57 | Name: mytask; Description: "{cm:MyDescription}" 58 | -------------------------------------------------------------------------------- /third-party/inno-setup/6.2.0/Examples/License.txt: -------------------------------------------------------------------------------- 1 | This is the LICENSE file for My Program. 2 | -------------------------------------------------------------------------------- /third-party/inno-setup/6.2.0/Examples/MyDll.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DazedNConfused-/CDDA-Game-Launcher/c52495a4d79a364d6c381042790bf33b5209d37c/third-party/inno-setup/6.2.0/Examples/MyDll.dll -------------------------------------------------------------------------------- /third-party/inno-setup/6.2.0/Examples/MyDll/C#/MyDll.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | 3 | using System.Runtime.InteropServices; 4 | using RGiesecke.DllExport; 5 | 6 | namespace Mydll 7 | { 8 | public class Mydll 9 | { 10 | [DllExport("MyDllFunc", CallingConvention=CallingConvention.StdCall)] 11 | public static void MyDllFunc(IntPtr hWnd, [MarshalAs(UnmanagedType.LPStr)] string text, [MarshalAs(UnmanagedType.LPStr)] string caption, int options) 12 | { 13 | MessageBox(hWnd, text, caption, options); 14 | } 15 | 16 | [DllExport("MyDllFuncW", CallingConvention=CallingConvention.StdCall)] 17 | public static void MyDllFuncW(IntPtr hWnd, string text, string caption, int options) 18 | { 19 | MessageBox(hWnd, text, caption, options); 20 | } 21 | 22 | [DllImport("user32.dll", CharSet=CharSet.Auto)] 23 | static extern int MessageBox(IntPtr hWnd, String text, String caption, int options); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /third-party/inno-setup/6.2.0/Examples/MyDll/C#/MyDll.csproj: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | Debug 6 | AnyCPU 7 | {79237A5C-6C62-400A-BBDD-3DA1CA327973} 8 | Library 9 | Properties 10 | MyDll 11 | MyDll 12 | v4.5 13 | 512 14 | 15 | 16 | true 17 | full 18 | false 19 | .\ 20 | DEBUG;TRACE 21 | prompt 22 | 4 23 | x86 24 | 25 | 26 | pdbonly 27 | true 28 | .\ 29 | TRACE 30 | prompt 31 | 4 32 | x86 33 | 34 | 35 | 36 | packages\UnmanagedExports.1.2.7\lib\net\RGiesecke.DllExport.Metadata.dll 37 | False 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 63 | -------------------------------------------------------------------------------- /third-party/inno-setup/6.2.0/Examples/MyDll/C#/MyDll.sln: -------------------------------------------------------------------------------- 1 |  2 | Microsoft Visual Studio Solution File, Format Version 12.00 3 | # Visual Studio 2013 4 | VisualStudioVersion = 12.0.40629.0 5 | MinimumVisualStudioVersion = 10.0.40219.1 6 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MyDll", "MyDll.csproj", "{79237A5C-6C62-400A-BBDD-3DA1CA327973}" 7 | EndProject 8 | Global 9 | GlobalSection(SolutionConfigurationPlatforms) = preSolution 10 | Debug|Any CPU = Debug|Any CPU 11 | Release|Any CPU = Release|Any CPU 12 | EndGlobalSection 13 | GlobalSection(ProjectConfigurationPlatforms) = postSolution 14 | {79237A5C-6C62-400A-BBDD-3DA1CA327973}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 15 | {79237A5C-6C62-400A-BBDD-3DA1CA327973}.Debug|Any CPU.Build.0 = Debug|Any CPU 16 | {79237A5C-6C62-400A-BBDD-3DA1CA327973}.Release|Any CPU.ActiveCfg = Release|Any CPU 17 | {79237A5C-6C62-400A-BBDD-3DA1CA327973}.Release|Any CPU.Build.0 = Release|Any CPU 18 | EndGlobalSection 19 | GlobalSection(SolutionProperties) = preSolution 20 | HideSolutionNode = FALSE 21 | EndGlobalSection 22 | EndGlobal 23 | -------------------------------------------------------------------------------- /third-party/inno-setup/6.2.0/Examples/MyDll/C#/Properties/AssemblyInfo.cs: -------------------------------------------------------------------------------- 1 | using System.Reflection; 2 | using System.Runtime.CompilerServices; 3 | using System.Runtime.InteropServices; 4 | 5 | // General Information about an assembly is controlled through the following 6 | // set of attributes. Change these attribute values to modify the information 7 | // associated with an assembly. 8 | [assembly: AssemblyTitle("MyDll")] 9 | [assembly: AssemblyDescription("")] 10 | [assembly: AssemblyConfiguration("")] 11 | [assembly: AssemblyCompany("")] 12 | [assembly: AssemblyProduct("MyDll")] 13 | [assembly: AssemblyCopyright("Copyright © 2015")] 14 | [assembly: AssemblyTrademark("")] 15 | [assembly: AssemblyCulture("")] 16 | 17 | // Setting ComVisible to false makes the types in this assembly not visible 18 | // to COM components. If you need to access a type in this assembly from 19 | // COM, set the ComVisible attribute to true on that type. 20 | [assembly: ComVisible(false)] 21 | 22 | // The following GUID is for the ID of the typelib if this project is exposed to COM 23 | [assembly: Guid("711cc3c2-07db-46ca-b34b-ba06f4edcbcd")] 24 | 25 | // Version information for an assembly consists of the following four values: 26 | // 27 | // Major Version 28 | // Minor Version 29 | // Build Number 30 | // Revision 31 | // 32 | // You can specify all the values or you can default the Build and Revision Numbers 33 | // by using the '*' as shown below: 34 | // [assembly: AssemblyVersion("1.0.*")] 35 | [assembly: AssemblyVersion("1.0.0.0")] 36 | [assembly: AssemblyFileVersion("1.0.0.0")] 37 | -------------------------------------------------------------------------------- /third-party/inno-setup/6.2.0/Examples/MyDll/C#/packages.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | -------------------------------------------------------------------------------- /third-party/inno-setup/6.2.0/Examples/MyDll/C/MyDll.c: -------------------------------------------------------------------------------- 1 | #include 2 | 3 | void __stdcall MyDllFunc(HWND hWnd, char *lpText, char *lpCaption, UINT uType) 4 | { 5 | MessageBox(hWnd, lpText, lpCaption, uType); 6 | } -------------------------------------------------------------------------------- /third-party/inno-setup/6.2.0/Examples/MyDll/C/MyDll.def: -------------------------------------------------------------------------------- 1 | EXPORTS 2 | MyDllFunc -------------------------------------------------------------------------------- /third-party/inno-setup/6.2.0/Examples/MyDll/C/MyDll.dsp: -------------------------------------------------------------------------------- 1 | # Microsoft Developer Studio Project File - Name="MyDll" - Package Owner=<4> 2 | # Microsoft Developer Studio Generated Build File, Format Version 6.00 3 | # ** DO NOT EDIT ** 4 | 5 | # TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 6 | 7 | CFG=MyDll - Win32 Release 8 | !MESSAGE This is not a valid makefile. To build this project using NMAKE, 9 | !MESSAGE use the Export Makefile command and run 10 | !MESSAGE 11 | !MESSAGE NMAKE /f "MyDll.mak". 12 | !MESSAGE 13 | !MESSAGE You can specify a configuration when running NMAKE 14 | !MESSAGE by defining the macro CFG on the command line. For example: 15 | !MESSAGE 16 | !MESSAGE NMAKE /f "MyDll.mak" CFG="MyDll - Win32 Release" 17 | !MESSAGE 18 | !MESSAGE Possible choices for configuration are: 19 | !MESSAGE 20 | !MESSAGE "MyDll - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") 21 | !MESSAGE 22 | 23 | # Begin Project 24 | # PROP AllowPerConfigDependencies 0 25 | # PROP Scc_ProjName "" 26 | # PROP Scc_LocalPath "" 27 | CPP=cl.exe 28 | MTL=midl.exe 29 | RSC=rc.exe 30 | # PROP BASE Use_MFC 0 31 | # PROP BASE Use_Debug_Libraries 0 32 | # PROP BASE Output_Dir "Release" 33 | # PROP BASE Intermediate_Dir "Release" 34 | # PROP BASE Target_Dir "" 35 | # PROP Use_MFC 0 36 | # PROP Use_Debug_Libraries 0 37 | # PROP Output_Dir "." 38 | # PROP Intermediate_Dir "." 39 | # PROP Target_Dir "" 40 | # ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "MYDLL_EXPORTS" /YX /FD /c 41 | # ADD CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "MYDLL_EXPORTS" /YX /FD /c 42 | # ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 43 | # ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 44 | # ADD BASE RSC /l 0x413 /d "NDEBUG" 45 | # ADD RSC /l 0x413 /d "NDEBUG" 46 | BSC32=bscmake.exe 47 | # ADD BASE BSC32 /nologo 48 | # ADD BSC32 /nologo 49 | LINK32=link.exe 50 | # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386 51 | # ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386 52 | # Begin Target 53 | 54 | # Name "MyDll - Win32 Release" 55 | # Begin Group "Source Files" 56 | 57 | # PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" 58 | # Begin Source File 59 | 60 | SOURCE=.\MyDll.c 61 | # End Source File 62 | # Begin Source File 63 | 64 | SOURCE=.\MyDll.def 65 | # End Source File 66 | # End Group 67 | # Begin Group "Header Files" 68 | 69 | # PROP Default_Filter "h;hpp;hxx;hm;inl" 70 | # End Group 71 | # Begin Group "Resource Files" 72 | 73 | # PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" 74 | # End Group 75 | # End Target 76 | # End Project 77 | -------------------------------------------------------------------------------- /third-party/inno-setup/6.2.0/Examples/MyDll/Delphi/MyDll.dpr: -------------------------------------------------------------------------------- 1 | library MyDll; 2 | 3 | uses 4 | Windows; 5 | 6 | procedure MyDllFunc(hWnd: Integer; lpText, lpCaption: PAnsiChar; uType: Cardinal); stdcall; 7 | begin 8 | MessageBoxA(hWnd, lpText, lpCaption, uType); 9 | end; 10 | 11 | exports MyDllFunc; 12 | 13 | begin 14 | end. 15 | -------------------------------------------------------------------------------- /third-party/inno-setup/6.2.0/Examples/MyProg-ARM64.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DazedNConfused-/CDDA-Game-Launcher/c52495a4d79a364d6c381042790bf33b5209d37c/third-party/inno-setup/6.2.0/Examples/MyProg-ARM64.exe -------------------------------------------------------------------------------- /third-party/inno-setup/6.2.0/Examples/MyProg-x64.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DazedNConfused-/CDDA-Game-Launcher/c52495a4d79a364d6c381042790bf33b5209d37c/third-party/inno-setup/6.2.0/Examples/MyProg-x64.exe -------------------------------------------------------------------------------- /third-party/inno-setup/6.2.0/Examples/MyProg.chm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DazedNConfused-/CDDA-Game-Launcher/c52495a4d79a364d6c381042790bf33b5209d37c/third-party/inno-setup/6.2.0/Examples/MyProg.chm -------------------------------------------------------------------------------- /third-party/inno-setup/6.2.0/Examples/MyProg.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DazedNConfused-/CDDA-Game-Launcher/c52495a4d79a364d6c381042790bf33b5209d37c/third-party/inno-setup/6.2.0/Examples/MyProg.exe -------------------------------------------------------------------------------- /third-party/inno-setup/6.2.0/Examples/Readme-Dutch.txt: -------------------------------------------------------------------------------- 1 | Dit is het Leesmij bestand voor My Program. -------------------------------------------------------------------------------- /third-party/inno-setup/6.2.0/Examples/Readme-German.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DazedNConfused-/CDDA-Game-Launcher/c52495a4d79a364d6c381042790bf33b5209d37c/third-party/inno-setup/6.2.0/Examples/Readme-German.txt -------------------------------------------------------------------------------- /third-party/inno-setup/6.2.0/Examples/Readme.txt: -------------------------------------------------------------------------------- 1 | This is the README file for My Program. 2 | -------------------------------------------------------------------------------- /third-party/inno-setup/6.2.0/Examples/UnicodeExample1.iss: -------------------------------------------------------------------------------- 1 | ; -- UnicodeExample1.iss -- 2 | ; Demonstrates some Unicode functionality. 3 | ; 4 | ; SEE THE DOCUMENTATION FOR DETAILS ON CREATING .ISS SCRIPT FILES! 5 | 6 | [Setup] 7 | AppName=ɯɐɹƃoɹd ʎɯ 8 | AppVerName=ɯɐɹƃoɹd ʎɯ version 1.5 9 | WizardStyle=modern 10 | DefaultDirName={autopf}\ɯɐɹƃoɹd ʎɯ 11 | DefaultGroupName=ɯɐɹƃoɹd ʎɯ 12 | UninstallDisplayIcon={app}\ƃoɹdʎɯ.exe 13 | Compression=lzma2 14 | SolidCompression=yes 15 | OutputDir=userdocs:Inno Setup Examples Output 16 | 17 | [Files] 18 | Source: "MyProg.exe"; DestDir: "{app}"; DestName: "ƃoɹdʎɯ.exe" 19 | Source: "MyProg.chm"; DestDir: "{app}"; DestName: "ƃoɹdʎɯ.chm" 20 | Source: "Readme.txt"; DestDir: "{app}"; Flags: isreadme 21 | 22 | [Icons] 23 | Name: "{group}\ɯɐɹƃoɹd ʎɯ"; Filename: "{app}\ƃoɹdʎɯ.exe" 24 | 25 | [Code] 26 | function InitializeSetup: Boolean; 27 | begin 28 | MsgBox('ɯɐɹƃoɹd ʎɯ', mbInformation, MB_OK); 29 | Result := True; 30 | end; -------------------------------------------------------------------------------- /third-party/inno-setup/6.2.0/Examples/UninstallCodeExample1.iss: -------------------------------------------------------------------------------- 1 | ; -- UninstallCodeExample1.iss -- 2 | ; 3 | ; This script shows various things you can achieve using a [Code] section for Uninstall. 4 | 5 | [Setup] 6 | AppName=My Program 7 | AppVersion=1.5 8 | WizardStyle=modern 9 | DefaultDirName={autopf}\My Program 10 | DefaultGroupName=My Program 11 | UninstallDisplayIcon={app}\MyProg.exe 12 | OutputDir=userdocs:Inno Setup Examples Output 13 | 14 | [Files] 15 | Source: "MyProg.exe"; DestDir: "{app}" 16 | Source: "MyProg.chm"; DestDir: "{app}" 17 | Source: "Readme.txt"; DestDir: "{app}"; Flags: isreadme 18 | 19 | [Code] 20 | function InitializeUninstall(): Boolean; 21 | begin 22 | Result := MsgBox('InitializeUninstall:' #13#13 'Uninstall is initializing. Do you really want to start Uninstall?', mbConfirmation, MB_YESNO) = idYes; 23 | if Result = False then 24 | MsgBox('InitializeUninstall:' #13#13 'Ok, bye bye.', mbInformation, MB_OK); 25 | end; 26 | 27 | procedure DeinitializeUninstall(); 28 | begin 29 | MsgBox('DeinitializeUninstall:' #13#13 'Bye bye!', mbInformation, MB_OK); 30 | end; 31 | 32 | procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep); 33 | begin 34 | case CurUninstallStep of 35 | usUninstall: 36 | begin 37 | MsgBox('CurUninstallStepChanged:' #13#13 'Uninstall is about to start.', mbInformation, MB_OK) 38 | // ...insert code to perform pre-uninstall tasks here... 39 | end; 40 | usPostUninstall: 41 | begin 42 | MsgBox('CurUninstallStepChanged:' #13#13 'Uninstall just finished.', mbInformation, MB_OK); 43 | // ...insert code to perform post-uninstall tasks here... 44 | end; 45 | end; 46 | end; 47 | -------------------------------------------------------------------------------- /third-party/inno-setup/6.2.0/ISCC.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DazedNConfused-/CDDA-Game-Launcher/c52495a4d79a364d6c381042790bf33b5209d37c/third-party/inno-setup/6.2.0/ISCC.exe -------------------------------------------------------------------------------- /third-party/inno-setup/6.2.0/ISCmplr.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DazedNConfused-/CDDA-Game-Launcher/c52495a4d79a364d6c381042790bf33b5209d37c/third-party/inno-setup/6.2.0/ISCmplr.dll -------------------------------------------------------------------------------- /third-party/inno-setup/6.2.0/ISPP.chm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DazedNConfused-/CDDA-Game-Launcher/c52495a4d79a364d6c381042790bf33b5209d37c/third-party/inno-setup/6.2.0/ISPP.chm -------------------------------------------------------------------------------- /third-party/inno-setup/6.2.0/ISPP.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DazedNConfused-/CDDA-Game-Launcher/c52495a4d79a364d6c381042790bf33b5209d37c/third-party/inno-setup/6.2.0/ISPP.dll -------------------------------------------------------------------------------- /third-party/inno-setup/6.2.0/ISetup.chm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DazedNConfused-/CDDA-Game-Launcher/c52495a4d79a364d6c381042790bf33b5209d37c/third-party/inno-setup/6.2.0/ISetup.chm -------------------------------------------------------------------------------- /third-party/inno-setup/6.2.0/Languages/BrazilianPortuguese.isl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DazedNConfused-/CDDA-Game-Launcher/c52495a4d79a364d6c381042790bf33b5209d37c/third-party/inno-setup/6.2.0/Languages/BrazilianPortuguese.isl -------------------------------------------------------------------------------- /third-party/inno-setup/6.2.0/Languages/Catalan.isl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DazedNConfused-/CDDA-Game-Launcher/c52495a4d79a364d6c381042790bf33b5209d37c/third-party/inno-setup/6.2.0/Languages/Catalan.isl -------------------------------------------------------------------------------- /third-party/inno-setup/6.2.0/Languages/Czech.isl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DazedNConfused-/CDDA-Game-Launcher/c52495a4d79a364d6c381042790bf33b5209d37c/third-party/inno-setup/6.2.0/Languages/Czech.isl -------------------------------------------------------------------------------- /third-party/inno-setup/6.2.0/Languages/Danish.isl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DazedNConfused-/CDDA-Game-Launcher/c52495a4d79a364d6c381042790bf33b5209d37c/third-party/inno-setup/6.2.0/Languages/Danish.isl -------------------------------------------------------------------------------- /third-party/inno-setup/6.2.0/Languages/Finnish.isl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DazedNConfused-/CDDA-Game-Launcher/c52495a4d79a364d6c381042790bf33b5209d37c/third-party/inno-setup/6.2.0/Languages/Finnish.isl -------------------------------------------------------------------------------- /third-party/inno-setup/6.2.0/Languages/Hebrew.isl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DazedNConfused-/CDDA-Game-Launcher/c52495a4d79a364d6c381042790bf33b5209d37c/third-party/inno-setup/6.2.0/Languages/Hebrew.isl -------------------------------------------------------------------------------- /third-party/inno-setup/6.2.0/Languages/Japanese.isl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DazedNConfused-/CDDA-Game-Launcher/c52495a4d79a364d6c381042790bf33b5209d37c/third-party/inno-setup/6.2.0/Languages/Japanese.isl -------------------------------------------------------------------------------- /third-party/inno-setup/6.2.0/Languages/Norwegian.isl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DazedNConfused-/CDDA-Game-Launcher/c52495a4d79a364d6c381042790bf33b5209d37c/third-party/inno-setup/6.2.0/Languages/Norwegian.isl -------------------------------------------------------------------------------- /third-party/inno-setup/6.2.0/Languages/Polish.isl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DazedNConfused-/CDDA-Game-Launcher/c52495a4d79a364d6c381042790bf33b5209d37c/third-party/inno-setup/6.2.0/Languages/Polish.isl -------------------------------------------------------------------------------- /third-party/inno-setup/6.2.0/Languages/Portuguese.isl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DazedNConfused-/CDDA-Game-Launcher/c52495a4d79a364d6c381042790bf33b5209d37c/third-party/inno-setup/6.2.0/Languages/Portuguese.isl -------------------------------------------------------------------------------- /third-party/inno-setup/6.2.0/Languages/Russian.isl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DazedNConfused-/CDDA-Game-Launcher/c52495a4d79a364d6c381042790bf33b5209d37c/third-party/inno-setup/6.2.0/Languages/Russian.isl -------------------------------------------------------------------------------- /third-party/inno-setup/6.2.0/Languages/Slovenian.isl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DazedNConfused-/CDDA-Game-Launcher/c52495a4d79a364d6c381042790bf33b5209d37c/third-party/inno-setup/6.2.0/Languages/Slovenian.isl -------------------------------------------------------------------------------- /third-party/inno-setup/6.2.0/Languages/Spanish.isl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DazedNConfused-/CDDA-Game-Launcher/c52495a4d79a364d6c381042790bf33b5209d37c/third-party/inno-setup/6.2.0/Languages/Spanish.isl -------------------------------------------------------------------------------- /third-party/inno-setup/6.2.0/Languages/Turkish.isl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DazedNConfused-/CDDA-Game-Launcher/c52495a4d79a364d6c381042790bf33b5209d37c/third-party/inno-setup/6.2.0/Languages/Turkish.isl -------------------------------------------------------------------------------- /third-party/inno-setup/6.2.0/Languages/Ukrainian.isl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DazedNConfused-/CDDA-Game-Launcher/c52495a4d79a364d6c381042790bf33b5209d37c/third-party/inno-setup/6.2.0/Languages/Ukrainian.isl -------------------------------------------------------------------------------- /third-party/inno-setup/6.2.0/Setup.e32: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DazedNConfused-/CDDA-Game-Launcher/c52495a4d79a364d6c381042790bf33b5209d37c/third-party/inno-setup/6.2.0/Setup.e32 -------------------------------------------------------------------------------- /third-party/inno-setup/6.2.0/SetupClassicIcon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DazedNConfused-/CDDA-Game-Launcher/c52495a4d79a364d6c381042790bf33b5209d37c/third-party/inno-setup/6.2.0/SetupClassicIcon.ico -------------------------------------------------------------------------------- /third-party/inno-setup/6.2.0/SetupLdr.e32: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DazedNConfused-/CDDA-Game-Launcher/c52495a4d79a364d6c381042790bf33b5209d37c/third-party/inno-setup/6.2.0/SetupLdr.e32 -------------------------------------------------------------------------------- /third-party/inno-setup/6.2.0/WizClassicImage-IS.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DazedNConfused-/CDDA-Game-Launcher/c52495a4d79a364d6c381042790bf33b5209d37c/third-party/inno-setup/6.2.0/WizClassicImage-IS.bmp -------------------------------------------------------------------------------- /third-party/inno-setup/6.2.0/WizClassicImage.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DazedNConfused-/CDDA-Game-Launcher/c52495a4d79a364d6c381042790bf33b5209d37c/third-party/inno-setup/6.2.0/WizClassicImage.bmp -------------------------------------------------------------------------------- /third-party/inno-setup/6.2.0/WizClassicSmallImage-IS.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DazedNConfused-/CDDA-Game-Launcher/c52495a4d79a364d6c381042790bf33b5209d37c/third-party/inno-setup/6.2.0/WizClassicSmallImage-IS.bmp -------------------------------------------------------------------------------- /third-party/inno-setup/6.2.0/WizClassicSmallImage.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DazedNConfused-/CDDA-Game-Launcher/c52495a4d79a364d6c381042790bf33b5209d37c/third-party/inno-setup/6.2.0/WizClassicSmallImage.bmp -------------------------------------------------------------------------------- /third-party/inno-setup/6.2.0/isbunzip.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DazedNConfused-/CDDA-Game-Launcher/c52495a4d79a364d6c381042790bf33b5209d37c/third-party/inno-setup/6.2.0/isbunzip.dll -------------------------------------------------------------------------------- /third-party/inno-setup/6.2.0/isbzip.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DazedNConfused-/CDDA-Game-Launcher/c52495a4d79a364d6c381042790bf33b5209d37c/third-party/inno-setup/6.2.0/isbzip.dll -------------------------------------------------------------------------------- /third-party/inno-setup/6.2.0/isfaq.url: -------------------------------------------------------------------------------- 1 | [InternetShortcut] 2 | URL=https://jrsoftware.org/isfaq.php 3 | -------------------------------------------------------------------------------- /third-party/inno-setup/6.2.0/islzma.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DazedNConfused-/CDDA-Game-Launcher/c52495a4d79a364d6c381042790bf33b5209d37c/third-party/inno-setup/6.2.0/islzma.dll -------------------------------------------------------------------------------- /third-party/inno-setup/6.2.0/islzma32.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DazedNConfused-/CDDA-Game-Launcher/c52495a4d79a364d6c381042790bf33b5209d37c/third-party/inno-setup/6.2.0/islzma32.exe -------------------------------------------------------------------------------- /third-party/inno-setup/6.2.0/islzma64.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DazedNConfused-/CDDA-Game-Launcher/c52495a4d79a364d6c381042790bf33b5209d37c/third-party/inno-setup/6.2.0/islzma64.exe -------------------------------------------------------------------------------- /third-party/inno-setup/6.2.0/isscint.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DazedNConfused-/CDDA-Game-Launcher/c52495a4d79a364d6c381042790bf33b5209d37c/third-party/inno-setup/6.2.0/isscint.dll -------------------------------------------------------------------------------- /third-party/inno-setup/6.2.0/isunzlib.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DazedNConfused-/CDDA-Game-Launcher/c52495a4d79a364d6c381042790bf33b5209d37c/third-party/inno-setup/6.2.0/isunzlib.dll -------------------------------------------------------------------------------- /third-party/inno-setup/6.2.0/iszlib.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DazedNConfused-/CDDA-Game-Launcher/c52495a4d79a364d6c381042790bf33b5209d37c/third-party/inno-setup/6.2.0/iszlib.dll -------------------------------------------------------------------------------- /third-party/inno-setup/6.2.0/license.txt: -------------------------------------------------------------------------------- 1 | Inno Setup License 2 | ================== 3 | 4 | Except where otherwise noted, all of the documentation and software included in the Inno Setup 5 | package is copyrighted by Jordan Russell. 6 | 7 | Copyright (C) 1997-2021 Jordan Russell. All rights reserved. 8 | Portions Copyright (C) 2000-2021 Martijn Laan. All rights reserved. 9 | 10 | This software is provided "as-is," without any express or implied warranty. In no event shall the 11 | author be held liable for any damages arising from the use of this software. 12 | 13 | Permission is granted to anyone to use this software for any purpose, including commercial 14 | applications, and to alter and redistribute it, provided that the following conditions are met: 15 | 16 | 1. All redistributions of source code files must retain all copyright notices that are currently in 17 | place, and this list of conditions without modification. 18 | 19 | 2. All redistributions in binary form must retain all occurrences of the above copyright notice and 20 | web site addresses that are currently in place (for example, in the About boxes). 21 | 22 | 3. The origin of this software must not be misrepresented; you must not claim that you wrote the 23 | original software. If you use this software to distribute a product, an acknowledgment in the 24 | product documentation would be appreciated but is not required. 25 | 26 | 4. Modified versions in source or binary form must be plainly marked as such, and must not be 27 | misrepresented as being the original software. 28 | 29 | 30 | Jordan Russell 31 | jr-2020 AT jrsoftware.org 32 | https://jrsoftware.org/ -------------------------------------------------------------------------------- /third-party/inno-setup/6.2.0/unins000.dat: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DazedNConfused-/CDDA-Game-Launcher/c52495a4d79a364d6c381042790bf33b5209d37c/third-party/inno-setup/6.2.0/unins000.dat -------------------------------------------------------------------------------- /third-party/inno-setup/6.2.0/unins000.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DazedNConfused-/CDDA-Game-Launcher/c52495a4d79a364d6c381042790bf33b5209d37c/third-party/inno-setup/6.2.0/unins000.exe -------------------------------------------------------------------------------- /third-party/inno-setup/6.2.0/unins000.msg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DazedNConfused-/CDDA-Game-Launcher/c52495a4d79a364d6c381042790bf33b5209d37c/third-party/inno-setup/6.2.0/unins000.msg -------------------------------------------------------------------------------- /third-party/inno-setup/6.2.0/whatsnew.htm: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Inno Setup 6 Revision History 5 | 6 | 19 | 20 | 21 | 22 |
Inno Setup 6
Revision History
23 | 24 |

Copyright © 1997-2021 Jordan Russell. All rights reserved.
25 | Portions Copyright © 2000-2021 Martijn Laan. All rights reserved.
26 | For conditions of distribution and use, see LICENSE.TXT. 27 |

28 | 29 |

Want to be notified by e-mail of new Inno Setup releases? Subscribe to the Inno Setup Mailing List!

30 | 31 |

6.2.0 (2021-06-03)

32 |

Graphics modernized

33 |
    34 |
  • Updated all Compiler IDE's toolbar icons and the wizard images used by the Compiler IDE's New Script Wizard wizard.
  • 35 |
  • Updated the default application icon used by Setup and Uninstall if [Setup] section directive SetupIconFile is not set. To use the old icon again set SetupIconFile to compiler:SetupClassicIcon.ico.
  • 36 |
  • [Setup] section directives WizardImageFile and WizardSmallImageFile now default to a blank value which makes Setup use new built-in wizard images. To use the old wizard images again set WizardImageFile and WizardSmallImageFile to compiler:WizClassicImage.bmp and compiler:WizClassicSmallImage.bmp respectively.
  • 37 |
  • Updated Uninstall's default small wizard image if [Setup] section directive SetupIconFile is not set. Before it would use Setup's default application icon in this case.
  • 38 |
  • Updated the folder, group, and stop icons used by Setup's Select Destination Location, Select Start Menu Folder, and Preparing to Install wizard pages.
  • 39 |
  • Updated the disk icon used by Setup's Setup Needs the Next Disk form.
  • 40 |
  • Pascal Scripting change: Added new InitializeBitmapImageFromIcon support function.
  • 41 |
42 |

All these icon and images updates include the automatic use of higher quality versions (which were not available before) on higher DPI settings. This includes new automatic use of higher quality icons for the icon on Setup's Select Setup Language form and Uninstall's small wizard image if SetupIconFile is set.

43 |

Example screenshots:

44 | 49 |

Comparison screenshots of the *previous* version:

50 | 53 |

Other changes

54 |
    55 |
  • Links displayed by [Setup] section directives LicenseFile, InfoBeforeFile and InfoAfterFile are now executed as the original user if possible when clicked.
  • 56 |
  • Added new [Setup] section directives MissingMessagesWarning and NotRecognizedMessagesWarning to disable warnings about messages missing or not recognized for a language.
  • 57 |
  • /LOG: Now logs more uninstaller actions.
  • 58 |
  • The {localappdata} constant can now correctly trigger a used user areas warning.
  • 59 |
  • Compiler IDE change: Fix: Autocomplete support for event functions listed some procedures as functions.
  • 60 |
  • Pascal Scripting changes: 61 |
      62 |
    • Added new CreateMarqueeProgressWizardPage support function to show marquee progress to the user. See the AllPagesExample.iss example script for an example.
    • 63 |
    • Added new ItemFontStyle and SubItemFontStyle properties to the TNewCheckListBox support class. See the CodeClasses.iss example script for an example.
    • 64 |
    • Added new IsMsiProductInstalled and StrToVersion support functions.
    • 65 |
    • Added new AbortedByUser property to the TDownloadWizardPage support class.
    • 66 |
    • Fix: CreateDownloadPage's progress bar now supports files larger than 2 GB.
    • 67 |
    • Support functions ParamCount and ParamStr now exclude undocumented internal parameters used by Setup and Uninstall.
    • 68 |
    • The built-in download support now allows the download of files for which the server does not specify the file size and its hash checking is no longer case sensitive.
    • 69 |
    70 |
  • 71 |
  • ISPP change: Added new StrToVersion support function.
  • 72 |
  • Added official Bulgarian translation.
  • 73 |
  • Various documentation improvements.
  • 74 |
  • Minor tweaks.
  • 75 |
76 |

Inno Setup FAQ updated

77 |
    78 |
  • The Inno Setup FAQ has been updated with updated versions of articles taken from the Inno Setup Knowledge Base which is now hidden from the website.
  • 79 |
  • The content of the FAQ is now available on GitHub where you can suggest new entries or other improvements using the Edit button.
  • 80 |
81 |

QuickStart Pack removed

82 |
    83 |
  • The QuickStart Pack installer has been removed because of a lack of added value.
  • 84 |
  • The standard Inno Setup installer now offers to download encryption support if it's missing, like the QuickStart Pack installer did before. If you used the QuickStart Pack installer before, you can use the standard installer to update your installation.
  • 85 |
86 | 87 |

Contributions via GitHub: Thanks to Sergii Leonov and Dom Gries for their contributions.

88 | 89 |

Inno Setup 6.1 Revision History

90 | 91 | 92 | 93 | -------------------------------------------------------------------------------- /third-party/pylzma/pylzma-0.5.0-cp39-cp39-win_amd64.whl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DazedNConfused-/CDDA-Game-Launcher/c52495a4d79a364d6c381042790bf33b5209d37c/third-party/pylzma/pylzma-0.5.0-cp39-cp39-win_amd64.whl -------------------------------------------------------------------------------- /third-party/pylzma/pylzma-0.5.0-cp39-cp39-win_amd64.whl.license: -------------------------------------------------------------------------------- 1 | SPDX-FileCopyrightText: PyLZMA Copyright (C) 2004-2015 Joachim Bauch 2 | SPDX-FileCopyrightText: 7-Zip Copyright (C) 1999-2010 Igor Pavlov 3 | SPDX-FileCopyrightText: LZMA SDK Copyright (C) 1999-2010 Igor Pavlov 4 | 5 | SPDX-License-Identifier: LGPL-2.1-only 6 | 7 | This file was downbloaded from https://www.lfd.uci.edu/~gohlke/pythonlibs/ 8 | The upstream is https://github.com/fancycode/pylzma 9 | -------------------------------------------------------------------------------- /third-party/unrar-command-line-tool/UnRAR.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DazedNConfused-/CDDA-Game-Launcher/c52495a4d79a364d6c381042790bf33b5209d37c/third-party/unrar-command-line-tool/UnRAR.exe -------------------------------------------------------------------------------- /third-party/unrar-command-line-tool/UnRAR.exe.license: -------------------------------------------------------------------------------- 1 | SPDX-FileCopyrightText: 2002-2022 Alexander L. Roshal 2 | 3 | SPDX-License-Identifier: LicenseRef-unrar -------------------------------------------------------------------------------- /third-party/unrar-command-line-tool/license.txt: -------------------------------------------------------------------------------- 1 | ****** ***** ****** UnRAR - free utility for RAR archives 2 | ** ** ** ** ** ** ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3 | ****** ******* ****** License for use and distribution of 4 | ** ** ** ** ** ** ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 5 | ** ** ** ** ** ** FREEWARE version 6 | ~~~~~~~~~~~~~~~~ 7 | 8 | The UnRAR utility is freeware. This means: 9 | 10 | 1. All copyrights to RAR and the utility UnRAR are exclusively 11 | owned by the author - Alexander Roshal. 12 | 13 | 2. The UnRAR utility may be freely distributed. It is allowed 14 | to distribute UnRAR inside of other software packages. 15 | 16 | 3. THE RAR ARCHIVER AND THE UnRAR UTILITY ARE DISTRIBUTED "AS IS". 17 | NO WARRANTY OF ANY KIND IS EXPRESSED OR IMPLIED. YOU USE AT 18 | YOUR OWN RISK. THE AUTHOR WILL NOT BE LIABLE FOR DATA LOSS, 19 | DAMAGES, LOSS OF PROFITS OR ANY OTHER KIND OF LOSS WHILE USING 20 | OR MISUSING THIS SOFTWARE. 21 | 22 | 4. Neither RAR binary code, WinRAR binary code, UnRAR source or UnRAR 23 | binary code may be used or reverse engineered to re-create the RAR 24 | compression algorithm, which is proprietary, without written 25 | permission of the author. 26 | 27 | 5. If you don't agree with terms of the license you must remove 28 | UnRAR files from your storage devices and cease to use the 29 | utility. 30 | 31 | Thank you for your interest in RAR and UnRAR. 32 | 33 | 34 | Alexander L. Roshal -------------------------------------------------------------------------------- /third-party/unrar-command-line-tool/license.txt.license: -------------------------------------------------------------------------------- 1 | SPDX-FileCopyrightText: 2002-2022 Alexander L. Roshal 2 | 3 | SPDX-License-Identifier: LicenseRef-unrar -------------------------------------------------------------------------------- /third-party/vs-build-tools/.vsconfig: -------------------------------------------------------------------------------- 1 | { 2 | "version": "1.0", 3 | "components": [ 4 | "Microsoft.VisualStudio.Component.Roslyn.Compiler", 5 | "Microsoft.Component.MSBuild", 6 | "Microsoft.VisualStudio.Component.CoreBuildTools", 7 | "Microsoft.VisualStudio.Workload.MSBuildTools", 8 | "Microsoft.VisualStudio.Component.Windows10SDK", 9 | "Microsoft.VisualStudio.Component.VC.CoreBuildTools", 10 | "Microsoft.VisualStudio.Component.VC.Tools.x86.x64", 11 | "Microsoft.VisualStudio.Component.VC.Redist.14.Latest", 12 | "Microsoft.VisualStudio.Component.Windows10SDK.19041", 13 | "Microsoft.VisualStudio.Component.TextTemplating", 14 | "Microsoft.VisualStudio.Component.VC.CoreIde", 15 | "Microsoft.VisualStudio.ComponentGroup.NativeDesktop.Core", 16 | "Microsoft.VisualStudio.Workload.VCTools" 17 | ] 18 | } -------------------------------------------------------------------------------- /third-party/vs-build-tools/.vsconfig.license: -------------------------------------------------------------------------------- 1 | SPDX-FileCopyrightText: 2022 Gonzalo López 2 | 3 | SPDX-License-Identifier: MIT -------------------------------------------------------------------------------- /third-party/vs-build-tools/vs_BuildTools.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DazedNConfused-/CDDA-Game-Launcher/c52495a4d79a364d6c381042790bf33b5209d37c/third-party/vs-build-tools/vs_BuildTools.exe -------------------------------------------------------------------------------- /third-party/vs-build-tools/vs_BuildTools.exe.license: -------------------------------------------------------------------------------- 1 | SPDX-FileCopyrightText: 2022 Microsoft Corporation 2 | 3 | SPDX-License-Identifier: LicenseRef-visual-cpp-build-tools --------------------------------------------------------------------------------