投稿記事

ニル 2020/06/22 10:39

スキル計算式とプラグインの話

スキルのダメージ計算に自作関数を

これ自体はより詳しい先人もいらっしゃいますが、
当時自分で何処がよくわからなかった事を思い出して、記事を書いてみます。

スクリプトはまだまだなので、
どこか間違ってたら申し訳ないけど、多分あってる、多分。

うるせえ!サンプルだけよこせ!
って人は一番最後にプラグインが置いてあるんでそちらにどうぞ~


Ci-enのブログ、なんか米印が潰されてしまうので × にしてあります。

作ろうとするスキル

デフォルト
a.atk × 4 - b.def × 2

つくるやつ
(a.atk - b.def × 0.5) × スキル威力

これをベースとします。ツクールのデフォ計算式に近いですね。
スキル威力が1だと、それを丁度4分の1した値となります。
スキル威力4で、デフォの通常攻撃と同じ威力ですね。

0.5の値は相手の防御力影響を決める数値ですね。
ここも例えば貫通率が高いスキル……みたいに変動させたいので、

(a.atk - b.def × 貫通率) × スキル威力

といった感じにします。
これが全ての基礎になる計算式ですね。




次に、運の値を持ってきます。ちょっと複雑なので順を追います。

① 0~自分の運の数値までをランダムで抽選

② 0~相手の運の数値までをランダムで抽選

③ ① - ②

例をあげますかね。
ハロルド君の運は999。スライムの運が10だとします。
この場合、0~999の中で抽選された数値 - 0~10の中で抽選された数値

つまり、答え(ダメージ)は -10 ~ 999 という事になります。

自分の運が高ければ高い程、高いダメージが出やすく、最大値も高い。
但し、相手の運が高ければ高い程ダメージを抑えられる確率も高い。

…という感じですね。式にするとこんな感じになります。

a.luk = Math.floor( Math.random() × (a.luk + 1))
b.luk = Math.floor( Math.random() × (b.luk + 1))

damage = (a.luk - b.luk) × level

このままじゃスキルの計算式には入りませんけどね。
もっと簡潔に書けるかもしれないけど俺は分かりません!



この、基礎となるといった
自分の攻撃・相手の防御から算出するダメージと、
自分の運・相手の運から算出するダメージのを比較し、高い方を取る。
……というのが、今回のサンプル計算式となります。


実際の設定

計算式には

Luk_atk(a, b, 0.5, 1)

という値が入っています。


そして、プラグインファイルには、18行目から

