投稿記事

スキル制作の記事 (4)

まるちゃん 2019/10/17 17:50

ツクールの戦闘不能について

召喚魔法を作りネクロマンサーという職業でアンデットを召喚しようと思いました
しかし、召喚魔法はとても難しかったので断念しました
召喚魔法とはパーティーの中に新たなアクターを加入させるということです
難しかった理由は2つあります

1つめの理由は戦闘メンバーの人数を変えずに作ることが難しかった
僕はスクリプトを作るとき今製作中のゲームだけではなくて
将来作るゲームのためにも汎用性をもたせて作っています
なので戦闘メンバーの数を変えずに作るというルールは曲げたくありませんでした
もし、戦闘中にメンバーを入れ替えるという要素があったとき
召喚魔法を使い戦闘メンバー数を増やして次のターンに移ったとき
召喚したメンバーを控えに入れて新たなメンバーを入れます
このターンも召喚魔法を使い同じことをすれば
全メンバーを戦闘にだすことが可能になります
アクターに召喚されたという記号をつけて人数の数え方を変えるやり方もあります
それでも良かったのかなぁ…

2つ目の理由は召喚する数は1体とは限らないということです
もし召喚魔法を使えるメンバーが2人いて同じ呪文を使ったとき
片方の魔法は成功して、もう片方は失敗するというのは嫌です
同じアクターはパーティーに加入できません
ラルフをパーティーに加入してもう1回ラルフを加入はできません
このラルフはアクター ID が同じなので区別ができないからです
また戦闘中に2回目の召喚魔法が使えないという事態も考えられます
index によって戦闘中は変化させるからいいのかなぁと思いもしましたが
やっぱり不安要素だったのでやめました
スクリプトとしてアクターを複製させたのですがうまくいきませんでした

大きな理由はこの2つです
他の人のスクリプトで召喚魔法ができるかと思ったのですが
やっぱり皆さん苦労しているのか自分は探し出すことができませんでした
なので以下のスキルを作成してネクロマンサーらしくしました
敵全体の戦闘不能なメンバーを復活させ混乱状態にする
スキルの使用条件.txt スキル追加評価.txt のスクリプトを使用します

使用条件:<Condition !$game_troop.dead_members.empty?>
追加評価:<Eval @result.success = true>(やっぱり Eval にした)
使用効果でコモンイベントの呼び出しを行います
最初は追加評価に関数を作ってたのですが対象が戦闘不能な敵全体という
少し特殊な感じだったのでうまくできませんでした

コモンイベントの内容がスクリプトで以下の通り
`
$game_troop.dead_members.each do |enemy|

next if enemy.state?(61)
enemy.hp = 1
enemy.add_state(61)
enemy.hp -= 1

end
`

61 はアンデットとして扱うためのステートです内容は以下の通り
・行動成約が味方を攻撃する
・戦闘不能が無効
・狙われ率が0%
・回復効果率が0%
・物理ダメージ、魔法ダメージがともに0%

enemy.hp -=1 は enemy.die では思った通りの動作が得られませんでした
die をすると clear_states で付加したステートを解除してしまいした
(@states = [] なので無条件で解除)
こうすることでHPは0なのに戦闘不能ではないとなります

これをすると面倒なのが全滅条件が変更してしまうことです
全滅条件は alive_members.empty? となっていて
アンデット(戦闘不能が無効となっているバトラー)は生者として数えられます
残りがアンデットなのに戦闘が終わらないということがあったので
それは面倒なので少し全滅条件を変更しました

全滅条件変更.txt (1.87kB)

ダウンロード

ちょっと挙動がまだ怪しいのでアップローダーではなく一時的に

このとき戦闘不能と戦闘不能が無効(アンデット)との違いについて考えました
アンデットは生きているのか?
alive? の関数があってこれはバトラーが生きているのか判定をします
もちろん false なんですけど true じゃないと行動してくれません
なので生きている判定です
dead? の関数もあります。バトラーが死んでいるかを判定します
死んでるのですけど戦闘不能が無効なので true 判定にします
(今 dead? 関数を変更したところこれで問題なかった。
だけど敵HP表示がされなくておかしなことになっている)
ツクールだとアンデットとは生きていて、かつ死んでいる謎の生物です

