From 3ecca9ad4cb3fc134c5436a961d4ca5edb50a87c Mon Sep 17 00:00:00 2001 From: Claude Date: Thu, 12 Nov 2026 18:28:33 +0000 Subject: [PATCH] Add the HP and MP recovery rates Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_014gSmkTnTjQfc83H72tpiYm --- ...Test.RecoveryRateDocumentation.approved.md | 501 ++++++++++++++++++ .../IRecoveryRateService.cs | 33 ++ .../RecoveryRateService.cs | 44 ++ .../DocumentationTest.cs | 22 + 4 files changed, 600 insertions(+) create mode 100644 documentation/DocumentationTest.RecoveryRateDocumentation.approved.md create mode 100644 src/NosCore.Algorithm/RecoveryRateService/IRecoveryRateService.cs create mode 100644 src/NosCore.Algorithm/RecoveryRateService/RecoveryRateService.cs diff --git a/documentation/DocumentationTest.RecoveryRateDocumentation.approved.md b/documentation/DocumentationTest.RecoveryRateDocumentation.approved.md new file mode 100644 index 0000000..eadb266 --- /dev/null +++ b/documentation/DocumentationTest.RecoveryRateDocumentation.approved.md @@ -0,0 +1,501 @@ +# Recovery Rate Table +## Adventurer - Resting HP: 30 - Resting MP: 10 +- Level 1 - Standing HP: 15 - Standing MP: 5 +- Level 2 - Standing HP: 15 - Standing MP: 5 +- Level 3 - Standing HP: 15 - Standing MP: 5 +- Level 4 - Standing HP: 15 - Standing MP: 5 +- Level 5 - Standing HP: 15 - Standing MP: 5 +- Level 6 - Standing HP: 15 - Standing MP: 5 +- Level 7 - Standing HP: 15 - Standing MP: 5 +- Level 8 - Standing HP: 15 - Standing MP: 5 +- Level 9 - Standing HP: 15 - Standing MP: 5 +- Level 10 - Standing HP: 15 - Standing MP: 5 +- Level 11 - Standing HP: 15 - Standing MP: 5 +- Level 12 - Standing HP: 15 - Standing MP: 5 +- Level 13 - Standing HP: 15 - Standing MP: 5 +- Level 14 - Standing HP: 15 - Standing MP: 5 +- Level 15 - Standing HP: 15 - Standing MP: 5 +- Level 16 - Standing HP: 15 - Standing MP: 5 +- Level 17 - Standing HP: 15 - Standing MP: 5 +- Level 18 - Standing HP: 15 - Standing MP: 5 +- Level 19 - Standing HP: 15 - Standing MP: 5 +- Level 20 - Standing HP: 15 - Standing MP: 5 +- Level 21 - Standing HP: 12 - Standing MP: 4 +- Level 22 - Standing HP: 12 - Standing MP: 4 +- Level 23 - Standing HP: 12 - Standing MP: 4 +- Level 24 - Standing HP: 12 - Standing MP: 4 +- Level 25 - Standing HP: 12 - Standing MP: 4 +- Level 26 - Standing HP: 12 - Standing MP: 4 +- Level 27 - Standing HP: 12 - Standing MP: 4 +- Level 28 - Standing HP: 12 - Standing MP: 4 +- Level 29 - Standing HP: 12 - Standing MP: 4 +- Level 30 - Standing HP: 12 - Standing MP: 4 +- Level 31 - Standing HP: 12 - Standing MP: 4 +- Level 32 - Standing HP: 12 - Standing MP: 4 +- Level 33 - Standing HP: 12 - Standing MP: 4 +- Level 34 - Standing HP: 12 - Standing MP: 4 +- Level 35 - Standing HP: 12 - Standing MP: 4 +- Level 36 - Standing HP: 12 - Standing MP: 4 +- Level 37 - Standing HP: 12 - Standing MP: 4 +- Level 38 - Standing HP: 12 - Standing MP: 4 +- Level 39 - Standing HP: 12 - Standing MP: 4 +- Level 40 - Standing HP: 12 - Standing MP: 4 +- Level 41 - Standing HP: 9 - Standing MP: 3 +- Level 42 - Standing HP: 9 - Standing MP: 3 +- Level 43 - Standing HP: 9 - Standing MP: 3 +- Level 44 - Standing HP: 9 - Standing MP: 3 +- Level 45 - Standing HP: 9 - Standing MP: 3 +- Level 46 - Standing HP: 9 - Standing MP: 3 +- Level 47 - Standing HP: 9 - Standing MP: 3 +- Level 48 - Standing HP: 9 - Standing MP: 3 +- Level 49 - Standing HP: 9 - Standing MP: 3 +- Level 50 - Standing HP: 9 - Standing MP: 3 +- Level 51 - Standing HP: 9 - Standing MP: 3 +- Level 52 - Standing HP: 9 - Standing MP: 3 +- Level 53 - Standing HP: 9 - Standing MP: 3 +- Level 54 - Standing HP: 9 - Standing MP: 3 +- Level 55 - Standing HP: 9 - Standing MP: 3 +- Level 56 - Standing HP: 9 - Standing MP: 3 +- Level 57 - Standing HP: 9 - Standing MP: 3 +- Level 58 - Standing HP: 9 - Standing MP: 3 +- Level 59 - Standing HP: 9 - Standing MP: 3 +- Level 60 - Standing HP: 9 - Standing MP: 3 +- Level 61 - Standing HP: 6 - Standing MP: 2 +- Level 62 - Standing HP: 6 - Standing MP: 2 +- Level 63 - Standing HP: 6 - Standing MP: 2 +- Level 64 - Standing HP: 6 - Standing MP: 2 +- Level 65 - Standing HP: 6 - Standing MP: 2 +- Level 66 - Standing HP: 6 - Standing MP: 2 +- Level 67 - Standing HP: 6 - Standing MP: 2 +- Level 68 - Standing HP: 6 - Standing MP: 2 +- Level 69 - Standing HP: 6 - Standing MP: 2 +- Level 70 - Standing HP: 6 - Standing MP: 2 +- Level 71 - Standing HP: 6 - Standing MP: 2 +- Level 72 - Standing HP: 6 - Standing MP: 2 +- Level 73 - Standing HP: 6 - Standing MP: 2 +- Level 74 - Standing HP: 6 - Standing MP: 2 +- Level 75 - Standing HP: 6 - Standing MP: 2 +- Level 76 - Standing HP: 6 - Standing MP: 2 +- Level 77 - Standing HP: 6 - Standing MP: 2 +- Level 78 - Standing HP: 6 - Standing MP: 2 +- Level 79 - Standing HP: 6 - Standing MP: 2 +- Level 80 - Standing HP: 6 - Standing MP: 2 +- Level 81 - Standing HP: 6 - Standing MP: 2 +- Level 82 - Standing HP: 6 - Standing MP: 2 +- Level 83 - Standing HP: 6 - Standing MP: 2 +- Level 84 - Standing HP: 6 - Standing MP: 2 +- Level 85 - Standing HP: 6 - Standing MP: 2 +- Level 86 - Standing HP: 6 - Standing MP: 2 +- Level 87 - Standing HP: 6 - Standing MP: 2 +- Level 88 - Standing HP: 6 - Standing MP: 2 +- Level 89 - Standing HP: 6 - Standing MP: 2 +- Level 90 - Standing HP: 6 - Standing MP: 2 +- Level 91 - Standing HP: 6 - Standing MP: 2 +- Level 92 - Standing HP: 6 - Standing MP: 2 +- Level 93 - Standing HP: 6 - Standing MP: 2 +- Level 94 - Standing HP: 6 - Standing MP: 2 +- Level 95 - Standing HP: 6 - Standing MP: 2 +- Level 96 - Standing HP: 6 - Standing MP: 2 +- Level 97 - Standing HP: 6 - Standing MP: 2 +- Level 98 - Standing HP: 6 - Standing MP: 2 +- Level 99 - Standing HP: 6 - Standing MP: 2 +## Swordsman - Resting HP: 80 - Resting MP: 30 +- Level 1 - Standing HP: 40 - Standing MP: 15 +- Level 2 - Standing HP: 40 - Standing MP: 15 +- Level 3 - Standing HP: 40 - Standing MP: 15 +- Level 4 - Standing HP: 40 - Standing MP: 15 +- Level 5 - Standing HP: 40 - Standing MP: 15 +- Level 6 - Standing HP: 40 - Standing MP: 15 +- Level 7 - Standing HP: 40 - Standing MP: 15 +- Level 8 - Standing HP: 40 - Standing MP: 15 +- Level 9 - Standing HP: 40 - Standing MP: 15 +- Level 10 - Standing HP: 40 - Standing MP: 15 +- Level 11 - Standing HP: 40 - Standing MP: 15 +- Level 12 - Standing HP: 40 - Standing MP: 15 +- Level 13 - Standing HP: 40 - Standing MP: 15 +- Level 14 - Standing HP: 40 - Standing MP: 15 +- Level 15 - Standing HP: 40 - Standing MP: 15 +- Level 16 - Standing HP: 40 - Standing MP: 15 +- Level 17 - Standing HP: 40 - Standing MP: 15 +- Level 18 - Standing HP: 40 - Standing MP: 15 +- Level 19 - Standing HP: 40 - Standing MP: 15 +- Level 20 - Standing HP: 40 - Standing MP: 15 +- Level 21 - Standing HP: 32 - Standing MP: 12 +- Level 22 - Standing HP: 32 - Standing MP: 12 +- Level 23 - Standing HP: 32 - Standing MP: 12 +- Level 24 - Standing HP: 32 - Standing MP: 12 +- Level 25 - Standing HP: 32 - Standing MP: 12 +- Level 26 - Standing HP: 32 - Standing MP: 12 +- Level 27 - Standing HP: 32 - Standing MP: 12 +- Level 28 - Standing HP: 32 - Standing MP: 12 +- Level 29 - Standing HP: 32 - Standing MP: 12 +- Level 30 - Standing HP: 32 - Standing MP: 12 +- Level 31 - Standing HP: 32 - Standing MP: 12 +- Level 32 - Standing HP: 32 - Standing MP: 12 +- Level 33 - Standing HP: 32 - Standing MP: 12 +- Level 34 - Standing HP: 32 - Standing MP: 12 +- Level 35 - Standing HP: 32 - Standing MP: 12 +- Level 36 - Standing HP: 32 - Standing MP: 12 +- Level 37 - Standing HP: 32 - Standing MP: 12 +- Level 38 - Standing HP: 32 - Standing MP: 12 +- Level 39 - Standing HP: 32 - Standing MP: 12 +- Level 40 - Standing HP: 32 - Standing MP: 12 +- Level 41 - Standing HP: 24 - Standing MP: 9 +- Level 42 - Standing HP: 24 - Standing MP: 9 +- Level 43 - Standing HP: 24 - Standing MP: 9 +- Level 44 - Standing HP: 24 - Standing MP: 9 +- Level 45 - Standing HP: 24 - Standing MP: 9 +- Level 46 - Standing HP: 24 - Standing MP: 9 +- Level 47 - Standing HP: 24 - Standing MP: 9 +- Level 48 - Standing HP: 24 - Standing MP: 9 +- Level 49 - Standing HP: 24 - Standing MP: 9 +- Level 50 - Standing HP: 24 - Standing MP: 9 +- Level 51 - Standing HP: 24 - Standing MP: 9 +- Level 52 - Standing HP: 24 - Standing MP: 9 +- Level 53 - Standing HP: 24 - Standing MP: 9 +- Level 54 - Standing HP: 24 - Standing MP: 9 +- Level 55 - Standing HP: 24 - Standing MP: 9 +- Level 56 - Standing HP: 24 - Standing MP: 9 +- Level 57 - Standing HP: 24 - Standing MP: 9 +- Level 58 - Standing HP: 24 - Standing MP: 9 +- Level 59 - Standing HP: 24 - Standing MP: 9 +- Level 60 - Standing HP: 24 - Standing MP: 9 +- Level 61 - Standing HP: 16 - Standing MP: 6 +- Level 62 - Standing HP: 16 - Standing MP: 6 +- Level 63 - Standing HP: 16 - Standing MP: 6 +- Level 64 - Standing HP: 16 - Standing MP: 6 +- Level 65 - Standing HP: 16 - Standing MP: 6 +- Level 66 - Standing HP: 16 - Standing MP: 6 +- Level 67 - Standing HP: 16 - Standing MP: 6 +- Level 68 - Standing HP: 16 - Standing MP: 6 +- Level 69 - Standing HP: 16 - Standing MP: 6 +- Level 70 - Standing HP: 16 - Standing MP: 6 +- Level 71 - Standing HP: 16 - Standing MP: 6 +- Level 72 - Standing HP: 16 - Standing MP: 6 +- Level 73 - Standing HP: 16 - Standing MP: 6 +- Level 74 - Standing HP: 16 - Standing MP: 6 +- Level 75 - Standing HP: 16 - Standing MP: 6 +- Level 76 - Standing HP: 16 - Standing MP: 6 +- Level 77 - Standing HP: 16 - Standing MP: 6 +- Level 78 - Standing HP: 16 - Standing MP: 6 +- Level 79 - Standing HP: 16 - Standing MP: 6 +- Level 80 - Standing HP: 16 - Standing MP: 6 +- Level 81 - Standing HP: 16 - Standing MP: 6 +- Level 82 - Standing HP: 16 - Standing MP: 6 +- Level 83 - Standing HP: 16 - Standing MP: 6 +- Level 84 - Standing HP: 16 - Standing MP: 6 +- Level 85 - Standing HP: 16 - Standing MP: 6 +- Level 86 - Standing HP: 16 - Standing MP: 6 +- Level 87 - Standing HP: 16 - Standing MP: 6 +- Level 88 - Standing HP: 16 - Standing MP: 6 +- Level 89 - Standing HP: 16 - Standing MP: 6 +- Level 90 - Standing HP: 16 - Standing MP: 6 +- Level 91 - Standing HP: 16 - Standing MP: 6 +- Level 92 - Standing HP: 16 - Standing MP: 6 +- Level 93 - Standing HP: 16 - Standing MP: 6 +- Level 94 - Standing HP: 16 - Standing MP: 6 +- Level 95 - Standing HP: 16 - Standing MP: 6 +- Level 96 - Standing HP: 16 - Standing MP: 6 +- Level 97 - Standing HP: 16 - Standing MP: 6 +- Level 98 - Standing HP: 16 - Standing MP: 6 +- Level 99 - Standing HP: 16 - Standing MP: 6 +## Archer - Resting HP: 60 - Resting MP: 50 +- Level 1 - Standing HP: 30 - Standing MP: 25 +- Level 2 - Standing HP: 30 - Standing MP: 25 +- Level 3 - Standing HP: 30 - Standing MP: 25 +- Level 4 - Standing HP: 30 - Standing MP: 25 +- Level 5 - Standing HP: 30 - Standing MP: 25 +- Level 6 - Standing HP: 30 - Standing MP: 25 +- Level 7 - Standing HP: 30 - Standing MP: 25 +- Level 8 - Standing HP: 30 - Standing MP: 25 +- Level 9 - Standing HP: 30 - Standing MP: 25 +- Level 10 - Standing HP: 30 - Standing MP: 25 +- Level 11 - Standing HP: 30 - Standing MP: 25 +- Level 12 - Standing HP: 30 - Standing MP: 25 +- Level 13 - Standing HP: 30 - Standing MP: 25 +- Level 14 - Standing HP: 30 - Standing MP: 25 +- Level 15 - Standing HP: 30 - Standing MP: 25 +- Level 16 - Standing HP: 30 - Standing MP: 25 +- Level 17 - Standing HP: 30 - Standing MP: 25 +- Level 18 - Standing HP: 30 - Standing MP: 25 +- Level 19 - Standing HP: 30 - Standing MP: 25 +- Level 20 - Standing HP: 30 - Standing MP: 25 +- Level 21 - Standing HP: 24 - Standing MP: 20 +- Level 22 - Standing HP: 24 - Standing MP: 20 +- Level 23 - Standing HP: 24 - Standing MP: 20 +- Level 24 - Standing HP: 24 - Standing MP: 20 +- Level 25 - Standing HP: 24 - Standing MP: 20 +- Level 26 - Standing HP: 24 - Standing MP: 20 +- Level 27 - Standing HP: 24 - Standing MP: 20 +- Level 28 - Standing HP: 24 - Standing MP: 20 +- Level 29 - Standing HP: 24 - Standing MP: 20 +- Level 30 - Standing HP: 24 - Standing MP: 20 +- Level 31 - Standing HP: 24 - Standing MP: 20 +- Level 32 - Standing HP: 24 - Standing MP: 20 +- Level 33 - Standing HP: 24 - Standing MP: 20 +- Level 34 - Standing HP: 24 - Standing MP: 20 +- Level 35 - Standing HP: 24 - Standing MP: 20 +- Level 36 - Standing HP: 24 - Standing MP: 20 +- Level 37 - Standing HP: 24 - Standing MP: 20 +- Level 38 - Standing HP: 24 - Standing MP: 20 +- Level 39 - Standing HP: 24 - Standing MP: 20 +- Level 40 - Standing HP: 24 - Standing MP: 20 +- Level 41 - Standing HP: 18 - Standing MP: 15 +- Level 42 - Standing HP: 18 - Standing MP: 15 +- Level 43 - Standing HP: 18 - Standing MP: 15 +- Level 44 - Standing HP: 18 - Standing MP: 15 +- Level 45 - Standing HP: 18 - Standing MP: 15 +- Level 46 - Standing HP: 18 - Standing MP: 15 +- Level 47 - Standing HP: 18 - Standing MP: 15 +- Level 48 - Standing HP: 18 - Standing MP: 15 +- Level 49 - Standing HP: 18 - Standing MP: 15 +- Level 50 - Standing HP: 18 - Standing MP: 15 +- Level 51 - Standing HP: 18 - Standing MP: 15 +- Level 52 - Standing HP: 18 - Standing MP: 15 +- Level 53 - Standing HP: 18 - Standing MP: 15 +- Level 54 - Standing HP: 18 - Standing MP: 15 +- Level 55 - Standing HP: 18 - Standing MP: 15 +- Level 56 - Standing HP: 18 - Standing MP: 15 +- Level 57 - Standing HP: 18 - Standing MP: 15 +- Level 58 - Standing HP: 18 - Standing MP: 15 +- Level 59 - Standing HP: 18 - Standing MP: 15 +- Level 60 - Standing HP: 18 - Standing MP: 15 +- Level 61 - Standing HP: 12 - Standing MP: 10 +- Level 62 - Standing HP: 12 - Standing MP: 10 +- Level 63 - Standing HP: 12 - Standing MP: 10 +- Level 64 - Standing HP: 12 - Standing MP: 10 +- Level 65 - Standing HP: 12 - Standing MP: 10 +- Level 66 - Standing HP: 12 - Standing MP: 10 +- Level 67 - Standing HP: 12 - Standing MP: 10 +- Level 68 - Standing HP: 12 - Standing MP: 10 +- Level 69 - Standing HP: 12 - Standing MP: 10 +- Level 70 - Standing HP: 12 - Standing MP: 10 +- Level 71 - Standing HP: 12 - Standing MP: 10 +- Level 72 - Standing HP: 12 - Standing MP: 10 +- Level 73 - Standing HP: 12 - Standing MP: 10 +- Level 74 - Standing HP: 12 - Standing MP: 10 +- Level 75 - Standing HP: 12 - Standing MP: 10 +- Level 76 - Standing HP: 12 - Standing MP: 10 +- Level 77 - Standing HP: 12 - Standing MP: 10 +- Level 78 - Standing HP: 12 - Standing MP: 10 +- Level 79 - Standing HP: 12 - Standing MP: 10 +- Level 80 - Standing HP: 12 - Standing MP: 10 +- Level 81 - Standing HP: 12 - Standing MP: 10 +- Level 82 - Standing HP: 12 - Standing MP: 10 +- Level 83 - Standing HP: 12 - Standing MP: 10 +- Level 84 - Standing HP: 12 - Standing MP: 10 +- Level 85 - Standing HP: 12 - Standing MP: 10 +- Level 86 - Standing HP: 12 - Standing MP: 10 +- Level 87 - Standing HP: 12 - Standing MP: 10 +- Level 88 - Standing HP: 12 - Standing MP: 10 +- Level 89 - Standing HP: 12 - Standing MP: 10 +- Level 90 - Standing HP: 12 - Standing MP: 10 +- Level 91 - Standing HP: 12 - Standing MP: 10 +- Level 92 - Standing HP: 12 - Standing MP: 10 +- Level 93 - Standing HP: 12 - Standing MP: 10 +- Level 94 - Standing HP: 12 - Standing MP: 10 +- Level 95 - Standing HP: 12 - Standing MP: 10 +- Level 96 - Standing HP: 12 - Standing MP: 10 +- Level 97 - Standing HP: 12 - Standing MP: 10 +- Level 98 - Standing HP: 12 - Standing MP: 10 +- Level 99 - Standing HP: 12 - Standing MP: 10 +## Mage - Resting HP: 30 - Resting MP: 80 +- Level 1 - Standing HP: 15 - Standing MP: 40 +- Level 2 - Standing HP: 15 - Standing MP: 40 +- Level 3 - Standing HP: 15 - Standing MP: 40 +- Level 4 - Standing HP: 15 - Standing MP: 40 +- Level 5 - Standing HP: 15 - Standing MP: 40 +- Level 6 - Standing HP: 15 - Standing MP: 40 +- Level 7 - Standing HP: 15 - Standing MP: 40 +- Level 8 - Standing HP: 15 - Standing MP: 40 +- Level 9 - Standing HP: 15 - Standing MP: 40 +- Level 10 - Standing HP: 15 - Standing MP: 40 +- Level 11 - Standing HP: 15 - Standing MP: 40 +- Level 12 - Standing HP: 15 - Standing MP: 40 +- Level 13 - Standing HP: 15 - Standing MP: 40 +- Level 14 - Standing HP: 15 - Standing MP: 40 +- Level 15 - Standing HP: 15 - Standing MP: 40 +- Level 16 - Standing HP: 15 - Standing MP: 40 +- Level 17 - Standing HP: 15 - Standing MP: 40 +- Level 18 - Standing HP: 15 - Standing MP: 40 +- Level 19 - Standing HP: 15 - Standing MP: 40 +- Level 20 - Standing HP: 15 - Standing MP: 40 +- Level 21 - Standing HP: 12 - Standing MP: 32 +- Level 22 - Standing HP: 12 - Standing MP: 32 +- Level 23 - Standing HP: 12 - Standing MP: 32 +- Level 24 - Standing HP: 12 - Standing MP: 32 +- Level 25 - Standing HP: 12 - Standing MP: 32 +- Level 26 - Standing HP: 12 - Standing MP: 32 +- Level 27 - Standing HP: 12 - Standing MP: 32 +- Level 28 - Standing HP: 12 - Standing MP: 32 +- Level 29 - Standing HP: 12 - Standing MP: 32 +- Level 30 - Standing HP: 12 - Standing MP: 32 +- Level 31 - Standing HP: 12 - Standing MP: 32 +- Level 32 - Standing HP: 12 - Standing MP: 32 +- Level 33 - Standing HP: 12 - Standing MP: 32 +- Level 34 - Standing HP: 12 - Standing MP: 32 +- Level 35 - Standing HP: 12 - Standing MP: 32 +- Level 36 - Standing HP: 12 - Standing MP: 32 +- Level 37 - Standing HP: 12 - Standing MP: 32 +- Level 38 - Standing HP: 12 - Standing MP: 32 +- Level 39 - Standing HP: 12 - Standing MP: 32 +- Level 40 - Standing HP: 12 - Standing MP: 32 +- Level 41 - Standing HP: 9 - Standing MP: 24 +- Level 42 - Standing HP: 9 - Standing MP: 24 +- Level 43 - Standing HP: 9 - Standing MP: 24 +- Level 44 - Standing HP: 9 - Standing MP: 24 +- Level 45 - Standing HP: 9 - Standing MP: 24 +- Level 46 - Standing HP: 9 - Standing MP: 24 +- Level 47 - Standing HP: 9 - Standing MP: 24 +- Level 48 - Standing HP: 9 - Standing MP: 24 +- Level 49 - Standing HP: 9 - Standing MP: 24 +- Level 50 - Standing HP: 9 - Standing MP: 24 +- Level 51 - Standing HP: 9 - Standing MP: 24 +- Level 52 - Standing HP: 9 - Standing MP: 24 +- Level 53 - Standing HP: 9 - Standing MP: 24 +- Level 54 - Standing HP: 9 - Standing MP: 24 +- Level 55 - Standing HP: 9 - Standing MP: 24 +- Level 56 - Standing HP: 9 - Standing MP: 24 +- Level 57 - Standing HP: 9 - Standing MP: 24 +- Level 58 - Standing HP: 9 - Standing MP: 24 +- Level 59 - Standing HP: 9 - Standing MP: 24 +- Level 60 - Standing HP: 9 - Standing MP: 24 +- Level 61 - Standing HP: 6 - Standing MP: 16 +- Level 62 - Standing HP: 6 - Standing MP: 16 +- Level 63 - Standing HP: 6 - Standing MP: 16 +- Level 64 - Standing HP: 6 - Standing MP: 16 +- Level 65 - Standing HP: 6 - Standing MP: 16 +- Level 66 - Standing HP: 6 - Standing MP: 16 +- Level 67 - Standing HP: 6 - Standing MP: 16 +- Level 68 - Standing HP: 6 - Standing MP: 16 +- Level 69 - Standing HP: 6 - Standing MP: 16 +- Level 70 - Standing HP: 6 - Standing MP: 16 +- Level 71 - Standing HP: 6 - Standing MP: 16 +- Level 72 - Standing HP: 6 - Standing MP: 16 +- Level 73 - Standing HP: 6 - Standing MP: 16 +- Level 74 - Standing HP: 6 - Standing MP: 16 +- Level 75 - Standing HP: 6 - Standing MP: 16 +- Level 76 - Standing HP: 6 - Standing MP: 16 +- Level 77 - Standing HP: 6 - Standing MP: 16 +- Level 78 - Standing HP: 6 - Standing MP: 16 +- Level 79 - Standing HP: 6 - Standing MP: 16 +- Level 80 - Standing HP: 6 - Standing MP: 16 +- Level 81 - Standing HP: 6 - Standing MP: 16 +- Level 82 - Standing HP: 6 - Standing MP: 16 +- Level 83 - Standing HP: 6 - Standing MP: 16 +- Level 84 - Standing HP: 6 - Standing MP: 16 +- Level 85 - Standing HP: 6 - Standing MP: 16 +- Level 86 - Standing HP: 6 - Standing MP: 16 +- Level 87 - Standing HP: 6 - Standing MP: 16 +- Level 88 - Standing HP: 6 - Standing MP: 16 +- Level 89 - Standing HP: 6 - Standing MP: 16 +- Level 90 - Standing HP: 6 - Standing MP: 16 +- Level 91 - Standing HP: 6 - Standing MP: 16 +- Level 92 - Standing HP: 6 - Standing MP: 16 +- Level 93 - Standing HP: 6 - Standing MP: 16 +- Level 94 - Standing HP: 6 - Standing MP: 16 +- Level 95 - Standing HP: 6 - Standing MP: 16 +- Level 96 - Standing HP: 6 - Standing MP: 16 +- Level 97 - Standing HP: 6 - Standing MP: 16 +- Level 98 - Standing HP: 6 - Standing MP: 16 +- Level 99 - Standing HP: 6 - Standing MP: 16 +## MartialArtist - Resting HP: 70 - Resting MP: 40 +- Level 1 - Standing HP: 35 - Standing MP: 20 +- Level 2 - Standing HP: 35 - Standing MP: 20 +- Level 3 - Standing HP: 35 - Standing MP: 20 +- Level 4 - Standing HP: 35 - Standing MP: 20 +- Level 5 - Standing HP: 35 - Standing MP: 20 +- Level 6 - Standing HP: 35 - Standing MP: 20 +- Level 7 - Standing HP: 35 - Standing MP: 20 +- Level 8 - Standing HP: 35 - Standing MP: 20 +- Level 9 - Standing HP: 35 - Standing MP: 20 +- Level 10 - Standing HP: 35 - Standing MP: 20 +- Level 11 - Standing HP: 35 - Standing MP: 20 +- Level 12 - Standing HP: 35 - Standing MP: 20 +- Level 13 - Standing HP: 35 - Standing MP: 20 +- Level 14 - Standing HP: 35 - Standing MP: 20 +- Level 15 - Standing HP: 35 - Standing MP: 20 +- Level 16 - Standing HP: 35 - Standing MP: 20 +- Level 17 - Standing HP: 35 - Standing MP: 20 +- Level 18 - Standing HP: 35 - Standing MP: 20 +- Level 19 - Standing HP: 35 - Standing MP: 20 +- Level 20 - Standing HP: 35 - Standing MP: 20 +- Level 21 - Standing HP: 28 - Standing MP: 16 +- Level 22 - Standing HP: 28 - Standing MP: 16 +- Level 23 - Standing HP: 28 - Standing MP: 16 +- Level 24 - Standing HP: 28 - Standing MP: 16 +- Level 25 - Standing HP: 28 - Standing MP: 16 +- Level 26 - Standing HP: 28 - Standing MP: 16 +- Level 27 - Standing HP: 28 - Standing MP: 16 +- Level 28 - Standing HP: 28 - Standing MP: 16 +- Level 29 - Standing HP: 28 - Standing MP: 16 +- Level 30 - Standing HP: 28 - Standing MP: 16 +- Level 31 - Standing HP: 28 - Standing MP: 16 +- Level 32 - Standing HP: 28 - Standing MP: 16 +- Level 33 - Standing HP: 28 - Standing MP: 16 +- Level 34 - Standing HP: 28 - Standing MP: 16 +- Level 35 - Standing HP: 28 - Standing MP: 16 +- Level 36 - Standing HP: 28 - Standing MP: 16 +- Level 37 - Standing HP: 28 - Standing MP: 16 +- Level 38 - Standing HP: 28 - Standing MP: 16 +- Level 39 - Standing HP: 28 - Standing MP: 16 +- Level 40 - Standing HP: 28 - Standing MP: 16 +- Level 41 - Standing HP: 21 - Standing MP: 12 +- Level 42 - Standing HP: 21 - Standing MP: 12 +- Level 43 - Standing HP: 21 - Standing MP: 12 +- Level 44 - Standing HP: 21 - Standing MP: 12 +- Level 45 - Standing HP: 21 - Standing MP: 12 +- Level 46 - Standing HP: 21 - Standing MP: 12 +- Level 47 - Standing HP: 21 - Standing MP: 12 +- Level 48 - Standing HP: 21 - Standing MP: 12 +- Level 49 - Standing HP: 21 - Standing MP: 12 +- Level 50 - Standing HP: 21 - Standing MP: 12 +- Level 51 - Standing HP: 21 - Standing MP: 12 +- Level 52 - Standing HP: 21 - Standing MP: 12 +- Level 53 - Standing HP: 21 - Standing MP: 12 +- Level 54 - Standing HP: 21 - Standing MP: 12 +- Level 55 - Standing HP: 21 - Standing MP: 12 +- Level 56 - Standing HP: 21 - Standing MP: 12 +- Level 57 - Standing HP: 21 - Standing MP: 12 +- Level 58 - Standing HP: 21 - Standing MP: 12 +- Level 59 - Standing HP: 21 - Standing MP: 12 +- Level 60 - Standing HP: 21 - Standing MP: 12 +- Level 61 - Standing HP: 14 - Standing MP: 8 +- Level 62 - Standing HP: 14 - Standing MP: 8 +- Level 63 - Standing HP: 14 - Standing MP: 8 +- Level 64 - Standing HP: 14 - Standing MP: 8 +- Level 65 - Standing HP: 14 - Standing MP: 8 +- Level 66 - Standing HP: 14 - Standing MP: 8 +- Level 67 - Standing HP: 14 - Standing MP: 8 +- Level 68 - Standing HP: 14 - Standing MP: 8 +- Level 69 - Standing HP: 14 - Standing MP: 8 +- Level 70 - Standing HP: 14 - Standing MP: 8 +- Level 71 - Standing HP: 14 - Standing MP: 8 +- Level 72 - Standing HP: 14 - Standing MP: 8 +- Level 73 - Standing HP: 14 - Standing MP: 8 +- Level 74 - Standing HP: 14 - Standing MP: 8 +- Level 75 - Standing HP: 14 - Standing MP: 8 +- Level 76 - Standing HP: 14 - Standing MP: 8 +- Level 77 - Standing HP: 14 - Standing MP: 8 +- Level 78 - Standing HP: 14 - Standing MP: 8 +- Level 79 - Standing HP: 14 - Standing MP: 8 +- Level 80 - Standing HP: 14 - Standing MP: 8 +- Level 81 - Standing HP: 14 - Standing MP: 8 +- Level 82 - Standing HP: 14 - Standing MP: 8 +- Level 83 - Standing HP: 14 - Standing MP: 8 +- Level 84 - Standing HP: 14 - Standing MP: 8 +- Level 85 - Standing HP: 14 - Standing MP: 8 +- Level 86 - Standing HP: 14 - Standing MP: 8 +- Level 87 - Standing HP: 14 - Standing MP: 8 +- Level 88 - Standing HP: 14 - Standing MP: 8 +- Level 89 - Standing HP: 14 - Standing MP: 8 +- Level 90 - Standing HP: 14 - Standing MP: 8 +- Level 91 - Standing HP: 14 - Standing MP: 8 +- Level 92 - Standing HP: 14 - Standing MP: 8 +- Level 93 - Standing HP: 14 - Standing MP: 8 +- Level 94 - Standing HP: 14 - Standing MP: 8 +- Level 95 - Standing HP: 14 - Standing MP: 8 +- Level 96 - Standing HP: 14 - Standing MP: 8 +- Level 97 - Standing HP: 14 - Standing MP: 8 +- Level 98 - Standing HP: 14 - Standing MP: 8 +- Level 99 - Standing HP: 14 - Standing MP: 8 diff --git a/src/NosCore.Algorithm/RecoveryRateService/IRecoveryRateService.cs b/src/NosCore.Algorithm/RecoveryRateService/IRecoveryRateService.cs new file mode 100644 index 0000000..f73315b --- /dev/null +++ b/src/NosCore.Algorithm/RecoveryRateService/IRecoveryRateService.cs @@ -0,0 +1,33 @@ +// __ _ __ __ ___ __ ___ ___ +// | \| |/__\ /' _/ / _//__\| _ \ __| +// | | ' | \/ |`._`.| \_| \/ | v / _| +// |_|\__|\__/ |___/ \__/\__/|_|_\___| +// ----------------------------------- + +using NosCore.Shared.Enumerations; + +namespace NosCore.Algorithm.RecoveryRateService +{ + /// + /// HP and MP points a character recovers per regeneration tick + /// + public interface IRecoveryRateService + { + /// + /// Gets the HP recovered per tick while sitting + /// + int GetRestingHpRate(CharacterClassType characterClass); + + /// + /// Gets the MP recovered per tick while sitting + /// + int GetRestingMpRate(CharacterClassType characterClass); + + /// + /// Gets the rate recovered per tick while standing, derived from the resting rate + /// + /// The resting HP or MP rate + /// The character level + int GetStandingRate(int restingRate, byte level); + } +} diff --git a/src/NosCore.Algorithm/RecoveryRateService/RecoveryRateService.cs b/src/NosCore.Algorithm/RecoveryRateService/RecoveryRateService.cs new file mode 100644 index 0000000..7d477ff --- /dev/null +++ b/src/NosCore.Algorithm/RecoveryRateService/RecoveryRateService.cs @@ -0,0 +1,44 @@ +// __ _ __ __ ___ __ ___ ___ +// | \| |/__\ /' _/ / _//__\| _ \ __| +// | | ' | \/ |`._`.| \_| \/ | v / _| +// |_|\__|\__/ |___/ \__/\__/|_|_\___| +// ----------------------------------- + +using System.Collections.Generic; +using NosCore.Shared.Enumerations; + +namespace NosCore.Algorithm.RecoveryRateService +{ + /// + public class RecoveryRateService : IRecoveryRateService + { + private static readonly Dictionary RestingRates = new() + { + [CharacterClassType.Adventurer] = (30, 10), + [CharacterClassType.Swordsman] = (80, 30), + [CharacterClassType.Archer] = (60, 50), + [CharacterClassType.Mage] = (30, 80), + [CharacterClassType.MartialArtist] = (70, 40), + }; + + /// + public int GetRestingHpRate(CharacterClassType characterClass) => RestingRates[characterClass].Hp; + + /// + public int GetRestingMpRate(CharacterClassType characterClass) => RestingRates[characterClass].Mp; + + /// + /// + /// The factor is one half up to level 20 and steps down in bands after it. Multiply before + /// dividing, or the band is lost to integer truncation. + /// + public int GetStandingRate(int restingRate, byte level) + { + var percent = level <= 20 ? 50 + : level <= 40 ? 40 + : level <= 60 ? 30 + : 20; + return restingRate * percent / 100; + } + } +} diff --git a/test/NosCore.Algorithm.Tests/DocumentationTest.cs b/test/NosCore.Algorithm.Tests/DocumentationTest.cs index 1dc91d9..2766a1d 100644 --- a/test/NosCore.Algorithm.Tests/DocumentationTest.cs +++ b/test/NosCore.Algorithm.Tests/DocumentationTest.cs @@ -215,6 +215,28 @@ public void SecondaryDamageDocumentation() Approvals.Verify(WriterFactory.CreateTextWriter(resultBuilder.ToString(), "md")); } + [TestMethod] + public void RecoveryRateDocumentation() + { + var recoveryRateService = new RecoveryRateService.RecoveryRateService(); + + var resultBuilder = new StringBuilder("# Recovery Rate Table"); + resultBuilder.AppendLine(); + foreach (var @class in Enum.GetValues(typeof(CharacterClassType)).Cast()) + { + var hp = recoveryRateService.GetRestingHpRate(@class); + var mp = recoveryRateService.GetRestingMpRate(@class); + resultBuilder.AppendLine($"## {@class} - Resting HP: {hp} - Resting MP: {mp}"); + for (byte level = 1; level < 100; level++) + { + resultBuilder.AppendLine( + $"- Level {level} - Standing HP: {recoveryRateService.GetStandingRate(hp, level)} - Standing MP: {recoveryRateService.GetStandingRate(mp, level)}"); + } + } + + Approvals.Verify(WriterFactory.CreateTextWriter(resultBuilder.ToString(), "md")); + } + [TestMethod] public void SpeedDocumentation() {