メルサイア
ユーザー
ドラクエ11裏面が終わり、やっとツクールに戻ろうとしています。
…という話はおいておいて
。
昔のドラクエの作戦って、すごく優秀でしたよね。
昨今のドラクエはともかくとして、
SFC版時代のドラクエは、確かに「AI」と呼んでもいいくらい、キャラに「思考」が感じられました。
私の記憶では、SFCドラクエ5や6のAIが一番優秀だっとことを、今でも思い起こさせてくれます。
(ターン中HPギリギリのところで回復してくれたり、死んだらすぐザオリクを唱えてくれたり…、中村光一さんが現役プログラマーだった時代だからかな…とか)。
お題の件、ツクールのゲームで自動戦闘を使っていて、「もうちょっと〇〇してくれたらいいのに…
」と思う部分、ないでしょうか?
弱い敵ばかりに攻撃したり、回復をあまりしてくれなかったり、補助技は使わず、同じ技ばっかり使って面白みに欠けたり…。
個人的には、他のゲームのAIに比べれば、まだ優秀な方だと思いますが、
せっかくプラグインなどで改良できるのだから、「みんなでもっと賢く改良できるのでは?」と思ってしまいます。
先日、yamachanさんが、アクターの自動戦闘ロジックを、とても分かりやすい解説付きで紹介してくれました。
https://twitter.com/yamachan360/status/902203974769573888
私はロジックを考えるのは好きなのですが、スクリプトはどうしても苦手で、実装には頭を抱えてしまいます。
そこで、味方の自動戦闘をより賢く&面白くアイディアと、それを実現する方法を、皆で考えてみませんか?
良い点、悪い点、改善案、その他思いついたこと、なんでも結構です。
=======以下、アイディアです=====================================
参考までに、言い出しっぺのたたき台として、
ツクールのAIとドラクエのAIの技の選び方を、「評価軸」、「回復」、「命中率」、「分散」、「思考タイミング」の
5点で比較したまとめを書いておきます。
(〇良い点 ●悪い点 ★改善案)
【技の選び方1: 評価軸】
〇「ターゲットをどれだけオーバーキルできるか(ダメージ量そのままではなく、敵の残り体力に対しての比率)」で判断しているため、とどめの一撃に爽快感がある
→ 基本となる計算式: var value = this.makeDamageValue(target, false);
return value / Math.max(target.hp, 1);
〇全体攻撃の場合、全ターゲット分の評価値を足すので、ザコ戦では全体攻撃を使ってくれる可能性が高い(たぶん)
●MP消費、TP消費を一切考えてない。ザコ戦で長期戦を強いられる時は「もったいない」と感じることもあるかも。
(参考)いわゆるドラクエの「ガンガンいこうぜ」の考え方かも。
SFCドラクエの「みんながんばれ」や「バッチリがんばれ」はMP節約を考え、どとめを刺せるダメージギリギリの技を選ぶ
【技の選び方2: 回復】
〇ターゲットの「最大HPの何%が回復できるか」で見ているため、同じ回復量なら最大HPの少ない仲間を回復する
→ 基本となる計算式: var recovery = Math.min(-value, target.mhp - target.hp);
return recovery / target.mhp;
●回復技の分母は最大HPだが、ダメージ技の分母はHPで、かつ回復技はオーバー回復量を考慮していないので
ザコ戦闘など、HPの少ない敵との戦闘では、回復技が選ばれにくい
〇代わりに、HPの多いボス戦や、ダメージの通りにくい敵(例えばメタルスライムとか)では、回復技が選ばれやすい?
●現在HPを見ていないので、瀕死の仲間をよみがえらせる回復技のHP回復量が少なければ、使われない可能性がある
(HPが0の仲間をHP10%で蘇生させる回復技より、他のHP10%の仲間をHP30%に回復させる技が選ばれる?)
(参考)ドラクエの回復魔法の使い方は絶妙。蘇生魔法もいい感じでかけてくれる。どのようにして選ばれているかは不明。
(参考)最近のドラクエでは多少のMP浪費傾向にある(少しでも回復量が多いなら、ベホイムよりもMP消費2倍以上のベホマを使う、など)。
【技の選び方3: 命中率】
●命中率は考慮していない。期待値(ダメージ×命中パーセント)ではなく、実際に試行した時の与えるダメージしか見ていない。
(参考)最近のドラクエは、命中率100%の消費MPの少ない魔法や、消費MP0の息をよく使う。ただこれはかなり機械的で、「面白くない」という声もあるかも?
(参考)SFC版のドラクエも5や6も、命中率を考慮しなかった。ここが「仲間もとどめの一撃をミスって面白い」という声もあった?(SFC版ドラクエ6で「せいけんづき」を使いまくるのはそのため?)
【技の選び方4: 分散】
〇分散値を考慮しているので、分散度の%を大きくすると、同じ技を連発しにくい。(クリティカルは考慮しない)
〇よりランダムに近い、多様な技を使わせたければ、ダメージが似た技をたくさん用意し、分散度の%を高くするとよい。
〇技のTP消費量を段階的に調整すると、TPに応じて自動的にダメージの高いTP消費技を選ぶので、思考しているみたいで楽しい
〇実際に試行して比較するので、分散の%が高いと、試行毎に選ばれる技が変わってくる。
●選んだ技の分散度の%が高すぎる(例えば99%)と、実際に撃ったときは弱い…ということもありうる(ここはご愛敬?)。
(参考)ドラクエが分散値を考慮しているかは不明だが、おそらく考慮済み。おそらく会心を考慮していない点もいっしょ。
(参考)TPの部分はドラクエより優れているかも?
【技の選び方5: 思考タイミング】
●デフォルトだと、ターン開始時に行動をすべて決まってしまっているので、毎回行動時に推論するように変更するとなおよくなる?
●ただし、個々のロジックは非常に、好みも分かれるし、個々のゲームで調整しないといけなくなるかもしれない。
防御や、細かい補助魔法の場合分けは、AI化するよりも、敵グループイベントなどで人間が書くほうが無難かもしれない。
(参考)ドラクエの作戦が心強いのはここ。「めいれいさせろ」よりも強い仲間の援護は、非常に頼もしい。
【その他】
★ダメージ効率や回復効率を重視したロジックが多いけど、「いろいろやろうぜ」や「ガンガン行こうぜ」みたいな
仲間キャラの「面白さ」とか「カッコよさ」とかは考慮できないか?
★仲間に作戦を出せるプラグインを作れば、個別に「わたしのかんがえた最強の作戦」がつくれる??
(参考)ドラクエのAIについて述べられているWiki
http://wikiwiki.jp/dqdic3rd/?%A1%DAAI%A1%DB
(参考)敵AIでは、Trbさんが作ってくれた、「1ターン中に同じスキルは使わない」プラグインがあります。
https://www.dropbox.com/preview/upload/GameEdit_AvoidEnemySameAction_In1Turn.js
=======以下、アイディア、終わり=====================================
長文になって申し訳ないです。間違いなどありましたら、お気軽にご指摘いただけるとありがたいです。
この際、「実現できるか」はどうでもいいです
。
論理思考が苦手な方も、「こんな思考パターンが好きか」とか、「こんな風にしてくれて嬉しかった(経験談)」とか、
「こんな風に考えてくれたらなぁ~」とかでも全然オッケーです
。
どんな些細なことでもいいので、いろいろ楽しく議論できましたらうれしいです。
…という話はおいておいて
昔のドラクエの作戦って、すごく優秀でしたよね。
昨今のドラクエはともかくとして、
SFC版時代のドラクエは、確かに「AI」と呼んでもいいくらい、キャラに「思考」が感じられました。
私の記憶では、SFCドラクエ5や6のAIが一番優秀だっとことを、今でも思い起こさせてくれます。
(ターン中HPギリギリのところで回復してくれたり、死んだらすぐザオリクを唱えてくれたり…、中村光一さんが現役プログラマーだった時代だからかな…とか)。
お題の件、ツクールのゲームで自動戦闘を使っていて、「もうちょっと〇〇してくれたらいいのに…
弱い敵ばかりに攻撃したり、回復をあまりしてくれなかったり、補助技は使わず、同じ技ばっかり使って面白みに欠けたり…。
個人的には、他のゲームのAIに比べれば、まだ優秀な方だと思いますが、
せっかくプラグインなどで改良できるのだから、「みんなでもっと賢く改良できるのでは?」と思ってしまいます。
先日、yamachanさんが、アクターの自動戦闘ロジックを、とても分かりやすい解説付きで紹介してくれました。
https://twitter.com/yamachan360/status/902203974769573888
私はロジックを考えるのは好きなのですが、スクリプトはどうしても苦手で、実装には頭を抱えてしまいます。
そこで、味方の自動戦闘をより賢く&面白くアイディアと、それを実現する方法を、皆で考えてみませんか?
良い点、悪い点、改善案、その他思いついたこと、なんでも結構です。
=======以下、アイディアです=====================================
参考までに、言い出しっぺのたたき台として、
ツクールのAIとドラクエのAIの技の選び方を、「評価軸」、「回復」、「命中率」、「分散」、「思考タイミング」の
5点で比較したまとめを書いておきます。
(〇良い点 ●悪い点 ★改善案)
【技の選び方1: 評価軸】
〇「ターゲットをどれだけオーバーキルできるか(ダメージ量そのままではなく、敵の残り体力に対しての比率)」で判断しているため、とどめの一撃に爽快感がある
→ 基本となる計算式: var value = this.makeDamageValue(target, false);
return value / Math.max(target.hp, 1);
〇全体攻撃の場合、全ターゲット分の評価値を足すので、ザコ戦では全体攻撃を使ってくれる可能性が高い(たぶん)
●MP消費、TP消費を一切考えてない。ザコ戦で長期戦を強いられる時は「もったいない」と感じることもあるかも。
(参考)いわゆるドラクエの「ガンガンいこうぜ」の考え方かも。
SFCドラクエの「みんながんばれ」や「バッチリがんばれ」はMP節約を考え、どとめを刺せるダメージギリギリの技を選ぶ
【技の選び方2: 回復】
〇ターゲットの「最大HPの何%が回復できるか」で見ているため、同じ回復量なら最大HPの少ない仲間を回復する
→ 基本となる計算式: var recovery = Math.min(-value, target.mhp - target.hp);
return recovery / target.mhp;
●回復技の分母は最大HPだが、ダメージ技の分母はHPで、かつ回復技はオーバー回復量を考慮していないので
ザコ戦闘など、HPの少ない敵との戦闘では、回復技が選ばれにくい
〇代わりに、HPの多いボス戦や、ダメージの通りにくい敵(例えばメタルスライムとか)では、回復技が選ばれやすい?
●現在HPを見ていないので、瀕死の仲間をよみがえらせる回復技のHP回復量が少なければ、使われない可能性がある
(HPが0の仲間をHP10%で蘇生させる回復技より、他のHP10%の仲間をHP30%に回復させる技が選ばれる?)
(参考)ドラクエの回復魔法の使い方は絶妙。蘇生魔法もいい感じでかけてくれる。どのようにして選ばれているかは不明。
(参考)最近のドラクエでは多少のMP浪費傾向にある(少しでも回復量が多いなら、ベホイムよりもMP消費2倍以上のベホマを使う、など)。
【技の選び方3: 命中率】
●命中率は考慮していない。期待値(ダメージ×命中パーセント)ではなく、実際に試行した時の与えるダメージしか見ていない。
(参考)最近のドラクエは、命中率100%の消費MPの少ない魔法や、消費MP0の息をよく使う。ただこれはかなり機械的で、「面白くない」という声もあるかも?
(参考)SFC版のドラクエも5や6も、命中率を考慮しなかった。ここが「仲間もとどめの一撃をミスって面白い」という声もあった?(SFC版ドラクエ6で「せいけんづき」を使いまくるのはそのため?)
【技の選び方4: 分散】
〇分散値を考慮しているので、分散度の%を大きくすると、同じ技を連発しにくい。(クリティカルは考慮しない)
〇よりランダムに近い、多様な技を使わせたければ、ダメージが似た技をたくさん用意し、分散度の%を高くするとよい。
〇技のTP消費量を段階的に調整すると、TPに応じて自動的にダメージの高いTP消費技を選ぶので、思考しているみたいで楽しい
〇実際に試行して比較するので、分散の%が高いと、試行毎に選ばれる技が変わってくる。
●選んだ技の分散度の%が高すぎる(例えば99%)と、実際に撃ったときは弱い…ということもありうる(ここはご愛敬?)。
(参考)ドラクエが分散値を考慮しているかは不明だが、おそらく考慮済み。おそらく会心を考慮していない点もいっしょ。
(参考)TPの部分はドラクエより優れているかも?
【技の選び方5: 思考タイミング】
●デフォルトだと、ターン開始時に行動をすべて決まってしまっているので、毎回行動時に推論するように変更するとなおよくなる?
●ただし、個々のロジックは非常に、好みも分かれるし、個々のゲームで調整しないといけなくなるかもしれない。
防御や、細かい補助魔法の場合分けは、AI化するよりも、敵グループイベントなどで人間が書くほうが無難かもしれない。
(参考)ドラクエの作戦が心強いのはここ。「めいれいさせろ」よりも強い仲間の援護は、非常に頼もしい。
【その他】
★ダメージ効率や回復効率を重視したロジックが多いけど、「いろいろやろうぜ」や「ガンガン行こうぜ」みたいな
仲間キャラの「面白さ」とか「カッコよさ」とかは考慮できないか?
★仲間に作戦を出せるプラグインを作れば、個別に「わたしのかんがえた最強の作戦」がつくれる??
(参考)ドラクエのAIについて述べられているWiki
http://wikiwiki.jp/dqdic3rd/?%A1%DAAI%A1%DB
(参考)敵AIでは、Trbさんが作ってくれた、「1ターン中に同じスキルは使わない」プラグインがあります。
https://www.dropbox.com/preview/upload/GameEdit_AvoidEnemySameAction_In1Turn.js
=======以下、アイディア、終わり=====================================
長文になって申し訳ないです。間違いなどありましたら、お気軽にご指摘いただけるとありがたいです。
この際、「実現できるか」はどうでもいいです
論理思考が苦手な方も、「こんな思考パターンが好きか」とか、「こんな風にしてくれて嬉しかった(経験談)」とか、
「こんな風に考えてくれたらなぁ~」とかでも全然オッケーです
どんな些細なことでもいいので、いろいろ楽しく議論できましたらうれしいです。
最後に編集: