ほぼ雑記みたいな内容なんだけど、最重要の本題(一応)はElona関連なので
当記事は、カテゴリーとしては「オフゲ」のElona関連記事とさせてイタダキマス。

 2019/02/03 【Elona】マイツール
 2019/06/06 【Elona】ヘルメスシミュレーター

前に、上記の記事にもしたElona関連の自作ツール(スクリプト)なんだけど…。
支配可能Lv計算機 ヘルメスシミュレーター
要点から先に言うと、この2つには不具合がありました。
いや、不具合っていうとちょっと違う感もあるんだけど…。

どんな不具合があったのかっていうと、数値を入力する箇所において
例えば「070」みたいに頭に意味のない「0」をつけて入力してしまうと
計算結果が派手にバグったりとかしてました。
ヘルメスシミュで速度「070」(潜在400)で祝福ヘルメスを飲んでみても
なぜか61ぐらいまで下がっちゃったりとか。「70」ならちゃんと上がってたんだけど。

現在は修正済みです。
頭に0をつけても意味のないものと認識されるよう変更した、ともいえます。(後述)
実際に修正(アップロード)したのは昨日(05/25)の22:30~22:40頃です。
※ヘルメスシミュの方は修正漏れがあって本日(05/26)21:50頃に再修正シマシタ。
ちなみにElona的名前生成ペット重量計算は特に問題ありません。
なお、私の自作品に関しては、例によって公式への問い合わせとかは絶対にしないで
何かあったら必ず私の方まで連絡をお願いシマス。→連絡先情報

本題(一応)はこれで終了。
詳細は当記事の続き↓で語るけど、特に見なくても問題はありませんヾ(*´∀`*)ノ
JavaScriptの関数の仕様とかの話だから、わかる人にしかわからないですしネ。

実は、先頭についた「0」は、数値としては、人の目で見る限りは意味がないけど
JavaScriptさんにとっては意味がある場合もある0でした。

JavaScriptに限った話じゃないんだけど、人の目には同じ「1」っていう数字に見えても
スクリプトさんには「『1』という”数値”」と「『1』という”文字”」は
まったくの別物としてしか見ることができなかったりします。
このあたりの話は、知らない人からすれば全く掴みどころのない謎感覚だと思うし
私も「そーゆーもの」としか理解してないし、説明は難しいんだけど…(´∀`;)

そして、JavaScriptには、parseIntっていう文字列を数値に変換する関数があります。
入力フォームの”数字”はJavaScriptさんには「文字列」として認識されちゃって
そのままじゃ足し算とか引き算とかの計算(演算)には使えない状態になってます。
そこで、このparseIntを使って「文字列」を「数値」に変換してあげるわけですね。
ちなみにPerlとかではこういった変換処理はしなくて大丈夫だったりします。
[スクリプト]
$a = "2" + 3;
print $a;
exit;

[出力(実行結果)]
5
極論、Perlは、こんなのが普通に通っちゃうような世界っていう…(゚∀゚;)

閑話休題。JavaScriptさんの話を。
先述のparseIntなんだけど、変換元になる「文字列」(引数)を指定する際に
さっき挙げた「070」みたいな、頭に0がついた状態の数字を入力してしまうと
8進数として扱われるとゆー仕様があります。0xで16進数のアレと同じですね。
これはparseIntだけじゃない…どころか、JavaScirptに限った話じゃないっぽいです。
JavaScriptでも、例えば alert("010"); っていうスクリプトを組むと
この場合はもちろん文字列として処理されて「010」って表示されるわけだけど
alert(010); とかやると「8」って表示されたりします。010+5なら13になったり。
※ブラウザによっては挙動が異なるかもしれません。

人の目には意味のない0に見えても、スクリプトさんには意味のある0なんですね。
逆に、0をつけることは明示的に8進数として扱うっていう意味にもなるんだから
私のスクリプトでも「頭に0をつけると結果がおかしくなるという”不具合”」とは
一概には言っちゃいけない気もするんですよね…。
JavaScriptさんや知ってる人からすれば完全に仕様通りの動作っていう。

で、parseIntには第2引数があります。「基数」とゆーモノを設定できます。
…いや、知ってる人からしたら、何を今更、っていう話でしかないだろうけど(ノ∀`;)
基数っていうのは、アレですね。10進数なら10、2進数なら2、っていう、つまり、ソレ。

肝心のparseIntにおける基数の指定は
 num = parseInt("070",10)
こんな感じですね。こうすれば「070」でも「ぜろひゃく、ななじゅう、ぜろ」みたいな
10進法が基準の人間と似たような目線で解釈してくれるようになります。
第2引数は2~36の範囲で指定可能だそうで、例えば parseInt("070",16) にしたら
0x70と同じ意味になって、つまりは10進法における112として扱わたりするわけですね。

ほぼ余談だけど、これはあくまでも「文字列」に対して有効な設定です。
parseInt(070,10)みたいに、ダブル(orシングル)クォーテーションなしにすると
「070」の時点で8進数での入力と解釈されて、結局「56」になったりします。
parseIntの処理が起動する前に頭の「0」が先に処理されちゃう感じかな。
「"070"」という文字列だからこそ「ぜろひゃく」と解釈してくれる感じ。

はい、で、私のスクリプトに関しての本題。
ちゃんと知ってる人はparseIntの第2引数を意味もなく省略したりしないんだろうけど
知らなかったから省略しちゃった人がここにいたっていうだけの話ですヾ(゜∀。)ノ
スクリプト上の修正箇所としてはparseIntに片っ端から「,10」をつけ足しただけデスネ。
[余談]
今までは「8進数」として扱われてた=「8」や「9」は存在しない世界になってたからか
「078」とか「079」とかを入力すると更に派手にバグったりしてました(ノ∀`;)
速度078or079(潜在400)で祝福ヘルメスを使うと速度30ぐらいになったりとか…。


