|
5 | 5 | // ----------------------------------- |
6 | 6 |
|
7 | 7 | using NosCore.Shared.Enumerations; |
| 8 | +using System; |
8 | 9 |
|
9 | 10 | namespace NosCore.Algorithm.MpService |
10 | 11 | { |
11 | 12 | public class MpService : IMpService |
12 | 13 | { |
13 | 14 | private readonly long[,] _mpData = new long[Constants.ClassCount, Constants.MaxLevel]; |
| 15 | + public readonly int[] ClassConstants = new int[] { 0, 0, 1, 8, 2 }; |
14 | 16 |
|
15 | 17 | public MpService() |
16 | 18 | { |
17 | | - var adventurerMpAdd = 9; |
18 | | - var magicianMpAdd = new[] { 9, 18, 21, 22, 25, 13, 27, 30, 31, 34 }; |
19 | | - var martialArtistMpAdd = new[] { 9, 9, 9, 10, 22, 11, 12, 13, 13, 27 }; |
20 | | - var archerMpAdd = new[] { 9, 9, 9, 10, 11, 11, 11, 12, 13, 26 }; |
21 | | - |
22 | | - _mpData[(byte)CharacterClassType.Adventurer, 0] = 60; |
23 | | - _mpData[(byte)CharacterClassType.Swordsman, 0] = 60; |
24 | | - _mpData[(byte)CharacterClassType.Mage, 0] = 60; |
25 | | - _mpData[(byte)CharacterClassType.MartialArtist, 0] = 60; |
26 | | - _mpData[(byte)CharacterClassType.Archer, 0] = 60; |
27 | | - var countMagician = 9; |
28 | | - var countArcher = 11; |
29 | | - var substractMagician = true; |
30 | | - var substractArcher = false; |
31 | | - var reverseArcher = 0; |
32 | | - for (var i = 1; i < Constants.MaxLevel; i++) |
| 19 | + foreach (CharacterClassType classType in Enum.GetValues(typeof(CharacterClassType))) |
33 | 20 | { |
34 | | - adventurerMpAdd += i % 4 == 0 ? 2 : 0; |
35 | | - _mpData[(byte)CharacterClassType.Adventurer, i] = |
36 | | - _mpData[(byte)CharacterClassType.Adventurer, i - 1] + (i % 4 == 0 ? adventurerMpAdd - 1 : adventurerMpAdd); |
37 | | - _mpData[(byte)CharacterClassType.Swordsman, i] = _mpData[(byte)CharacterClassType.Adventurer, i]; |
38 | | - if (i - 1 > 9) |
| 21 | + for (var i = 0; i < Constants.MaxLevel; i++) |
39 | 22 | { |
40 | | - var switcher = !substractMagician ? 1 : -1; |
41 | | - if ((i - 1) % 5 == 0) |
42 | | - { |
43 | | - countMagician += !substractMagician ? 1 : -1; |
44 | | - substractMagician = countMagician == 10 || countMagician == 8 ? !substractMagician : substractMagician; |
45 | | - magicianMpAdd[(i - 1) % 10] = magicianMpAdd[(i - 1) % 10] + countMagician; |
46 | | - } |
47 | | - else |
48 | | - { |
49 | | - magicianMpAdd[(i - 1) % 10] += 18 + switcher / ((i - 1) % 5 % 2 == 1 ? 1 : -1); |
50 | | - } |
51 | | - |
52 | | - if (i % 10 == 0) |
53 | | - { |
54 | | - countArcher += !substractArcher ? 1 : -1; |
55 | | - substractArcher = countArcher == 12 || countArcher == 10 ? !substractArcher : substractArcher; |
56 | | - archerMpAdd[(i - 1) % 10] = archerMpAdd[(i - 1) % 10] + countArcher; |
57 | | - reverseArcher++; |
58 | | - } |
59 | | - else |
60 | | - { |
61 | | - var switcherArcher = reverseArcher % 4 == 2 || reverseArcher % 4 == 3 ? -1 : 1; |
62 | | - archerMpAdd[(i - 1) % 10] += (switcherArcher == -1 ? 6 : 5) + |
63 | | - (i % 20 < 10 |
64 | | - ? i % 4 == 2 || i % 4 == 1 ? 0 : switcherArcher |
65 | | - : i % 4 == 0 || i % 4 == 1 ? switcherArcher : 0); |
66 | | - |
67 | | - } |
68 | | - |
69 | | - martialArtistMpAdd[(i - 1) % 10] += (i - 1) % 5 == 4 ? 12 : 6; |
| 23 | + var mpx = i + 1 + Math.Floor(i * (double)ClassConstants[(int)classType] / 10); |
| 24 | + var mp = Math.Floor(9.25 * mpx + 50.75) + ((int)((mpx - 2) / 4) * 2) * (Modulus(mpx - 2, 4) + 1 + (int)((mpx - 6) / 4) * 2); |
| 25 | + _mpData[(int)classType, i] = (long)mp; |
70 | 26 | } |
71 | | - _mpData[(byte)CharacterClassType.Mage, i] = |
72 | | - _mpData[(byte)CharacterClassType.Mage, i - 1] + magicianMpAdd[(i - 1) % 10]; |
73 | | - |
74 | | - _mpData[(byte)CharacterClassType.MartialArtist, i] = |
75 | | - _mpData[(byte)CharacterClassType.MartialArtist, i - 1] + martialArtistMpAdd[(i - 1) % 10]; |
76 | | - |
77 | | - _mpData[(byte)CharacterClassType.Archer, i] = |
78 | | - _mpData[(byte)CharacterClassType.Archer, i - 1] + archerMpAdd[(i - 1) % 10]; |
79 | 27 | } |
| 28 | + } |
80 | 29 |
|
| 30 | + private static double Modulus(double dividend, double divisor) |
| 31 | + { |
| 32 | + double modulus = (Math.Abs(dividend) - (Math.Abs(divisor) * Math.Floor(Math.Abs(dividend) / Math.Abs(divisor)))) * Math.Sign(dividend); |
| 33 | + return modulus; |
81 | 34 | } |
| 35 | + |
82 | 36 | public long GetMp(CharacterClassType @class, byte level) |
83 | 37 | { |
84 | 38 | return _mpData![(byte)@class, level - 1]; |
|
0 commit comments