function luk_atk(a, b, perforate, level){

から続く関数が入っています。
ちょっと文字の色に注目して見てくださいね。


luk_atk(a, b, 0.5, 1) ← スキル計算式

function luk_atk(a, b, perforate, level){ ← プラグインの中身の関数


これはスキルで記述した名前(緑の文字)をプラグインから引っ張っています。
そして、()内の青文字は , で区切られて4つの数値が入っています。

スキル計算式の方は
(a, b, 0.5, 1)

プラグインの方は
(a, b, perforate, level)

1~2番目の数値

a と b は、デフォルトの計算式でも用いられている、a.atk や b.def に用いられる情報で、主体と対象の情報です。デフォルトであれば

主体の攻撃 - 対象の防御

というような形になっているわけですね。
今回は a と b という情報だけをプラグインに渡しています。

つまり、HPやら会心率やら、属性有効度やら。

原理とか仕組みとか正直あまり詳しくはわかりませんが、
主体情報・対象情報のデータベースを開く鍵を渡しているようなものです(多分)

3番目の数値

0.5 と  perforate は、貫通率です。
別に元々そういう機能が用意されている、とかいうわけではなく、

スキル計算式の方から、3番目に送った数値が0.5というだけです。
そして、プラグインの方ではその3番目の数値に俺が勝手に
perforate という名前を付けて、貫通率として計算しているだけですね。

4番目の数値

1 と level ですね。

これはスキル威力になっています。
4であればデフォルトの通常攻撃と同じになります。
これも3番目の数値と同様に、俺が勝手に名前をつけただけです。
プレイヤーレベルとちょっと混同しやすいかもしれませんけど。


計算に必要な値の説明や記述

少しわかって来たでしょうか?


スキル計算式の方は
(a, b, 0.5, 1)

luk_atk という関数を参照せよ。その際、4つの情報を持っていけ。

( a = 主体情報, b = 対象情報, 0.5 = 貫通率, 1 = スキル威力)

という感じですね。



そして、プラグインの方は
(a, b, perforate, level)

受け取った4つの値にそれぞれ、
(a,b,perforate, level)という名前を付けて、計算をしていくことになります。



function luk_atk(a, b, perforate, level){
↑ここまで説明が終わりました

{ ← は、これを使って計算するスペースはここからだぜ!ってことですね。
その計算が↓から始まります。

var a_atk = a.atk;
var a_luk = a.luk;


var ← これは変数を作れってこと
var a_atk ← これで、a_atk という名前の変数を作れ
var a_atk = a.atk; ←これでa_atk という名前の変数を作れ。中身はa.atk だ。になります。

元の値を弄ってしまうのは良くないので、a_atkという名のコピーを作っている感じです。これも、名前に関しては俺が勝手に決めています。

仮に var で作った名前が、sasaki であろうと suzuki であろうと中の値に影響はありません。

でも、佐々木や鈴木の中に攻撃力とか運が入ってたら後で見返した時に訳わからんでしょ? っていうだけです。

こうしてコピーを増やした理由は、
例えばダメージ計算の為だけにキャラの攻撃力自体が増えたらバグの温床になってしまうからですね。

今回はa.atk と a.luk の情報が必要なので、それを呼び出し、コピーしています。
以下の記述も概ね同じですね。対象の防御と運をコピーしています。

var b_def = b.def;
var b_luk = b.luk;

最後のこれは、最終的にスキルの方に計算結果であるダメージを返すのですが、
攻撃力側の算出と運側算出を比較するために、こうして先に変数を用意している感じですね。

var damage = 0;
var damage2 = 0;


さて、↓まで説明が終わりました。これでもう半分ですよ!

function luk_atk(a, b, perforate, level){ //スキル計算式から受け取った4つの値を持つ
 var a_atk = a.atk; //a_atk という変数を用意し、a.atkの値を代入
 var a_luk = a.luk; //a_luk という変数を用意し、a.lukの値を代入

 var b_def = b.def; //b_def という変数を用意し、b.defの値を代入
 var b_luk = b.luk; //b_luk という変数を用意し、b.lukの値を代入

 var damage = 0; //damege という変数を用意しておく。中身は0
 var damage2 = 0; //damege2 という変数を用意しておく。中身は0


では続きを行きましょう。

攻撃と防御の計算式

damage = (a_atk - b_def × perforate) × level;

もう何を書いてあるかそろそろわかりますかね?

damage ←さっき作った。中身は0の変数
a_atk ←さっき作った。中身はa.atk つまり主体の攻撃力
a_def ←さっき作った。中身はb.def つまり対象の防御力

perforate ←スキル計算式から受け取った3つめの値。受け取った時点で名前を付けた。中身は 0.5

level ←スキル計算式から受け取った4つめの値。受け取った時点で名前を付けた。中身は 1


damage = (a_atk - b_def × perforate) × level;

damage =(主体攻撃力 - 対象防御力 × 貫通率)× スキル威力
ってことが書いてあるってわけですね。

一番最初にかいた、攻撃と防御からなる基礎計算式はこれで終わりってことです。

運を扱う計算式

では、運を扱う二つ目の計算結果を出しましょう。


var luk1 = Math.floor( Math.random() × (a_luk + 1));

新しく luk1 という変数を作り、その中には
0~主体の運までの乱数値を代入する。

var luk2 = Math.floor( Math.random() × (b_luk + 1));

新しく luk2 という変数を作り、その中には
0~対象の運までの乱数値を代入する。


damage2 = (luk1 - luk2) × level;

damage2 =(0~主体の運までの乱数値 - 0~対象の運までの乱数値) × スキル威力
ってことが書いてあります。

これで二つ目の計算結果も出ましたね。

比較して値を返す

もう終わりですよ!

return Math.max(damage, damage2);

値を返しなさい。大きい方です。(damage,damage2)
と書いてあります。ここまでで、damage には物理部分の算出。
damage2には運部分の算出が出来ているので、それで大きかった方を返します。


}
↑これは呼び出した関数はここまでですよというやつ。これを書いたら、
やっとスキル計算式に戻ります。


これで全部終わりです。最後におさらい。


function luk_atk(a, b, perforate, level){ //スキル計算式から受け取った4つの値を持つ
 var a_atk = a.atk; //a_atk という変数を用意し、a.atkの値を代入
 var a_luk = a.luk; //a_luk という変数を用意し、a.lukの値を代入

 var b_def = b.def; //b_def という変数を用意し、b.defの値を代入
 var b_luk = b.luk; //b_luk という変数を用意し、b.lukの値を代入

 var damage = 0; //damege という変数を用意しておく。中身は0
 var damage2 = 0; //damege2 という変数を用意しておく。中身は0

damage = (a_atk - b_def * perforate) × level; //物理部分の計算式

var luk1 = Math.floor( Math.random() × (a_luk + 1));//新しく luk1 という変数を作り、その中には0~主体の運までの乱数値を代入する。

var luk2 = Math.floor( Math.random() × (b_luk + 1));//新しく luk2 という変数を作り、その中には0~対象の運までの乱数値を代入する。

damage2 = (luk1 - luk2) * level;////運部分の計算式

return Math.max(damage, damage2); //damage, damage2の大きい値を返す

} // luk_atk という関数はここまで。




最後にそのままそっくり置いておきます

https://drive.google.com/file/d/1_4O3YNXNEcHPgvZx-XMlXucj95pg8uyx/view?usp=sharing

サンプルとして説明していたのを加えて、ぱぱっと7つだけ式が入っています。

貫通率が決められる物理攻撃
貫通率が決められる魔法攻撃

運・物理参照攻撃(サンプルと一緒)
運・魔力参照攻撃
運・敏捷参照攻撃

攻撃・魔力参照攻撃(複合ではなく、それぞれ参照しダメージの高い方を取る)
攻撃・敏捷参照攻撃(複合ではなく、それぞれ参照しダメージの高い方を取る)


何かのお役に立てば幸いです。


ちょこっと追記

複合ダメージはどうやりたいかで色々変わってきますが、
記述的にはそう難しいものでもありません。

atk_mat2(a, b, 0.5, 10 , 5)

スキルの方はこんな感じで設定。
貫通率50% 物理部分の威力が10 魔法部分の威力が5です。
仮に物理部分と魔法部分の貫通率も変えたいならさらに値を増やす必要がありますね。


function atk_mat2(a, b, perforate, atk_level, mat_level){

 var a_atk = a.atk;
 var a_mat = a.mat;

 var b_def = b.def;
 var b_mdf = b.mdf;

 var damage = 0;
 var damage2 = 0;

 damage = ((a_atk  -  b_def * perforate) * atk_level) + ((a_mat  -  b_mdf * perforate) * mat_level);

return damage;
} 

レベルをatk_levelとmat_levelという2つパラメータに変更。
物理によるダメージと魔法によるダメージをそれぞれ算出し、最後に加算します。

物理威力が5
魔法威力が2

とか色々変える事が出来ます。
一応、これもテンプレに入れておきます。

ニル 2020/06/21 19:19

Mystic Star その3

砂川赳さん作 MysticStar

ダウンロード・砂川さんのサイトはこちらから
http://newrpg.seesaa.net/category/13166216-1.html


この下はネタバレしていきますよ!
これはネタバレ防止用の画像……


続きです

現在プレイ時間は10時間程です。ちょっと途中放置とかあったかも。
全員21lv付近。

戦闘回数 221 → 392
勝利回数 192 → 325
全滅回数 6   → 11
逃走回数 22  → 56


水の四天王で結構苦戦しました。土IIと光IIを持っていなかったのですが、
5回程負けたので引き返して買いに行きました。

そうしたらアースシールドめっちゃ有能でした。もっと早く買うべきだった。
装備はこんな感じ。別に何か工夫してるわけでもないですね。

地図を手に入れて、船を手に入れて、最初にやったのは水の四天王でした。
lv16で付近の村にいたのですが、
直前の船でも苦戦したので18lvまでレベリングしてました。
そこからはハルトをバーサーカー化させたこともあって比較的なんとかなり、
水の四天王を倒した時点でこの記事を書いています。


スキルはこんな感じ。
前回の方針を引き継いでいますね。

魔珠は結構変わりましたね。こんな感じです。



ハルト

雷魔法I 水魔法I 攻撃I 反撃I TP回復I

注目 暴走 会心II HPII 反撃II 攻撃II 感受II

注目により狙われやすくなり、
物理攻撃を受けると80%で反撃するという構成。
反撃威力を上げる為に常時暴走であり、
被ダメージが増えるので、感受IIによりリカバリーをしやすくしています。
HPII と 攻撃II は役割の補強。改心率も合計23%でそこそこ見れます。

万能ポジから一転。完全に狂戦士。メインアタッカー。

イナーシャ→クリューネ

闇魔法II 炎魔法II 氷魔法I 雷魔法I MP回復I

水魔法II 炎魔法II 雷魔法II 魔力II MP回復I 反撃I

ハルトが完全にアタッカーとして台頭し、毒による安定火力を持つメアと比較し、
イナーシャが微妙な立場に。
水四天王という事で耐性の差もありイナーシャからクリューネになりました。

いわゆる魔人切りである激流衝が中々便利であり、
赤奥義で全体回復である恵みの雨がいざと言うときに心強く、
このままスタメン入りするかもしれません。

メア

氷魔法II 水魔法II 闇魔法I 土魔法I HPI

氷魔法II 水魔法II 光魔法II 土魔法II 攪乱II 持続II

毒が相変わらず強いので、毒成功率と持続力を上げています。
持続IIを活かせるように防御・魔防上昇のバフと、
暗闇と毒付与を扱えるサポ―トキャラになっています。
後は暇になりやすいので状態異常解除も担当。

最初に毒にさせれば仕事の半分は終わり。

サイアス

光魔法I 闇魔法I 風魔法II 慈愛I MP回復II MP回復I

光魔法I 闇魔法I 風魔法II 慈愛I MP回復II MP回復I 無し

安定感ありすぎて珠増やしてたのに付ける事すら忘れてた。

全員に 感受II を装備させれば、
ちょっと頼りない全体回復魔法であるメローブリーズの使い勝手が
大幅に上がりそうだと今更気づいたので、付けてみようかと思っています。

ニル 2020/06/20 17:55

Mystic Star その2

砂川赳さん作 MysticStar

ダウンロード・砂川さんのサイトはこちらから
http://newrpg.seesaa.net/category/13166216-1.html

続きです

現在プレイ時間は5時間程です。全員13lv位。

戦闘回数 221
勝利回数 192
全滅回数 6
逃走回数 22


ハルト

雷魔法I 水魔法I 攻撃I 反撃I TP回復I

TP回復 I・IIと攻撃スキル。
乱真空を連打してましたが、段々と火力不足が目立つように。
飛燕斬空を覚えたら結構変わったので、今は火力・耐久・回復の万能ポジ。

イナーシャ

闇魔法II 炎魔法II 氷魔法I 雷魔法I MP回復I

MP回復IIIまでと、スプレッドアロー。期待してましたが、実は命中難でした。
とはいえ威力は高めでMP回復の合間に使えるのでまぁまぁ。
全体技を連打するPT内のメインアタッカー。

メア

氷魔法II 水魔法II 闇魔法I 土魔法I HPI

毒がめっちゃ強いのは気づいていてイナーシャに連打させていたのですが、
まさかの縦範囲の毒付与攻撃持ち。即主力でした。もはやこれが採用理由。
TPIIまで取って後は適当。氷の全体魔法が一応使えるのも良し。サブアタッカー。

サイアス

光魔法I 闇魔法I 風魔法II 慈愛I MP回復II MP回復I

MP回復IIIまでを取得し、後は適当。申し分ない回復役。
心情的にはロビンを使ってあげたかったが、性能の差は超えられない。
シンセンスが消費5で100以上回復するのが嬉しい。



今のところ出会うボスがどれも手ごたえがあります。
全滅回数の表記が増えるのはアレですが、死んだら街まで戻るので、
それで装備を整えてボスを突破とかも良くある話。

ニル 2020/06/20 11:29

Mystic Star その1

砂川赳さん作 MysticStar

ダウンロード・砂川さんのサイトはこちらから
http://newrpg.seesaa.net/category/13166216-1.html

Twitterで話題になっていたのでプレイしてみました

ちょっとやってみたら面白くてですね。
現在プレイ時間は2時間程です。
ロビンだけ7、後は8lvです。

戦闘回数 102
勝利回数 92
全滅回数 3
逃走回数 7

ハルトはTP回復 I・IIをベースにTP技を連打できるように。
雷魔法I 闇魔法I 水魔法I 攻撃I TP回復I

ロビンはMP回復I・IIをベースに回復技を使いやすくするように。
風魔法I 闇魔法I 光魔法I 慈愛I MP回復I

イナーシャは
闇魔法I 炎魔法I 氷魔法I 土魔法I MP回復I



仲間の数は何人になるんですかねー?
予想では属性の数と同じ8人なんですけど。

(多分)明確な回復役が入っていないので現在は脚の速いロビンを回復役にしています。

……今日は割と連投することになるかもしれない。

追記1

二度目のスケさんめっちゃ強い。
もう10回くらい負けてる。
IIレベル魔法覚えてないから不味いんだろうか。

……と思ったら勝てました。

ニル 2020/06/18 15:23

小説投稿、五日目の結果です

五日目の結果です

今日も12時30分の投稿をしました。

先日と同じく、異世界ファンタジー 更新順 の1ページ目に表示されていた時間は、まるまる30分。

今回はその20分で増えたPVが2!
たまたまかもしれませんし、有難い事に最新話を追ってくれている方が
いらっしゃるので、その兼ね合いもあるかなと思いますが。

一話投稿日 21:30  PV2
二話投稿日 18:31  PV7
三話投稿日 18:31  PV5
四話投稿日 12:30  PV14
五話投稿日 12:30  PV4(今日)

今までは、前回の記事から今回の記事までの変化でしたが、
なんだか段々と分かり難くなって来たので、こういう形に。

現在の各ページのPV割合は、

一話 13
二話 5
三話 7
四話 5
五話 2

……といった感じになっています。

前向き解釈すれば、5名、38%くらいの方が1話を見た後に、
お話を追ってくれている。……ということでしょうか。

本当にありがとうございます!


ともあれこれが多いのか少ないのかわかりませんが、感覚的にはやったぜ!
って手放しに喜ぶような値ではないような気がします。

それでも、二話以降のPVが0祭りというのは、
恐れていた一つの恐れていたケースではあったので、
そうならなかったことを考えれば、やっぱり喜んで良い値……なのでしょうか?


なんで三話が少し多いのかはちょっとわからないのですが、
たまたまCi‐enのPVが多い日だったので、
三話から見てくれた人が居たんですかね……?


そして、有難い事にハートもちょくちょくいただいております。
励みになります!




とか言って、色々巡回させて頂いたり、PV数見たり、
投稿した小説を見返したりと、全然新しく書く事に手が回ってないのですけど。

多分、1章は9話か10話で終わりますが、
それまでは毎日更新を続ける予定だったので、気合を入れないといけませんね。

6話以降は、今後に必要な描写ではあるのですが、
がらりと展開が変わるので、そこでダメだなぁ、
と思う方もでるのではないかと戦々恐々としています。

だけど……ここは外せないしどうにもならないんだよなぁ……。


ともあれ、第五話更新されています

現地主人公の異世界ファンタジー

あの水平線の向こうから
https://kakuyomu.jp/works/1177354054898355406


ご覧いただければとても嬉しく思います。

7 8 9 10 11 12 13

記事のタグから探す

月別アーカイブ

限定特典から探す

記事を検索