ツクールではボスにはステート有効度:[戦闘不能] * 0%をつけると思います
あれ?これはステート無効化:[戦闘不能]と、どう違うのだろうと思いました
スキルとして戦闘不能を付加するときに有効度を0%にする
でも戦闘不能が無効だとHPが0になっても行動してしまう
似ているようでなんか違くて面白なぁと思いました

すげーしょうもないことを今まで考えていたなぁと記事を書いていて思いました
とりあえず、これでスキルは完成(まだ少し残ってるけど)といっていい!
コストを考えていなかった
でもこのスキルを複雑なスクリプトを使うことなくシンプルに作れたので
すげーなぁと思って記事を書きました
でも、しょーもなかったなぁ…

この記事が良かったらチップを贈って支援しましょう!

チップを贈るにはユーザー登録が必要です。チップについてはこちら

まるちゃん 2019/10/15 16:18

ツクールにおける召喚魔法の作成について(敵の数を増やすスクリプトは暫定でおいておきます)

(2019/10/17)諦めました!
こういうスキルを作ることにしました
敵全体の戦闘不能なメンバーを対象にする
それらを復活させてアンデットとする
アンデットは味方をランダムに攻撃する
新しい記事でこれを少しまとめたい


いくつかやるべきことを決めよう
・敵のHP表示の調整(新たに作るかも?)
・召喚魔法の作成
・スキルのアニメーション設定
・敵のステータスの決定(遊びながら作る)
・敵の経験値とゴールドの設定(わからん)
・魔法の装備(遊びながら作る)
・装飾品の作成(これはすぐ作るべき)
・アーティファクトの作成(ダンジョン制覇記念)

アーティファクトについて
ドラクエの賢者の石みたいなすごくいい感じのアイテムだったり
持っているだけでつよつよな感じのやつがほしい
ドロップは固定にするかランダムにするか悩む

変数に最大出現数を設定してモンスターの数を増やします
増やし方は敵グループに設定しているモンスターを適当に

モンスター出現数.txt (2.50kB)

ダウンロード

召喚魔法について悩んでいます。やっぱりほしい
今回のゲームではパーティーの人数は控えを入れないで4人と決めています
しかし、召喚魔法をつくるということはパーティーに1人ついかすることになります
僕はスクリプトを作るとき他のゲームでも使えるように考えながら作成します
そのため今回のゲームではパーティー人数を考慮しなくてよくても
他のゲームで作るとき使用する可能性があるので無視して作りたくありません

戦闘に参加するメンバー数が変化すると起こる問題は
召喚魔法を使用したあとにメンバーの入れ替えをすることで
規定以上のメンバーを無理やり参加させることが可能になることです

そしてもう1つ作るルールとしてはHPをもたないということ
~~タッツウ召喚という特技がテリーのワンダーランドでありました
やっぱりこれもHPを持ちません~~
HPを持つということはステータスとして表示する必要があり
プレイヤーは召喚した対象も死なないように回復魔法をかけると考えます
召喚魔法はバフが乗るものとして考えたほうが面白いのです
Game_Battler をスーパークラスにもつオブジェクトであるべきです
さらに行動順序の決定には俊敏性の情報が必要です
テリワンではタッツウが行動する順番はいつも最後に行われていました

これを許すことができれば楽に作れると思います
ターン終了時に発動する自動スキルを習得するステートを作成すればいいのです
このスキルはコモンイベントを呼び出して擬似的な行動を作成すればよいのです
このとき問題としては複数召喚することができないということです
やっぱりTPをいい感じに増やして複数体召喚できたほうが強くて面白いです

コモンイベントでアクターを追加すればいいと考える人もいます
しかしアクターは区別することができません(たしか)
もし召喚魔法を扱えるアクターが複数いたときバグとなります
冥界にいるアンデットナイトは1人だけだから1体しか召喚できない設定にして
バグではないと主張することはできます
もちろん回避手段として全員召喚魔法が使えたと仮定して
4体分の召喚対象を作ることで回避することはできます
しかし、このやり方だと最大で4体しか召喚できません
いっぱい作っておけば大丈夫だろうという安易な考えに流れてもいいかもしれません
36人召喚対象を作っておいたけれど
意地悪な人がいて37人目の召喚ができませんとか言われるかも?

