経験値計算式を見つけましたが……
分かりやすく可搬性の高い必要経験値計算式はないか。試行錯誤の旅が続いていましたが、ついにバランスよさげな形を見つけました!
次のレベル経験値=(初期値×(1+(1÷(1+(現在レベル+(1÷引数A))×引数B)))^(現在レベル−1)×現在レベル
どこが分かりやすいんじゃ。
この式を見ても、どんなグラフになるのかは皆目見当が付きませんな。やってみるとこんな感じのグラフになります。2レベルに要する経験値が10で、100レベルまでの必要経験値。
- 条件
- 初期値=10
- 引数A=0.1
- 引数B=0.05
現在LV | 累積経験値 | 差分経験値 | 差分倍率 |
---|---|---|---|
1 | 10 | 10 | |
2 | 33 | 23 | 2.25 |
3 | 77 | 45 | 1.99 |
4 | 160 | 83 | 1.85 |
5 | 305 | 145 | 1.75 |
6 | 546 | 242 | 1.67 |
7 | 936 | 389 | 1.61 |
8 | 1544 | 608 | 1.56 |
9 | 2469 | 925 | 1.52 |
10 | 3844 | 1375 | 1.49 |
11 | 5846 | 2002 | 1.46 |
12 | 8705 | 2859 | 1.43 |
13 | 12718 | 4013 | 1.40 |
14 | 18263 | 5546 | 1.38 |
15 | 25817 | 7553 | 1.36 |
16 | 35968 | 10151 | 1.34 |
17 | 49440 | 13473 | 1.33 |
18 | 67116 | 17675 | 1.31 |
19 | 90055 | 22939 | 1.30 |
20 | 119526 | 29471 | 1.28 |
21 | 157030 | 37504 | 1.27 |
22 | 204331 | 47301 | 1.26 |
23 | 263488 | 59157 | 1.25 |
24 | 336887 | 73399 | 1.24 |
25 | 427273 | 90386 | 1.23 |
26 | 537790 | 110516 | 1.22 |
27 | 672011 | 134221 | 1.21 |
28 | 833982 | 161971 | 1.21 |
29 | 1028254 | 194272 | 1.20 |
30 | 1259925 | 231671 | 1.19 |
31 | 1534678 | 274753 | 1.19 |
32 | 1858819 | 324141 | 1.18 |
33 | 2239316 | 380497 | 1.17 |
34 | 2683837 | 444522 | 1.17 |
35 | 3200792 | 516954 | 1.16 |
36 | 3799361 | 598569 | 1.16 |
37 | 4489541 | 690180 | 1.15 |
38 | 5282174 | 792633 | 1.15 |
39 | 6188985 | 906811 | 1.14 |
40 | 7222612 | 1033627 | 1.14 |
41 | 8396641 | 1174029 | 1.14 |
42 | 9725633 | 1328991 | 1.13 |
43 | 11225150 | 1499518 | 1.13 |
44 | 12911789 | 1686639 | 1.12 |
45 | 14803198 | 1891409 | 1.12 |
46 | 16918103 | 2114905 | 1.12 |
47 | 19276327 | 2358224 | 1.12 |
48 | 21898808 | 2622481 | 1.11 |
49 | 24807616 | 2908809 | 1.11 |
50 | 28025969 | 3218353 | 1.11 |
51 | 31578240 | 3552271 | 1.10 |
52 | 35489970 | 3911730 | 1.10 |
53 | 39787876 | 4297906 | 1.10 |
54 | 44499854 | 4711978 | 1.10 |
55 | 49654985 | 5155131 | 1.09 |
56 | 55283534 | 5628550 | 1.09 |
57 | 61416952 | 6133418 | 1.09 |
58 | 68087869 | 6670917 | 1.09 |
59 | 75330094 | 7242224 | 1.09 |
60 | 83178602 | 7848509 | 1.08 |
61 | 91669534 | 8490932 | 1.08 |
62 | 100840178 | 9170644 | 1.08 |
63 | 110728964 | 9888785 | 1.08 |
64 | 121375444 | 10646480 | 1.08 |
65 | 132820283 | 11444839 | 1.07 |
66 | 145105237 | 12284954 | 1.07 |
67 | 158273139 | 13167902 | 1.07 |
68 | 172367876 | 14094737 | 1.07 |
69 | 187434371 | 15066495 | 1.07 |
70 | 203518558 | 16084187 | 1.07 |
71 | 220667363 | 17148805 | 1.07 |
72 | 238928678 | 18261314 | 1.06 |
73 | 258351332 | 19422654 | 1.06 |
74 | 278985073 | 20633741 | 1.06 |
75 | 300880537 | 21895463 | 1.06 |
76 | 324089217 | 23208680 | 1.06 |
77 | 348663442 | 24574226 | 1.06 |
78 | 374656346 | 25992903 | 1.06 |
79 | 402121835 | 27465489 | 1.06 |
80 | 431114561 | 28992727 | 1.06 |
81 | 461689894 | 30575333 | 1.05 |
82 | 493903887 | 32213993 | 1.05 |
83 | 527813247 | 33909360 | 1.05 |
84 | 563475308 | 35662061 | 1.05 |
85 | 600947994 | 37472686 | 1.05 |
86 | 640289793 | 39341799 | 1.05 |
87 | 681559723 | 41269931 | 1.05 |
88 | 724817305 | 43257582 | 1.05 |
89 | 770122526 | 45305221 | 1.05 |
90 | 817535813 | 47413288 | 1.05 |
91 | 867118002 | 49582189 | 1.05 |
92 | 918930306 | 51812304 | 1.04 |
93 | 973034285 | 54103979 | 1.04 |
94 | 1029491816 | 56457531 | 1.04 |
95 | 1088365064 | 58873248 | 1.04 |
96 | 1149716453 | 61351389 | 1.04 |
97 | 1213608636 | 63892183 | 1.04 |
98 | 1280104467 | 66495831 | 1.04 |
99 | 1349266972 | 69162505 | 1.04 |
100 | 1421159322 | 71892350 | 1.04 |
101 | 1495844805 | 74685483 | 1.04 |
式はもっと簡単にできるのかもしれませんが知りません。エクセル上で試しただけです。
メリット
この式には利点があります。
- 上昇停止レベルを定める必要がない
ウィズでは13レベル以降の必要経験値が一定でしたが、それを考える必要がありません。
この式では、レベルが上がるごとに必要経験値の倍率が下がって1倍に近づいていきますが、1倍になることはありません。ですので、必要経験値は必ず前のレベルよりも上がります。もしくは整数に丸めた結果、同じ値になります。
いろいろ無理そうなこと
シンプルでいろいろなパターンに使えて、理解してもらいやすい式は今のところ見つかっておりません。たぶん無理なんだと思います。
上の式はツクールの出力結果を参考に試行錯誤した結果でありまして。ツクールと似てますが違います。
初代ウィザードリィのようなべき乗型を、必要値がレベル2>3の逆転現象なしに一行で表現することは不可能なんでしょうな。つまり、現在Desigeonが採用している「現レベル経験値+基礎値×1.7のNレベル乗」を一行で計算する方法。
数式で表すことは可能だろうけど、プログラム的にはループ処理になるはずです。こいつを一発で計算する方法があったら教えて下さいマシ(数列や行列を処理する関数があったとして、その関数の中でループしてたら一行処理とはみなしません。べき乗除く)。
Desigeonは、レベルアップのたびに必要経験値を保存することで累積の再計算を避け、処理速度の低下を防いでいる。千レベルになったとき、経験値をもらうたびに千回もループしてたんじゃ効率が悪すぎるので。
しかしこの方法には痛いデメリットがあります。
- 誤差が累積する
- レベルの変化が常に+1
- レベルドレインを実装しづらい
- 数レベル分を一気に上げづらい
私からするとウィズに近いこの方式はとてもバランス設計に使いやすい。だから、できれば公式に残したいんだけれども。
今のままではRPGには使いづらいです。
RPGツクールVX
RPGツクールVXの経験値計算式の考え方は、前レベルへの累積という形で計算を繰り返す方式になっているようです。その意味で現在のDesigeonとそれほど変わりません。(ツクールXPでは未確認)
4月5日追記:以下の式はちょっと間違ってます。機会あらばどこかで補足
必要経験値=現レベル経験値+現レベル経験値×(現レベル倍率×倍率A)
- 現レベル経験値=初期値は設定次第。10といった値が割り当てられる
- 現レベル倍率=初期倍率は1
- 倍率A=設定次第。1未満。0.9といった値が割り当てられる
これも一行で計算する方法があるのかもしれないけど、私には分かりません。式は分かりやすい。
その他
高校の時、RPGの経験値計算に興味を持っていれば、数学をもっとたくさん勉強したはずだ。そうなれば理数系に特化した学部に進学して、院に行くか違うところに就職して、結果、こうやってゲームを作ることもなかったに違いない。あれ?
……とにかく、何かいい案があればご一報を。
あと、前の記事ではちょっと勘違いしておりました。必要経験値が前のレベルよりも減るゲームは(例のウィズの3レベルを除いて)おそらくないので、グラフは必ず比例もしくは尻上がり型になります。あとは増え方が速いか、緩いか、というところに違いがあります。ウィザードリィは13レベルまで1.73倍ペースで上昇しますが(下級クラス)、ツクールは2倍くらいで始まって倍率が下降していきます。そういう違いがあるようです。
フリーウェアの『無限の迷宮』では、一気に10万レベルとか上げようとすると判定を止められなくなった記憶があります(実験ではひと晩待って16万レベルまで行きましたが、判定が続いていたので朝になってマシンを落としました)。
無限の迷宮ではレベルが上昇するにつれ、レベルアップの判定処理が重くなるようで、停止ボタン押下を拾うタイミングがシビアになっているせいかも。ひょっとしたら大ループの難しさが出ていたのかもしれません。
実際に10万レベルを上げる機会があるかは別にして、高レベルを想定するDesigeonのようなツールでは、ループに頼らず一行計算できる式を決めておいた方がいいだろうなと。