فهرست منبع

Converted statpoint.txt to YAML (#6010)

* Converts the Statpoint Database into YAML.
* Includes CSV2YAML converter.
* Added start_status_points to inter_athena.conf

Co-authored-by: Lemongrass3110 <lemongrass@kstp.at>
Co-authored-by: Aleos <aleos89@users.noreply.github.com>
Atemo 3 سال پیش
والد
کامیت
f230b13ded

+ 3 - 0
conf/inter_athena.conf

@@ -12,6 +12,9 @@ inter_log_filename: log/inter.log
 // Level range for sharing within a party
 party_share_level: 15
 
+// Amount of status points a new character will start with
+start_status_points: 48
+
 // You can specify the codepage to use in your MySQL tables here.
 // (Note that this feature requires MySQL 4.1+)
 //default_codepage:

+ 0 - 2
db/import-tmpl/statpoint.txt

@@ -1,2 +0,0 @@
-//statpoint per lvl
-

+ 31 - 0
db/import-tmpl/statpoint.yml

@@ -0,0 +1,31 @@
+# This file is a part of rAthena.
+#   Copyright(C) 2021 rAthena Development Team
+#   https://rathena.org - https://github.com/rathena
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+#
+###########################################################################
+# Statpoint Database
+###########################################################################
+#
+# Statpoint Settings
+#
+###########################################################################
+# - Level             BaseLevel required.
+#   Points            Total status points given from BaseLevel 1 to 'Level'.
+###########################################################################
+
+Header:
+  Type: STATPOINT_DB
+  Version: 1

+ 0 - 255
db/pre-re/statpoint.txt

@@ -1,255 +0,0 @@
-48
-51
-54
-57
-60
-64
-68
-72
-76
-80
-85
-90
-95
-100
-105
-111
-117
-123
-129
-135
-142
-149
-156
-163
-170
-178
-186
-194
-202
-210
-219
-228
-237
-246
-255
-265
-275
-285
-295
-305
-316
-327
-338
-349
-360
-372
-384
-396
-408
-420
-433
-446
-459
-472
-485
-499
-513
-527
-541
-555
-570
-585
-600
-615
-630
-646
-662
-678
-694
-710
-727
-744
-761
-778
-795
-813
-831
-849
-867
-885
-904
-923
-942
-961
-980
-1000
-1020
-1040
-1060
-1080
-1101
-1122
-1143
-1164
-1185
-1207
-1229
-1251
-1273
-1295
-1318
-1341
-1364
-1387
-1410
-1434
-1458
-1482
-1506
-1530
-1555
-1580
-1605
-1630
-1655
-1681
-1707
-1733
-1759
-1785
-1812
-1839
-1866
-1893
-1920
-1948
-1976
-2004
-2032
-2060
-2089
-2118
-2147
-2176
-2205
-2235
-2265
-2295
-2325
-2355
-2386
-2417
-2448
-2479
-2510
-2542
-2574
-2606
-2638
-2670
-2703
-2736
-2769
-2802
-2835
-2869
-2903
-2937
-2971
-3005
-3040
-3075
-3110
-3145
-3180
-3216
-3252
-3288
-3324
-3360
-3397
-3434
-3471
-3508
-3545
-3583
-3621
-3659
-3697
-3735
-3774
-3813
-3852
-3891
-3930
-3970
-4010
-4050
-4090
-4130
-4171
-4212
-4253
-4294
-4335
-4377
-4419
-4461
-4503
-4545
-4588
-4631
-4674
-4717
-4760
-4804
-4848
-4892
-4936
-4980
-5025
-5070
-5115
-5160
-5205
-5251
-5297
-5343
-5389
-5435
-5482
-5529
-5576
-5623
-5670
-5718
-5766
-5814
-5862
-5910
-5959
-6008
-6057
-6106
-6155
-6205
-6255
-6305
-6355
-6405
-6456
-6507
-6558
-6609
-6660
-6712
-6764
-6816
-6868
-6920
-6973
-7026
-7079
-7132
-7185

+ 543 - 0
db/pre-re/statpoint.yml

@@ -0,0 +1,543 @@
+# This file is a part of rAthena.
+#   Copyright(C) 2021 rAthena Development Team
+#   https://rathena.org - https://github.com/rathena
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+#
+###########################################################################
+# Statpoint Database
+###########################################################################
+#
+# Statpoint Settings
+#
+###########################################################################
+# - Level             BaseLevel required.
+#   Points            Total status points given from BaseLevel 1 to 'Level'.
+###########################################################################
+
+Header:
+  Type: STATPOINT_DB
+  Version: 1
+
+Body:
+  - Level: 1
+    Points: 48
+  - Level: 2
+    Points: 51
+  - Level: 3
+    Points: 54
+  - Level: 4
+    Points: 57
+  - Level: 5
+    Points: 60
+  - Level: 6
+    Points: 64
+  - Level: 7
+    Points: 68
+  - Level: 8
+    Points: 72
+  - Level: 9
+    Points: 76
+  - Level: 10
+    Points: 80
+  - Level: 11
+    Points: 85
+  - Level: 12
+    Points: 90
+  - Level: 13
+    Points: 95
+  - Level: 14
+    Points: 100
+  - Level: 15
+    Points: 105
+  - Level: 16
+    Points: 111
+  - Level: 17
+    Points: 117
+  - Level: 18
+    Points: 123
+  - Level: 19
+    Points: 129
+  - Level: 20
+    Points: 135
+  - Level: 21
+    Points: 142
+  - Level: 22
+    Points: 149
+  - Level: 23
+    Points: 156
+  - Level: 24
+    Points: 163
+  - Level: 25
+    Points: 170
+  - Level: 26
+    Points: 178
+  - Level: 27
+    Points: 186
+  - Level: 28
+    Points: 194
+  - Level: 29
+    Points: 202
+  - Level: 30
+    Points: 210
+  - Level: 31
+    Points: 219
+  - Level: 32
+    Points: 228
+  - Level: 33
+    Points: 237
+  - Level: 34
+    Points: 246
+  - Level: 35
+    Points: 255
+  - Level: 36
+    Points: 265
+  - Level: 37
+    Points: 275
+  - Level: 38
+    Points: 285
+  - Level: 39
+    Points: 295
+  - Level: 40
+    Points: 305
+  - Level: 41
+    Points: 316
+  - Level: 42
+    Points: 327
+  - Level: 43
+    Points: 338
+  - Level: 44
+    Points: 349
+  - Level: 45
+    Points: 360
+  - Level: 46
+    Points: 372
+  - Level: 47
+    Points: 384
+  - Level: 48
+    Points: 396
+  - Level: 49
+    Points: 408
+  - Level: 50
+    Points: 420
+  - Level: 51
+    Points: 433
+  - Level: 52
+    Points: 446
+  - Level: 53
+    Points: 459
+  - Level: 54
+    Points: 472
+  - Level: 55
+    Points: 485
+  - Level: 56
+    Points: 499
+  - Level: 57
+    Points: 513
+  - Level: 58
+    Points: 527
+  - Level: 59
+    Points: 541
+  - Level: 60
+    Points: 555
+  - Level: 61
+    Points: 570
+  - Level: 62
+    Points: 585
+  - Level: 63
+    Points: 600
+  - Level: 64
+    Points: 615
+  - Level: 65
+    Points: 630
+  - Level: 66
+    Points: 646
+  - Level: 67
+    Points: 662
+  - Level: 68
+    Points: 678
+  - Level: 69
+    Points: 694
+  - Level: 70
+    Points: 710
+  - Level: 71
+    Points: 727
+  - Level: 72
+    Points: 744
+  - Level: 73
+    Points: 761
+  - Level: 74
+    Points: 778
+  - Level: 75
+    Points: 795
+  - Level: 76
+    Points: 813
+  - Level: 77
+    Points: 831
+  - Level: 78
+    Points: 849
+  - Level: 79
+    Points: 867
+  - Level: 80
+    Points: 885
+  - Level: 81
+    Points: 904
+  - Level: 82
+    Points: 923
+  - Level: 83
+    Points: 942
+  - Level: 84
+    Points: 961
+  - Level: 85
+    Points: 980
+  - Level: 86
+    Points: 1000
+  - Level: 87
+    Points: 1020
+  - Level: 88
+    Points: 1040
+  - Level: 89
+    Points: 1060
+  - Level: 90
+    Points: 1080
+  - Level: 91
+    Points: 1101
+  - Level: 92
+    Points: 1122
+  - Level: 93
+    Points: 1143
+  - Level: 94
+    Points: 1164
+  - Level: 95
+    Points: 1185
+  - Level: 96
+    Points: 1207
+  - Level: 97
+    Points: 1229
+  - Level: 98
+    Points: 1251
+  - Level: 99
+    Points: 1273
+  - Level: 100
+    Points: 1295
+  - Level: 101
+    Points: 1318
+  - Level: 102
+    Points: 1341
+  - Level: 103
+    Points: 1364
+  - Level: 104
+    Points: 1387
+  - Level: 105
+    Points: 1410
+  - Level: 106
+    Points: 1434
+  - Level: 107
+    Points: 1458
+  - Level: 108
+    Points: 1482
+  - Level: 109
+    Points: 1506
+  - Level: 110
+    Points: 1530
+  - Level: 111
+    Points: 1555
+  - Level: 112
+    Points: 1580
+  - Level: 113
+    Points: 1605
+  - Level: 114
+    Points: 1630
+  - Level: 115
+    Points: 1655
+  - Level: 116
+    Points: 1681
+  - Level: 117
+    Points: 1707
+  - Level: 118
+    Points: 1733
+  - Level: 119
+    Points: 1759
+  - Level: 120
+    Points: 1785
+  - Level: 121
+    Points: 1812
+  - Level: 122
+    Points: 1839
+  - Level: 123
+    Points: 1866
+  - Level: 124
+    Points: 1893
+  - Level: 125
+    Points: 1920
+  - Level: 126
+    Points: 1948
+  - Level: 127
+    Points: 1976
+  - Level: 128
+    Points: 2004
+  - Level: 129
+    Points: 2032
+  - Level: 130
+    Points: 2060
+  - Level: 131
+    Points: 2089
+  - Level: 132
+    Points: 2118
+  - Level: 133
+    Points: 2147
+  - Level: 134
+    Points: 2176
+  - Level: 135
+    Points: 2205
+  - Level: 136
+    Points: 2235
+  - Level: 137
+    Points: 2265
+  - Level: 138
+    Points: 2295
+  - Level: 139
+    Points: 2325
+  - Level: 140
+    Points: 2355
+  - Level: 141
+    Points: 2386
+  - Level: 142
+    Points: 2417
+  - Level: 143
+    Points: 2448
+  - Level: 144
+    Points: 2479
+  - Level: 145
+    Points: 2510
+  - Level: 146
+    Points: 2542
+  - Level: 147
+    Points: 2574
+  - Level: 148
+    Points: 2606
+  - Level: 149
+    Points: 2638
+  - Level: 150
+    Points: 2670
+  - Level: 151
+    Points: 2703
+  - Level: 152
+    Points: 2736
+  - Level: 153
+    Points: 2769
+  - Level: 154
+    Points: 2802
+  - Level: 155
+    Points: 2835
+  - Level: 156
+    Points: 2869
+  - Level: 157
+    Points: 2903
+  - Level: 158
+    Points: 2937
+  - Level: 159
+    Points: 2971
+  - Level: 160
+    Points: 3005
+  - Level: 161
+    Points: 3040
+  - Level: 162
+    Points: 3075
+  - Level: 163
+    Points: 3110
+  - Level: 164
+    Points: 3145
+  - Level: 165
+    Points: 3180
+  - Level: 166
+    Points: 3216
+  - Level: 167
+    Points: 3252
+  - Level: 168
+    Points: 3288
+  - Level: 169
+    Points: 3324
+  - Level: 170
+    Points: 3360
+  - Level: 171
+    Points: 3397
+  - Level: 172
+    Points: 3434
+  - Level: 173
+    Points: 3471
+  - Level: 174
+    Points: 3508
+  - Level: 175
+    Points: 3545
+  - Level: 176
+    Points: 3583
+  - Level: 177
+    Points: 3621
+  - Level: 178
+    Points: 3659
+  - Level: 179
+    Points: 3697
+  - Level: 180
+    Points: 3735
+  - Level: 181
+    Points: 3774
+  - Level: 182
+    Points: 3813
+  - Level: 183
+    Points: 3852
+  - Level: 184
+    Points: 3891
+  - Level: 185
+    Points: 3930
+  - Level: 186
+    Points: 3970
+  - Level: 187
+    Points: 4010
+  - Level: 188
+    Points: 4050
+  - Level: 189
+    Points: 4090
+  - Level: 190
+    Points: 4130
+  - Level: 191
+    Points: 4171
+  - Level: 192
+    Points: 4212
+  - Level: 193
+    Points: 4253
+  - Level: 194
+    Points: 4294
+  - Level: 195
+    Points: 4335
+  - Level: 196
+    Points: 4377
+  - Level: 197
+    Points: 4419
+  - Level: 198
+    Points: 4461
+  - Level: 199
+    Points: 4503
+  - Level: 200
+    Points: 4545
+  # - Level: 201
+    # Points: 4588
+  # - Level: 202
+    # Points: 4631
+  # - Level: 203
+    # Points: 4674
+  # - Level: 204
+    # Points: 4717
+  # - Level: 205
+    # Points: 4760
+  # - Level: 206
+    # Points: 4804
+  # - Level: 207
+    # Points: 4848
+  # - Level: 208
+    # Points: 4892
+  # - Level: 209
+    # Points: 4936
+  # - Level: 210
+    # Points: 4980
+  # - Level: 211
+    # Points: 5025
+  # - Level: 212
+    # Points: 5070
+  # - Level: 213
+    # Points: 5115
+  # - Level: 214
+    # Points: 5160
+  # - Level: 215
+    # Points: 5205
+  # - Level: 216
+    # Points: 5251
+  # - Level: 217
+    # Points: 5297
+  # - Level: 218
+    # Points: 5343
+  # - Level: 219
+    # Points: 5389
+  # - Level: 220
+    # Points: 5435
+  # - Level: 221
+    # Points: 5482
+  # - Level: 222
+    # Points: 5529
+  # - Level: 223
+    # Points: 5576
+  # - Level: 224
+    # Points: 5623
+  # - Level: 225
+    # Points: 5670
+  # - Level: 226
+    # Points: 5718
+  # - Level: 227
+    # Points: 5766
+  # - Level: 228
+    # Points: 5814
+  # - Level: 229
+    # Points: 5862
+  # - Level: 230
+    # Points: 5910
+  # - Level: 231
+    # Points: 5959
+  # - Level: 232
+    # Points: 6008
+  # - Level: 233
+    # Points: 6057
+  # - Level: 234
+    # Points: 6106
+  # - Level: 235
+    # Points: 6155
+  # - Level: 236
+    # Points: 6205
+  # - Level: 237
+    # Points: 6255
+  # - Level: 238
+    # Points: 6305
+  # - Level: 239
+    # Points: 6355
+  # - Level: 240
+    # Points: 6405
+  # - Level: 241
+    # Points: 6456
+  # - Level: 242
+    # Points: 6507
+  # - Level: 243
+    # Points: 6558
+  # - Level: 244
+    # Points: 6609
+  # - Level: 245
+    # Points: 6660
+  # - Level: 246
+    # Points: 6712
+  # - Level: 247
+    # Points: 6764
+  # - Level: 248
+    # Points: 6816
+  # - Level: 249
+    # Points: 6868
+  # - Level: 250
+    # Points: 6920
+  # - Level: 251
+    # Points: 6973
+  # - Level: 252
+    # Points: 7026
+  # - Level: 253
+    # Points: 7079
+  # - Level: 254
+    # Points: 7132
+  # - Level: 255
+    # Points: 7185

+ 0 - 255
db/re/statpoint.txt

@@ -1,255 +0,0 @@
-48
-51
-54
-57
-60
-64
-68
-72
-76
-80
-85
-90
-95
-100
-105
-111
-117
-123
-129
-135
-142
-149
-156
-163
-170
-178
-186
-194
-202
-210
-219
-228
-237
-246
-255
-265
-275
-285
-295
-305
-316
-327
-338
-349
-360
-372
-384
-396
-408
-420
-433
-446
-459
-472
-485
-499
-513
-527
-541
-555
-570
-585
-600
-615
-630
-646
-662
-678
-694
-710
-727
-744
-761
-778
-795
-813
-831
-849
-867
-885
-904
-923
-942
-961
-980
-1000
-1020
-1040
-1060
-1080
-1101
-1122
-1143
-1164
-1185
-1207
-1229
-1251
-1273
-1295
-1318
-1341
-1364
-1387
-1410
-1433
-1456
-1479
-1502
-1525
-1549
-1573
-1597
-1621
-1645
-1669
-1693
-1717
-1741
-1765
-1790
-1815
-1840
-1865
-1890
-1915
-1940
-1965
-1990
-2015
-2041
-2067
-2093
-2119
-2145
-2171
-2197
-2223
-2249
-2275
-2302
-2329
-2356
-2383
-2410
-2437
-2464
-2491
-2518
-2545
-2573
-2601
-2629
-2657
-2685
-2713
-2741
-2770
-2799
-2828
-2857
-2886
-2915
-2944
-2974
-3004
-3034
-3064
-3094
-3124
-3154
-3185
-3216
-3247
-3278
-3295
-3325
-3355
-3385
-3415
-3446
-3477
-3508
-3539
-3570
-3601
-3632
-3663
-3694
-3725
-3757
-3789
-3821
-3853
-3885
-3917
-3949
-3981
-4013
-4045
-4078
-4111
-4114
-4177
-4210
-4243
-4276
-4309
-4342
-4375
-4409
-4443
-4477
-4511
-4545
-4579
-4613
-4647
-4681
-4715
-4750
-4785
-4820
-4855
-4890
-4925
-4960
-5030
-5065
-5100
-5136
-5172
-5208
-5244
-5280
-5316
-5352
-5388
-5424
-5460
-5497
-5537
-5571
-5608
-5645
-5682
-5719
-5793
-5830
-5868
-5906
-5944
-5982
-6020
-6058

+ 543 - 0
db/re/statpoint.yml

@@ -0,0 +1,543 @@
+# This file is a part of rAthena.
+#   Copyright(C) 2021 rAthena Development Team
+#   https://rathena.org - https://github.com/rathena
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+#
+###########################################################################
+# Statpoint Database
+###########################################################################
+#
+# Statpoint Settings
+#
+###########################################################################
+# - Level             BaseLevel required.
+#   Points            Total status points given from BaseLevel 1 to 'Level'.
+###########################################################################
+
+Header:
+  Type: STATPOINT_DB
+  Version: 1
+
+Body:
+  - Level: 1
+    Points: 48
+  - Level: 2
+    Points: 51
+  - Level: 3
+    Points: 54
+  - Level: 4
+    Points: 57
+  - Level: 5
+    Points: 60
+  - Level: 6
+    Points: 64
+  - Level: 7
+    Points: 68
+  - Level: 8
+    Points: 72
+  - Level: 9
+    Points: 76
+  - Level: 10
+    Points: 80
+  - Level: 11
+    Points: 85
+  - Level: 12
+    Points: 90
+  - Level: 13
+    Points: 95
+  - Level: 14
+    Points: 100
+  - Level: 15
+    Points: 105
+  - Level: 16
+    Points: 111
+  - Level: 17
+    Points: 117
+  - Level: 18
+    Points: 123
+  - Level: 19
+    Points: 129
+  - Level: 20
+    Points: 135
+  - Level: 21
+    Points: 142
+  - Level: 22
+    Points: 149
+  - Level: 23
+    Points: 156
+  - Level: 24
+    Points: 163
+  - Level: 25
+    Points: 170
+  - Level: 26
+    Points: 178
+  - Level: 27
+    Points: 186
+  - Level: 28
+    Points: 194
+  - Level: 29
+    Points: 202
+  - Level: 30
+    Points: 210
+  - Level: 31
+    Points: 219
+  - Level: 32
+    Points: 228
+  - Level: 33
+    Points: 237
+  - Level: 34
+    Points: 246
+  - Level: 35
+    Points: 255
+  - Level: 36
+    Points: 265
+  - Level: 37
+    Points: 275
+  - Level: 38
+    Points: 285
+  - Level: 39
+    Points: 295
+  - Level: 40
+    Points: 305
+  - Level: 41
+    Points: 316
+  - Level: 42
+    Points: 327
+  - Level: 43
+    Points: 338
+  - Level: 44
+    Points: 349
+  - Level: 45
+    Points: 360
+  - Level: 46
+    Points: 372
+  - Level: 47
+    Points: 384
+  - Level: 48
+    Points: 396
+  - Level: 49
+    Points: 408
+  - Level: 50
+    Points: 420
+  - Level: 51
+    Points: 433
+  - Level: 52
+    Points: 446
+  - Level: 53
+    Points: 459
+  - Level: 54
+    Points: 472
+  - Level: 55
+    Points: 485
+  - Level: 56
+    Points: 499
+  - Level: 57
+    Points: 513
+  - Level: 58
+    Points: 527
+  - Level: 59
+    Points: 541
+  - Level: 60
+    Points: 555
+  - Level: 61
+    Points: 570
+  - Level: 62
+    Points: 585
+  - Level: 63
+    Points: 600
+  - Level: 64
+    Points: 615
+  - Level: 65
+    Points: 630
+  - Level: 66
+    Points: 646
+  - Level: 67
+    Points: 662
+  - Level: 68
+    Points: 678
+  - Level: 69
+    Points: 694
+  - Level: 70
+    Points: 710
+  - Level: 71
+    Points: 727
+  - Level: 72
+    Points: 744
+  - Level: 73
+    Points: 761
+  - Level: 74
+    Points: 778
+  - Level: 75
+    Points: 795
+  - Level: 76
+    Points: 813
+  - Level: 77
+    Points: 831
+  - Level: 78
+    Points: 849
+  - Level: 79
+    Points: 867
+  - Level: 80
+    Points: 885
+  - Level: 81
+    Points: 904
+  - Level: 82
+    Points: 923
+  - Level: 83
+    Points: 942
+  - Level: 84
+    Points: 961
+  - Level: 85
+    Points: 980
+  - Level: 86
+    Points: 1000
+  - Level: 87
+    Points: 1020
+  - Level: 88
+    Points: 1040
+  - Level: 89
+    Points: 1060
+  - Level: 90
+    Points: 1080
+  - Level: 91
+    Points: 1101
+  - Level: 92
+    Points: 1122
+  - Level: 93
+    Points: 1143
+  - Level: 94
+    Points: 1164
+  - Level: 95
+    Points: 1185
+  - Level: 96
+    Points: 1207
+  - Level: 97
+    Points: 1229
+  - Level: 98
+    Points: 1251
+  - Level: 99
+    Points: 1273
+  - Level: 100
+    Points: 1295
+  - Level: 101
+    Points: 1318
+  - Level: 102
+    Points: 1341
+  - Level: 103
+    Points: 1364
+  - Level: 104
+    Points: 1387
+  - Level: 105
+    Points: 1410
+  - Level: 106
+    Points: 1433
+  - Level: 107
+    Points: 1456
+  - Level: 108
+    Points: 1479
+  - Level: 109
+    Points: 1502
+  - Level: 110
+    Points: 1525
+  - Level: 111
+    Points: 1549
+  - Level: 112
+    Points: 1573
+  - Level: 113
+    Points: 1597
+  - Level: 114
+    Points: 1621
+  - Level: 115
+    Points: 1645
+  - Level: 116
+    Points: 1669
+  - Level: 117
+    Points: 1693
+  - Level: 118
+    Points: 1717
+  - Level: 119
+    Points: 1741
+  - Level: 120
+    Points: 1765
+  - Level: 121
+    Points: 1790
+  - Level: 122
+    Points: 1815
+  - Level: 123
+    Points: 1840
+  - Level: 124
+    Points: 1865
+  - Level: 125
+    Points: 1890
+  - Level: 126
+    Points: 1915
+  - Level: 127
+    Points: 1940
+  - Level: 128
+    Points: 1965
+  - Level: 129
+    Points: 1990
+  - Level: 130
+    Points: 2015
+  - Level: 131
+    Points: 2041
+  - Level: 132
+    Points: 2067
+  - Level: 133
+    Points: 2093
+  - Level: 134
+    Points: 2119
+  - Level: 135
+    Points: 2145
+  - Level: 136
+    Points: 2171
+  - Level: 137
+    Points: 2197
+  - Level: 138
+    Points: 2223
+  - Level: 139
+    Points: 2249
+  - Level: 140
+    Points: 2275
+  - Level: 141
+    Points: 2302
+  - Level: 142
+    Points: 2329
+  - Level: 143
+    Points: 2356
+  - Level: 144
+    Points: 2383
+  - Level: 145
+    Points: 2410
+  - Level: 146
+    Points: 2437
+  - Level: 147
+    Points: 2464
+  - Level: 148
+    Points: 2491
+  - Level: 149
+    Points: 2518
+  - Level: 150
+    Points: 2545
+  - Level: 151
+    Points: 2573
+  - Level: 152
+    Points: 2601
+  - Level: 153
+    Points: 2629
+  - Level: 154
+    Points: 2657
+  - Level: 155
+    Points: 2685
+  - Level: 156
+    Points: 2713
+  - Level: 157
+    Points: 2741
+  - Level: 158
+    Points: 2770
+  - Level: 159
+    Points: 2799
+  - Level: 160
+    Points: 2828
+  - Level: 161
+    Points: 2857
+  - Level: 162
+    Points: 2886
+  - Level: 163
+    Points: 2915
+  - Level: 164
+    Points: 2944
+  - Level: 165
+    Points: 2974
+  - Level: 166
+    Points: 3004
+  - Level: 167
+    Points: 3034
+  - Level: 168
+    Points: 3064
+  - Level: 169
+    Points: 3094
+  - Level: 170
+    Points: 3124
+  - Level: 171
+    Points: 3154
+  - Level: 172
+    Points: 3185
+  - Level: 173
+    Points: 3216
+  - Level: 174
+    Points: 3247
+  - Level: 175
+    Points: 3278
+  - Level: 176
+    Points: 3295
+  - Level: 177
+    Points: 3325
+  - Level: 178
+    Points: 3355
+  - Level: 179
+    Points: 3385
+  - Level: 180
+    Points: 3415
+  - Level: 181
+    Points: 3446
+  - Level: 182
+    Points: 3477
+  - Level: 183
+    Points: 3508
+  - Level: 184
+    Points: 3539
+  - Level: 185
+    Points: 3570
+  - Level: 186
+    Points: 3601
+  - Level: 187
+    Points: 3632
+  - Level: 188
+    Points: 3663
+  - Level: 189
+    Points: 3694
+  - Level: 190
+    Points: 3725
+  - Level: 191
+    Points: 3757
+  - Level: 192
+    Points: 3789
+  - Level: 193
+    Points: 3821
+  - Level: 194
+    Points: 3853
+  - Level: 195
+    Points: 3885
+  - Level: 196
+    Points: 3917
+  - Level: 197
+    Points: 3949
+  - Level: 198
+    Points: 3981
+  - Level: 199
+    Points: 4013
+  - Level: 200
+    Points: 4045
+  # - Level: 201
+    # Points: 4078
+  # - Level: 202
+    # Points: 4111
+  # - Level: 203
+    # Points: 4114
+  # - Level: 204
+    # Points: 4177
+  # - Level: 205
+    # Points: 4210
+  # - Level: 206
+    # Points: 4243
+  # - Level: 207
+    # Points: 4276
+  # - Level: 208
+    # Points: 4309
+  # - Level: 209
+    # Points: 4342
+  # - Level: 210
+    # Points: 4375
+  # - Level: 211
+    # Points: 4409
+  # - Level: 212
+    # Points: 4443
+  # - Level: 213
+    # Points: 4477
+  # - Level: 214
+    # Points: 4511
+  # - Level: 215
+    # Points: 4545
+  # - Level: 216
+    # Points: 4579
+  # - Level: 217
+    # Points: 4613
+  # - Level: 218
+    # Points: 4647
+  # - Level: 219
+    # Points: 4681
+  # - Level: 220
+    # Points: 4715
+  # - Level: 221
+    # Points: 4750
+  # - Level: 222
+    # Points: 4785
+  # - Level: 223
+    # Points: 4820
+  # - Level: 224
+    # Points: 4855
+  # - Level: 225
+    # Points: 4890
+  # - Level: 226
+    # Points: 4925
+  # - Level: 227
+    # Points: 4960
+  # - Level: 228
+    # Points: 5030
+  # - Level: 229
+    # Points: 5065
+  # - Level: 230
+    # Points: 5100
+  # - Level: 231
+    # Points: 5136
+  # - Level: 232
+    # Points: 5172
+  # - Level: 233
+    # Points: 5208
+  # - Level: 234
+    # Points: 5244
+  # - Level: 235
+    # Points: 5280
+  # - Level: 236
+    # Points: 5316
+  # - Level: 237
+    # Points: 5352
+  # - Level: 238
+    # Points: 5388
+  # - Level: 239
+    # Points: 5424
+  # - Level: 240
+    # Points: 5460
+  # - Level: 241
+    # Points: 5497
+  # - Level: 242
+    # Points: 5537
+  # - Level: 243
+    # Points: 5571
+  # - Level: 244
+    # Points: 5608
+  # - Level: 245
+    # Points: 5645
+  # - Level: 246
+    # Points: 5682
+  # - Level: 247
+    # Points: 5719
+  # - Level: 248
+    # Points: 5793
+  # - Level: 249
+    # Points: 5830
+  # - Level: 250
+    # Points: 5868
+  # - Level: 251
+    # Points: 5906
+  # - Level: 252
+    # Points: 5944
+  # - Level: 253
+    # Points: 5982
+  # - Level: 254
+    # Points: 6020
+  # - Level: 255
+    # Points: 6058

+ 39 - 0
db/statpoint.yml

@@ -0,0 +1,39 @@
+# This file is a part of rAthena.
+#   Copyright(C) 2021 rAthena Development Team
+#   https://rathena.org - https://github.com/rathena
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+#
+###########################################################################
+# Statpoint Database
+###########################################################################
+#
+# Statpoint Settings
+#
+###########################################################################
+# - Level             BaseLevel required.
+#   Points            Total status points given from BaseLevel 1 to 'Level'.
+###########################################################################
+
+Header:
+  Type: STATPOINT_DB
+  Version: 1
+
+Footer:
+  Imports:
+  - Path: db/pre-re/statpoint.yml
+    Mode: Prerenewal
+  - Path: db/re/statpoint.yml
+    Mode: Renewal
+  - Path: db/import/statpoint.yml

+ 10 - 0
doc/yaml/db/statpoint.yml

@@ -0,0 +1,10 @@
+###########################################################################
+# Statpoint Database
+###########################################################################
+#
+# Statpoint Settings
+#
+###########################################################################
+# - Level             BaseLevel required.
+#   Points            Total status points given from BaseLevel 1 to 'Level'.
+###########################################################################

+ 5 - 1
src/char/char.cpp

@@ -1448,7 +1448,7 @@ int char_make_new_char( struct char_session_data* sd, char* name_, int str, int
 
 	status_points = 0;
 #else
-	status_points = 48;
+	status_points = charserv_config.start_status_points;
 #endif
 
 	// check the number of already existing chars in this account
@@ -2639,6 +2639,8 @@ void char_sql_config_read(const char* cfgName) {
 			safestrncpy(schema_config.clan_alliance_table, w2, sizeof(schema_config.clan_alliance_table));
 		else if(!strcmpi(w1,"achievement_table"))
 			safestrncpy(schema_config.achievement_table, w2, sizeof(schema_config.achievement_table));
+		else if(!strcmpi(w1, "start_status_points"))
+			charserv_config.start_status_points = atoi(w2);
 		//support the import command, just like any other config
 		else if(!strcmpi(w1,"import"))
 			char_sql_config_read(w2);
@@ -2770,6 +2772,8 @@ void char_set_defaults(){
 	charserv_config.start_items_doram[1].pos = EQP_ARMOR;
 #endif
 
+	charserv_config.start_status_points = 48;
+
 	charserv_config.console = 0;
 	charserv_config.max_connect_user = -1;
 	charserv_config.gm_allow_group = -1;

+ 1 - 0
src/char/char.hpp

@@ -173,6 +173,7 @@ struct CharServ_Config {
 	struct point start_point[MAX_STARTPOINT], start_point_doram[MAX_STARTPOINT]; // Initial position the player will spawn on the server
 	short start_point_count, start_point_count_doram; // Number of positions read
 	struct startitem start_items[MAX_STARTITEM], start_items_doram[MAX_STARTITEM]; // Initial items the player with spawn with on the server
+	uint32 start_status_points;
 	int console;
 	int max_connect_user;
 	int gm_allow_group;

+ 2 - 2
src/map/atcommand.cpp

@@ -1552,7 +1552,7 @@ ACMD_FUNC(baselevelup)
 		if ((unsigned int)level > pc_maxbaselv(sd) || (unsigned int)level > pc_maxbaselv(sd) - sd->status.base_level) // fix positive overflow
 			level = pc_maxbaselv(sd) - sd->status.base_level;
 		for (i = 0; i < level; i++)
-			status_point += pc_gets_status_point(sd->status.base_level + i);
+			status_point += statpoint_db.pc_gets_status_point(sd->status.base_level + i);
 
 		sd->status.status_point += status_point;
 		sd->status.base_level += (unsigned int)level;
@@ -1573,7 +1573,7 @@ ACMD_FUNC(baselevelup)
 		if ((unsigned int)level >= sd->status.base_level)
 			level = sd->status.base_level-1;
 		for (i = 0; i > -level; i--)
-			status_point += pc_gets_status_point(sd->status.base_level + i - 1);
+			status_point += statpoint_db.pc_gets_status_point(sd->status.base_level + i - 1);
 		if (sd->status.status_point < status_point)
 			pc_resetstate(sd);
 		if (sd->status.status_point < status_point)

+ 1 - 1
src/map/map-server.vcxproj

@@ -353,7 +353,7 @@
     <Copy SourceFiles="$(SolutionDir)db\import-tmpl\skill_nocast_db.txt" DestinationFolder="$(SolutionDir)db\import\" ContinueOnError="true" Condition="!Exists('$(SolutionDir)db\import\skill_nocast_db.txt')" />
     <Copy SourceFiles="$(SolutionDir)db\import-tmpl\skill_tree.txt" DestinationFolder="$(SolutionDir)db\import\" ContinueOnError="true" Condition="!Exists('$(SolutionDir)db\import\skill_tree.txt')" />
     <Copy SourceFiles="$(SolutionDir)db\import-tmpl\spellbook_db.yml" DestinationFolder="$(SolutionDir)db\import\" ContinueOnError="true" Condition="!Exists('$(SolutionDir)db\import\spellbook_db.yml')" />
-    <Copy SourceFiles="$(SolutionDir)db\import-tmpl\statpoint.txt" DestinationFolder="$(SolutionDir)db\import\" ContinueOnError="true" Condition="!Exists('$(SolutionDir)db\import\statpoint.txt')" />
+    <Copy SourceFiles="$(SolutionDir)db\import-tmpl\statpoint.yml" DestinationFolder="$(SolutionDir)db\import\" ContinueOnError="true" Condition="!Exists('$(SolutionDir)db\import\statpoint.yml')" />
     <Copy SourceFiles="$(SolutionDir)db\import-tmpl\status_disabled.txt" DestinationFolder="$(SolutionDir)db\import\" ContinueOnError="true" Condition="!Exists('$(SolutionDir)db\import\status_disabled.txt')" />
   </Target>
 </Project>

+ 5 - 0
src/map/map.cpp

@@ -97,6 +97,8 @@ char log_db_pw[32] = "";
 char log_db_db[32] = "log";
 Sql* logmysql_handle;
 
+uint32 start_status_points = 48;
+
 // DBMap declaration
 static DBMap* id_db=NULL; /// int id -> struct block_list*
 static DBMap* pc_db=NULL; /// int id -> struct map_session_data*
@@ -4251,6 +4253,9 @@ int inter_config_read(const char *cfgName)
 		if(strcmpi(w1,"log_db_db")==0)
 			safestrncpy(log_db_db, w2, sizeof(log_db_db));
 		else
+		if(strcmpi(w1,"start_status_points")==0)
+			start_status_points=atoi(w2);
+		else
 		if( mapreg_config_read(w1,w2) )
 			continue;
 		//support the import command, just like any other config

+ 2 - 0
src/map/map.hpp

@@ -781,6 +781,8 @@ extern int16 save_settings;
 extern int night_flag; // 0=day, 1=night [Yor]
 extern int enable_spy; //Determines if @spy commands are active.
 
+extern uint32 start_status_points;
+
 // Agit Flags
 extern bool agit_flag;
 extern bool agit2_flag;

+ 84 - 67
src/map/pc.cpp

@@ -66,7 +66,7 @@ static inline bool pc_attendance_rewarded_today( struct map_session_data* sd );
 
 #define PVP_CALCRANK_INTERVAL 1000	// PVP calculation interval
 
-static unsigned int statp[MAX_LEVEL+1];
+PlayerStatPointDatabase statpoint_db;
 
 // h-files are for declarations, not for implementations... [Shinomori]
 struct skill_tree_entry skill_tree[CLASS_COUNT][MAX_SKILL_TREE];
@@ -7181,7 +7181,7 @@ int pc_checkbaselevelup(struct map_session_data *sd) {
 		if( ( !battle_config.multi_level_up || ( battle_config.multi_level_up_base > 0 && sd->status.base_level >= battle_config.multi_level_up_base ) ) && sd->status.base_exp > next-1 )
 			sd->status.base_exp = next-1;
 
-		sd->status.status_point += pc_gets_status_point(sd->status.base_level++);
+		sd->status.status_point += statpoint_db.pc_gets_status_point(sd->status.base_level++);
 
 		if( pc_is_maxbaselv(sd) ){
 			sd->status.base_exp = u64min(sd->status.base_exp,MAX_LEVEL_BASE_EXP);
@@ -7595,14 +7595,25 @@ static int pc_setstat(struct map_session_data* sd, int type, int val)
 
 	return val;
 }
+/**
+ * Gets the total number of status points at the provided level.
+ * @param level: Player base level.
+ * @return Total number of status points at specific base level.
+ */
+uint32 PlayerStatPointDatabase::get_table_point(uint16 level) {
+	return this->statpoint_table[level];
+}
 
-// Calculates the number of status points PC gets when leveling up (from level to level+1)
-int pc_gets_status_point(int level)
-{
-	if (battle_config.use_statpoint_table) //Use values from "db/statpoint.txt"
-		return (statp[level+1] - statp[level]);
-	else //Default increase
-		return ((level+15) / 5);
+/**
+ * Calculates the number of status points PC gets when leveling up (from level to level+1)
+ * @param level: Player base level.
+ * @param table: Use table value or formula.
+ * @return Status points at specific base level.
+ */
+uint32 PlayerStatPointDatabase::pc_gets_status_point(uint16 level) {
+	if (this->statpoint_table[level+1] > this->statpoint_table[level])
+		return (this->statpoint_table[level+1] - this->statpoint_table[level]);
+	return 0;
 }
 
 #ifdef RENEWAL_STAT
@@ -7971,25 +7982,14 @@ int pc_resetstate(struct map_session_data* sd)
 {
 	nullpo_ret(sd);
 
-	if (battle_config.use_statpoint_table)
-	{	// New statpoint table used here - Dexity
-		if (sd->status.base_level > MAX_LEVEL)
-		{	//statp[] goes out of bounds, can't reset!
-			ShowError("pc_resetstate: Can't reset stats of %d:%d, the base level (%d) is greater than the max level supported (%d)\n",
-				sd->status.account_id, sd->status.char_id, sd->status.base_level, MAX_LEVEL);
-			return 0;
-		}
-
-		sd->status.status_point = statp[sd->status.base_level];
+	if( sd->status.base_level > pc_maxbaselv( sd ) ){
+		ShowError( "pc_resetstate: Capping the Level to %d to reset the stats of %d:%d, the base level (%d) is greater than the max level supported.\n",
+			pc_maxbaselv( sd ), sd->status.account_id, sd->status.char_id, sd->status.base_level );
+		sd->status.base_level = pc_maxbaselv( sd );
+		clif_updatestatus( sd, SP_BASELEVEL );
 	}
-	else
-	{
-		sd->status.status_point = 48;
 
-		for( int i = 1; i < sd->status.base_level; i++ ){
-			sd->status.status_point += pc_gets_status_point( i );
-		}
-	}
+	sd->status.status_point = statpoint_db.get_table_point( sd->status.base_level );
 
 	if( ( sd->class_&JOBL_UPPER ) != 0 ){
 		sd->status.status_point += battle_config.transcendent_status_points;
@@ -8962,7 +8962,7 @@ bool pc_setparam(struct map_session_data *sd,int64 type,int64 val_tmp)
 			int i = 0;
 			int stat=0;
 			for (i = 0; i < (int)(val - sd->status.base_level); i++)
-				stat += pc_gets_status_point(sd->status.base_level + i);
+				stat += statpoint_db.pc_gets_status_point(sd->status.base_level + i);
 			sd->status.status_point += stat;
 		}
 		sd->status.base_level = val;
@@ -12324,36 +12324,60 @@ static bool pc_readdb_job_noenter_map(char *str[], int columns, int current) {
 	return true;
 }
 
-static int pc_read_statsdb(const char *basedir, int last_s, bool silent){
-	int i=1;
-	char line[24000]; //FIXME this seem too big
-	FILE *fp;
-	
-	sprintf(line, "%s/statpoint.txt", basedir);
-	fp=fopen(line,"r");
-	if(fp == NULL){
-		if(silent==0) ShowWarning("Can't read '" CL_WHITE "%s" CL_RESET "'... Generating DB.\n",line);
-		return max(last_s,i);
-	} else {
-		int entries=0;
-		while(fgets(line, sizeof(line), fp))
-		{
-			int stat;
-			trim(line);
-			if(line[0] == '\0' || (line[0]=='/' && line[1]=='/'))
-				continue;
-			if ((stat=strtoul(line,NULL,10))<0)
-				stat=0;
-			if (i > MAX_LEVEL)
-				break;
-			statp[i]=stat;
-			i++;
-			entries++;
+const std::string PlayerStatPointDatabase::getDefaultLocation() {
+	return std::string(db_path) + "/statpoint.yml";
+}
+
+uint64 PlayerStatPointDatabase::parseBodyNode(const YAML::Node &node) {
+	if (!this->nodesExist(node, { "Level", "Points" })) {
+		return 0;
+	}
+
+	uint16 level;
+
+	if (!this->asUInt16(node, "Level", level))
+		return 0;
+
+	uint32 point;
+
+	if (!this->asUInt32(node, "Points", point))
+		return 0;
+
+	if (level == 0) {
+		this->invalidWarning(node["Level"], "The minimum level is 1.\n");
+		return 0;
+	}
+
+	if (level > MAX_LEVEL) {
+		this->invalidWarning(node["Level"], "Level %d exceeds maximum BaseLevel %d, skipping.\n", level, MAX_LEVEL);
+		return 0;
+	}
+
+	this->statpoint_table[level] = point;
+
+	return 1;
+}
+
+/**
+ * Generate the remaining parts of the db if necessary.
+ */
+void PlayerStatPointDatabase::loadingFinished() {
+	if( battle_config.use_statpoint_table ){
+		this->statpoint_table[1] = start_status_points;
+	}
+
+	if( this->statpoint_table[1] != start_status_points ){
+		ShowError( "Status points for Level 1 (=%d) do not match inter_athena.conf value (=%d).\n", this->statpoint_table[1], start_status_points );
+		this->statpoint_table[1] = start_status_points;
+	}
+
+	for (uint16 level = 2; level <= MAX_LEVEL; level++) {
+		if (!battle_config.use_statpoint_table || util::umap_find(this->statpoint_table, level) == nullptr) {
+			if (battle_config.use_statpoint_table)
+				ShowError("Missing status points for Level %d\n", level);
+			this->statpoint_table[level] = this->statpoint_table[level-1] + ((level-1+15) / 5);
 		}
-		fclose(fp);
-		ShowStatus("Done reading '" CL_WHITE "%d" CL_RESET "' entries in '" CL_WHITE "%s/%s" CL_RESET "'.\n", entries, basedir,"statpoint.txt");
 	}
-	return max(last_s,i);
 }
 
 /*==========================================
@@ -12366,7 +12390,7 @@ static int pc_read_statsdb(const char *basedir, int last_s, bool silent){
  * job_maxhpsp_db.txt	- strtlvl,maxlvl,job,type,values/lvl (values=hp|sp)
  *------------------------------------------*/
 void pc_readdb(void) {
-	int i, k, s = 1;
+	int i, s = 1;
 	const char* dbsubpath[] = {
 		"",
 		"/" DBIMPORT,
@@ -12380,8 +12404,8 @@ void pc_readdb(void) {
 	penalty_db.load();
 #endif
 
-	 // reset then read statspoint
-	memset(statp,0,sizeof(statp));
+	statpoint_db.clear();
+
 	for(i=0; i<ARRAYLENGTH(dbsubpath); i++){
 		uint8 n1 = (uint8)(strlen(db_path)+strlen(dbsubpath[i])+1);
 		uint8 n2 = (uint8)(strlen(db_path)+strlen(DBPATH)+strlen(dbsubpath[i])+1);
@@ -12397,7 +12421,6 @@ void pc_readdb(void) {
 			safesnprintf(dbsubpath2,n1,"%s%s",db_path,dbsubpath[i]);
 		}
 
-		s = pc_read_statsdb(dbsubpath2,s,i > 0);
 		if (i == 0)
 #ifdef RENEWAL_ASPD // Paths are hardcoded here to specifically pick the correct database
 			sv_readdb(dbsubpath1, "re/job_db1.txt",',',6+MAX_WEAPON_TYPE,6+MAX_WEAPON_TYPE,CLASS_COUNT,&pc_readdb_job1, false);
@@ -12422,14 +12445,8 @@ void pc_readdb(void) {
 	sv_readdb(db_path, DBPATH"skill_tree.txt", ',', 3 + MAX_PC_SKILL_REQUIRE * 2, 5 + MAX_PC_SKILL_REQUIRE * 2, -1, &pc_readdb_skilltree, 0);
 	sv_readdb(db_path, DBIMPORT"/skill_tree.txt", ',', 3 + MAX_PC_SKILL_REQUIRE * 2, 5 + MAX_PC_SKILL_REQUIRE * 2, -1, &pc_readdb_skilltree, 1);
 
-	// generate the remaining parts of the db if necessary
-	k = battle_config.use_statpoint_table; //save setting
-	battle_config.use_statpoint_table = 0; //temporarily disable to force pc_gets_status_point use default values
-	statp[0] = 45; // seed value
-	for (; s <= MAX_LEVEL; s++)
-		statp[s] = statp[s-1] + pc_gets_status_point(s-1);
-	battle_config.use_statpoint_table = k; //restore setting
-	
+	statpoint_db.load();
+
 	//Checking if all class have their data
 	for (i = 0; i < JOB_MAX; i++) {
 		int idx;

+ 22 - 1
src/map/pc.hpp

@@ -1117,6 +1117,28 @@ public:
 
 extern AttendanceDatabase attendance_db;
 
+class PlayerStatPointDatabase : public YamlDatabase {
+private:
+	std::unordered_map<uint16, uint32> statpoint_table;
+
+public:
+	PlayerStatPointDatabase() : YamlDatabase("STATPOINT_DB", 1) {
+
+	}
+
+	void clear(){
+		statpoint_table.clear();
+	}
+	const std::string getDefaultLocation();
+	uint64 parseBodyNode(const YAML::Node& node);
+	void loadingFinished();
+
+	uint32 pc_gets_status_point(uint16 level);
+	uint32 get_table_point(uint16 level);
+};
+
+extern PlayerStatPointDatabase statpoint_db;
+
 /// Enum of Summoner Power of 
 enum e_summoner_power_type {
 	SUMMONER_POWER_LAND = 0,
@@ -1261,7 +1283,6 @@ void pc_gainexp_disp(struct map_session_data *sd, t_exp base_exp, t_exp next_bas
 void pc_lostexp(struct map_session_data *sd, t_exp base_exp, t_exp job_exp);
 t_exp pc_nextbaseexp(struct map_session_data *sd);
 t_exp pc_nextjobexp(struct map_session_data *sd);
-int pc_gets_status_point(int);
 int pc_need_status_point(struct map_session_data *,int,int);
 int pc_maxparameterincrease(struct map_session_data*,int);
 bool pc_statusup(struct map_session_data*,int,int);

+ 43 - 0
src/tool/csv2yaml.cpp

@@ -343,6 +343,17 @@ int do_init( int argc, char** argv ){
 		return 0;
 	}
 
+	if (!process("STATPOINT_DB", 1, { path_db_mode }, "statpoint", [](const std::string &path, const std::string &name_ext) -> bool {
+		return pc_read_statsdb((path + name_ext).c_str());
+	})) {
+		return 0;
+	}
+
+	if (!process("STATPOINT_DB", 1, { path_db_import }, "statpoint", [](const std::string &path, const std::string &name_ext) -> bool {
+		return pc_read_statsdb((path + name_ext).c_str());
+	})) {
+		return 0;
+	}
 	// TODO: add implementations ;-)
 
 	return 0;
@@ -3666,3 +3677,35 @@ static bool skill_parse_row_createarrowdb(char* split[], int columns, int curren
 
 	return true;
 }
+
+// Copied and adjusted from pc.cpp
+static bool pc_read_statsdb(const char* file) {
+	FILE* fp = fopen( file, "r" );
+
+	if( fp == nullptr ){
+		ShowError( "Can't read %s\n", file );
+		return false;
+	}
+
+	uint32 lines = 0, count = 0;
+	char line[1024];
+	
+	while (fgets(line, sizeof(line), fp)) {
+		lines++;
+
+		trim(line);
+		if (line[0] == '/' && line[1] == '/') // Ignore comments
+			continue;
+
+		body << YAML::BeginMap;
+		body << YAML::Key << "Level" << YAML::Value << (count+1);
+		body << YAML::Key << "Points" << YAML::Value << static_cast<uint32>(strtoul(line, nullptr, 10));
+		body << YAML::EndMap;
+
+		count++;
+	}
+
+	fclose(fp);
+	ShowStatus("Done reading '" CL_WHITE "%d" CL_RESET "' entries in '" CL_WHITE "%s" CL_RESET "'.\n", count, file);
+	return true;
+}

+ 1 - 0
src/tool/csv2yaml.hpp

@@ -423,5 +423,6 @@ static bool read_homunculus_expdb(const char* file);
 static bool mob_readdb_group(char* str[], int columns, int current);
 static bool mob_readdb_group_yaml(void);
 static bool skill_parse_row_createarrowdb(char* fields[], int columns, int current);
+static bool pc_read_statsdb(const char* file);
 
 #endif /* CSV2YAML_HPP */