なんとなくだけど取っ掛かりが見えました
パーティーメンバーは4人しかいないけれど
戦闘に参加できる最大メンバーを8人と決めます
そうして召喚対象は戦闘メンバーとして加算することにします
召喚対象は最大で7体つくれば問題がおきない

でも召喚魔法の魅力は戦闘メンバーを増やせるところにある気がします
これを許せるかどうかが今後の鍵だと思います

【しょうかん】 - ドラゴンクエスト大辞典を作ろうぜ!!第三版 Wiki*
パーティとは別グループとして管理されるらしい
(ドラクエの召喚はHPを持つみたいです)
$game_party と $game_troop があるけれど新たなクラスをつくればいい?
行動決定のときや味方全体、敵全体が対象のときはどうする?
バフだけを受け付けるとかだと面倒だ。一切受け付けないほうが楽
BattleManager の make_action_orders で行動順を決定する

Game_Party に @summons というインスタンス変数を作ることにしました
members のときに @summons を追加することで
戦闘参加人数を変化させることなく召喚魔法を作れます
Game_Party に target_actor という関数があり謎です
これは戦闘中に使用しないで MenuActor で使うみたいなので大丈夫だと思う
うまく仲間に加えることができませんでした

諦めて戦闘メンバーを拡張してコピーを追加する形にしました
`
class Game_Actors
def summon(actor_id)

@data[@data.size + 1] ||= Game_Actor.new(actor_id)

end
end
`
`
class Game_Party
def summon(actor_id)

battler = $game_actors.summon(actor_id)
@actors.push(battler)
$game_player.refresh
$game_map.need_refresh = true

end
end
`

convert Game_Actor into Integer のエラーを吐いてだめでした
戦闘上限を8にして7人のメンバーを作るのは嫌だ
スキルがパワーアップして弱くなるけど2人召喚とかしたい
そうしたら7人加えて、さらに挑発が使えるのも入れたいとかなると
21体のアクターを作るっていうのがかっこ悪い

この記事が良かったらチップを贈って支援しましょう!

チップを贈るにはユーザー登録が必要です。チップについてはこちら

まるちゃん 2019/10/13 20:02

モンスターの配置座標について(今は装飾品を考えてスキルを実装中)

ランダムな対象の修正.txt (ランダムな対象の修正.txt) ダウンロード | VXace スクリプト 【 作成者:まるちゃん 】 | uploader.jp
VXace のデフォルトでは効果範囲をランダムな対象としたときに不具合があります
(僕にとっては不具合で修正するべきものだと思いました)
ランダムな対象のターゲットを作成するときダメージを与える前に
すべての対象を選択してしまうために対象が攻撃で死んでしまうと
ランダムな敵3体に攻撃だったのに2体にしか攻撃しないという事態が起こります
このスクリプトはこれを修正します

今は敵を最大で16体出そうと思ってスクリプトを考えています
モンスターを再配置する.txt (モンスターを再配置する.txt) ダウンロード | VXace スクリプト 【 作成者:まるちゃん 】 | uploader.jp
このスクリプトはデフォルトと同じ座標を取るようになっています
今回はこれを利用して16体の座標をなんとか出力しようと思って考えています
だけど上手くいかなくてどうしようかなぁと思ったので
どうやって出力しているのかまとめようと思いました

VX の敵座標は中心座標を 272 px として敵が5体までのときは
敵と敵との間を 100 px にすることで均等になるように配置しました
敵が6体以上のときは index が 0 のモンスターの X 座標を 50 として
最後の敵の座標を 544 - 50 とすることで均等に分配をしていました

今回は16体を想定しているので2列に分けて作成する予定です
VX の座標を利用して上の列は下の列の間に入れるのでありかなぁ?
でも10体といった偶数になると最後の1体が間に入れる事ができません
下の列を6体として左に詰めて5体、上の列は右に詰めて5体にする
これがすごい面倒だ

VXace ではモンスターの画像の幅を取得することで
モンスターとモンスターの幅が変わります
VX は均等に分けると説明しましたが詳しく言うと
(544 - 50 - 50) / 敵の総数 としたときの数値を間の大きさにしました
VX のほうがわかりやすいのかな?


