diff --git a/conf/inter_athena.conf b/conf/inter_athena.conf
index e60be22ef1..39032f0175 100644
--- a/conf/inter_athena.conf
+++ b/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:
diff --git a/db/import-tmpl/statpoint.txt b/db/import-tmpl/statpoint.txt
deleted file mode 100644
index 7006e04297..0000000000
--- a/db/import-tmpl/statpoint.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-//statpoint per lvl
-
diff --git a/db/import-tmpl/statpoint.yml b/db/import-tmpl/statpoint.yml
new file mode 100644
index 0000000000..04710362e8
--- /dev/null
+++ b/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 .
+#
+###########################################################################
+# Statpoint Database
+###########################################################################
+#
+# Statpoint Settings
+#
+###########################################################################
+# - Level BaseLevel required.
+# Points Total status points given from BaseLevel 1 to 'Level'.
+###########################################################################
+
+Header:
+ Type: STATPOINT_DB
+ Version: 1
diff --git a/db/pre-re/statpoint.txt b/db/pre-re/statpoint.txt
deleted file mode 100644
index 1b3f3d8939..0000000000
--- a/db/pre-re/statpoint.txt
+++ /dev/null
@@ -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
diff --git a/db/pre-re/statpoint.yml b/db/pre-re/statpoint.yml
new file mode 100644
index 0000000000..aac75b3e6d
--- /dev/null
+++ b/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 .
+#
+###########################################################################
+# 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
diff --git a/db/re/statpoint.txt b/db/re/statpoint.txt
deleted file mode 100644
index 5b23299839..0000000000
--- a/db/re/statpoint.txt
+++ /dev/null
@@ -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
diff --git a/db/re/statpoint.yml b/db/re/statpoint.yml
new file mode 100644
index 0000000000..ed8e96a7b6
--- /dev/null
+++ b/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 .
+#
+###########################################################################
+# 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
diff --git a/db/statpoint.yml b/db/statpoint.yml
new file mode 100644
index 0000000000..690192de2e
--- /dev/null
+++ b/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 .
+#
+###########################################################################
+# 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
diff --git a/doc/yaml/db/statpoint.yml b/doc/yaml/db/statpoint.yml
new file mode 100644
index 0000000000..3d5a497082
--- /dev/null
+++ b/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'.
+###########################################################################
diff --git a/src/char/char.cpp b/src/char/char.cpp
index 4711a15ba1..3aea9bfeb3 100644
--- a/src/char/char.cpp
+++ b/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;
diff --git a/src/char/char.hpp b/src/char/char.hpp
index 6db2ea75f1..437095d600 100644
--- a/src/char/char.hpp
+++ b/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;
diff --git a/src/map/atcommand.cpp b/src/map/atcommand.cpp
index 62d7862157..67f3db35c8 100644
--- a/src/map/atcommand.cpp
+++ b/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)
diff --git a/src/map/map-server.vcxproj b/src/map/map-server.vcxproj
index de4e1a2e46..413c533273 100644
--- a/src/map/map-server.vcxproj
+++ b/src/map/map-server.vcxproj
@@ -353,7 +353,7 @@
-
+
diff --git a/src/map/map.cpp b/src/map/map.cpp
index 5313dcd2e8..fd1f81aee8 100644
--- a/src/map/map.cpp
+++ b/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
diff --git a/src/map/map.hpp b/src/map/map.hpp
index 35abfd372f..e678326db5 100644
--- a/src/map/map.hpp
+++ b/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;
diff --git a/src/map/pc.cpp b/src/map/pc.cpp
index 39ed9f4695..7fbead9c1b 100755
--- a/src/map/pc.cpp
+++ b/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++;
- }
- fclose(fp);
- ShowStatus("Done reading '" CL_WHITE "%d" CL_RESET "' entries in '" CL_WHITE "%s/%s" CL_RESET "'.\n", entries, basedir,"statpoint.txt");
+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);
+ }
}
- 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 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;
diff --git a/src/map/pc.hpp b/src/map/pc.hpp
index 25bbb57ce1..5a4f24955c 100644
--- a/src/map/pc.hpp
+++ b/src/map/pc.hpp
@@ -1117,6 +1117,28 @@ public:
extern AttendanceDatabase attendance_db;
+class PlayerStatPointDatabase : public YamlDatabase {
+private:
+ std::unordered_map 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);
diff --git a/src/tool/csv2yaml.cpp b/src/tool/csv2yaml.cpp
index 005448e278..fff1ec2132 100644
--- a/src/tool/csv2yaml.cpp
+++ b/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(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;
+}
diff --git a/src/tool/csv2yaml.hpp b/src/tool/csv2yaml.hpp
index cc0bd92a83..5c4be9b84e 100644
--- a/src/tool/csv2yaml.hpp
+++ b/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 */