Compare commits

...
254 Commits
Author SHA1 Message Date
Lukas Obermann 0dc6316b5b docs(github): use task list for new book data sources 2025-09-06 17:08:53 +02:00
Lukas Obermann c7d1735e4b docs(github): change new book data template to hide instructions as comments 2025-09-06 17:03:13 +02:00
Lukas Obermann aa93dab7fd build(release): 1.5.2 2025-01-02 18:43:46 +01:00
Lukas Obermann 5a9ae86cf9 build(git): merge master 2025-01-02 18:43:14 +01:00
Michel FeddeandLukas Obermann 7f5f94491e fix: throws during startup due to changed devtools identifiers
Refs: #1634
Co-authored-by: Lukas Obermann <lukas.obermann@icloud.com>
2025-01-02 18:26:57 +01:00
Lukas Obermann a2979650f2 build(deps): fix auto-fixable vulnerabilities in packages 2025-01-02 18:17:24 +01:00
Lukas Obermann bc80b0479a docs: add easier option to receive the database for contribution purposes 2023-01-24 18:52:20 +01:00
cziermannandChristian Ziermann fdd391b849 docs: correct build command for ts
Refs: #1592
Co-authored-by: Christian Ziermann <christian.ziermann@contabo.de>
2023-01-07 13:09:25 +01:00
Lukas Obermann 057edce846 build(release): 1.5.2-alpha.4 2022-07-22 23:31:27 +02:00
Lukas Obermann c52fc26a1b fix: improvement cost handling for some traditions
The refactoring resulted in no spells being available to intuitive mages.

In general, comparing improvement costs directly did not work.
2022-07-22 23:30:16 +02:00
dependabot[bot]anddependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> d28667a935 build(deps): bump terser from 5.10.0 to 5.14.2
Bumps [terser](https://github.com/terser/terser) from 5.10.0 to 5.14.2.
- [Release notes](https://github.com/terser/terser/releases)
- [Changelog](https://github.com/terser/terser/blob/master/CHANGELOG.md)
- [Commits](https://github.com/terser/terser/commits)

---
updated-dependencies:
- dependency-name: terser
  dependency-type: indirect
...

Refs: #1382

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-07-22 21:03:23 +02:00
Lukas Obermann b92e47cd13 ci: update and streamline test workflow 2022-07-14 13:17:09 +02:00
Lukas Obermann 87a21b6fc4 style(ci): indent lists by two spaces 2022-07-14 13:07:31 +02:00
Lukas Obermann ccd0898f4e ci: provide apple csc env variables to macOS build only 2022-07-14 13:06:40 +02:00
Lukas Obermann c162931e74 fix: show improvement cost in tabular list 2022-07-12 22:16:27 +02:00
Lukas Obermann b578254d75 refactor: remove inconsistent and wrong usage of prefix functions 2022-07-12 10:23:26 +02:00
Lukas Obermann 7b57aca991 build(release): 1.5.2-alpha.3 2022-07-12 10:05:12 +02:00
Lukas Obermann 282467e4af refactor: disallow use of improvement cost as simple number 2022-07-12 10:04:54 +02:00
Lukas Obermann e6d1b8d3fd build(release): 1.5.2-alpha.2 2022-07-11 15:45:53 +02:00
Lukas Obermann f09be7d54b ci: fix package named import 2022-07-11 15:45:39 +02:00
Lukas Obermann 3397ed8cee ci: forward code signing certificates for macos 2022-07-11 15:37:48 +02:00
Lukas Obermann 7b6a0980b9 ci: fix package import 2022-07-11 15:24:55 +02:00
Lukas Obermann 7b245b989b ci: remove reasonml build from test 2022-07-11 15:23:04 +02:00
Lukas Obermann 32058f76c2 build(notarization): adjust plist for notarization 2022-07-11 15:14:23 +02:00
Lukas Obermann a6576bb8ab refactor: remove reasonml from project 2022-07-11 12:12:19 +02:00
Lukas Obermann 7c6e377692 feat: enable auto-update for macOS 2022-07-11 10:00:09 +02:00
Lukas Obermann fe7c5e68ed build: integrate notarization 2022-07-10 23:17:46 +02:00
Lukas Obermann 531530e763 build(deps): upgrade electron to 19.0.4 2022-06-19 12:37:51 +02:00
dependabot[bot]anddependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> e1befd1383 build(deps): bump semver-regex from 3.1.3 to 3.1.4 (#1375)
Bumps [semver-regex](https://github.com/sindresorhus/semver-regex) from 3.1.3 to 3.1.4.
- [Release notes](https://github.com/sindresorhus/semver-regex/releases)
- [Commits](https://github.com/sindresorhus/semver-regex/commits/v3.1.4)

---
updated-dependencies:
- dependency-name: semver-regex
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-06-08 09:40:18 +02:00
Lukas Obermann 2eb87c8f4c build(deps): bump packages with vulnerabilities
- bump ejs from 3.1.6 to 3.1.7
- bump async from 0.9.2 to 3.2.3
- bump filelist from 1.0.2 to 1.0.3
- bump jake from 10.8.2 to 10.8.5
2022-04-29 11:17:10 +02:00
dependabot[bot]dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>Lukas Obermann
531715f171 build(deps): bump plist from 3.0.4 to 3.0.5
Refs: #1371
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Lukas Obermann <lukas.obermann@icloud.com>
2022-04-29 11:11:33 +02:00
dependabot[bot]anddependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> 4c9096b3d5 build(deps): bump minimist from 1.2.5 to 1.2.6
Refs: #1365
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-04-29 11:10:27 +02:00
dependabot[bot]anddependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> 7c3d722d7e build(deps): bump moment from 2.25.3 to 2.29.2
Refs: #1364
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-04-29 11:09:26 +02:00
Lukas Obermann c4b995e046 build(release): 1.5.2-alpha.1 2022-04-29 11:01:20 +02:00
Lukas Obermann c987847c9b feat: add krallenkettenzauber as placeholder 2022-04-29 10:54:57 +02:00
Lukas Obermann e99828f1cc docs(changelog): add general changelog for 1.5.1 2022-03-21 11:33:42 +01:00
Lukas Obermann 8e8932cd83 build(release): bump version to 1.5.1 2022-03-20 16:05:05 +01:00
Lukas Obermann 246b3d5c1d build(release): 1.5.1
Refs: #1361
2022-03-20 15:26:41 +01:00
Lukas Obermann c15505062d build(release): 1.5.1
Refs: #1360
2022-03-20 15:26:11 +01:00
Lukas Obermann 8d54177cac Merge branch 'master' into release/1.5.1 2022-03-20 15:21:54 +01:00
Lukas Obermann 96c7b54fce docs(changelog): add Dutch changelogs für 1.5.1 2022-03-20 15:18:38 +01:00
Lukas Obermann 5c7ffd0660 docs(changelog): add initial 1.5.1 changelogs 2022-02-25 08:29:51 +01:00
Lukas Obermann d24fae03b7 build(release): 1.5.1-alpha.2 2022-02-22 11:16:20 +01:00
Lukas Obermann 8102bb1a9a fix: advantage Inspire Confidence could be bought with social Incompetence
Fixes #1351
2022-02-22 11:14:09 +01:00
Lukas Obermann 07d336dbb3 feat(maptool): add project links 2022-02-22 10:51:37 +01:00
Lukas Obermann d40bdac744 refactor(maptool): resolve most TODOs 2022-02-21 15:20:30 +01:00
Lukas Obermann d3926aff86 build(release): 1.5.1-alpha.1 2022-02-21 09:36:44 +01:00
Lukas Obermann 80fdffb373 fix(maptool): no export possible without an avatar
Fixes #1348
2022-02-21 09:36:25 +01:00
Lukas Obermann 92bfcb96b0 build(ide): disable output scanning for release tasks 2022-02-18 11:50:28 +01:00
Lukas Obermann afd32c9827 build(release): 1.5.1-alpha.0 2022-02-18 11:48:57 +01:00
Lukas Obermann 3f87dca910 fix: add missing Italian translations for MapTool export
Fixes #1350
2022-02-18 11:16:14 +01:00
Lukas Obermann 2c9332c37f fix: markdown parser ignores strikethrough
The GFM plugin was missing.

Fixes #1349
2022-02-18 11:06:44 +01:00
Lukas ObermannandLector 9e9a1139d3 fix(maptool): format change for 1.11.4
Since MapTool v1.11.14 a sizeMap needs to be included, otherwise the import does
not work. Maybe the format changed happend earlier.

Co-authored-by: Lector <dragonsfire@gmx.de>
2022-02-10 18:47:31 +01:00
Lukas Obermann c5d2b0a7a4 docs(changelog): add French changelog for 1.5.0 2022-02-09 12:51:33 +01:00
Lukas Obermann f1e16d5c39 docs(changelog): remove unreleased feature
(cherry picked from commit 449f8c7bb2)
2022-02-09 12:10:05 +01:00
Lukas Obermann 449f8c7bb2 docs(changelog): remove unreleased feature 2022-02-09 11:51:59 +01:00
Lukas Obermann 53ab0e704e build(release): merge 1.5.0 2022-02-09 11:41:31 +01:00
Lukas Obermann 5b7f223211 build(release): 1.5.0 2022-02-09 11:33:17 +01:00
Lukas Obermann 5bb9c8ca7b docs(changelog): add Italian changelog translation for 1.5.0 2022-02-07 22:42:36 +01:00
Lukas Obermann ef84a38cf6 docs(changelog): add French, Italian and Dutch changelogs for 1.5.0 in English 2022-02-07 10:36:48 +01:00
Lukas Obermann d2eca82ea5 fix: add more action types that should be ignored for undo history 2022-02-06 22:31:13 +01:00
Lukas Obermann 854995cb3b docs(changelog): add German changelog for 1.5.0 2022-02-06 20:18:46 +01:00
Lukas Obermann 659ab5f8db docs(changelog): remove unnecessary issue prefixes 2022-02-06 18:39:37 +01:00
Lukas Obermann 8777b9a0cd docs(changelog): add Portuguese changelog for initial release 2022-02-06 18:39:14 +01:00
Lukas Obermann 27cbd7abd7 docs(changelog): add English changelog for 1.5.0 2022-02-06 18:38:50 +01:00
Lukas Obermann e4672041db docs(issues): fix more bug report issue form ids 2022-02-06 16:18:02 +01:00
Lukas Obermann fc8c837008 docs(issues): fix bug report issue form ids 2022-02-06 16:17:14 +01:00
Lukas Obermann a3c269dd35 docs(issues): use issue form for bug reports 2022-02-06 16:15:35 +01:00
Lukas Obermann 8753a4656e build(release): 1.5.0-alpha.9 2022-02-06 12:51:39 +01:00
Lukas Obermann bdb3eb7804 fix: typo in German name of Tradition (Illusionist)
Fixes #1239
2022-02-05 23:55:44 +01:00
Lukas Obermann c0dbb3fbcb refactor: use native array in inactive spells list 2022-02-05 17:01:31 +01:00
Lukas Obermann 06eac93221 fix: active animist powers occurred multiple times in addition list
The issue apparently only applied to animist powers, no other spellworks.

Fixes #794
2022-02-05 16:52:02 +01:00
Lukas Obermann d2d3445928 docs(changelog): add explicit MapTool export notice 2022-02-04 23:46:58 +01:00
Lukas Obermann c0d799c057 ci: hide upload progress logging for deployment 2022-02-04 20:35:02 +01:00
Lukas Obermann b1942216e5 build(release): 1.5.0-alpha.8 2022-02-04 20:17:20 +01:00
Lukas Obermann 1e21b6bcd4 refactor: remove unused action type 2022-02-04 17:51:28 +01:00
Lukas Obermann 8b18b26361 feat(logs): add small logging utility function 2022-02-04 17:35:09 +01:00
Lukas Obermann 923b7605fe fix: saving a hero clears the undo history of multiple characters
The current hero identifier was not cleared if leaving a hero view, which lead
to the action clearing the history of both the hero that actually should be
saved as well as the most recently opened character in this session.

Fixes #811
2022-02-04 17:34:14 +01:00
Lukas Obermann 589338fe74 refactor(datatypes): move predicate properties to prototype
This prevents them from showing up in console logs, which makes them less
cluttered.
2022-02-04 17:28:22 +01:00
Lukas Obermann 5f1e1f8148 style: disable redeclaration ESLint rule for the entire file 2022-02-04 17:10:06 +01:00
Lukas Obermann 1f090605a4 fix(prerelease): cult of Levtan not registered as blessed tradition 2022-02-04 16:21:28 +01:00
Lukas Obermann e558c1d80d fix: spells converted by Imitationszauberei cannot use spell enhancements
Fixes #828
2022-02-04 15:37:09 +01:00
Lukas Obermann 232795d129 fix(datatypes): find might return an existing value that is undefined 2022-02-04 13:49:52 +01:00
Lukas Obermann a49048d468 build(ide): use node debugger preview in VSCode 2022-02-04 13:25:46 +01:00
Lukas Obermann 1ce2db9cfb fix: attribute minimum must include combat techniques
The allowed maximum of combat techniques depends on the value of its highest
primary attribute. The reverse dependency - the then-required minimum - was not
applied.

Fixes #836
2022-02-04 00:03:14 +01:00
Lukas Obermann 7e31136083 fix: wrong combat type of special ability Blattschuss
Fixes #1331
2022-02-03 21:09:26 +01:00
Lukas Obermann 4c9a1f9bc5 build(ide): add css build task 2022-02-03 18:05:10 +01:00
Lukas Obermann 2a62e4231d ci: switch to ssh2-sftp-client for deployment
This fixes the unfixed vulnerability in qusly-core.
2022-02-03 15:39:50 +01:00
Lukas Obermann 41ee35ba76 fix: widened rows in seconds column of skills table on character sheet
Fixes #1342
2022-02-03 14:42:36 +01:00
Lukas Obermann cad0f26042 build(deps): upgrade electron to 17 2022-02-03 13:46:55 +01:00
Lukas Obermann 7a9da8f65e docs(changelog): remove unnecessary issue prefix 2022-02-03 13:33:18 +01:00
Lukas Obermann e36099d812 build(ide): add git push --follow-tags for use after release creation 2022-02-03 13:26:56 +01:00
Lukas Obermann 8e66f9b83a build(release): 1.5.0-alpha.7 2022-02-03 13:18:35 +01:00
Lukas Obermann f1024868ff build(ide): add tasks for creating release commits 2022-02-03 13:18:16 +01:00
Lukas Obermann a24ff8082a fix: auto-updater not working in AppImage
Fixes #753
2022-02-03 13:15:04 +01:00
Lukas Obermann 1ed0c64b0d fix: scripts do not require an active matching language
Fixes #1344
2022-02-03 12:02:41 +01:00
Lukas Obermann 83b534d3f9 fix: cannot activate special ability Weg der Schreiberin
Fixes #1233
2022-02-03 11:41:06 +01:00
Lukas Obermann 4dabbdbcd2 fix: requiring one matching languages and script requires all of them
Fixes #1343
2022-02-03 11:40:07 +01:00
Lukas Obermann 0ab65e869c fix: range brackets input influences other bracket fields
Fixes #1251
2022-02-02 13:22:55 +01:00
Lukas Obermann f2e61386ab fix: some item properties were not saved
Fixes #1252
2022-02-02 12:25:14 +01:00
Lukas Obermann e70a8b9d34 build(ide): create useful VSCode tasks 2022-02-02 12:19:47 +01:00
Lukas Obermann c3985275bb refactor: rename misleading variable 2022-02-02 12:18:05 +01:00
Lukas Obermann 8b060b6002 refactor(datatypes): add immutable methods to arrays 2022-02-02 01:38:40 +01:00
Lukas Obermann ac0cdc3778 fix: primary attribute prerequisites may not have been added as dependencies
The previous implementation relied on the tradition being added to the hero
object before the entry having the prerequisite was added, since the dependency
has been added statically, depending on the then-known traditions. But there are
situations where this is not the case, resulting in no prerequisite being added.
The new implementation does not bind the dependencies to a specific attribute,
but instead dynamically infers which is the primary attribute to then apply the
registered primary dependencies. This makes the dependencies independent of
the presence of tradition entries in the initialization phase.

Fixes #1260
2022-02-01 23:55:42 +01:00
Lukas Obermann 8b5eedeb37 fix: typo in German name of Tarnele
Fixes #1330
2022-02-01 22:05:14 +01:00
Lukas Obermann 06b57c9d15 fix: use Brawling Points in special ability Knuckle Storm description
Fixes #1340
2022-02-01 22:02:54 +01:00
Lukas Obermann 03f26214ae docs: change Apple M1 support text 2022-02-01 21:59:08 +01:00
Lukas Obermann d66afba3c1 docs: add Apple M1 native support note 2022-02-01 18:00:47 +01:00
Lukas Obermann 3574d1ba46 fix: unfamiliar spell selection in profession was optional
The selection of an unfamiliar spell for Tradition (Guild Mage), which is
included in a profession package, was not required to apply race, culture and
profession.

Fixes #1315
2022-02-01 17:51:02 +01:00
Lukas Obermann dcfba14df7 build(release): 1.5.0-alpha.6 2022-02-01 17:22:50 +01:00
Lukas Obermann 6669352d06 fix: special ability Tradition (Tsatuara-Anhängerinnen) is in wrong group
Fixes #1137
2022-02-01 17:16:09 +01:00
Lukas Obermann 9cb26586f3 fix: too large PDF output when using a sheet background
Fixes #1094
2022-02-01 17:08:30 +01:00
Lukas Obermann cd16e5314a fix: profession Sharisad gets Earthencraft bonus instead of Clothworking bonus
Fixes #1341
2022-02-01 16:53:49 +01:00
Lukas Obermann 6ba99f2f46 fix: weight column in inventory shows wrong weight in English
Fixes elyukai/optolith-client#1329
2022-02-01 16:33:52 +01:00
Lukas Obermann bd9fc1badc feat: add kilogram hint to English item dialog 2022-02-01 16:32:39 +01:00
Lukas Obermann 47e66d6546 fix: attributes on minimum value do not allow CtR over 6
Fixes elyukai/optolith-client#835
2022-02-01 16:10:31 +01:00
Lukas Obermann bba9b92e5d feat: add utilities for working with tagged unions 2022-02-01 16:02:12 +01:00
Lukas Obermann fb0a0bbbfb test: check TSDoc comments format with ESLint 2022-02-01 16:01:36 +01:00
Lukas Obermann 8bcae62f2f refactor: remove unused ESM preload module 2022-02-01 15:54:46 +01:00
Lukas Obermann 383a9c166c fix: show Hit Zone Armor tab for English Armory
Fixes elyukai/optolith-client#1328
2022-02-01 15:44:57 +01:00
Lukas Obermann 94e751fda1 build: add macOS builds for M1 2022-01-31 18:55:32 +01:00
Lukas Obermann 36c643f04a build(release): 1.5.0-alpha.5 2022-01-27 21:28:57 +01:00
Lukas Obermann 0143c28b0c ci: upgrade all workflows to Node 16 2022-01-27 21:19:54 +01:00
Lukas Obermann 793ad447b4 build(release): 1.5.0-alpha.8 2022-01-27 21:10:16 +01:00
Lukas Obermann 9f3e52b5da ci: update release workflow to use Node 14 2022-01-27 21:08:59 +01:00
Lukas Obermann a7ff9fc901 ci: update prerelease workflow to use Node 14 2022-01-27 21:08:30 +01:00
Lukas Obermann 3ea0d6ee10 build(release): 1.5.0-alpha.7 2022-01-27 21:03:58 +01:00
Lukas Obermann 83d9bd40dd build: upgrade to Electron 16 2022-01-27 21:02:50 +01:00
Lukas Obermann 8fb5f28dd0 build(release): 1.5.0-alpha.6 2022-01-27 20:26:01 +01:00
Lukas Obermann 85eba763ac test: revert to Jest 26 2022-01-27 20:21:48 +01:00
Lukas Obermann a6417ff1de test: use ts-jest preset in Jest config 2022-01-27 19:32:06 +01:00
Lukas Obermann fe85d2d79a ci: upgrade linting to Node 14 2022-01-27 19:22:43 +01:00
Lukas Obermann 4850363119 build: optimize Webpack RAM usage and build times 2022-01-27 19:12:23 +01:00
Lukas Obermann e0f3d5b1a3 style: fix all ESLint errors 2022-01-27 12:09:12 +01:00
Lukas Obermann a26b4094c2 build(release): 1.5.0-alpha.5 2022-01-27 11:23:28 +01:00
Lukas Obermann 47028ab470 Merge branch 'develop' of github.com:elyukai/optolith-client into develop 2022-01-27 11:22:00 +01:00
Lukas Obermann d8c9f52542 feat: portuguese translations 2022-01-27 11:21:49 +01:00
Lukas Obermann 29c7b4bc39 fix: missing import 2022-01-27 11:21:01 +01:00
Lukas Obermann 6b93c15aa0 fix: latest TypeScript compilation errors 2022-01-27 11:07:57 +01:00
Lukas Obermann 0620ff2ab8 Create FUNDING.yml 2022-01-23 21:36:10 +01:00
Lukas Obermann 10582541e0 build(deps): fix vulnerabilities 2021-12-13 00:11:16 +01:00
Lukas Obermann c13b557dd7 ci: linter requires database submodule
Revert: bf9d29a6dc
2021-08-03 13:37:09 +02:00
Lukas Obermann bf9d29a6dc ci: linter does not require database submodule 2021-08-03 13:31:59 +02:00
Lukas Obermann 4699d38a1a build(release): 1.5.0-alpha.4 2021-08-03 13:00:45 +02:00
Lukas Obermann b2fb0353a9 fix: maptools should provide user interface strings 2021-08-03 13:00:33 +02:00
Lukas Obermann 66077430d8 build(release): 1.5.0-alpha.3 2021-08-03 12:46:55 +02:00
Lukas Obermann 08e7817597 build(deps): fix security vulnerabilities 2021-08-03 12:46:08 +02:00
Lukas Obermann 87cec15ba9 Merge pull request #815 from elyukai/maptools_export
Maptools export
2021-08-03 12:42:56 +02:00
Lukas Obermann 63ac0abbe3 Merge branch 'develop' into maptools_export 2021-08-03 12:41:28 +02:00
Lukas Obermann 41278f8316 docs: fix changelog 2021-05-28 16:24:10 +02:00
Lukas Obermann 5d45a6084e build(release): 1.5.0-alpha.2 2021-05-28 16:23:01 +02:00
Lukas Obermann f8114c2f43 fix: "Tradition (Druid)" has invalid prerequisite in data
Fixes #1237
2021-05-28 14:57:47 +02:00
Lukas Obermann e40f995e34 fix: "Physiostabilis" name typo
Fixes #1234
2021-05-28 14:53:41 +02:00
Lukas Obermann ed74170865 fix: hook dagger is not marked as a parrying weapon
Fixes #1232
2021-05-28 14:42:15 +02:00
Lukas Obermann 8297455ddb fix: weapon advantage of Kriegsbogen has wrong DP bonus
Fixes #1074
2021-05-28 14:23:56 +02:00
Lukas Obermann 42891f070c fix: "Gaze into the Essence" spell is misspelled as "Gase into the Essence"
Fixes #1180
2021-05-28 14:19:54 +02:00
Lukas Obermann a5df7c863c fix: wrong English names for spell enhancements of Heptagramma
Fixes #848
2021-05-28 14:18:35 +02:00
Lukas Obermann ec9bd71e10 fix: special ability Deadly Thrust has SA Crossblock's rules text
Fixes #841
2021-05-28 14:16:57 +02:00
Lukas Obermann 21146eb2ab fix: wrong negative prerequisite for Aspect Knowledge entry
Fixes #1243
2021-05-28 14:12:46 +02:00
Lukas Obermann 16bd668313 fix: multiple database fixes
Fixes #854
Fixes #855
Fixes #1136
Fixes #1213
Fixes #1236
Fixes #1242
2021-05-28 14:06:52 +02:00
Lukas Obermann 6eeb430e83 build(release): 1.5.0-alpha.1 2021-05-27 22:23:05 +02:00
Lukas Obermann ae2fbad1c7 fix: equipment info crash 2021-05-27 17:49:34 +02:00
Lukas Obermann d647cf5f4e refactor: tried to reduce character sheet file size but did not work
See #1094
2021-05-26 23:11:15 +02:00
Lector e334e51685 Bugfix in MapToolExporter.ts: MD5 Hashes of the avatar is now based on the image.
Heros without Image are now exported with a stick-figure
2021-05-26 22:53:18 +02:00
Lukas Obermann 092343f45d fix: cannot remove dependent entry with multiple activations
Fixes #1097
2021-05-26 22:25:38 +02:00
Lukas Obermann 7ac4773b05 build(deps): upgrade to electron 13 and fix react-markdown integration 2021-05-26 22:24:27 +02:00
Lector 0b5713d6fd Removed Aspects. This feature is cancelled.
Finished all the rest. I think this version can be merged into the main-branch.
2021-05-26 05:09:12 +02:00
Lukas Obermann 6357b2c4b4 docs: port refactored issue templates from master branch 2021-05-24 12:20:15 +02:00
Lukas Obermann ea86624560 build(deps): fix vulnerabilities 2021-05-22 16:07:59 +02:00
Lector fe34bedc54 Added Spell-Property and Avatar-Export 2021-05-21 23:10:17 +02:00
Lukas Obermann c8094f5ef1 fix: filter professions with CTs higher than EL allows
Closes #1244
2021-05-11 11:06:54 +02:00
Lukas Obermann a02700eecc fix: brawling weapons have no parry on character sheet
Fixes #1229
2021-05-09 00:35:10 +02:00
Lukas Obermann fdde329de5 fix: profession with due to EL impossible attribute values can be selected
Fixes #1109
2021-05-09 00:26:38 +02:00
Lukas Obermann c1b2e267cb fix: spellworks from professions do not register dependencies
Fixes #1240
2021-05-08 23:19:24 +02:00
Lukas Obermann eb5a06884d fix: ini/mov modifiers on armor are handled as penalties
Fixes #1091
2021-05-08 22:06:34 +02:00
Lukas Obermann 0a59d9e5e5 fix: language specializations always cost 1 AP and are multi-buyable
Fixes #1082
2021-05-08 01:04:16 +02:00
Lukas Obermann 3ceeadbdf7 refactor: remove unnecessary logs 2021-05-07 23:46:08 +02:00
Lukas Obermann 28f260a2c4 fix: enhancements on transferred unfamiliar spells as dependency
Fixes #827
2021-05-07 23:42:49 +02:00
Lukas Obermann 5b6a4c8301 build(db): update database submodule 2021-05-06 20:22:43 +02:00
Lukas Obermann cc5ecd6f09 fix: portraits with transparency have black background
Fixes #800
2021-05-06 20:04:19 +02:00
Lukas Obermann 9179bb9ff6 perf: sort template list after filter 2021-05-06 15:34:18 +02:00
Lukas Obermann 6c63ab1b50 fix: primary attribute dropdown does not handle data correctly
Fixes #798
2021-05-06 15:00:26 +02:00
Lukas Obermann 3f9fae30a2 fix: 2H and i weapon settings missing on character sheet
Fixes #797
2021-05-06 14:42:32 +02:00
Lukas Obermann 2ad037ecbc fix: large spell selection and restrictions for Animists
Fixes #803
2021-05-06 12:38:57 +02:00
Lukas Obermann 3d755eb408 build(deps): upgrade to Electron 12 2021-05-06 12:17:30 +02:00
Lukas Obermann 2c6da7bd75 build: package-lock.json update 2021-05-06 01:29:24 +02:00
Lukas Obermann ccd7decc83 fix: include latest database changes 2021-05-06 01:28:26 +02:00
elyukai 397abe2b4a fix: previous database fixes
See #792, #824, #832, #850, #851, #1139, #1224
2021-05-05 23:06:54 +02:00
elyukai 3b05e69e27 fix: weight of Elves is not generated correctly
Fixes #813
2021-05-05 22:57:22 +02:00
elyukai 723e9106eb fix: patch security vulnerabilities 2021-05-05 22:55:57 +02:00
elyukai eef960f496 docs: add UI scaling hint for Linux 2021-05-04 11:03:19 +02:00
Lukas Obermann 6b706d3adb docs: improve sort order for ambiguity template 2021-03-24 15:05:03 +01:00
Lukas Obermann d3a6df526d docs: fix publication ambiguity name 2021-03-24 15:04:02 +01:00
Lukas Obermann a098a97509 docs: update question issue template
Update question issue template to be for questions to Ulisses only, since standard questions can be created as discussion instead.
2021-03-24 13:51:44 +01:00
Lukas Obermann 093a726cf2 Merge pull request #1125 from elyukai/Race-prerequisite-does-not-display-race-required-#1093
Race prerequisite does not display race required #1093
2021-03-24 12:15:34 +01:00
Pepelios 9d033d23df Update WikiActivatableInfo.tsx
remove prefixRace import as never used anymore
2021-03-24 09:02:25 +01:00
Lukas Obermann 912642a5ee Merge pull request #1135 from elyukai/issue-template/publication-bug-report
Update: issue template publication-bug-report.md
2021-03-23 21:56:29 +01:00
Lukas Obermann b92c19a3c8 Merge branch 'master' into issue-template/publication-bug-report 2021-03-23 21:52:45 +01:00
Lukas Obermann c2afd39946 Merge pull request #1134 from elyukai/issue-template/new-book-data
Update: issue template new-book-data.md
2021-03-23 21:45:17 +01:00
Lukas Obermann 444cb12892 Merge branch 'master' into issue-template/new-book-data 2021-03-23 21:42:51 +01:00
Lukas Obermann b1d7ad9ae1 Merge pull request #1133 from elyukai/issue-template/feature_request
Update: issue template feature_request.md
2021-03-23 21:42:35 +01:00
Lukas Obermann f16a8fe249 Merge branch 'master' into issue-template/feature_request 2021-03-23 21:35:02 +01:00
Käthe 764731d02f Implement Markdown Style Guidelines
... and small text changes
2021-03-23 21:34:15 +01:00
Lukas Obermann 02f24b24bc Merge pull request #1132 from elyukai/issue-template/bug-report
Update: issue template bug_report.md
2021-03-23 21:33:30 +01:00
Käthe ee30c4eaea Implement Markdown Style Guidelines 2021-03-23 21:29:49 +01:00
Käthe 8de7b51895 Shorten caption 2021-03-23 21:28:18 +01:00
Käthe 2c1cea9ef8 Implement Markdown Style Guidelines 2021-03-23 21:26:31 +01:00
Käthe f0e8ce17ab Implement Markdown Style Guide 2021-03-23 21:24:27 +01:00
Käthe b6112666b8 Update: issue template publication-bug-report.md
Better readability.
2021-03-23 21:00:50 +01:00
Käthe 99123d5ec0 Update: issue template new-book-data.md
Better readability.
2021-03-23 20:59:35 +01:00
Käthe 17424878e7 Update: issue template feature_request.md
For better readability after filling out the form.
2021-03-23 20:53:48 +01:00
Käthe e44e6f8832 Update: issue template bug_report.md
For better readability after filling out the form.
2021-03-23 20:51:44 +01:00
Pepelios c33e4f1821 Race prerequisite does not display race required #1093
removed "prefixRace" because it added an additional R_ to the lookup value for the races. e.g. value was R_4 (for dwarfs) but after the wrong additional prefixRace, the lookupvalue was R_R_4, which never could be found in any lookup table.
2021-03-22 18:15:54 +01:00
Lukas Obermann c1dab5b312 docs: add required software section 2021-03-19 21:15:24 +01:00
elyukai 31cf5d6c54 docs: add Philipp to imprint 2021-03-18 19:55:21 +01:00
elyukai 63243a2e9d docs: updated AUTHORS 2021-03-18 13:06:28 +01:00
Lukas Obermann 9017dff1fc Changes and prefilled spaces 2021-02-15 20:16:29 +01:00
Lukas Obermann 6a479949e7 docs: database rework issue template adjustments 2021-02-09 12:59:10 +01:00
Lector 228c401666 Money export now works. Tryed to fix attributes. 2021-02-08 12:25:03 +01:00
Lukas Obermann 052b5bbf2f Merge pull request #845 from elyukai/dependabot/npm_and_yarn/electron-10.2.0 2021-01-29 11:46:20 +01:00
dependabot[bot] f30efc84ce build(deps-dev): Bump electron from 10.1.3 to 10.2.0
Bumps [electron](https://github.com/electron/electron) from 10.1.3 to 10.2.0.
- [Release notes](https://github.com/electron/electron/releases)
- [Changelog](https://github.com/electron/electron/blob/master/docs/breaking-changes.md)
- [Commits](https://github.com/electron/electron/compare/v10.1.3...v10.2.0)

Signed-off-by: dependabot[bot] <support@github.com>
2021-01-28 19:45:23 +00:00
Lector 9a2902c9e9 First semi-functioning Version of MapToolExporter.ts 2021-01-17 16:15:30 +01:00
Lector 9b44e29738 Continued work on MapToolExporter.ts 2021-01-12 22:05:55 +01:00
Lector 096af99794 Continued work on MapToolExporter.ts 2021-01-12 07:40:19 +01:00
Lector 073064c030 Continued work on MapToolExporter.ts
Added Strings for MapToolExporter.ts
2021-01-09 14:50:03 +01:00
LectorandLukas Obermann 1ff11d6e9a Update src/App/Utilities/MapToolExporter.ts
Co-authored-by: Lukas Obermann <lukas.obermann@icloud.com>
2021-01-03 21:45:56 +01:00
Lector fa1c527381 Merge branch 'develop' into maptools_export
# Conflicts:
#	app/Database

Added maptools-Export-Button to PDF-Export (not finished yet)
2021-01-03 11:53:51 +01:00
elyukai 272095d0b9 build(submodule): bug fixes, mainly for Dutch
See #805
See #814
2020-12-23 16:03:17 +01:00
Lector f416587e33 work on compilable version 2020-12-23 14:42:26 +01:00
Lector cb3a4a24f2 Bugfixes in MapToolExporter.ts 2020-12-21 16:16:04 +01:00
Lector 20a0c7a055 Merge branch 'develop' into maptools_export
# Conflicts:
#	app/Database
#	package-lock.json
#	src/App/Views/Profile/PersonalData.tsx

Also continued work on MapToolExporter.ts
2020-12-18 13:58:59 +01:00
Lector 2ec6fd0ab5 Small changes for bugfix 2020-12-17 12:55:05 +01:00
Lector bea154d6e6 Added Zip-Library.
Worked on MapToolExporter.ts
Changed UI of the Export-Button
2020-12-09 09:15:30 +01:00
Lector 728c7e15a8 Continued work on MapToolExporter.ts 2020-12-08 10:49:47 +01:00
LectorandLukas Obermann 182cb92a20 Update src/App/Utilities/MapToolExporter.ts
Co-authored-by: Lukas Obermann <lukas.obermann@icloud.com>
2020-12-07 20:03:49 +01:00
LectorandLukas Obermann 0531ffb657 Update src/App/Utilities/MapToolExporter.ts
Co-authored-by: Lukas Obermann <lukas.obermann@icloud.com>
2020-12-07 19:47:43 +01:00
Lukas Obermann f9b4ab6ce4 refactor: added properties to weapon models 2020-12-07 17:55:41 +01:00
Lector 20242a117d misc improvements.
still doesnt work and i need some more advice in MapToolExporter.ts
2020-12-07 17:00:46 +01:00
LectorandLukas Obermann 0cf4c70b5c Update src/App/Actions/HerolistActions.ts
Co-authored-by: Lukas Obermann <lukas.obermann@icloud.com>
2020-12-02 23:54:34 +01:00
Lector a577f6b783 Code-Style teilweise angepasst 2020-12-02 22:56:35 +01:00
Lector d445a3a378 First prototype of the MapToolExporter.ts. There is only the content-xml exported right now. A lot of values need to be determined correctly. Right now there are a lot of dummy-values to check the XML-Output. 2020-11-29 01:23:07 +01:00
Lukas Obermann c58279cc95 fix: typo in effect of Bliksemblind spell (Dutch)
See #805.
2020-11-24 15:28:31 +01:00
Lukas Obermann d63a494305 build: fixed last version in changelog 2020-11-13 17:44:35 +01:00
Lukas Obermann 1df5ac8fee build: added missing prerelease changelog 2020-11-13 17:43:04 +01:00
Lukas Obermann 3edf16d8be build(release): 1.4.3-alpha.1 2020-11-13 17:06:25 +01:00
Lukas Obermann e63713687e fix(sheets): removed margin of hit zone sheet
Closes #788.
2020-11-13 17:06:01 +01:00
Lukas Obermann ad1c78ea58 Merge branch 'master' of https://github.com/elyukai/optolith-client 2020-11-08 17:35:46 +01:00
Lukas Obermann b4b477ec73 fix: Updated database to reflect changes from master 2020-11-08 17:35:41 +01:00
Lukas Obermann e11cbd6c52 Merge pull request #779 from elyukai/release/1.4.2
Release 1.4.2
2020-11-08 17:33:46 +01:00
Lukas Obermann b3f9010ef0 Merge 'master' into 'release/1.4.2' 2020-11-08 17:30:51 +01:00
Lukas Obermann 030a3270c3 version: Bumped to 1.4.2 2020-11-08 17:24:13 +01:00
Lukas Obermann 6b9d974db9 buid: Update database to reflect final changes 2020-11-08 17:21:01 +01:00
Lukas Obermann 8ce525e3ab Hotfix Italian version 2020-09-28 17:43:20 +02:00
Lukas Obermann 8ff055276e Merge pull request #721 from elyukai/release/1.4.0
Release 1.4.0
2020-09-28 16:45:03 +02:00
481 changed files with 29499 additions and 53726 deletions
+3
View File
@@ -1,3 +1,6 @@
src/App/Utilities/YAML/Schema/
*.js
*.gen.tsx
node_modules
/app
/deploy
+19 -7
View File
@@ -1,12 +1,15 @@
root: true
parser: "@typescript-eslint/parser"
plugins:
- "@typescript-eslint"
- eslint-plugin-react
- eslint-plugin-react-hooks
parser: "@typescript-eslint/parser"
- eslint-plugin-tsdoc
parserOptions:
ecmaVersion: 2020
ecmaVersion: latest
sourceType: module
project: ./tsconfig.json
project:
- ./tsconfig.json
ecmaFeatures:
jsx: true
env:
@@ -68,7 +71,12 @@ rules:
no-empty-pattern: 2
no-eq-null: 2
no-eval: 2
no-extend-native: 2
no-extend-native:
- 2
- exceptions:
- "Array"
- "Map"
- "Set"
no-extra-bind: 2
no-extra-label: 2
no-fallthrough: 2
@@ -154,7 +162,7 @@ rules:
- consistent
function-paren-newline:
- 2
- consistent
- multiline-arguments
jsx-quotes: 2
key-spacing: 2
keyword-spacing: 2
@@ -371,9 +379,10 @@ rules:
"@typescript-eslint/no-redeclare": 2
"@typescript-eslint/no-shadow": 2
"@typescript-eslint/no-unused-expressions": 2
"@typescript-eslint/no-unused-vars-experimental":
"@typescript-eslint/no-unused-vars":
- 2
- ignoredNamesRegex: "^_"
- argsIgnorePattern: "^_"
varsIgnorePattern: "^_"
"@typescript-eslint/no-use-before-define": 2
no-useless-constructor: 0
"@typescript-eslint/no-useless-constructor": 2
@@ -479,6 +488,9 @@ rules:
# React Hooks
react-hooks/rules-of-hooks: 2
react-hooks/exhaustive-deps: 2
# TSDoc
tsdoc/syntax: warn
settings:
react:
version: detect
+13
View File
@@ -0,0 +1,13 @@
# These are supported funding model platforms
github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2]
patreon: optolith # Replace with a single Patreon username
open_collective: # Replace with a single Open Collective username
ko_fi: # Replace with a single Ko-fi username
tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel
community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
liberapay: # Replace with a single Liberapay username
issuehunt: # Replace with a single IssueHunt username
otechie: # Replace with a single Otechie username
lfx_crowdfunding: # Replace with a single LFX Crowdfunding project-name e.g., cloud-foundry
custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2']
-33
View File
@@ -1,33 +0,0 @@
---
name: Bug report
about: Create a report to help us improve
title: ''
labels: Bug
assignees: ''
---
**Describe the bug**
A clear and concise description of what the bug is.
**To Reproduce**
Steps to reproduce the behavior:
1. Go to '...'
2. Click on '....'
3. Scroll down to '....'
4. See error
**Expected behavior**
A clear and concise description of what you expected to happen.
**Screenshots**
If applicable, add screenshots to help explain your problem.
**Environment (please complete the following information):**
- OS: [e.g. Windows 10]
- Version: [e.g. 1.1.0, 1.3.0-alpha.5]
**Additional context**
Add any other context about the problem here.
+73
View File
@@ -0,0 +1,73 @@
name: Bug report
description: Create a report to help improve Optolith
labels:
- Bug
body:
- type: checkboxes
id: agreements
attributes:
label: Please confirm the following
options:
- label: I checked the [current issues](https://github.com/elyukai/optolith-client/issues) for duplicate problems.
required: true
- type: textarea
id: description
attributes:
label: Describe the bug
description: A clear and concise description of what the bug is.
validations:
required: true
- type: textarea
id: to-reproduce
attributes:
label: To Reproduce
description: |
Steps to reproduce the behavior.
placeholder: |
1. Go to '...'
2. Click on '....'
3. Scroll down to '....'
4. See error
validations:
required: true
- type: textarea
id: expected-behavior
attributes:
label: Expected behavior
description: A clear and concise description of what you expected to happen.
validations:
required: true
- type: textarea
id: screenshots
attributes:
label: Screenshots
description: If applicable, add screenshots to help explain your problem.
validations:
required: false
- type: dropdown
id: operating-system
attributes:
label: Operating System
description: Which operating systems have you used? You may select more than one.
multiple: true
options:
- macOS
- Windows
- Linux
validations:
required: true
- type: input
id: version
attributes:
label: Version
description: Which Optolith version have you used?
placeholder: 1.1.0, 1.3.0-alpha.5, …
validations:
required: true
- type: textarea
id: additional-context
attributes:
label: Additional context
description: Add any other context about the problem here.
validations:
required: false
+15 -5
View File
@@ -7,14 +7,24 @@ assignees: ''
---
**Is your feature request related to a problem? Please describe.**
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
## Is your feature request related to a problem?
A clear and concise description of what the problem is. E.g. _I'm always frustrated when [...]_
## Describe the solution you'd like
**Describe the solution you'd like**
A clear and concise description of what you want to happen.
**Describe alternatives you've considered**
## Describe alternatives
A clear and concise description of any alternative solutions or features you've considered.
**Additional context**
## Additional context
> Add any other context or screenshots about the feature request here.
+34 -15
View File
@@ -7,21 +7,40 @@ assignees: ''
---
**Sources**
> List here what is included in this part of the book to implement. E.g., for special abilities, you need to list every source of entries from the book. Example (in German):
>
> - [ ] S. 133 (Berufsgeheimnisse)
> - [ ] S. 165-170 (Zauber- und Liturgiestile)
> - [ ] S. 183 (Stabzauber)
> - [ ] S. 195 (Zeremonialgegenstand Widderkeule)
## Sources
**Tables**
> Delete Univ and change locale if necessary. Add specific entries if they could not be resolved.
<!-- List here what is included in this part of the book to implement. E.g., for special abilities, you need to list every source of entries from the book. Use page ranges if entries span multiple pages. Example:
- [ ] Univ
- [ ] L10n de-DE
- [ ] S. 133 (Entry A)
- [ ] S. 133134 (Entry B)
**Code**
> List here what cannot be solved only using the tables. Example (in German):
>
> - [ ] Voraussetzungen Vorliebe I-II
Alternatively, provide an overview of the different sections in the book where one or more relevant entries occur. Example (in German):
- [ ] S. 133150 (Berufsgeheimnisse)
-->
- [ ] S. X (Entry/Section/Chapter Name)
## Special Notes
<!-- List here any special hints to implement the sources listed above. Example:
- All entries are already present, only add source references
- Pay attention to the layout of entry A, there is a gap that should not be in Optolith
Replace the dash below this comment if there are any notes. -->
## Special Implementations
<!-- List issues that track what cannot be solved only using the database. Example:
- #123
Replace the dash below this comment if there are any notes. -->
@@ -0,0 +1,23 @@
---
name: Publication ambiguity
about: An ambiguity in an official publication
title: ''
labels: 'Ulisses: Question'
assignees: ''
---
## Source(s)
Please complete the following information:
- Book: [e.g. Magic of Aventuria I]
- Printing: [e.g. 1st]
- Page(s): [e.g. 199]
- Area: [e.g. Profession Black Mage (Demirion Ophenos's Student), AP value]
## Describe the ambiguity
A clear and concise description of what the ambiguity is.
@@ -7,21 +7,33 @@ assignees: ''
---
**Source (please complete the following information):**
## Source (please complete the following information):
- Book: [e.g. Magic of Aventuria I]
- Printing: [e.g. 1st]
- Page(s): [e.g. 199]
- Area: [e.g. Profession Black Mage (Demirion Ophenos's Student), AP value]
**Describe the bug**
## Describe the bug
A clear and concise description of what the bug is.
**Expected text**
## Expected text
A clear and concise description of what the text *should* be instead.
**Optolith Version:**
## Optolith Version:
If applicable, the exact version of Optolith where you experience the bug, e.g. 1.2.0, 1.3.0-alpha.5.
**Additional context**
## Additional context
If needed, add any other context about the problem here.
-10
View File
@@ -1,10 +0,0 @@
---
name: Question
about: I have a question.
title: ''
labels: Question
assignees: ''
---
+51 -37
View File
@@ -3,7 +3,7 @@ name: Prerelease Builds
on:
push:
tags:
- v[0-9]+.[0-9]+.[0-9]+-[a-z]+.[0-9]+
- v[0-9]+.[0-9]+.[0-9]+-[a-z]+.[0-9]+
jobs:
build:
@@ -12,41 +12,55 @@ jobs:
strategy:
matrix:
os:
- ubuntu-latest
- windows-latest
- macOS-latest
- ubuntu-latest
- windows-latest
- macOS-latest
include:
- os: ubuntu-latest
osName: Linux
- os: windows-latest
osName: Windows
- os: macOS-latest
osName: macOS
- os: ubuntu-latest
osName: Linux
- os: windows-latest
osName: Windows
- os: macOS-latest
osName: macOS
steps:
- uses: actions/checkout@v2
with:
token: ${{ secrets.ACCESS_TOKEN }}
submodules: true
- name: Use Node.js 12.x
uses: actions/setup-node@v1
with:
node-version: 12.x
- name: Install Node.js dependencies
run: npm ci
- name: Build ReasonML files
run: npm run re:build
- name: Build TypeScript files
run: npm run js:build
- name: Build Sass files
run: npm run css:build
- name: Build
run: node ./deploy/build.js prerelease
env:
UPDATE_URL: ${{ secrets.UPDATE_URL }}
- name: Deploy
run: node ./deploy/deploy.js prerelease
env:
HOST: ${{ secrets.HOST }}
USERNAME: ${{ secrets.USERNAME }}
PASSWORD: ${{ secrets.PASSWORD }}
ROOT: ${{ secrets.ROOT }}
- uses: actions/checkout@v2
with:
token: ${{ secrets.ACCESS_TOKEN }}
submodules: true
- name: Use Node.js 18.x
uses: actions/setup-node@v1
with:
node-version: 18.x
- name: Install Node.js dependencies
run: npm ci
- name: Compile JavaScript files
run: npm run js:build
- name: Compile Sass files
run: npm run css:build
- name: Build macOS application
if: runner.os == 'macOS'
run: node ./deploy/build.mjs prerelease
env:
APPLEID: ${{ secrets.APPLEID }}
APPLEIDPASS: ${{ secrets.APPLEIDPASS }}
TEAMID: ${{ secrets.TEAMID }}
CSC_LINK: ${{ secrets.CSC_LINK }}
CSC_KEY_PASSWORD: ${{ secrets.CSC_KEY_PASSWORD }}
UPDATE_URL: ${{ secrets.UPDATE_URL }}
- name: Build Linux application
if: runner.os == 'Linux'
run: node ./deploy/build.mjs prerelease
env:
UPDATE_URL: ${{ secrets.UPDATE_URL }}
- name: Build Windows application
if: runner.os == 'Windows'
run: node ./deploy/build.mjs prerelease
env:
UPDATE_URL: ${{ secrets.UPDATE_URL }}
- name: Deploy
run: node ./deploy/deploy.mjs prerelease
env:
HOST: ${{ secrets.HOST }}
USERNAME: ${{ secrets.USERNAME }}
PASSWORD: ${{ secrets.PASSWORD }}
ROOT: ${{ secrets.ROOT }}
+51 -37
View File
@@ -3,7 +3,7 @@ name: Stable Builds
on:
push:
tags:
- v[0-9]+.[0-9]+.[0-9]+
- v[0-9]+.[0-9]+.[0-9]+
jobs:
build:
@@ -12,41 +12,55 @@ jobs:
strategy:
matrix:
os:
- ubuntu-latest
- windows-latest
- macOS-latest
- ubuntu-latest
- windows-latest
- macOS-latest
include:
- os: ubuntu-latest
osName: Linux
- os: windows-latest
osName: Windows
- os: macOS-latest
osName: macOS
- os: ubuntu-latest
osName: Linux
- os: windows-latest
osName: Windows
- os: macOS-latest
osName: macOS
steps:
- uses: actions/checkout@v2
with:
token: ${{ secrets.ACCESS_TOKEN }}
submodules: true
- name: Use Node.js 12.x
uses: actions/setup-node@v1
with:
node-version: 12.x
- name: Install Node.js dependencies
run: npm ci
- name: Build ReasonML files
run: npm run re:build
- name: Build TypeScript files
run: npm run js:build
- name: Build Sass files
run: npm run css:build
- name: Build
run: node ./deploy/build.js stable
env:
UPDATE_URL: ${{ secrets.UPDATE_URL }}
- name: Deploy
run: node ./deploy/deploy.js stable
env:
HOST: ${{ secrets.HOST }}
USERNAME: ${{ secrets.USERNAME }}
PASSWORD: ${{ secrets.PASSWORD }}
ROOT: ${{ secrets.ROOT }}
- uses: actions/checkout@v2
with:
token: ${{ secrets.ACCESS_TOKEN }}
submodules: true
- name: Use Node.js 18.x
uses: actions/setup-node@v1
with:
node-version: 18.x
- name: Install Node.js dependencies
run: npm ci
- name: Compile JavaScript files
run: npm run js:build
- name: Compile Sass files
run: npm run css:build
- name: Build macOS application
if: runner.os == 'macOS'
run: node ./deploy/build.mjs stable
env:
APPLEID: ${{ secrets.APPLEID }}
APPLEIDPASS: ${{ secrets.APPLEIDPASS }}
TEAMID: ${{ secrets.TEAMID }}
CSC_LINK: ${{ secrets.CSC_LINK }}
CSC_KEY_PASSWORD: ${{ secrets.CSC_KEY_PASSWORD }}
UPDATE_URL: ${{ secrets.UPDATE_URL }}
- name: Build Linux application
if: runner.os == 'Linux'
run: node ./deploy/build.mjs stable
env:
UPDATE_URL: ${{ secrets.UPDATE_URL }}
- name: Build Windows application
if: runner.os == 'Windows'
run: node ./deploy/build.mjs stable
env:
UPDATE_URL: ${{ secrets.UPDATE_URL }}
- name: Deploy
run: node ./deploy/deploy.mjs stable
env:
HOST: ${{ secrets.HOST }}
USERNAME: ${{ secrets.USERNAME }}
PASSWORD: ${{ secrets.PASSWORD }}
ROOT: ${{ secrets.ROOT }}
+30 -32
View File
@@ -3,12 +3,12 @@ name: Integration
on:
push:
branches:
- master
- develop
- master
- develop
pull_request:
branches:
- master
- develop
- master
- develop
jobs:
test:
@@ -16,36 +16,34 @@ jobs:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
with:
token: ${{ secrets.ACCESS_TOKEN }}
submodules: true
- name: Use Node.js 14.x
uses: actions/setup-node@v1
with:
node-version: 14.x
- name: Install Node.js dependencies
run: npm ci
- run: npm run re:build
- run: npm run ts:build
- run: npm test
env:
CI: true
- uses: actions/checkout@v2
with:
token: ${{ secrets.ACCESS_TOKEN }}
submodules: true
- name: Use Node.js 18.x
uses: actions/setup-node@v1
with:
node-version: 18.x
- name: Install Node.js dependencies
run: npm ci
- name: Compile TypeScript files
run: npm run ts:build
- name: Run tests
run: npm test
lint:
name: Lint
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
with:
token: ${{ secrets.ACCESS_TOKEN }}
submodules: true
- name: Use Node.js 12.x
uses: actions/setup-node@v1
with:
node-version: 12.x
- name: Install Node.js dependencies
run: npm ci
- run: npm run lint
env:
CI: true
- uses: actions/checkout@v2
with:
token: ${{ secrets.ACCESS_TOKEN }}
submodules: true
- name: Use Node.js 18.x
uses: actions/setup-node@v1
with:
node-version: 18.x
- name: Install Node.js dependencies
run: npm ci
- name: Run linter
run: npm run lint
+1 -1
View File
@@ -3,7 +3,7 @@
"configurations": [
{
"name": "Electron: Debug Main",
"type": "node",
"type": "pwa-node",
"request": "launch",
"cwd": "${workspaceFolder}",
"runtimeExecutable": "${workspaceFolder}/node_modules/.bin/electron",
+1 -1
View File
@@ -1,5 +1,5 @@
{
"typescript.tsdk": "node_modules\\typescript\\lib",
"typescript.tsdk": "node_modules/typescript/lib",
"typescript.preferences.quoteStyle": "double",
"javascript.preferences.quoteStyle": "double",
"files.exclude": {
+47 -53
View File
@@ -8,64 +8,19 @@
"type": "shell",
"tasks": [
{
"label": "build",
"command": "npm run build",
"problemMatcher": [
"$tsc"
]
},
{
"label": "buildTest",
"command": "npm run buildTest"
},
{
"label": "buildMac",
"command": "npm run buildMac"
},
{
"label": "buildMacTest",
"command": "npm run buildMacTest"
},
{
"label": "watch",
"command": "npm run watch"
},
{
"label": "bundle",
"command": "npm run bundle",
"problemMatcher": [
"$tsc"
]
},
{
"label": "run",
"label": "start",
"command": "npm start"
},
{
"label": "bundle_l10ns",
"command": "npm run bundle_l10ns"
},
{
"label": "bundle_data",
"command": "npm run bundle_data"
},
{
"label": "bundle_css",
"command": "npm run bundle_css"
},
{
"type": "typescript",
"tsconfig": "tsconfig.json",
"isBackground": true,
"problemMatcher": [
"$tsc"
],
"label": "jest",
"command": "npm test",
"group": {
"kind": "build",
"kind": "test",
"isDefault": true
}
},
{
"label": "tsc watch",
"type": "typescript",
"tsconfig": "tsconfig.json",
"option": "watch",
@@ -73,11 +28,50 @@
"problemMatcher": [
"$tsc-watch"
],
"group": "build"
"group": "build",
"presentation": {
"group": "watch"
}
},
{
"type": "npm",
"script": "buildWin",
"label": "webpack watch",
"command": "npm run js:watch",
"isBackground": true,
"group": "build",
"presentation": {
"group": "watch"
}
},
{
"label": "sass watch",
"command": "npm run css:watch",
"isBackground": true,
"group": "build",
"presentation": {
"group": "watch"
}
},
{
"label": "watch",
"dependsOn": ["tsc watch", "webpack watch", "sass watch"],
"group": {
"kind": "build",
"isDefault": true
}
},
{
"label": "create prerelease",
"command": "npm run release:pre",
"problemMatcher": []
},
{
"label": "create release",
"command": "npm run release:main",
"problemMatcher": []
},
{
"label": "git push --follow-tags",
"command": "git push --follow-tags",
"problemMatcher": []
}
]
+2 -1
View File
@@ -1 +1,2 @@
Lukas Obermann <lukas.obermann@outlook.de>
Lukas Obermann <lukas.obermann@icloud.com>
Philipp Borucki <p.borucki@icloud.com>
+284
View File
@@ -2,6 +2,290 @@
All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines.
### [1.5.2](https://github.com/elyukai/optolith-client/compare/v1.5.2-alpha.4...v1.5.2) (2025-01-02)
### Bug Fixes
* throws during startup due to changed devtools identifiers ([7f5f944](https://github.com/elyukai/optolith-client/commit/7f5f94491e1432d66add1315889075fb5369f700)), closes [#1634](https://github.com/elyukai/optolith-client/issues/1634)
### [1.5.2-alpha.4](https://github.com/elyukai/optolith-client/compare/v1.5.2-alpha.3...v1.5.2-alpha.4) (2022-07-22)
### Bug Fixes
* improvement cost handling for some traditions ([c52fc26](https://github.com/elyukai/optolith-client/commit/c52fc26a1b1d6cccc1cfec758da8886be966233b))
* show improvement cost in tabular list ([c162931](https://github.com/elyukai/optolith-client/commit/c162931e74bce5f4fd1e42de6ebc92c71d15e81a))
### [1.5.2-alpha.3](https://github.com/elyukai/optolith-client/compare/v1.5.2-alpha.2...v1.5.2-alpha.3) (2022-07-12)
### [1.5.2-alpha.2](https://github.com/elyukai/optolith-client/compare/v1.5.2-alpha.1...v1.5.2-alpha.2) (2022-07-11)
### Features
* enable auto-update for macOS ([7c6e377](https://github.com/elyukai/optolith-client/commit/7c6e3776921fdc4f13c42ea5c6a4bf5d316856e1))
### [1.5.2-alpha.1](https://github.com/elyukai/optolith-client/compare/v1.5.1-alpha.2...v1.5.2-alpha.1) (2022-04-29)
### Features
* add krallenkettenzauber as placeholder ([c987847](https://github.com/elyukai/optolith-client/commit/c987847c9b192a0528df52da33f55adf90164eaf))
## [1.5.1](https://github.com/elyukai/optolith-client/compare/v1.5.0...v1.5.1) (2022-03-20)
### Enhancements
* **MapTool:** add links to extension next to export button ([07d336d](https://github.com/elyukai/optolith-client/commit/07d336dbb3ceba9818185a9b8c0cdffa6283afb3))
### Bug Fixes
* **MapTool:** without an avatar no export was possible ([80fdffb](https://github.com/elyukai/optolith-client/commit/80fdffb373fccc467383cf6d98c1f07a92168ee4)), closes [#1348](https://github.com/elyukai/optolith-client/issues/1348)
* **MapTool:** changed export format for MapTool version 1.11.4 ([9e9a113](https://github.com/elyukai/optolith-client/commit/9e9a1139d3821bb5a36fbaa973236319026d996a))
* **MapTool:** Add missing Italian translations for export ([3f87dca](https://github.com/elyukai/optolith-client/commit/3f87dca910ce5229c7fd5378ba5f4177cbf431ac)), closes [#1350](https://github.com/elyukai/optolith-client/issues/1350)
* Advantage *Inspire Confidence* could be bought with an active *Incompetent* in a social skill ([8102bb1](https://github.com/elyukai/optolith-client/commit/8102bb1a9adac4849499380bf3bc2270aa7dd2c6)), closes [#1351](https://github.com/elyukai/optolith-client/issues/1351)
* Strikethrough prerequisites were rendered with surrounding tildes instead ([2c9332c](https://github.com/elyukai/optolith-client/commit/2c9332c37f9b2d8d9e0359a9e4dadf0a40beeba1)), closes [#1349](https://github.com/elyukai/optolith-client/issues/1349)
### [1.5.1-alpha.2](https://github.com/elyukai/optolith-client/compare/v1.5.1-alpha.1...v1.5.1-alpha.2) (2022-02-22)
### Features
* **maptool:** add project links ([07d336d](https://github.com/elyukai/optolith-client/commit/07d336dbb3ceba9818185a9b8c0cdffa6283afb3))
### Bug Fixes
* advantage Inspire Confidence could be bought with social Incompetence ([8102bb1](https://github.com/elyukai/optolith-client/commit/8102bb1a9adac4849499380bf3bc2270aa7dd2c6)), closes [#1351](https://github.com/elyukai/optolith-client/issues/1351)
### [1.5.1-alpha.1](https://github.com/elyukai/optolith-client/compare/v1.5.1-alpha.0...v1.5.1-alpha.1) (2022-02-21)
### Bug Fixes
* **maptool:** no export possible without an avatar ([80fdffb](https://github.com/elyukai/optolith-client/commit/80fdffb373fccc467383cf6d98c1f07a92168ee4)), closes [#1348](https://github.com/elyukai/optolith-client/issues/1348)
### [1.5.1-alpha.0](https://github.com/elyukai/optolith-client/compare/v1.5.0-alpha.9...v1.5.1-alpha.0) (2022-02-18)
### Bug Fixes
* add missing Italian translations for MapTool export ([3f87dca](https://github.com/elyukai/optolith-client/commit/3f87dca910ce5229c7fd5378ba5f4177cbf431ac)), closes [#1350](https://github.com/elyukai/optolith-client/issues/1350)
* add more action types that should be ignored for undo history ([d2eca82](https://github.com/elyukai/optolith-client/commit/d2eca82ea5fd1d65f234363d2700c80f37afe653))
* **maptool:** format change for 1.11.4 ([9e9a113](https://github.com/elyukai/optolith-client/commit/9e9a1139d3821bb5a36fbaa973236319026d996a))
* markdown parser ignores strikethrough ([2c9332c](https://github.com/elyukai/optolith-client/commit/2c9332c37f9b2d8d9e0359a9e4dadf0a40beeba1)), closes [#1349](https://github.com/elyukai/optolith-client/issues/1349)
## [1.5.0](https://github.com/elyukai/optolith-client/compare/v1.4.2...v1.5.0) (2022-02-09)
### Features
* MapTool export ([87cec15](https://github.com/elyukai/optolith-client/commit/87cec15ba9751c329ee39719dc654895b9f4f193))
* Portuguese translations ([d8c9f52](https://github.com/elyukai/optolith-client/commit/d8c9f52542120f9e5fa569728b3f11cb79102365), [#676](https://github.com/elyukai/optolith-client/issues/676))
* Native Apple M1 support ([94e751f](https://github.com/elyukai/optolith-client/commit/94e751fda169c4de90cdb82346d3d864cf697300))
### Enhancements
* **English:** Kilogram input hint for weight in item dialog ([bd9fc1b](https://github.com/elyukai/optolith-client/commit/bd9fc1badc8a408495bd7c1594338b1a5fe6df11))
* Security ([723e910](https://github.com/elyukai/optolith-client/commit/723e9106ebb178db6a7cccec2a022b3edaed5b98) and others)
### Bug Fixes
* **German/English:** Hit Zone Armor character sheet had left margin ([e637136](https://github.com/elyukai/optolith-client/commit/e63713687eff9b825a79d159fb8b44dc26f64ffe), [#788](https://github.com/elyukai/optolith-client/issues/788))
* Additional LE set a minimum required value of STR instead of CON ([390dcb6](https://github.com/elyukai/optolith-client/commit/390dcb616aaa68e5b103bb49dd75d1529c4e7e3a), [#787](https://github.com/elyukai/optolith-client/issues/787))
* Two-handed (2H) and improvised (i) weapon indicators were missing on character sheet ([3f9fae3](https://github.com/elyukai/optolith-client/commit/3f9fae30a2291b8e53486a74dae8cc1533741b94), [#797](https://github.com/elyukai/optolith-client/issues/797))
* Brawling weapons had no parry on character sheet ([a02700e](https://github.com/elyukai/optolith-client/commit/a02700eeccbd95a75f778d4d9e78ad7a2447dad8), [#1229](https://github.com/elyukai/optolith-client/issues/1229))
* An entry that depends on a single activation of another entry disables removing of all activations of that entry if multiple activations are present ([092343f](https://github.com/elyukai/optolith-client/commit/092343f45da566a45b13b275899a458fed720a76), [#1097](https://github.com/elyukai/optolith-client/issues/1097))
* Entries affecting spells to not be unfamiliar could be removed if Spell Enhancements were bought ([28f260a](https://github.com/elyukai/optolith-client/commit/28f260a2c4a96adb0d36585a478676f95c304414), [#827](https://github.com/elyukai/optolith-client/issues/827))
* The equipment info area may have crashed ([ae2fbad](https://github.com/elyukai/optolith-client/commit/ae2fbad1c738354dd468c1b36b06eda729a879e5))
* Professions that granted higher Combat Technique Ratings than what the selected Experience Level allowed were not filtered ([c8094f5](https://github.com/elyukai/optolith-client/commit/c8094f5ef15f62f69088386b9fc6c64f7d8bfd02), [#1244](https://github.com/elyukai/optolith-client/issues/1244))
* **German:** Special ability Kernschuss had misplaced minus sign in penalty ([ccd7dec](https://github.com/elyukai/optolith-client/commit/ccd7decc8314ca476b6a15932ed9b3fb1c22a1f7), [#1080](https://github.com/elyukai/optolith-client/issues/1080))
* **German:** Wrong page number in description of Albernisches Entermesser and Harbener Säbel ([ccd7dec](https://github.com/elyukai/optolith-client/commit/ccd7decc8314ca476b6a15932ed9b3fb1c22a1f7), [#1081](https://github.com/elyukai/optolith-client/issues/1081))
* **German:** Spell Zauberschnurren had mixed-up QL descriptions in spell description ([ccd7dec](https://github.com/elyukai/optolith-client/commit/ccd7decc8314ca476b6a15932ed9b3fb1c22a1f7), [#846](https://github.com/elyukai/optolith-client/issues/846) [#1122](https://github.com/elyukai/optolith-client/issues/1122))
* **German:** Schlachtermesser and Fleischerbeil were not marked as improvised ([ccd7dec](https://github.com/elyukai/optolith-client/commit/ccd7decc8314ca476b6a15932ed9b3fb1c22a1f7), [#808](https://github.com/elyukai/optolith-client/issues/808))
* INI/MOV modifiers on armor were handled as penalties ([eb5a068](https://github.com/elyukai/optolith-client/commit/eb5a06884db1894e1a9f2b4b040b114cb4dc85cb), [#1091](https://github.com/elyukai/optolith-client/issues/1091))
* Language specializations did not always cost 1 AP and could not be activated multiple times for a single language ([0a59d9e](https://github.com/elyukai/optolith-client/commit/0a59d9e5e571e87525b18d0b25035e73f7cd87bf), [#1082](https://github.com/elyukai/optolith-client/issues/1082))
* Portraits with transparency had a black background ([cc5ecd6](https://github.com/elyukai/optolith-client/commit/cc5ecd6f098ae6c080eeb3b306887727a99c1220), [#800](https://github.com/elyukai/optolith-client/issues/800))
* **German:** Profession Garether Krieger was missing Swords 12 and Orienting should be 3 instead of 2 ([397abe2](https://github.com/elyukai/optolith-client/commit/397abe2b4a69582dc49422add1700807272c32d6), [#792](https://github.com/elyukai/optolith-client/issues/792))
* Bornlander cultural package had Prepare Food instead of Leatherworking ([397abe2](https://github.com/elyukai/optolith-client/commit/397abe2b4a69582dc49422add1700807272c32d6), [#824](https://github.com/elyukai/optolith-client/issues/824))
* **Italian:** Some typos in translation of items, languages and scripts ([397abe2](https://github.com/elyukai/optolith-client/commit/397abe2b4a69582dc49422add1700807272c32d6), [#832](https://github.com/elyukai/optolith-client/issues/832))
* **Italian:** Doubled level range in title of Iron Will special ability ([397abe2](https://github.com/elyukai/optolith-client/commit/397abe2b4a69582dc49422add1700807272c32d6), [#850](https://github.com/elyukai/optolith-client/issues/850))
* **Italian:** Spells and liturgies displayed different casing and punctuation ([397abe2](https://github.com/elyukai/optolith-client/commit/397abe2b4a69582dc49422add1700807272c32d6), [#851](https://github.com/elyukai/optolith-client/issues/851))
* **German/English:** Spell Wind Shaping had the wrong traditions and wrong spell enhancements order ([397abe2](https://github.com/elyukai/optolith-client/commit/397abe2b4a69582dc49422add1700807272c32d6), [#1139](https://github.com/elyukai/optolith-client/issues/1139))
* **German:** Typo in measurements in description of spell Invocatio Minima ([397abe2](https://github.com/elyukai/optolith-client/commit/397abe2b4a69582dc49422add1700807272c32d6), [#1224](https://github.com/elyukai/optolith-client/issues/1224))
* Primary attribute changes for items were not applied in edit window, only on character sheet ([6c63ab1](https://github.com/elyukai/optolith-client/commit/6c63ab1b5051882ace71f15740c3a69fff4a267f), [#798](https://github.com/elyukai/optolith-client/issues/798))
* Professions with due to EL impossible attribute values could be selected ([fdde329](https://github.com/elyukai/optolith-client/commit/fdde329de591319df3f6da11404dd7523d800c3e), [#1109](https://github.com/elyukai/optolith-client/issues/1109))
* Summoning spellworks from professions did not register dependencies from prerequisites ([c1b2e26](https://github.com/elyukai/optolith-client/commit/c1b2e267cb3f02d2d18812415c39c58739ad99ec), [#1240](https://github.com/elyukai/optolith-client/issues/1240))
* **Dutch:** Typo in effect of Bliksemblind spell ([c58279c](https://github.com/elyukai/optolith-client/commit/c58279cc95aba5506824510d83aa6ffbc410107a), [#805](https://github.com/elyukai/optolith-client/issues/805))
* Weight of Elves was not generated correctly ([3b05e69](https://github.com/elyukai/optolith-client/commit/3b05e69e27f7faa1634b50eb134000fe1a2c3a21), [#813](https://github.com/elyukai/optolith-client/issues/813))
* **English:** Gaze into the Essence spell was misspelled as Gase into the Essence ([42891f0](https://github.com/elyukai/optolith-client/commit/42891f070c35b74c49bb2c9e16152789cc8cc7df), [#1180](https://github.com/elyukai/optolith-client/issues/1180))
* **German:** Typo in Physiostabilis name ([e40f995](https://github.com/elyukai/optolith-client/commit/e40f995e341dc7fbcb1d9688c4b82a9187c180de), [#1234](https://github.com/elyukai/optolith-client/issues/1234))
* **German/English:** Tradition (Druid) referenced a non-existent disadvantage instead of advantage Iron-Attuned Aura ([f8114c2](https://github.com/elyukai/optolith-client/commit/f8114c2f4318967631b71ea3614bf647e7826fa2), [#1237](https://github.com/elyukai/optolith-client/issues/1237))
* **German/English:** Hook Dagger was not marked as a parrying weapon ([ed74170](https://github.com/elyukai/optolith-client/commit/ed74170865b2caad8008a345db5c1705e0376bc5), [#1232](https://github.com/elyukai/optolith-client/issues/1232))
* **English:** Special ability Deadly Thrust had special ability Crossblock's rules text ([ec9bd71](https://github.com/elyukai/optolith-client/commit/ec9bd71e101abcaf61e84e3da340890e161896ea), [#841](https://github.com/elyukai/optolith-client/issues/841))
* **German:** Weapon advantage of Kriegsbogen has wrong DP bonus ([8297455](https://github.com/elyukai/optolith-client/commit/8297455ddbd360035428a4ed244a684e6f1c7e7a), [#1074](https://github.com/elyukai/optolith-client/issues/1074))
* **English:** Missing translations for spell enhancements of Heptagramma ([a5df7c8](https://github.com/elyukai/optolith-client/commit/a5df7c863cded391609950fa5b8bf8474ffe2dfd), [#848](https://github.com/elyukai/optolith-client/issues/848))
* **German:** Wrong Animal Lore value in profession Spider Witch ([#1250](https://github.com/elyukai/optolith-client/issues/1250))
* Attributes on minimum value (8) did not allow a combat technique rating over 6 if the attribute was the combat technique's primary attribute ([47e66d6](https://github.com/elyukai/optolith-client/commit/47e66d65467999e2661eaac30a97b5a1ebfece94), [#835](https://github.com/elyukai/optolith-client/issues/835))
* **German/English:** Profession Sharisad got Earthencraft bonus instead of Clothworking bonus ([cd16e53](https://github.com/elyukai/optolith-client/commit/cd16e5314a7f579a5f5f916bb204a15df3220bda), [#1341](https://github.com/elyukai/optolith-client/issues/1341))
* **English:** The Hit Zone Armor tab in Belongings was not available, even with Aventuria Armory activated ([383a9c1](https://github.com/elyukai/optolith-client/commit/383a9c166c6d8c5d713f4852f40999c5d8c00efc), [#1328](https://github.com/elyukai/optolith-client/issues/1328))
* Too large PDF output when using a sheet background ([9cb2658](https://github.com/elyukai/optolith-client/commit/9cb26586f3a5026d06f41801d4bbf714631d06a4), [#1094](https://github.com/elyukai/optolith-client/issues/1094))
* **English:** Weight column in inventory showed wrong weight ([6ba99f2](https://github.com/elyukai/optolith-client/commit/6ba99f2f4610e8a26d1703d978738a907f26bd92), [#1329](https://github.com/elyukai/optolith-client/issues/1329))
* Auto-updater did not work in AppImage ([a24ff80](https://github.com/elyukai/optolith-client/commit/a24ff8082a5556fc07af05f113bacfd9c84428a4), [#753](https://github.com/elyukai/optolith-client/issues/753))
* **German:** Special ability Weg der Schreiberin could not be activated ([83b534d](https://github.com/elyukai/optolith-client/commit/83b534d3f9fcd5e63ef7cf482d9dd26f06b5a1a2), [#1233](https://github.com/elyukai/optolith-client/issues/1233))
* Some primary attribute prerequisites were not enforced ([ac0cdc3](https://github.com/elyukai/optolith-client/commit/ac0cdc377800a1eb380993dbb7914fa88b8f254e), [#1260](https://github.com/elyukai/optolith-client/issues/1260))
* Range brackets input fields influenced other bracket fields ([0ab65e8](https://github.com/elyukai/optolith-client/commit/0ab65e869c26536127b386753db110f2e26b33af), [#1251](https://github.com/elyukai/optolith-client/issues/1251))
* Requiring only one matching languages and script required all of them instead ([4dabbdb](https://github.com/elyukai/optolith-client/commit/4dabbdbcd23c1ffeff18a8b1f9497a4a8315aa6a), [#1343](https://github.com/elyukai/optolith-client/issues/1343))
* Scripts did not require an active matching language ([1ed0c64](https://github.com/elyukai/optolith-client/commit/1ed0c64b0dd9873593169bd9994082d49299fa3e), [#1344](https://github.com/elyukai/optolith-client/issues/1344))
* Some item properties were not saved ([f2e6138](https://github.com/elyukai/optolith-client/commit/f2e61386abe444aa76f0211469d50c30fde99a0c), [#1252](https://github.com/elyukai/optolith-client/issues/1252))
* **German:** Typo in Tarnele ([8b5eede](https://github.com/elyukai/optolith-client/commit/8b5eedeb372622761480f2511935e8b74bdfcdcd), [#1330](https://github.com/elyukai/optolith-client/issues/1330))
* Unfamiliar spell selection in profession was optional ([3574d1b](https://github.com/elyukai/optolith-client/commit/3574d1ba46725d04a83286cd1055c080fe1de95f), [#1315](https://github.com/elyukai/optolith-client/issues/1315))
* **English:** special ability Knuckle Storm's description used Damage Points instead of Brawling Points ([06b57c9](https://github.com/elyukai/optolith-client/commit/06b57c9d15e1ef6f35da69ea46512bb790119b0a), [#1340](https://github.com/elyukai/optolith-client/issues/1340))
* Combat techniques did not influence the minimum of their primary attributes ([1ce2db9](https://github.com/elyukai/optolith-client/commit/1ce2db9cfbb06b1ca8a549957b8225af71de9185), [#836](https://github.com/elyukai/optolith-client/issues/836))
* Saving a hero cleared the undo history of multiple characters ([923b760](https://github.com/elyukai/optolith-client/commit/923b7605fee4c4288dc743e962728308f7254ca9), [#811](https://github.com/elyukai/optolith-client/issues/811))
* **German:** Spells converted by Imitationszauberei could not use spell enhancements ([e558c1d](https://github.com/elyukai/optolith-client/commit/e558c1d80d1c668f926e4a56049029f989081a45), [#828](https://github.com/elyukai/optolith-client/issues/828))
* Widened rows in second column of skills table on character sheet ([41ee35b](https://github.com/elyukai/optolith-client/commit/41ee35ba76af42ad837daa6c45a940406b0c5daa), [#1342](https://github.com/elyukai/optolith-client/issues/1342))
* **German:** Special ability Blattschuss displayed the wrong combat special ability type ([7e31136](https://github.com/elyukai/optolith-client/commit/7e31136083ae62e26c5017f3af2376938bd264c3), [#1331](https://github.com/elyukai/optolith-client/issues/1331))
* **German:** Typo in name of Tradition (Illusionist) ([bdb3eb7](https://github.com/elyukai/optolith-client/commit/bdb3eb7804f8464689172f39d5bd8c229140c891), [#1239](https://github.com/elyukai/optolith-client/issues/1239))
## [1.5.0-alpha.9](https://github.com/elyukai/optolith-client/compare/v1.5.0-alpha.8...v1.5.0-alpha.9) (2022-02-06)
### Bug Fixes
* active animist powers occurred multiple times in addition list ([06eac93](https://github.com/elyukai/optolith-client/commit/06eac932217377b78901a08a1133789d95e8920e)), closes [#794](https://github.com/elyukai/optolith-client/issues/794)
* typo in German name of Tradition (Illusionist) ([bdb3eb7](https://github.com/elyukai/optolith-client/commit/bdb3eb7804f8464689172f39d5bd8c229140c891)), closes [#1239](https://github.com/elyukai/optolith-client/issues/1239)
## [1.5.0-alpha.8](https://github.com/elyukai/optolith-client/compare/v1.5.0-alpha.7...v1.5.0-alpha.8) (2022-02-04)
### Features
* **logs:** add small logging utility function ([8b18b26](https://github.com/elyukai/optolith-client/commit/8b18b26361c1526c93b4ca8906e961d56f85ed49))
### Bug Fixes
* attribute minimum must include combat techniques ([1ce2db9](https://github.com/elyukai/optolith-client/commit/1ce2db9cfbb06b1ca8a549957b8225af71de9185)), closes [#836](https://github.com/elyukai/optolith-client/issues/836)
* **datatypes:** find might return an existing value that is undefined ([232795d](https://github.com/elyukai/optolith-client/commit/232795d12984e1070223bffd60b79367d3560752))
* **prerelease:** cult of Levtan not registered as blessed tradition ([1f09060](https://github.com/elyukai/optolith-client/commit/1f090605a4c5404ed1550a0b4048a72dffbb0104))
* saving a hero clears the undo history of multiple characters ([923b760](https://github.com/elyukai/optolith-client/commit/923b7605fee4c4288dc743e962728308f7254ca9)), closes [#811](https://github.com/elyukai/optolith-client/issues/811)
* spells converted by Imitationszauberei cannot use spell enhancements ([e558c1d](https://github.com/elyukai/optolith-client/commit/e558c1d80d1c668f926e4a56049029f989081a45)), closes [#828](https://github.com/elyukai/optolith-client/issues/828)
* widened rows in seconds column of skills table on character sheet ([41ee35b](https://github.com/elyukai/optolith-client/commit/41ee35ba76af42ad837daa6c45a940406b0c5daa)), closes [#1342](https://github.com/elyukai/optolith-client/issues/1342)
* wrong combat type of special ability Blattschuss ([7e31136](https://github.com/elyukai/optolith-client/commit/7e31136083ae62e26c5017f3af2376938bd264c3)), closes [#1331](https://github.com/elyukai/optolith-client/issues/1331)
## [1.5.0-alpha.7](https://github.com/elyukai/optolith-client/compare/v1.5.0-alpha.6...v1.5.0-alpha.7) (2022-02-03)
### Bug Fixes
* auto-updater not working in AppImage ([a24ff80](https://github.com/elyukai/optolith-client/commit/a24ff8082a5556fc07af05f113bacfd9c84428a4)), closes [#753](https://github.com/elyukai/optolith-client/issues/753)
* cannot activate special ability Weg der Schreiberin ([83b534d](https://github.com/elyukai/optolith-client/commit/83b534d3f9fcd5e63ef7cf482d9dd26f06b5a1a2)), closes [#1233](https://github.com/elyukai/optolith-client/issues/1233)
* primary attribute prerequisites may not have been added as dependencies ([ac0cdc3](https://github.com/elyukai/optolith-client/commit/ac0cdc377800a1eb380993dbb7914fa88b8f254e)), closes [#1260](https://github.com/elyukai/optolith-client/issues/1260)
* range brackets input influences other bracket fields ([0ab65e8](https://github.com/elyukai/optolith-client/commit/0ab65e869c26536127b386753db110f2e26b33af)), closes [#1251](https://github.com/elyukai/optolith-client/issues/1251)
* requiring one matching languages and script requires all of them ([4dabbdb](https://github.com/elyukai/optolith-client/commit/4dabbdbcd23c1ffeff18a8b1f9497a4a8315aa6a)), closes [#1343](https://github.com/elyukai/optolith-client/issues/1343)
* scripts do not require an active matching language ([1ed0c64](https://github.com/elyukai/optolith-client/commit/1ed0c64b0dd9873593169bd9994082d49299fa3e)), closes [#1344](https://github.com/elyukai/optolith-client/issues/1344)
* some item properties were not saved ([f2e6138](https://github.com/elyukai/optolith-client/commit/f2e61386abe444aa76f0211469d50c30fde99a0c)), closes [#1252](https://github.com/elyukai/optolith-client/issues/1252)
* typo in German name of Tarnele ([8b5eede](https://github.com/elyukai/optolith-client/commit/8b5eedeb372622761480f2511935e8b74bdfcdcd)), closes [#1330](https://github.com/elyukai/optolith-client/issues/1330)
* unfamiliar spell selection in profession was optional ([3574d1b](https://github.com/elyukai/optolith-client/commit/3574d1ba46725d04a83286cd1055c080fe1de95f)), closes [#1315](https://github.com/elyukai/optolith-client/issues/1315)
* use Brawling Points in special ability Knuckle Storm description ([06b57c9](https://github.com/elyukai/optolith-client/commit/06b57c9d15e1ef6f35da69ea46512bb790119b0a)), closes [#1340](https://github.com/elyukai/optolith-client/issues/1340)
## [1.5.0-alpha.6](https://github.com/elyukai/optolith-client/compare/v1.5.0-alpha.5...v1.5.0-alpha.6) (2022-02-01)
### Features
* add kilogram hint to English item dialog ([bd9fc1b](https://github.com/elyukai/optolith-client/commit/bd9fc1badc8a408495bd7c1594338b1a5fe6df11))
* add utilities for working with tagged unions ([bba9b92](https://github.com/elyukai/optolith-client/commit/bba9b92e5d50fbb7cad7450b56b95b87e2e9aa4d))
* add native Apple M1 support ([94e751f](https://github.com/elyukai/optolith-client/commit/94e751fda169c4de90cdb82346d3d864cf697300))
### Bug Fixes
* attributes on minimum value do not allow CtR over 6 ([47e66d6](https://github.com/elyukai/optolith-client/commit/47e66d65467999e2661eaac30a97b5a1ebfece94)), closes [#835](https://github.com/elyukai/optolith-client/issues/835)
* profession Sharisad gets Earthencraft bonus instead of Clothworking bonus ([cd16e53](https://github.com/elyukai/optolith-client/commit/cd16e5314a7f579a5f5f916bb204a15df3220bda)), closes [#1341](https://github.com/elyukai/optolith-client/issues/1341)
* show Hit Zone Armor tab for English Armory ([383a9c1](https://github.com/elyukai/optolith-client/commit/383a9c166c6d8c5d713f4852f40999c5d8c00efc)), closes [#1328](https://github.com/elyukai/optolith-client/issues/1328)
* special ability Tradition (Tsatuara-Anhängerinnen) is in wrong group ([6669352](https://github.com/elyukai/optolith-client/commit/6669352d06c3687a9793eb69ea0018915b865212)), closes [#1137](https://github.com/elyukai/optolith-client/issues/1137)
* too large PDF output when using a sheet background ([9cb2658](https://github.com/elyukai/optolith-client/commit/9cb26586f3a5026d06f41801d4bbf714631d06a4)), closes [#1094](https://github.com/elyukai/optolith-client/issues/1094)
* weight column in inventory shows wrong weight in English ([6ba99f2](https://github.com/elyukai/optolith-client/commit/6ba99f2f4610e8a26d1703d978738a907f26bd92)), closes [#1329](https://github.com/elyukai/optolith-client/issues/1329)
## [1.5.0-alpha.5](https://github.com/elyukai/optolith-client/compare/v1.5.0-alpha.4...v1.5.0-alpha.5) (2022-01-27)
### Features
* portuguese translations ([d8c9f52](https://github.com/elyukai/optolith-client/commit/d8c9f52542120f9e5fa569728b3f11cb79102365))
### Bug Fixes
* latest TypeScript compilation errors ([6b93c15](https://github.com/elyukai/optolith-client/commit/6b93c15aa02513dcd8ddccfb43cea92370de8290))
* missing import ([29c7b4b](https://github.com/elyukai/optolith-client/commit/29c7b4bc39d21e41291ee944c8051b2b10863069))
## [1.5.0-alpha.4](https://github.com/elyukai/optolith-client/compare/v1.5.0-alpha.3...v1.5.0-alpha.4) (2021-08-03)
### Features
* add XML export for MapTool ([87cec15](https://github.com/elyukai/optolith-client/commit/87cec15ba9751c329ee39719dc654895b9f4f193))
### Bug Fixes
* maptools should provide user interface strings ([b2fb035](https://github.com/elyukai/optolith-client/commit/b2fb0353a9cac409d726e3ad236c0508f230ff06))
## [1.5.0-alpha.3](https://github.com/elyukai/optolith-client/compare/v1.5.0-alpha.2...v1.5.0-alpha.3) (2021-08-03)
## [1.5.0-alpha.2](https://github.com/elyukai/optolith-client/compare/v1.5.0-alpha.1...v1.5.0-alpha.2) (2021-05-28)
### Bug Fixes
* "Gaze into the Essence" spell is misspelled as "Gase into the Essence" ([42891f0](https://github.com/elyukai/optolith-client/commit/42891f070c35b74c49bb2c9e16152789cc8cc7df)), closes [#1180](https://github.com/elyukai/optolith-client/issues/1180)
* "Physiostabilis" name typo ([e40f995](https://github.com/elyukai/optolith-client/commit/e40f995e341dc7fbcb1d9688c4b82a9187c180de)), closes [#1234](https://github.com/elyukai/optolith-client/issues/1234)
* "Tradition (Druid)" has invalid prerequisite in data ([f8114c2](https://github.com/elyukai/optolith-client/commit/f8114c2f4318967631b71ea3614bf647e7826fa2)), closes [#1237](https://github.com/elyukai/optolith-client/issues/1237)
* hook dagger is not marked as a parrying weapon ([ed74170](https://github.com/elyukai/optolith-client/commit/ed74170865b2caad8008a345db5c1705e0376bc5)), closes [#1232](https://github.com/elyukai/optolith-client/issues/1232)
* multiple database fixes ([16bd668](https://github.com/elyukai/optolith-client/commit/16bd668313826ab8df0eeaeb5259a2f30304c134)), closes [#854](https://github.com/elyukai/optolith-client/issues/854) [#855](https://github.com/elyukai/optolith-client/issues/855) [#1136](https://github.com/elyukai/optolith-client/issues/1136) [#1213](https://github.com/elyukai/optolith-client/issues/1213) [#1238](https://github.com/elyukai/optolith-client/issues/1238) [#1242](https://github.com/elyukai/optolith-client/issues/1242)
* special ability Deadly Thrust has SA Crossblock's rules text ([ec9bd71](https://github.com/elyukai/optolith-client/commit/ec9bd71e101abcaf61e84e3da340890e161896ea)), closes [#841](https://github.com/elyukai/optolith-client/issues/841)
* weapon advantage of Kriegsbogen has wrong DP bonus ([8297455](https://github.com/elyukai/optolith-client/commit/8297455ddbd360035428a4ed244a684e6f1c7e7a)), closes [#1074](https://github.com/elyukai/optolith-client/issues/1074)
* wrong English names for spell enhancements of Heptagramma ([a5df7c8](https://github.com/elyukai/optolith-client/commit/a5df7c863cded391609950fa5b8bf8474ffe2dfd)), closes [#848](https://github.com/elyukai/optolith-client/issues/848)
* wrong negative prerequisite for Aspect Knowledge entry ([21146eb](https://github.com/elyukai/optolith-client/commit/21146eb2abdb16ff84f58d0223810603125ff63a)), closes [#1243](https://github.com/elyukai/optolith-client/issues/1243)
* wrong talent value profession Spider Witch, closes [#1250](https://github.com/elyukai/optolith-client/issues/1250)
## [1.5.0-alpha.1](https://github.com/elyukai/optolith-client/compare/v1.4.3-alpha.1...v1.5.0-alpha.1) (2021-05-27)
### Bug Fixes
* 2H and i weapon settings missing on character sheet ([3f9fae3](https://github.com/elyukai/optolith-client/commit/3f9fae30a2291b8e53486a74dae8cc1533741b94)), closes [#797](https://github.com/elyukai/optolith-client/issues/797)
* brawling weapons have no parry on character sheet ([a02700e](https://github.com/elyukai/optolith-client/commit/a02700eeccbd95a75f778d4d9e78ad7a2447dad8)), closes [#1229](https://github.com/elyukai/optolith-client/issues/1229)
* cannot remove dependent entry with multiple activations ([092343f](https://github.com/elyukai/optolith-client/commit/092343f45da566a45b13b275899a458fed720a76)), closes [#1097](https://github.com/elyukai/optolith-client/issues/1097)
* enhancements on transferred unfamiliar spells as dependency ([28f260a](https://github.com/elyukai/optolith-client/commit/28f260a2c4a96adb0d36585a478676f95c304414)), closes [#827](https://github.com/elyukai/optolith-client/issues/827)
* equipment info crash ([ae2fbad](https://github.com/elyukai/optolith-client/commit/ae2fbad1c738354dd468c1b36b06eda729a879e5))
* filter professions with CTs higher than EL allows ([c8094f5](https://github.com/elyukai/optolith-client/commit/c8094f5ef15f62f69088386b9fc6c64f7d8bfd02)), closes [#1244](https://github.com/elyukai/optolith-client/issues/1244)
* include latest database changes ([ccd7dec](https://github.com/elyukai/optolith-client/commit/ccd7decc8314ca476b6a15932ed9b3fb1c22a1f7))
* ini/mov modifiers on armor are handled as penalties ([eb5a068](https://github.com/elyukai/optolith-client/commit/eb5a06884db1894e1a9f2b4b040b114cb4dc85cb)), closes [#1091](https://github.com/elyukai/optolith-client/issues/1091)
* language specializations always cost 1 AP and are multi-buyable ([0a59d9e](https://github.com/elyukai/optolith-client/commit/0a59d9e5e571e87525b18d0b25035e73f7cd87bf)), closes [#1082](https://github.com/elyukai/optolith-client/issues/1082)
* large spell selection and restrictions for Animists ([2ad037e](https://github.com/elyukai/optolith-client/commit/2ad037ecbc2727f360161d6500f2aeaef3c4a67c)), closes [#803](https://github.com/elyukai/optolith-client/issues/803)
* patch security vulnerabilities ([723e910](https://github.com/elyukai/optolith-client/commit/723e9106ebb178db6a7cccec2a022b3edaed5b98))
* portraits with transparency have black background ([cc5ecd6](https://github.com/elyukai/optolith-client/commit/cc5ecd6f098ae6c080eeb3b306887727a99c1220)), closes [#800](https://github.com/elyukai/optolith-client/issues/800)
* previous database fixes ([397abe2](https://github.com/elyukai/optolith-client/commit/397abe2b4a69582dc49422add1700807272c32d6)), closes [#792](https://github.com/elyukai/optolith-client/issues/792) [#824](https://github.com/elyukai/optolith-client/issues/824) [#832](https://github.com/elyukai/optolith-client/issues/832) [#850](https://github.com/elyukai/optolith-client/issues/850) [#851](https://github.com/elyukai/optolith-client/issues/851) [#1139](https://github.com/elyukai/optolith-client/issues/1139) [#1224](https://github.com/elyukai/optolith-client/issues/1224)
* primary attribute dropdown does not handle data correctly ([6c63ab1](https://github.com/elyukai/optolith-client/commit/6c63ab1b5051882ace71f15740c3a69fff4a267f)), closes [#798](https://github.com/elyukai/optolith-client/issues/798)
* profession with due to EL impossible attribute values can be selected ([fdde329](https://github.com/elyukai/optolith-client/commit/fdde329de591319df3f6da11404dd7523d800c3e)), closes [#1109](https://github.com/elyukai/optolith-client/issues/1109)
* spellworks from professions do not register dependencies ([c1b2e26](https://github.com/elyukai/optolith-client/commit/c1b2e267cb3f02d2d18812415c39c58739ad99ec)), closes [#1240](https://github.com/elyukai/optolith-client/issues/1240)
* typo in effect of Bliksemblind spell (Dutch) ([c58279c](https://github.com/elyukai/optolith-client/commit/c58279cc95aba5506824510d83aa6ffbc410107a)), closes [#805](https://github.com/elyukai/optolith-client/issues/805)
* weight of Elves is not generated correctly ([3b05e69](https://github.com/elyukai/optolith-client/commit/3b05e69e27f7faa1634b50eb134000fe1a2c3a21)), closes [#813](https://github.com/elyukai/optolith-client/issues/813)
## [1.4.3-alpha.1](https://github.com/elyukai/optolith-client/compare/v1.4.3-alpha.0...v1.4.3-alpha.1) (2020-11-13)
### Bug Fixes
* **sheets:** removed margin of hit zone sheet ([e637136](https://github.com/elyukai/optolith-client/commit/e63713687eff9b825a79d159fb8b44dc26f64ffe)), closes [#788](https://github.com/elyukai/optolith-client/issues/788)
* adding LE should affect CON ([390dcb6](https://github.com/elyukai/optolith-client/commit/390dcb616aaa68e5b103bb49dd75d1529c4e7e3a)), closes [#787](https://github.com/elyukai/optolith-client/issues/787)
## [1.4.2](https://github.com/elyukai/optolith-client/compare/v1.4.1...v1.4.2) (2020-11-08)
### Enhancements
+8 -2
View File
@@ -28,7 +28,7 @@ You can suggest features either in the issues tracker or in one of the [listed f
### Important note
Due to licensing, the YAML files containing the crunch elements from the books are **not** included in this repository but in a separate private one. Please join my [Discord Server](https://discord.gg/uDyR4yr) if you want to contribute and thus need to access them. Just text me in a channel on the server or PN me (@elyukai).
Due to licensing, the YAML files containing the crunch elements from the books are **not** included in this repository but in a separate private one. If you only plan to contribute something independent of the database, you can just get the database from an alpha installation. On Windows, for example, the database is available under `Resources/app.asar.unpacked/app/Data` inside the installation folder. If you plan to contribute anything to the database itself and thus need to access its source, please join my [Discord Server](https://discord.gg/uDyR4yr) and text me in a channel on the server or PN me (@elyukai).
### Basic development rules
@@ -40,6 +40,12 @@ Due to licensing, the YAML files containing the crunch elements from the books a
- Code should follow functional programming practices while maintaining readablilty &ndash; which can be an issue using JavaScript/TypeScript, which is why in certain circumstances imperative/OOP code is allowed. It is also possible to write Reason/OCaml code, which compiles to JS.
- The contribution has to be easy to understand not only for players using the app, but also for coders trying to further enhance the app: Please document *at least* module exports!
### Install required software
- **Git** &mdash; <https://git-scm.com/downloads> or via a package manager
- **Node.js** with **npm** &mdash; <https://nodejs.org/en/> or via [`nvm`](https://github.com/nvm-sh/nvm)
- *Optional:* **Visual Studio Code** &mdash; <https://code.visualstudio.com/> (you can use your own editor as well, there are project-specific VSCode settings within this repository, though)
### Prepare the repo
Clone the repo, including the private submodule.
@@ -63,7 +69,7 @@ Compile the source code. `js:` is for TypeScript/Webpack, `re:` for Reason/OCaml
You have to run the Reason build first as it generates TypeScript files...
```sh
npm run re:build
npm run ts:build
npm run css:build
npm run js:build
```
+85
View File
@@ -1,3 +1,88 @@
## 1.5.1
### Verbesserungen
* **MapTool:** unter dem Exportbutton sind nun Links zu der MapTool-Erweiterung ([07d336d](https://github.com/elyukai/optolith-client/commit/07d336dbb3ceba9818185a9b8c0cdffa6283afb3))
### Fehlerbehebungen
* **MapTool:** ohne Avatar konnte nicht exportiert werden ([80fdffb](https://github.com/elyukai/optolith-client/commit/80fdffb373fccc467383cf6d98c1f07a92168ee4)), schließt [#1348](https://github.com/elyukai/optolith-client/issues/1348)
* **MapTool:** für MapTool Version 1.11.4 wurde das Exportformat angepasst ([9e9a113](https://github.com/elyukai/optolith-client/commit/9e9a1139d3821bb5a36fbaa973236319026d996a))
* Vorteil *Vertrauenerweckend* konnte selbst mit einem aktiven Nachteil *Inkompetent* in einem Gesellschaftstalent gekauft werden ([8102bb1](https://github.com/elyukai/optolith-client/commit/8102bb1a9adac4849499380bf3bc2270aa7dd2c6)), schließt [#1351](https://github.com/elyukai/optolith-client/issues/1351)
* Voraussetzungen, die hätten durchgestrichen werden sollen, wurden stattdessen mit umgebenen Tilden dargestellt ([2c9332c](https://github.com/elyukai/optolith-client/commit/2c9332c37f9b2d8d9e0359a9e4dadf0a40beeba1)), schließt [#1349](https://github.com/elyukai/optolith-client/issues/1349)
## 1.5.0
### Features
* MapTool-Export ([87cec15](https://github.com/elyukai/optolith-client/commit/87cec15ba9751c329ee39719dc654895b9f4f193))
* Portugiesische Übersetzung ([d8c9f52](https://github.com/elyukai/optolith-client/commit/d8c9f52542120f9e5fa569728b3f11cb79102365), [#676](https://github.com/elyukai/optolith-client/issues/676))
* Native Unterstützung für Apples M1 ([94e751f](https://github.com/elyukai/optolith-client/commit/94e751fda169c4de90cdb82346d3d864cf697300))
### Verbesserungen
* Sicherheit ([723e910](https://github.com/elyukai/optolith-client/commit/723e9106ebb178db6a7cccec2a022b3edaed5b98) and others)
### Fehlerbehebungen
* Der Trefferzonenrüstungscharakterbogen hatte einen höheren Abstand nach links als die anderen Bögen ([e637136](https://github.com/elyukai/optolith-client/commit/e63713687eff9b825a79d159fb8b44dc26f64ffe), [#788](https://github.com/elyukai/optolith-client/issues/788))
* Bei hinzugekaufter LE wurde nicht für KO ein entsprechendes Minimum gesetzt, sondern für KK ([390dcb6](https://github.com/elyukai/optolith-client/commit/390dcb616aaa68e5b103bb49dd75d1529c4e7e3a), [#787](https://github.com/elyukai/optolith-client/issues/787))
* Waffenindikatoren für zweihändig (2H) und improvisiert (i) fehlten auf dem Charakterbogen ([3f9fae3](https://github.com/elyukai/optolith-client/commit/3f9fae30a2291b8e53486a74dae8cc1533741b94), [#797](https://github.com/elyukai/optolith-client/issues/797))
* Waffen der Kampftechnik Raufen hatten auf dem Charakterbogen keinen Paradewert ([a02700e](https://github.com/elyukai/optolith-client/commit/a02700eeccbd95a75f778d4d9e78ad7a2447dad8), [#1229](https://github.com/elyukai/optolith-client/issues/1229))
* Ein Eintrag, der von einer einzelnen Aktivierung eines anderen Eintrags abhängt, hat die Möglichkeit, die Aktivierung zu entfernen, auch bei mehreren Aktivierungen dieses anderen Eintrags nicht bereitgestellt ([092343f](https://github.com/elyukai/optolith-client/commit/092343f45da566a45b13b275899a458fed720a76), [#1097](https://github.com/elyukai/optolith-client/issues/1097))
* Einträge, die Fremdzauber in die eigenen Tradition überführen, konnten entfernt werden, wenn für diese Zauber Zaubererweiterungen gekauft worden waren ([28f260a](https://github.com/elyukai/optolith-client/commit/28f260a2c4a96adb0d36585a478676f95c304414), [#827](https://github.com/elyukai/optolith-client/issues/827))
* Der Infobereich für Gegenstände hat manchmal nur Fehler angezeigt ([ae2fbad](https://github.com/elyukai/optolith-client/commit/ae2fbad1c738354dd468c1b36b06eda729a879e5))
* Professionen, die höhere Kampftechnikwerte geben als durch den Erfahrungsgrad erlaubt, wurden nicht ausgeblendet ([c8094f5](https://github.com/elyukai/optolith-client/commit/c8094f5ef15f62f69088386b9fc6c64f7d8bfd02), [#1244](https://github.com/elyukai/optolith-client/issues/1244))
* Bei der Sonderfertigkeit Kernschuss war unter Erschwernis ein Minuszeichen falsch platziert ([ccd7dec](https://github.com/elyukai/optolith-client/commit/ccd7decc8314ca476b6a15932ed9b3fb1c22a1f7), [#1080](https://github.com/elyukai/optolith-client/issues/1080))
* In der Beschreibung von Albernisches Entermesser und Harbener Säbel war die Seitenzahl falsch ([ccd7dec](https://github.com/elyukai/optolith-client/commit/ccd7decc8314ca476b6a15932ed9b3fb1c22a1f7), [#1081](https://github.com/elyukai/optolith-client/issues/1081))
* In der Beschreibung des Zaubers Zauberschnurren waren die QS-Beschreibungen vertauscht ([ccd7dec](https://github.com/elyukai/optolith-client/commit/ccd7decc8314ca476b6a15932ed9b3fb1c22a1f7), [#846](https://github.com/elyukai/optolith-client/issues/846) [#1122](https://github.com/elyukai/optolith-client/issues/1122))
* Schlachtermesser und Fleischerbeil waren nicht als improvisierte Waffen markiert ([ccd7dec](https://github.com/elyukai/optolith-client/commit/ccd7decc8314ca476b6a15932ed9b3fb1c22a1f7), [#808](https://github.com/elyukai/optolith-client/issues/808))
* INI/GS-Modifikatoren von Rüstungen wurden negativ eingerechnet ([eb5a068](https://github.com/elyukai/optolith-client/commit/eb5a06884db1894e1a9f2b4b040b114cb4dc85cb), [#1091](https://github.com/elyukai/optolith-client/issues/1091))
* Sprachspezialisierungen kosteten nicht immer 1 AP und konnten zudem pro Sprache nicht mehrfach aktiviert werden ([0a59d9e](https://github.com/elyukai/optolith-client/commit/0a59d9e5e571e87525b18d0b25035e73f7cd87bf), [#1082](https://github.com/elyukai/optolith-client/issues/1082))
* Portraits mit transparenten Flächen hatten einen schwarzen Hintergrund ([cc5ecd6](https://github.com/elyukai/optolith-client/commit/cc5ecd6f098ae6c080eeb3b306887727a99c1220), [#800](https://github.com/elyukai/optolith-client/issues/800))
* Bei Profession Garether Krieger fehlte Schwerter auf 12 und Orientierung sollte 3 statt 2 betragen ([397abe2](https://github.com/elyukai/optolith-client/commit/397abe2b4a69582dc49422add1700807272c32d6), [#792](https://github.com/elyukai/optolith-client/issues/792))
* Das bornländische Kulturpaket führte Lederbearbeitung statt Lebensmittelbearbeitung auf ([397abe2](https://github.com/elyukai/optolith-client/commit/397abe2b4a69582dc49422add1700807272c32d6), [#824](https://github.com/elyukai/optolith-client/issues/824))
* Zauber Wirbelform hatte die falsche Tradition und eine falsche Reihenfolge bei den Zaubererweiterungen ([397abe2](https://github.com/elyukai/optolith-client/commit/397abe2b4a69582dc49422add1700807272c32d6), [#1139](https://github.com/elyukai/optolith-client/issues/1139))
* Kleine Fehler bei den Maßangaben in der Beschreibung des Zaubers Invocatio Minima ([397abe2](https://github.com/elyukai/optolith-client/commit/397abe2b4a69582dc49422add1700807272c32d6), [#1224](https://github.com/elyukai/optolith-client/issues/1224))
* Leiteigenschaftsänderungen bei Gegenständen wurden auf dem Charakterbogen geändert, aber nicht direkt im Editierfenster des Gegenstands ([6c63ab1](https://github.com/elyukai/optolith-client/commit/6c63ab1b5051882ace71f15740c3a69fff4a267f), [#798](https://github.com/elyukai/optolith-client/issues/798))
* Bestimmte Professionen waren trotz eines für vorausgesetzte Eigenschaften zu niedrigen Erfahrungsgrads auswählbar ([fdde329](https://github.com/elyukai/optolith-client/commit/fdde329de591319df3f6da11404dd7523d800c3e), [#1109](https://github.com/elyukai/optolith-client/issues/1109))
* Herbeirufende und beschwörende Zauber aus Professionen haben nicht direkt die Abhängigkeiten für ihre Voraussetzungen registriert ([c1b2e26](https://github.com/elyukai/optolith-client/commit/c1b2e267cb3f02d2d18812415c39c58739ad99ec), [#1240](https://github.com/elyukai/optolith-client/issues/1240))
* Das Gewicht bei Elfen wurde nicht korrekt zufällig generiert ([3b05e69](https://github.com/elyukai/optolith-client/commit/3b05e69e27f7faa1634b50eb134000fe1a2c3a21), [#813](https://github.com/elyukai/optolith-client/issues/813))
* Schreibfehler bei Physiostabilis ([e40f995](https://github.com/elyukai/optolith-client/commit/e40f995e341dc7fbcb1d9688c4b82a9187c180de), [#1234](https://github.com/elyukai/optolith-client/issues/1234))
* Tradition (Druide) referenzierte einen nicht existierenden Nachteil statt des Vorteils Eisenaffine Aura ([f8114c2](https://github.com/elyukai/optolith-client/commit/f8114c2f4318967631b71ea3614bf647e7826fa2), [#1237](https://github.com/elyukai/optolith-client/issues/1237))
* Der Hakendolch war nicht als Parierwaffe markiert ([ed74170](https://github.com/elyukai/optolith-client/commit/ed74170865b2caad8008a345db5c1705e0376bc5), [#1232](https://github.com/elyukai/optolith-client/issues/1232))
* Der Waffenvorteil des Kriegsbogens hatte einen falschen Schadensbonus ([8297455](https://github.com/elyukai/optolith-client/commit/8297455ddbd360035428a4ed244a684e6f1c7e7a), [#1074](https://github.com/elyukai/optolith-client/issues/1074))
* Profession Spinnenhexe hatte einen falschen Tierkunde-Wert ([#1250](https://github.com/elyukai/optolith-client/issues/1250))
* Eigenschaften auf dem niedrigsten möglichen Wert (8) erlaubten Kampftechniken, dessen Leiteigenschaften sie waren, keinen Kampftechnikwert über 6 ([47e66d6](https://github.com/elyukai/optolith-client/commit/47e66d65467999e2661eaac30a97b5a1ebfece94), [#835](https://github.com/elyukai/optolith-client/issues/835))
* Profession Sharisad bekam einen Bonus auf Steinbearbeitung statt auf Stoffbearbeitung ([cd16e53](https://github.com/elyukai/optolith-client/commit/cd16e5314a7f579a5f5f916bb204a15df3220bda), [#1341](https://github.com/elyukai/optolith-client/issues/1341))
* Die PDF-Datei war zu groß, wenn die Hintergrundtextur verwendet wurde ([9cb2658](https://github.com/elyukai/optolith-client/commit/9cb26586f3a5026d06f41801d4bbf714631d06a4), [#1094](https://github.com/elyukai/optolith-client/issues/1094))
* Bei AppImages funktionierte der Auto-Updater nicht ([a24ff80](https://github.com/elyukai/optolith-client/commit/a24ff8082a5556fc07af05f113bacfd9c84428a4), [#753](https://github.com/elyukai/optolith-client/issues/753))
* SF Weg der Schreiberin konnte nicht aktiviert werden ([83b534d](https://github.com/elyukai/optolith-client/commit/83b534d3f9fcd5e63ef7cf482d9dd26f06b5a1a2), [#1233](https://github.com/elyukai/optolith-client/issues/1233))
* Einige Leiteigenschaftsvoraussetzungen wurden ignoriert ([ac0cdc3](https://github.com/elyukai/optolith-client/commit/ac0cdc377800a1eb380993dbb7914fa88b8f254e), [#1260](https://github.com/elyukai/optolith-client/issues/1260))
* Die Texteingabefehler für die Reichweite von Fernkampfwaffen beeinflussten ihre Inhalte gegenseitig ([0ab65e8](https://github.com/elyukai/optolith-client/commit/0ab65e869c26536127b386753db110f2e26b33af), [#1251](https://github.com/elyukai/optolith-client/issues/1251))
* Wenn eine einzige Sprache und dazu passende Schrift vorausgesetzt wurden, wurden stattdessen alle Sprachen und Schriften vorausgesetzt ([4dabbdb](https://github.com/elyukai/optolith-client/commit/4dabbdbcd23c1ffeff18a8b1f9497a4a8315aa6a), [#1343](https://github.com/elyukai/optolith-client/issues/1343))
* Schriften erforderten keine aktive passende Sprache ([1ed0c64](https://github.com/elyukai/optolith-client/commit/1ed0c64b0dd9873593169bd9994082d49299fa3e), [#1344](https://github.com/elyukai/optolith-client/issues/1344))
* Einige Gegenstandswerte wurden nicht gespeichert ([f2e6138](https://github.com/elyukai/optolith-client/commit/f2e61386abe444aa76f0211469d50c30fde99a0c), [#1252](https://github.com/elyukai/optolith-client/issues/1252))
* Schreibfeler bei Tarnele ([8b5eede](https://github.com/elyukai/optolith-client/commit/8b5eedeb372622761480f2511935e8b74bdfcdcd), [#1330](https://github.com/elyukai/optolith-client/issues/1330))
* Die Auswahl eines Fremdzaubers für eine gildenmagische Profession war optional ([3574d1b](https://github.com/elyukai/optolith-client/commit/3574d1ba46725d04a83286cd1055c080fe1de95f), [#1315](https://github.com/elyukai/optolith-client/issues/1315))
* Kampftechniken haben nicht das Minimum ihrer Leiteigenschaften beeinflusst ([1ce2db9](https://github.com/elyukai/optolith-client/commit/1ce2db9cfbb06b1ca8a549957b8225af71de9185), [#836](https://github.com/elyukai/optolith-client/issues/836))
* Das Speichern eines Charakters hat manchmal die Änderungshistorie von mehreren Charakteren gelöscht ([923b760](https://github.com/elyukai/optolith-client/commit/923b7605fee4c4288dc743e962728308f7254ca9), [#811](https://github.com/elyukai/optolith-client/issues/811))
* Zauber, die durch Imitationszauberei in Schelmenstreiche konvertiert wurden, konnten Zaubererweiterungen nutzen ([e558c1d](https://github.com/elyukai/optolith-client/commit/e558c1d80d1c668f926e4a56049029f989081a45), [#828](https://github.com/elyukai/optolith-client/issues/828))
* Dickere Zeilen in der zweiten Spalte der Talenttabelle auf dem Charakterbogen ([41ee35b](https://github.com/elyukai/optolith-client/commit/41ee35ba76af42ad837daa6c45a940406b0c5daa), [#1342](https://github.com/elyukai/optolith-client/issues/1342))
* Sonderfertigkeit Blattschuss zeigte den falschen Kampfsonderfertigkeitstyp an ([7e31136](https://github.com/elyukai/optolith-client/commit/7e31136083ae62e26c5017f3af2376938bd264c3), [#1331](https://github.com/elyukai/optolith-client/issues/1331))
* Schreibfehler bei Tradition (Scharlatane) ([bdb3eb7](https://github.com/elyukai/optolith-client/commit/bdb3eb7804f8464689172f39d5bd8c229140c891), [#1239](https://github.com/elyukai/optolith-client/issues/1239))
### Danke
Zu guter Letzt ein großes **Danke** an alle, die über verschiedeste Kanäle Feedback geben und helfen, sowie an die folgenden Menschen auf GitHub, die an dieser Version mitgewirkt haben!
- [Elidia (@FloraMayr)](https://github.com/FloraMayr)
- [JoveToo (@JoveToo)](https://github.com/JoveToo)
- [Lector (@Lector)](https://github.com/Lector)
- [Lorenz Cuno Klopfenstein (@LorenzCK)](https://github.com/LorenzCK)
- [Marc Schwering (@m4rcsch)](https://github.com/m4rcsch)
- [Pepelios (@Pepelios)](https://github.com/Pepelios)
## 1.4.2
### Enhancements
+5 -1
View File
@@ -51,5 +51,9 @@ Die Charaktere und auch andere Dateien wie die Konfiguration findest du je n
Hier finden sich verschiedene relevante Dateien:
- `heroes.json` enthält alle Helden, die aktuell in Optolith sind
- `config.json` enthält die Konfiguration deiner Optolith-Anwendung. Enthält keine wichtigen Daten, nur Dinge wie Farbschema, Sprache (falls man eine spezielle eingestellt hat), und ein paar andere Sachen.
- `config.json` enthält die Konfiguration deiner Optolith-Anwendung. Enthält keine wichtigen Daten, nur Dinge wie Farbschema, Sprache (falls man eine spezielle eingestellt hat), und ein paar andere Sachen.
*Ein Hinweis zu Windows:* `AppData` ist ein versteckter Ordner. Um ihn zu sehen, müsst ihr im Windows Explorer unter *Ansicht* die Einstellung *Ausgeblendete Elemente* aktivieren.
## Wie skaliere ich die Benutzeroberfläche von Optolith auf meinem Linux-System?
Wenn du die `tar.gz` heruntergeladen hast, kannst du in den entpackten Ordner navigieren und dort `GDK_DPI_SCALE=<Scale> ./Optolith` in der Kommandozeile ausführen. Dabei muss `<Scale>` mit dem gewünschten Skalierungsfaktor ersetzt werden, also z. B. `1.5`.
+79
View File
@@ -1,3 +1,82 @@
## 1.5.1
### Enhancements
* **MapTool:** add links to extension next to export button ([07d336d](https://github.com/elyukai/optolith-client/commit/07d336dbb3ceba9818185a9b8c0cdffa6283afb3))
### Bug Fixes
* **MapTool:** without an avatar no export was possible ([80fdffb](https://github.com/elyukai/optolith-client/commit/80fdffb373fccc467383cf6d98c1f07a92168ee4)), closes [#1348](https://github.com/elyukai/optolith-client/issues/1348)
* **MapTool:** changed export format for MapTool version 1.11.4 ([9e9a113](https://github.com/elyukai/optolith-client/commit/9e9a1139d3821bb5a36fbaa973236319026d996a))
<!-- * **MapTool:** Add missing Italian translations for export ([3f87dca](https://github.com/elyukai/optolith-client/commit/3f87dca910ce5229c7fd5378ba5f4177cbf431ac)), closes [#1350](https://github.com/elyukai/optolith-client/issues/1350) -->
* Advantage *Inspire Confidence* could be bought with an active *Incompetent* in a social skill ([8102bb1](https://github.com/elyukai/optolith-client/commit/8102bb1a9adac4849499380bf3bc2270aa7dd2c6)), closes [#1351](https://github.com/elyukai/optolith-client/issues/1351)
* Strikethrough prerequisites were rendered with surrounding tildes instead ([2c9332c](https://github.com/elyukai/optolith-client/commit/2c9332c37f9b2d8d9e0359a9e4dadf0a40beeba1)), closes [#1349](https://github.com/elyukai/optolith-client/issues/1349)
## 1.5.0
### Features
* MapTool export ([87cec15](https://github.com/elyukai/optolith-client/commit/87cec15ba9751c329ee39719dc654895b9f4f193))
* Portuguese translations ([d8c9f52](https://github.com/elyukai/optolith-client/commit/d8c9f52542120f9e5fa569728b3f11cb79102365), [#676](https://github.com/elyukai/optolith-client/issues/676))
* Native Apple M1 support ([94e751f](https://github.com/elyukai/optolith-client/commit/94e751fda169c4de90cdb82346d3d864cf697300))
### Enhancements
* Kilogram input hint for weight in item dialog ([bd9fc1b](https://github.com/elyukai/optolith-client/commit/bd9fc1badc8a408495bd7c1594338b1a5fe6df11))
* Security ([723e910](https://github.com/elyukai/optolith-client/commit/723e9106ebb178db6a7cccec2a022b3edaed5b98) and others)
### Bug Fixes
* Hit Zone Armor character sheet had left margin ([e637136](https://github.com/elyukai/optolith-client/commit/e63713687eff9b825a79d159fb8b44dc26f64ffe), [#788](https://github.com/elyukai/optolith-client/issues/788))
* Additional LE set a minimum required value of STR instead of CON ([390dcb6](https://github.com/elyukai/optolith-client/commit/390dcb616aaa68e5b103bb49dd75d1529c4e7e3a), [#787](https://github.com/elyukai/optolith-client/issues/787))
* Two-handed (2H) and improvised (i) weapon indicators were missing on character sheet ([3f9fae3](https://github.com/elyukai/optolith-client/commit/3f9fae30a2291b8e53486a74dae8cc1533741b94), [#797](https://github.com/elyukai/optolith-client/issues/797))
* Brawling weapons had no parry on character sheet ([a02700e](https://github.com/elyukai/optolith-client/commit/a02700eeccbd95a75f778d4d9e78ad7a2447dad8), [#1229](https://github.com/elyukai/optolith-client/issues/1229))
* An entry that depends on a single activation of another entry disables removing of all activations of that entry if multiple activations are present ([092343f](https://github.com/elyukai/optolith-client/commit/092343f45da566a45b13b275899a458fed720a76), [#1097](https://github.com/elyukai/optolith-client/issues/1097))
* Entries affecting spells to not be unfamiliar could be removed if Spell Enhancements were bought ([28f260a](https://github.com/elyukai/optolith-client/commit/28f260a2c4a96adb0d36585a478676f95c304414), [#827](https://github.com/elyukai/optolith-client/issues/827))
* The equipment info area may have crashed ([ae2fbad](https://github.com/elyukai/optolith-client/commit/ae2fbad1c738354dd468c1b36b06eda729a879e5))
* Professions that granted higher Combat Technique Ratings than what the selected Experience Level allowed were not filtered ([c8094f5](https://github.com/elyukai/optolith-client/commit/c8094f5ef15f62f69088386b9fc6c64f7d8bfd02), [#1244](https://github.com/elyukai/optolith-client/issues/1244))
* INI/MOV modifiers on armor were handled as penalties ([eb5a068](https://github.com/elyukai/optolith-client/commit/eb5a06884db1894e1a9f2b4b040b114cb4dc85cb), [#1091](https://github.com/elyukai/optolith-client/issues/1091))
* Language specializations did not always cost 1 AP and could not be activated multiple times for a single language ([0a59d9e](https://github.com/elyukai/optolith-client/commit/0a59d9e5e571e87525b18d0b25035e73f7cd87bf), [#1082](https://github.com/elyukai/optolith-client/issues/1082))
* Portraits with transparency had a black background ([cc5ecd6](https://github.com/elyukai/optolith-client/commit/cc5ecd6f098ae6c080eeb3b306887727a99c1220), [#800](https://github.com/elyukai/optolith-client/issues/800))
* Bornlander cultural package had Leatherworking instead of Prepare Food ([397abe2](https://github.com/elyukai/optolith-client/commit/397abe2b4a69582dc49422add1700807272c32d6), [#824](https://github.com/elyukai/optolith-client/issues/824))
* Spell Wind Shaping had the wrong traditions and wrong spell enhancements order ([397abe2](https://github.com/elyukai/optolith-client/commit/397abe2b4a69582dc49422add1700807272c32d6), [#1139](https://github.com/elyukai/optolith-client/issues/1139))
* Primary attribute changes for items were not applied in edit window, only on character sheet ([6c63ab1](https://github.com/elyukai/optolith-client/commit/6c63ab1b5051882ace71f15740c3a69fff4a267f), [#798](https://github.com/elyukai/optolith-client/issues/798))
* Professions with due to EL impossible attribute values could be selected ([fdde329](https://github.com/elyukai/optolith-client/commit/fdde329de591319df3f6da11404dd7523d800c3e), [#1109](https://github.com/elyukai/optolith-client/issues/1109))
* Summoning spellworks from professions did not register dependencies from prerequisites ([c1b2e26](https://github.com/elyukai/optolith-client/commit/c1b2e267cb3f02d2d18812415c39c58739ad99ec), [#1240](https://github.com/elyukai/optolith-client/issues/1240))
* Weight of Elves was not generated correctly ([3b05e69](https://github.com/elyukai/optolith-client/commit/3b05e69e27f7faa1634b50eb134000fe1a2c3a21), [#813](https://github.com/elyukai/optolith-client/issues/813))
* Gaze into the Essence spell was misspelled as Gase into the Essence ([42891f0](https://github.com/elyukai/optolith-client/commit/42891f070c35b74c49bb2c9e16152789cc8cc7df), [#1180](https://github.com/elyukai/optolith-client/issues/1180))
* Tradition (Druid) referenced a non-existent disadvantage instead of advantage Iron-Attuned Aura ([f8114c2](https://github.com/elyukai/optolith-client/commit/f8114c2f4318967631b71ea3614bf647e7826fa2), [#1237](https://github.com/elyukai/optolith-client/issues/1237))
* Hook Dagger was not marked as a parrying weapon ([ed74170](https://github.com/elyukai/optolith-client/commit/ed74170865b2caad8008a345db5c1705e0376bc5), [#1232](https://github.com/elyukai/optolith-client/issues/1232))
* Special ability Deadly Thrust had special ability Crossblock's rules text ([ec9bd71](https://github.com/elyukai/optolith-client/commit/ec9bd71e101abcaf61e84e3da340890e161896ea), [#841](https://github.com/elyukai/optolith-client/issues/841))
* Missing translations for spell enhancements of Heptagramma ([a5df7c8](https://github.com/elyukai/optolith-client/commit/a5df7c863cded391609950fa5b8bf8474ffe2dfd), [#848](https://github.com/elyukai/optolith-client/issues/848))
* Attributes on minimum value (8) did not allow a combat technique rating over 6 if the attribute was the combat technique's primary attribute ([47e66d6](https://github.com/elyukai/optolith-client/commit/47e66d65467999e2661eaac30a97b5a1ebfece94), [#835](https://github.com/elyukai/optolith-client/issues/835))
* Profession Sharisad got Earthencraft bonus instead of Clothworking bonus ([cd16e53](https://github.com/elyukai/optolith-client/commit/cd16e5314a7f579a5f5f916bb204a15df3220bda), [#1341](https://github.com/elyukai/optolith-client/issues/1341))
* The Hit Zone Armor tab in Belongings was not available, even with Aventuria Armory activated ([383a9c1](https://github.com/elyukai/optolith-client/commit/383a9c166c6d8c5d713f4852f40999c5d8c00efc), [#1328](https://github.com/elyukai/optolith-client/issues/1328))
* Too large PDF output when using a sheet background ([9cb2658](https://github.com/elyukai/optolith-client/commit/9cb26586f3a5026d06f41801d4bbf714631d06a4), [#1094](https://github.com/elyukai/optolith-client/issues/1094))
* Weight column in inventory showed wrong weight ([6ba99f2](https://github.com/elyukai/optolith-client/commit/6ba99f2f4610e8a26d1703d978738a907f26bd92), [#1329](https://github.com/elyukai/optolith-client/issues/1329))
* Auto-updater did not work in AppImage ([a24ff80](https://github.com/elyukai/optolith-client/commit/a24ff8082a5556fc07af05f113bacfd9c84428a4), [#753](https://github.com/elyukai/optolith-client/issues/753))
* Some primary attribute prerequisites were not enforced ([ac0cdc3](https://github.com/elyukai/optolith-client/commit/ac0cdc377800a1eb380993dbb7914fa88b8f254e), [#1260](https://github.com/elyukai/optolith-client/issues/1260))
* Range brackets input fields influenced other bracket fields ([0ab65e8](https://github.com/elyukai/optolith-client/commit/0ab65e869c26536127b386753db110f2e26b33af), [#1251](https://github.com/elyukai/optolith-client/issues/1251))
* Requiring only one matching languages and script required all of them instead ([4dabbdb](https://github.com/elyukai/optolith-client/commit/4dabbdbcd23c1ffeff18a8b1f9497a4a8315aa6a), [#1343](https://github.com/elyukai/optolith-client/issues/1343))
* Scripts did not require an active matching language ([1ed0c64](https://github.com/elyukai/optolith-client/commit/1ed0c64b0dd9873593169bd9994082d49299fa3e), [#1344](https://github.com/elyukai/optolith-client/issues/1344))
* Some item properties were not saved ([f2e6138](https://github.com/elyukai/optolith-client/commit/f2e61386abe444aa76f0211469d50c30fde99a0c), [#1252](https://github.com/elyukai/optolith-client/issues/1252))
* Unfamiliar spell selection in profession was optional ([3574d1b](https://github.com/elyukai/optolith-client/commit/3574d1ba46725d04a83286cd1055c080fe1de95f), [#1315](https://github.com/elyukai/optolith-client/issues/1315))
* special ability Knuckle Storm's description used Damage Points instead of Brawling Points ([06b57c9](https://github.com/elyukai/optolith-client/commit/06b57c9d15e1ef6f35da69ea46512bb790119b0a), [#1340](https://github.com/elyukai/optolith-client/issues/1340))
* Combat techniques did not influence the minimum of their primary attributes ([1ce2db9](https://github.com/elyukai/optolith-client/commit/1ce2db9cfbb06b1ca8a549957b8225af71de9185), [#836](https://github.com/elyukai/optolith-client/issues/836))
* Saving a hero cleared the undo history of multiple characters ([923b760](https://github.com/elyukai/optolith-client/commit/923b7605fee4c4288dc743e962728308f7254ca9), [#811](https://github.com/elyukai/optolith-client/issues/811))
* Widened rows in second column of skills table on character sheet ([41ee35b](https://github.com/elyukai/optolith-client/commit/41ee35ba76af42ad837daa6c45a940406b0c5daa), [#1342](https://github.com/elyukai/optolith-client/issues/1342))
### Thank you
Last but definitely not least a big **Thank You** to all of you who give feedback and help out on various channels as well as to the following people on GitHub who contributed to this release!
- [Elidia (@FloraMayr)](https://github.com/FloraMayr)
- [JoveToo (@JoveToo)](https://github.com/JoveToo)
- [Lector (@Lector)](https://github.com/Lector)
- [Lorenz Cuno Klopfenstein (@LorenzCK)](https://github.com/LorenzCK)
- [Marc Schwering (@m4rcsch)](https://github.com/m4rcsch)
- [Pepelios (@Pepelios)](https://github.com/Pepelios)
## 1.4.2
### Enhancements
+5 -1
View File
@@ -50,4 +50,8 @@ A list of relevant files:
- `heroes.json ` contains all heroes saved in Optolith
- `config.json` contains the configuration of your Optolith. It does not contain critical data but things like color theme, language (only if you selected a specific one) and alike.
*A note on Windows:* `AppData` is a *hidden* folder. To be able to see it, check out the Windows Explorer, go to the *View* tab and activate the setting *Hidden elements*.
*A note on Windows:* `AppData` is a *hidden* folder. To be able to see it, check out the Windows Explorer, go to the *View* tab and activate the setting *Hidden elements*.
## How do I scale the UI for Optolith on Linux?
If you have the `tar.gz`, you can go into the extracted folder and then run `GDK_DPI_SCALE=<Scale> ./Optolith`, where `<Scale>` needs to be replaced with the desired scale, e.g. `1.5`.
+66
View File
@@ -1,3 +1,69 @@
## 1.5.1
### Améliorations
* **MapTool:** ajout de liens vers l'extension près du bouton d'export ([07d336d](https://github.com/elyukai/optolith-client/commit/07d336dbb3ceba9818185a9b8c0cdffa6283afb3))
### Bugs corrigés
* **MapTool:** sans avatar aucun export n'était possible ([80fdffb](https://github.com/elyukai/optolith-client/commit/80fdffb373fccc467383cf6d98c1f07a92168ee4)), fermeture [#1348](https://github.com/elyukai/optolith-client/issues/1348)
* **MapTool:** modification du format d'export pour MapTool en version 1.11.4 ([9e9a113](https://github.com/elyukai/optolith-client/commit/9e9a1139d3821bb5a36fbaa973236319026d996a))
* L'avantage *Rassurant* pouvait être acheté malgré un désavantage *Incompétent* dans un des talents sociaux ([8102bb1](https://github.com/elyukai/optolith-client/commit/8102bb1a9adac4849499380bf3bc2270aa7dd2c6)), fermeture [#1351](https://github.com/elyukai/optolith-client/issues/1351)
* Les prérequis à ne pas remplir étaient affichés avec des tirets autour au lieu d'être rayés ([2c9332c](https://github.com/elyukai/optolith-client/commit/2c9332c37f9b2d8d9e0359a9e4dadf0a40beeba1)), fermeture [#1349](https://github.com/elyukai/optolith-client/issues/1349)
## 1.5.0
### Fonctionnalités
* Export MapTool ([87cec15](https://github.com/elyukai/optolith-client/commit/87cec15ba9751c329ee39719dc654895b9f4f193))
* Traductions en portugais ([d8c9f52](https://github.com/elyukai/optolith-client/commit/d8c9f52542120f9e5fa569728b3f11cb79102365), [#676](https://github.com/elyukai/optolith-client/issues/676))
* Support natif Apple M1 ([94e751f](https://github.com/elyukai/optolith-client/commit/94e751fda169c4de90cdb82346d3d864cf697300))
### Améliorations
* Sécurité ([723e910](https://github.com/elyukai/optolith-client/commit/723e9106ebb178db6a7cccec2a022b3edaed5b98) and others)
### Bugs corrigés
* Des PV supplémentaires fixaient une valeur minimale requise de FO au lieu de CN. ([390dcb6](https://github.com/elyukai/optolith-client/commit/390dcb616aaa68e5b103bb49dd75d1529c4e7e3a), [#787](https://github.com/elyukai/optolith-client/issues/787))
* Les indicateurs d'armes à deux mains (2M) et d'armes improvisées (i) manquaient sur la feuille de personnage. ([3f9fae3](https://github.com/elyukai/optolith-client/commit/3f9fae30a2291b8e53486a74dae8cc1533741b94), [#797](https://github.com/elyukai/optolith-client/issues/797))
* Les armes de bagarre n'avaient pas de parade sur la feuille de personnage. ([a02700e](https://github.com/elyukai/optolith-client/commit/a02700eeccbd95a75f778d4d9e78ad7a2447dad8), [#1229](https://github.com/elyukai/optolith-client/issues/1229))
* Une entrée qui dépend d'une seule activation d'une autre entrée désactive la suppression de toutes les activations de cette entrée si des activations multiples sont présentes. ([092343f](https://github.com/elyukai/optolith-client/commit/092343f45da566a45b13b275899a458fed720a76), [#1097](https://github.com/elyukai/optolith-client/issues/1097))
* Les entrées affectant les sorts de façon à ce qu'ils ne soient pas "non familiers" pouvaient être supprimées si des améliorations de sorts étaient achetées. ([28f260a](https://github.com/elyukai/optolith-client/commit/28f260a2c4a96adb0d36585a478676f95c304414), [#827](https://github.com/elyukai/optolith-client/issues/827))
* La zone d'information sur l'équipement pouvait planter ([ae2fbad](https://github.com/elyukai/optolith-client/commit/ae2fbad1c738354dd468c1b36b06eda729a879e5))
* Les professions qui accordaient une valeur de technique de combat supérieure à celle autorisée par le niveau d'expérience sélectionné n'étaient pas filtrées. ([c8094f5](https://github.com/elyukai/optolith-client/commit/c8094f5ef15f62f69088386b9fc6c64f7d8bfd02), [#1244](https://github.com/elyukai/optolith-client/issues/1244))
* Les modificateurs INI/VIT sur les armures étaient traités comme des pénalités. ([eb5a068](https://github.com/elyukai/optolith-client/commit/eb5a06884db1894e1a9f2b4b040b114cb4dc85cb), [#1091](https://github.com/elyukai/optolith-client/issues/1091))
* Les spécialisations linguistiques ne coûtaient pas toujours 1 PA et ne pouvaient pas être activées plusieurs fois pour une même langue. ([0a59d9e](https://github.com/elyukai/optolith-client/commit/0a59d9e5e571e87525b18d0b25035e73f7cd87bf), [#1082](https://github.com/elyukai/optolith-client/issues/1082))
* Les portraits en transparence avaient un fond noir ([cc5ecd6](https://github.com/elyukai/optolith-client/commit/cc5ecd6f098ae6c080eeb3b306887727a99c1220), [#800](https://github.com/elyukai/optolith-client/issues/800))
* Le bagage culturel Sourcelandais avait Cuisine au lieu de Travail du cuir. ([397abe2](https://github.com/elyukai/optolith-client/commit/397abe2b4a69582dc49422add1700807272c32d6), [#824](https://github.com/elyukai/optolith-client/issues/824))
* Les changements d'attributs primaires des objets n'étaient pas appliqués dans la fenêtre d'édition, mais uniquement sur la feuille de personnage. ([6c63ab1](https://github.com/elyukai/optolith-client/commit/6c63ab1b5051882ace71f15740c3a69fff4a267f), [#798](https://github.com/elyukai/optolith-client/issues/798))
* Les professions avec des valeurs d'attributs impossibles à sélectionner en raison du niveau d'expérience peuvent être sélectionnées. ([fdde329](https://github.com/elyukai/optolith-client/commit/fdde329de591319df3f6da11404dd7523d800c3e), [#1109](https://github.com/elyukai/optolith-client/issues/1109))
* Les sorts d'invocation des professions n'enregistraient pas les dépendances des prérequis. ([c1b2e26](https://github.com/elyukai/optolith-client/commit/c1b2e267cb3f02d2d18812415c39c58739ad99ec), [#1240](https://github.com/elyukai/optolith-client/issues/1240))
* Le poids des Elfes n'était pas généré correctement ([3b05e69](https://github.com/elyukai/optolith-client/commit/3b05e69e27f7faa1634b50eb134000fe1a2c3a21), [#813](https://github.com/elyukai/optolith-client/issues/813))
* Les attributs ayant une valeur minimale (8) ne permettaient pas d'obtenir une valeur de technique de combat supérieure à 6 si l'attribut était l'attribut principal de la technique de combat. ([47e66d6](https://github.com/elyukai/optolith-client/commit/47e66d65467999e2661eaac30a97b5a1ebfece94), [#835](https://github.com/elyukai/optolith-client/issues/835))
* Sortie PDF trop grande lors de l'utilisation d'un fond de feuille. ([9cb2658](https://github.com/elyukai/optolith-client/commit/9cb26586f3a5026d06f41801d4bbf714631d06a4), [#1094](https://github.com/elyukai/optolith-client/issues/1094))
* Auto-updater ne fonctionne pas dans AppImage ([a24ff80](https://github.com/elyukai/optolith-client/commit/a24ff8082a5556fc07af05f113bacfd9c84428a4), [#753](https://github.com/elyukai/optolith-client/issues/753))
* Certains prérequis d'attributs primaires n'étaient pas appliqués. ([ac0cdc3](https://github.com/elyukai/optolith-client/commit/ac0cdc377800a1eb380993dbb7914fa88b8f254e), [#1260](https://github.com/elyukai/optolith-client/issues/1260))
* Les champs de saisie entre parenthèses influençaient les autres champs entre parenthèses. ([0ab65e8](https://github.com/elyukai/optolith-client/commit/0ab65e869c26536127b386753db110f2e26b33af), [#1251](https://github.com/elyukai/optolith-client/issues/1251))
* L'exigence d'une seule langue et d'une seule écriture correspondante exigeait toutes les langues à la place ([4dabbdb](https://github.com/elyukai/optolith-client/commit/4dabbdbcd23c1ffeff18a8b1f9497a4a8315aa6a), [#1343](https://github.com/elyukai/optolith-client/issues/1343))
* Les écritures ne requièrent pas qu'une langue correspondante soit active. ([1ed0c64](https://github.com/elyukai/optolith-client/commit/1ed0c64b0dd9873593169bd9994082d49299fa3e), [#1344](https://github.com/elyukai/optolith-client/issues/1344))
* Certaines propriétés d'objets n'étaient pas sauvegardées ([f2e6138](https://github.com/elyukai/optolith-client/commit/f2e61386abe444aa76f0211469d50c30fde99a0c), [#1252](https://github.com/elyukai/optolith-client/issues/1252))
* La sélection des sorts non familiers dans la profession était facultative. ([3574d1b](https://github.com/elyukai/optolith-client/commit/3574d1ba46725d04a83286cd1055c080fe1de95f), [#1315](https://github.com/elyukai/optolith-client/issues/1315))
* Les techniques de combat n'influencent pas le minimum de leurs attributs primaires. ([1ce2db9](https://github.com/elyukai/optolith-client/commit/1ce2db9cfbb06b1ca8a549957b8225af71de9185), [#836](https://github.com/elyukai/optolith-client/issues/836))
* La sauvegarde d'un héros efface l'historique d'annulation de plusieurs personnages. ([923b760](https://github.com/elyukai/optolith-client/commit/923b7605fee4c4288dc743e962728308f7254ca9), [#811](https://github.com/elyukai/optolith-client/issues/811))
* Les lignes de la deuxième colonne du tableau des compétences de la fiche de personnage ont été élargies. ([41ee35b](https://github.com/elyukai/optolith-client/commit/41ee35ba76af42ad837daa6c45a940406b0c5daa), [#1342](https://github.com/elyukai/optolith-client/issues/1342))
### Remerciements
Enfin et surtout, un grand **merci** à tous ceux qui font des retours et donnent leur aide sur les différents canaux ainsi qu'aux personnes ci-dessous sur GitHub qui ont contribué à cette version !
- [Elidia (@FloraMayr)](https://github.com/FloraMayr)
- [JoveToo (@JoveToo)](https://github.com/JoveToo)
- [Lector (@Lector)](https://github.com/Lector)
- [Lorenz Cuno Klopfenstein (@LorenzCK)](https://github.com/LorenzCK)
- [Marc Schwering (@m4rcsch)](https://github.com/m4rcsch)
- [Pepelios (@Pepelios)](https://github.com/Pepelios)
## 1.4.2
### Améliorations
+71
View File
@@ -1,3 +1,74 @@
## 1.5.1
### Miglioramenti
* **MapTool:** aggiunto collegamento allestensione accanto al pulsante di esportazione ([07d336d](https://github.com/elyukai/optolith-client/commit/07d336dbb3ceba9818185a9b8c0cdffa6283afb3))
### Correzioni
* **MapTool:** non era possibile esportare senza avatar ([80fdffb](https://github.com/elyukai/optolith-client/commit/80fdffb373fccc467383cf6d98c1f07a92168ee4)), corregge [#1348](https://github.com/elyukai/optolith-client/issues/1348)
* **MapTool:** modificato il formato di esportazione alla versione 1.11.4 di MapTool ([9e9a113](https://github.com/elyukai/optolith-client/commit/9e9a1139d3821bb5a36fbaa973236319026d996a))
* **MapTool:** aggiunte traduzioni italiane per lesportazione ([3f87dca](https://github.com/elyukai/optolith-client/commit/3f87dca910ce5229c7fd5378ba5f4177cbf431ac)), corregge [#1350](https://github.com/elyukai/optolith-client/issues/1350)
* Il vantaggio *Affabilità* poteva essere acquistato con lo svantaggio *Incompetenza* su una competenza sociale ([8102bb1](https://github.com/elyukai/optolith-client/commit/8102bb1a9adac4849499380bf3bc2270aa7dd2c6)), corregge [#1351](https://github.com/elyukai/optolith-client/issues/1351)
* Prerequisiti barrati venivano renderizzati con delle tilde prima e dopo ([2c9332c](https://github.com/elyukai/optolith-client/commit/2c9332c37f9b2d8d9e0359a9e4dadf0a40beeba1)), corregge [#1349](https://github.com/elyukai/optolith-client/issues/1349)
## 1.5.0
### Features
* Esportazione per MapTool ([87cec15](https://github.com/elyukai/optolith-client/commit/87cec15ba9751c329ee39719dc654895b9f4f193))
* Traduzione portoghese ([d8c9f52](https://github.com/elyukai/optolith-client/commit/d8c9f52542120f9e5fa569728b3f11cb79102365), [#676](https://github.com/elyukai/optolith-client/issues/676))
* Supporto nativo per Apple M1 ([94e751f](https://github.com/elyukai/optolith-client/commit/94e751fda169c4de90cdb82346d3d864cf697300))
### Migliorie
* Sicurezza ([723e910](https://github.com/elyukai/optolith-client/commit/723e9106ebb178db6a7cccec2a022b3edaed5b98) e altre)
### Correzioni
* PV aggiuntivi influenzano il valore minimo di COS e non FOR ([390dcb6](https://github.com/elyukai/optolith-client/commit/390dcb616aaa68e5b103bb49dd75d1529c4e7e3a), [#787](https://github.com/elyukai/optolith-client/issues/787))
* Aggiunti gli indicatori per armi a due mani (2M) e improvvisate (i) sul Foglio didentità ([3f9fae3](https://github.com/elyukai/optolith-client/commit/3f9fae30a2291b8e53486a74dae8cc1533741b94), [#797](https://github.com/elyukai/optolith-client/issues/797))
* Armi usate con Armi nude non avevano il valore di Parata indicato sul Foglio didentità ([a02700e](https://github.com/elyukai/optolith-client/commit/a02700eeccbd95a75f778d4d9e78ad7a2447dad8), [#1229](https://github.com/elyukai/optolith-client/issues/1229))
* Un valore che dipende da una singola attivazione di un altro valore impedisce di rimuovere tutte le attivazioni di quel valore, se ce ne sono più attive ([092343f](https://github.com/elyukai/optolith-client/commit/092343f45da566a45b13b275899a458fed720a76), [#1097](https://github.com/elyukai/optolith-client/issues/1097))
* Valori che hanno effetto sulle magie estranee potevano essere rimossi se venivano acquistati miglioramenti di incantesimo ([28f260a](https://github.com/elyukai/optolith-client/commit/28f260a2c4a96adb0d36585a478676f95c304414), [#827](https://github.com/elyukai/optolith-client/issues/827))
* Terminazione anomala dovuto alle informazioni sullequipaggiamento ([ae2fbad](https://github.com/elyukai/optolith-client/commit/ae2fbad1c738354dd468c1b36b06eda729a879e5))
* Le professioni che garantiscono un Valore di Tecnica di Combattimento più elevato del massimo concesso dal Livello dEsperienza non venivano filtrate ([c8094f5](https://github.com/elyukai/optolith-client/commit/c8094f5ef15f62f69088386b9fc6c64f7d8bfd02), [#1244](https://github.com/elyukai/optolith-client/issues/1244))
* I modificatori di Ini e Mov delle armature venivano gestiti come penalità ([eb5a068](https://github.com/elyukai/optolith-client/commit/eb5a06884db1894e1a9f2b4b040b114cb4dc85cb), [#1091](https://github.com/elyukai/optolith-client/issues/1091))
* Specializzazioni di linguaggio non costavano sempre 1 PAvv e non potevano essere scelte più volte per una singola lingua ([0a59d9e](https://github.com/elyukai/optolith-client/commit/0a59d9e5e571e87525b18d0b25035e73f7cd87bf), [#1082](https://github.com/elyukai/optolith-client/issues/1082))
* Immagini con trasparenza venivano mostrate con sfondo nero ([cc5ecd6](https://github.com/elyukai/optolith-client/commit/cc5ecd6f098ae6c080eeb3b306887727a99c1220), [#800](https://github.com/elyukai/optolith-client/issues/800))
* Il pacchetto culturale bornese modificava Cucinare invece di Lavorazione del cuoio ([397abe2](https://github.com/elyukai/optolith-client/commit/397abe2b4a69582dc49422add1700807272c32d6), [#824](https://github.com/elyukai/optolith-client/issues/824))
* Alcuni errori di battitura in oggetti, lingue e scritture ([397abe2](https://github.com/elyukai/optolith-client/commit/397abe2b4a69582dc49422add1700807272c32d6), [#832](https://github.com/elyukai/optolith-client/issues/832))
* Corretto il titolo di Volontà del ferro ([397abe2](https://github.com/elyukai/optolith-client/commit/397abe2b4a69582dc49422add1700807272c32d6), [#850](https://github.com/elyukai/optolith-client/issues/850))
* Incantesimi e liturgie venivano indicate con punteggiatura e maiuscole diverse ([397abe2](https://github.com/elyukai/optolith-client/commit/397abe2b4a69582dc49422add1700807272c32d6), [#851](https://github.com/elyukai/optolith-client/issues/851))
* Le modifiche di attributo primario per gli oggetti venivano mostrate soltanto nella finestra di modifica, non sul Foglio didentità ([6c63ab1](https://github.com/elyukai/optolith-client/commit/6c63ab1b5051882ace71f15740c3a69fff4a267f), [#798](https://github.com/elyukai/optolith-client/issues/798))
* Le professioni con valori di attributi impossibili (a causa del Livello dEsperienza) non possono più essere selezionate ([fdde329](https://github.com/elyukai/optolith-client/commit/fdde329de591319df3f6da11404dd7523d800c3e), [#1109](https://github.com/elyukai/optolith-client/issues/1109))
* Magie di evocazione fornite dalla professione non registravano i prerequisiti corretti ([c1b2e26](https://github.com/elyukai/optolith-client/commit/c1b2e267cb3f02d2d18812415c39c58739ad99ec), [#1240](https://github.com/elyukai/optolith-client/issues/1240))
* Il peso degli elfi non veniva calcolato in maniera corretta ([3b05e69](https://github.com/elyukai/optolith-client/commit/3b05e69e27f7faa1634b50eb134000fe1a2c3a21), [#813](https://github.com/elyukai/optolith-client/issues/813))
* Gli attributi al valore minimo (8) non permettevano di raggiungere un Valore di Tecnica di Combattimento superiore al 6 se facevano da Attributo primario per la Tecnica
([47e66d6](https://github.com/elyukai/optolith-client/commit/47e66d65467999e2661eaac30a97b5a1ebfece94), [#835](https://github.com/elyukai/optolith-client/issues/835))
* PDF troppo grande quando si utilizza lo sfondo ([9cb2658](https://github.com/elyukai/optolith-client/commit/9cb26586f3a5026d06f41801d4bbf714631d06a4), [#1094](https://github.com/elyukai/optolith-client/issues/1094))
* Sistema di aggiornamento non funziona con AppImage ([a24ff80](https://github.com/elyukai/optolith-client/commit/a24ff8082a5556fc07af05f113bacfd9c84428a4), [#753](https://github.com/elyukai/optolith-client/issues/753))
* Alcuni requisiti sugli Attributi primari non venivano rispettati ([ac0cdc3](https://github.com/elyukai/optolith-client/commit/ac0cdc377800a1eb380993dbb7914fa88b8f254e), [#1260](https://github.com/elyukai/optolith-client/issues/1260))
* Gli indicatori di Raggio influenzavano altri campi ([0ab65e8](https://github.com/elyukai/optolith-client/commit/0ab65e869c26536127b386753db110f2e26b33af), [#1251](https://github.com/elyukai/optolith-client/issues/1251))
* Si richiedeva soltanto una lingua compatibile invece di tutte ([4dabbdb](https://github.com/elyukai/optolith-client/commit/4dabbdbcd23c1ffeff18a8b1f9497a4a8315aa6a), [#1343](https://github.com/elyukai/optolith-client/issues/1343))
* Le scritture non richiedevano la conoscenza di una lingua compatibile ([1ed0c64](https://github.com/elyukai/optolith-client/commit/1ed0c64b0dd9873593169bd9994082d49299fa3e), [#1344](https://github.com/elyukai/optolith-client/issues/1344))
* Alcune proprietà degli oggetti non venivano salvati ([f2e6138](https://github.com/elyukai/optolith-client/commit/f2e61386abe444aa76f0211469d50c30fde99a0c), [#1252](https://github.com/elyukai/optolith-client/issues/1252))
* La selezione dei propri incantesimi estranei era opzionale ([3574d1b](https://github.com/elyukai/optolith-client/commit/3574d1ba46725d04a83286cd1055c080fe1de95f), [#1315](https://github.com/elyukai/optolith-client/issues/1315))
* Le Tecniche di Combattimento non influenzavano il minimo richiesto sugli Attributi primari ([1ce2db9](https://github.com/elyukai/optolith-client/commit/1ce2db9cfbb06b1ca8a549957b8225af71de9185), [#836](https://github.com/elyukai/optolith-client/issues/836))
* Salvando un eroe veniva cancellata la cronologia per più eroi ([923b760](https://github.com/elyukai/optolith-client/commit/923b7605fee4c4288dc743e962728308f7254ca9), [#811](https://github.com/elyukai/optolith-client/issues/811))
* Allargate le righe della seconda colonna di abilità nel Foglio didentità ([41ee35b](https://github.com/elyukai/optolith-client/commit/41ee35ba76af42ad837daa6c45a940406b0c5daa), [#1342](https://github.com/elyukai/optolith-client/issues/1342))
### Ringraziamenti
Come ultimo punto, ma non per importanza, un grandissimo **grazie** a tutti coloro che forniscono commenti, suggerimenti e aiuto sui vari canali sociali e un grazie alle seguenti persone su GitHub che hanno contribuito a questa versione!
- [Elidia (@FloraMayr)](https://github.com/FloraMayr)
- [JoveToo (@JoveToo)](https://github.com/JoveToo)
- [Lector (@Lector)](https://github.com/Lector)
- [Lorenz Cuno Klopfenstein (@LorenzCK)](https://github.com/LorenzCK)
- [Marc Schwering (@m4rcsch)](https://github.com/m4rcsch)
- [Pepelios (@Pepelios)](https://github.com/Pepelios)
## 1.4.2
### Migliorie
+67
View File
@@ -1,3 +1,70 @@
## 1.5.1
### Enhancements
* **MapTool:** voeg links toe naar extensie naast export knop ([07d336d](https://github.com/elyukai/optolith-client/commit/07d336dbb3ceba9818185a9b8c0cdffa6283afb3))
### Bug Fixes
* **MapTool:** zonder avatar kon je niet exporteren ([80fdffb](https://github.com/elyukai/optolith-client/commit/80fdffb373fccc467383cf6d98c1f07a92168ee4)), sluit [#1348](https://github.com/elyukai/optolith-client/issues/1348)
* **MapTool:** export formaat voor MapTool versie 1.11.4 is aangepast ([9e9a113](https://github.com/elyukai/optolith-client/commit/9e9a1139d3821bb5a36fbaa973236319026d996a))
* Voordeel *Inspireer Vertrouwen* kon gekocht worden met een actieve *incompetent* in een sociale vaardigheid ([8102bb1](https://github.com/elyukai/optolith-client/commit/8102bb1a9adac4849499380bf3bc2270aa7dd2c6)), sluit [#1351](https://github.com/elyukai/optolith-client/issues/1351)
* Doorstreepte vereisten werden gerenderd met omsluitende tildes ([2c9332c](https://github.com/elyukai/optolith-client/commit/2c9332c37f9b2d8d9e0359a9e4dadf0a40beeba1)), sluit [#1349](https://github.com/elyukai/optolith-client/issues/1349)
## 1.5.0
### Features
* MapTool export ([87cec15](https://github.com/elyukai/optolith-client/commit/87cec15ba9751c329ee39719dc654895b9f4f193))
* Portuguese translations ([d8c9f52](https://github.com/elyukai/optolith-client/commit/d8c9f52542120f9e5fa569728b3f11cb79102365), [#676](https://github.com/elyukai/optolith-client/issues/676))
* Native Apple M1 support ([94e751f](https://github.com/elyukai/optolith-client/commit/94e751fda169c4de90cdb82346d3d864cf697300))
### Verbeteringen
* Security ([723e910](https://github.com/elyukai/optolith-client/commit/723e9106ebb178db6a7cccec2a022b3edaed5b98) and others)
### Probleemoplossingen
* Additional LE set a minimum required value of STR instead of CON ([390dcb6](https://github.com/elyukai/optolith-client/commit/390dcb616aaa68e5b103bb49dd75d1529c4e7e3a), [#787](https://github.com/elyukai/optolith-client/issues/787))
* Two-handed (2H) and improvised (i) weapon indicators were missing on character sheet ([3f9fae3](https://github.com/elyukai/optolith-client/commit/3f9fae30a2291b8e53486a74dae8cc1533741b94), [#797](https://github.com/elyukai/optolith-client/issues/797))
* Brawling weapons had no parry on character sheet ([a02700e](https://github.com/elyukai/optolith-client/commit/a02700eeccbd95a75f778d4d9e78ad7a2447dad8), [#1229](https://github.com/elyukai/optolith-client/issues/1229))
* An entry that depends on a single activation of another entry disables removing of all activations of that entry if multiple activations are present ([092343f](https://github.com/elyukai/optolith-client/commit/092343f45da566a45b13b275899a458fed720a76), [#1097](https://github.com/elyukai/optolith-client/issues/1097))
* Entries affecting spells to not be unfamiliar could be removed if Spell Enhancements were bought ([28f260a](https://github.com/elyukai/optolith-client/commit/28f260a2c4a96adb0d36585a478676f95c304414), [#827](https://github.com/elyukai/optolith-client/issues/827))
* The equipment info area may have crashed ([ae2fbad](https://github.com/elyukai/optolith-client/commit/ae2fbad1c738354dd468c1b36b06eda729a879e5))
* Professions that granted higher Combat Technique Ratings than what the selected Experience Level allowed were not filtered ([c8094f5](https://github.com/elyukai/optolith-client/commit/c8094f5ef15f62f69088386b9fc6c64f7d8bfd02), [#1244](https://github.com/elyukai/optolith-client/issues/1244))
* INI/MOV modifiers on armor were handled as penalties ([eb5a068](https://github.com/elyukai/optolith-client/commit/eb5a06884db1894e1a9f2b4b040b114cb4dc85cb), [#1091](https://github.com/elyukai/optolith-client/issues/1091))
* Language specializations did not always cost 1 AP and could not be activated multiple times for a single language ([0a59d9e](https://github.com/elyukai/optolith-client/commit/0a59d9e5e571e87525b18d0b25035e73f7cd87bf), [#1082](https://github.com/elyukai/optolith-client/issues/1082))
* Portraits with transparency had a black background ([cc5ecd6](https://github.com/elyukai/optolith-client/commit/cc5ecd6f098ae6c080eeb3b306887727a99c1220), [#800](https://github.com/elyukai/optolith-client/issues/800))
* Bornlander cultural package had Leatherworking instead of Prepare Food ([397abe2](https://github.com/elyukai/optolith-client/commit/397abe2b4a69582dc49422add1700807272c32d6), [#824](https://github.com/elyukai/optolith-client/issues/824))
* Primary attribute changes for items were not applied in edit window, only on character sheet ([6c63ab1](https://github.com/elyukai/optolith-client/commit/6c63ab1b5051882ace71f15740c3a69fff4a267f), [#798](https://github.com/elyukai/optolith-client/issues/798))
* Professions with due to EL impossible attribute values could be selected ([fdde329](https://github.com/elyukai/optolith-client/commit/fdde329de591319df3f6da11404dd7523d800c3e), [#1109](https://github.com/elyukai/optolith-client/issues/1109))
* Summoning spellworks from professions did not register dependencies from prerequisites ([c1b2e26](https://github.com/elyukai/optolith-client/commit/c1b2e267cb3f02d2d18812415c39c58739ad99ec), [#1240](https://github.com/elyukai/optolith-client/issues/1240))
* Typo in effect of Bliksemblind spell ([c58279c](https://github.com/elyukai/optolith-client/commit/c58279cc95aba5506824510d83aa6ffbc410107a), [#805](https://github.com/elyukai/optolith-client/issues/805))
* Weight of Elves was not generated correctly ([3b05e69](https://github.com/elyukai/optolith-client/commit/3b05e69e27f7faa1634b50eb134000fe1a2c3a21), [#813](https://github.com/elyukai/optolith-client/issues/813))
* Attributes on minimum value (8) did not allow a combat technique rating over 6 if the attribute was the combat technique's primary attribute ([47e66d6](https://github.com/elyukai/optolith-client/commit/47e66d65467999e2661eaac30a97b5a1ebfece94), [#835](https://github.com/elyukai/optolith-client/issues/835))
* Too large PDF output when using a sheet background ([9cb2658](https://github.com/elyukai/optolith-client/commit/9cb26586f3a5026d06f41801d4bbf714631d06a4), [#1094](https://github.com/elyukai/optolith-client/issues/1094))
* Auto-updater did not work in AppImage ([a24ff80](https://github.com/elyukai/optolith-client/commit/a24ff8082a5556fc07af05f113bacfd9c84428a4), [#753](https://github.com/elyukai/optolith-client/issues/753))
* Some primary attribute prerequisites were not enforced ([ac0cdc3](https://github.com/elyukai/optolith-client/commit/ac0cdc377800a1eb380993dbb7914fa88b8f254e), [#1260](https://github.com/elyukai/optolith-client/issues/1260))
* Range brackets input fields influenced other bracket fields ([0ab65e8](https://github.com/elyukai/optolith-client/commit/0ab65e869c26536127b386753db110f2e26b33af), [#1251](https://github.com/elyukai/optolith-client/issues/1251))
* Requiring only one matching languages and script required all of them instead ([4dabbdb](https://github.com/elyukai/optolith-client/commit/4dabbdbcd23c1ffeff18a8b1f9497a4a8315aa6a), [#1343](https://github.com/elyukai/optolith-client/issues/1343))
* Scripts did not require an active matching language ([1ed0c64](https://github.com/elyukai/optolith-client/commit/1ed0c64b0dd9873593169bd9994082d49299fa3e), [#1344](https://github.com/elyukai/optolith-client/issues/1344))
* Some item properties were not saved ([f2e6138](https://github.com/elyukai/optolith-client/commit/f2e61386abe444aa76f0211469d50c30fde99a0c), [#1252](https://github.com/elyukai/optolith-client/issues/1252))
* Unfamiliar spell selection in profession was optional ([3574d1b](https://github.com/elyukai/optolith-client/commit/3574d1ba46725d04a83286cd1055c080fe1de95f), [#1315](https://github.com/elyukai/optolith-client/issues/1315))
* Combat techniques did not influence the minimum of their primary attributes ([1ce2db9](https://github.com/elyukai/optolith-client/commit/1ce2db9cfbb06b1ca8a549957b8225af71de9185), [#836](https://github.com/elyukai/optolith-client/issues/836))
* Saving a hero cleared the undo history of multiple characters ([923b760](https://github.com/elyukai/optolith-client/commit/923b7605fee4c4288dc743e962728308f7254ca9), [#811](https://github.com/elyukai/optolith-client/issues/811))
* Widened rows in second column of skills table on character sheet ([41ee35b](https://github.com/elyukai/optolith-client/commit/41ee35ba76af42ad837daa6c45a940406b0c5daa), [#1342](https://github.com/elyukai/optolith-client/issues/1342))
### Dank u
Ten laatste maar zeker niet ten minste een dikke **Dank u** voor iedereen die feedback en help geeft in de verschillende kanalen alsook de volgende mensen op GitHub die bijgedragen hebben tot deze release!
- [Elidia (@FloraMayr)](https://github.com/FloraMayr)
- [JoveToo (@JoveToo)](https://github.com/JoveToo)
- [Lector (@Lector)](https://github.com/Lector)
- [Lorenz Cuno Klopfenstein (@LorenzCK)](https://github.com/LorenzCK)
- [Marc Schwering (@m4rcsch)](https://github.com/m4rcsch)
- [Pepelios (@Pepelios)](https://github.com/Pepelios)
## 1.4.2
### Verbeteringen
+3 -1
View File
@@ -48,4 +48,6 @@ Een lijst met relevante files:
- `config.json` bevat de configuratie van Optolith. Het bevat geen kritieke data maar dingen zoals theme, taal (alleen als je een specifieke taal gekozen hebt) en zoverder.
*Een noot voor Windows:* `AppData` is een *verborgen* folder. Om die te kunnen zien, open Windows Explorere, ga naar de "View" tab en activeer de setting "Hidden elements".
## Hoe schaal ik de UI voor Optolith in Linux?
Als je de `.tar.gz` hebt gedownload, ga je naar de uitgepakte folder en start je `GDK_DPI_SCALE=<Scale> ./Optolith` in je terminal, waarbij je `<scale>` moet vervangen met de gewenste schaal, e.g. `1.5`.
+9 -8
View File
@@ -1,15 +1,16 @@
## 1.5.0
Initial release.
### Features
## 1.5.1
### Enhancements
* **MapTool:** add links to extension next to export button ([07d336d](https://github.com/elyukai/optolith-client/commit/07d336dbb3ceba9818185a9b8c0cdffa6283afb3))
### Bug Fixes
### Thank you
* **MapTool:** without an avatar no export was possible ([80fdffb](https://github.com/elyukai/optolith-client/commit/80fdffb373fccc467383cf6d98c1f07a92168ee4)), closes [#1348](https://github.com/elyukai/optolith-client/issues/1348)
* **MapTool:** changed export format for MapTool version 1.11.4 ([9e9a113](https://github.com/elyukai/optolith-client/commit/9e9a1139d3821bb5a36fbaa973236319026d996a))
* Advantage *Inspire Confidence* could be bought with an active *Incompetent* in a social skill ([8102bb1](https://github.com/elyukai/optolith-client/commit/8102bb1a9adac4849499380bf3bc2270aa7dd2c6)), closes [#1351](https://github.com/elyukai/optolith-client/issues/1351)
* Strikethrough prerequisites were rendered with surrounding tildes instead ([2c9332c](https://github.com/elyukai/optolith-client/commit/2c9332c37f9b2d8d9e0359a9e4dadf0a40beeba1)), closes [#1349](https://github.com/elyukai/optolith-client/issues/1349)
Last but definitely not least a big **Thank You** to the following people on GitHub who contributed to this release!
## 1.5.0
- [TBD (@tbd)](https://github.com/tbd)
Lançamento inicial.
-5
View File
@@ -1,5 +0,0 @@
const _require = require("esm")(module)
process.once('loaded', () => {
global.require = _require
})
Binary file not shown.

After

Width:  |  Height:  |  Size: 265 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.1 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 640 B

-25
View File
@@ -1,25 +0,0 @@
// Generated by ReScript, PLEASE EDIT WITH CARE
'use strict';
var WINDOWS = {};
var LINUX = {};
var MAC = {};
var Platform = {
WINDOWS: WINDOWS,
LINUX: LINUX,
MAC: MAC
};
var Config = {};
var ElectronBuilder = {
Platform: Platform,
Config: Config
};
exports.ElectronBuilder = ElectronBuilder;
/* No side effect */
-361
View File
@@ -1,361 +0,0 @@
module ElectronBuilder = {
type target;
module Platform = {
module WINDOWS = {
[@bs.module "electron-builder"] [@bs.scope ("Platform", "WINDOWS")]
external createTarget: unit => target = "createTarget";
};
module LINUX = {
[@bs.module "electron-builder"] [@bs.scope ("Platform", "LINUX")]
external createTarget: unit => target = "createTarget";
};
module MAC = {
[@bs.module "electron-builder"] [@bs.scope ("Platform", "MAC")]
external createTarget: unit => target = "createTarget";
};
};
module Config = {
type directories = {
buildResources: option(string),
output: option(string),
app: option(string),
};
type target = {
target: string,
arch: option(array(string)),
};
type mac = {
artifactName: option(string),
category: option(string),
target: option(string),
icon: option(string),
[@bs.as "type"]
type_: option(string),
hardenedRuntime: option(bool),
gatekeeperAssess: option(bool),
};
type dmg = {sign: option(bool)};
type win = {
artifactName: option(string),
target: option(array(target)),
icon: option(string),
};
type nsis = {
perMachine: option(bool),
deleteAppDataOnUninstall: option(bool),
};
type linux = {
artifactName: option(string),
category: option(string),
target: option(array(target)),
executableName: option(string),
icon: option(string),
};
type publish = {
provider: string,
url: string,
channel: option(string),
useMultipleRangeRequest: option(bool),
};
type t = {
appId: option(string),
productName: option(string),
copyright: option(string),
directories: option(directories),
mac: option(mac),
dmg: option(dmg),
win: option(win),
nsis: option(nsis),
linux: option(linux),
files: option(array(string)),
publish: option(publish),
};
};
type options = {
config: Config.t,
targets: target,
};
[@bs.module "electron-builder"]
external build: options => Js.Promise.t(list(string)) = "build";
};
// module Publisher = {
// // require("dotenv").config()
// // const ftp = require ("basic-ftp")
// // const Client = require ("ssh2-sftp-client")
// // const fs = require ("fs")
// // const path = require ("path")
// // const semver = require ("semver");
// type channel =
// | Stable
// | Insider;
// type os =
// | Windows
// | OSX
// | Linux;
// /**
// * Needed env variables:
// * - `HOST`
// * - `USERNAME`
// * - `PASSWORD`
// */
// let publishToServer = (channel, os) => {
// let subFolder =
// switch (os) {
// | Windows => "win"
// | Linux => "linux"
// | OSX => "mac"
// };
// let updateYmlName =
// switch (os) {
// | Windows => "latest.yml"
// | Linux => "latest-linux.yml"
// | OSX => "latest-mac.yml"
// };
// let distPath =
// switch (channel) {
// | Insider => ["dist", "insider"]
// | Stable => ["dist"]
// };
// let subPathServer =
// switch (channel) {
// | Insider => "insider/"
// | Stable => ""
// };
// let serverPath = "./update.optolith.app/" ++ subPathServer ++ subFolder;
// let regex =
// switch (channel) {
// | Insider =>
// switch (os) {
// | Windows =>
// %re
// "/^OptolithInsiderSetup_(.+)\\.exe$/"
// | Linux =>
// %re
// "/^OptolithInsider_(.+)\\.(?:AppImage|tar\\.gz)$/"
// | OSX =>
// %re
// "/^OptolithInsider_(.+)\\.(?:zip|dmg)$/"
// }
// | Stable =>
// switch (os) {
// | Windows =>
// %re
// "/^OptolithSetup_(.+)\\.exe$/"
// | Linux =>
// %re
// "/^Optolith_(.+)\\.(?:AppImage|tar\\.gz)$/"
// | OSX =>
// %re
// "/^Optolith_(.+)\\.(?:zip|dmg)$/"
// }
// };
// let recreateFileNames =
// switch (channel) {
// | Insider =>
// switch (os) {
// | Windows => (v => ["OptolithInsiderSetup_" ++ v ++ ".exe"])
// | Linux => (
// v => [
// "OptolithInsider_" ++ v ++ ".AppImage",
// "OptolithInsider_" ++ v ++ ".tar.gz",
// ]
// )
// | OSX => (
// v => [
// "OptolithInsider_" ++ v ++ ".dmg",
// "OptolithInsider_" ++ v ++ ".zip",
// ]
// )
// }
// | Stable =>
// switch (os) {
// | Windows => (v => ["OptolithSetup_" ++ v ++ ".exe"])
// | Linux => (
// v => [
// "Optolith_" ++ v ++ ".AppImage",
// "Optolith_" ++ v ++ ".tar.gz",
// ]
// )
// | OSX => (
// v => ["Optolith_" ++ v ++ ".dmg", "Optolith_" ++ v ++ ".zip"]
// )
// }
// };
// ();
// // const allFiles = await fs.promises.readdir (path.join (...distPath))
// // const allInstallerNames = allFiles .filter (fileName => regex .test (fileName))
// // const allInstallerVersionsSorted =
// // allInstallerNames .map (fileName => regex .exec (fileName) [1])
// // .sort (semver .rcompare)
// // if (allInstallerVersionsSorted .length < 1) {
// // throw new RangeError ("Array of sorted installer versions is empty")
// // }
// // const latestFileNames = recreateFileNames (allInstallerVersionsSorted [0])
// // console.log(`Files to upload: ${[updateYmlName, ...latestFileNames] .join (", ")}`);
// // // Actual server connection
// // const client = new Client ()
// // console.log("Connecting to server...");
// // await client.connect ({
// // host: process.env.HOST,
// // port: 22,
// // username: process.env.USERNAME,
// // password: process.env.PASSWORD
// // })
// // console.log(`Server connection established`);
// // for (const fileName of latestFileNames) {
// // console.log(`Uploading ${fileName}`);
// // const stream = fs.readFileSync (path.join (...distPath, fileName))
// // const fileRes = await client.put (stream, `${serverPath}/${fileName}`)
// // console.log(`Upload done: ${fileName} (${fileRes})`);
// // }
// // console.log(`Uploading ${updateYmlName}`);
// // const updateYml = fs.readFileSync (path.join (...distPath, updateYmlName))
// // const ymlRes = await client.put (updateYml, `${serverPath}/${updateYmlName}`)
// // console.log(`Upload done: ${updateYmlName} (${ymlRes})`);
// // await client.end ()
// // console.log("Closed server connection.");
// };
// };
// module Stable = {
// let config: ElectronBuilder.Config.t = {
// appId: Some("com.lukasobermann.optolith"),
// productName: Some("Optolith"),
// copyright:
// Some(
// "This product was created under a license. Das Schwarze Auge and its logo as well as Aventuria, Dere, Myranor, Riesland, Tharun and Uthuria and their logos are trademarks of Significant GbR. The title and contents of this book are protected under the copyright laws of the United States of America. No part of this publication may be reproduced, stored in retrieval systems or transmitted, in any form or by any means, whether electronic, mechanical, photocopy, recording, or otherwise, without prior written consent by Ulisses Spiele GmbH, Waldems. This publication includes material that is protected under copyright laws by Ulisses Spiele and/or other authors. Such material is used under the Community Content Agreement for the SCRIPTORIUM AVENTURIS. All other original materials in this work is copyright 2017-present by Lukas Obermann and published under the Community Content Agreement for the SCRIPTORIUM AVENTURIS.",
// ),
// directories:
// Some({buildResources: None, output: Some("dist"), app: None}),
// files: Some([|"app/**/*"|]),
// mac:
// Some({
// artifactName: Some("Optolith_${version}.${ext}"),
// category: Some("public.app-category.role-playing-games"),
// target: Some("default"),
// icon: Some("app/icon.icns"),
// type_: Some("distribution"),
// hardenedRuntime: Some(true),
// gatekeeperAssess: Some(false),
// }),
// dmg: Some({sign: Some(false)}),
// win:
// Some({
// artifactName: Some("OptolithSetup_${version}.${ext}"),
// target: Some([|{target: "nsis", arch: Some([|"x64", "ia32"|])}|]),
// icon: Some("app/icon.ico"),
// }),
// nsis:
// Some({perMachine: Some(true), deleteAppDataOnUninstall: Some(false)}),
// linux:
// Some({
// artifactName: Some("Optolith_${version}.${ext}"),
// category: Some("RolePlaying"),
// target:
// Some([|
// {target: "AppImage", arch: Some([|"x64"|])},
// {target: "tar.gz", arch: Some([|"x64"|])},
// |]),
// executableName: Some("Optolith"),
// icon: Some("app"),
// }),
// publish:
// Some({
// provider: "generic",
// url:
// Belt.Option.getWithDefault(
// Js.Dict.get(Node.Process.process##env, "PUBLISH_URL"),
// "",
// ),
// channel: Some("latest"),
// useMultipleRangeRequest: None,
// }),
// };
// let buildWindows = (): Js.Promise.t(unit) => {
// Js.log("Building Optolith for Windows...");
// ElectronBuilder.build({
// config,
// targets: ElectronBuilder.Platform.WINDOWS.createTarget(),
// })
// |> Js.Promise.then_(x => {
// Js.log("Optolith Build for Windows successful.");
// x |> ignore |> Js.Promise.resolve;
// })
// |> Js.Promise.then_(_ =>
// Js.Promise.resolve(Publisher.publishToServer(Stable, Windows))
// )
// |> Js.Promise.then_(_ => {
// Js.log("Optolith Build for Windows deployed.");
// Js.Promise.resolve();
// });
// };
// let buildLinux = (): Js.Promise.t(unit) => {
// Js.log("Building Optolith for Linux...");
// ElectronBuilder.build({
// config,
// targets: ElectronBuilder.Platform.LINUX.createTarget(),
// })
// |> Js.Promise.then_(x => {
// Js.log("Optolith Build for Linux successful.");
// x |> ignore |> Js.Promise.resolve;
// })
// |> Js.Promise.then_(_ =>
// Js.Promise.resolve(Publisher.publishToServer(Stable, Linux))
// )
// |> Js.Promise.then_(_ => {
// Js.log("Optolith Build for Linux deployed.");
// Js.Promise.resolve();
// });
// };
// let buildMac = (): Js.Promise.t(unit) => {
// Js.log("Building Optolith for OSX...");
// ElectronBuilder.build({
// config,
// targets: ElectronBuilder.Platform.MAC.createTarget(),
// })
// |> Js.Promise.then_(x => {
// Js.log("Optolith Build for OSX successful.");
// x |> ignore |> Js.Promise.resolve;
// })
// |> Js.Promise.then_(_ =>
// Js.Promise.resolve(Publisher.publishToServer(Stable, OSX))
// )
// |> Js.Promise.then_(_ => {
// Js.log("Optolith Build for OSX deployed.");
// Js.Promise.resolve();
// });
// };
// };
+52
View File
@@ -0,0 +1,52 @@
// @ts-check
/**
* @param {"prerelease" | "stable"} channel
*/
const channelSuffix = channel => {
switch (channel) {
case "prerelease": return "Insider"
case "stable": return ""
}
}
/**
* @param {import("./platform.mjs").System} os
* @param {"prerelease" | "stable"} channel
*/
const prefix = (os, channel) => {
switch (os) {
case "win": return `Optolith${channelSuffix(channel)}Setup`
case "linux":
case "mac": return `Optolith${channelSuffix(channel)}`
}
}
/**
* @param {import("./platform.mjs").System} os
*/
const extensions = os => {
switch (os) {
case "win": return [".exe", ".exe.blockmap"]
case "linux": return [".AppImage", ".tar.gz"]
case "mac": return [".dmg", ".dmg.blockmap", ".zip", ".zip.blockmap"]
}
}
/**
* @param {import("./platform.mjs").System} os
* @param {"prerelease" | "stable"} channel
* @param {string} version
*/
export const getApplicationFileNames = (os, channel, version) =>
extensions(os).map(ext => `${prefix(os, channel)}_${version}${ext}`)
/**
* @param {"win" | "mac" | "linux"} os
*/
export const getUpdateFileName = os => {
switch (os) {
case "win": return "latest.yml"
case "linux": return "latest-linux.yml"
default: return "latest-mac.yml"
}
}
-73
View File
@@ -1,73 +0,0 @@
/**
* @type {import ("electron-builder") .Configuration}
*/
module.exports = {
appId: "com.lukasobermann.optolith",
productName: "Optolith",
copyright: "This product was created under a license. Das Schwarze Auge and its logo as well as Aventuria, Dere, Myranor, Riesland, Tharun and Uthuria and their logos are trademarks of Significant GbR. The title and contents of this book are protected under the copyright laws of the United States of America. No part of this publication may be reproduced, stored in retrieval systems or transmitted, in any form or by any means, whether electronic, mechanical, photocopy, recording, or otherwise, without prior written consent by Ulisses Spiele GmbH, Waldems. This publication includes material that is protected under copyright laws by Ulisses Spiele and/or other authors. Such material is used under the Community Content Agreement for the SCRIPTORIUM AVENTURIS. All other original materials in this work is copyright 2017-present by Lukas Obermann and published under the Community Content Agreement for the SCRIPTORIUM AVENTURIS.",
directories: {
output: "dist"
},
files: [
"app/**/*",
"LICENSE"
],
win: {
target: [
{
target: "nsis",
arch: [
"x64",
"ia32"
]
}
],
icon: "app/icon.ico",
artifactName: "OptolithSetup_${version}.${ext}"
},
nsis: {
perMachine: true,
differentialPackage: true,
deleteAppDataOnUninstall: false,
},
linux: {
category: "RolePlaying",
executableName: "Optolith",
icon: "app",
target: [
{
target: "AppImage",
arch: [
"x64"
]
},
{
target: "tar.gz",
arch: [
"x64"
]
}
],
artifactName: "Optolith_${version}.${ext}"
},
mac: {
category: "public.app-category.role-playing-games",
type: "distribution",
icon: "app/icon.icns",
target: "default",
artifactName: "Optolith_${version}.${ext}",
hardenedRuntime: true,
// entitlements: "deploy/entitlements.mac.plist",
// entitlementsInherit: "deploy/entitlements.mac.plist",
gatekeeperAssess: false,
},
dmg: {
sign: false,
},
publish: {
"provider": "generic",
"url": `${process.env.UPDATE_URL}/\${os}`,
"channel": "latest"
},
// afterSign: notarize,
}
+83
View File
@@ -0,0 +1,83 @@
// @ts-check
import { notarize } from "./notarize.mjs"
/**
* @type {import("electron-builder").Configuration}
*/
const config = {
appId: "com.lukasobermann.optolith",
productName: "Optolith",
copyright: "© 2017present Lukas Obermann. This product was created under a license. Das Schwarze Auge and its logo as well as Aventuria, Dere, Myranor, Riesland, Tharun and Uthuria and their logos are trademarks of Significant GbR. The title and contents of this book are protected under the copyright laws of the United States of America. No part of this publication may be reproduced, stored in retrieval systems or transmitted, in any form or by any means, whether electronic, mechanical, photocopy, recording, or otherwise, without prior written consent by Ulisses Spiele GmbH, Waldems. This publication includes material that is protected under copyright laws by Ulisses Spiele and/or other authors. Such material is used under the Community Content Agreement for the SCRIPTORIUM AVENTURIS. All other original materials in this work is copyright 2017-present by Lukas Obermann and published under the Community Content Agreement for the SCRIPTORIUM AVENTURIS.",
directories: {
output: "dist"
},
files: [
"app/**/*",
"LICENSE"
],
win: {
target: [
{
target: "nsis",
arch: [
"x64",
"ia32"
]
}
],
icon: "app/icon.ico",
artifactName: "OptolithSetup_${version}.${ext}"
},
nsis: {
perMachine: true,
differentialPackage: true,
deleteAppDataOnUninstall: false,
},
linux: {
category: "RolePlaying",
executableName: "Optolith",
icon: "app",
target: [
{
target: "AppImage",
arch: [
"x64"
]
},
{
target: "tar.gz",
arch: [
"x64"
]
}
],
artifactName: "Optolith_${version}.${ext}"
},
mac: {
category: "public.app-category.role-playing-games",
type: "distribution",
icon: "app/icon.icns",
target: [
{
target: "default",
arch: "universal"
}
],
artifactName: "Optolith_${version}.${ext}",
entitlements: "deploy/entitlements.mac.plist",
entitlementsInherit: "deploy/entitlements.mac.plist",
hardenedRuntime: true,
gatekeeperAssess: false,
},
dmg: {
sign: false
},
publish: {
"provider": "generic",
"url": `${process.env.UPDATE_URL}/\${os}`,
"channel": "latest"
},
afterSign: notarize,
}
export default config
+10 -7
View File
@@ -1,6 +1,6 @@
// @ts-check
const builder = require("electron-builder")
const { getSystem } = require("./platform")
import builder from "electron-builder"
import { getSystem } from "./platform.mjs"
const [channel] = process.argv.slice(2)
@@ -10,15 +10,18 @@ if (channel !== "stable" && channel !== "prerelease") {
const config =
channel === "prerelease"
? require("./build.prerelease.config.js")
: require("./build.config.js")
? (await import("./build.prerelease.config.mjs")).default
: (await import("./build.config.mjs")).default
process.on ('unhandledRejection', error => {
throw new Error (`Unhandled promise rejection: ${error .toString ()}`);
});
throw new Error(`Unhandled promise rejection: ${/** @type {Error} */ (error).toString ()}`)
})
const os = getSystem()
const plaformKey = os === "linux" ? "LINUX" : os === "mac" ? "MAC" : "WINDOWS"
builder.build ({ config, targets: builder.Platform[plaformKey].createTarget () })
await builder.build({
config,
targets: builder.Platform[plaformKey].createTarget(),
})
@@ -1,10 +1,13 @@
// @ts-check
import { notarize } from "./notarize.mjs"
/**
* @type {import ("electron-builder") .Configuration}
*/
module.exports = {
const config = {
appId: "com.lukasobermann.optolithinsider",
productName: "Optolith Insider",
copyright: "This product was created under a license. Das Schwarze Auge and its logo as well as Aventuria, Dere, Myranor, Riesland, Tharun and Uthuria and their logos are trademarks of Significant GbR. The title and contents of this book are protected under the copyright laws of the United States of America. No part of this publication may be reproduced, stored in retrieval systems or transmitted, in any form or by any means, whether electronic, mechanical, photocopy, recording, or otherwise, without prior written consent by Ulisses Spiele GmbH, Waldems. This publication includes material that is protected under copyright laws by Ulisses Spiele and/or other authors. Such material is used under the Community Content Agreement for the SCRIPTORIUM AVENTURIS. All other original materials in this work is copyright 2017-present by Lukas Obermann and published under the Community Content Agreement for the SCRIPTORIUM AVENTURIS.",
copyright: "© 2017present Lukas Obermann. This product was created under a license. Das Schwarze Auge and its logo as well as Aventuria, Dere, Myranor, Riesland, Tharun and Uthuria and their logos are trademarks of Significant GbR. The title and contents of this book are protected under the copyright laws of the United States of America. No part of this publication may be reproduced, stored in retrieval systems or transmitted, in any form or by any means, whether electronic, mechanical, photocopy, recording, or otherwise, without prior written consent by Ulisses Spiele GmbH, Waldems. This publication includes material that is protected under copyright laws by Ulisses Spiele and/or other authors. Such material is used under the Community Content Agreement for the SCRIPTORIUM AVENTURIS. All other original materials in this work is copyright 2017-present by Lukas Obermann and published under the Community Content Agreement for the SCRIPTORIUM AVENTURIS.",
directories: {
output: "dist/insider"
},
@@ -55,20 +58,27 @@ module.exports = {
category: "public.app-category.role-playing-games",
type: "distribution",
icon: "app/icon.icns",
target: "default",
target: [
{
target: "default",
arch: "universal"
}
],
artifactName: "OptolithInsider_${version}.${ext}",
entitlements: "deploy/entitlements.mac.plist",
entitlementsInherit: "deploy/entitlements.mac.plist",
hardenedRuntime: true,
// entitlements: "deploy/entitlements.mac.plist",
// entitlementsInherit: "deploy/entitlements.mac.plist",
gatekeeperAssess: false,
},
dmg: {
sign: false,
sign: false
},
publish: {
"provider": "generic",
"url": `${process.env.UPDATE_URL}/insider/\${os}`,
"channel": "latest"
},
// afterSign: notarize,
afterSign: notarize,
}
export default config
-150
View File
@@ -1,150 +0,0 @@
// @ts-check
require("dotenv").config()
const { Client } = require ("qusly-core")
const readline = require ("readline")
const fs = require ("fs")
const path = require ("path")
const semver = require ("semver");
const { getSystem, getSystemName } = require("./platform");
const [channel] = process.argv.slice(2)
const os = getSystem()
if (channel !== "stable" && channel !== "prerelease") {
throw new TypeError (`publishToServer requires a specified channel ("stable" or "prerelease"), but it received ${channel}`)
}
if (os !== "win" && os !== "mac" && os !== "linux") {
throw new TypeError (`publishToServer requires a specified OS ("win", "mac" or "linux"), but it received ${os}`)
}
/**
* Needed env variables:
* - `HOST`
* - `USERNAME`
* - `PASSWORD`
* - `ROOT`
*/
const uploadToServer = async () => {
console.log (`Preparing to upload update files for "${getSystemName(os)}" on "${channel}" channel...`)
const subFolder = os === "win" ? "win" : os === "linux" ? "linux" : "mac"
const updateYmlName =
os === "win"
? "latest.yml"
: os === "linux"
? "latest-linux.yml"
: "latest-mac.yml"
const distPath = channel === "prerelease" ? ["dist", "insider"] : ["dist"]
const serverPath = `${process.env.ROOT}${channel === "prerelease" ? "/insider" : ""}/${subFolder}`
const regex =
channel === "prerelease"
? os === "win"
? /^OptolithInsiderSetup_(.+)\.exe$/
: os === "linux"
? /^OptolithInsider_(.+)\.(?:AppImage|tar\.gz)$/
: /^OptolithInsider_(.+)\.(?:zip|dmg)$/
: os === "win"
? /^OptolithSetup_(.+)\.exe$/
: os === "linux"
? /^Optolith_(.+)\.(?:AppImage|tar\.gz)$/
: /^Optolith_(.+)\.(?:zip|dmg)$/
const recreateFileNames =
channel === "prerelease"
? os === "win"
? /**
* @param {string} v Version
*/ v => [`OptolithInsiderSetup_${v}.exe`, `OptolithInsiderSetup_${v}.exe.blockmap`]
: os === "linux"
? /**
* @param {string} v Version
*/ v => [`OptolithInsider_${v}.AppImage`, `OptolithInsider_${v}.tar.gz`]
: /**
* @param {string} v Version
*/ v => [`OptolithInsider_${v}.dmg`, `OptolithInsider_${v}.dmg.blockmap`, `OptolithInsider_${v}.zip`]
: os === "win"
? /**
* @param {string} v Version
*/ v => [`OptolithSetup_${v}.exe`, `OptolithSetup_${v}.exe.blockmap`]
: os === "linux"
? /**
* @param {string} v Version
*/ v => [`Optolith_${v}.AppImage`, `Optolith_${v}.tar.gz`]
: /**
* @param {string} v Version
*/ v => [`Optolith_${v}.dmg`, `Optolith_${v}.dmg.blockmap`, `Optolith_${v}.zip`]
const allFiles = await fs.promises.readdir (path.join (...distPath))
const allInstallerNames = allFiles .filter (fileName => regex .test (fileName))
const allInstallerVersionsSorted =
allInstallerNames .map (fileName => regex .exec (fileName) [1])
.sort (semver .rcompare)
if (allInstallerVersionsSorted .length < 1) {
throw new RangeError ("Array of sorted installer versions is empty")
}
const latestFileNames = recreateFileNames (allInstallerVersionsSorted [0])
console.log(`Files to upload: ${[updateYmlName, ...latestFileNames] .join (", ")}.`);
// Actual server connection
const client = new Client ()
console.log("Connecting to server...");
await client.connect ({
protocol: "sftp",
host: process.env.HOST,
user: process.env.USERNAME,
password: process.env.PASSWORD,
})
let loggedProgress = false
client.addListener("progress", (progress, info) => {
if (loggedProgress) {
readline.clearLine(process.stdout, 1);
readline.cursorTo(process.stdout, 0);
}
else {
loggedProgress = true
}
process.stdout.write(`Progress: ${progress.percent}%`);
})
console.log(`Server connection established.`);
for (const fileName of latestFileNames) {
console.log(`Uploading ${fileName}`);
loggedProgress = false
const stream = fs.createReadStream (path.join (...distPath, fileName))
await client.upload (`${serverPath}/${fileName}`, stream)
console.log(`\nUpload done: ${fileName}.`);
}
console.log(`Uploading ${updateYmlName}...`);
loggedProgress = false
const updateYml = fs.createReadStream (path.join (...distPath, updateYmlName))
await client.upload (`${serverPath}/${updateYmlName}`, updateYml)
console.log(`\nUpload done: ${updateYmlName}.`);
await client.disconnect ()
console.log("Closed server connection.");
}
uploadToServer()
+52
View File
@@ -0,0 +1,52 @@
// @ts-check
import packageJson from "../package.json" assert { type: "json" }
import { getApplicationFileNames, getUpdateFileName } from "./assetNames.mjs"
import { getLocalPath } from "./localPath.mjs"
import { getSystem, getSystemName } from "./platform.mjs"
import { run, upload } from "./remoteConnection.mjs"
import { getRemotePath } from "./remotePath.mjs"
/**
* Needed env variables:
* - `HOST`
* - `USERNAME`
* - `PASSWORD`
* - `ROOT`
*
* Optional env variables:
* - `CI`
*/
const {
HOST,
USERNAME,
PASSWORD,
ROOT = "/",
CI,
} = process.env
const [channel] = process.argv.slice(2)
const os = getSystem()
if (channel !== "stable" && channel !== "prerelease") {
throw new TypeError(`publishToServer requires a specified channel ("stable" or "prerelease"), but it received ${channel}`)
}
console.log(`Preparing to upload update files for "${getSystemName(os)}" on "${channel}" channel...`)
const localDir = getLocalPath(channel)
const remoteDir = getRemotePath(ROOT, channel, os)
const updateFileName = getUpdateFileName(os)
const applicationFileNames = getApplicationFileNames(os, channel, packageJson.version)
console.log(`Files to upload: ${[updateFileName, ...applicationFileNames] .join (", ")}.`)
await run({ host: HOST, username: USERNAME, password: PASSWORD }, async client => {
for (const applicationFileName of applicationFileNames) {
await upload(client, localDir, remoteDir, applicationFileName)
}
await upload(client, localDir, remoteDir, updateFileName)
})
console.log(`Uploading files finished successfully.`)
+3 -1
View File
@@ -2,7 +2,9 @@
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>com.apple.security.cs.allow-unsigned-executable-memory</key>
<key>com.apple.security.cs.allow-jit</key>
<true/>
<key>com.apple.security.cs.debugger</key>
<true/>
</dict>
</plist>
+12
View File
@@ -0,0 +1,12 @@
// @ts-check
import { join } from "path"
/**
* @param {"prerelease" | "stable"} channel
*/
export const getLocalPath = channel => {
switch (channel) {
case "prerelease": return join("dist", "insider")
case "stable": return join("dist")
}
}
-29
View File
@@ -1,29 +0,0 @@
// @ts-check
const { notarize } = require ('electron-notarize')
/**
* @param context {import("electron-builder").AfterPackContext}
*/
exports.notarize = async context => {
const { electronPlatformName, appOutDir } = context
if (electronPlatformName === 'darwin') {
const appName = context.packager.appInfo.productFilename
console.log (`Notarizing "${appName}.app"...`)
await notarize ({
appBundleId: 'com.lukasobermann.optolith',
appPath: `${appOutDir}/${appName}.app`,
appleId: process.env.APPLEID,
appleIdPassword: process.env.APPLEIDPASS,
})
console.log (`Notarization successful`)
return
}
return
}
+25
View File
@@ -0,0 +1,25 @@
// @ts-check
import { notarize as electronNotarize } from 'electron-notarize'
/**
* @param context {import("electron-builder").AfterPackContext}
*/
export const notarize = async (context) => {
const { electronPlatformName, appOutDir } = context
if (electronPlatformName === 'darwin') {
const appName = context.packager.appInfo.productFilename
console.log(`Notarizing "${appName}.app"...`)
await electronNotarize({
tool: "notarytool",
appPath: `${appOutDir}/${appName}.app`,
appleId: /** @type {string} */ (process.env.APPLEID),
appleIdPassword: /** @type {string} */ (process.env.APPLEIDPASS),
teamId: /** @type {string} */ (process.env.TEAMID),
})
console.log(`Notarization successful`)
}
}
-32
View File
@@ -1,32 +0,0 @@
// @ts-check
const os = require ("os")
module.exports = {
/**
* @typedef {"win" | "mac" | "linux"} System
* @returns {System}
*/
getSystem: () => {
switch (os.platform()) {
case "win32":
return "win"
case "darwin":
return "mac"
default:
return "linux"
}
},
/**
* @param {System} system
*/
getSystemName: system => {
switch (system) {
case "win":
return "Windows"
case "mac":
return "macOS"
case "linux":
return "Linux"
}
}
}
+25
View File
@@ -0,0 +1,25 @@
// @ts-check
import { platform } from "os"
/**
* @typedef {"win" | "mac" | "linux"} System
* @returns {System}
*/
export const getSystem = () => {
switch (platform()) {
case "win32": return "win"
case "darwin": return "mac"
default: return "linux"
}
}
/**
* @param {System} system
*/
export const getSystemName = system => {
switch (system) {
case "win": return "Windows"
case "mac": return "macOS"
case "linux": return "Linux"
}
}
+41
View File
@@ -0,0 +1,41 @@
// @ts-check
import { join } from "path"
import { join as joinPosix } from "path/posix"
import Client from "ssh2-sftp-client"
/**
* @param {Client.ConnectOptions} options
* @param {(client: Client) => Promise<void>} action
*/
export const run = async (options, action) => {
const client = new Client()
console.log("Connecting to server ...")
await client.connect(options)
console.log(`Server connection established.`)
await action(client)
await client.end ()
console.log("Closed server connection.")
}
/**
* @param {Client} client
* @param {string} localDir
* @param {string} remoteDir
* @param {string} fileName
*/
export const upload = async (client, localDir, remoteDir, fileName) => {
console.log(`Uploading ${fileName} ...`);
await client.fastPut (
join (localDir, fileName),
joinPosix (remoteDir, fileName),
{
step: !process.env.CI ? (totalTransferred, _, total) => {
const percent = Math.floor (totalTransferred / total * 100)
console.log(`Progress: ${percent}%`);
} : undefined
}
)
console.log(`Upload done: ${fileName}.`);
}
+31
View File
@@ -0,0 +1,31 @@
// @ts-check
import { join } from "path/posix"
/**
* @param {"prerelease" | "stable"} channel
*/
const remoteChannelPath = channel => {
switch (channel) {
case "prerelease": return "insider"
case "stable": return "."
}
}
/**
* @param {import("./platform.mjs").System} os
*/
const remoteOsPath = os => {
switch (os) {
case "win": return "win"
case "linux": return "linux"
default: return "mac"
}
}
/**
* @param {string} root
* @param {"prerelease" | "stable"} channel
* @param {import("./platform.mjs").System} os
*/
export const getRemotePath = (root, channel, os) =>
join(root, remoteChannelPath(channel), remoteOsPath(os))
+3 -17
View File
@@ -1,25 +1,11 @@
// @ts-check
/**
* @typedef {import('ts-jest')}
* @type {import('@jest/types').Config.InitialOptions}
*/
/** @type {import('ts-jest/dist/types').InitialOptionsTsJest} */
module.exports = {
transform: {
"^.+\\.tsx?$": "ts-jest"
},
testRegex: "(/__tests__/.*|(\\.|/)(test|spec))\\.tsx?$",
moduleFileExtensions: [
"ts",
"tsx",
"js",
"jsx",
"json",
"node"
],
preset: "ts-jest",
testEnvironment: "node",
globals: {
"ts-jest": {
tsConfig: "tsconfig.test.json"
tsconfig: "tsconfig.test.json"
}
}
}
+21100 -5004
View File
File diff suppressed because it is too large Load Diff
+36 -40
View File
@@ -1,48 +1,46 @@
{
"name": "optolith",
"productName": "Optolith",
"version": "1.4.3-alpha.0",
"version": "1.5.2",
"description": "A generator for heroes for the P&P-RPG 'The Dark Eye'.",
"author": {
"name": "Lukas Obermann",
"email": "support@optolith.app"
},
"homepage": "https://github.com/elyukai/optolith-client",
"homepage": "https://optolith.app",
"license": "MPL-2.0",
"main": "app/main.js",
"dependencies": {
"@glennsl/bs-json": "5.0.2",
"@electron/remote": "^2.0.8",
"adm-zip": "^0.5.1",
"ajv": "6.12.6",
"bs-platform": "8.3.2",
"electron-devtools-installer": "3.1.1",
"electron-log": "4.2.4",
"electron-updater": "4.3.1",
"electron-devtools-installer": "^3.2.1",
"electron-log": "^4.4.8",
"electron-updater": "^5.0.5",
"electron-window-state": "5.0.3",
"moment": "2.25.3",
"moment": "^2.29.4",
"mousetrap": "1.6.5",
"react": "16.13.1",
"react-custom-scrollbars": "4.2.1",
"react-dom": "16.13.1",
"react-markdown": "4.3.1",
"react-markdown": "^8.0.0",
"react-portal": "4.2.1",
"react-redux": "7.2.1",
"react-textfit": "1.1.0",
"reason-react": "0.9.1",
"reductive": "2.0.1",
"redux": "4.0.5",
"redux-devtools-extension": "2.13.8",
"redux-thunk": "2.3.0",
"remark-breaks": "1.0.5",
"rehype-raw": "^5.1.0",
"remark-breaks": "^2.0.2",
"remark-gfm": "^3.0.1",
"reselect": "4.0.0",
"semver": "7.3.2",
"ssh2-sftp-client": "5.3.1",
"tslib": "1.11.2",
"tslib": "^2.3.1",
"yaml": "1.10.0"
},
"devDependencies": {
"@commitlint/cli": "11.0.0",
"@commitlint/config-conventional": "11.0.0",
"@glennsl/bs-jest": "0.6.0",
"@types/classnames": "2.2.11",
"@types/jest": "26.0.15",
"@types/mousetrap": "1.6.4",
@@ -53,29 +51,30 @@
"@types/react-portal": "4.0.2",
"@types/react-redux": "7.1.11",
"@types/semver": "7.3.4",
"@typescript-eslint/eslint-plugin": "4.7.0",
"@typescript-eslint/parser": "4.7.0",
"@typescript-eslint/eslint-plugin": "^5.10.0",
"@typescript-eslint/parser": "^5.10.0",
"custom-env": "2.0.1",
"dotenv": "8.2.0",
"electron": "10.1.5",
"electron-builder": "22.9.1",
"electron-notarize": "0.3.0",
"eslint": "7.13.0",
"eslint-plugin-react": "7.21.5",
"eslint-plugin-react-hooks": "4.2.0",
"electron": "^19.0.8",
"electron-builder": "^23.1.0",
"electron-notarize": "^1.2.1",
"eslint": "^8.7.0",
"eslint-plugin-react": "^7.28.0",
"eslint-plugin-react-hooks": "^4.3.0",
"eslint-plugin-tsdoc": "^0.2.14",
"fs-extra": "9.0.1",
"gentype": "3.38.0",
"html-webpack-plugin": "4.5.0",
"husky": "4.3.0",
"jest": "26.4.2",
"qusly-core": "2.5.2",
"html-webpack-plugin": "^5.5.0",
"husky": "^4.3.8",
"jest": "^26.6.3",
"sass": "1.29.0",
"standard-version": "9.0.0",
"ts-jest": "26.4.4",
"ts-loader": "8.0.11",
"typescript": "3.8.3",
"webpack": "5.4.0",
"webpack-cli": "4.2.0"
"ssh2-sftp-client": "^9.0.1",
"standard-version": "^9.3.1",
"ts-jest": "^26.5.6",
"ts-loader": "^9.2.6",
"typescript": "^4.5.5",
"webpack": "^5.67.0",
"webpack-cli": "^4.9.2"
},
"scripts": {
"prerelease:win": "set NODE_ENV=development && node ./deploy/buildInsiderWin.js",
@@ -86,20 +85,17 @@
"stable:mac": "NODE_ENV=production node ./deploy/buildMac.js",
"css:build": "sass --style=compressed src/Main.scss app/main.css",
"css:watch": "sass --watch --style=compressed src/Main.scss app/main.css",
"build": "npm run re:build && npm run css:build && npm run js:build",
"js:build": "webpack --config ./webpack.config.js",
"js:watch": "webpack -w --config ./webpack.config.js",
"build": "npm run ts:build && npm run css:build && npm run js:build",
"js:build": "webpack",
"js:watch": "webpack -w",
"ts:build": "tsc",
"ts:watch": "tsc -w",
"re:build": "bsb -make-world",
"re:watch": "bsb -make-world -w",
"re:clean": "bsb -clean-world",
"lint": "eslint \"src/\" --ext \".ts\" --ext \".tsx\"",
"start": "electron .",
"test": "jest",
"circ": "madge -c ./src",
"release:main": "standard-version --skip.commit --skip.tag",
"release:pre": "standard-version --prerelease=alpha --skip.changelog"
"release:pre": "standard-version --prerelease=alpha"
},
"repository": "github:elyukai/optolith-client",
"husky": {
+7 -4
View File
@@ -1,5 +1,6 @@
import { remote } from "electron"
import { Just, Nothing } from "../../Data/Maybe"
import * as remote from "@electron/remote"
import { Just } from "../../Data/Maybe"
import { getCurrentHeroId } from "../Selectors/stateSelectors"
import { getIsHeroSection } from "../Selectors/uilocationSelectors"
import { TabId } from "../Utilities/LocationUtils"
import { isDialogOpen } from "../Utilities/SubwindowsUtils"
@@ -24,8 +25,10 @@ export const redoAccelerator = (): ReduxAction => (dispatch, getState) => {
export const saveHeroAccelerator: ReduxAction<Promise<void>> =
async (dispatch, getState) => {
if (!isDialogOpen () && getIsHeroSection (getState ())) {
await dispatch (saveHero (Nothing))
const heroId = getCurrentHeroId (getState ())
if (!isDialogOpen () && getIsHeroSection (getState ()) && heroId.isJust) {
await dispatch (saveHero (heroId.value))
}
}
-2
View File
@@ -1,2 +0,0 @@
// Generated by ReScript, PLEASE EDIT WITH CARE
/* This output is empty. Its source's type definitions, externals and/or unused code got optimized away. */
-120
View File
@@ -1,120 +0,0 @@
type action =
| SetLocale(Either.t(string, string))
| SwitchActiveItemHints
| SetTheme(FilterOptions.theme)
| SwitchEditingHeroAfterCreationPhase
| SwitchAnimations
| SetTab(FilterOptions.tab)
| SetHeroListSortOrder(FilterOptions.heroListSortOptions)
| SetHeroListVisibilityFilter(FilterOptions.heroListVisibilityFilter)
| SetHeroListFilterText(string)
| CreateHero(Hero.t)
| OpenHero(int)
| SaveHero(int)
| DeleteHero(int)
| DuplicateHero(int)
| UndoHeroAction
| RedoHeroAction
| SetHeroName(string)
| SetCustomProfessionName(string)
| SetFamily(string)
| SetPlaceOfBirth(string)
| SetDateOfBirth(string)
| SetAge(string)
| SetHairColor(int)
| SetEyeColor(int)
| SetSize(string)
| SetWeight(string)
| SetTitle(string)
| SetSocialStatus(int)
| SetCharacteristics(string)
| SetOtherInfo(string)
| SetCultureAreaKnowledge(string)
| AddAdventurePoints(int)
| EndHeroCreation
| SetPactCategory(Maybe.t(int))
| SetPactLevel(int)
| SetPactTargetType(int)
| SetTargetDomain(int)
| SetCustomTargetDomain(string)
| SetTargetName(string)
| SetRace(int)
| SetRaceVariant(int)
| SetRacesSortOrder(FilterOptions.racesSortOptions)
| SetRacesFilterText(string)
| SetCulture(int)
| SetCulturesSortOrder(FilterOptions.culturesSortOptions)
| SetCulturesVisibilityFilter(FilterOptions.culturesVisibilityFilter)
| SetCulturesFilterText(string)
| SetProfession(int)
| SetProfessionVariant(int)
| SetProfessionsSortOrder(FilterOptions.professionsSortOptions)
| SetProfessionsVisibilityFilter(FilterOptions.professionsVisibilityFilter)
| SetProfessionsGroupVisibilityFilter(
FilterOptions.professionsGroupVisibilityFilter,
)
| SetProfessionsFilterText(string)
| AddAttributePoint(int)
| RemoveAttributePoint(int)
| AddLifePoint
| RemoveLifePoint
| AddArcaneEnergyPoint
| RemoveArcaneEnergyPoint
| AddKarmaPoint
| RemoveKarmaPoint
| AddLostLifePoint
| RemoveLostLifePoint
| AddLostLifePoints(int)
| AddBoughtBackArcaneEnergyPoint
| RemoveBoughtBackArcaneEnergyPoint
| AddLostArcaneEnergyPoint
| RemoveLostArcaneEnergyPoint
| AddLostArcaneEnergyPoints(int)
| AddBoughtBackKarmaPoint
| RemoveBoughtBackKarmaPoint
| AddLostKarmaPoint
| RemoveLostKarmaPoint
| AddLostKarmaPoints(int)
| SetAttributeAdjustment(int)
| AddCombatTechniquePoint(int)
| RemoveCombatTechniquePoint(int)
| SetCombatTechniquesSortOrder(FilterOptions.combatTechniquesSortOptions)
| SetCombatTechniquesFilterText(string)
| AddLiturgicalChant(int)
| RemoveLiturgicalChant(int)
| AddLiturgicalChantPoint(int)
| RemoveLiturgicalChantPoint(int)
| AddBlessing(int)
| RemoveBlessing(int)
| SetLiturgicalChantsSortOrder(FilterOptions.liturgicalChantsSortOptions)
| SetActiveLiturgicalChantsFilterText(string)
| SetInactiveLiturgicalChantsFilterText(string)
| SetPetName(string)
| SetPetSize(string)
| SetPetType(string)
| SetPetSpentAp(string)
| SetPetTotalAp(string)
| SetPetCourage(string)
| SetPetSagacity(string)
| SetPetIntuition(string)
| SetPetCharisma(string)
| SetPetDexterity(string)
| SetPetAgility(string)
| SetPetConstitution(string)
| SetPetStrength(string)
| SetPetLp(string)
| SetPetAe(string)
| SetPetSpi(string)
| SetPetTou(string)
| SetPetPro(string)
| SetPetIni(string)
| SetPetMov(string)
| SetPetAttack(string)
| SetPetAt(string)
| SetPetPa(string)
| SetPetDp(string)
| SetPetReach(string)
| SetPetActions(string)
| SetPetSkills(string)
| SetPetAbilities(string)
| SetPetNotes(string);
+4 -5
View File
@@ -1,5 +1,4 @@
import { clipboard } from "electron"
import { fromLeft_, Left } from "../../Data/Either"
import { fmapF } from "../../Data/Functor"
import { List } from "../../Data/List"
import { Just, Maybe, Nothing } from "../../Data/Maybe"
@@ -180,13 +179,13 @@ export const addErrorAlert =
export const getErrorMsg =
(staticData: StaticDataRecord) =>
(message: string) =>
(error: Left<Error>): string =>
`${message} (${translate (staticData) ("general.errorcode")}: ${JSON.stringify (fromLeft_ (error))})`
(error: Error): string =>
`${message} (${translate (staticData) ("general.errorcode")}: ${JSON.stringify (error)})`
export const addDefaultErrorAlert =
(staticData: StaticDataRecord) =>
(message: string) =>
(error: Left<Error>) =>
(error: Error) =>
addErrorAlert (AlertOptions ({
message: getErrorMsg (staticData) (message) (error),
title: Just (translate (staticData) ("general.error")),
@@ -196,7 +195,7 @@ export const addDefaultErrorAlertWithTitle =
(staticData: StaticDataRecord) =>
(title: string) =>
(message: string) =>
(error: Left<Error>) =>
(error: Error) =>
addErrorAlert (AlertOptions ({
message: getErrorMsg (staticData) (message) (error),
title: Just (title),
-2
View File
@@ -1,2 +0,0 @@
// Generated by ReScript, PLEASE EDIT WITH CARE
/* This output is empty. Its source's type definitions, externals and/or unused code got optimized away. */
-23
View File
@@ -1,23 +0,0 @@
type action =
| AddAttributePoint(int)
| RemoveAttributePoint(int)
| AddLifePoint
| RemoveLifePoint
| AddArcaneEnergyPoint
| RemoveArcaneEnergyPoint
| AddKarmaPoint
| RemoveKarmaPoint
| AddLostLifePoint
| RemoveLostLifePoint
| AddLostLifePoints(int)
| AddBoughtBackArcaneEnergyPoint
| RemoveBoughtBackArcaneEnergyPoint
| AddLostArcaneEnergyPoint
| RemoveLostArcaneEnergyPoint
| AddLostArcaneEnergyPoints(int)
| AddBoughtBackKarmaPoint
| RemoveBoughtBackKarmaPoint
| AddLostKarmaPoint
| RemoveLostKarmaPoint
| AddLostKarmaPoints(int)
| SetAttributeAdjustment(int);
+4 -4
View File
@@ -8,7 +8,7 @@ import { getAvailableAPMap } from "../Selectors/adventurePointsSelectors"
import { getIsInCharacterCreation } from "../Selectors/phaseSelectors"
import { getAddedArcaneEnergyPoints, getAddedKarmaPoints, getAddedLifePoints, getCurrentHeroPresent, getWikiAttributes } from "../Selectors/stateSelectors"
import { getMissingAP } from "../Utilities/AdventurePoints/adventurePointsUtils"
import { getAPForInc } from "../Utilities/IC.gen"
import { getAPForInc, ImprovementCost } from "../Utilities/ImprovementCost"
import { getAreSufficientAPAvailableForIncrease } from "../Utilities/Increasable/increasableUtils"
import { pipe, pipe_ } from "../Utilities/pipe"
import { ReduxAction } from "./Actions"
@@ -84,7 +84,7 @@ export const addLifePoint: ReduxAction<Promise<void>> =
liftM2 (pipe (
// get AP for added points
curryN (getAPForInc) ("D"),
curryN (getAPForInc) (ImprovementCost.D),
// AP are passed to result and result finally gets the available AP
getMissingAP (getIsInCharacterCreation (state))
@@ -120,7 +120,7 @@ export const addArcaneEnergyPoint: ReduxAction<Promise<void>> =
liftM2 (pipe (
// get AP for added points
curryN (getAPForInc) ("D"),
curryN (getAPForInc) (ImprovementCost.D),
// AP are passed to result and result finally gets the available AP
getMissingAP (getIsInCharacterCreation (state))
@@ -156,7 +156,7 @@ export const addKarmaPoint: ReduxAction<Promise<void>> =
liftM2 (pipe (
// get AP for added points
curryN (getAPForInc) ("D"),
curryN (getAPForInc) (ImprovementCost.D),
// AP are passed to result and result finally gets the available AP
getMissingAP (getIsInCharacterCreation (state))
+2 -2
View File
@@ -284,14 +284,14 @@ export const removeDisAdvantage =
Race.A.eyeColors,
altF_ (() => fmapF (mrace_var) (RaceVariant.A.eyeColors)),
bindF (uncons),
fmap (fst)
fmap<Pair<number, List<number>>, number> (fst)
)
(race),
pipe (
Race.A.hairColors,
altF_ (() => fmapF (mrace_var) (RaceVariant.A.hairColors)),
bindF (uncons),
fmap (fst)
fmap<Pair<number, List<number>>, number> (fst)
)
(race)
)
+28 -24
View File
@@ -2,13 +2,14 @@ import { fmap } from "../../Data/Functor"
import { bindF, fromJust, isJust, Just, Maybe } from "../../Data/Maybe"
import { keys, lookup, lookupF, OrderedMap } from "../../Data/OrderedMap"
import { Record } from "../../Data/Record"
import { Pair } from "../../Data/Tuple"
import * as ActionTypes from "../Constants/ActionTypes"
import { IdPrefixes } from "../Constants/IdPrefixes"
import { MeleeCombatTechniqueId, RangedCombatTechniqueId } from "../Constants/Ids"
import { AttrId, MeleeCombatTechniqueId, RangedCombatTechniqueId } from "../Constants/Ids"
import { EquipmentSortOptions } from "../Models/Config"
import { EditItem } from "../Models/Hero/EditItem"
import { HitZoneArmor } from "../Models/Hero/HitZoneArmor"
import { Item } from "../Models/Hero/Item"
import { Item, Range } from "../Models/Hero/Item"
import { ItemTemplate } from "../Models/Wiki/ItemTemplate"
import { getHitZoneArmorsState, getItemEditorInstance, getItemsState, getWikiItemTemplates } from "../Selectors/stateSelectors"
import { getNewId, prefixId } from "../Utilities/IDUtils"
@@ -375,16 +376,17 @@ export const setDamageFlat = (value: string): SetDamageFlatAction => ({
export interface SetPrimaryAttributeAction {
type: ActionTypes.SET_ITEM_PRIMARY_ATTRIBUTE
payload: {
primary: Maybe<string>
primary: Maybe<AttrId | Pair<AttrId, AttrId>>
}
}
export const setPrimaryAttribute = (primary: Maybe<string>): SetPrimaryAttributeAction => ({
type: ActionTypes.SET_ITEM_PRIMARY_ATTRIBUTE,
payload: {
primary,
},
})
export const setPrimaryAttribute =
(primary: Maybe<AttrId | Pair<AttrId, AttrId>>): SetPrimaryAttributeAction => ({
type: ActionTypes.SET_ITEM_PRIMARY_ATTRIBUTE,
payload: {
primary,
},
})
export interface SetDamageThresholdAction {
type: ActionTypes.SET_ITEM_DAMAGE_THRESHOLD
@@ -510,15 +512,15 @@ export interface SetRangeAction {
type: ActionTypes.SET_ITEM_RANGE
payload: {
value: string
index: number
key: keyof Range
}
}
export const setRange = (value: string, index: number): SetRangeAction => ({
export const setRange = (value: string, key: keyof Range): SetRangeAction => ({
type: ActionTypes.SET_ITEM_RANGE,
payload: {
value,
index,
key,
},
})
@@ -716,12 +718,13 @@ export const applyItemTemplate: ReduxAction =
getItemEditorInstance,
bindF (EditItem.A.template),
bindF (lookupF (getWikiItemTemplates (getState ()))),
fmap (template => dispatch<ApplyItemTemplateAction> ({
type: ActionTypes.APPLY_ITEM_TEMPLATE,
payload: {
template,
},
}))
fmap ((template: Record<ItemTemplate>) =>
dispatch<ApplyItemTemplateAction> ({
type: ActionTypes.APPLY_ITEM_TEMPLATE,
payload: {
template,
},
}))
)
}
@@ -739,12 +742,13 @@ export const lockItemTemplate: ReduxAction =
getItemEditorInstance,
bindF (EditItem.A.template),
bindF (lookupF (getWikiItemTemplates (getState ()))),
fmap (template => dispatch<LockItemTemplateAction> ({
type: ActionTypes.LOCK_ITEM_TEMPLATE,
payload: {
template,
},
}))
fmap ((template: Record<ItemTemplate>) =>
dispatch<LockItemTemplateAction> ({
type: ActionTypes.LOCK_ITEM_TEMPLATE,
payload: {
template,
},
}))
)
}
+7 -8
View File
@@ -1,7 +1,6 @@
import { handleE } from "../../Control/Exception"
import { Either, fromLeft_, fromRight_, isLeft, isRight } from "../../Data/Either"
import { List } from "../../Data/List"
import { elem, fromJust, isJust, Just, Maybe } from "../../Data/Maybe"
import { elem, fromJust, isJust, Just } from "../../Data/Maybe"
import { lookup } from "../../Data/OrderedMap"
import { OrderedSet } from "../../Data/OrderedSet"
import { bind } from "../../System/IO"
@@ -121,7 +120,7 @@ export const loadHero = (id: string): LoadHeroAction => ({
export const saveHeroes: ReduxAction =
async (dispatch, getState) => {
await bind (handleE (dispatch (requestAllHeroesSave)))
(async res => isRight (res)
(async res => res.isRight
? dispatch (addAlert (AlertOptions ({
message: translate (getWiki (getState ()))
("header.dialogs.allsaved"),
@@ -137,12 +136,12 @@ export interface SaveHeroAction {
}
export const saveHero =
(id: Maybe<string>): ReduxAction<Promise<void>> =>
(id: string): ReduxAction<Promise<void>> =>
async (dispatch, getState) => {
await bind (handleE (dispatch (requestHeroSave (id))))
(async res => {
if (isLeft (res)) {
const err = fromLeft_ (res)
if (res.isLeft) {
const err = res.value
const title = translate (getWiki (getState ()))
("header.dialogs.saveheroeserror.title")
@@ -154,8 +153,8 @@ export const saveHero =
await dispatch (addErrorAlert (opts))
}
else if (Either.any (isJust) (res)) {
const save_id = fromJust (fromRight_ (res))
else if (isJust (res.value)) {
const save_id = fromJust (res.value)
dispatch<SaveHeroAction> ({
type: ActionTypes.SAVE_HERO,
+21 -26
View File
@@ -1,13 +1,13 @@
import { remote } from "electron"
import * as remote from "@electron/remote"
import * as fs from "fs"
import { extname, join } from "path"
import { handleE } from "../../Control/Exception"
import { Either, fromLeft_, fromRight_, isLeft, isRight } from "../../Data/Either"
import { Either, fromLeft_, fromRight_, isLeft } from "../../Data/Either"
import { flip } from "../../Data/Function"
import { fmap } from "../../Data/Functor"
import { over } from "../../Data/Lens"
import { List, notNull } from "../../Data/List"
import { alt_, bindF, elem, ensure, fromJust, isJust, isNothing, Just, listToMaybe, Maybe, maybe, Nothing } from "../../Data/Maybe"
import { bindF, elem, ensure, fromJust, isJust, Just, listToMaybe, Maybe, maybe, Nothing } from "../../Data/Maybe"
import { any, lookup, OrderedMap } from "../../Data/OrderedMap"
import { toObject } from "../../Data/Record"
import * as IO from "../../System/IO"
@@ -23,7 +23,7 @@ import { UISettingsState } from "../Models/UISettingsState"
import { StaticDataRecord } from "../Models/Wiki/WikiModel"
import { heroReducer } from "../Reducers/heroReducer"
import { user_data_path } from "../Selectors/envSelectors"
import { getCurrentHeroId, getFallbackLocaleId, getHeroes, getLocaleId, getWiki } from "../Selectors/stateSelectors"
import { getFallbackLocaleId, getHeroes, getLocaleId, getWiki } from "../Selectors/stateSelectors"
import { getUISettingsState } from "../Selectors/uisettingsSelectors"
import { prepareAPCache, prepareAPCacheForHero, writeCache } from "../Utilities/Cache"
import { translate } from "../Utilities/I18n"
@@ -37,6 +37,7 @@ import { deleteHeroFromFile, saveAllHeroesToFile, saveHeroToFile } from "../Util
import { ReduxAction } from "./Actions"
import { addAlert, addErrorAlert, addPrompt, AlertOptions, CustomPromptOptions, getErrorMsg, PromptButton } from "./AlertActions"
const UISSA = UISettingsState.A
export const requestConfigSave: ReduxAction<Promise<boolean>> =
@@ -69,13 +70,13 @@ export const requestConfigSave: ReduxAction<Promise<boolean>> =
IO.bindF (async res => {
console.log (res)
if (isLeft (res)) {
if (res.isLeft) {
const title = Just (translate (static_data) ("header.dialogs.saveconfigerror.title"))
const message = getErrorMsg (static_data)
(translate (static_data)
("header.dialogs.saveconfigerror.message"))
(res)
(res.value)
await dispatch (addErrorAlert (AlertOptions ({
title,
@@ -119,7 +120,7 @@ export const requestAllHeroesSave: ReduxAction<Promise<boolean>> =
const message = getErrorMsg (static_data)
(translate (static_data)
("header.dialogs.saveheroeserror.message"))
(res)
(fromLeft_ (res))
await dispatch (addErrorAlert (AlertOptions ({
title,
@@ -144,6 +145,7 @@ export const requestSaveCache = (all_saved: boolean): ReduxAction<Promise<Either
prepareAPCache (all_saved),
writeCache
)
.then (e => e.toOldEither ())
export interface ReceiveHeroSaveAction {
type: ActionTypes.RECEIVE_HERO_SAVE
@@ -168,20 +170,12 @@ const receiveHeroSave = (
})
export const requestHeroSave =
(mcurrent_id: Maybe<string>): ReduxAction<Promise<Maybe<string>>> =>
(id: string): ReduxAction<Promise<Maybe<string>>> =>
async (dispatch, getState) => {
const state = getState ()
const static_data = getWiki (state)
const heroes = getHeroes (state)
const mcurrent_id_alt = alt_ (mcurrent_id) (() => getCurrentHeroId (getState ()))
if (isNothing (mcurrent_id_alt)) {
return Promise.resolve (Nothing)
}
const id = fromJust (mcurrent_id_alt)
const mcache = prepareAPCacheForHero (state, id)
if (isJust (mcache)) {
@@ -194,7 +188,7 @@ export const requestHeroSave =
const message = getErrorMsg (static_data)
(translate (static_data)
("header.dialogs.saveheroeserror.message"))
(res)
(fromLeft_ (res))
await dispatch (addErrorAlert (AlertOptions ({
title,
@@ -210,13 +204,13 @@ export const requestHeroSave =
await dispatch (async (_, getState2) => writeCache (prepareAPCache (false)
(getState2 ())))
if (isLeft (cacheRes)) {
if (cacheRes.isLeft) {
const title = Just (translate (static_data) ("header.dialogs.saveheroeserror.title"))
const message = getErrorMsg (static_data)
(translate (static_data)
("header.dialogs.saveheroeserror.message"))
(cacheRes)
(cacheRes.value)
await dispatch (addErrorAlert (AlertOptions ({
title,
@@ -268,7 +262,7 @@ export const requestHeroDeletion =
const message = getErrorMsg (staticData)
(translate (staticData)
("header.dialogs.saveheroeserror.message"))
(res)
(fromLeft_ (res))
await dispatch (addErrorAlert (AlertOptions ({
title,
@@ -307,6 +301,7 @@ export const imgPathToBase64 =
return Just (path)
}
export const requestHeroExport =
(id: string): ReduxAction =>
async (dispatch, getState) => {
@@ -342,7 +337,7 @@ export const requestHeroExport =
(flip (IO.writeFile) (JSON.stringify (hero)))
(pmfilepath))
if (isRight (res)) {
if (res.isRight) {
await dispatch (addAlert (AlertOptions ({
message: translate (staticData) ("heroes.dialogs.herosaved"),
})))
@@ -353,7 +348,7 @@ export const requestHeroExport =
const message = getErrorMsg (staticData)
(translate (staticData)
("header.dialogs.saveheroeserror.message"))
(res)
(res.value)
await dispatch (addErrorAlert (AlertOptions ({
title,
@@ -395,14 +390,14 @@ export const requestHeroImport: ReduxAction<Promise<void>> =
if (isJust (mfile_path)) {
const staticData = getWiki (getState ())
const ehero = await parseHero (staticData)
const hero = await parseHero (staticData)
(fromJust (mfile_path))
if (isLeft (ehero)) {
await dispatch (addErrorAlert (fromLeft_ (ehero)))
if (hero.isLeft) {
await dispatch (addErrorAlert (hero.value))
}
else {
dispatch (receiveHeroImport (fromRight_ (ehero)))
dispatch (receiveHeroImport (hero.value))
}
}
}
+26 -28
View File
@@ -1,10 +1,9 @@
import { join } from "path"
import { handleE, toMsg } from "../../Control/Exception"
import { eitherToMaybe, fromLeft_, fromRight_, isLeft, Left } from "../../Data/Either"
import { fromLeft_, fromRight_, isLeft } from "../../Data/Either"
import { flip } from "../../Data/Function"
import { fmap } from "../../Data/Functor"
import { fromArray, intercalate, map } from "../../Data/List"
import { bindF, fromJust, fromMaybe, isJust, Just, Maybe } from "../../Data/Maybe"
import { fromJust, fromMaybe, isJust, Just, Maybe } from "../../Data/Maybe"
import { filter, keysSet, OrderedMap } from "../../Data/OrderedMap"
import { notMember } from "../../Data/OrderedSet"
import { Record } from "../../Data/Record"
@@ -23,6 +22,7 @@ import { user_data_path } from "../Selectors/envSelectors"
import { getHeroes } from "../Selectors/stateSelectors"
import { deleteCache, forceCacheIsAvailable, insertAppStateCache, insertCacheMap, insertHeroesCache, readCache } from "../Utilities/Cache"
import { getSystemLocale } from "../Utilities/IOUtils"
import { Maybe as NewMaybe } from "../Utilities/Maybe"
import { pipe, pipe_ } from "../Utilities/pipe"
import { parseConfig } from "../Utilities/Raw/JSON/Config"
import { RawHerolist } from "../Utilities/Raw/RawData"
@@ -85,17 +85,17 @@ export const requestInitialData: ReduxAction<Promise<void>> = async (dispatch, g
const did_update = await readUpdate ()
const dispatchErrorAlertOptions = async (options: Left<Record<AlertOptions>>) => {
await dispatch (addErrorAlert (fromLeft_ (options)))
const dispatchErrorAlertOptions = async (options: Record<AlertOptions>) => {
await dispatch (addErrorAlert (options))
dispatch (setLoadingDoneWithError ())
}
const dispatchError = async (err: Left<Error>) =>
dispatchErrorAlertOptions (Left (AlertOptions ({
title: Just ("Error"),
message: toMsg (fromLeft_ (err)),
})))
const dispatchError = async (err: Error) =>
dispatchErrorAlertOptions (AlertOptions ({
title: Just ("Error"),
message: toMsg (err),
}))
console.log (did_update)
@@ -103,7 +103,7 @@ export const requestInitialData: ReduxAction<Promise<void>> = async (dispatch, g
const deleted = await deleteCache ()
if (isLeft (deleted)) {
return dispatchError (deleted)
return dispatchError (fromLeft_ (deleted))
}
}
@@ -111,26 +111,26 @@ export const requestInitialData: ReduxAction<Promise<void>> = async (dispatch, g
console.log (show (update_written))
if (isLeft (update_written)) {
return dispatchError (update_written)
if (update_written.isLeft) {
return dispatchError (update_written.value)
}
const econfig = await parseConfig ()
const config = await parseConfig ()
if (isLeft (econfig)) {
return dispatchErrorAlertOptions (econfig)
if (config.isLeft) {
return dispatchErrorAlertOptions (config.value)
}
const config = fromRight_ (econfig)
console.log (show (config.value))
console.log (show (config))
const mheroes = await pipe_ (
const mheroes = (await pipe_ (
join (user_data_path, "heroes.json"),
IO.readFile,
handleE,
fmap (pipe (eitherToMaybe, bindF (parseJSON as (x: string) => Maybe<RawHerolist>)))
)
handleE
))
.toMaybe ()
.bind (x => parseJSON (x) as NewMaybe<RawHerolist>)
.toOldMaybe ()
const mcache = await readCache ()
@@ -142,7 +142,6 @@ export const requestInitialData: ReduxAction<Promise<void>> = async (dispatch, g
fromLeft_,
parseErrorsToPairStr,
pairStrErrorToAlertOptions,
Left,
dispatchErrorAlertOptions
)
}
@@ -151,8 +150,8 @@ export const requestInitialData: ReduxAction<Promise<void>> = async (dispatch, g
const estatic_data =
await parseStaticData (
fromMaybe (defaultLocale) (Config.A.locale (config)),
Config.A.fallbackLocale (config)
fromMaybe (defaultLocale) (Config.A.locale (config.value)),
Config.A.fallbackLocale (config.value)
)
if (isLeft (estatic_data)) {
@@ -161,7 +160,6 @@ export const requestInitialData: ReduxAction<Promise<void>> = async (dispatch, g
fromLeft_,
parseErrorsToPairStr,
pairStrErrorToAlertOptions,
Left,
dispatchErrorAlertOptions
)
}
@@ -170,7 +168,7 @@ export const requestInitialData: ReduxAction<Promise<void>> = async (dispatch, g
staticData: fromRight_ (estatic_data),
heroes: mheroes,
defaultLocale,
config: Just (config),
config: Just (config.value),
cache: mcache,
availableLangs: available_langs,
}
+1 -3
View File
@@ -2,7 +2,6 @@ import { bind, bindF, fromJust, isJust, isNothing, join, liftM2 } from "../../Da
import { lookup } from "../../Data/OrderedMap"
import { Record } from "../../Data/Record"
import * as ActionTypes from "../Constants/ActionTypes"
import { icFromJs } from "../Constants/Groups"
import { ChantsSortOptions } from "../Models/Config"
import { HeroModel } from "../Models/Hero/HeroModel"
import { LiturgicalChant } from "../Models/Wiki/LiturgicalChant"
@@ -10,7 +9,7 @@ import { getAvailableAPMap } from "../Selectors/adventurePointsSelectors"
import { getIsInCharacterCreation } from "../Selectors/phaseSelectors"
import { getCurrentHeroPresent, getLiturgicalChants, getWikiLiturgicalChants } from "../Selectors/stateSelectors"
import { getMissingAP } from "../Utilities/AdventurePoints/adventurePointsUtils"
import { getAPForActivatation } from "../Utilities/IC.gen"
import { getAPForActivatation } from "../Utilities/ImprovementCost"
import { getAreSufficientAPAvailableForIncrease } from "../Utilities/Increasable/increasableUtils"
import { pipe_ } from "../Utilities/pipe"
import { ReduxAction } from "./Actions"
@@ -45,7 +44,6 @@ export const addLiturgicalChant =
(pipe_ (
staticLiturgicalChant,
LiturgicalChant.A.ic,
icFromJs,
getAPForActivatation
)))
)
+4 -4
View File
@@ -1,11 +1,11 @@
import { PrintToPDFOptions } from "electron"
import { handleE } from "../../Control/Exception"
import { Either, isLeft, isRight, Right } from "../../Data/Either"
import { flip } from "../../Data/Function"
import { appendStr } from "../../Data/List"
import { isJust, maybe } from "../../Data/Maybe"
import * as IO from "../../System/IO"
import { getCurrentHeroName, getWiki } from "../Selectors/stateSelectors"
import { Either, Right } from "../Utilities/Either"
import { translate } from "../Utilities/I18n"
import { showSaveDialog, windowPrintToPDF } from "../Utilities/IOUtils"
import { pipe } from "../Utilities/pipe"
@@ -42,15 +42,15 @@ export const requestPrintHeroToPDF = (): ReduxAction<Promise<void>> =>
(pipe (flip (IO.writeFile) (data), handleE))
(path)
if (isRight (res) && isJust (path)) {
if (res.isRight && isJust (path)) {
await dispatch (addAlert (AlertOptions ({
message: translate (staticData) ("sheets.dialogs.pdfsaved"),
})))
}
else if (isLeft (res)) {
else if (res.isLeft) {
await dispatch (addDefaultErrorAlert (staticData)
(translate (staticData)
("sheets.dialogs.pdfsaveerror.title"))
(res))
(res.value))
}
}
+2 -3
View File
@@ -2,7 +2,6 @@ import { bind, bindF, fromJust, isJust, isNothing, join, liftM2 } from "../../Da
import { lookup } from "../../Data/OrderedMap"
import { Record } from "../../Data/Record"
import * as ActionTypes from "../Constants/ActionTypes"
import { icFromJs } from "../Constants/Groups"
import { SpellsSortOptions } from "../Models/Config"
import { HeroModel } from "../Models/Hero/HeroModel"
import { Cantrip } from "../Models/Wiki/Cantrip"
@@ -11,7 +10,7 @@ import { getAvailableAPMap } from "../Selectors/adventurePointsSelectors"
import { getIsInCharacterCreation } from "../Selectors/phaseSelectors"
import { getCurrentHeroPresent, getSpells, getWikiCantrips, getWikiSpells } from "../Selectors/stateSelectors"
import { getMissingAP } from "../Utilities/AdventurePoints/adventurePointsUtils"
import { getAPForActivatation } from "../Utilities/IC.gen"
import { getAPForActivatation } from "../Utilities/ImprovementCost"
import { getAreSufficientAPAvailableForIncrease } from "../Utilities/Increasable/increasableUtils"
import { pipe_ } from "../Utilities/pipe"
import { ReduxAction } from "./Actions"
@@ -43,7 +42,7 @@ export const addSpell =
bindF (hero => getAvailableAPMap (HeroModel.A.id (hero)) (state, { hero })),
join,
bindF (getMissingAP (getIsInCharacterCreation (state))
(pipe_ (staticSpell, Spell.A.ic, icFromJs, getAPForActivatation)))
(pipe_ (staticSpell, Spell.A.ic, getAPForActivatation)))
)
if (isNothing (missingAPForInc)) {
+1 -1
View File
@@ -24,7 +24,7 @@ export const setUpdateDownloadProgress =
})
enum UpdateAvailableResponse {
UpdateAndRestart, Cancel
UpdateAndRestart, Cancel
}
export const updateAvailable =
File diff suppressed because it is too large Load Diff
-2
View File
@@ -1,2 +0,0 @@
// Generated by ReScript, PLEASE EDIT WITH CARE
/* This output is empty. Its source's type definitions, externals and/or unused code got optimized away. */
-97
View File
@@ -1,97 +0,0 @@
type heroListSortOptions =
| Name
| DateModified;
type heroListVisibilityFilter =
| All
| Own
| Shared;
type racesSortOptions =
| Name
| Cost;
type culturesSortOptions =
| Name
| Cost;
type culturesVisibilityFilter =
| All
| Common;
type professionsSortOptions =
| Name
| Cost;
type professionsVisibilityFilter =
| All
| Common;
type professionsGroupVisibilityFilter =
| All
| Mundane
| Magical
| Blessed;
type skillsSortOptions =
| Name
| Group
| IC;
type specialAbilitiesSortOptions =
| Name
| Group;
type combatTechniquesSortOptions =
| Name
| Group
| IC;
type spellsSortOptions =
| Name
| Group
| Property
| IC;
type liturgicalChantsSortOptions =
| Name
| Group
| IC;
type equipmentSortOptions =
| Name
| Group
| Where
| Weight;
type theme =
| Dark
| Light;
type tab =
| Herolist
| Grouplist
| Wiki
| Faq
| Imprint
| ThirdPartyLicenses
| LastChanges
| Profile
| PersonalData
| CharacterSheet
| Pact
| Rules
| Races
| Cultures
| Professions
| Attributes
| Advantages
| Disadvantages
| Skills
| CombatTechniques
| SpecialAbilities
| Spells
| LiturgicalChants
| Equipment
| ZoneArmor
| Pets;
-31
View File
@@ -1,4 +1,3 @@
import { t as _IC } from "../Utilities/IC.gen"
export enum ProfessionGroup {
Mundane = 1,
@@ -26,36 +25,6 @@ export enum ProfessionSubGroup {
BlessedOnesOfTheTwelveGods = 1,
}
export enum IC {
A = 1,
B,
C,
D,
E,
}
export const icFromJs = (x: IC): _IC => {
switch (x) {
case IC.A: return "A"
case IC.B: return "B"
case IC.C: return "C"
case IC.D: return "D"
case IC.E: return "E"
default: throw new TypeError (`icFromJs: ${x} is not an IC`)
}
}
export const icToJs = (x: _IC): IC => {
switch (x) {
case "A": return IC.A
case "B": return IC.B
case "C": return IC.C
case "D": return IC.D
case "E": return IC.E
default: throw new TypeError (`icToJs: ${x} is not an IC`)
}
}
export enum SkillGroup {
Physical = 1,
Social = 2,
File diff suppressed because it is too large Load Diff
-88
View File
@@ -1,88 +0,0 @@
/* TypeScript file generated from Id.re by genType. */
/* eslint-disable import/first */
// tslint:disable-next-line:interface-over-type-literal
export type t =
{ NAME: "ExperienceLevel"; VAL: number }
| { NAME: "Race"; VAL: number }
| { NAME: "Culture"; VAL: number }
| { NAME: "Profession"; VAL: number }
| { NAME: "Attribute"; VAL: number }
| { NAME: "Advantage"; VAL: number }
| { NAME: "Disadvantage"; VAL: number }
| { NAME: "Skill"; VAL: number }
| { NAME: "CombatTechnique"; VAL: number }
| { NAME: "Spell"; VAL: number }
| { NAME: "Curse"; VAL: number }
| { NAME: "ElvenMagicalSong"; VAL: number }
| { NAME: "DominationRitual"; VAL: number }
| { NAME: "MagicalMelody"; VAL: number }
| { NAME: "MagicalDance"; VAL: number }
| { NAME: "RogueSpell"; VAL: number }
| { NAME: "AnimistForce"; VAL: number }
| { NAME: "GeodeRitual"; VAL: number }
| { NAME: "ZibiljaRitual"; VAL: number }
| { NAME: "Cantrip"; VAL: number }
| { NAME: "LiturgicalChant"; VAL: number }
| { NAME: "Blessing"; VAL: number }
| { NAME: "SpecialAbility"; VAL: number }
| { NAME: "Item"; VAL: number }
| { NAME: "EquipmentPackage"; VAL: number }
| { NAME: "HitZoneArmor"; VAL: number }
| { NAME: "Familiar"; VAL: number }
| { NAME: "Animal"; VAL: number }
| { NAME: "FocusRule"; VAL: number }
| { NAME: "OptionalRule"; VAL: number }
| { NAME: "Condition"; VAL: number }
| { NAME: "State"; VAL: number };
export type Id = t;
// tslint:disable-next-line:interface-over-type-literal
export type activatable =
{ NAME: "Advantage"; VAL: number }
| { NAME: "Disadvantage"; VAL: number }
| { NAME: "SpecialAbility"; VAL: number };
export type ActivatableId = activatable;
// tslint:disable-next-line:interface-over-type-literal
export type activatableAndSkill =
{ NAME: "Advantage"; VAL: number }
| { NAME: "Disadvantage"; VAL: number }
| { NAME: "SpecialAbility"; VAL: number }
| { NAME: "Spell"; VAL: number }
| { NAME: "LiturgicalChant"; VAL: number };
export type ActivatableAndSkillId = activatableAndSkill;
// tslint:disable-next-line:interface-over-type-literal
export type activatableSkill =
{ NAME: "Spell"; VAL: number }
| { NAME: "LiturgicalChant"; VAL: number };
export type ActivatableSkillId = activatableSkill;
// tslint:disable-next-line:interface-over-type-literal
export type permanentSkill =
{ NAME: "Skill"; VAL: number }
| { NAME: "CombatTechnique"; VAL: number };
export type PermanentSkillId = permanentSkill;
// tslint:disable-next-line:interface-over-type-literal
export type selectOption =
{ NAME: "Generic"; VAL: number }
| { NAME: "Skill"; VAL: number }
| { NAME: "CombatTechnique"; VAL: number }
| { NAME: "Spell"; VAL: number }
| { NAME: "Cantrip"; VAL: number }
| { NAME: "LiturgicalChant"; VAL: number }
| { NAME: "Blessing"; VAL: number };
export type SelectOptionId = selectOption;
// tslint:disable-next-line:interface-over-type-literal
export type hitZoneArmorZoneItem =
{ tag: "Template"; value: number }
| { tag: "Custom"; value: number };
export type HitZoneArmorZoneItemId = hitZoneArmorZoneItem;
// tslint:disable-next-line:interface-over-type-literal
export type phase = "Outline" | "Definition" | "Advancement";
export type Phase = phase;
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
-956
View File
@@ -1,956 +0,0 @@
/* TypeScript file generated from Ids.re by genType. */
/* eslint-disable import/first */
// tslint:disable-next-line:no-var-requires
const IdsBS = require('./Ids.bs');
// tslint:disable-next-line:interface-over-type-literal
export type id =
{ NAME: "ExperienceLevel"; VAL: number }
| { NAME: "Race"; VAL: number }
| { NAME: "Culture"; VAL: number }
| { NAME: "Profession"; VAL: number }
| { NAME: "Attribute"; VAL: number }
| { NAME: "Advantage"; VAL: number }
| { NAME: "Disadvantage"; VAL: number }
| { NAME: "Skill"; VAL: number }
| { NAME: "CombatTechnique"; VAL: number }
| { NAME: "Spell"; VAL: number }
| { NAME: "Curse"; VAL: number }
| { NAME: "ElvenMagicalSong"; VAL: number }
| { NAME: "DominationRitual"; VAL: number }
| { NAME: "MagicalMelody"; VAL: number }
| { NAME: "MagicalDance"; VAL: number }
| { NAME: "RogueSpell"; VAL: number }
| { NAME: "AnimistForce"; VAL: number }
| { NAME: "GeodeRitual"; VAL: number }
| { NAME: "ZibiljaRitual"; VAL: number }
| { NAME: "Cantrip"; VAL: number }
| { NAME: "LiturgicalChant"; VAL: number }
| { NAME: "Blessing"; VAL: number }
| { NAME: "SpecialAbility"; VAL: number }
| { NAME: "Item"; VAL: number }
| { NAME: "EquipmentPackage"; VAL: number }
| { NAME: "HitZoneArmor"; VAL: number }
| { NAME: "Familiar"; VAL: number }
| { NAME: "Animal"; VAL: number }
| { NAME: "FocusRule"; VAL: number }
| { NAME: "OptionalRule"; VAL: number }
| { NAME: "Condition"; VAL: number }
| { NAME: "State"; VAL: number };
export type Id = id;
// tslint:disable-next-line:interface-over-type-literal
export type activatableId =
{ NAME: "Advantage"; VAL: number }
| { NAME: "Disadvantage"; VAL: number }
| { NAME: "SpecialAbility"; VAL: number };
export type ActivatableId = activatableId;
// tslint:disable-next-line:interface-over-type-literal
export type activatableAndSkillId =
{ NAME: "Advantage"; VAL: number }
| { NAME: "Disadvantage"; VAL: number }
| { NAME: "SpecialAbility"; VAL: number }
| { NAME: "Spell"; VAL: number }
| { NAME: "LiturgicalChant"; VAL: number };
export type ActivatableAndSkillId = activatableAndSkillId;
// tslint:disable-next-line:interface-over-type-literal
export type activatableSkillId =
{ NAME: "Spell"; VAL: number }
| { NAME: "LiturgicalChant"; VAL: number };
export type ActivatableSkillId = activatableSkillId;
// tslint:disable-next-line:interface-over-type-literal
export type skillId =
{ NAME: "Skill"; VAL: number }
| { NAME: "CombatTechnique"; VAL: number };
export type SkillId = skillId;
// tslint:disable-next-line:interface-over-type-literal
export type selectOptionId =
{ NAME: "Generic"; VAL: number }
| { NAME: "Skill"; VAL: number }
| { NAME: "CombatTechnique"; VAL: number }
| { NAME: "Spell"; VAL: number }
| { NAME: "Cantrip"; VAL: number }
| { NAME: "LiturgicalChant"; VAL: number }
| { NAME: "Blessing"; VAL: number };
export type SelectOptionId = selectOptionId;
// tslint:disable-next-line:interface-over-type-literal
export type hitZoneArmorZoneItemId =
{ tag: "Template"; value: number }
| { tag: "Custom"; value: number };
export type HitZoneArmorZoneItemId = hitZoneArmorZoneItemId;
// tslint:disable-next-line:interface-over-type-literal
export type Phase_t = "Outline" | "Definition" | "Advancement";
export type Phase = Phase_t;
export const Phase_rcp: number = IdsBS.Phase.rcp;
export const Phase_creation: number = IdsBS.Phase.creation;
export const Phase_inGame: number = IdsBS.Phase.inGame;
export const ExperienceLevelId_inexperienced: string = IdsBS.ExperienceLevelId.inexperienced;
export const ExperienceLevelId_ordinary: string = IdsBS.ExperienceLevelId.ordinary;
export const ExperienceLevelId_experienced: string = IdsBS.ExperienceLevelId.experienced;
export const ExperienceLevelId_competent: string = IdsBS.ExperienceLevelId.competent;
export const ExperienceLevelId_masterly: string = IdsBS.ExperienceLevelId.masterly;
export const ExperienceLevelId_brilliant: string = IdsBS.ExperienceLevelId.brilliant;
export const ExperienceLevelId_legendary: string = IdsBS.ExperienceLevelId.legendary;
export const RaceId_humans: string = IdsBS.RaceId.humans;
export const RaceId_elves: string = IdsBS.RaceId.elves;
export const RaceId_halfElves: string = IdsBS.RaceId.halfElves;
export const RaceId_dwarves: string = IdsBS.RaceId.dwarves;
export const CultureId_gladeElves: string = IdsBS.CultureId.gladeElves;
export const CultureId_firnelves: string = IdsBS.CultureId.firnelves;
export const CultureId_woodElves: string = IdsBS.CultureId.woodElves;
export const CultureId_steppenelfen: string = IdsBS.CultureId.steppenelfen;
export const ProfessionId_customProfession: string = IdsBS.ProfessionId.customProfession;
export const AttrId_courage: string = IdsBS.AttrId.courage;
export const AttrId_sagacity: string = IdsBS.AttrId.sagacity;
export const AttrId_intuition: string = IdsBS.AttrId.intuition;
export const AttrId_charisma: string = IdsBS.AttrId.charisma;
export const AttrId_dexterity: string = IdsBS.AttrId.dexterity;
export const AttrId_agility: string = IdsBS.AttrId.agility;
export const AttrId_constitution: string = IdsBS.AttrId.constitution;
export const AttrId_strength: string = IdsBS.AttrId.strength;
export const DCId_lifePoints: string = IdsBS.DCId.lifePoints;
export const DCId_arcaneEnergy: string = IdsBS.DCId.arcaneEnergy;
export const DCId_karmaPoints: string = IdsBS.DCId.karmaPoints;
export const DCId_spirit: string = IdsBS.DCId.spirit;
export const DCId_toughness: string = IdsBS.DCId.toughness;
export const DCId_dodge: string = IdsBS.DCId.dodge;
export const DCId_initiative: string = IdsBS.DCId.initiative;
export const DCId_movement: string = IdsBS.DCId.movement;
export const DCId_woundThreshold: string = IdsBS.DCId.woundThreshold;
export const AdvantageId_aptitude: string = IdsBS.AdvantageId.aptitude;
export const AdvantageId_nimble: string = IdsBS.AdvantageId.nimble;
export const AdvantageId_blessed: string = IdsBS.AdvantageId.blessed;
export const AdvantageId_luck: string = IdsBS.AdvantageId.luck;
export const AdvantageId_exceptionalSkill: string = IdsBS.AdvantageId.exceptionalSkill;
export const AdvantageId_exceptionalCombatTechnique: string = IdsBS.AdvantageId.exceptionalCombatTechnique;
export const AdvantageId_increasedAstralPower: string = IdsBS.AdvantageId.increasedAstralPower;
export const AdvantageId_increasedKarmaPoints: string = IdsBS.AdvantageId.increasedKarmaPoints;
export const AdvantageId_increasedLifePoints: string = IdsBS.AdvantageId.increasedLifePoints;
export const AdvantageId_increasedSpirit: string = IdsBS.AdvantageId.increasedSpirit;
export const AdvantageId_increasedToughness: string = IdsBS.AdvantageId.increasedToughness;
export const AdvantageId_immunityToPoison: string = IdsBS.AdvantageId.immunityToPoison;
export const AdvantageId_immunityToDisease: string = IdsBS.AdvantageId.immunityToDisease;
export const AdvantageId_magicalAttunement: string = IdsBS.AdvantageId.magicalAttunement;
export const AdvantageId_rich: string = IdsBS.AdvantageId.rich;
export const AdvantageId_sociallyAdaptable: string = IdsBS.AdvantageId.sociallyAdaptable;
export const AdvantageId_inspireConfidence: string = IdsBS.AdvantageId.inspireConfidence;
export const AdvantageId_weaponAptitude: string = IdsBS.AdvantageId.weaponAptitude;
export const AdvantageId_spellcaster: string = IdsBS.AdvantageId.spellcaster;
export const AdvantageId_unyielding: string = IdsBS.AdvantageId.unyielding;
export const AdvantageId_largeSpellSelection: string = IdsBS.AdvantageId.largeSpellSelection;
export const AdvantageId_hatredOf: string = IdsBS.AdvantageId.hatredOf;
export const AdvantageId_prediger: string = IdsBS.AdvantageId.prediger;
export const AdvantageId_visionaer: string = IdsBS.AdvantageId.visionaer;
export const AdvantageId_zahlreichePredigten: string = IdsBS.AdvantageId.zahlreichePredigten;
export const AdvantageId_zahlreicheVisionen: string = IdsBS.AdvantageId.zahlreicheVisionen;
export const AdvantageId_leichterGang: string = IdsBS.AdvantageId.leichterGang;
export const AdvantageId_einkommen: string = IdsBS.AdvantageId.einkommen;
export const DisadvantageId_afraidOf: string = IdsBS.DisadvantageId.afraidOf;
export const DisadvantageId_poor: string = IdsBS.DisadvantageId.poor;
export const DisadvantageId_slow: string = IdsBS.DisadvantageId.slow;
export const DisadvantageId_noFlyingBalm: string = IdsBS.DisadvantageId.noFlyingBalm;
export const DisadvantageId_noFamiliar: string = IdsBS.DisadvantageId.noFamiliar;
export const DisadvantageId_magicalRestriction: string = IdsBS.DisadvantageId.magicalRestriction;
export const DisadvantageId_decreasedArcanePower: string = IdsBS.DisadvantageId.decreasedArcanePower;
export const DisadvantageId_decreasedKarmaPoints: string = IdsBS.DisadvantageId.decreasedKarmaPoints;
export const DisadvantageId_decreasedLifePoints: string = IdsBS.DisadvantageId.decreasedLifePoints;
export const DisadvantageId_decreasedSpirit: string = IdsBS.DisadvantageId.decreasedSpirit;
export const DisadvantageId_decreasedToughness: string = IdsBS.DisadvantageId.decreasedToughness;
export const DisadvantageId_badLuck: string = IdsBS.DisadvantageId.badLuck;
export const DisadvantageId_personalityFlaw: string = IdsBS.DisadvantageId.personalityFlaw;
export const DisadvantageId_principles: string = IdsBS.DisadvantageId.principles;
export const DisadvantageId_badHabit: string = IdsBS.DisadvantageId.badHabit;
export const DisadvantageId_negativeTrait: string = IdsBS.DisadvantageId.negativeTrait;
export const DisadvantageId_stigma: string = IdsBS.DisadvantageId.stigma;
export const DisadvantageId_deaf: string = IdsBS.DisadvantageId.deaf;
export const DisadvantageId_incompetent: string = IdsBS.DisadvantageId.incompetent;
export const DisadvantageId_obligations: string = IdsBS.DisadvantageId.obligations;
export const DisadvantageId_maimed: string = IdsBS.DisadvantageId.maimed;
export const DisadvantageId_brittleBones: string = IdsBS.DisadvantageId.brittleBones;
export const DisadvantageId_smallSpellSelection: string = IdsBS.DisadvantageId.smallSpellSelection;
export const DisadvantageId_wenigePredigten: string = IdsBS.DisadvantageId.wenigePredigten;
export const DisadvantageId_wenigeVisionen: string = IdsBS.DisadvantageId.wenigeVisionen;
export const SkillId_flying: string = IdsBS.SkillId.flying;
export const SkillId_gaukelei: string = IdsBS.SkillId.gaukelei;
export const SkillId_climbing: string = IdsBS.SkillId.climbing;
export const SkillId_bodyControl: string = IdsBS.SkillId.bodyControl;
export const SkillId_featOfStrength: string = IdsBS.SkillId.featOfStrength;
export const SkillId_riding: string = IdsBS.SkillId.riding;
export const SkillId_swimming: string = IdsBS.SkillId.swimming;
export const SkillId_selfControl: string = IdsBS.SkillId.selfControl;
export const SkillId_singing: string = IdsBS.SkillId.singing;
export const SkillId_perception: string = IdsBS.SkillId.perception;
export const SkillId_dancing: string = IdsBS.SkillId.dancing;
export const SkillId_pickpocket: string = IdsBS.SkillId.pickpocket;
export const SkillId_stealth: string = IdsBS.SkillId.stealth;
export const SkillId_carousing: string = IdsBS.SkillId.carousing;
export const SkillId_persuasion: string = IdsBS.SkillId.persuasion;
export const SkillId_seduction: string = IdsBS.SkillId.seduction;
export const SkillId_intimidation: string = IdsBS.SkillId.intimidation;
export const SkillId_etiquette: string = IdsBS.SkillId.etiquette;
export const SkillId_streetwise: string = IdsBS.SkillId.streetwise;
export const SkillId_empathy: string = IdsBS.SkillId.empathy;
export const SkillId_fastTalk: string = IdsBS.SkillId.fastTalk;
export const SkillId_disguise: string = IdsBS.SkillId.disguise;
export const SkillId_willpower: string = IdsBS.SkillId.willpower;
export const SkillId_tracking: string = IdsBS.SkillId.tracking;
export const SkillId_ropes: string = IdsBS.SkillId.ropes;
export const SkillId_fishing: string = IdsBS.SkillId.fishing;
export const SkillId_orienting: string = IdsBS.SkillId.orienting;
export const SkillId_plantLore: string = IdsBS.SkillId.plantLore;
export const SkillId_animalLore: string = IdsBS.SkillId.animalLore;
export const SkillId_survival: string = IdsBS.SkillId.survival;
export const SkillId_gambling: string = IdsBS.SkillId.gambling;
export const SkillId_geography: string = IdsBS.SkillId.geography;
export const SkillId_history: string = IdsBS.SkillId.history;
export const SkillId_religions: string = IdsBS.SkillId.religions;
export const SkillId_warfare: string = IdsBS.SkillId.warfare;
export const SkillId_magicalLore: string = IdsBS.SkillId.magicalLore;
export const SkillId_mechanics: string = IdsBS.SkillId.mechanics;
export const SkillId_math: string = IdsBS.SkillId.math;
export const SkillId_law: string = IdsBS.SkillId.law;
export const SkillId_mythsAndLegends: string = IdsBS.SkillId.mythsAndLegends;
export const SkillId_sphereLore: string = IdsBS.SkillId.sphereLore;
export const SkillId_astronomy: string = IdsBS.SkillId.astronomy;
export const SkillId_alchemy: string = IdsBS.SkillId.alchemy;
export const SkillId_sailing: string = IdsBS.SkillId.sailing;
export const SkillId_driving: string = IdsBS.SkillId.driving;
export const SkillId_commerce: string = IdsBS.SkillId.commerce;
export const SkillId_treatPoison: string = IdsBS.SkillId.treatPoison;
export const SkillId_treatDisease: string = IdsBS.SkillId.treatDisease;
export const SkillId_treatSoul: string = IdsBS.SkillId.treatSoul;
export const SkillId_treatWounds: string = IdsBS.SkillId.treatWounds;
export const SkillId_woodworking: string = IdsBS.SkillId.woodworking;
export const SkillId_prepareFood: string = IdsBS.SkillId.prepareFood;
export const SkillId_leatherworking: string = IdsBS.SkillId.leatherworking;
export const SkillId_artisticAbility: string = IdsBS.SkillId.artisticAbility;
export const SkillId_metalworking: string = IdsBS.SkillId.metalworking;
export const SkillId_music: string = IdsBS.SkillId.music;
export const SkillId_pickLocks: string = IdsBS.SkillId.pickLocks;
export const SkillId_earthencraft: string = IdsBS.SkillId.earthencraft;
export const SkillId_clothworking: string = IdsBS.SkillId.clothworking;
export const CombatTechniqueId_crossbows: string = IdsBS.CombatTechniqueId.crossbows;
export const CombatTechniqueId_bows: string = IdsBS.CombatTechniqueId.bows;
export const CombatTechniqueId_daggers: string = IdsBS.CombatTechniqueId.daggers;
export const CombatTechniqueId_fencingWeapons: string = IdsBS.CombatTechniqueId.fencingWeapons;
export const CombatTechniqueId_impactWeapons: string = IdsBS.CombatTechniqueId.impactWeapons;
export const CombatTechniqueId_chainWeapons: string = IdsBS.CombatTechniqueId.chainWeapons;
export const CombatTechniqueId_lances: string = IdsBS.CombatTechniqueId.lances;
export const CombatTechniqueId_brawling: string = IdsBS.CombatTechniqueId.brawling;
export const CombatTechniqueId_shields: string = IdsBS.CombatTechniqueId.shields;
export const CombatTechniqueId_slings: string = IdsBS.CombatTechniqueId.slings;
export const CombatTechniqueId_swords: string = IdsBS.CombatTechniqueId.swords;
export const CombatTechniqueId_polearms: string = IdsBS.CombatTechniqueId.polearms;
export const CombatTechniqueId_thrownWeapons: string = IdsBS.CombatTechniqueId.thrownWeapons;
export const CombatTechniqueId_twoHandedImpactWeapons: string = IdsBS.CombatTechniqueId.twoHandedImpactWeapons;
export const CombatTechniqueId_twoHandedSwords: string = IdsBS.CombatTechniqueId.twoHandedSwords;
export const CombatTechniqueId_spittingFire: string = IdsBS.CombatTechniqueId.spittingFire;
export const CombatTechniqueId_blowguns: string = IdsBS.CombatTechniqueId.blowguns;
export const CombatTechniqueId_discuses: string = IdsBS.CombatTechniqueId.discuses;
export const CombatTechniqueId_faecher: string = IdsBS.CombatTechniqueId.faecher;
export const CombatTechniqueId_spiesswaffen: string = IdsBS.CombatTechniqueId.spiesswaffen;
export const SpecialAbilityId_skillSpecialization: string = IdsBS.SpecialAbilityId.skillSpecialization;
export const SpecialAbilityId_terrainKnowledge: string = IdsBS.SpecialAbilityId.terrainKnowledge;
export const SpecialAbilityId_craftInstruments: string = IdsBS.SpecialAbilityId.craftInstruments;
export const SpecialAbilityId_hunter: string = IdsBS.SpecialAbilityId.hunter;
export const SpecialAbilityId_areaKnowledge: string = IdsBS.SpecialAbilityId.areaKnowledge;
export const SpecialAbilityId_literacy: string = IdsBS.SpecialAbilityId.literacy;
export const SpecialAbilityId_language: string = IdsBS.SpecialAbilityId.language;
export const SpecialAbilityId_combatReflexes: string = IdsBS.SpecialAbilityId.combatReflexes;
export const SpecialAbilityId_improvedDodge: string = IdsBS.SpecialAbilityId.improvedDodge;
export const SpecialAbilityId_traditionGuildMages: number = IdsBS.SpecialAbilityId.traditionGuildMages;
export const SpecialAbilityId_propertyKnowledge: string = IdsBS.SpecialAbilityId.propertyKnowledge;
export const SpecialAbilityId_propertyFocus: string = IdsBS.SpecialAbilityId.propertyFocus;
export const SpecialAbilityId_aspectKnowledge: string = IdsBS.SpecialAbilityId.aspectKnowledge;
export const SpecialAbilityId_traditionChurchOfPraios: string = IdsBS.SpecialAbilityId.traditionChurchOfPraios;
export const SpecialAbilityId_feuerschlucker: string = IdsBS.SpecialAbilityId.feuerschlucker;
export const SpecialAbilityId_combatStyleCombination: string = IdsBS.SpecialAbilityId.combatStyleCombination;
export const SpecialAbilityId_adaptionZauber: string = IdsBS.SpecialAbilityId.adaptionZauber;
export const SpecialAbilityId_exorzist: string = IdsBS.SpecialAbilityId.exorzist;
export const SpecialAbilityId_favoriteSpellwork: string = IdsBS.SpecialAbilityId.favoriteSpellwork;
export const SpecialAbilityId_traditionWitches: string = IdsBS.SpecialAbilityId.traditionWitches;
export const SpecialAbilityId_magicStyleCombination: string = IdsBS.SpecialAbilityId.magicStyleCombination;
export const SpecialAbilityId_harmoniezauberei: string = IdsBS.SpecialAbilityId.harmoniezauberei;
export const SpecialAbilityId_matrixzauberei: string = IdsBS.SpecialAbilityId.matrixzauberei;
export const SpecialAbilityId_traditionElves: string = IdsBS.SpecialAbilityId.traditionElves;
export const SpecialAbilityId_traditionDruids: string = IdsBS.SpecialAbilityId.traditionDruids;
export const SpecialAbilityId_spellEnhancement: number = IdsBS.SpecialAbilityId.spellEnhancement;
export const SpecialAbilityId_forschungsgebiet: string = IdsBS.SpecialAbilityId.forschungsgebiet;
export const SpecialAbilityId_expertenwissen: string = IdsBS.SpecialAbilityId.expertenwissen;
export const SpecialAbilityId_wissensdurst: string = IdsBS.SpecialAbilityId.wissensdurst;
export const SpecialAbilityId_recherchegespuer: string = IdsBS.SpecialAbilityId.recherchegespuer;
export const SpecialAbilityId_predigtDerGemeinschaft: string = IdsBS.SpecialAbilityId.predigtDerGemeinschaft;
export const SpecialAbilityId_predigtDerZuversicht: string = IdsBS.SpecialAbilityId.predigtDerZuversicht;
export const SpecialAbilityId_predigtDesGottvertrauens: string = IdsBS.SpecialAbilityId.predigtDesGottvertrauens;
export const SpecialAbilityId_predigtDesWohlgefallens: string = IdsBS.SpecialAbilityId.predigtDesWohlgefallens;
export const SpecialAbilityId_predigtWiderMissgeschicke: string = IdsBS.SpecialAbilityId.predigtWiderMissgeschicke;
export const SpecialAbilityId_visionDerBestimmung: string = IdsBS.SpecialAbilityId.visionDerBestimmung;
export const SpecialAbilityId_visionDerEntrueckung: string = IdsBS.SpecialAbilityId.visionDerEntrueckung;
export const SpecialAbilityId_visionDerGottheit: string = IdsBS.SpecialAbilityId.visionDerGottheit;
export const SpecialAbilityId_visionDesSchicksals: string = IdsBS.SpecialAbilityId.visionDesSchicksals;
export const SpecialAbilityId_visionDesWahrenGlaubens: string = IdsBS.SpecialAbilityId.visionDesWahrenGlaubens;
export const SpecialAbilityId_hoheWeihe: string = IdsBS.SpecialAbilityId.hoheWeihe;
export const SpecialAbilityId_lieblingsliturgie: string = IdsBS.SpecialAbilityId.lieblingsliturgie;
export const SpecialAbilityId_zugvoegel: string = IdsBS.SpecialAbilityId.zugvoegel;
export const SpecialAbilityId_jaegerinnenDerWeissenMaid: string = IdsBS.SpecialAbilityId.jaegerinnenDerWeissenMaid;
export const SpecialAbilityId_anhaengerDesGueldenen: string = IdsBS.SpecialAbilityId.anhaengerDesGueldenen;
export const SpecialAbilityId_gebieterDesAspekts: string = IdsBS.SpecialAbilityId.gebieterDesAspekts;
export const SpecialAbilityId_chantEnhancement: number = IdsBS.SpecialAbilityId.chantEnhancement;
export const SpecialAbilityId_dunklesAbbildDerBuendnisgabe: string = IdsBS.SpecialAbilityId.dunklesAbbildDerBuendnisgabe;
export const SpecialAbilityId_traditionIllusionist: string = IdsBS.SpecialAbilityId.traditionIllusionist;
export const SpecialAbilityId_traditionArcaneBard: string = IdsBS.SpecialAbilityId.traditionArcaneBard;
export const SpecialAbilityId_traditionArcaneDancer: string = IdsBS.SpecialAbilityId.traditionArcaneDancer;
export const SpecialAbilityId_traditionIntuitiveMage: string = IdsBS.SpecialAbilityId.traditionIntuitiveMage;
export const SpecialAbilityId_traditionSavant: string = IdsBS.SpecialAbilityId.traditionSavant;
export const SpecialAbilityId_traditionQabalyaMage: string = IdsBS.SpecialAbilityId.traditionQabalyaMage;
export const SpecialAbilityId_traditionChurchOfRondra: string = IdsBS.SpecialAbilityId.traditionChurchOfRondra;
export const SpecialAbilityId_traditionChurchOfBoron: string = IdsBS.SpecialAbilityId.traditionChurchOfBoron;
export const SpecialAbilityId_traditionChurchOfHesinde: string = IdsBS.SpecialAbilityId.traditionChurchOfHesinde;
export const SpecialAbilityId_traditionChurchOfPhex: string = IdsBS.SpecialAbilityId.traditionChurchOfPhex;
export const SpecialAbilityId_traditionChurchOfPeraine: string = IdsBS.SpecialAbilityId.traditionChurchOfPeraine;
export const SpecialAbilityId_traditionChurchOfEfferd: string = IdsBS.SpecialAbilityId.traditionChurchOfEfferd;
export const SpecialAbilityId_traditionChurchOfTravia: string = IdsBS.SpecialAbilityId.traditionChurchOfTravia;
export const SpecialAbilityId_traditionChurchOfFirun: string = IdsBS.SpecialAbilityId.traditionChurchOfFirun;
export const SpecialAbilityId_traditionChurchOfTsa: string = IdsBS.SpecialAbilityId.traditionChurchOfTsa;
export const SpecialAbilityId_traditionChurchOfIngerimm: string = IdsBS.SpecialAbilityId.traditionChurchOfIngerimm;
export const SpecialAbilityId_traditionChurchOfRahja: string = IdsBS.SpecialAbilityId.traditionChurchOfRahja;
export const SpecialAbilityId_traditionCultOfTheNamelessOne: string = IdsBS.SpecialAbilityId.traditionCultOfTheNamelessOne;
export const SpecialAbilityId_traditionChurchOfAves: string = IdsBS.SpecialAbilityId.traditionChurchOfAves;
export const SpecialAbilityId_traditionChurchOfIfirn: string = IdsBS.SpecialAbilityId.traditionChurchOfIfirn;
export const SpecialAbilityId_traditionChurchOfKor: string = IdsBS.SpecialAbilityId.traditionChurchOfKor;
export const SpecialAbilityId_traditionChurchOfNandus: string = IdsBS.SpecialAbilityId.traditionChurchOfNandus;
export const SpecialAbilityId_traditionChurchOfSwafnir: string = IdsBS.SpecialAbilityId.traditionChurchOfSwafnir;
export const SpecialAbilityId_languageSpecializations: string = IdsBS.SpecialAbilityId.languageSpecializations;
export const SpecialAbilityId_traditionSchelme: string = IdsBS.SpecialAbilityId.traditionSchelme;
export const SpecialAbilityId_traditionZauberalchimisten: string = IdsBS.SpecialAbilityId.traditionZauberalchimisten;
export const SpecialAbilityId_grosseMeditation: string = IdsBS.SpecialAbilityId.grosseMeditation;
export const SpecialAbilityId_imitationszauberei: string = IdsBS.SpecialAbilityId.imitationszauberei;
export const SpecialAbilityId_kraftliniennutzung: string = IdsBS.SpecialAbilityId.kraftliniennutzung;
export const SpecialAbilityId_scholarDerHalleDesLebensZuNorburg: string = IdsBS.SpecialAbilityId.scholarDerHalleDesLebensZuNorburg;
export const SpecialAbilityId_scholarDesKreisesDerEinfuehlung: string = IdsBS.SpecialAbilityId.scholarDesKreisesDerEinfuehlung;
export const SpecialAbilityId_madaschwesternStil: string = IdsBS.SpecialAbilityId.madaschwesternStil;
export const SpecialAbilityId_garetherGossenStil: string = IdsBS.SpecialAbilityId.garetherGossenStil;
export const SpecialAbilityId_wegDerGelehrten: string = IdsBS.SpecialAbilityId.wegDerGelehrten;
export const SpecialAbilityId_traditionCultOfNuminoru: string = IdsBS.SpecialAbilityId.traditionCultOfNuminoru;
export const SpecialAbilityId_wegDerKuenstlerin: string = IdsBS.SpecialAbilityId.wegDerKuenstlerin;
export const SpecialAbilityId_wegDerSchreiberin: string = IdsBS.SpecialAbilityId.wegDerSchreiberin;
export const SpecialAbilityId_fachwissen: string = IdsBS.SpecialAbilityId.fachwissen;
export const SpecialAbilityId_handwerkskunst: string = IdsBS.SpecialAbilityId.handwerkskunst;
export const SpecialAbilityId_kindDerNatur: string = IdsBS.SpecialAbilityId.kindDerNatur;
export const SpecialAbilityId_koerperlichesGeschick: string = IdsBS.SpecialAbilityId.koerperlichesGeschick;
export const SpecialAbilityId_sozialeKompetenz: string = IdsBS.SpecialAbilityId.sozialeKompetenz;
export const SpecialAbilityId_universalgenie: string = IdsBS.SpecialAbilityId.universalgenie;
export const SpecialAbilityId_scholarDesMagierkollegsZuHoningen: string = IdsBS.SpecialAbilityId.scholarDesMagierkollegsZuHoningen;
export const SpecialAbilityId_traditionAnimisten: string = IdsBS.SpecialAbilityId.traditionAnimisten;
export const SpecialAbilityId_traditionGeoden: string = IdsBS.SpecialAbilityId.traditionGeoden;
export const SpecialAbilityId_traditionZibilijas: string = IdsBS.SpecialAbilityId.traditionZibilijas;
export const SpecialAbilityId_zaubervariabilitaet: string = IdsBS.SpecialAbilityId.zaubervariabilitaet;
export const SpecialAbilityId_traditionBrobimGeoden: string = IdsBS.SpecialAbilityId.traditionBrobimGeoden;
export const SocialStatusId_notFree: number = IdsBS.SocialStatusId.notFree;
export const SocialStatusId_free: number = IdsBS.SocialStatusId.free;
export const SocialStatusId_lesserNoble: number = IdsBS.SocialStatusId.lesserNoble;
export const SocialStatusId_noble: number = IdsBS.SocialStatusId.noble;
export const SocialStatusId_aristocracy: number = IdsBS.SocialStatusId.aristocracy;
export const OptionalRuleId_maximumAttributeScores: string = IdsBS.OptionalRuleId.maximumAttributeScores;
export const OptionalRuleId_languageSpecialization: string = IdsBS.OptionalRuleId.languageSpecialization;
export const OptionalRuleId_higherDefenseStats: string = IdsBS.OptionalRuleId.higherDefenseStats;
export const ConditionId_sikaryanVerlust: string = IdsBS.ConditionId.sikaryanVerlust;
export const ConditionId_daemonischeAuszehrung: string = IdsBS.ConditionId.daemonischeAuszehrung;
export const ExperienceLevelId: {
masterly: string;
inexperienced: string;
brilliant: string;
ordinary: string;
experienced: string;
competent: string;
legendary: string
} = IdsBS.ExperienceLevelId
export const ProfessionId: { customProfession: string } = IdsBS.ProfessionId
export const DCId: {
dodge: string;
movement: string;
initiative: string;
woundThreshold: string;
toughness: string;
karmaPoints: string;
arcaneEnergy: string;
spirit: string;
lifePoints: string
} = IdsBS.DCId
export const SkillId: {
sailing: string;
treatPoison: string;
metalworking: string;
etiquette: string;
commerce: string;
treatSoul: string;
prepareFood: string;
music: string;
plantLore: string;
driving: string;
pickLocks: string;
flying: string;
religions: string;
riding: string;
empathy: string;
gambling: string;
sphereLore: string;
singing: string;
stealth: string;
gaukelei: string;
dancing: string;
persuasion: string;
intimidation: string;
carousing: string;
animalLore: string;
bodyControl: string;
history: string;
earthencraft: string;
survival: string;
astronomy: string;
perception: string;
treatWounds: string;
seduction: string;
selfControl: string;
disguise: string;
ropes: string;
climbing: string;
willpower: string;
fastTalk: string;
streetwise: string;
fishing: string;
geography: string;
mechanics: string;
treatDisease: string;
orienting: string;
law: string;
warfare: string;
pickpocket: string;
artisticAbility: string;
clothworking: string;
featOfStrength: string;
tracking: string;
mythsAndLegends: string;
math: string;
leatherworking: string;
swimming: string;
magicalLore: string;
woodworking: string;
alchemy: string
} = IdsBS.SkillId
export const CultureId: {
woodElves: string;
gladeElves: string;
firnelves: string;
steppenelfen: string
} = IdsBS.CultureId
export const Phase: {
creation: number;
inGame: number;
rcp: number
} = IdsBS.Phase
export const AdvantageId: {
luck: string;
exceptionalSkill: string;
weaponAptitude: string;
largeSpellSelection: string;
hatredOf: string;
zahlreichePredigten: string;
einkommen: string;
aptitude: string;
prediger: string;
sociallyAdaptable: string;
immunityToDisease: string;
nimble: string;
increasedKarmaPoints: string;
visionaer: string;
inspireConfidence: string;
spellcaster: string;
exceptionalCombatTechnique: string;
increasedAstralPower: string;
zahlreicheVisionen: string;
leichterGang: string;
increasedLifePoints: string;
unyielding: string;
rich: string;
blessed: string;
increasedSpirit: string;
immunityToPoison: string;
increasedToughness: string;
magicalAttunement: string
} = IdsBS.AdvantageId
export const CombatTechniqueId: {
discuses: string;
swords: string;
faecher: string;
chainWeapons: string;
twoHandedSwords: string;
daggers: string;
crossbows: string;
brawling: string;
thrownWeapons: string;
lances: string;
impactWeapons: string;
slings: string;
spittingFire: string;
blowguns: string;
fencingWeapons: string;
twoHandedImpactWeapons: string;
spiesswaffen: string;
bows: string;
shields: string;
polearms: string
} = IdsBS.CombatTechniqueId
export const SocialStatusId: {
free: number;
aristocracy: number;
lesserNoble: number;
notFree: number;
noble: number
} = IdsBS.SocialStatusId
export const DisadvantageId: {
obligations: string;
slow: string;
wenigeVisionen: string;
badLuck: string;
maimed: string;
wenigePredigten: string;
decreasedLifePoints: string;
incompetent: string;
afraidOf: string;
deaf: string;
magicalRestriction: string;
decreasedSpirit: string;
noFlyingBalm: string;
poor: string;
smallSpellSelection: string;
noFamiliar: string;
decreasedArcanePower: string;
principles: string;
negativeTrait: string;
stigma: string;
badHabit: string;
decreasedKarmaPoints: string;
brittleBones: string;
decreasedToughness: string;
personalityFlaw: string
} = IdsBS.DisadvantageId
export const ConditionId: { sikaryanVerlust: string; daemonischeAuszehrung: string } = IdsBS.ConditionId
export const RaceId: {
humans: string;
elves: string;
dwarves: string;
halfElves: string
} = IdsBS.RaceId
export const AttrId: {
intuition: string;
charisma: string;
agility: string;
courage: string;
sagacity: string;
constitution: string;
dexterity: string;
strength: string
} = IdsBS.AttrId
export const SpecialAbilityId: {
universalgenie: string;
traditionChurchOfTravia: string;
imitationszauberei: string;
garetherGossenStil: string;
magicStyleCombination: string;
forschungsgebiet: string;
anhaengerDesGueldenen: string;
visionDerBestimmung: string;
visionDerEntrueckung: string;
languageSpecializations: string;
chantEnhancement: number;
traditionChurchOfPhex: string;
traditionChurchOfFirun: string;
traditionChurchOfNandus: string;
harmoniezauberei: string;
craftInstruments: string;
hoheWeihe: string;
wegDerKuenstlerin: string;
jaegerinnenDerWeissenMaid: string;
kraftliniennutzung: string;
sozialeKompetenz: string;
traditionDruids: string;
madaschwesternStil: string;
expertenwissen: string;
terrainKnowledge: string;
recherchegespuer: string;
visionDerGottheit: string;
traditionChurchOfBoron: string;
traditionGuildMages: number;
traditionGeoden: string;
dunklesAbbildDerBuendnisgabe: string;
grosseMeditation: string;
propertyKnowledge: string;
traditionCultOfTheNamelessOne: string;
areaKnowledge: string;
traditionArcaneDancer: string;
zugvoegel: string;
traditionChurchOfAves: string;
gebieterDesAspekts: string;
propertyFocus: string;
fachwissen: string;
adaptionZauber: string;
favoriteSpellwork: string;
traditionArcaneBard: string;
traditionSavant: string;
traditionZauberalchimisten: string;
wissensdurst: string;
language: string;
wegDerGelehrten: string;
feuerschlucker: string;
predigtDesGottvertrauens: string;
traditionChurchOfHesinde: string;
traditionChurchOfRahja: string;
traditionChurchOfIfirn: string;
traditionAnimisten: string;
lieblingsliturgie: string;
zaubervariabilitaet: string;
traditionChurchOfPraios: string;
predigtWiderMissgeschicke: string;
scholarDesKreisesDerEinfuehlung: string;
matrixzauberei: string;
predigtDesWohlgefallens: string;
exorzist: string;
predigtDerGemeinschaft: string;
kindDerNatur: string;
traditionBrobimGeoden: string;
traditionChurchOfPeraine: string;
traditionIntuitiveMage: string;
traditionElves: string;
visionDesWahrenGlaubens: string;
traditionWitches: string;
traditionChurchOfIngerimm: string;
literacy: string;
combatReflexes: string;
combatStyleCombination: string;
scholarDerHalleDesLebensZuNorburg: string;
traditionChurchOfEfferd: string;
traditionChurchOfSwafnir: string;
wegDerSchreiberin: string;
koerperlichesGeschick: string;
hunter: string;
visionDesSchicksals: string;
traditionCultOfNuminoru: string;
traditionZibilijas: string;
improvedDodge: string;
traditionQabalyaMage: string;
aspectKnowledge: string;
spellEnhancement: number;
traditionSchelme: string;
predigtDerZuversicht: string;
traditionChurchOfTsa: string;
scholarDesMagierkollegsZuHoningen: string;
skillSpecialization: string;
traditionChurchOfRondra: string;
traditionChurchOfKor: string;
traditionIllusionist: string;
handwerkskunst: string
} = IdsBS.SpecialAbilityId
export const OptionalRuleId: {
higherDefenseStats: string;
maximumAttributeScores: string;
languageSpecialization: string
} = IdsBS.OptionalRuleId
File diff suppressed because it is too large Load Diff
+51 -3
View File
@@ -1,5 +1,39 @@
import { List } from "../../Data/List"
export type Id =
| { tag: "ExperienceLevel"; value: number }
| { tag: "Race"; value: number }
| { tag: "Culture"; value: number }
| { tag: "Profession"; value: number }
| { tag: "Attribute"; value: number }
| { tag: "Advantage"; value: number }
| { tag: "Disadvantage"; value: number }
| { tag: "Skill"; value: number }
| { tag: "CombatTechnique"; value: number }
| { tag: "Spell"; value: number }
| { tag: "Curse"; value: number }
| { tag: "ElvenMagicalSong"; value: number }
| { tag: "DominationRitual"; value: number }
| { tag: "MagicalMelody"; value: number }
| { tag: "MagicalDance"; value: number }
| { tag: "RogueSpell"; value: number }
| { tag: "AnimistForce"; value: number }
| { tag: "GeodeRitual"; value: number }
| { tag: "ZibiljaRitual"; value: number }
| { tag: "Cantrip"; value: number }
| { tag: "LiturgicalChant"; value: number }
| { tag: "Blessing"; value: number }
| { tag: "SpecialAbility"; value: number }
| { tag: "Item"; value: number }
| { tag: "EquipmentPackage"; value: number }
| { tag: "HitZoneArmor"; value: number }
| { tag: "Familiar"; value: number }
| { tag: "Animal"; value: number }
| { tag: "FocusRule"; value: number }
| { tag: "OptionalRule"; value: number }
| { tag: "Condition"; value: number }
| { tag: "State"; value: number }
/**
* Please keep enum members sorted by value and not by key!
*/
@@ -108,7 +142,7 @@ export enum AdvantageId {
/**
* Lists advantage IDs that have no influence on the AP maximum for advantages.
*/
export const AdvantageIdsNoMaxInfl = List<AdvantageId> (AdvantageId.Einkommen)
export const AdvantageIdsNoMaxInfl = List<string> (AdvantageId.Einkommen)
export enum DisadvantageId {
CustomDisadvantage = "DISADV_0",
@@ -268,6 +302,7 @@ export enum SpecialAbilityId {
Hunter = "SA_18",
AreaKnowledge = "SA_22",
Literacy = "SA_27",
Writing = "SA_28",
Language = "SA_29",
CombatReflexes = "SA_51",
ImprovedDodge = "SA_64",
@@ -277,6 +312,7 @@ export enum SpecialAbilityId {
AspectKnowledge = "SA_87",
TraditionChurchOfPraios = "SA_86",
Feuerschlucker = "SA_109",
SpeedWriting = "SA_136",
CombatStyleCombination = "SA_164",
AdaptionZauber = "SA_231",
Exorzist = "SA_240",
@@ -285,6 +321,8 @@ export enum SpecialAbilityId {
FavoriteSpellwork = "SA_250",
TraditionWitches = "SA_255",
MagicStyleCombination = "SA_266",
Harmoniezauberei = "SA_296",
Matrixzauberei = "SA_303",
TraditionElves = "SA_345",
TraditionDruids = "SA_346",
SpellEnhancement = "SA_414",
@@ -298,14 +336,14 @@ export enum SpecialAbilityId {
PredigtDesWohlgefallens = "SA_547",
PredigtWiderMissgeschicke = "SA_548",
VisionDerBestimmung = "SA_549",
VisionDerEntrückung = "SA_550",
VisionDerEntrueckung = "SA_550",
VisionDerGottheit = "SA_551",
VisionDesSchicksals = "SA_552",
VisionDesWahrenGlaubens = "SA_553",
HoheWeihe = "SA_563",
Lieblingsliturgie = "SA_569",
Zugvoegel = "SA_623",
JaegerinnenDerWeißenMaid = "SA_625",
JaegerinnenDerWeissenMaid = "SA_625",
AnhaengerDesGueldenen = "SA_632",
GebieterDesAspekts = "SA_639",
ChantEnhancement = "SA_663",
@@ -345,10 +383,14 @@ export enum SpecialAbilityId {
TraditionSchelme = "SA_726",
TraditionZauberalchimisten = "SA_750",
GrosseMeditation = "SA_772",
Imitationszauberei = "SA_775",
Kraftliniennutzung = "SA_781",
ScholarDerHalleDesLebensZuNorburg = "SA_802",
ScholarDesKreisesDerEinfuehlung = "SA_808",
MadaschwesternStil = "SA_821",
GaretherGossenStil = "SA_901",
Kryptographie = "SA_1013",
Kurzschrift = "SA_1016",
WegDerGelehrten = "SA_1040",
TraditionCultOfNuminoru = "SA_1049",
WegDerKuenstlerin = "SA_1069",
@@ -360,6 +402,7 @@ export enum SpecialAbilityId {
SozialeKompetenz = "SA_1123",
Universalgenie = "SA_1127",
ScholarDesMagierkollegsZuHoningen = "SA_1147",
TraditionCultOfLevthan = "SA_1187",
TraditionAnimisten = "SA_1221",
TraditionGeoden = "SA_1255",
TraditionZibilijas = "SA_1293",
@@ -381,3 +424,8 @@ export enum OptionalRuleId {
LanguageSpecialization = "OR_15",
HigherDefenseStats = "OR_17",
}
export enum ConditionId {
SikaryanVerlust = "COND_11",
DaemonischeAuszehrung = "COND_14",
}
+2 -1
View File
@@ -19,7 +19,8 @@ const mapDispatchToProps = (dispatch: Dispatch<Action>) => ({
const connectAlertsContainer =
connect<AlertsStateProps, AlertsDispatchProps, AlertsOwnProps, AppStateRecord> (
mapStateToProps, mapDispatchToProps
mapStateToProps,
mapDispatchToProps
)
export const AlertsContainer = connectAlertsContainer (Alerts)
+2 -1
View File
@@ -1,4 +1,5 @@
import { ipcRenderer, remote } from "electron"
import * as remote from "@electron/remote"
import { ipcRenderer } from "electron"
import { connect } from "react-redux"
import { Action } from "redux"
import { Nothing } from "../../Data/Maybe"
+3 -3
View File
@@ -10,8 +10,8 @@ import { getInitialStartingWealth } from "../Selectors/activatableSelectors"
import { getHasCurrentNoAddedAP } from "../Selectors/adventurePointsSelectors"
import { getCarryingCapacity } from "../Selectors/attributeSelectors"
import { getFilteredCombatTechniques } from "../Selectors/combatTechniquesSelectors"
import { getAvailableSortedEquipmentGroups, getFilteredItems, getFilteredItemTemplates, getTotalPrice, getTotalWeight } from "../Selectors/equipmentSelectors"
import { getEquipmentFilterText, getItemTemplatesFilterText, getPurse, getIsAddRemoveMoneyOpen } from "../Selectors/stateSelectors"
import { getAvailableSortedEquipmentGroups, getFilteredItems, getFilteredSortedItemTemplates, getTotalPrice, getTotalWeight } from "../Selectors/equipmentSelectors"
import { getEquipmentFilterText, getIsAddRemoveMoneyOpen, getItemTemplatesFilterText, getPurse } from "../Selectors/stateSelectors"
import { getEquipmentSortOrder, getMeleeItemTemplateCombatTechniqueFilter, getRangedItemTemplateCombatTechniqueFilter } from "../Selectors/uisettingsSelectors"
import { Equipment, EquipmentDispatchProps, EquipmentOwnProps, EquipmentStateProps } from "../Views/Equipment/Equipment"
@@ -24,7 +24,7 @@ const mapStateToProps =
hasNoAddedAP: getHasCurrentNoAddedAP (state),
purse: getPurse (state),
sortOrder: getEquipmentSortOrder (state),
templates: getFilteredItemTemplates (state, ownProps),
templates: getFilteredSortedItemTemplates (state, ownProps),
totalPrice: getTotalPrice (state),
totalWeight: getTotalWeight (state),
meleeItemTemplateCombatTechniqueFilter: getMeleeItemTemplateCombatTechniqueFilter (state),
+2 -22
View File
@@ -1,11 +1,10 @@
import { connect } from "react-redux"
import { Action } from "redux"
import { fromJust, isJust, Just, Maybe } from "../../Data/Maybe"
import { fromJust, isJust, Maybe } from "../../Data/Maybe"
import { OrderedSet } from "../../Data/OrderedSet"
import { ReduxDispatch } from "../Actions/Actions"
import * as HerolistActions from "../Actions/HerolistActions"
import * as IOActions from "../Actions/IOActions"
import * as LocationActions from "../Actions/LocationActions"
import * as SubwindowsActions from "../Actions/SubwindowsActions"
import { AppStateRecord } from "../Models/AppState"
import { HeroListSortOptions, HeroListVisibilityFilter } from "../Models/Config"
@@ -13,7 +12,6 @@ import { getSortedBooks } from "../Selectors/bookSelectors"
import { getSortedHerolist, getUnsavedHeroesById } from "../Selectors/herolistSelectors"
import { getCurrentHeroPresent, getHerolistFilterText, getIsCharacterCreatorOpen, getUsers, getWiki, getWikiExperienceLevels } from "../Selectors/stateSelectors"
import { getHerolistSortOrder, getHerolistVisibilityFilter } from "../Selectors/uisettingsSelectors"
import { TabId } from "../Utilities/LocationUtils"
import { Herolist, HerolistDispatchProps, HerolistOwnProps, HerolistStateProps } from "../Views/Heroes/Herolist"
const mapStateToProps = (state: AppStateRecord) => ({
@@ -30,25 +28,7 @@ const mapStateToProps = (state: AppStateRecord) => ({
wiki: getWiki (state),
})
const mapDispatchToProps = (dispatch: ReduxDispatch<Action>) => ({
loadHero (id: string) {
dispatch (HerolistActions.loadHero (id))
},
showHero () {
dispatch (LocationActions.setTab (TabId.Profile))
},
async saveHero (id: string) {
await dispatch (HerolistActions.saveHero (Just (id)))
},
saveHeroAsJSON (id: string) {
dispatch (HerolistActions.exportHeroValidate (id))
},
async deleteHero (id: string) {
await dispatch (HerolistActions.deleteHeroValidate (id))
},
duplicateHero (id: string) {
dispatch (HerolistActions.duplicateHero (id))
},
const mapDispatchToProps = (dispatch: ReduxDispatch<Action>): HerolistDispatchProps => ({
createHero (
name: string,
sex: "m" | "f",
+2 -2
View File
@@ -1,6 +1,6 @@
import { connect } from "react-redux"
import { Action } from "redux"
import { join, Just } from "../../Data/Maybe"
import { join } from "../../Data/Maybe"
import { ReduxDispatch } from "../Actions/Actions"
import * as HerolistActions from "../Actions/HerolistActions"
import * as LocationActions from "../Actions/LocationActions"
@@ -32,7 +32,7 @@ const mapDispatchToProps = (
dispatch (LocationActions.setTab (TabId.Profile))
},
async saveHero () {
await dispatch (HerolistActions.saveHero (Just (HA.id (hero))))
await dispatch (HerolistActions.saveHero (HA.id (hero)))
},
saveHeroAsJSON () {
dispatch (HerolistActions.exportHeroValidate (HA.id (hero)))
+10 -6
View File
@@ -1,19 +1,23 @@
import { connect } from "react-redux"
import { Maybe } from "../../Data/Maybe"
import { Pair } from "../../Data/Tuple"
import { ReduxDispatch } from "../Actions/Actions"
import * as EquipmentActions from "../Actions/EquipmentActions"
import { AttrId } from "../Constants/Ids"
import { AppStateRecord } from "../Models/AppState"
import { getSortedTemplates } from "../Selectors/equipmentSelectors"
import { HeroModelRecord } from "../Models/Hero/HeroModel"
import { Range } from "../Models/Hero/Item"
import { getSortedItemTemplates } from "../Selectors/equipmentSelectors"
import { getIsItemCreation, getItemEditorInstance, getWikiAttributes, getWikiCombatTechniques } from "../Selectors/stateSelectors"
import { ItemEditor, ItemEditorDispatchProps, ItemEditorOwnProps, ItemEditorStateProps } from "../Views/Equipment/ItemEditor"
const mapStateToProps =
(state: AppStateRecord): ItemEditorStateProps => ({
(state: AppStateRecord, ownProps: { hero: HeroModelRecord }): ItemEditorStateProps => ({
attributes: getWikiAttributes (state),
combatTechniques: getWikiCombatTechniques (state),
isInCreation: getIsItemCreation (state),
item: getItemEditorInstance (state),
templates: getSortedTemplates (state),
templates: getSortedItemTemplates (state, ownProps),
})
const mapDispatchToProps = (dispatch: ReduxDispatch): ItemEditorDispatchProps => ({
@@ -59,7 +63,7 @@ const mapDispatchToProps = (dispatch: ReduxDispatch): ItemEditorDispatchProps =>
setDamageFlat (value: string): void {
dispatch (EquipmentActions.setDamageFlat (value))
},
setPrimaryAttribute (primary: Maybe<string>): void {
setPrimaryAttribute (primary: Maybe<AttrId | Pair<AttrId, AttrId>>): void {
dispatch (EquipmentActions.setPrimaryAttribute (primary))
},
setDamageThreshold (value: string): void {
@@ -89,8 +93,8 @@ const mapDispatchToProps = (dispatch: ReduxDispatch): ItemEditorDispatchProps =>
setStructurePoints (value: string): void {
dispatch (EquipmentActions.setStructurePoints (value))
},
setRange (index: 1 | 2 | 3): (value: string) => void {
return value => dispatch (EquipmentActions.setRange (value, index))
setRange (key: keyof Range): (value: string) => void {
return value => dispatch (EquipmentActions.setRange (value, key))
},
setReloadTime (value: string): void {
dispatch (EquipmentActions.setReloadTime (value))
+7 -3
View File
@@ -1,5 +1,5 @@
import { connect } from "react-redux"
import { bind, join, Nothing } from "../../Data/Maybe"
import { bind, join } from "../../Data/Maybe"
import { ReduxDispatch } from "../Actions/Actions"
import * as HerolistActions from "../Actions/HerolistActions"
import * as HistoryActions from "../Actions/HistoryActions"
@@ -16,6 +16,7 @@ import { getIsSpellsTabAvailable } from "../Selectors/spellsSelectors"
import { getAvatar, getCurrentTab, getIsSettingsOpen } from "../Selectors/stateSelectors"
import { getIsHeroSection, getSubtabs, getTabs } from "../Selectors/uilocationSelectors"
import { TabId } from "../Utilities/LocationUtils"
import { toNewMaybe } from "../Utilities/Maybe"
import { NavigationBar, NavigationBarDispatchProps, NavigationBarOwnProps, NavigationBarStateProps } from "../Views/NavBar/NavigationBar"
const mapStateToProps =
@@ -38,7 +39,7 @@ const mapStateToProps =
isBlessedOne: getIsLiturgicalChantsTabAvailable (state, ownProps),
})
const mapDispatchToProps = (dispatch: ReduxDispatch) => ({
const mapDispatchToProps = (dispatch: ReduxDispatch, ownProps: NavigationBarOwnProps) => ({
setTab (id: TabId) {
dispatch (LocationActions.setTab (id))
},
@@ -49,7 +50,10 @@ const mapDispatchToProps = (dispatch: ReduxDispatch) => ({
dispatch (HistoryActions.redo ())
},
async saveHero () {
await dispatch (HerolistActions.saveHero (Nothing))
const mhero = toNewMaybe (ownProps.mhero)
if (mhero.isJust) {
await dispatch (HerolistActions.saveHero (HeroModel.A.id (mhero.value)))
}
},
openSettings () {
dispatch (SubwindowsActions.openSettings ())
+3 -2
View File
@@ -1,3 +1,4 @@
import { ipcRenderer } from "electron"
import { connect } from "react-redux"
import { fromJust, isJust, Maybe } from "../../Data/Maybe"
import { ReduxDispatch } from "../Actions/Actions"
@@ -10,7 +11,7 @@ import { Locale, Theme } from "../Models/Config"
import { getUserSelectableSupportedLanguages } from "../Selectors/localeSelectors"
import { getFallbackLocaleId, getFallbackLocaleType, getLocaleId, getLocaleType } from "../Selectors/stateSelectors"
import { areAnimationsEnabled, getIsEditingHeroAfterCreationPhaseEnabled, getTheme } from "../Selectors/uisettingsSelectors"
import { isUpdaterEnabled } from "../Utilities/CheckForUpdatesRenderer"
import { IPCChannels } from "../Utilities/IPCChannels"
import { Settings, SettingsDispatchProps, SettingsOwnProps, SettingsStateProps } from "../Views/Settings/Settings"
const mapStateToProps = (state: AppStateRecord): SettingsStateProps => ({
@@ -22,7 +23,7 @@ const mapStateToProps = (state: AppStateRecord): SettingsStateProps => ({
areAnimationsEnabled: areAnimationsEnabled (state),
theme: getTheme (state),
languages: getUserSelectableSupportedLanguages (state),
isCheckForUpdatesDisabled: !isUpdaterEnabled (),
isCheckForUpdatesDisabled: !(ipcRenderer.sendSync (IPCChannels.IsUpdaterEnabled) as boolean),
})
const mapDispatchToProps = (dispatch: ReduxDispatch): SettingsDispatchProps => ({
+5 -1
View File
@@ -23,6 +23,7 @@ import { getAllSkills } from "../Selectors/skillsSelectors"
import { getCantripsForSheet, getSpellsForSheet } from "../Selectors/spellsSelectors"
import { getAvatar, getCurrentHeroName, getCurrentSex, getProfile, getPurse, getSpecialAbilities, getWikiBooks, getWikiSpecialAbilities } from "../Selectors/stateSelectors"
import { getSheetCheckAttributeValueVisibility, getSheetUseParchment, getSheetZoomFactor } from "../Selectors/uisettingsSelectors"
import { requestExportHeroAsRptok } from "../Utilities/MapToolExporter"
import { pipe } from "../Utilities/pipe"
import { mapGetToMaybeSlice, mapGetToSlice } from "../Utilities/SelectorsUtils"
import { Sheets, SheetsDispatchProps, SheetsOwnProps, SheetsStateProps } from "../Views/Sheets/Sheets"
@@ -90,7 +91,7 @@ const mapStateToProps = (state: AppStateRecord, ownProps: SheetsOwnProps): Sheet
skillsByGroup: getSkillsByGroup (state),
})
const mapDispatchToProps = (dispatch: ReduxDispatch) => ({
const mapDispatchToProps = (dispatch: ReduxDispatch, ownProps: SheetsOwnProps) => ({
switchAttributeValueVisibility () {
dispatch (SheetActions.switchAttributeValueVisibility ())
},
@@ -103,6 +104,9 @@ const mapDispatchToProps = (dispatch: ReduxDispatch) => ({
async printToPDF () {
await dispatch (requestPrintHeroToPDF ())
},
async exportAsRptok () {
await dispatch (requestExportHeroAsRptok (ownProps.hero))
},
})
export const connectSheets =
-35
View File
@@ -1,35 +0,0 @@
// Generated by ReScript, PLEASE EDIT WITH CARE
'use strict';
var Json_decode = require("@glennsl/bs-json/src/Json_decode.bs.js");
function t(json) {
var scope = Json_decode.string(json);
switch (scope) {
case "SPI" :
Json_decode.$$int(json);
return /* SPI */0;
case "SPI/2" :
Json_decode.$$int(json);
return /* DOUBLE_SPI */1;
case "SPI/TOU" :
Json_decode.$$int(json);
return /* MAX_SPI_TOU */3;
case "TOU" :
Json_decode.$$int(json);
return /* TOU */2;
default:
throw {
RE_EXN_ID: Json_decode.DecodeError,
_1: "Unknown check modifier: " + scope,
Error: new Error()
};
}
}
var Decode = {
t: t
};
exports.Decode = Decode;
/* No side effect */
-23
View File
@@ -1,23 +0,0 @@
type t =
| SPI
| DOUBLE_SPI
| TOU
| MAX_SPI_TOU;
module Decode = {
open Json.Decode;
let t = json =>
json
|> string
|> (
scope =>
switch (scope) {
| "SPI" => json |> int |> (_ => SPI)
| "SPI/2" => json |> int |> (_ => DOUBLE_SPI)
| "TOU" => json |> int |> (_ => TOU)
| "SPI/TOU" => json |> int |> (_ => MAX_SPI_TOU)
| _ => raise(DecodeError("Unknown check modifier: " ++ scope))
}
);
};
-32
View File
@@ -1,32 +0,0 @@
// Generated by ReScript, PLEASE EDIT WITH CARE
'use strict';
var Rules = {};
var Activatable = {};
var Attribute = {};
var Energies = {};
var ActivatableSkill = {};
var Skill = {};
var Item = {};
var Pact = {};
var TransferUnfamiliar = {};
exports.Rules = Rules;
exports.Activatable = Activatable;
exports.Attribute = Attribute;
exports.Energies = Energies;
exports.ActivatableSkill = ActivatableSkill;
exports.Skill = Skill;
exports.Item = Item;
exports.Pact = Pact;
exports.TransferUnfamiliar = TransferUnfamiliar;
/* No side effect */
-407
View File
@@ -1,407 +0,0 @@
/* TypeScript file generated from Hero.re by genType. */
/* eslint-disable import/first */
import {activatableAndSkillId as Ids_activatableAndSkillId} from '../../../src/App/Constants/Ids.gen';
import {activatableId as Ids_activatableId} from '../../../src/App/Constants/Ids.gen';
import {hitZoneArmorZoneItemId as Ids_hitZoneArmorZoneItemId} from '../../../src/App/Constants/Ids.gen';
import {list} from '../../../src/shims/ReasonPervasives.shim';
import {maybe as Maybe_maybe} from '../../../src/Data/Maybe.gen';
import {oneOrMany as GenericHelpers_oneOrMany} from '../../../src/App/Utilities/GenericHelpers.gen';
import {selectOptionId as Ids_selectOptionId} from '../../../src/App/Constants/Ids.gen';
import {t as IntMap_t} from '../../../src/shims/IntMap.gen';
import {t as IntSet_t} from '../../../src/shims/IntSet.gen';
// tslint:disable-next-line:interface-over-type-literal
export type phase = "Outline" | "Definition" | "Advancement";
export type Phase = phase;
// tslint:disable-next-line:interface-over-type-literal
export type sex = "Male" | "Female";
export type Sex = sex;
// tslint:disable-next-line:interface-over-type-literal
export type baseOrWithVariant =
{ tag: "Base"; value: number }
| { tag: "WithVariant"; value: [number, number] };
export type BaseOrWithVariant = baseOrWithVariant;
// tslint:disable-next-line:interface-over-type-literal
export type Rules_activeRule = { readonly id: number; readonly options: list<number> };
export type ActiveRule = Rules_activeRule;
// tslint:disable-next-line:interface-over-type-literal
export type Rules_t = {
readonly areAllPublicationsActive: boolean;
readonly activePublications: list<string>;
readonly activeFocusRules: list<Rules_activeRule>;
readonly activeOptionalRules: list<Rules_activeRule>
};
export type Rules = Rules_t;
// tslint:disable-next-line:interface-over-type-literal
export type personalData = {
readonly family: Maybe_maybe<string>;
readonly placeOfBirth: Maybe_maybe<string>;
readonly dateOfBirth: Maybe_maybe<string>;
readonly age: Maybe_maybe<string>;
readonly hairColor: Maybe_maybe<number>;
readonly eyeColor: Maybe_maybe<number>;
readonly size: Maybe_maybe<string>;
readonly weight: Maybe_maybe<string>;
readonly title: Maybe_maybe<string>;
readonly socialStatus: Maybe_maybe<number>;
readonly characteristics: Maybe_maybe<string>;
readonly otherInfo: Maybe_maybe<string>;
readonly cultureAreaKnowledge: Maybe_maybe<string>
};
export type PersonalData = personalData;
// tslint:disable-next-line:interface-over-type-literal
export type Activatable_option =
{ NAME: "Generic"; VAL: number }
| { NAME: "Skill"; VAL: number }
| { NAME: "CombatTechnique"; VAL: number }
| { NAME: "Spell"; VAL: number }
| { NAME: "Cantrip"; VAL: number }
| { NAME: "LiturgicalChant"; VAL: number }
| { NAME: "Blessing"; VAL: number }
| { NAME: "CustomInput"; VAL: string };
// tslint:disable-next-line:interface-over-type-literal
export type Activatable_single = {
readonly options: list<Activatable_option>;
readonly level: Maybe_maybe<number>;
readonly customCost: Maybe_maybe<number>
};
export type ActivatableSingle = Activatable_single;
// tslint:disable-next-line:interface-over-type-literal
export type Activatable_dependency = {
readonly source: Ids_activatableId;
readonly target: GenericHelpers_oneOrMany<Ids_activatableId>;
readonly active: boolean;
readonly options: list<GenericHelpers_oneOrMany<Ids_selectOptionId>>;
readonly level: Maybe_maybe<number>
};
export type ActivatableDependency = Activatable_dependency;
// tslint:disable-next-line:interface-over-type-literal
export type Activatable_t = {
readonly id: number;
readonly active: list<Activatable_single>;
readonly dependencies: list<Activatable_dependency>
};
export type Activatable = Activatable_t;
// tslint:disable-next-line:interface-over-type-literal
export type Attribute_dependency = {
readonly source: Ids_activatableId;
readonly target: GenericHelpers_oneOrMany<number>;
readonly value: Maybe_maybe<number>
};
export type AttributeDependency = Attribute_dependency;
// tslint:disable-next-line:interface-over-type-literal
export type Attribute_t = {
readonly id: number;
readonly value: number;
readonly dependencies: list<Attribute_dependency>
};
export type Attribute = Attribute_t;
// tslint:disable-next-line:interface-over-type-literal
export type Energies_permanentEnergyLoss = { readonly lost: number };
export type PermanentEnergyLoss = Energies_permanentEnergyLoss;
// tslint:disable-next-line:interface-over-type-literal
export type Energies_permanentEnergyLossAndBoughtBack = { readonly lost: number; readonly boughtBack: number };
export type PermanentEnergyLossAndBoughtBack = Energies_permanentEnergyLossAndBoughtBack;
// tslint:disable-next-line:interface-over-type-literal
export type Energies_t = {
readonly addedLifePoints: number;
readonly addedArcaneEnergyPoints: number;
readonly addedKarmaPoints: number;
readonly permanentLifePoints: Energies_permanentEnergyLoss;
readonly permanentArcaneEnergyPoints: Energies_permanentEnergyLossAndBoughtBack;
readonly permanentKarmaPoints: Energies_permanentEnergyLossAndBoughtBack
};
export type Energies = Energies_t;
// tslint:disable-next-line:interface-over-type-literal
export type ActivatableSkill_value =
"Inactive"
| { tag: "Active"; value: number };
// tslint:disable-next-line:interface-over-type-literal
export type ActivatableSkill_dependency = {
readonly source: Ids_activatableAndSkillId;
readonly target: GenericHelpers_oneOrMany<number>;
readonly value: ActivatableSkill_value
};
export type ActivatableSkillDependency = ActivatableSkill_dependency;
// tslint:disable-next-line:interface-over-type-literal
export type ActivatableSkill_t = {
readonly id: number;
readonly value: ActivatableSkill_value;
readonly dependencies: list<ActivatableSkill_dependency>
};
export type ActivatableSkill = ActivatableSkill_t;
// tslint:disable-next-line:interface-over-type-literal
export type Skill_dependency = {
readonly source: Ids_activatableId;
readonly target: GenericHelpers_oneOrMany<number>;
readonly value: number
};
export type SkillDependency = Skill_dependency;
// tslint:disable-next-line:interface-over-type-literal
export type Skill_t = {
readonly id: number;
readonly value: number;
readonly dependencies: list<Skill_dependency>
};
export type Skill = Skill_t;
// tslint:disable-next-line:interface-over-type-literal
export type Item_mundaneItem = { readonly structurePoints: Maybe_maybe<GenericHelpers_oneOrMany<number>> };
export type MundaneItem = Item_mundaneItem;
// tslint:disable-next-line:interface-over-type-literal
export type Item_primaryAttributeDamageThreshold =
{ tag: "SameAttribute"; value: number }
| { tag: "AgilityStrength"; value: [number, number] }
| { tag: "DifferentAttribute"; value: [number, number] };
export type PrimaryAttributeDamageThreshold = Item_primaryAttributeDamageThreshold;
// tslint:disable-next-line:interface-over-type-literal
export type Item_damage = {
readonly amount: number;
readonly sides: number;
readonly flat: Maybe_maybe<number>
};
export type Damage = Item_damage;
// tslint:disable-next-line:interface-over-type-literal
export type Item_meleeWeapon = {
readonly combatTechnique: number;
readonly damage: Item_damage;
readonly primaryAttributeDamageThreshold: Maybe_maybe<Item_primaryAttributeDamageThreshold>;
readonly at: Maybe_maybe<number>;
readonly pa: Maybe_maybe<number>;
readonly reach: Maybe_maybe<number>;
readonly length: Maybe_maybe<number>;
readonly structurePoints: Maybe_maybe<GenericHelpers_oneOrMany<number>>;
readonly breakingPointRatingMod: Maybe_maybe<number>;
readonly isParryingWeapon: boolean;
readonly isTwoHandedWeapon: boolean;
readonly isImprovisedWeapon: boolean;
readonly damaged: Maybe_maybe<number>
};
export type MeleeWeapon = Item_meleeWeapon;
// tslint:disable-next-line:interface-over-type-literal
export type Item_rangedWeapon = {
readonly combatTechnique: number;
readonly damage: Maybe_maybe<Item_damage>;
readonly length: Maybe_maybe<number>;
readonly range: [number, number, number];
readonly reloadTime: GenericHelpers_oneOrMany<number>;
readonly ammunition: Maybe_maybe<number>;
readonly isImprovisedWeapon: boolean;
readonly damaged: Maybe_maybe<number>
};
export type RangedWeapon = Item_rangedWeapon;
// tslint:disable-next-line:interface-over-type-literal
export type Item_armor = {
readonly protection: number;
readonly encumbrance: number;
readonly hasAdditionalPenalties: boolean;
readonly iniMod: Maybe_maybe<number>;
readonly movMod: Maybe_maybe<number>;
readonly sturdinessMod: Maybe_maybe<number>;
readonly armorType: number;
readonly wear: Maybe_maybe<number>;
readonly isHitZoneArmorOnly: Maybe_maybe<boolean>
};
export type Armor = Item_armor;
// tslint:disable-next-line:interface-over-type-literal
export type Item_special =
{ tag: "MundaneItem"; value: Item_mundaneItem }
| { tag: "MeleeWeapon"; value: Item_meleeWeapon }
| { tag: "RangedWeapon"; value: Item_rangedWeapon }
| { tag: "CombinedWeapon"; value: [Item_meleeWeapon, Item_rangedWeapon] }
| { tag: "Armor"; value: Item_armor };
export type Special = Item_special;
// tslint:disable-next-line:interface-over-type-literal
export type Item_t = {
readonly id: number;
readonly amount: Maybe_maybe<number>;
readonly price: Maybe_maybe<number>;
readonly weight: Maybe_maybe<number>;
readonly template: Maybe_maybe<number>;
readonly isTemplateLocked: boolean;
readonly carriedWhere: Maybe_maybe<string>;
readonly special: Maybe_maybe<Item_special>;
readonly gr: number
};
export type Item = Item_t;
// tslint:disable-next-line:interface-over-type-literal
export type hitZoneArmor = {
readonly id: number;
readonly name: string;
readonly head: Maybe_maybe<Ids_hitZoneArmorZoneItemId>;
readonly headWear: Maybe_maybe<number>;
readonly leftArm: Maybe_maybe<Ids_hitZoneArmorZoneItemId>;
readonly leftArmWear: Maybe_maybe<number>;
readonly rightArm: Maybe_maybe<Ids_hitZoneArmorZoneItemId>;
readonly rightArmWear: Maybe_maybe<number>;
readonly torso: Maybe_maybe<Ids_hitZoneArmorZoneItemId>;
readonly torsoWear: Maybe_maybe<number>;
readonly leftLeg: Maybe_maybe<Ids_hitZoneArmorZoneItemId>;
readonly leftLegWear: Maybe_maybe<number>;
readonly rightLeg: Maybe_maybe<Ids_hitZoneArmorZoneItemId>;
readonly rightLegWear: Maybe_maybe<number>
};
export type HitZoneArmor = hitZoneArmor;
// tslint:disable-next-line:interface-over-type-literal
export type purse = {
readonly ducats: number;
readonly silverthalers: number;
readonly halers: number;
readonly kreutzers: number
};
export type Purse = purse;
// tslint:disable-next-line:interface-over-type-literal
export type pet = {
readonly id: number;
readonly name: string;
readonly avatar: Maybe_maybe<string>;
readonly size: Maybe_maybe<string>;
readonly type: Maybe_maybe<string>;
readonly attack: Maybe_maybe<string>;
readonly dp: Maybe_maybe<string>;
readonly reach: Maybe_maybe<string>;
readonly actions: Maybe_maybe<string>;
readonly skills: Maybe_maybe<string>;
readonly abilities: Maybe_maybe<string>;
readonly notes: Maybe_maybe<string>;
readonly spentAp: Maybe_maybe<string>;
readonly totalAp: Maybe_maybe<string>;
readonly cou: Maybe_maybe<string>;
readonly sgc: Maybe_maybe<string>;
readonly int: Maybe_maybe<string>;
readonly cha: Maybe_maybe<string>;
readonly dex: Maybe_maybe<string>;
readonly agi: Maybe_maybe<string>;
readonly con: Maybe_maybe<string>;
readonly str: Maybe_maybe<string>;
readonly lp: Maybe_maybe<string>;
readonly ae: Maybe_maybe<string>;
readonly spi: Maybe_maybe<string>;
readonly tou: Maybe_maybe<string>;
readonly pro: Maybe_maybe<string>;
readonly ini: Maybe_maybe<string>;
readonly mov: Maybe_maybe<string>;
readonly at: Maybe_maybe<string>;
readonly pa: Maybe_maybe<string>
};
export type Pet = pet;
// tslint:disable-next-line:interface-over-type-literal
export type Pact_domain =
{ tag: "Predefined"; value: number }
| { tag: "Custom"; value: string };
export type PactDomain = Pact_domain;
// tslint:disable-next-line:interface-over-type-literal
export type Pact_t = {
readonly category: number;
readonly level: number;
readonly type: number;
readonly domain: Pact_domain;
readonly name: string
};
export type Pact = Pact_t;
// tslint:disable-next-line:interface-over-type-literal
export type styleDependency = {
readonly id: GenericHelpers_oneOrMany<number>;
readonly active: Maybe_maybe<number>;
readonly origin: number
};
export type StyleDependency = styleDependency;
// tslint:disable-next-line:interface-over-type-literal
export type TransferUnfamiliar_id =
"Spells"
| "LiturgicalChants"
| { tag: "Spell"; value: number }
| { tag: "LiturgicalChant"; value: number };
export type TransferUnfamiliarId = TransferUnfamiliar_id;
// tslint:disable-next-line:interface-over-type-literal
export type TransferUnfamiliar_t = { readonly id: TransferUnfamiliar_id; readonly srcId: number };
export type TransferUnfamiliar = TransferUnfamiliar_t;
// tslint:disable-next-line:interface-over-type-literal
export type t = {
readonly name: string;
readonly dateCreated: Date;
readonly dateModified: Date;
readonly adventurePointsTotal: number;
readonly experienceLevel: number;
readonly sex: sex;
readonly phase: phase;
readonly locale: string;
readonly avatar: Maybe_maybe<string>;
readonly race: Maybe_maybe<number>;
readonly raceVariant: Maybe_maybe<baseOrWithVariant>;
readonly culture: Maybe_maybe<number>;
readonly isCulturalPackageActive: boolean;
readonly profession: Maybe_maybe<baseOrWithVariant>;
readonly professionName: Maybe_maybe<string>;
readonly rules: Rules_t;
readonly personalData: personalData;
readonly advantages: IntMap_t<Activatable_t>;
readonly disadvantages: IntMap_t<Activatable_t>;
readonly specialAbilities: IntMap_t<Activatable_t>;
readonly attributes: IntMap_t<Attribute_t>;
readonly attributeAdjustmentSelected: number;
readonly energies: Energies_t;
readonly skills: IntMap_t<Skill_t>;
readonly combatTechniques: IntMap_t<Skill_t>;
readonly spells: IntMap_t<ActivatableSkill_t>;
readonly liturgicalChants: IntMap_t<ActivatableSkill_t>;
readonly cantrips: IntSet_t;
readonly blessings: IntSet_t;
readonly items: list<Item_t>;
readonly hitZoneArmors: list<hitZoneArmor>;
readonly purse: purse;
readonly pets: list<pet>;
readonly pact: Maybe_maybe<Pact_t>;
readonly combatStyleDependencies: list<styleDependency>;
readonly magicalStyleDependencies: list<styleDependency>;
readonly blessedStyleDependencies: list<styleDependency>;
readonly skillStyleDependencies: list<styleDependency>;
readonly socialStatusDependencies: list<number>;
readonly transferredUnfamiliarSpells: list<TransferUnfamiliar_t>
};
export type Hero = t;
-449
View File
@@ -1,449 +0,0 @@
open Maybe;
open GenericHelpers;
[@genType "Phase"]
type phase =
| Outline
| Definition
| Advancement;
[@genType "Sex"]
type sex =
| Male
| Female;
[@genType "BaseOrWithVariant"]
type baseOrWithVariant =
| Base(int)
| WithVariant(int, int);
module Rules = {
[@genType "ActiveRule"]
type activeRule = {
id: int,
options: list(int),
};
[@genType "Rules"]
type t = {
areAllPublicationsActive: bool,
activePublications: list(string),
activeFocusRules: list(activeRule),
activeOptionalRules: list(activeRule),
};
};
[@genType "PersonalData"]
type personalData = {
family: maybe(string),
placeOfBirth: maybe(string),
dateOfBirth: maybe(string),
age: maybe(string),
hairColor: maybe(int),
eyeColor: maybe(int),
size: maybe(string),
weight: maybe(string),
title: maybe(string),
socialStatus: maybe(int),
characteristics: maybe(string),
otherInfo: maybe(string),
cultureAreaKnowledge: maybe(string),
};
module Activatable = {
type option = [
| `Generic(int)
| `Skill(int)
| `CombatTechnique(int)
| `Spell(int)
| `Cantrip(int)
| `LiturgicalChant(int)
| `Blessing(int)
| `CustomInput(string)
];
[@genType "ActivatableSingle"]
type single = {
options: list(option),
level: maybe(int),
customCost: maybe(int),
};
[@genType "ActivatableDependency"]
type dependency = {
source: Ids.activatableId,
target: oneOrMany(Ids.activatableId),
active: bool,
options: list(oneOrMany(Ids.selectOptionId)),
level: maybe(int),
};
[@genType "Activatable"]
type t = {
id: int,
active: list(single),
dependencies: list(dependency),
};
};
module Attribute = {
[@genType "AttributeDependency"]
type dependency = {
source: Ids.activatableId,
target: oneOrMany(int),
value: maybe(int),
};
[@genType "Attribute"]
type t = {
id: int,
value: int,
dependencies: list(dependency),
};
};
module Energies = {
[@genType "PermanentEnergyLoss"]
type permanentEnergyLoss = {lost: int};
[@genType "PermanentEnergyLossAndBoughtBack"]
type permanentEnergyLossAndBoughtBack = {
lost: int,
boughtBack: int,
};
[@genType "Energies"]
type t = {
addedLifePoints: int,
addedArcaneEnergyPoints: int,
addedKarmaPoints: int,
permanentLifePoints: permanentEnergyLoss,
permanentArcaneEnergyPoints: permanentEnergyLossAndBoughtBack,
permanentKarmaPoints: permanentEnergyLossAndBoughtBack,
};
};
module ActivatableSkill = {
type value =
| Inactive
| Active(int);
[@genType "ActivatableSkillDependency"]
type dependency = {
source: Ids.activatableAndSkillId,
target: oneOrMany(int),
value,
};
[@genType "ActivatableSkill"]
type t = {
id: int,
value,
dependencies: list(dependency),
};
};
module Skill = {
[@genType "SkillDependency"]
type dependency = {
source: Ids.activatableId,
target: oneOrMany(int),
value: int,
};
[@genType "Skill"]
type t = {
id: int,
value: int,
dependencies: list(dependency),
};
};
module Item = {
[@genType "MundaneItem"]
type mundaneItem = {structurePoints: maybe(oneOrMany(int))};
[@genType "PrimaryAttributeDamageThreshold"]
type primaryAttributeDamageThreshold =
| SameAttribute(int)
| AgilityStrength(int, int)
| DifferentAttribute(int, int);
[@genType "Damage"]
type damage = {
amount: int,
sides: int,
flat: maybe(int),
};
[@genType "MeleeWeapon"]
type meleeWeapon = {
combatTechnique: int,
damage,
primaryAttributeDamageThreshold: maybe(primaryAttributeDamageThreshold),
at: maybe(int),
pa: maybe(int),
reach: maybe(int),
length: maybe(int),
structurePoints: maybe(oneOrMany(int)),
breakingPointRatingMod: maybe(int),
isParryingWeapon: bool,
isTwoHandedWeapon: bool,
isImprovisedWeapon: bool,
damaged: maybe(int),
};
[@genType "RangedWeapon"]
type rangedWeapon = {
combatTechnique: int,
damage: maybe(damage),
length: maybe(int),
range: (int, int, int),
reloadTime: oneOrMany(int),
ammunition: maybe(int),
isImprovisedWeapon: bool,
damaged: maybe(int),
};
[@genType "Armor"]
type armor = {
protection: int,
encumbrance: int,
hasAdditionalPenalties: bool,
iniMod: maybe(int),
movMod: maybe(int),
sturdinessMod: maybe(int),
armorType: int,
wear: maybe(int),
isHitZoneArmorOnly: maybe(bool),
};
[@genType "Special"]
type special =
| MundaneItem(mundaneItem)
| MeleeWeapon(meleeWeapon)
| RangedWeapon(rangedWeapon)
| CombinedWeapon(meleeWeapon, rangedWeapon)
| Armor(armor);
[@genType "Item"]
type t = {
id: int,
amount: maybe(int),
price: maybe(int),
weight: maybe(int),
template: maybe(int),
isTemplateLocked: bool,
carriedWhere: maybe(string),
special: maybe(special),
gr: int,
};
};
[@genType "HitZoneArmor"]
type hitZoneArmor = {
/**
* The hit zone armor's ID.
*/
id: int,
/**
* The name of the hit zone armor.
*/
name: string,
/**
* ID of the armor at zone *head*. Can be either a template ID or the ID of an
* armor from `items`.
*/
head: maybe(Ids.hitZoneArmorZoneItemId),
/**
* The level of wear at zone *head*, if any. Ignores `wear` if custom armor is
* used, even if `headWear` is not defined.
*/
headWear: maybe(int),
/**
* ID of the armor at zone *left arm*. Can be either a template ID or the ID
* of an armor from `items`.
*/
leftArm: maybe(Ids.hitZoneArmorZoneItemId),
/**
* The level of wear at zone *left arm*, if any. Ignores `wear` if custom
* armor is used, even if `leftArmWear` is not defined.
*/
leftArmWear: maybe(int),
/**
* ID of the armor at zone *right arm*. Can be either a template ID or the ID
* of an item from `items`.
*/
rightArm: maybe(Ids.hitZoneArmorZoneItemId),
/**
* The level of wear at zone *right arm*, if any. Ignores `wear` if custom
* armor is used, even if `rightArmWear` is not defined.
*/
rightArmWear: maybe(int),
/**
* ID of the armor at zone *torso*. Can be either a template ID or the ID of
* an armor from `items`.
*/
torso: maybe(Ids.hitZoneArmorZoneItemId),
/**
* The level of wear at zone *torso*, if any. Ignores `wear` if custom armor
* is used, even if `torsoWear` is not defined.
*/
torsoWear: maybe(int),
/**
* ID of the armor at zone *left leg*. Can be either a template ID or the ID
* of an armor from `items`.
*/
leftLeg: maybe(Ids.hitZoneArmorZoneItemId),
/**
* The level of wear at zone *left leg*, if any. Ignores `wear` if custom
* armor is used, even if `leftLegWear` is not defined.
*/
leftLegWear: maybe(int),
/**
* ID of the armor at zone *right leg*. Can be either a template ID or the ID
* of an armor from `items`.
*/
rightLeg: maybe(Ids.hitZoneArmorZoneItemId),
/**
* The level of wear at zone *right leg*, if any. Ignores `wear` if custom
* armor is used, even if `rightLegWear` is not defined.
*/
rightLegWear: maybe(int),
};
[@genType "Purse"]
type purse = {
ducats: int,
silverthalers: int,
halers: int,
kreutzers: int,
};
[@genType "Pet"]
type pet = {
id: int,
name: string,
avatar: maybe(string),
size: maybe(string),
[@bs.as "type"]
type_: maybe(string),
attack: maybe(string),
dp: maybe(string),
reach: maybe(string),
actions: maybe(string),
skills: maybe(string),
abilities: maybe(string),
notes: maybe(string),
spentAp: maybe(string),
totalAp: maybe(string),
cou: maybe(string),
sgc: maybe(string),
int: maybe(string),
cha: maybe(string),
dex: maybe(string),
agi: maybe(string),
con: maybe(string),
str: maybe(string),
lp: maybe(string),
ae: maybe(string),
spi: maybe(string),
tou: maybe(string),
pro: maybe(string),
ini: maybe(string),
mov: maybe(string),
at: maybe(string),
pa: maybe(string),
};
module Pact = {
[@genType "PactDomain"]
type domain =
| Predefined(int)
| Custom(string);
[@genType "Pact"]
type t = {
category: int,
level: int,
[@bs.as "type"]
type_: int,
domain,
name: string,
};
};
[@genType "StyleDependency"]
type styleDependency = {
/**
* The extended special ability or list of available special abilities.
*/
id: oneOrMany(int),
/**
* If a ability meets a given id, then `Just id`, otherwise `Nothing`.
*/
active: maybe(int),
/**
* The style's id.
*/
origin: int,
};
module TransferUnfamiliar = {
[@genType "TransferUnfamiliarId"]
type id =
| Spell(int)
| Spells
| LiturgicalChant(int)
| LiturgicalChants;
[@genType "TransferUnfamiliar"]
type t = {
id,
srcId: int,
};
};
[@genType "Hero"]
type t = {
name: string,
dateCreated: Js.Date.t,
dateModified: Js.Date.t,
adventurePointsTotal: int,
experienceLevel: int,
sex,
phase,
locale: string,
avatar: maybe(string),
race: maybe(int),
raceVariant: maybe(baseOrWithVariant),
culture: maybe(int),
isCulturalPackageActive: bool,
profession: maybe(baseOrWithVariant),
professionName: maybe(string),
rules: Rules.t,
personalData,
advantages: IntMap.t(Activatable.t),
disadvantages: IntMap.t(Activatable.t),
specialAbilities: IntMap.t(Activatable.t),
attributes: IntMap.t(Attribute.t),
attributeAdjustmentSelected: int,
energies: Energies.t,
skills: IntMap.t(Skill.t),
combatTechniques: IntMap.t(Skill.t),
spells: IntMap.t(ActivatableSkill.t),
liturgicalChants: IntMap.t(ActivatableSkill.t),
cantrips: IntSet.t,
blessings: IntSet.t,
items: list(Item.t),
hitZoneArmors: list(hitZoneArmor),
purse,
pets: list(pet),
pact: maybe(Pact.t),
combatStyleDependencies: list(styleDependency),
magicalStyleDependencies: list(styleDependency),
blessedStyleDependencies: list(styleDependency),
skillStyleDependencies: list(styleDependency),
socialStatusDependencies: list(int),
transferredUnfamiliarSpells: list(TransferUnfamiliar.t),
};
+1 -2
View File
@@ -1,4 +1,3 @@
import { List } from "../../../Data/List"
import { isJust, Just, Nothing } from "../../../Data/Maybe"
import { fromDefault, makeLenses, Record } from "../../../Data/Record"
import { EditPrimaryAttributeDamageThreshold } from "./EditPrimaryAttributeDamageThreshold"
@@ -46,7 +45,7 @@ export const EditItem =
pa: "",
price: "",
pro: "",
range: List ("", "", ""),
range: { close: "", medium: "", far: "" },
reloadTime: "",
stp: "",
weight: "",
+9 -1
View File
@@ -72,6 +72,10 @@ export interface HeroModel {
skillStyleDependencies: List<Record<StyleDependency>>
socialStatusDependencies: List<SocialStatusId>
transferredUnfamiliarSpells: List<Record<TransferUnfamiliar>>
blessedPrimaryAttributeDependencies:
readonly Readonly<{ sourceIdentifier: string; minValue: number }>[]
magicalPrimaryAttributeDependencies:
readonly Readonly<{ sourceIdentifier: string; minValue: number }>[]
skillCheckAttributeCache: SkillCheckAttributeCache
}
@@ -127,7 +131,9 @@ export const HeroModel: RecordCreator<HeroModel> =
skillStyleDependencies: List (),
socialStatusDependencies: List (),
transferredUnfamiliarSpells: List (),
skillCheckAttributeCache: OrderedMap.empty,
blessedPrimaryAttributeDependencies: [],
magicalPrimaryAttributeDependencies: [],
skillCheckAttributeCache: new Map (),
})
export const HeroModelL = makeLenses (HeroModel)
@@ -186,5 +192,7 @@ export const getInitialHeroObject =
skillStyleDependencies: Nothing,
socialStatusDependencies: Nothing,
transferredUnfamiliarSpells: Nothing,
blessedPrimaryAttributeDependencies: [],
magicalPrimaryAttributeDependencies: [],
skillCheckAttributeCache: Nothing,
})
+3 -1
View File
@@ -26,6 +26,8 @@ export interface ItemBase {
armorType: Maybe<number>
}
export type Range = Readonly<{ close: number; medium: number; far: number }>
export interface Item extends ItemBase {
"@@name": "Item"
id: string
@@ -41,7 +43,7 @@ export interface Item extends ItemBase {
pa: Maybe<number>
price: Maybe<number>
pro: Maybe<number>
range: Maybe<List<number>>
range: Maybe<Range>
reloadTime: Maybe<number | List<number>>
stp: Maybe<number | List<number>>
weight: Maybe<number>
+3 -1
View File
@@ -102,6 +102,8 @@ export enum EntryRating {
Essential = "Essential",
}
export type EditRange = Readonly<{ close: string; medium: string; far: string }>
export interface ItemEditorSpecific {
id: Maybe<string>
at: string
@@ -116,7 +118,7 @@ export interface ItemEditorSpecific {
pa: string
price: string
pro: string
range: List<string>
range: EditRange
reloadTime: string
stp: string
weight: string
-7
View File
@@ -1,7 +0,0 @@
/* TypeScript file generated from Sex.re by genType. */
/* eslint-disable import/first */
// tslint:disable-next-line:interface-over-type-literal
export type t = "Male" | "Female";
export type Sex = t;
-125
View File
@@ -1,125 +0,0 @@
// Generated by ReScript, PLEASE EDIT WITH CARE
'use strict';
var SourceRef;
var Erratum;
var Prerequisites;
var Skill;
var SelectOption;
var Advantage;
var AnimistForce;
var Attribute;
var BlessedTradition;
var Blessing;
var Cantrip;
var CombatTechnique;
var Condition;
var Culture;
var Curse;
var DerivedCharacteristic;
var Disadvantage;
var DominationRitual;
var ElvenMagicalSong;
var EquipmentPackage;
var ExperienceLevel;
var FocusRule;
var GeodeRitual;
var Item;
var LiturgicalChant;
var MagicalDance;
var MagicalMelody;
var MagicalTradition;
var Messages;
var OptionalRule;
var PactCategory;
var Patron;
var Profession;
var Publication;
var Race;
var RogueSpell;
var SpecialAbility;
var Spell;
var State;
var ZibiljaRitual;
exports.SourceRef = SourceRef;
exports.Erratum = Erratum;
exports.Prerequisites = Prerequisites;
exports.Skill = Skill;
exports.SelectOption = SelectOption;
exports.Advantage = Advantage;
exports.AnimistForce = AnimistForce;
exports.Attribute = Attribute;
exports.BlessedTradition = BlessedTradition;
exports.Blessing = Blessing;
exports.Cantrip = Cantrip;
exports.CombatTechnique = CombatTechnique;
exports.Condition = Condition;
exports.Culture = Culture;
exports.Curse = Curse;
exports.DerivedCharacteristic = DerivedCharacteristic;
exports.Disadvantage = Disadvantage;
exports.DominationRitual = DominationRitual;
exports.ElvenMagicalSong = ElvenMagicalSong;
exports.EquipmentPackage = EquipmentPackage;
exports.ExperienceLevel = ExperienceLevel;
exports.FocusRule = FocusRule;
exports.GeodeRitual = GeodeRitual;
exports.Item = Item;
exports.LiturgicalChant = LiturgicalChant;
exports.MagicalDance = MagicalDance;
exports.MagicalMelody = MagicalMelody;
exports.MagicalTradition = MagicalTradition;
exports.Messages = Messages;
exports.OptionalRule = OptionalRule;
exports.PactCategory = PactCategory;
exports.Patron = Patron;
exports.Profession = Profession;
exports.Publication = Publication;
exports.Race = Race;
exports.RogueSpell = RogueSpell;
exports.SpecialAbility = SpecialAbility;
exports.Spell = Spell;
exports.State = State;
exports.ZibiljaRitual = ZibiljaRitual;
/* No side effect */

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