VXace の敵の配置座標は以前につくったので整理したい
基本幅 = 敵の画像の幅 / 2 + 8
合計幅 = 基本幅 * 2の合計 - 画面の幅
調整幅 = 合計幅 / (モンスターの総数 - 1)

合計幅は 基本幅 * 2の合計 > 画面の幅 のときのみ算出します

index 0 のときのモンスターの X 座標を求めます
調整幅を持つときは index 0 のモンスターの基本幅を X 座標とします
調整幅をもたないとき(基本幅 *2 の合計が画面の幅より小さい時)は
index 0 の X 座標 = index 0 の基本幅 + 合計幅 / 2

index 0 以降のモンスターの X 座標は以下のように算出します
X 座標 = 左隣の X 座標 + (左隣の基本幅 + 自身の基本幅 - 調整幅)


これを利用して2列のモンスター配置を考えると
画面の幅を2列めは 416 (適当に決めた)にして考えれば良さそう?
モンスターの総数は列の総数と考えるべきでしょう
基本幅に 416/544 倍率として考えればいけるかも?
だけど10体といった偶数となったとき列はひし形の形を取ります
下の列の一番右と上の列の一番左が空白となる
でもモンスター画像の幅から算出しているのを考えると少しずらすというのが難しい
それだったら VX のようにモンスターの画像の幅に影響を受けない形がよさそうだ


VX の敵配置の座標
1体 272
2体 222, 322
3体 172, 272, 372
4体 122, 222, 322, 422
5体 72, 172, 272, 372, 472
6体 50, 139, 228, 317, 406, 495
7体 50, 124, 198, 272, 346, 420, 494
8体 50, 114, 178, 242, 306, 370, 434, 498

敵が5体以下のとき
X 座標 = 272 + ( enemy.index * 2 - @enemies.size + 1) * 50
272 は Graphics.width / 2 という意味です。画面の中心座標です

敵が6体以上のとき
X 座標 = 50 + enemy.index * 444 / ( @enemies.size - 1 )
444 は 544 - 50 - 50

敵が10体のときはこうする
上の列:95, 184, 273, 362, 451
下の列:50, 139, 228, 317, 406(, 495)

上の列の X 座標
(50 + 139) / 2 = 94.5
(139 + 228) / 2 = 183.5
(228 + 317) / 2 = 272.5
(317 + 406) / 2 = 361.5
(406 + 495) / 2 = 450.5

多分これが一番やりやすいんじゃないのかなぁ…
でも6体目以降の座標の幅がきれいじゃなくて好きじゃない

数字的な綺麗さを追い求めるのをやめました
座標では小数点を表示しきれないからいい感じにしたかったの
でもそれほど悪くなかったから諦める
モンスター同士の間を以下のように求めました
width = [(Graphics.width / 2 - 50) / (@enemies.size - 1), 50].min
-50 は index 0 の X 座標を 50 と考えているからです
X座標 = Graphics.width / 2 + (index * 2 - @enemies.size + 1) * width
Y座標 = 288 - 32 * (index % (@enemies.size / 8 + 1))

モンスターの最大出現数は1種類に付き26です(アルファベットがつくから)
面倒だから最大出現数を24にしてしまいました

HPゲージはプチレアサイトのやつを使っているのでちょっと変になってます
enemy.screen_y を参照すればいいだけなのでそう難しくありません
意外と面倒そうだ。Sprite で管理をしている

Win + Shift + S キーでスクリーンショットができるみたいだ(Win10)
Alt + Print Screen でツイッターとかで貼り付けすると簡単にできる

この記事が良かったらチップを贈って支援しましょう!

チップを贈るにはユーザー登録が必要です。チップについてはこちら

まるちゃん 2019/08/16 17:05

自動戦闘を効果的にするルールのもとのスキル制作

前回の記事で、今も更新しているんですが
自動戦闘の難しさを改めて痛感しました
何度か作っていてそのたびに気づかなかったことに気付かされます
ゲーム業界界隈では評価関数という呼び方をしてドラクエが有名です
いくつか調べたのですがそこまで高級なプログラムはほしくないという感想です
高級と感じるのはこのターン以降も考えているという点です