これまた半ば余談だけど、parseIntは「整数」専門なんだけど、似たような関数に
小数も扱える「parseFloat」もあります…が、第2引数がなく、10進法専門みたいです。
※ただし parseFloat("070") ではなく (070) だとやっぱり8進数扱いになります。
頭に0をつけようが0xをつけようが「文字列」としての入力である限り
決して8進数や16進数として扱われたりはしないようです。
…正直、なんで?っていう感じなんだけど…parseIntと違いすぎる…(-∀-;)
JavaScript(のparseFloat)の仕様を決めた人(誰だかは知らないけど)が
10進法以外の小数がメンドイからってこんな仕様にしたんじゃなかろーか…(=∀=;)

で、そのお陰(?)で、私のツール(スクリプト)でも、parseFloatを使ってる部分では
頭に0をつけたりしてもちゃんと10進数として扱われてたりはしたようです。
名前生成は最初からparseIntを使ってない、ってゆーか数値入力箇所自体がないし
ペット重量計算はなぜかparseFloatを使ってたから問題なかったんですね。
重量挙げスキルとかの小数点以下は、ゲームでは重量上限の計算に反映されないから
小数まで細かく入力されると、逆に正しくない結果が出ちゃったりするんだけど…。
これはそのうち修正してオキマス、ハイ(;´∀`)
[2021/05/27 20:50頃追記]修正しました。あと微妙に最適化したりとか。

ただ、ヘルメスシミュは、速度を整数部分と小数部分に分割しての計算が必要で
整数部分(小数点より上(左))の取得にはparseIntを使っちゃってたので…。
(必要数計算機の目標値の部分はparseFloatだけで良かったから問題なかったけど。)
でも、小数部分(小数点より下(右))の部分は、同じparseIntを使ってるのに
なんでかちゃんと「,10」がつけてあったんですよね。なんでだろう…(・∀・;)
ともあれ、速度70.010とかでも、そこに関しては特に問題は出てませんデシタ。

支配可能Lv計算機の方も、各欄において同じ8進数問題がありました。
こっちは最初から整数(主能力"レベル"とスキル"レベル"の参照)を前提とした設計だから
単純にparseIntで組んでたゆえデスネ。むしろなぜ重量計算だけparseFloatだったのか…。

そもそも、この問題(仕様)に気がついたのは、Elonaとは特に関係なくて
AA2Rの関連ツールとして成長シミュとかゆーモノを作ってた時でした。
※AA2R(※たぶん私以外は誰もこうは略さない)自体に関しては別の記事で。
気まぐれで軽く本気で無駄に例外処理とかアレコレ組み込もうとしてたんだけど
テスト中、地味にメンドイくて初期値の「0」を消さないまま「10」を入力しようとして
「010」にしちゃったら自動的に「8」に変換されたりして「あれ?」って(ノ∀`)
結局、0のところにフォーカスが合うと自動的に空欄になるようにしたりしたから
(そして空欄のままフォーカスを外すと自動的に0が入力されるようにもしたり)
意識してわざと入力しない限りは0が頭につくことはなくなったんだけど…。

例によって元々は自分用のつもりだったから表計算ソフトとかでも良かったけど
どうせなら最初からスクリプトとして組んじゃった方が楽かなって。
ぶっちゃけ、着想は某かるくとかだったりしたりしなかったり…(*'ω'*)ナツカシイ…
こっちはあんな高性能じゃないケドネ。限界Seed値用のクラス設定すらナイ。

今更(本当に超今更…)こんなのを作っても私以外の需要はほぼ皆無だろうし
自分の分だけならテキストエディタか何かで手動で計算しても良かったんですよね。
でも、いろんなパターンのビルド(の構想)を試してみたかったっていうのもあるし
そこは、手の込んだ手抜きっていう、いつものアレでヾ(*´∀`*)ノ

…と、本格的に話が逸れてきたし、解説(?)の類はある程度は仕方ないと思うんだけど
記事自体もまた無駄に超長くなっちゃってるので、今回はこのあたりで(ノ∀`)
AA2R(とかElonaとか)の話は、また次の機会に。なお(いつも通り)予定は未定。
前の記事次の記事