diff --git a/.github/ISSUE_TEMPLATE/BUG-REPORT.yml b/.github/ISSUE_TEMPLATE/BUG-REPORT.yml
index bb592bce..941776f3 100644
--- a/.github/ISSUE_TEMPLATE/BUG-REPORT.yml
+++ b/.github/ISSUE_TEMPLATE/BUG-REPORT.yml
@@ -32,42 +32,15 @@ body:
- Always
validations:
required: true
- - type: textarea
- id: operating-system
- attributes:
- label: What operating system are you using?
- description: Operating system
- placeholder: Tell us what operating system you using (Windows 11, Windows 10, etc.)
- value: "Windows 10 21H2"
- validations:
- required: true
- type: textarea
id: version
attributes:
label: What version of the program are you using?
description: Program Version
- placeholder: Tell us what version you using (x.y.z)
+ placeholder: Tell us what version you are using (x.y.z)
value: "Latest version"
validations:
required: true
- - type: dropdown
- id: game-version
- attributes:
- label: What version of the game are you using?
- multiple: true
- options:
- - High-Grade Edition
- - Non High-Grade Edition
- validations:
- required: true
- - type: input
- id: quest-id
- attributes:
- label: Quest ID
- description: What is the Quest ID where the issue occurs? Enter the quest ID that you see in the overlay, enabled by going into Config -> Quest Log -> Settings. If the issue occurs in multiple quests, enter an example quest ID and tell us in the issue description that it happens in multiple quests. If the issue occurs outside quests, enter 0.
- placeholder: '0'
- validations:
- required: true
- type: markdown
attributes:
value: |
diff --git a/.github/workflows/dotnet.yml b/.github/workflows/dotnet.yml
index 243c0db9..13ae7ea0 100644
--- a/.github/workflows/dotnet.yml
+++ b/.github/workflows/dotnet.yml
@@ -28,4 +28,6 @@ jobs:
- name: Build
run: dotnet build --configuration Release --no-restore
- name: Test
- run: dotnet test --no-restore --verbosity normal
\ No newline at end of file
+ run: |
+ cd MHFZ_OverlayTest
+ dotnet test --no-restore --verbosity normal
\ No newline at end of file
diff --git a/CHANGELOG.md b/CHANGELOG.md
index e7d3c366..be4c638b 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,200 @@
+## [0.30.0](https://github.com/DorielRivalet/MHFZ_Overlay/compare/v0.29.1...v0.30.0) (2023-09-01)
+
+
+### Features
+
+* **achievements:** add more achievements ([644ff63](https://github.com/DorielRivalet/MHFZ_Overlay/commit/644ff63e2b0ee10ba3ae30b48063c4a5595b6205))
+* **achievements:** add more achievements ([2f1d405](https://github.com/DorielRivalet/MHFZ_Overlay/commit/2f1d4057cb6cc2127742330729079896218582b9))
+* **achievements:** add more achievements ([5d17dc4](https://github.com/DorielRivalet/MHFZ_Overlay/commit/5d17dc48ce2a3063b9aebdaaf7f92bc7cabf725e))
+* **achievements:** expand achievements collection ([8ee9db8](https://github.com/DorielRivalet/MHFZ_Overlay/commit/8ee9db8c0e04238e7fc2452d269e430d65b79f69))
+* **achievements:** expand collection ([9ab8271](https://github.com/DorielRivalet/MHFZ_Overlay/commit/9ab82717d70ee20896df00e6fabcb31f6aded597))
+* **achievements:** expand collection ([0640049](https://github.com/DorielRivalet/MHFZ_Overlay/commit/0640049bc5239005de914042453fcdd401d3dec3))
+* **achievements:** expand collection ([7c083ab](https://github.com/DorielRivalet/MHFZ_Overlay/commit/7c083ab3ea7ffcf180733cb91fda0eae5a05bf78))
+* **achievements:** expand collection ([2c05144](https://github.com/DorielRivalet/MHFZ_Overlay/commit/2c05144bc5d45eabdeed670916183d7239f62a86))
+* **achievements:** make more obtainable achievements ([8fa3be8](https://github.com/DorielRivalet/MHFZ_Overlay/commit/8fa3be817e178e4f1ede307f96e758cea753a78b))
+* **achievements:** update achievements ([0e46864](https://github.com/DorielRivalet/MHFZ_Overlay/commit/0e4686476f3f2d762986186f4252715d449487aa))
+* **achievements:** update achievements explanation in configuration window ([e0e1caa](https://github.com/DorielRivalet/MHFZ_Overlay/commit/e0e1caa8e3f06b18a40dcd64184cd1cf39b5be58))
+* **achievements:** update achievements explanation in configuration window ([d1a3b3e](https://github.com/DorielRivalet/MHFZ_Overlay/commit/d1a3b3e5a16625dba59caf41bf0bcd503251334d))
+* add ancient dragon images ([5cee57e](https://github.com/DorielRivalet/MHFZ_Overlay/commit/5cee57e2a1e77bb76000113522509420d091d6dd))
+* add automatic git stats scripts ([c4d3d71](https://github.com/DorielRivalet/MHFZ_Overlay/commit/c4d3d718c8166f57ff4bc73bcb3b87d5b3e9a7c1))
+* add challenge button sound effects ([c926b7a](https://github.com/DorielRivalet/MHFZ_Overlay/commit/c926b7a352384ef273b3380f5ce0767e18a9d34e))
+* add frontier data collections for colors ([e014250](https://github.com/DorielRivalet/MHFZ_Overlay/commit/e0142509547373a8dfa005c50411bfb48fd51ed1))
+* add hc/ul options ([ff34d9c](https://github.com/DorielRivalet/MHFZ_Overlay/commit/ff34d9c29be2c619fc9e7bdc019b17cbc5f8f66e))
+* add messengers ([49c0397](https://github.com/DorielRivalet/MHFZ_Overlay/commit/49c039795079e036eb7e645a4ce0cdedd15151f8))
+* add more achievements ([0c45548](https://github.com/DorielRivalet/MHFZ_Overlay/commit/0c45548a3de7eaebe9ac92c6c1212178e5bea4ce))
+* add more bitfields ([f4c428a](https://github.com/DorielRivalet/MHFZ_Overlay/commit/f4c428a6d7d463c3939a30408c979d6d0a5778bc))
+* add quest id logging ([9eff2a6](https://github.com/DorielRivalet/MHFZ_Overlay/commit/9eff2a627ba29da8cae865df95dc9e1ccbcf880b))
+* add quest toggle mode functionality ([c5bfb18](https://github.com/DorielRivalet/MHFZ_Overlay/commit/c5bfb18b2d434583133b45d91955bde902fa2456))
+* add time service ([d89d9f7](https://github.com/DorielRivalet/MHFZ_Overlay/commit/d89d9f7faa545e251c9d039ceb7a2aaca93c1e26))
+* add watermark modes options ([c513fe7](https://github.com/DorielRivalet/MHFZ_Overlay/commit/c513fe761e90d1bf8ab047d27dfe35e04882a986)), closes [DorielRivalet/mhfz-overlay#171](https://github.com/DorielRivalet/mhfz-overlay/issues/171)
+* **assets:** add gauntlet icons ([23579c4](https://github.com/DorielRivalet/MHFZ_Overlay/commit/23579c489b43be26dc2051ed8e775f9e9da2f793))
+* **assets:** add images ([e7d480b](https://github.com/DorielRivalet/MHFZ_Overlay/commit/e7d480b8535907b33d5994f4e1794d709a2142d9))
+* **audio:** add challenge sound effects ([4b786ac](https://github.com/DorielRivalet/MHFZ_Overlay/commit/4b786ac586074777f8eb14ab17f5072eb07d2da4))
+* **audio:** add sound effects files ([87b2356](https://github.com/DorielRivalet/MHFZ_Overlay/commit/87b235671bcf0ca985ec864142938faea4169ae3))
+* **audio:** implement audio configuration ([f3cd221](https://github.com/DorielRivalet/MHFZ_Overlay/commit/f3cd221d52bd1e9eef5cbd9f55bc1282eaf4cff5)), closes [DorielRivalet/mhfz-overlay#162](https://github.com/DorielRivalet/mhfz-overlay/issues/162)
+* **benchmark:** add benchmarks ([7ded0ff](https://github.com/DorielRivalet/MHFZ_Overlay/commit/7ded0ff75fcf3dadf8f3a05d01e4949ba674ec80))
+* **bingo:** add bingo buttons reactivity ([64dcc1a](https://github.com/DorielRivalet/MHFZ_Overlay/commit/64dcc1a646dad2cbddfe2c00a8ac4b7826983efc))
+* **bingo:** add bingo cell model ([f410d9d](https://github.com/DorielRivalet/MHFZ_Overlay/commit/f410d9d9687e0b79f91e3541ade2d0590620f705))
+* **bingo:** add bingo data structures ([8e7057b](https://github.com/DorielRivalet/MHFZ_Overlay/commit/8e7057bad0f0c02b89b0a12f6f598072a6e53486))
+* **bingo:** add converters ([dd65157](https://github.com/DorielRivalet/MHFZ_Overlay/commit/dd65157d5d6890847ceba37a30ef812a5e434b80))
+* **bingo:** add snackbar ([b285192](https://github.com/DorielRivalet/MHFZ_Overlay/commit/b2851920f324bd70b05820f7fa4b3d5267cebd0c))
+* **bingo:** add true transcend gauge ([c7f8f4b](https://github.com/DorielRivalet/MHFZ_Overlay/commit/c7f8f4b4ddbd6ce362533287b47653af7f77b5b0))
+* **bingo:** adjust monster base score ([52134ad](https://github.com/DorielRivalet/MHFZ_Overlay/commit/52134adc25eee2e5e796974fcfa7cf7eddf87471))
+* **bingo:** expand bingo functionality ([d4b966d](https://github.com/DorielRivalet/MHFZ_Overlay/commit/d4b966dbde24bbc59655c23f956309a8432176ff))
+* **bingo:** expand monster collection ([b4edf7c](https://github.com/DorielRivalet/MHFZ_Overlay/commit/b4edf7cb81176bd0dee1c1d6832e67f2ee378329))
+* **bingo:** generate bingo board view ([bef2c53](https://github.com/DorielRivalet/MHFZ_Overlay/commit/bef2c533a787669e02f249dad5261253f22b23dd))
+* **bingo:** update bingo window layout ([ccf7a19](https://github.com/DorielRivalet/MHFZ_Overlay/commit/ccf7a19519f382407d90e79d78f286198bfde9c0))
+* **bingo:** update models ([bcbac76](https://github.com/DorielRivalet/MHFZ_Overlay/commit/bcbac764aa206695e46d509176a5bd021755a094))
+* **bingo:** update tab layout ([fb09a35](https://github.com/DorielRivalet/MHFZ_Overlay/commit/fb09a35f28d6084afd709a13e8c50a9711eb449a))
+* **bitfields:** add gauntlet boost ([2b50a3a](https://github.com/DorielRivalet/MHFZ_Overlay/commit/2b50a3a2c8e544dad7bdf2c683eee53dd6535f51))
+* **bitfields:** add more bitfields ([ab8099e](https://github.com/DorielRivalet/MHFZ_Overlay/commit/ab8099e865c4b21143451f3b1d350af70349f573))
+* **challenge:** add challenge states ([ff1540b](https://github.com/DorielRivalet/MHFZ_Overlay/commit/ff1540b066bef37d7472be3d090af3b98f65a1d4))
+* **challenges:** add book of secrets data ([6db07d1](https://github.com/DorielRivalet/MHFZ_Overlay/commit/6db07d1b19db221ba452fbb8d1b9fd546d6ba28e))
+* **challenges:** add challenges unlock button ([458f9ae](https://github.com/DorielRivalet/MHFZ_Overlay/commit/458f9ae01649074224b83e1322cf5e1e76c59d6d))
+* **challenges:** add check for challenge window ([81c4410](https://github.com/DorielRivalet/MHFZ_Overlay/commit/81c44107b27facc2d207135988e10c63e30b6177))
+* **challenges:** add inventory system ([f1fb95d](https://github.com/DorielRivalet/MHFZ_Overlay/commit/f1fb95d036a8d1c6f86c92d44629d10056b836f0))
+* **challenges:** add sky corridor to collection ([eebe66e](https://github.com/DorielRivalet/MHFZ_Overlay/commit/eebe66e465405d11cdc85613a5383ac309240434))
+* **challenges:** implement challenge unlock ([cddc2e2](https://github.com/DorielRivalet/MHFZ_Overlay/commit/cddc2e242e3c6aa8aa979f8a2da522812b7dc6fb))
+* **challenges:** update challenges explanation ([11794f4](https://github.com/DorielRivalet/MHFZ_Overlay/commit/11794f4bdc14499000c7b17bb79adc6b0cbfd58f))
+* **challenges:** update dragon parts description ([aa6d19e](https://github.com/DorielRivalet/MHFZ_Overlay/commit/aa6d19e6b1fa163d9523ebf44a4458760fdf00d5))
+* **challenge:** update ancient dragon parts ([4886f58](https://github.com/DorielRivalet/MHFZ_Overlay/commit/4886f58c366ae2c3b68c7c7e30d6aef4e64c9960))
+* change default settings values ([99b99cc](https://github.com/DorielRivalet/MHFZ_Overlay/commit/99b99cc60b2b8f4197a86ac7b25eb320da2a17b4))
+* **configuration:** add audio section ([8ca2272](https://github.com/DorielRivalet/MHFZ_Overlay/commit/8ca2272b5e9f43226fea12ee8c8e7acca75137a9))
+* **configuration:** add missing overlay restart icons ([a7e0de8](https://github.com/DorielRivalet/MHFZ_Overlay/commit/a7e0de8c8d9de15f5e52f6137b772817ccc961f5))
+* **configuration:** add missing restart requirement ([a7d05eb](https://github.com/DorielRivalet/MHFZ_Overlay/commit/a7d05ebe95403adbe107c541e8809a6cf09bfbc9))
+* disable challenges with early return ([7a2ae3f](https://github.com/DorielRivalet/MHFZ_Overlay/commit/7a2ae3f4718d99fc3567023ffbb92c1ae2139630))
+* **discord:** add UL/HC ([812072c](https://github.com/DorielRivalet/MHFZ_Overlay/commit/812072c6511380260f68755b0c30e7e4819279d2))
+* expand bingo functionality ([bd733ab](https://github.com/DorielRivalet/MHFZ_Overlay/commit/bd733ab3f15967ca9a3147d57f2d436904406272))
+* **github:** update bug report template ([cab623b](https://github.com/DorielRivalet/MHFZ_Overlay/commit/cab623b06de8c0f9ce495973c34c1f01146079c5))
+* make invariant cultureinfo default ([16c2d45](https://github.com/DorielRivalet/MHFZ_Overlay/commit/16c2d4570faffcd4e1d26d4db10aaec6c32a1d8e))
+* **rakefile:** change current working directory ([61e59c4](https://github.com/DorielRivalet/MHFZ_Overlay/commit/61e59c49564cebf761b38ad120087040bad4cab2))
+* **scripts:** add file and folder checks in lua script ([c3d6b33](https://github.com/DorielRivalet/MHFZ_Overlay/commit/c3d6b334379f21385b3fddec5e338f7f164efc58))
+* **scripts:** print success message ([ba0f6aa](https://github.com/DorielRivalet/MHFZ_Overlay/commit/ba0f6aa16e2667e2dbc14aacd11155bd3949ce9b))
+* **scripts:** show current working directory in python ([04b3767](https://github.com/DorielRivalet/MHFZ_Overlay/commit/04b37679bded9bb0feee1a4ad364503571da7dea))
+* **scripts:** show present working directory ([31f8a13](https://github.com/DorielRivalet/MHFZ_Overlay/commit/31f8a13b2861c6fcb9aaed6816c16614ea8d59c3))
+* update ancient dragon parts ([3bf4544](https://github.com/DorielRivalet/MHFZ_Overlay/commit/3bf45446b4e2b68ef5a9f82d32d5062e2cee11f8))
+
+
+### Bug Fixes
+
+* **assets:** armor sphere icon ([2eb964c](https://github.com/DorielRivalet/MHFZ_Overlay/commit/2eb964ca5fda587473d6eb30a5d1eb55e83cb68f))
+* binding failures ([eefc246](https://github.com/DorielRivalet/MHFZ_Overlay/commit/eefc246b21e29dedba38a8299ef39fcf6852fb49))
+* code paths ([31a15e5](https://github.com/DorielRivalet/MHFZ_Overlay/commit/31a15e539aa7f6278ebc8eeac600d0c372dce3e6))
+* custom quest id showing when disabled in settings ([0aa9187](https://github.com/DorielRivalet/MHFZ_Overlay/commit/0aa9187f4e369b52b83f2b54fdbe8dc7691af7ef))
+* monster 2 hp bar visibility ([cedcea3](https://github.com/DorielRivalet/MHFZ_Overlay/commit/cedcea3dcd5c6694f6db9d3ff9423ccb5ec6c617))
+* quest time percent ([97b603b](https://github.com/DorielRivalet/MHFZ_Overlay/commit/97b603b376a429d0b7d8b66208c3e30ba2d4b218))
+* **rakefile:** change current working directory ([9fd1bed](https://github.com/DorielRivalet/MHFZ_Overlay/commit/9fd1bed1604b58c8b5186d7c4797c8945a998132))
+* remove warnings ([4d233e9](https://github.com/DorielRivalet/MHFZ_Overlay/commit/4d233e9aea9b0b03fd30070c5313a8b70d91156c))
+* **scripts:** change makefile paths ([085f229](https://github.com/DorielRivalet/MHFZ_Overlay/commit/085f229b3366cab6333a6e513abdbbd7e7691c0f))
+* **scripts:** change paths in lua ([ece2702](https://github.com/DorielRivalet/MHFZ_Overlay/commit/ece270296d512174af64dcdc42e9e6e1bcc8a0b6))
+* **scripts:** fix lua file ([84eeabf](https://github.com/DorielRivalet/MHFZ_Overlay/commit/84eeabf77e51c08fe83e0f0f4bafbed25e58da9f))
+* **scripts:** makefile whitespace ([3d5fb21](https://github.com/DorielRivalet/MHFZ_Overlay/commit/3d5fb215f9da06f9318847c254437c2c179bd921))
+* **sqlite:** date formatting ([60e1bbb](https://github.com/DorielRivalet/MHFZ_Overlay/commit/60e1bbb04ebbc2104722585e101e119a93d4586a)), closes [DorielRivalet/mhfz-overlay#168](https://github.com/DorielRivalet/mhfz-overlay/issues/168)
+* tab icons being clickable ([3cc2c24](https://github.com/DorielRivalet/MHFZ_Overlay/commit/3cc2c2441d9feeb3f2873c6ced93fba117819edf))
+* timer methods ([5e5b50b](https://github.com/DorielRivalet/MHFZ_Overlay/commit/5e5b50b912f0186b59d1e324e406176b5a1ed0ff))
+* timers ([12921bb](https://github.com/DorielRivalet/MHFZ_Overlay/commit/12921bbb4f95d083d0288e1d0eab79cb4c8aea69)), closes [DorielRivalet/mhfz-overlay#172](https://github.com/DorielRivalet/mhfz-overlay/issues/172) [DorielRivalet/mhfz-overlay#170](https://github.com/DorielRivalet/mhfz-overlay/issues/170) [DorielRivalet/mhfz-overlay#169](https://github.com/DorielRivalet/mhfz-overlay/issues/169)
+
+
+### Performance Improvements
+
+* add timer benchmarks ([26c071b](https://github.com/DorielRivalet/MHFZ_Overlay/commit/26c071bbf2c0e450525d21c1321a21411dbb8698))
+* remove gifs ([1e5f4b7](https://github.com/DorielRivalet/MHFZ_Overlay/commit/1e5f4b713f52f45cb0ea35e0b1496bb680d83df9))
+* use timespan timer ([0766420](https://github.com/DorielRivalet/MHFZ_Overlay/commit/076642094da78f217bcb573e9c4550031c3e8bd6))
+
+
+### For Developers
+
+* add artifacts ([0135ac3](https://github.com/DorielRivalet/MHFZ_Overlay/commit/0135ac311fa41dc0b4902d3870a874df95c64dc7))
+* add image artifacts for git stats workflow ([e80f6c2](https://github.com/DorielRivalet/MHFZ_Overlay/commit/e80f6c20065903dfdfe0c1310fc43b0dd1ee1ef9))
+* add project for benchmark ([bf868c4](https://github.com/DorielRivalet/MHFZ_Overlay/commit/bf868c4ebc8ce2734bbfed18c3e20e038f705c90))
+* add rakefile for github actions ([0d0e5b2](https://github.com/DorielRivalet/MHFZ_Overlay/commit/0d0e5b2381b5308cde9690e0f75dee054795fdb4))
+* add stackoverflow link ([37e2c77](https://github.com/DorielRivalet/MHFZ_Overlay/commit/37e2c77cc77a644bfb1619e251b5ec228cb3c0b9))
+* **bingo:** implement interfaces ([17e8f47](https://github.com/DorielRivalet/MHFZ_Overlay/commit/17e8f47e2ff4c8106d42e19b87b72f4a4c677b4b))
+* bump version ([7ec3067](https://github.com/DorielRivalet/MHFZ_Overlay/commit/7ec3067fbe951b176126acfd722c592e786fab4c))
+* change target framework ([e4de71d](https://github.com/DorielRivalet/MHFZ_Overlay/commit/e4de71d870bf60e45f9f535470b1cd87fda8a50e))
+* **deps-dev:** bump @commitlint/cli from 17.6.7 to 17.7.1 ([2ee78bd](https://github.com/DorielRivalet/MHFZ_Overlay/commit/2ee78bd864630b5fd1f873a7f9eb34e9e62cc5f1))
+* **deps-dev:** bump @commitlint/config-conventional ([6aec219](https://github.com/DorielRivalet/MHFZ_Overlay/commit/6aec2199b5391731808369113d7e2a8fbd6fa091))
+* **deps-dev:** bump alex from 11.0.0 to 11.0.1 ([893fcd1](https://github.com/DorielRivalet/MHFZ_Overlay/commit/893fcd18caf4344713a7f89e4b3821d2cd7f53f0))
+* **deps:** add dependency management files ([a90a463](https://github.com/DorielRivalet/MHFZ_Overlay/commit/a90a4639f081d9fc7fc9badc593e29649976c5bf))
+* **deps:** bump actions/cache from 2 to 3 ([c65cbdb](https://github.com/DorielRivalet/MHFZ_Overlay/commit/c65cbdb1fe96824e048ad69c13a09d0526484027))
+* **deps:** bump actions/checkout from 2 to 3 ([ee3ce20](https://github.com/DorielRivalet/MHFZ_Overlay/commit/ee3ce2006a47cb5e6cb556c4c5f72ffb4d2928a1))
+* **deps:** bump actions/checkout from 2 to 3 ([698d961](https://github.com/DorielRivalet/MHFZ_Overlay/commit/698d961d8e72df54f427b93a4fc387e3c52d5bc6))
+* **deps:** bump actions/setup-dotnet from 1 to 3 ([b3041e9](https://github.com/DorielRivalet/MHFZ_Overlay/commit/b3041e97bf75dbc6b67a494a39f2197ed2b21467))
+* **deps:** bump LiveChartsCore.SkiaSharpView.WPF in /MHFZ_Overlay ([f7120a8](https://github.com/DorielRivalet/MHFZ_Overlay/commit/f7120a80c33c059de23b0ca21ff3bfd7ac646d40))
+* **deps:** bump LiveChartsCore.SkiaSharpView.WPF in /MHFZ_Overlay ([1238958](https://github.com/DorielRivalet/MHFZ_Overlay/commit/1238958bccbcc616d14dbd2a5e353f6b15ea6ab9))
+* **deps:** bump Microsoft.Web.WebView2 in /MHFZ_Overlay ([60554ac](https://github.com/DorielRivalet/MHFZ_Overlay/commit/60554acd6a453386387a9a6b8d036ead76ad99c9))
+* **deps:** bump NLog from 5.2.2 to 5.2.3 in /MHFZ_Overlay ([30973d5](https://github.com/DorielRivalet/MHFZ_Overlay/commit/30973d53a80af307c102d751ec57f12f0a375753))
+* **deps:** bump NuGet.CommandLine from 6.6.1 to 6.7.0 in /MHFZ_Overlay ([eca3e58](https://github.com/DorielRivalet/MHFZ_Overlay/commit/eca3e58f7f295395fcf9cdab9e6188ebf6f80e0c))
+* **deps:** bump release-it and @release-it/conventional-changelog ([c54482e](https://github.com/DorielRivalet/MHFZ_Overlay/commit/c54482e5cc3f96139ccdcafe2f463b2e02f07967))
+* **deps:** bump release-it from 16.1.3 to 16.1.4 ([69bbfcb](https://github.com/DorielRivalet/MHFZ_Overlay/commit/69bbfcb7f3ad624fc6222ee5d815688d0b9aa8ff))
+* **deps:** bump release-it from 16.1.4 to 16.1.5 ([b5b23a2](https://github.com/DorielRivalet/MHFZ_Overlay/commit/b5b23a2be9187320c8e7aec9fb684b4310ff47be))
+* **deps:** bump WPF-UI in /MHFZ_Overlay ([c46a078](https://github.com/DorielRivalet/MHFZ_Overlay/commit/c46a0784eff2e48abc8f9ce7d1303fccaa9b0f76))
+* **deps:** update EZlion ([368c899](https://github.com/DorielRivalet/MHFZ_Overlay/commit/368c899cf03093e5feb1870dfc67dc58343f3cdf))
+* **FAQ:** add LaTeX ([98c24dd](https://github.com/DorielRivalet/MHFZ_Overlay/commit/98c24ddace737fc1bd7773a90ddf1847c07baa50))
+* **FAQ:** fix LaTeX formatting ([f724995](https://github.com/DorielRivalet/MHFZ_Overlay/commit/f724995334a022e1fa629498d3cc3446bd62e8d7))
+* **FAQ:** separate math blocks ([37eb8f3](https://github.com/DorielRivalet/MHFZ_Overlay/commit/37eb8f312bae8ac4e5ecb3e8aa6d41428112558a))
+* **FAQ:** update FAQ.md ([2aa4d2a](https://github.com/DorielRivalet/MHFZ_Overlay/commit/2aa4d2a36c654d7f85a3b81c54b62d14b1732bb7))
+* fix dotnet workflow ([6dd4241](https://github.com/DorielRivalet/MHFZ_Overlay/commit/6dd424128358479e4873da70e423599ba595570d))
+* give example data flow ([f6ea1c0](https://github.com/DorielRivalet/MHFZ_Overlay/commit/f6ea1c094d415c5398931bfccd2751767919b2a2))
+* **makefile:** add makefile for git stats workflow ([f438669](https://github.com/DorielRivalet/MHFZ_Overlay/commit/f43866941ac90a1a8508790eb91255f0b345d331))
+* **nuget:** update Wpf.Ui ([f74cc5e](https://github.com/DorielRivalet/MHFZ_Overlay/commit/f74cc5eef849a7f4a44f0e0832cfec8c2643fde3))
+* **performance:** add benchmarks location ([3dd8ff4](https://github.com/DorielRivalet/MHFZ_Overlay/commit/3dd8ff4bfe779768cc0ba752c2afd9dd3b601336))
+* **README:** add configuration preset image ([92a5aa0](https://github.com/DorielRivalet/MHFZ_Overlay/commit/92a5aa02c3970ee5dc2bacde38d2fd0f4489219e))
+* **README:** add git stats images ([8161f58](https://github.com/DorielRivalet/MHFZ_Overlay/commit/8161f58b79033a569e9bdb9964ffe3e985039898))
+* **README:** create github actions workflow status badge ([a2b2b97](https://github.com/DorielRivalet/MHFZ_Overlay/commit/a2b2b97c5165cdaa641a685495aad18a2ee2c648))
+* **README:** update acknowledgements ([80336d5](https://github.com/DorielRivalet/MHFZ_Overlay/commit/80336d557090dcebee04be4f330b2bf7f44f0b82))
+* **README:** update quick troubleshooting section ([31d1b41](https://github.com/DorielRivalet/MHFZ_Overlay/commit/31d1b419779514af882746065fd0092103c3b57d))
+* **README:** update README.md ([cb4f2fc](https://github.com/DorielRivalet/MHFZ_Overlay/commit/cb4f2fcd83c8cd964ca34abcc64e5295392193e6))
+* **README:** update README.md ([039d921](https://github.com/DorielRivalet/MHFZ_Overlay/commit/039d9218b9a8b2c9625aeaafc868e6c9bdd0ea61))
+* **README:** update README.md ([2cce55c](https://github.com/DorielRivalet/MHFZ_Overlay/commit/2cce55c4a1aba7ae78e4d1047390fdbd85b9ce28))
+* remove stopwatches ([5eaef16](https://github.com/DorielRivalet/MHFZ_Overlay/commit/5eaef16b681d79cfc2157fe7912a675526e62398))
+* **scripts:** add license header ([18cb9a3](https://github.com/DorielRivalet/MHFZ_Overlay/commit/18cb9a386b217274afef7567f3766fe50368e234))
+* **scripts:** update git statistics images ([0f0cea0](https://github.com/DorielRivalet/MHFZ_Overlay/commit/0f0cea088cc99bff0b3c12263e79734ad9113e96))
+* **scripts:** update git statistics images ([8ce9b97](https://github.com/DorielRivalet/MHFZ_Overlay/commit/8ce9b97bd096118b94fff7c350002a20947d836b))
+* **scripts:** update git statistics images ([4888bf3](https://github.com/DorielRivalet/MHFZ_Overlay/commit/4888bf37cbec7bd09c6faf9ac65ff1bc2d10c8b4))
+* **scripts:** update git statistics images ([b17f551](https://github.com/DorielRivalet/MHFZ_Overlay/commit/b17f551e426b83312836296748d47f47f620b204))
+* **scripts:** update git statistics images ([0b1c533](https://github.com/DorielRivalet/MHFZ_Overlay/commit/0b1c5334b8004fa0c12d63de00c2fbc6f40229f4))
+* **scripts:** update git statistics images ([c287833](https://github.com/DorielRivalet/MHFZ_Overlay/commit/c287833e00716d11d2f296ff5ba8b6e6c08534fc))
+* **scripts:** update README.md ([4544080](https://github.com/DorielRivalet/MHFZ_Overlay/commit/45440804397ef5670413d83baf4052564022286d))
+* update git stats workflow ([226b30e](https://github.com/DorielRivalet/MHFZ_Overlay/commit/226b30e2c314b983703b3bf28a3beb50045e323b))
+* update git stats workflow ([44bfd6f](https://github.com/DorielRivalet/MHFZ_Overlay/commit/44bfd6f94d9e956b00fdd92ef0f3d8192e4af509))
+* update git stats workflow ([74d98b8](https://github.com/DorielRivalet/MHFZ_Overlay/commit/74d98b8a2adb7370ff4d67dcc6ee8f762338a797))
+* update git stats workflow ([3516767](https://github.com/DorielRivalet/MHFZ_Overlay/commit/35167677f09c7b6baa9145702228bedb45aed079))
+* update git stats workflow ([ab79a8f](https://github.com/DorielRivalet/MHFZ_Overlay/commit/ab79a8f3209c094330e77e074a3ecba1a7251a24))
+* update git stats workflow ([5b86044](https://github.com/DorielRivalet/MHFZ_Overlay/commit/5b86044b07dd03a52d081bc89cc11399ac76020d))
+* update git stats workflow ([3c1cffc](https://github.com/DorielRivalet/MHFZ_Overlay/commit/3c1cffca19b57b892b69f405d1992a66428eb2ad))
+* update git stats workflow ([bc8ca67](https://github.com/DorielRivalet/MHFZ_Overlay/commit/bc8ca67bc0ef46a79e17e940433fff345b36853d))
+* update git stats workflow ([184b52c](https://github.com/DorielRivalet/MHFZ_Overlay/commit/184b52c78a73719bda2de57708a0bd7ae2ba9ab1))
+* update git stats workflow ([01c8f3b](https://github.com/DorielRivalet/MHFZ_Overlay/commit/01c8f3bdf7c7b501df3e7aa8121c2f5b0579e89b))
+* update git stats workflow ([617cfee](https://github.com/DorielRivalet/MHFZ_Overlay/commit/617cfeea985575f9803976b162e612b9f78e5876))
+* update git stats workflow ([c74e80c](https://github.com/DorielRivalet/MHFZ_Overlay/commit/c74e80c8f47680d5140e66a091a39f31f0c09271))
+* update git stats workflow ([e9cb6ae](https://github.com/DorielRivalet/MHFZ_Overlay/commit/e9cb6aeeecdda2ccfd7a59677d21947716b38719))
+* update git stats workflow ([32be920](https://github.com/DorielRivalet/MHFZ_Overlay/commit/32be920ff62a21c6fa9c023871253846b948a86c))
+* update git stats workflow ([c82e1a5](https://github.com/DorielRivalet/MHFZ_Overlay/commit/c82e1a58abcceb823c8ee0d677a0256665710a64))
+* update git stats workflow ([14a2301](https://github.com/DorielRivalet/MHFZ_Overlay/commit/14a2301cd60e59eacd6e6801c72e70500ae281b2))
+* update git stats workflow ([27e96f8](https://github.com/DorielRivalet/MHFZ_Overlay/commit/27e96f8862e5acd2af90aaf469905cbac032d3a5))
+* update git stats workflow ([e809f21](https://github.com/DorielRivalet/MHFZ_Overlay/commit/e809f21788a79ef782c8fd5624b2b4340985c505))
+* update git stats workflow ([c11fb4d](https://github.com/DorielRivalet/MHFZ_Overlay/commit/c11fb4d767d861cc82168a1e71b61fdedfdc0423))
+* update git stats workflow ([04c7341](https://github.com/DorielRivalet/MHFZ_Overlay/commit/04c73419ee51597c0ce7977ecf5eeb0951c5d824))
+* update git stats workflow ([c5db62a](https://github.com/DorielRivalet/MHFZ_Overlay/commit/c5db62affee9c53e1363b6b0006492d542459d70))
+* update git stats workflow ([52c7e9b](https://github.com/DorielRivalet/MHFZ_Overlay/commit/52c7e9bde862c1e7a0ee6185fe767ef2af1687be))
+* update git stats workflow ([f056bfa](https://github.com/DorielRivalet/MHFZ_Overlay/commit/f056bfa62011a1af0ff3190b5cf8468ebf3b1cd6))
+* update git stats workflow ([27f359a](https://github.com/DorielRivalet/MHFZ_Overlay/commit/27f359a974084e9ba91c4e55290f3b04fdc6f716))
+* update git stats workflow ([4807c44](https://github.com/DorielRivalet/MHFZ_Overlay/commit/4807c4418e0acc7fa35573b833e5e47c19f39b63))
+* update git stats workflow ([7c473a3](https://github.com/DorielRivalet/MHFZ_Overlay/commit/7c473a3950ed076f60fd35a623c3ea4b6701da7c))
+* update git stats workflow ([e2670a2](https://github.com/DorielRivalet/MHFZ_Overlay/commit/e2670a2fb9b82f01f57ed4582cf564ab035a09b9))
+* update git stats workflow ([0d75d44](https://github.com/DorielRivalet/MHFZ_Overlay/commit/0d75d4471bccd603327da52253d1c359fc4db97a))
+* update git stats workflow ([fe97bf2](https://github.com/DorielRivalet/MHFZ_Overlay/commit/fe97bf203bc335fbd605298edf0b0c92fb3dfa28))
+* update git stats workflow ([2ab7dfd](https://github.com/DorielRivalet/MHFZ_Overlay/commit/2ab7dfdb975d97d1f3d3b7f1b7570062bcb4f558))
+* update git stats workflow ([076a686](https://github.com/DorielRivalet/MHFZ_Overlay/commit/076a686d60e0897c0f0acf96296ac59d05dbf369))
+* update git stats workflow ([35ba0b3](https://github.com/DorielRivalet/MHFZ_Overlay/commit/35ba0b3e736cf76201b7585dec9a880841cb9226))
+* update git stats workflow ([d2e4f67](https://github.com/DorielRivalet/MHFZ_Overlay/commit/d2e4f67473bff8c9f9e8e5780cfe22c1139152d9))
+* update git stats workflow ([9a44a84](https://github.com/DorielRivalet/MHFZ_Overlay/commit/9a44a84eff0c96694b0ae932f9d19ee502c5af3f))
+* update sonarcloud java version ([7edabff](https://github.com/DorielRivalet/MHFZ_Overlay/commit/7edabfff7146bad989dc43f666e143f7f10878e2))
+* update workflows ([acd7205](https://github.com/DorielRivalet/MHFZ_Overlay/commit/acd72055fb3a1e2b3658b73d737536325b34393c))
+
## [0.29.1](https://github.com/DorielRivalet/MHFZ_Overlay/compare/v0.29.0...v0.29.1) (2023-08-03)
diff --git a/FAQ.md b/FAQ.md
index 30ff8d65..aac60baa 100644
--- a/FAQ.md
+++ b/FAQ.md
@@ -169,6 +169,7 @@ The location of any previous settings are in the subfolders of `%LocalAppData%/D
5. Drag and drop the file.
6. Copy/Paste into Output Comparer the hash provided by the developer.
7. You should get the message `The hashes are the same.`.
+8. Close DevToys.
### Command Line Interface
@@ -392,9 +393,12 @@ As an added bonus:
- Effective HP is the HP taking into account the monster's defense rate. Burning Freezing Elzelion has 1,000,000 EHP because his True HP is 30,000 and his defense rate is 0.03.
-```text
-Effective HP = True HP / Defense rate
-1,000,000 = 30,000 / 0.03
+```math
+Effective HP = \frac{True HP}{DefenseRate}
+```
+
+```math
+1,000,000 = \frac{30,000}{0.03}
```
- True HP is the HP of the monster without taking into account the monster's defense rate.
diff --git a/MHFZOverlayBenchmark/Comparisons/TimerComparison.cs b/MHFZOverlayBenchmark/Comparisons/TimerComparison.cs
new file mode 100644
index 00000000..dfb7cd0c
--- /dev/null
+++ b/MHFZOverlayBenchmark/Comparisons/TimerComparison.cs
@@ -0,0 +1,149 @@
+// © 2023 The mhfz-overlay developers.
+// Use of this source code is governed by a MIT license that can be
+// found in the LICENSE file.
+
+namespace MHFZOverlayBenchmark.Comparisons;
+
+using BenchmarkDotNet.Attributes;
+using System;
+using System.Collections.Generic;
+using System.Globalization;
+using System.Linq;
+using System.Runtime.Intrinsics.Arm;
+using System.Security.Cryptography;
+using System.Text;
+using System.Threading.Tasks;
+
+public enum TimerFormat
+{
+ MinutesSeconds,
+ MinutesSecondsMilliseconds,
+ HoursMinutesSeconds,
+}
+
+public enum TimerMode
+{
+ TimeLeft,
+ Elapsed,
+}
+
+// TODO optimize
+[RPlotExporter]
+[MedianColumn, MinColumn, MaxColumn]
+[UnicodeConsoleLogger]
+[MemoryDiagnoser]
+[ExceptionDiagnoser]
+public class TimerComparison
+{
+ public const decimal FramesPerSecond = 30;
+
+ public string TimeLeftPercentNumber = " (100%)";
+
+ [Params(120 * 60 * 30)]
+ public int TimeDefInt;
+
+ [Benchmark]
+ public string BenchmarkSimpleTimer()
+ {
+ string s = string.Empty;
+ for (int i = TimeDefInt; i > 0; i--)
+ {
+ s = SimpleTimer(i, TimerFormat.MinutesSecondsMilliseconds, true, TimeDefInt, true, TimeLeftPercentNumber, TimerMode.Elapsed);
+ };
+
+ return s;
+ }
+
+ [Benchmark]
+ public string BenchmarkTimeSpanTimer()
+ {
+ string s = string.Empty;
+ for (int i = TimeDefInt; i > 0; i--)
+ {
+ s = TimeSpanTimer(i, TimerFormat.MinutesSecondsMilliseconds, true, TimeDefInt, true, TimeLeftPercentNumber, TimerMode.Elapsed);
+ };
+
+ return s;
+ }
+
+ [Benchmark]
+ public string BenchmarkStringBuilderTimer()
+ {
+ string s = string.Empty;
+ for (int i = TimeDefInt; i > 0; i--)
+ {
+ s = StringBuilderTimer(i, TimerFormat.MinutesSecondsMilliseconds, true, TimeDefInt, true, TimeLeftPercentNumber, TimerMode.Elapsed);
+ };
+
+ return s;
+ }
+
+ public string SimpleTimer(decimal timeInt, TimerFormat timerFormat, bool isFrames = true, decimal timeDefInt = 0, bool timeLeftPercentShown = false, string timeLeftPercentNumber = "", TimerMode timerMode = TimerMode.Elapsed)
+ {
+ // TODO wrong conditionals for timeint >= timedefint?
+ decimal time = timerMode == TimerMode.Elapsed && timeInt <= timeDefInt ? time = timeDefInt - timeInt : time = timeInt;
+ decimal framesPerSecond = isFrames ? FramesPerSecond : 1;
+ decimal milliseconds = time / framesPerSecond * 1000;
+ decimal totalMinutes = Math.Floor(milliseconds / 60000);
+ decimal minutes = totalMinutes >= 60 ? totalMinutes : Math.Floor(milliseconds / 60000);
+ decimal seconds = Math.Floor((milliseconds - (minutes * 60000)) / 1000);
+ decimal remainingMilliseconds = milliseconds - (minutes * 60000) - (seconds * 1000);
+ var timeLeftPercent = timeLeftPercentShown ? timeLeftPercentNumber : string.Empty;
+
+ return timerFormat switch
+ {
+ TimerFormat.MinutesSeconds => $"{minutes:00}:{seconds:00}" + timeLeftPercent,
+ TimerFormat.MinutesSecondsMilliseconds => $"{minutes:00}:{seconds:00}.{remainingMilliseconds:000}" + timeLeftPercent,
+ _ => $"{minutes:00}:{seconds:00}.{remainingMilliseconds:000}" + timeLeftPercent,
+ };
+ }
+
+ public string StringBuilderTimer(decimal timeInt, TimerFormat timerFormat, bool isFrames = true, decimal timeDefInt = 0, bool timeLeftPercentShown = false, string timeLeftPercentNumber = "", TimerMode timerMode = TimerMode.Elapsed)
+ {
+ decimal time = timerMode == TimerMode.Elapsed && timeInt <= timeDefInt ? time = timeDefInt - timeInt : time = timeInt;
+ decimal framesPerSecond = isFrames ? FramesPerSecond : 1;
+ decimal totalSeconds = time / framesPerSecond;
+ decimal totalMinutes = Math.Floor(totalSeconds / 60);
+ decimal minutes = totalMinutes >= 60 ? totalMinutes : Math.Floor(totalSeconds / 60);
+ decimal seconds = Math.Floor(totalSeconds % 60);
+ decimal milliseconds = Math.Round((time % framesPerSecond) * (1000M / framesPerSecond));
+ var timeLeftPercent = timeLeftPercentShown ? timeLeftPercentNumber : string.Empty;
+
+ StringBuilder sb = new StringBuilder();
+ switch (timerFormat)
+ {
+ default:
+ sb.AppendFormat(CultureInfo.InvariantCulture, "{0:00}:{1:00}.{2:000}", minutes, seconds, milliseconds);
+ break;
+ case TimerFormat.MinutesSeconds:
+ sb.AppendFormat(CultureInfo.InvariantCulture, "{0:00}:{1:00}", minutes, seconds);
+ break;
+ case TimerFormat.MinutesSecondsMilliseconds:
+ sb.AppendFormat(CultureInfo.InvariantCulture, "{0:00}:{1:00}.{2:000}", minutes, seconds, milliseconds);
+ break;
+ }
+
+ sb.Append(timeLeftPercent);
+ return sb.ToString();
+ }
+
+ public string TimeSpanTimer(decimal timeInt, TimerFormat timerFormat, bool isFrames = true, decimal timeDefInt = 0, bool timeLeftPercentShown = false, string timeLeftPercentNumber = "", TimerMode timerMode = TimerMode.Elapsed)
+ {
+ decimal time = timerMode == TimerMode.Elapsed && timeInt <= timeDefInt ? time = timeDefInt - timeInt : time = timeInt;
+ decimal framesPerSecond = isFrames ? FramesPerSecond : 1;
+ decimal timeInSeconds = time / framesPerSecond;
+ TimeSpan timeInSecondsSpan = TimeSpan.FromSeconds((double)timeInSeconds);
+ int roundedMilliseconds = (int)(Math.Round(timeInSecondsSpan.TotalMilliseconds) % 1000);
+ var totalMinutes = Math.Floor(timeInSecondsSpan.TotalSeconds / 60);
+ var minutes = totalMinutes >= 60 ? totalMinutes : timeInSecondsSpan.Minutes;
+ var timeLeftPercent = timeLeftPercentShown ? timeLeftPercentNumber : string.Empty;
+
+ // Format the TimeSpan object as a string
+ return timerFormat switch
+ {
+ TimerFormat.MinutesSeconds => $"{minutes:00}:{timeInSecondsSpan.Seconds:00}" + timeLeftPercent,
+ TimerFormat.MinutesSecondsMilliseconds => $"{minutes:00}:{timeInSecondsSpan.Seconds:00}.{roundedMilliseconds:000}" + timeLeftPercent,
+ _ => $"{minutes:00}:{timeInSecondsSpan.Seconds:00}.{roundedMilliseconds:000}" + timeLeftPercent,
+ };
+ }
+}
diff --git a/MHFZOverlayBenchmark/MHFZOverlayBenchmark.csproj b/MHFZOverlayBenchmark/MHFZOverlayBenchmark.csproj
new file mode 100644
index 00000000..62178873
--- /dev/null
+++ b/MHFZOverlayBenchmark/MHFZOverlayBenchmark.csproj
@@ -0,0 +1,14 @@
+
+
+
+ Exe
+ net6.0
+ enable
+ enable
+
+
+
+
+
+
+
diff --git a/MHFZOverlayBenchmark/Program.cs b/MHFZOverlayBenchmark/Program.cs
new file mode 100644
index 00000000..d7c082a2
--- /dev/null
+++ b/MHFZOverlayBenchmark/Program.cs
@@ -0,0 +1,18 @@
+// © 2023 The mhfz-overlay developers.
+// Use of this source code is governed by a MIT license that can be
+// found in the LICENSE file.
+
+// See https://aka.ms/new-console-template for more information
+using BenchmarkDotNet.Running;
+using System.Management;
+using MHFZOverlayBenchmark.Comparisons;
+using BenchmarkDotNet.Configs;
+using BenchmarkDotNet.Reports;
+using Perfolizer.Horology;
+using BenchmarkDotNet.Columns;
+
+var summary = BenchmarkRunner.Run(
+ DefaultConfig.Instance.WithSummaryStyle(
+ SummaryStyle.Default
+ .WithTimeUnit(TimeUnit.Millisecond)
+ .WithSizeUnit(SizeUnit.MB)));
diff --git a/MHFZ_Overlay.sln b/MHFZ_Overlay.sln
index a3514998..7dc871bf 100644
--- a/MHFZ_Overlay.sln
+++ b/MHFZ_Overlay.sln
@@ -7,6 +7,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MHFZ_Overlay", "MHFZ_Overla
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MHFZ_OverlayTest", "MHFZ_OverlayTest\MHFZ_OverlayTest.csproj", "{13ED7686-F93C-4DBC-9258-061DE45FFC60}"
EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MHFZOverlayBenchmark", "MHFZOverlayBenchmark\MHFZOverlayBenchmark.csproj", "{7A166AB3-8381-45A7-A827-AD42A9EDD863}"
+EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@@ -21,6 +23,10 @@ Global
{13ED7686-F93C-4DBC-9258-061DE45FFC60}.Debug|Any CPU.Build.0 = Debug|Any CPU
{13ED7686-F93C-4DBC-9258-061DE45FFC60}.Release|Any CPU.ActiveCfg = Release|Any CPU
{13ED7686-F93C-4DBC-9258-061DE45FFC60}.Release|Any CPU.Build.0 = Release|Any CPU
+ {7A166AB3-8381-45A7-A827-AD42A9EDD863}.Debug|Any CPU.ActiveCfg = Release|Any CPU
+ {7A166AB3-8381-45A7-A827-AD42A9EDD863}.Debug|Any CPU.Build.0 = Release|Any CPU
+ {7A166AB3-8381-45A7-A827-AD42A9EDD863}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {7A166AB3-8381-45A7-A827-AD42A9EDD863}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
diff --git a/MHFZ_Overlay/App.config b/MHFZ_Overlay/App.config
index a63b4323..26b7d10c 100644
--- a/MHFZ_Overlay/App.config
+++ b/MHFZ_Overlay/App.config
@@ -689,7 +689,7 @@
180
- True
+ False
False
@@ -954,6 +954,42 @@
False
+
+ 0.5
+
+
+ 1
+
+
+ 1
+
+
+ 1
+
+
+ 1
+
+
+ 1
+
+
+ 1
+
+
+ 1
+
+
+ 1
+
+
+ Final
+
+
+ Automatic
+
+
+ True
+
diff --git a/MHFZ_Overlay/App.xaml b/MHFZ_Overlay/App.xaml
index e82b5d0d..affecfdb 100644
--- a/MHFZ_Overlay/App.xaml
+++ b/MHFZ_Overlay/App.xaml
@@ -162,7 +162,7 @@
https://stackoverflow.com/questions/3425720/xaml-the-property-resources-is-set-more-than-once#3425956
-->
-
+
diff --git a/MHFZ_Overlay/App.xaml.cs b/MHFZ_Overlay/App.xaml.cs
index 45ba9dd0..e7617d20 100644
--- a/MHFZ_Overlay/App.xaml.cs
+++ b/MHFZ_Overlay/App.xaml.cs
@@ -11,9 +11,11 @@ namespace MHFZ_Overlay;
using System.Globalization;
using System.IO;
using System.Reflection;
+using System.Threading;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Interop;
+using System.Windows.Markup;
using System.Windows.Media;
using System.Windows.Threading;
using MHFZ_Overlay.Models.Constant;
@@ -93,12 +95,26 @@ protected override void OnStartup(StartupEventArgs e)
// Start the stopwatch
stopwatch.Start();
+
+ // https://stackoverflow.com/questions/12729922/how-to-set-cultureinfo-invariantculture-default
+ CultureInfo culture = CultureInfo.InvariantCulture;
+
+ Thread.CurrentThread.CurrentCulture = culture;
+ Thread.CurrentThread.CurrentUICulture = culture;
+
+ CultureInfo.DefaultThreadCurrentCulture = culture;
+ CultureInfo.DefaultThreadCurrentUICulture = culture;
+
+ FrameworkElement.LanguageProperty.OverrideMetadata(
+ typeof(FrameworkElement),
+ new FrameworkPropertyMetadata(XmlLanguage.GetLanguage(CultureInfo.CurrentCulture.Name)));
+
var loggingRules = NLog.LogManager.Configuration.LoggingRules;
var s = (Settings)Current.TryFindResource("Settings");
loggingRules[0].SetLoggingLevels(LoggingService.GetLogLevel(s.LogLevel), NLog.LogLevel.Fatal);
Logger.Info(CultureInfo.InvariantCulture, "Started WPF application");
Logger.Trace(CultureInfo.InvariantCulture, "Call stack: {0}", new StackTrace().ToString());
- Logger.Debug("OS: {0}, is64BitOS: {1}, is64BitProcess: {2}, CLR version: {3}", Environment.OSVersion, Environment.Is64BitOperatingSystem, Environment.Is64BitProcess, Environment.Version);
+ Logger.Debug(CultureInfo.InvariantCulture, "OS: {0}, is64BitOS: {1}, is64BitProcess: {2}, CLR version: {3}", Environment.OSVersion, Environment.Is64BitOperatingSystem, Environment.Is64BitProcess, Environment.Version);
// TODO: test if this doesnt conflict with squirrel update
CurrentProgramVersion = $"v{GetAssemblyVersion}";
@@ -143,14 +159,14 @@ protected override void OnStartup(StartupEventArgs e)
private static void App_DispatcherUnhandledException(object sender, DispatcherUnhandledExceptionEventArgs e) =>
// Log/inspect the inspection here
- Logger.Error("Unhandled exception\n\nMessage: {0}\n\nStack Trace: {1}\n\nHelp Link: {2}\n\nHResult: {3}\n\nSource: {4}\n\nTarget Site: {5}", e.Exception.Message, e.Exception.StackTrace, e.Exception.HelpLink, e.Exception.HResult, e.Exception.Source, e.Exception.TargetSite);
+ Logger.Error(CultureInfo.InvariantCulture, "Unhandled exception\n\nMessage: {0}\n\nStack Trace: {1}\n\nHelp Link: {2}\n\nHResult: {3}\n\nSource: {4}\n\nTarget Site: {5}", e.Exception.Message, e.Exception.StackTrace, e.Exception.HelpLink, e.Exception.HResult, e.Exception.Source, e.Exception.TargetSite);
private static void SetRenderingMode(string renderingMode)
{
RenderOptions.ProcessRenderMode = renderingMode == "Hardware"
? RenderMode.Default
: RenderMode.SoftwareOnly;
- Logger.Info($"Rendering mode: {renderingMode}");
+ Logger.Info(CultureInfo.InvariantCulture, $"Rendering mode: {renderingMode}");
}
// https://github.com/Squirrel/Squirrel.Windows/issues/198#issuecomment-299262613
diff --git a/MHFZ_Overlay/Assets/Background/10.png b/MHFZ_Overlay/Assets/Background/10.png
new file mode 100644
index 00000000..cb79c434
Binary files /dev/null and b/MHFZ_Overlay/Assets/Background/10.png differ
diff --git a/MHFZ_Overlay/Assets/Background/background_noise.png b/MHFZ_Overlay/Assets/Background/background_noise.png
new file mode 100644
index 00000000..47ae62db
Binary files /dev/null and b/MHFZ_Overlay/Assets/Background/background_noise.png differ
diff --git a/MHFZ_Overlay/Assets/Background/background_pattern1.png b/MHFZ_Overlay/Assets/Background/background_pattern1.png
new file mode 100644
index 00000000..8cd02495
Binary files /dev/null and b/MHFZ_Overlay/Assets/Background/background_pattern1.png differ
diff --git a/MHFZ_Overlay/Assets/Icons/AncientDragonAlacrityMantle.xaml b/MHFZ_Overlay/Assets/Icons/AncientDragonAlacrityMantle.xaml
new file mode 100644
index 00000000..43d07140
--- /dev/null
+++ b/MHFZ_Overlay/Assets/Icons/AncientDragonAlacrityMantle.xaml
@@ -0,0 +1,77 @@
+
+
+
+
+
diff --git a/MHFZ_Overlay/Assets/Icons/AncientDragonCognisphere.xaml b/MHFZ_Overlay/Assets/Icons/AncientDragonCognisphere.xaml
new file mode 100644
index 00000000..8d9ad92e
--- /dev/null
+++ b/MHFZ_Overlay/Assets/Icons/AncientDragonCognisphere.xaml
@@ -0,0 +1,55 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/MHFZ_Overlay/Assets/Icons/AncientDragonConquerorsCloak.xaml b/MHFZ_Overlay/Assets/Icons/AncientDragonConquerorsCloak.xaml
new file mode 100644
index 00000000..a2ba384e
--- /dev/null
+++ b/MHFZ_Overlay/Assets/Icons/AncientDragonConquerorsCloak.xaml
@@ -0,0 +1,39 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/MHFZ_Overlay/Assets/Icons/AncientDragonCranium.xaml b/MHFZ_Overlay/Assets/Icons/AncientDragonCranium.xaml
new file mode 100644
index 00000000..58c75443
--- /dev/null
+++ b/MHFZ_Overlay/Assets/Icons/AncientDragonCranium.xaml
@@ -0,0 +1,47 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/MHFZ_Overlay/Assets/Icons/AncientDragonDaoraPlating.xaml b/MHFZ_Overlay/Assets/Icons/AncientDragonDaoraPlating.xaml
new file mode 100644
index 00000000..3f26a5f9
--- /dev/null
+++ b/MHFZ_Overlay/Assets/Icons/AncientDragonDaoraPlating.xaml
@@ -0,0 +1,38 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/MHFZ_Overlay/Assets/Icons/AncientDragonEmpyreanAura.xaml b/MHFZ_Overlay/Assets/Icons/AncientDragonEmpyreanAura.xaml
new file mode 100644
index 00000000..70aa4b39
--- /dev/null
+++ b/MHFZ_Overlay/Assets/Icons/AncientDragonEmpyreanAura.xaml
@@ -0,0 +1,57 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/MHFZ_Overlay/Assets/Icons/AncientDragonEtherealMatrix.xaml b/MHFZ_Overlay/Assets/Icons/AncientDragonEtherealMatrix.xaml
new file mode 100644
index 00000000..76f3023b
--- /dev/null
+++ b/MHFZ_Overlay/Assets/Icons/AncientDragonEtherealMatrix.xaml
@@ -0,0 +1,102 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/MHFZ_Overlay/Assets/Icons/AncientDragonForelimbs.xaml b/MHFZ_Overlay/Assets/Icons/AncientDragonForelimbs.xaml
new file mode 100644
index 00000000..564d331a
--- /dev/null
+++ b/MHFZ_Overlay/Assets/Icons/AncientDragonForelimbs.xaml
@@ -0,0 +1,97 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/MHFZ_Overlay/Assets/Icons/AncientDragonHellfireAegis.xaml b/MHFZ_Overlay/Assets/Icons/AncientDragonHellfireAegis.xaml
new file mode 100644
index 00000000..98491821
--- /dev/null
+++ b/MHFZ_Overlay/Assets/Icons/AncientDragonHellfireAegis.xaml
@@ -0,0 +1,67 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/MHFZ_Overlay/Assets/Icons/AncientDragonHindlegs.xaml b/MHFZ_Overlay/Assets/Icons/AncientDragonHindlegs.xaml
new file mode 100644
index 00000000..adfa40e1
--- /dev/null
+++ b/MHFZ_Overlay/Assets/Icons/AncientDragonHindlegs.xaml
@@ -0,0 +1,83 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/MHFZ_Overlay/Assets/Icons/AncientDragonInvisibleCore.xaml b/MHFZ_Overlay/Assets/Icons/AncientDragonInvisibleCore.xaml
new file mode 100644
index 00000000..2963f2ff
--- /dev/null
+++ b/MHFZ_Overlay/Assets/Icons/AncientDragonInvisibleCore.xaml
@@ -0,0 +1,72 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/MHFZ_Overlay/Assets/Icons/AncientDragonSpiritBreath.xaml b/MHFZ_Overlay/Assets/Icons/AncientDragonSpiritBreath.xaml
new file mode 100644
index 00000000..c77449a2
--- /dev/null
+++ b/MHFZ_Overlay/Assets/Icons/AncientDragonSpiritBreath.xaml
@@ -0,0 +1,65 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/MHFZ_Overlay/Assets/Icons/AncientDragonTail.xaml b/MHFZ_Overlay/Assets/Icons/AncientDragonTail.xaml
new file mode 100644
index 00000000..48ce328b
--- /dev/null
+++ b/MHFZ_Overlay/Assets/Icons/AncientDragonTail.xaml
@@ -0,0 +1,57 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/MHFZ_Overlay/Assets/Icons/AncientDragonThorax.xaml b/MHFZ_Overlay/Assets/Icons/AncientDragonThorax.xaml
new file mode 100644
index 00000000..40a09d86
--- /dev/null
+++ b/MHFZ_Overlay/Assets/Icons/AncientDragonThorax.xaml
@@ -0,0 +1,74 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/MHFZ_Overlay/Assets/Icons/AncientDragonTrueClaws.xaml b/MHFZ_Overlay/Assets/Icons/AncientDragonTrueClaws.xaml
new file mode 100644
index 00000000..cb033272
--- /dev/null
+++ b/MHFZ_Overlay/Assets/Icons/AncientDragonTrueClaws.xaml
@@ -0,0 +1,57 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/MHFZ_Overlay/Assets/Icons/AncientDragonVigorousArmament.xaml b/MHFZ_Overlay/Assets/Icons/AncientDragonVigorousArmament.xaml
new file mode 100644
index 00000000..9d9d002b
--- /dev/null
+++ b/MHFZ_Overlay/Assets/Icons/AncientDragonVigorousArmament.xaml
@@ -0,0 +1,92 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/MHFZ_Overlay/Assets/Icons/AncientDragonVitalNexus.xaml b/MHFZ_Overlay/Assets/Icons/AncientDragonVitalNexus.xaml
new file mode 100644
index 00000000..f73d628d
--- /dev/null
+++ b/MHFZ_Overlay/Assets/Icons/AncientDragonVitalNexus.xaml
@@ -0,0 +1,54 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/MHFZ_Overlay/Assets/Icons/AncientDragonWings.xaml b/MHFZ_Overlay/Assets/Icons/AncientDragonWings.xaml
new file mode 100644
index 00000000..0275b483
--- /dev/null
+++ b/MHFZ_Overlay/Assets/Icons/AncientDragonWings.xaml
@@ -0,0 +1,54 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/MHFZ_Overlay/Assets/Icons/Armor_Sphere_Icon_White.xaml b/MHFZ_Overlay/Assets/Icons/Armor_Sphere_Icon_White.xaml
index 60e4299e..078e9862 100644
--- a/MHFZ_Overlay/Assets/Icons/Armor_Sphere_Icon_White.xaml
+++ b/MHFZ_Overlay/Assets/Icons/Armor_Sphere_Icon_White.xaml
@@ -52,7 +52,7 @@
-
+
diff --git a/MHFZ_Overlay/Assets/Icons/Leg_Carve_Icon_White.xaml b/MHFZ_Overlay/Assets/Icons/Leg_Carve_Icon_White.xaml
index 5b735e21..bfe7d349 100644
--- a/MHFZ_Overlay/Assets/Icons/Leg_Carve_Icon_White.xaml
+++ b/MHFZ_Overlay/Assets/Icons/Leg_Carve_Icon_White.xaml
@@ -69,72 +69,7 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
diff --git a/MHFZ_Overlay/Assets/Icons/png/gauntlet_blue.png b/MHFZ_Overlay/Assets/Icons/png/gauntlet_blue.png
new file mode 100644
index 00000000..dab1dde0
Binary files /dev/null and b/MHFZ_Overlay/Assets/Icons/png/gauntlet_blue.png differ
diff --git a/MHFZ_Overlay/Assets/Icons/png/gauntlet_cyan.png b/MHFZ_Overlay/Assets/Icons/png/gauntlet_cyan.png
new file mode 100644
index 00000000..c7d12033
Binary files /dev/null and b/MHFZ_Overlay/Assets/Icons/png/gauntlet_cyan.png differ
diff --git a/MHFZ_Overlay/Assets/Icons/png/gauntlet_green.png b/MHFZ_Overlay/Assets/Icons/png/gauntlet_green.png
new file mode 100644
index 00000000..c95d7cd0
Binary files /dev/null and b/MHFZ_Overlay/Assets/Icons/png/gauntlet_green.png differ
diff --git a/MHFZ_Overlay/Assets/Icons/png/gauntlet_max.png b/MHFZ_Overlay/Assets/Icons/png/gauntlet_max.png
new file mode 100644
index 00000000..5172590a
Binary files /dev/null and b/MHFZ_Overlay/Assets/Icons/png/gauntlet_max.png differ
diff --git a/MHFZ_Overlay/Assets/Icons/png/gauntlet_orange.png b/MHFZ_Overlay/Assets/Icons/png/gauntlet_orange.png
new file mode 100644
index 00000000..e68a406b
Binary files /dev/null and b/MHFZ_Overlay/Assets/Icons/png/gauntlet_orange.png differ
diff --git a/MHFZ_Overlay/Assets/Icons/png/gauntlet_purple.png b/MHFZ_Overlay/Assets/Icons/png/gauntlet_purple.png
new file mode 100644
index 00000000..48a2bbae
Binary files /dev/null and b/MHFZ_Overlay/Assets/Icons/png/gauntlet_purple.png differ
diff --git a/MHFZ_Overlay/Assets/Icons/png/gauntlet_red.png b/MHFZ_Overlay/Assets/Icons/png/gauntlet_red.png
new file mode 100644
index 00000000..3d990119
Binary files /dev/null and b/MHFZ_Overlay/Assets/Icons/png/gauntlet_red.png differ
diff --git a/MHFZ_Overlay/Assets/Icons/png/gauntlet_white.png b/MHFZ_Overlay/Assets/Icons/png/gauntlet_white.png
new file mode 100644
index 00000000..cb4d977c
Binary files /dev/null and b/MHFZ_Overlay/Assets/Icons/png/gauntlet_white.png differ
diff --git a/MHFZ_Overlay/Assets/Icons/png/transcend_active.png b/MHFZ_Overlay/Assets/Icons/png/transcend_active.png
new file mode 100644
index 00000000..3e5d7955
Binary files /dev/null and b/MHFZ_Overlay/Assets/Icons/png/transcend_active.png differ
diff --git a/MHFZ_Overlay/Assets/Icons/png/true_transcend.png b/MHFZ_Overlay/Assets/Icons/png/true_transcend.png
new file mode 100644
index 00000000..be8e25d3
Binary files /dev/null and b/MHFZ_Overlay/Assets/Icons/png/true_transcend.png differ
diff --git a/MHFZ_Overlay/Assets/Icons/touhou/fumo1.png b/MHFZ_Overlay/Assets/Icons/touhou/fumo1.png
new file mode 100644
index 00000000..77c7d829
Binary files /dev/null and b/MHFZ_Overlay/Assets/Icons/touhou/fumo1.png differ
diff --git a/MHFZ_Overlay/Assets/Icons/touhou/fumo10.png b/MHFZ_Overlay/Assets/Icons/touhou/fumo10.png
new file mode 100644
index 00000000..a6e1eb80
Binary files /dev/null and b/MHFZ_Overlay/Assets/Icons/touhou/fumo10.png differ
diff --git a/MHFZ_Overlay/Assets/Icons/touhou/fumo11.png b/MHFZ_Overlay/Assets/Icons/touhou/fumo11.png
new file mode 100644
index 00000000..90b1b46e
Binary files /dev/null and b/MHFZ_Overlay/Assets/Icons/touhou/fumo11.png differ
diff --git a/MHFZ_Overlay/Assets/Icons/touhou/fumo12.png b/MHFZ_Overlay/Assets/Icons/touhou/fumo12.png
new file mode 100644
index 00000000..5be7f898
Binary files /dev/null and b/MHFZ_Overlay/Assets/Icons/touhou/fumo12.png differ
diff --git a/MHFZ_Overlay/Assets/Icons/touhou/fumo13.png b/MHFZ_Overlay/Assets/Icons/touhou/fumo13.png
new file mode 100644
index 00000000..273e58e1
Binary files /dev/null and b/MHFZ_Overlay/Assets/Icons/touhou/fumo13.png differ
diff --git a/MHFZ_Overlay/Assets/Icons/touhou/fumo14.png b/MHFZ_Overlay/Assets/Icons/touhou/fumo14.png
new file mode 100644
index 00000000..d85f6417
Binary files /dev/null and b/MHFZ_Overlay/Assets/Icons/touhou/fumo14.png differ
diff --git a/MHFZ_Overlay/Assets/Icons/touhou/fumo15.png b/MHFZ_Overlay/Assets/Icons/touhou/fumo15.png
new file mode 100644
index 00000000..724c869a
Binary files /dev/null and b/MHFZ_Overlay/Assets/Icons/touhou/fumo15.png differ
diff --git a/MHFZ_Overlay/Assets/Icons/touhou/fumo2.png b/MHFZ_Overlay/Assets/Icons/touhou/fumo2.png
new file mode 100644
index 00000000..5b12ec3d
Binary files /dev/null and b/MHFZ_Overlay/Assets/Icons/touhou/fumo2.png differ
diff --git a/MHFZ_Overlay/Assets/Icons/touhou/fumo3.png b/MHFZ_Overlay/Assets/Icons/touhou/fumo3.png
new file mode 100644
index 00000000..d7cbaabc
Binary files /dev/null and b/MHFZ_Overlay/Assets/Icons/touhou/fumo3.png differ
diff --git a/MHFZ_Overlay/Assets/Icons/touhou/fumo4.png b/MHFZ_Overlay/Assets/Icons/touhou/fumo4.png
new file mode 100644
index 00000000..cff196f6
Binary files /dev/null and b/MHFZ_Overlay/Assets/Icons/touhou/fumo4.png differ
diff --git a/MHFZ_Overlay/Assets/Icons/touhou/fumo5.png b/MHFZ_Overlay/Assets/Icons/touhou/fumo5.png
new file mode 100644
index 00000000..5da9f9a5
Binary files /dev/null and b/MHFZ_Overlay/Assets/Icons/touhou/fumo5.png differ
diff --git a/MHFZ_Overlay/Assets/Icons/touhou/fumo6.png b/MHFZ_Overlay/Assets/Icons/touhou/fumo6.png
new file mode 100644
index 00000000..6cb34d68
Binary files /dev/null and b/MHFZ_Overlay/Assets/Icons/touhou/fumo6.png differ
diff --git a/MHFZ_Overlay/Assets/Icons/touhou/fumo7.png b/MHFZ_Overlay/Assets/Icons/touhou/fumo7.png
new file mode 100644
index 00000000..2faa210f
Binary files /dev/null and b/MHFZ_Overlay/Assets/Icons/touhou/fumo7.png differ
diff --git a/MHFZ_Overlay/Assets/Icons/touhou/fumo8.png b/MHFZ_Overlay/Assets/Icons/touhou/fumo8.png
new file mode 100644
index 00000000..b93beb5a
Binary files /dev/null and b/MHFZ_Overlay/Assets/Icons/touhou/fumo8.png differ
diff --git a/MHFZ_Overlay/Assets/Icons/touhou/fumo9.png b/MHFZ_Overlay/Assets/Icons/touhou/fumo9.png
new file mode 100644
index 00000000..543643f9
Binary files /dev/null and b/MHFZ_Overlay/Assets/Icons/touhou/fumo9.png differ
diff --git a/MHFZ_Overlay/Assets/Icons/touhou/zenith_fumo.gif b/MHFZ_Overlay/Assets/Icons/touhou/zenith_fumo.gif
new file mode 100644
index 00000000..84499f1b
Binary files /dev/null and b/MHFZ_Overlay/Assets/Icons/touhou/zenith_fumo.gif differ
diff --git a/MHFZ_Overlay/Assets/Sounds/challenge_start.wav b/MHFZ_Overlay/Assets/Sounds/challenge_start.wav
new file mode 100644
index 00000000..14f0a442
Binary files /dev/null and b/MHFZ_Overlay/Assets/Sounds/challenge_start.wav differ
diff --git a/MHFZ_Overlay/Assets/Sounds/challenge_unlock.wav b/MHFZ_Overlay/Assets/Sounds/challenge_unlock.wav
new file mode 100644
index 00000000..289d78e6
Binary files /dev/null and b/MHFZ_Overlay/Assets/Sounds/challenge_unlock.wav differ
diff --git a/MHFZ_Overlay/Assets/Sounds/gacha_rare.wav b/MHFZ_Overlay/Assets/Sounds/gacha_rare.wav
new file mode 100644
index 00000000..15dba645
Binary files /dev/null and b/MHFZ_Overlay/Assets/Sounds/gacha_rare.wav differ
diff --git a/MHFZ_Overlay/Assets/Sounds/gacha_trial.wav b/MHFZ_Overlay/Assets/Sounds/gacha_trial.wav
new file mode 100644
index 00000000..48d7a917
Binary files /dev/null and b/MHFZ_Overlay/Assets/Sounds/gacha_trial.wav differ
diff --git a/MHFZ_Overlay/Assets/Sounds/gacha_unlock.wav b/MHFZ_Overlay/Assets/Sounds/gacha_unlock.wav
new file mode 100644
index 00000000..8e5e235a
Binary files /dev/null and b/MHFZ_Overlay/Assets/Sounds/gacha_unlock.wav differ
diff --git a/MHFZ_Overlay/Assets/Sounds/hover.wav b/MHFZ_Overlay/Assets/Sounds/hover.wav
new file mode 100644
index 00000000..3f8437ba
Binary files /dev/null and b/MHFZ_Overlay/Assets/Sounds/hover.wav differ
diff --git a/MHFZ_Overlay/Assets/Sounds/select.wav b/MHFZ_Overlay/Assets/Sounds/select.wav
new file mode 100644
index 00000000..136a2ccb
Binary files /dev/null and b/MHFZ_Overlay/Assets/Sounds/select.wav differ
diff --git a/MHFZ_Overlay/DataLoader.cs b/MHFZ_Overlay/DataLoader.cs
index 91ce6f1e..c9eab450 100644
--- a/MHFZ_Overlay/DataLoader.cs
+++ b/MHFZ_Overlay/DataLoader.cs
@@ -415,26 +415,6 @@ public void CheckForIllegalModifications()
///
public AddressModel Model { get; } // TODO: fix null warning
- public string GetQuestTimeCompletion()
- {
- var totalQuestDuration = (double)this.Model.TimeDefInt() / Numbers.FramesPerSecond; // Total duration of the quest in seconds
- var timeRemainingInQuest = (double)this.Model.TimeInt() / Numbers.FramesPerSecond; // Time left in the quest in seconds
-
- // Calculate the elapsed time by subtracting the time left from the total duration
- var elapsedTime = totalQuestDuration - timeRemainingInQuest;
-
- // Convert the elapsed time from seconds to milliseconds
- elapsedTime *= 1_000;
-
- // Convert the elapsed time to a TimeSpan object
- var timeSpan = TimeSpan.FromMilliseconds(elapsedTime);
-
- // Format the TimeSpan object as a string
- var formattedTime = timeSpan.ToString(TimeFormats.MinutesSecondsMilliseconds, CultureInfo.InvariantCulture);
-
- return formattedTime;
- }
-
///
/// Creates the code cave.
///
diff --git a/MHFZ_Overlay/MHFZ_Overlay.csproj b/MHFZ_Overlay/MHFZ_Overlay.csproj
index 161fe7c7..d8b22ad2 100644
--- a/MHFZ_Overlay/MHFZ_Overlay.csproj
+++ b/MHFZ_Overlay/MHFZ_Overlay.csproj
@@ -20,7 +20,7 @@
mhfz-overlay
Doriel Rivalet
Doriel Rivalet
- 0.29.1
+ 0.30.0
https://github.com/DorielRivalet/mhfz-overlay
https://github.com/DorielRivalet/mhfz-overlay.git
git
@@ -50,6 +50,7 @@
+
@@ -58,6 +59,8 @@
+
+
@@ -245,6 +248,14 @@
+
+
+
+
+
+
+
+
@@ -718,14 +729,57 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -793,6 +847,27 @@
+
+ Always
+
+
+ Always
+
+
+ Always
+
+
+ Always
+
+
+ Always
+
+
+ Always
+
+
+ Always
+
PreserveNewest
@@ -806,6 +881,9 @@
PreserveNewest
+
+ PreserveNewest
+
PreserveNewest
@@ -830,6 +908,8 @@
PreserveNewest
+
+
PreserveNewest
@@ -995,7 +1075,13 @@
+
+ MSBuild:Compile
+
+
+ MSBuild:Compile
+
@@ -1003,8 +1089,14 @@
+
+ MSBuild:Compile
+
+
+ MSBuild:Compile
+
@@ -1015,34 +1107,67 @@
+
+ MSBuild:Compile
+
+
+ MSBuild:Compile
+
PreserveNewest
+
+ MSBuild:Compile
+
+
+ MSBuild:Compile
+
+
+ MSBuild:Compile
+
+
+ MSBuild:Compile
+
+
+ MSBuild:Compile
+
+
+ MSBuild:Compile
+
+
+ MSBuild:Compile
+
+
+ MSBuild:Compile
+
+
+ MSBuild:Compile
+
@@ -1133,6 +1258,14 @@
+
+
+
+
+
+
+
+
@@ -1606,6 +1739,8 @@
+
+
@@ -1616,14 +1751,71 @@
+
+ MSBuild:Compile
+
+
+ MSBuild:Compile
+
+
+ PreserveNewest
+
+
+ PreserveNewest
+
+
+ PreserveNewest
+
+
+ PreserveNewest
+
+
+ PreserveNewest
+
+
+ PreserveNewest
+
+
+ PreserveNewest
+
+
+ PreserveNewest
+
+
+ PreserveNewest
+
+
+ PreserveNewest
+
+
+ PreserveNewest
+
+
+ PreserveNewest
+
+
+ PreserveNewest
+
+
+ PreserveNewest
+
+
+ PreserveNewest
+
+
+ PreserveNewest
+
+
+ MSBuild:Compile
+
@@ -1639,16 +1831,17 @@
-
+
-
+
+
-
+
-
-
+
+
all
runtime; build; native; contentfiles; analyzers; buildtransitive
@@ -1662,7 +1855,8 @@
-
+
+
diff --git a/MHFZ_Overlay/Models/Achievement.cs b/MHFZ_Overlay/Models/Achievement.cs
index cb328cf2..e1d27971 100644
--- a/MHFZ_Overlay/Models/Achievement.cs
+++ b/MHFZ_Overlay/Models/Achievement.cs
@@ -6,10 +6,12 @@ namespace MHFZ_Overlay.Models;
using System;
using System.Collections.Generic;
+using System.IO;
using System.Windows;
using System.Windows.Media;
using MHFZ_Overlay.Models.Collections;
using MHFZ_Overlay.Models.Structures;
+using MHFZ_Overlay.Services;
using MHFZ_Overlay.Views.Windows;
using Wpf.Ui.Common;
using Wpf.Ui.Controls;
@@ -52,7 +54,9 @@ public void Show(Snackbar snackbar, Style style)
Foreground = brushColor,
};
snackbar.Appearance = ControlAppearance.Secondary;
- MainWindow.MainWindowSoundPlayer?.Play();
+ var s = (Settings)Application.Current.TryFindResource("Settings");
+ var fileName = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, @"Assets\Sounds\victory.wav");
+ AudioService.GetInstance().Play(fileName, MainWindow.MainWindowMediaPlayer, s.VolumeMain, s.VolumeAchievementUnlock);
snackbar.Timeout = this.SnackbarTimeOut;
snackbar.Show();
}
diff --git a/MHFZ_Overlay/Models/Addresses/AddressModelHGE.cs b/MHFZ_Overlay/Models/Addresses/AddressModelHGE.cs
index 53687ddf..05e32818 100644
--- a/MHFZ_Overlay/Models/Addresses/AddressModelHGE.cs
+++ b/MHFZ_Overlay/Models/Addresses/AddressModelHGE.cs
@@ -1745,4 +1745,7 @@ public AddressModelHGE(Mem m)
///
public override int PartnyaBagItem10Qty() => this.M.Read2Byte("mhfo-hd.dll+E37D36E");
+
+ ///
+ public override int QuestToggleMonsterMode() => this.M.ReadByte("mhfo-hd.dll+E73D7B6");
}
diff --git a/MHFZ_Overlay/Models/Addresses/AddressModelNotHGE.cs b/MHFZ_Overlay/Models/Addresses/AddressModelNotHGE.cs
index 3774618b..012d4d4a 100644
--- a/MHFZ_Overlay/Models/Addresses/AddressModelNotHGE.cs
+++ b/MHFZ_Overlay/Models/Addresses/AddressModelNotHGE.cs
@@ -1664,4 +1664,6 @@ public AddressModelNotHGE(Mem m)
///
public override int PartnyaBagItem10Qty() => this.M.Read2Byte("mhfo.dll+57457AE");
+
+ public override int QuestToggleMonsterMode() => this.M.ReadByte("mhfo.dll+5B05B8E");
}
diff --git a/MHFZ_Overlay/Models/BezierCurve.cs b/MHFZ_Overlay/Models/BezierCurve.cs
new file mode 100644
index 00000000..1e9514d2
--- /dev/null
+++ b/MHFZ_Overlay/Models/BezierCurve.cs
@@ -0,0 +1,46 @@
+// © 2023 The mhfz-overlay developers.
+// Use of this source code is governed by a MIT license that can be
+// found in the LICENSE file.
+
+namespace MHFZ_Overlay.Models;
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Numerics;
+using System.Text;
+using System.Threading.Tasks;
+
+///
+/// Cubic bezier curve with four control points.
+///
+public class BezierCurve
+{
+ public Vector2 P0, P1, P2, P3;
+
+ public BezierCurve(Vector2 p0, Vector2 p1, Vector2 p2, Vector2 p3)
+ {
+ this.P0 = p0;
+ this.P1 = p1;
+ this.P2 = p2;
+ this.P3 = p3;
+ }
+
+ public Vector2 Evaluate(float t)
+ {
+ float u = 1 - t;
+ float tt = t * t;
+ float uu = u * u;
+ float uuu = uu * u;
+ float ttt = tt * t;
+
+ Vector2 B = new Vector2();
+ B = uuu * P0; // (1-t) * (1-t) * (1-t) * P0
+ B += 3 * uu * t * P1; // 3 * (1-t) * (1-t) * t * P1
+ B += 3 * u * tt * P2; // 3 * (1-t) * t * t * P2
+ B += ttt * P3; // t * t * t * P3
+
+ return B;
+ }
+}
+
diff --git a/MHFZ_Overlay/Models/Bingo.cs b/MHFZ_Overlay/Models/Bingo.cs
index 51aa3908..4be7adb2 100644
--- a/MHFZ_Overlay/Models/Bingo.cs
+++ b/MHFZ_Overlay/Models/Bingo.cs
@@ -11,23 +11,47 @@ namespace MHFZ_Overlay.Models;
// TODO: ORM
public sealed class Bingo
{
+ ///
+ /// Primary key autoincrement.
+ ///
public long BingoID { get; set; }
public DateTime? CreatedAt { get; set; }
public string? CreatedBy { get; set; } = string.Empty;
+ ///
+ /// The difficulty of the bingo.
+ ///
public Difficulty Difficulty { get; set; }
+ ///
+ /// The list of run IDs related to the bingo run.
+ ///
public List MonsterList { get; set; } = new List();
+ ///
+ /// Unused. The weapon type used when bingo finished.
+ ///
public string WeaponType { get; set; } = string.Empty;
- public string Category { get; set; } = string.Empty;
+ ///
+ /// The category of the bingo.
+ ///
+ public BingoGauntletCategory Category { get; set; }
+ ///
+ /// The total amount of frames elapsed (sum of RunID, which is the MonsterList, Quests frames elapsed).
+ ///
public long TotalFramesElapsed { get; set; } = long.MaxValue;
+ ///
+ /// The TotalFramesElapsed as a string format of HH:MM:SS.ff.
+ ///
public string TotalTimeElapsed { get; set; } = string.Empty;
+ ///
+ /// The bingo score at bingo end.
+ ///
public long Score { get; set; }
}
diff --git a/MHFZ_Overlay/Models/BingoCell.cs b/MHFZ_Overlay/Models/BingoCell.cs
new file mode 100644
index 00000000..5dc5fc8d
--- /dev/null
+++ b/MHFZ_Overlay/Models/BingoCell.cs
@@ -0,0 +1,55 @@
+// © 2023 The mhfz-overlay developers.
+// Use of this source code is governed by a MIT license that can be
+// found in the LICENSE file.
+
+namespace MHFZ_Overlay.Models;
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using CommunityToolkit.Mvvm.ComponentModel;
+using MHFZ_Overlay.Models.Collections;
+using MHFZ_Overlay.Models.Structures;
+
+///
+/// TODO
+///
+public class BingoCell
+{
+ ///
+ /// The background color of the cell. Blue: Highest points line, Green: Completed, Yellow: Completed with 1 cart, Red: Completed with 2 or more carts.
+ ///
+ public string? BackgroundColor { get; set; } = CatppuccinMochaColors.NameHex["Crust"];
+
+ ///
+ /// Whether the cell is completed. Changes opacity via converter.
+ ///
+ public bool IsComplete { get; internal set; }
+
+ ///
+ /// The bingo monster in the cell.
+ ///
+ public BingoMonster? Monster { get; internal set; }
+
+ ///
+ /// TODO The number of carts in the bingo board. Used for decreasing scores in each cell.
+ ///
+ public int Carts { get; internal set; }
+
+ ///
+ /// The weapon type bonuses in the bingo board. Used for increasing scores in each cell and for rerolls.
+ ///
+ public FrontierWeaponType WeaponTypeBonus { get; internal set; }
+
+ ///
+ /// Whether the cell contains a book of secrets page.
+ ///
+ public bool ContainsBookOfSecretsPage { get; set; }
+
+ ///
+ /// Whether the cell contains a random ancient dragon part's scrap.
+ ///
+ public bool ContainsAncientDragonPartScrap { get; set; }
+}
diff --git a/MHFZ_Overlay/Models/BingoMonster.cs b/MHFZ_Overlay/Models/BingoMonster.cs
new file mode 100644
index 00000000..570d6b8e
--- /dev/null
+++ b/MHFZ_Overlay/Models/BingoMonster.cs
@@ -0,0 +1,50 @@
+// © 2023 The mhfz-overlay developers.
+// Use of this source code is governed by a MIT license that can be
+// found in the LICENSE file.
+
+namespace MHFZ_Overlay.Models;
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using MHFZ_Overlay.Models.Structures;
+
+public sealed class BingoMonster
+{
+ ///
+ /// The name of the monster
+ ///
+ public string Name { get; set; } = string.Empty;
+
+ ///
+ /// The type of the monster. Used to determine the scraps type to give.
+ ///
+ public FrontierMonsterType Type { get; set; }
+
+ ///
+ /// The image of the monster
+ ///
+ public string Image { get; set; } = string.Empty;
+
+ ///
+ /// The list of quest IDs of the monster
+ ///
+ public List? QuestIDs { get; set; }
+
+ ///
+ /// Whether the monster to hunt should be in Unlimited mode. If so, the QuestIDs are ignored if any and any non-custom quest counts as a completion.
+ ///
+ public bool IsUnlimited { get; set; }
+
+ ///
+ /// The monster ID of the unlimited monster.
+ ///
+ public int UnlimitedMonsterID { get; set; }
+
+ ///
+ /// The base bingo score obtained if defeated the monster.
+ ///
+ public int BaseScore { get; set; }
+}
diff --git a/MHFZ_Overlay/Models/BingoPlayer.cs b/MHFZ_Overlay/Models/BingoPlayer.cs
new file mode 100644
index 00000000..cd543b4a
--- /dev/null
+++ b/MHFZ_Overlay/Models/BingoPlayer.cs
@@ -0,0 +1,40 @@
+// © 2023 The mhfz-overlay developers.
+// Use of this source code is governed by a MIT license that can be
+// found in the LICENSE file.
+
+namespace MHFZ_Overlay.Models;
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using CommunityToolkit.Mvvm.ComponentModel;
+using MHFZ_Overlay.Models.Collections;
+using MHFZ_Overlay.Models.Structures;
+
+///
+/// TODO
+///
+public class BingoPlayer
+{
+ ///
+ /// The amount of bingo points currently stored.
+ ///
+ public int BingoPoints { get; set; }
+
+ ///
+ /// The amount of book of secrets pages currently stored.
+ ///
+ public int BookOfSecretsPages { get; set; }
+
+ ///
+ /// The amount of unlocked book of secrets chapters.
+ ///
+ public List? UnlockedChapters { get; set; }
+
+ ///
+ /// The amount of bingo shop upgrades unlocked.
+ ///
+ public List? UnlockedUpgrades { get; set; }
+}
diff --git a/MHFZ_Overlay/Models/BingoShopItem.cs b/MHFZ_Overlay/Models/BingoShopItem.cs
new file mode 100644
index 00000000..c0de4fbd
--- /dev/null
+++ b/MHFZ_Overlay/Models/BingoShopItem.cs
@@ -0,0 +1,28 @@
+// © 2023 The mhfz-overlay developers.
+// Use of this source code is governed by a MIT license that can be
+// found in the LICENSE file.
+
+namespace MHFZ_Overlay.Models;
+
+using MHFZ_Overlay.Models.Structures;
+
+///
+/// The bingo shop options.
+///
+public sealed class BingoShopItem
+{
+ ///
+ /// The name of the option.
+ ///
+ public string Name { get; set; } = string.Empty;
+
+ ///
+ /// The cost of the option.
+ ///
+ public int Cost { get; set; }
+
+ ///
+ /// Whether the option is unlocked.
+ ///
+ public bool IsUnlocked { get; set; }
+}
diff --git a/MHFZ_Overlay/Models/BingoUpgrade.cs b/MHFZ_Overlay/Models/BingoUpgrade.cs
new file mode 100644
index 00000000..7ade320c
--- /dev/null
+++ b/MHFZ_Overlay/Models/BingoUpgrade.cs
@@ -0,0 +1,48 @@
+// © 2023 The mhfz-overlay developers.
+// Use of this source code is governed by a MIT license that can be
+// found in the LICENSE file.
+
+namespace MHFZ_Overlay.Models;
+
+using MHFZ_Overlay.Models.Structures;
+
+///
+/// TODO readonlydictionary of bingoupgrades model
+///
+public sealed class BingoUpgrade
+{
+ ///
+ /// The name of the upgrade.
+ ///
+ public string Name { get; set; } = string.Empty;
+
+ ///
+ /// The description of the upgrade.
+ ///
+ public string Description { get; set; } = string.Empty;
+
+ ///
+ /// The icon of the upgrade.
+ ///
+ public string Icon { get; set; } = @"pack://application:,,,/MHFZ_Overlay;component/Assets/Icons/png/unknown.png";
+
+ ///
+ /// The type of the bingo upgrade.
+ ///
+ public BingoUpgradeType Type { get; set; }
+
+ ///
+ /// The max level possible of the upgrade.
+ ///
+ public int MaxLevel { get; set; }
+
+ ///
+ /// The current level of the upgrade.
+ ///
+ public int CurrentLevel { get; set; }
+
+ ///
+ /// Whether the upgrade is unlocked or not.
+ ///
+ public bool IsUnlocked { get; set; }
+}
diff --git a/MHFZ_Overlay/Models/Challenge.cs b/MHFZ_Overlay/Models/Challenge.cs
index 9ad82432..8633f59c 100644
--- a/MHFZ_Overlay/Models/Challenge.cs
+++ b/MHFZ_Overlay/Models/Challenge.cs
@@ -3,10 +3,15 @@
// found in the LICENSE file.
namespace MHFZ_Overlay.Models;
+
+using System;
using System.Windows;
+using System.Windows.Input;
public sealed class Challenge
{
+ public ICommand? StartChallengeCommand { get; set; }
+
///
/// Gets or sets the link to the banner image.
///
@@ -56,4 +61,9 @@ public sealed class Challenge
/// Gets or sets the name of the achievement id required.
///
public string AchievementNameRequired { get; set; } = string.Empty;
+
+ ///
+ /// The date when the challenge was unlocked
+ ///
+ public DateTime UnlockDate { get; set; } = DateTime.UnixEpoch;
}
diff --git a/MHFZ_Overlay/Models/ChallengeAncientDragon.cs b/MHFZ_Overlay/Models/ChallengeAncientDragon.cs
new file mode 100644
index 00000000..0efb1364
--- /dev/null
+++ b/MHFZ_Overlay/Models/ChallengeAncientDragon.cs
@@ -0,0 +1,39 @@
+// © 2023 The mhfz-overlay developers.
+// Use of this source code is governed by a MIT license that can be
+// found in the LICENSE file.
+
+namespace MHFZ_Overlay.Models;
+
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Windows;
+using System.Windows.Media;
+using Memory;
+using MHFZ_Overlay.Models.Collections;
+using MHFZ_Overlay.Models.Structures;
+using MHFZ_Overlay.Services;
+using MHFZ_Overlay.Views.Windows;
+using Wpf.Ui.Common;
+using Wpf.Ui.Controls;
+
+///
+/// The challenge ancient dragon.
+///
+public sealed class ChallengeAncientDragon
+{
+ ///
+ /// The parts of the dragon.
+ ///
+ public List? Parts { get; set; }
+
+ ///
+ /// The name of the dragon.
+ ///
+ public string Name { get; set; } = "Ancient Dragon";
+
+ ///
+ /// Whether the dragon is active or not.
+ ///
+ public bool IsActive { get; set; }
+}
diff --git a/MHFZ_Overlay/Models/ChallengeAncientDragonPart.cs b/MHFZ_Overlay/Models/ChallengeAncientDragonPart.cs
new file mode 100644
index 00000000..405b5a71
--- /dev/null
+++ b/MHFZ_Overlay/Models/ChallengeAncientDragonPart.cs
@@ -0,0 +1,83 @@
+// © 2023 The mhfz-overlay developers.
+// Use of this source code is governed by a MIT license that can be
+// found in the LICENSE file.
+
+namespace MHFZ_Overlay.Models;
+
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Windows;
+using System.Windows.Media;
+using MHFZ_Overlay.Models.Collections;
+using MHFZ_Overlay.Models.Structures;
+using MHFZ_Overlay.Services;
+using MHFZ_Overlay.Views.Windows;
+using Wpf.Ui.Common;
+using Wpf.Ui.Controls;
+
+///
+/// The challenge ancient dragon part.
+///
+public sealed class ChallengeAncientDragonPart
+{
+ ///
+ /// The name of the part.
+ ///
+ public string Name { get; set; } = string.Empty;
+
+ ///
+ /// The description of the inactive part.
+ ///
+ public string InactivePartDescription { get; set; } = string.Empty;
+
+ ///
+ /// The description of the active part.
+ ///
+ public string ActivePartDescription { get; set; } = string.Empty;
+
+ ///
+ /// The link of the part image before a true transcend.
+ ///
+ public string InactivePartImageLink { get; set; } = @"pack://application:,,,/MHFZ_Overlay;component/Assets/Icons/png/unknown.png";
+
+ ///
+ /// The link of the part image after a true transcend.
+ ///
+ public string ActivePartImageLink { get; set; } = @"pack://application:,,,/MHFZ_Overlay;component/Assets/Icons/png/unknown.png";
+
+ ///
+ /// Whether the part boosts all other parts (except itself).
+ ///
+ public bool IsSource { get; set; }
+
+ ///
+ /// The extra bonus when having the part that synergizes with this part.
+ ///
+ public ChallengeAncientDragonPart? NextSynergyPart { get; set; }
+
+ ///
+ /// The description of the effect.
+ ///
+ public string Effect { get; set; } = string.Empty;
+
+ ///
+ /// The description of the extra effect if having the Source part already.
+ ///
+ public string SourceEffect { get; set; } = string.Empty;
+
+ ///
+ /// The description of the synergy effect if having the part that synergizes with this part.
+ ///
+ public string SynergyEffect { get; set; } = string.Empty;
+
+ ///
+ /// Any additional details e.g. show how many bingo points you keep after a true transcend.
+ ///
+ public string Details { get; set; } = string.Empty;
+
+ ///
+ /// The amount of gems required from monster types to make a scrap. Each part requires 100 scraps.
+ ///
+ public Dictionary? GemsRequiredForScrap { get; set; }
+}
diff --git a/MHFZ_Overlay/Models/ChallengeBookOfSecretsChapter.cs b/MHFZ_Overlay/Models/ChallengeBookOfSecretsChapter.cs
new file mode 100644
index 00000000..a29d6bb6
--- /dev/null
+++ b/MHFZ_Overlay/Models/ChallengeBookOfSecretsChapter.cs
@@ -0,0 +1,69 @@
+// © 2023 The mhfz-overlay developers.
+// Use of this source code is governed by a MIT license that can be
+// found in the LICENSE file.
+
+namespace MHFZ_Overlay.Models;
+
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Windows;
+using System.Windows.Media;
+using Memory;
+using MHFZ_Overlay.Models.Collections;
+using MHFZ_Overlay.Models.Structures;
+using MHFZ_Overlay.Services;
+using MHFZ_Overlay.Views.Windows;
+using Wpf.Ui.Common;
+using Wpf.Ui.Controls;
+
+///
+/// The challenge book of secrets upgrade.
+///
+public sealed class ChallengeBookOfSecretsChapter
+{
+ ///
+ /// The name of the chapter.
+ ///
+ public string Name { get; set; } = string.Empty;
+
+ ///
+ /// The description of the chapter.
+ ///
+ public string Description { get; set; } = string.Empty;
+
+ ///
+ /// The text shown after obtaining the chapter.
+ ///
+ public string Details { get; set; } = string.Empty;
+
+ ///
+ /// The amount of pages required for the chapter.
+ ///
+ public int PagesRequired { get; set; }
+
+ ///
+ /// Whether the chapter is unlocked.
+ ///
+ public bool IsUnlocked { get; set; }
+
+ ///
+ /// The list of chapters this chapter unlocks.
+ ///
+ public List UnlockedChapters { get; set; } = new ();
+
+ ///
+ /// The list of upgrades this chapter unlocks.
+ ///
+ public List