敵が最大ダメージで攻撃したときにパーティーが全滅するまでのターンと
パーティーが攻撃して敵を倒せるまでのターンを考慮して
回復するべきか攻撃するべきかを考えているみたいです
自分としてはこのターンに効果的な回復ができればいいという浅い考えでした
専門的なことを言うとゲーム木をつくり探索するというのが必要みたいです
自分は構造体が本当にだめで赤黒木?とか言うのを学んだのですが全然だめでした
読んでいたわかりやすかったのがこれでした
ドラクエ4の戦闘のAIが知りたい
この質問ではステートによるバフを戦闘時間の長さで考えるみたいです
毒になっても戦闘時間が短ければ解除する必要がないみたいなことだと思います

ここまで出来るとステートの評価も自動にできてより楽に遊べて楽しいと思います
だけど自分ではこれができるようには思えなくて悔しいです
言っていることは何となく分かるけど作れないみたいな

自動戦闘.txt (6.84kB)

ダウンロード

とりあえず暫定の自動戦闘をアップロードします

自分はこれ以上はもう無理だと思い、他に理由を探しました
ヴァンパイアと戦い思うことはブリザードⅡを連続で使うのやめろよ!!!
そのせいで自動戦闘がおかしな動きしているように見えるんだ
じゃぁ敵の行動を弱くしようと思い
モンスターのAI(と呼んでいいの?)をつくりました
これは完成しているのでメインのアップローダーに保存しました
モンスターAI


自分が作った自動戦闘で守るべきルールは4つ
○ MP を消費するスキルを回復とダメージだけにする
○ 自動戦闘で選択されるスキルはMPを消費するものだけ
○ TP を消費するスキルで MP を回復できるようにする
○ TP を消費するスキルはプレイヤーの判断が必要なもの

今回の自分のゲームでは3次職まで作りそれぞれ
レベル100、300で転職できるようにしようと思います
また自動発動スキルを作りバフやデバフをこれに振り分け戦闘を楽にしました
自動発動スキルとは戦闘開始、ターン開始、ターン終了に通常の行動に加えて
確率で行動が発生するスキルのことを言います

MP 消費スキルは体系的にまとめて好きなように職業に振り分ける予定です
しかし TP 消費スキルはどの職業も2つを上限として作りました
MP 消費スキルは以下のようなものがあります
属性魔法、魔法剣、暗黒魔法、神聖魔法、呪術、武技、連撃
TP 消費スキルにダメージスキルもありますがコモンイベントを使用するので
スクリプトにすればいいんだけど面倒だからしてなくて、いや言い訳か…
ランダム要素があるので TP 消費スキルにしました
また強いスキルなので MP を消費して連打するということもしてほしくなかった

戦士

・(自動発動:戦闘開始/50%):敵全体を攻撃する
・(自動発動:ターン終了/25%):次のターン攻撃回数が1増える

戦士の上級職

ウォリアー

・力を貯める(30):攻撃力が大幅に上がる。SPが回復する
・(自動発動:ターン終了/25%):ランダムな敵を1体攻撃する

騎士

・(10):このターン狙われ率があがる
・(自動発動:ターン終了/25%):物理ダメージが大幅に減少する

ウォリアーの上級職

魔法剣士

・(100):魔法剣をランダムに4回使用する
・(自動発動:ターン開始/25%):このターン魔法を反射する

バーサーカー

・(100):武技をランダムに4回使用する
・(自動発動:ターン終了/25%):次のターン2回行動する。自動戦闘

騎士の上級職

暗黒騎士

・(75):自身のライフが減る。暗黒魔法をランダムに4回使用する
・(50):自身のライフが減る。攻撃力、魔法力が大幅に上昇する。
すべての自動再生がつく

パラディン

・(自動発動:ターン開始/25%):味方全体は防御状態になる
・(50):HP が自動回復。状態異常を防止する

僧侶

・(25):味方単体の状態異常をすべて治療する
・(50):味方全体の状態異常をすべて治療する
まだ考え中。全体の状態異常をすべて治療するは強すぎる?

僧侶の上級職

プリースト

・(25):5ターンの間、味方全体をHP自動回復状態にする。
・(100):味方全体のSPの25%を回復する。

モンク

・(自動発動:ターン終了/25%):次のターンまで攻撃をキャンセルして反撃する
・(25):連撃をランダムに2回使用する

プリーストの上級職

