diff --git a/documentation/DocumentationTest.MateHpMpDocumentation.approved.md b/documentation/DocumentationTest.MateHpMpDocumentation.approved.md
new file mode 100644
index 0000000..9cdf2f0
--- /dev/null
+++ b/documentation/DocumentationTest.MateHpMpDocumentation.approved.md
@@ -0,0 +1,369 @@
+# Mate HP/MP Table
+
+## Race 0
+- Factor 0 - Level 1 - HP: 156 - MP: 10
+- Factor 0 - Level 10 - HP: 363 - MP: 69
+- Factor 0 - Level 20 - HP: 688 - MP: 181
+- Factor 0 - Level 30 - HP: 1113 - MP: 344
+- Factor 0 - Level 40 - HP: 1638 - MP: 556
+- Factor 0 - Level 50 - HP: 2263 - MP: 819
+- Factor 0 - Level 60 - HP: 2988 - MP: 1131
+- Factor 0 - Level 70 - HP: 3813 - MP: 1494
+- Factor 0 - Level 80 - HP: 4738 - MP: 1906
+- Factor 0 - Level 90 - HP: 5763 - MP: 2369
+- Factor 0 - Level 99 - HP: 6771 - MP: 2828
+- Factor 4 - Level 1 - HP: 156 - MP: 10
+- Factor 4 - Level 10 - HP: 450 - MP: 97
+- Factor 4 - Level 20 - HP: 975 - MP: 290
+- Factor 4 - Level 30 - HP: 1696 - MP: 580
+- Factor 4 - Level 40 - HP: 2613 - MP: 969
+- Factor 4 - Level 50 - HP: 3726 - MP: 1455
+- Factor 4 - Level 60 - HP: 5035 - MP: 2040
+- Factor 4 - Level 70 - HP: 6540 - MP: 2722
+- Factor 4 - Level 80 - HP: 8241 - MP: 3503
+- Factor 4 - Level 90 - HP: 10138 - MP: 4381
+- Factor 4 - Level 99 - HP: 12075 - MP: 5285
+- Factor 8 - Level 1 - HP: 156 - MP: 10
+- Factor 8 - Level 10 - HP: 580 - MP: 142
+- Factor 8 - Level 20 - HP: 1363 - MP: 444
+- Factor 8 - Level 30 - HP: 2470 - MP: 907
+- Factor 8 - Level 40 - HP: 3901 - MP: 1533
+- Factor 8 - Level 50 - HP: 5656 - MP: 2320
+- Factor 8 - Level 60 - HP: 7735 - MP: 3270
+- Factor 8 - Level 70 - HP: 10138 - MP: 4381
+- Factor 8 - Level 80 - HP: 12865 - MP: 5655
+- Factor 8 - Level 90 - HP: 15916 - MP: 7090
+- Factor 8 - Level 99 - HP: 18900 - MP: 8502
+- Factor 12 - Level 1 - HP: 156 - MP: 10
+- Factor 12 - Level 10 - HP: 688 - MP: 181
+- Factor 12 - Level 20 - HP: 1755 - MP: 605
+- Factor 12 - Level 30 - HP: 3306 - MP: 1270
+- Factor 12 - Level 40 - HP: 5341 - MP: 2178
+- Factor 12 - Level 50 - HP: 7860 - MP: 3327
+- Factor 12 - Level 60 - HP: 10863 - MP: 4719
+- Factor 12 - Level 70 - HP: 14350 - MP: 6352
+- Factor 12 - Level 80 - HP: 18321 - MP: 8228
+- Factor 12 - Level 90 - HP: 22776 - MP: 10345
+- Factor 12 - Level 99 - HP: 27246 - MP: 12480
+
+## Race 1
+- Factor 0 - Level 1 - HP: 636 - MP: 192
+- Factor 0 - Level 10 - HP: 1275 - MP: 494
+- Factor 0 - Level 20 - HP: 2365 - MP: 1019
+- Factor 0 - Level 30 - HP: 3855 - MP: 1744
+- Factor 0 - Level 40 - HP: 5745 - MP: 2669
+- Factor 0 - Level 50 - HP: 8035 - MP: 3794
+- Factor 0 - Level 60 - HP: 10725 - MP: 5119
+- Factor 0 - Level 70 - HP: 13815 - MP: 6644
+- Factor 0 - Level 80 - HP: 17305 - MP: 8369
+- Factor 0 - Level 90 - HP: 21195 - MP: 10294
+- Factor 0 - Level 99 - HP: 25038 - MP: 12197
+- Factor 4 - Level 1 - HP: 636 - MP: 192
+- Factor 4 - Level 10 - HP: 1413 - MP: 560
+- Factor 4 - Level 20 - HP: 2841 - MP: 1250
+- Factor 4 - Level 30 - HP: 4845 - MP: 2228
+- Factor 4 - Level 40 - HP: 7425 - MP: 3494
+- Factor 4 - Level 50 - HP: 10581 - MP: 5048
+- Factor 4 - Level 60 - HP: 14313 - MP: 6890
+- Factor 4 - Level 70 - HP: 18621 - MP: 9020
+- Factor 4 - Level 80 - HP: 23505 - MP: 11438
+- Factor 4 - Level 90 - HP: 28965 - MP: 14144
+- Factor 4 - Level 99 - HP: 34476 - MP: 16877
+- Factor 8 - Level 1 - HP: 636 - MP: 192
+- Factor 8 - Level 10 - HP: 1611 - MP: 655
+- Factor 8 - Level 20 - HP: 3445 - MP: 1544
+- Factor 8 - Level 30 - HP: 6063 - MP: 2825
+- Factor 8 - Level 40 - HP: 9465 - MP: 4498
+- Factor 8 - Level 50 - HP: 13651 - MP: 6563
+- Factor 8 - Level 60 - HP: 18621 - MP: 9020
+- Factor 8 - Level 70 - HP: 24375 - MP: 11869
+- Factor 8 - Level 80 - HP: 30913 - MP: 15110
+- Factor 8 - Level 90 - HP: 38235 - MP: 18743
+- Factor 8 - Level 99 - HP: 45435 - MP: 22318
+- Factor 12 - Level 1 - HP: 636 - MP: 192
+- Factor 12 - Level 10 - HP: 1770 - MP: 731
+- Factor 12 - Level 20 - HP: 4026 - MP: 1827
+- Factor 12 - Level 30 - HP: 7306 - MP: 3435
+- Factor 12 - Level 40 - HP: 11610 - MP: 5555
+- Factor 12 - Level 50 - HP: 16938 - MP: 8187
+- Factor 12 - Level 60 - HP: 23290 - MP: 11331
+- Factor 12 - Level 70 - HP: 30666 - MP: 14987
+- Factor 12 - Level 80 - HP: 39066 - MP: 19155
+- Factor 12 - Level 90 - HP: 48490 - MP: 23835
+- Factor 12 - Level 99 - HP: 57915 - MP: 28519
+
+## Race 2
+- Factor 0 - Level 1 - HP: 121 - MP: 60
+- Factor 0 - Level 10 - HP: 420 - MP: 130
+- Factor 0 - Level 20 - HP: 975 - MP: 240
+- Factor 0 - Level 30 - HP: 1755 - MP: 382
+- Factor 0 - Level 40 - HP: 2760 - MP: 556
+- Factor 0 - Level 50 - HP: 3990 - MP: 762
+- Factor 0 - Level 60 - HP: 5445 - MP: 1000
+- Factor 0 - Level 70 - HP: 7125 - MP: 1270
+- Factor 0 - Level 80 - HP: 9030 - MP: 1572
+- Factor 0 - Level 90 - HP: 11160 - MP: 1906
+- Factor 0 - Level 99 - HP: 13351 - MP: 2225
+- Factor 4 - Level 1 - HP: 121 - MP: 60
+- Factor 4 - Level 10 - HP: 546 - MP: 168
+- Factor 4 - Level 20 - HP: 1363 - MP: 363
+- Factor 4 - Level 30 - HP: 2541 - MP: 630
+- Factor 4 - Level 40 - HP: 4080 - MP: 969
+- Factor 4 - Level 50 - HP: 5980 - MP: 1380
+- Factor 4 - Level 60 - HP: 8241 - MP: 1863
+- Factor 4 - Level 70 - HP: 10863 - MP: 2418
+- Factor 4 - Level 80 - HP: 13846 - MP: 3045
+- Factor 4 - Level 90 - HP: 17190 - MP: 3744
+- Factor 4 - Level 99 - HP: 20488 - MP: 4448
+- Factor 8 - Level 1 - HP: 121 - MP: 60
+- Factor 8 - Level 10 - HP: 651 - MP: 225
+- Factor 8 - Level 20 - HP: 1755 - MP: 533
+- Factor 8 - Level 30 - HP: 3388 - MP: 969
+- Factor 8 - Level 40 - HP: 5550 - MP: 1533
+- Factor 8 - Level 50 - HP: 8241 - MP: 2225
+- Factor 8 - Level 60 - HP: 11461 - MP: 3045
+- Factor 8 - Level 70 - HP: 15210 - MP: 3993
+- Factor 8 - Level 80 - HP: 19488 - MP: 5069
+- Factor 8 - Level 90 - HP: 24295 - MP: 6273
+- Factor 8 - Level 99 - HP: 29146 - MP: 7431
+- Factor 12 - Level 1 - HP: 121 - MP: 60
+- Factor 12 - Level 10 - HP: 805 - MP: 290
+- Factor 12 - Level 20 - HP: 2263 - MP: 735
+- Factor 12 - Level 30 - HP: 4450 - MP: 1380
+- Factor 12 - Level 40 - HP: 7366 - MP: 2225
+- Factor 12 - Level 50 - HP: 11011 - MP: 3270
+- Factor 12 - Level 60 - HP: 15385 - MP: 4515
+- Factor 12 - Level 70 - HP: 20488 - MP: 5960
+- Factor 12 - Level 80 - HP: 26320 - MP: 7605
+- Factor 12 - Level 90 - HP: 32881 - MP: 9450
+- Factor 12 - Level 99 - HP: 39325 - MP: 11281
+
+## Race 3
+- Factor 0 - Level 1 - HP: 221 - MP: 60
+- Factor 0 - Level 10 - HP: 410 - MP: 155
+- Factor 0 - Level 20 - HP: 715 - MP: 307
+- Factor 0 - Level 30 - HP: 1120 - MP: 510
+- Factor 0 - Level 40 - HP: 1625 - MP: 762
+- Factor 0 - Level 50 - HP: 2230 - MP: 1065
+- Factor 0 - Level 60 - HP: 2935 - MP: 1417
+- Factor 0 - Level 70 - HP: 3740 - MP: 1820
+- Factor 0 - Level 80 - HP: 4645 - MP: 2272
+- Factor 0 - Level 90 - HP: 5650 - MP: 2775
+- Factor 0 - Level 99 - HP: 6640 - MP: 3270
+- Factor 4 - Level 1 - HP: 221 - MP: 60
+- Factor 4 - Level 10 - HP: 491 - MP: 195
+- Factor 4 - Level 20 - HP: 988 - MP: 444
+- Factor 4 - Level 30 - HP: 1681 - MP: 790
+- Factor 4 - Level 40 - HP: 2570 - MP: 1235
+- Factor 4 - Level 50 - HP: 3655 - MP: 1777
+- Factor 4 - Level 60 - HP: 4936 - MP: 2418
+- Factor 4 - Level 70 - HP: 6413 - MP: 3156
+- Factor 4 - Level 80 - HP: 8086 - MP: 3993
+- Factor 4 - Level 90 - HP: 9955 - MP: 4927
+- Factor 4 - Level 99 - HP: 11866 - MP: 5883
+- Factor 8 - Level 1 - HP: 221 - MP: 60
+- Factor 8 - Level 10 - HP: 613 - MP: 256
+- Factor 8 - Level 20 - HP: 1360 - MP: 630
+- Factor 8 - Level 30 - HP: 2431 - MP: 1165
+- Factor 8 - Level 40 - HP: 3826 - MP: 1863
+- Factor 8 - Level 50 - HP: 5545 - MP: 2722
+- Factor 8 - Level 60 - HP: 7588 - MP: 3744
+- Factor 8 - Level 70 - HP: 9955 - MP: 4927
+- Factor 8 - Level 80 - HP: 12646 - MP: 6273
+- Factor 8 - Level 90 - HP: 15661 - MP: 7780
+- Factor 8 - Level 99 - HP: 18613 - MP: 9256
+- Factor 12 - Level 1 - HP: 221 - MP: 60
+- Factor 12 - Level 10 - HP: 715 - MP: 307
+- Factor 12 - Level 20 - HP: 1738 - MP: 819
+- Factor 12 - Level 30 - HP: 3245 - MP: 1572
+- Factor 12 - Level 40 - HP: 5236 - MP: 2568
+- Factor 12 - Level 50 - HP: 7711 - MP: 3805
+- Factor 12 - Level 60 - HP: 10670 - MP: 5285
+- Factor 12 - Level 70 - HP: 14113 - MP: 7006
+- Factor 12 - Level 80 - HP: 18040 - MP: 8970
+- Factor 12 - Level 90 - HP: 22451 - MP: 11175
+- Factor 12 - Level 99 - HP: 26881 - MP: 13390
+
+## Race 4
+- Factor 0 - Level 1 - HP: 716 - MP: 408
+- Factor 0 - Level 10 - HP: 981 - MP: 682
+- Factor 0 - Level 20 - HP: 1431 - MP: 1177
+- Factor 0 - Level 30 - HP: 2025 - MP: 1872
+- Factor 0 - Level 40 - HP: 2763 - MP: 2767
+- Factor 0 - Level 50 - HP: 3645 - MP: 3862
+- Factor 0 - Level 60 - HP: 4671 - MP: 5157
+- Factor 0 - Level 70 - HP: 5841 - MP: 6652
+- Factor 0 - Level 80 - HP: 7155 - MP: 8347
+- Factor 0 - Level 90 - HP: 8613 - MP: 10242
+- Factor 0 - Level 99 - HP: 10076 - MP: 12119
+- Factor 4 - Level 1 - HP: 716 - MP: 408
+- Factor 4 - Level 10 - HP: 1115 - MP: 744
+- Factor 4 - Level 20 - HP: 1811 - MP: 1398
+- Factor 4 - Level 30 - HP: 2763 - MP: 2340
+- Factor 4 - Level 40 - HP: 3971 - MP: 3570
+- Factor 4 - Level 50 - HP: 5435 - MP: 5088
+- Factor 4 - Level 60 - HP: 7155 - MP: 6894
+- Factor 4 - Level 70 - HP: 9131 - MP: 8988
+- Factor 4 - Level 80 - HP: 11363 - MP: 11370
+- Factor 4 - Level 90 - HP: 13851 - MP: 14040
+- Factor 4 - Level 99 - HP: 16238 - MP: 16740
+- Factor 8 - Level 1 - HP: 716 - MP: 408
+- Factor 8 - Level 10 - HP: 1265 - MP: 833
+- Factor 8 - Level 20 - HP: 2255 - MP: 1680
+- Factor 8 - Level 30 - HP: 3645 - MP: 2919
+- Factor 8 - Level 40 - HP: 5435 - MP: 4550
+- Factor 8 - Level 50 - HP: 7625 - MP: 6573
+- Factor 8 - Level 60 - HP: 10215 - MP: 8988
+- Factor 8 - Level 70 - HP: 13205 - MP: 11795
+- Factor 8 - Level 80 - HP: 16595 - MP: 14994
+- Factor 8 - Level 90 - HP: 20385 - MP: 18585
+- Factor 8 - Level 99 - HP: 24138 - MP: 22122
+- Factor 12 - Level 1 - HP: 716 - MP: 408
+- Factor 12 - Level 10 - HP: 1388 - MP: 905
+- Factor 12 - Level 20 - HP: 2696 - MP: 1953
+- Factor 12 - Level 30 - HP: 4580 - MP: 3513
+- Factor 12 - Level 40 - HP: 7040 - MP: 5585
+- Factor 12 - Level 50 - HP: 10076 - MP: 8169
+- Factor 12 - Level 60 - HP: 13688 - MP: 11265
+- Factor 12 - Level 70 - HP: 17876 - MP: 14873
+- Factor 12 - Level 80 - HP: 22640 - MP: 18993
+- Factor 12 - Level 90 - HP: 27980 - MP: 23625
+- Factor 12 - Level 99 - HP: 33381 - MP: 28265
+
+## Race 5
+- Factor 0 - Level 1 - HP: 276 - MP: 38
+- Factor 0 - Level 10 - HP: 395 - MP: 97
+- Factor 0 - Level 20 - HP: 591 - MP: 195
+- Factor 0 - Level 30 - HP: 851 - MP: 325
+- Factor 0 - Level 40 - HP: 1175 - MP: 487
+- Factor 0 - Level 50 - HP: 1563 - MP: 681
+- Factor 0 - Level 60 - HP: 2015 - MP: 907
+- Factor 0 - Level 70 - HP: 2531 - MP: 1165
+- Factor 0 - Level 80 - HP: 3111 - MP: 1455
+- Factor 0 - Level 90 - HP: 3755 - MP: 1777
+- Factor 0 - Level 99 - HP: 4371 - MP: 2085
+- Factor 4 - Level 1 - HP: 276 - MP: 38
+- Factor 4 - Level 10 - HP: 461 - MP: 130
+- Factor 4 - Level 20 - HP: 815 - MP: 307
+- Factor 4 - Level 30 - HP: 1313 - MP: 556
+- Factor 4 - Level 40 - HP: 1955 - MP: 877
+- Factor 4 - Level 50 - HP: 2741 - MP: 1270
+- Factor 4 - Level 60 - HP: 3671 - MP: 1735
+- Factor 4 - Level 70 - HP: 4745 - MP: 2272
+- Factor 4 - Level 80 - HP: 5963 - MP: 2881
+- Factor 4 - Level 90 - HP: 7325 - MP: 3562
+- Factor 4 - Level 99 - HP: 8700 - MP: 4250
+- Factor 8 - Level 1 - HP: 276 - MP: 38
+- Factor 8 - Level 10 - HP: 563 - MP: 181
+- Factor 8 - Level 20 - HP: 1131 - MP: 465
+- Factor 8 - Level 30 - HP: 1955 - MP: 877
+- Factor 8 - Level 40 - HP: 3035 - MP: 1417
+- Factor 8 - Level 50 - HP: 4371 - MP: 2085
+- Factor 8 - Level 60 - HP: 5963 - MP: 2881
+- Factor 8 - Level 70 - HP: 7811 - MP: 3805
+- Factor 8 - Level 80 - HP: 9915 - MP: 4857
+- Factor 8 - Level 90 - HP: 12275 - MP: 6037
+- Factor 8 - Level 99 - HP: 14550 - MP: 7175
+- Factor 12 - Level 1 - HP: 276 - MP: 38
+- Factor 12 - Level 10 - HP: 681 - MP: 240
+- Factor 12 - Level 20 - HP: 1511 - MP: 655
+- Factor 12 - Level 30 - HP: 2741 - MP: 1270
+- Factor 12 - Level 40 - HP: 4371 - MP: 2085
+- Factor 12 - Level 50 - HP: 6401 - MP: 3100
+- Factor 12 - Level 60 - HP: 8831 - MP: 4315
+- Factor 12 - Level 70 - HP: 11661 - MP: 5730
+- Factor 12 - Level 80 - HP: 14891 - MP: 7345
+- Factor 12 - Level 90 - HP: 18521 - MP: 9160
+- Factor 12 - Level 99 - HP: 22130 - MP: 10965
+
+## Race 6
+- Factor 0 - Level 1 - HP: 30 - MP: 725
+- Factor 0 - Level 10 - HP: 156 - MP: 1005
+- Factor 0 - Level 20 - HP: 391 - MP: 1432
+- Factor 0 - Level 30 - HP: 726 - MP: 1972
+- Factor 0 - Level 40 - HP: 1161 - MP: 2625
+- Factor 0 - Level 50 - HP: 1696 - MP: 3390
+- Factor 0 - Level 60 - HP: 2331 - MP: 4267
+- Factor 0 - Level 70 - HP: 3066 - MP: 5257
+- Factor 0 - Level 80 - HP: 3901 - MP: 6360
+- Factor 0 - Level 90 - HP: 4836 - MP: 7575
+- Factor 0 - Level 99 - HP: 5763 - MP: 8810
+- Factor 4 - Level 1 - HP: 30 - MP: 725
+- Factor 4 - Level 10 - HP: 216 - MP: 1108
+- Factor 4 - Level 20 - HP: 615 - MP: 1706
+- Factor 4 - Level 30 - HP: 1210 - MP: 2485
+- Factor 4 - Level 40 - HP: 2001 - MP: 3445
+- Factor 4 - Level 50 - HP: 2988 - MP: 4585
+- Factor 4 - Level 60 - HP: 4171 - MP: 5905
+- Factor 4 - Level 70 - HP: 5550 - MP: 7406
+- Factor 4 - Level 80 - HP: 7125 - MP: 9088
+- Factor 4 - Level 90 - HP: 8896 - MP: 10950
+- Factor 4 - Level 99 - HP: 10716 - MP: 12769
+- Factor 8 - Level 1 - HP: 30 - MP: 725
+- Factor 8 - Level 10 - HP: 310 - MP: 1190
+- Factor 8 - Level 20 - HP: 931 - MP: 1972
+- Factor 8 - Level 30 - HP: 1876 - MP: 3019
+- Factor 8 - Level 40 - HP: 3145 - MP: 4330
+- Factor 8 - Level 50 - HP: 4738 - MP: 5905
+- Factor 8 - Level 60 - HP: 6655 - MP: 7745
+- Factor 8 - Level 70 - HP: 8896 - MP: 9850
+- Factor 8 - Level 80 - HP: 11461 - MP: 12219
+- Factor 8 - Level 90 - HP: 14350 - MP: 14852
+- Factor 8 - Level 99 - HP: 17190 - MP: 17488
+- Factor 12 - Level 1 - HP: 30 - MP: 725
+- Factor 12 - Level 10 - HP: 391 - MP: 1307
+- Factor 12 - Level 20 - HP: 1260 - MP: 2306
+- Factor 12 - Level 30 - HP: 2613 - MP: 3670
+- Factor 12 - Level 40 - HP: 4450 - MP: 5398
+- Factor 12 - Level 50 - HP: 6771 - MP: 7490
+- Factor 12 - Level 60 - HP: 9576 - MP: 9947
+- Factor 12 - Level 70 - HP: 12865 - MP: 12769
+- Factor 12 - Level 80 - HP: 16638 - MP: 15955
+- Factor 12 - Level 90 - HP: 20895 - MP: 19505
+- Factor 12 - Level 99 - HP: 25185 - MP: 22967
+
+## Race 8
+- Factor 0 - Level 1 - HP: 7 - MP: 4
+- Factor 0 - Level 10 - HP: 7 - MP: 4
+- Factor 0 - Level 20 - HP: 7 - MP: 4
+- Factor 0 - Level 30 - HP: 7 - MP: 4
+- Factor 0 - Level 40 - HP: 7 - MP: 4
+- Factor 0 - Level 50 - HP: 7 - MP: 4
+- Factor 0 - Level 60 - HP: 7 - MP: 4
+- Factor 0 - Level 70 - HP: 7 - MP: 4
+- Factor 0 - Level 80 - HP: 7 - MP: 4
+- Factor 0 - Level 90 - HP: 7 - MP: 4
+- Factor 0 - Level 99 - HP: 7 - MP: 4
+- Factor 4 - Level 1 - HP: 7 - MP: 4
+- Factor 4 - Level 10 - HP: 7 - MP: 4
+- Factor 4 - Level 20 - HP: 7 - MP: 4
+- Factor 4 - Level 30 - HP: 7 - MP: 4
+- Factor 4 - Level 40 - HP: 7 - MP: 4
+- Factor 4 - Level 50 - HP: 7 - MP: 4
+- Factor 4 - Level 60 - HP: 7 - MP: 4
+- Factor 4 - Level 70 - HP: 7 - MP: 4
+- Factor 4 - Level 80 - HP: 7 - MP: 4
+- Factor 4 - Level 90 - HP: 7 - MP: 4
+- Factor 4 - Level 99 - HP: 7 - MP: 4
+- Factor 8 - Level 1 - HP: 7 - MP: 4
+- Factor 8 - Level 10 - HP: 7 - MP: 4
+- Factor 8 - Level 20 - HP: 7 - MP: 4
+- Factor 8 - Level 30 - HP: 7 - MP: 4
+- Factor 8 - Level 40 - HP: 7 - MP: 4
+- Factor 8 - Level 50 - HP: 7 - MP: 4
+- Factor 8 - Level 60 - HP: 7 - MP: 4
+- Factor 8 - Level 70 - HP: 7 - MP: 4
+- Factor 8 - Level 80 - HP: 7 - MP: 4
+- Factor 8 - Level 90 - HP: 7 - MP: 4
+- Factor 8 - Level 99 - HP: 7 - MP: 4
+- Factor 12 - Level 1 - HP: 7 - MP: 4
+- Factor 12 - Level 10 - HP: 7 - MP: 4
+- Factor 12 - Level 20 - HP: 7 - MP: 4
+- Factor 12 - Level 30 - HP: 7 - MP: 4
+- Factor 12 - Level 40 - HP: 7 - MP: 4
+- Factor 12 - Level 50 - HP: 7 - MP: 4
+- Factor 12 - Level 60 - HP: 7 - MP: 4
+- Factor 12 - Level 70 - HP: 7 - MP: 4
+- Factor 12 - Level 80 - HP: 7 - MP: 4
+- Factor 12 - Level 90 - HP: 7 - MP: 4
+- Factor 12 - Level 99 - HP: 7 - MP: 4
diff --git a/src/NosCore.Algorithm/MateHpService/IMateHpService.cs b/src/NosCore.Algorithm/MateHpService/IMateHpService.cs
new file mode 100644
index 0000000..51ac8a5
--- /dev/null
+++ b/src/NosCore.Algorithm/MateHpService/IMateHpService.cs
@@ -0,0 +1,23 @@
+// __ _ __ __ ___ __ ___ ___
+// | \| |/__\ /' _/ / _//__\| _ \ __|
+// | | ' | \/ |`._`.| \_| \/ | v / _|
+// |_|\__|\__/ |___/ \__/\__/|_|_\___|
+// -----------------------------------
+
+namespace NosCore.Algorithm.MateHpService
+{
+ ///
+ /// Service for calculating the maximum HP of a pet or partner
+ ///
+ public interface IMateHpService
+ {
+ ///
+ /// Gets the maximum HP of a pet or partner, before the flat HP its monster entry adds
+ ///
+ /// The race of the mate's monster entry
+ /// The mate level
+ /// The HP growth factor of the mate's monster entry
+ /// The HP value
+ long GetHp(byte race, byte level, short hpFactor);
+ }
+}
diff --git a/src/NosCore.Algorithm/MateHpService/MateHpService.cs b/src/NosCore.Algorithm/MateHpService/MateHpService.cs
new file mode 100644
index 0000000..39b8c0d
--- /dev/null
+++ b/src/NosCore.Algorithm/MateHpService/MateHpService.cs
@@ -0,0 +1,46 @@
+// __ _ __ __ ___ __ ___ ___
+// | \| |/__\ /' _/ / _//__\| _ \ __|
+// | | ' | \/ |`._`.| \_| \/ | v / _|
+// |_|\__|\__/ |___/ \__/\__/|_|_\___|
+// -----------------------------------
+
+using System;
+
+namespace NosCore.Algorithm.MateHpService
+{
+ ///
+ /// Calculates the maximum HP of a pet or partner from its race, level and HP growth factor
+ ///
+ public class MateHpService : IMateHpService
+ {
+ private const byte FixedRace = 8;
+ private const long FixedHp = 7;
+
+ ///
+ /// Per race: the growth added to the factor, the linear term offset and the constant term
+ ///
+ private static readonly (int Growth, int Linear, int Constant)[] RaceConstants =
+ {
+ (0, 2, 138),
+ (10, 10, 610),
+ (5, 0, 105),
+ (0, 0, 205),
+ (2, 5, 695),
+ (-2, -3, 263),
+ (0, -7, 21),
+ };
+
+ ///
+ public long GetHp(byte race, byte level, short hpFactor)
+ {
+ if (race == FixedRace)
+ {
+ return FixedHp;
+ }
+
+ var (growth, linear, constant) = race < RaceConstants.Length ? RaceConstants[race] : (0, 0, 0);
+ var x = MateLevel.Effective(level, hpFactor + growth, 0);
+ return (long)Math.Floor((0.5 * x * x) + ((15.5 + linear) * x) + constant);
+ }
+ }
+}
diff --git a/src/NosCore.Algorithm/MateHpService/MateLevel.cs b/src/NosCore.Algorithm/MateHpService/MateLevel.cs
new file mode 100644
index 0000000..667534f
--- /dev/null
+++ b/src/NosCore.Algorithm/MateHpService/MateLevel.cs
@@ -0,0 +1,24 @@
+// __ _ __ __ ___ __ ___ ___
+// | \| |/__\ /' _/ / _//__\| _ \ __|
+// | | ' | \/ |`._`.| \_| \/ | v / _|
+// |_|\__|\__/ |___/ \__/\__/|_|_\___|
+// -----------------------------------
+
+using System;
+
+namespace NosCore.Algorithm.MateHpService
+{
+ internal static class MateLevel
+ {
+ // A mate's growth factor makes it gain one extra level every 10 / factor levels.
+ internal static int Effective(byte level, int factor, int bonus)
+ {
+ if (factor == 0)
+ {
+ return level;
+ }
+
+ return level + (int)Math.Floor(((level - 1) / (10.0 / factor)) + bonus);
+ }
+ }
+}
diff --git a/src/NosCore.Algorithm/MateMpService/IMateMpService.cs b/src/NosCore.Algorithm/MateMpService/IMateMpService.cs
new file mode 100644
index 0000000..04a4d52
--- /dev/null
+++ b/src/NosCore.Algorithm/MateMpService/IMateMpService.cs
@@ -0,0 +1,23 @@
+// __ _ __ __ ___ __ ___ ___
+// | \| |/__\ /' _/ / _//__\| _ \ __|
+// | | ' | \/ |`._`.| \_| \/ | v / _|
+// |_|\__|\__/ |___/ \__/\__/|_|_\___|
+// -----------------------------------
+
+namespace NosCore.Algorithm.MateMpService
+{
+ ///
+ /// Service for calculating the maximum MP of a pet or partner
+ ///
+ public interface IMateMpService
+ {
+ ///
+ /// Gets the maximum MP of a pet or partner, before the flat MP its monster entry adds
+ ///
+ /// The race of the mate's monster entry
+ /// The mate level
+ /// The MP growth factor of the mate's monster entry
+ /// The MP value
+ long GetMp(byte race, byte level, short mpFactor);
+ }
+}
diff --git a/src/NosCore.Algorithm/MateMpService/MateMpService.cs b/src/NosCore.Algorithm/MateMpService/MateMpService.cs
new file mode 100644
index 0000000..aaa9396
--- /dev/null
+++ b/src/NosCore.Algorithm/MateMpService/MateMpService.cs
@@ -0,0 +1,52 @@
+// __ _ __ __ ___ __ ___ ___
+// | \| |/__\ /' _/ / _//__\| _ \ __|
+// | | ' | \/ |`._`.| \_| \/ | v / _|
+// |_|\__|\__/ |___/ \__/\__/|_|_\___|
+// -----------------------------------
+
+using System;
+using NosCore.Algorithm.MateHpService;
+
+namespace NosCore.Algorithm.MateMpService
+{
+ ///
+ /// Calculates the maximum MP of a pet or partner from its race, level and MP growth factor
+ ///
+ public class MateMpService : IMateMpService
+ {
+ private const byte FixedRace = 8;
+ private const long FixedMp = 4;
+
+ ///
+ /// Per race: the constant term, the growth added to the factor, the linear term offset
+ /// and the extra level the factor gives
+ ///
+ private static readonly (double Constant, int Growth, int Linear, int Bonus)[] RaceConstants =
+ {
+ (4.75, 0, 0, 0),
+ (178.75, 10, 8, 0),
+ (50.75, -2, 4, 0),
+ (50.75, 0, 4, 0),
+ (385.75, 10, 6, 1),
+ (23.75, -2, 2, 1),
+ (705.75, 5, 14, 0),
+ };
+
+ ///
+ public long GetMp(byte race, byte level, short mpFactor)
+ {
+ if (race == FixedRace)
+ {
+ return FixedMp;
+ }
+
+ var (constant, growth, linear, bonus) = race < RaceConstants.Length ? RaceConstants[race] : (0, 0, 0, 0);
+ var x = MateLevel.Effective(level, mpFactor + growth, bonus);
+ var steps = Math.Floor((x - 6) / 4.0);
+ var mp = Math.Floor(((5.25 + linear) * x) + constant) + ((steps + 1) * 2 * (PositiveModulo(x - 2, 4) + 1 + (steps * 2)));
+ return (long)Math.Floor(mp);
+ }
+
+ private static int PositiveModulo(int value, int modulo) => ((value % modulo) + modulo) % modulo;
+ }
+}
diff --git a/test/NosCore.Algorithm.Tests/DocumentationTest.cs b/test/NosCore.Algorithm.Tests/DocumentationTest.cs
index d945be1..777e3d4 100644
--- a/test/NosCore.Algorithm.Tests/DocumentationTest.cs
+++ b/test/NosCore.Algorithm.Tests/DocumentationTest.cs
@@ -755,6 +755,40 @@ public void SpecialistPointDocumentation()
Assert.IsTrue(specialistPointService.GetHpMpLevel(points) >= specialistPointService.GetHpMpLevel((short)(points - 1)));
}
+ Approvals.Verify(WriterFactory.CreateTextWriter(resultBuilder.ToString(), "md"));
+ }
+ [TestMethod]
+ public void MateHpMpDocumentation()
+ {
+ var hpService = new MateHpService.MateHpService();
+ var mpService = new MateMpService.MateMpService();
+
+ // Recorded pets: a race 3 partner with factors 8 and 6 shows 2165/877 at level 28, a race
+ // 2 pet with factors 12 and 0 shows 10638/708 at level 48 once its flat 500 HP is added.
+ Assert.AreEqual(2165, hpService.GetHp(3, 28, 8));
+ Assert.AreEqual(877, mpService.GetMp(3, 28, 6));
+ Assert.AreEqual(10638, hpService.GetHp(2, 48, 12) + 500);
+ Assert.AreEqual(708, mpService.GetMp(2, 48, 0));
+
+ var resultBuilder = new StringBuilder("# Mate HP/MP Table");
+ resultBuilder.AppendLine();
+ byte[] races = { 0, 1, 2, 3, 4, 5, 6, 8 };
+ short[] factors = { 0, 4, 8, 12 };
+ byte[] levels = { 1, 10, 20, 30, 40, 50, 60, 70, 80, 90, 99 };
+ foreach (var race in races)
+ {
+ resultBuilder.AppendLine();
+ resultBuilder.AppendLine($"## Race {race}");
+ foreach (var factor in factors)
+ {
+ foreach (var level in levels)
+ {
+ resultBuilder.AppendLine(
+ $"- Factor {factor,2} - Level {level,2} - HP: {hpService.GetHp(race, level, factor)} - MP: {mpService.GetMp(race, level, factor)}");
+ }
+ }
+ }
+
Approvals.Verify(WriterFactory.CreateTextWriter(resultBuilder.ToString(), "md"));
}
}