ビショップ

・(100):10ターンの間、味方全体の防御力と魔法防御を大幅に上げる。
・(50):味方単体を全回復する(戦闘不能を解除する)

ドルイド

・(25):MP を自動回復。能力低下を防止、能力上昇無効を無効
・(50):TP 自動再生。最大 HP、俊敏性、運を大幅に上昇する
まだ微妙な職業

モンクの上級職

ゴッドハンド

・(25):自身にすべての自動再生がつく
・(50):次の攻撃回数が3回増える。狙われやすくなる

阿修羅

・(自動発動:ターン終了/25%):TP が増える。攻撃力と俊敏性が上がる
・(50):連撃を5回使用する

盗賊

・(自動発動:ターン開始/25%):敵全体を暗闇状態にする
・(自動発動:ターン終了/50%):次のターンまで、俊敏性が3倍になる

盗賊の上級職

ローグ

・(自動発動:ターン終了/100%):死んでいたら残り HP 1 で復活。次のターンまで、俊敏性が3倍になる
・(25):ランダムな消費アイテムを入手する

スカウト

・(自動発動:ターン終了/50%):隠れる。ダメージを受けると解除される
・(25):隠れているとき使用可能。敵全体をスタン状態にする。隠れ状態を解除する

ローグの上級職

吟遊詩人

・(50):ランダムなステータスの2つを大幅に上昇させる
・(25):ランダムな歌を歌う。HP 回復、MP 回復、TP 回復のどれか

トリックスター

・(100):味方全体はこのターンの間、2回行動する。自動戦闘
・(50):味方全体の自動発動スキルの確率が上昇する

スカウトの上級職

レンジャー

・(100):攻撃力と防御力を大幅に上昇する。HP と MP に自動回復
未定

アサシン

・(25):隠れているとき使用可能。味方単体に大ダメージ。隠れ状態を解除する
・(自動発動:ターン終了/25%):隠れているとき、ランダムな敵2体に攻撃する

魔法使い

・(25):MP の 25 %を回復する
・(20):潜在能力を開放し新たな魔法を習得する
職業によって習得できる魔法が異なる
MP を消費する魔法で大体は次のランクのものが習得できる

魔法使いの上級職

ウィザード

・(50):習得している魔法を3回唱える
・(40):魔法力が大幅に上昇する。MP の 25 %を回復する
2つ目のスキルが少し微妙

ソーサラー

・(50):敵単体にすべての能力低下の呪いをかける
・(25):敵単体の MP の 50 %を吸収する

ウィザードの上級職

アークメイジ

・(50):MP を全回復する
・(50):魔法力が2倍になる。消費コストが2倍になる

錬金術師

・(50):ランダムなアイテムを5個生成する。戦闘終了時に破棄される
HP、MP、TP の全体回復。単体の復活。味方全体の状態異常をすべて治療
・(自動発動:ターン終了/50%):このターンの間、味方全体に薬の知識

ソーサラーの上級職

ネクロマンサー

・(25):敵全体に復活魔法。復活した敵は敵を攻撃する
・(25):敵全体に MP ダメージ。ランダムな状態異常を付与
今書いてみると意外と微妙そう
1つ目のスキルがうまくいかないときは不死のスケルトンナイトを召喚する

賢者

・(100):習得しているすべての魔法を5回使用する
・(100):新たな魔法を作り出す
味方全体にすべての自動再生。状態異常防止
すべての能力上昇をつける。能力低下を防止する
敵全体にすべての状態異常と能力低下をつける

2つ目が難しい。こういう感じにしたい。でもこれは MP を消費する分類にならない
かといってランダムに選択されるのも嫌だ
賢者はすべての魔法を習得するものということで回復魔法も使える
すべての魔法を5回使用するはどうなるかわからない


とりあえず長くなりましたがすべてのスキルを書きました
他の人のゲーム制作のヒントとなれば幸いです
レンジャーのスキルが決まらない…
決まっているのは妖精たちのポルカというドラクエ10のスキルです
なにか思いつくかなぁと思ってたら駄目なところだけわかってしまった

この記事が良かったらチップを贈って支援しましょう!

チップを贈るにはユーザー登録が必要です。チップについてはこちら

月別アーカイブ

限定特典から探す

記事を検索