ブレイクシステム(部位破壊のようなシステム)

ソウル
記事: 10
登録日時: 2016年3月08日(火) 00:31

ブレイクシステム(部位破壊のようなシステム)

投稿記事by ソウル » 2016年3月19日(土) 23:54

モンスターハンターやPSO2の部位破壊のようなシステムをリクエストさせて頂きます。

次のようなシステムを考えているのですが、もっと良い案があれば、改良して頂いて構いません。
ややこしそうであれば、簡略化したシステムでも歓迎いたします。
他に似た素材があれば、紹介して頂ければ幸いです。

【概要】
・ボスクラスの敵がもっている武器とガード(鎧、盾、結界、構えなど)を破壊するシステムです。
・ガードとウェポンを持っているのは、ボス級の敵のみ。

【ブレイク専用スキルについて】
・ガードブレイク :スキル「ガードブレイク」で実行可能。ガードの耐久力を下げられる。
            ガードを崩すと、防御力が下がり、属性の耐性が無くなる。 
・ウェポンブレイク:スキル「ウェポンブレイク」で実行可能。
            敵の最も強力な武器(爪や牙や剣など)を破壊する。敵の攻撃力を下げる。
・ウェポン/ガードブレイク共通:敵の苦手とする武器で攻撃すると、3倍破壊しやすい。
・○○ブレイクには、弱、中、強の3種類があり、威力に応じたTPを消費する。
・武器に新しいパラメーター「破壊力」を追加。
・敵の苦手とする武器を装備していて、破壊力25の武器でウェポンブレイクをした場合の比較。
  ウェポンブレイク弱:消費TP20 威力25ダメージ
  ウェポンブレイク中:消費TP50。威力75ダメージ
  ウェポンブレイク強:消費TP100。威力300ダメージ
・スキルを使用した場合、耐久力以外に、HPに対してのダメージも与える。
・HPに対してのダメージは弱中強に関わらず、通常攻撃と同じダメージとなる。

【耐久力について】
・ガードとウェポンには耐久力があり、0にすると破壊できる。
・耐久力は敵により異なる。 最低50 最高500くらい。 
・ガードとウェポンの耐久力が、ゲージなどの表示で確認できる。
・ガードとウェポンの耐久力は1ターンで5%回復する。

【ドロップについて】
・ウェポンを壊した状態で敵を倒すと、武器の素材をドロップする。
・ガードを壊した状態で敵を倒すと、防具の素材をドロップする。

かなりややこしそうですが、気長にお待ちしておりますので
宜しくお願い致します。

アバター
terunon
記事: 76
登録日時: 2016年2月12日(金) 12:14
お住まい: 熊本県
連絡を取る:

Re: ブレイクシステム(部位破壊のようなシステム)

投稿記事by terunon » 2016年3月20日(日) 13:20

ソウルさん

実装のややこしさに合わせて、少し場合分けさせてください。
【基本部分】
コモンイベントと敵グループのイベントで完結します。


・部位耐久力は変数を使う。敵グループのイベントコマンドで戦闘開始と共に部位の数だけ耐久力、耐久力最大値を変数に代入しておく。
・耐久力の自動回復はターンごとに敵グループのイベントコマンドで 変数 *105/100 で行う。最大耐久力を超えた場合最大耐久力を代入して最大値を超えないようにする。
・ブレイク技(必中)の使用効果にコモンイベントをつけて、耐久力変数を適当な固定値で減算する。(コモンイベントはブレイク技の数だけ作ること)
・0を下回ったら敵グループのイベントコマンドが起動し、敵に弱体化ステート付与とアイテムの入手を行う


【上級者向け】
若干の英語力と、スクリプト的な思考が必要です。


・ブレイク時のアイテムドロップはその場入手でなくドロップ品として入手とする
→プラグイン導入とスイッチを使う
→耐久力が0を下回ったら起動する敵グループのイベントコマンドで、アイテム入手の代わりにスイッチONを行い、プラグインYEP_ExtraEnemyDrop.jsで「スイッチONのときドロップ」と条件付ける。

・ブレイク技を必中じゃなくする
→スキル前後の敵HP変化から命中したか判定を行う
→プラグインBMSP_EventBeforeActionで、ブレイク技使用前にコモンイベントを起動して敵のHPを変数取得。ブレイク技の使用効果の方のコモンイベントで、条件分岐で敵の現在HPが変数取得したHPを下回った場合のみ耐久力の減算を行うようにする。

・武器ごとに個別の破壊力を設定する
→メモ欄の値を変数に取得する
→武器のメモ欄に破壊力を<hogehoge: 25>のように個別に書いておき、ブレイク技の使用効果コモンイベントで破壊力を変数取得:スクリプトで
$dataWeapons[$gameActors.actor(アクターid)._equips[0]._itemid].meta.hogehoge * 1
と打ちメモ欄の値を変数に入れ、
その変数にスキルに応じた倍率をかけたものを耐久力から減算するようにする。
難点:複数人パーティの場合、パーティ人数分同名のスキルを作る必要がある(解決策は一応ありますが、煩雑なのでおすすめしません)

・敵に苦手武器をつくる
→戦闘開始時にイベントコマンドで苦手武器の武器タイプidを変数に代入しておき、ブレイク技の使用効果コモンイベントで武器タイプIDを変数取得:スクリプトで
$dataWeapons[$gameActors.actor(アクターid)._equips[0]._itemid].wtypeId
と打って変数に入れ、その値が苦手武器タイプIDと一致したとき減算する値を3倍にする

こんな感じになるのかなと思います。
この様式でよければ、一度できるところまでお試しくださって、必要に応じて質問いただければと思います。

こういうのではない方法で実装されたい場合は、他の方からのフォローをお待ちください。

制作応援してます。
terunon
絵描いたり、ボカロPしたり、ツクったりしてます。

ツクールMV製ローグライクアクションアドベンチャーRPG/ニコニコ自作ゲームフェス2016敢闘賞作品
『AliasAche:エイリアスエイク』 もりもり公開中です。
紹介ページ→ http://tri-nitroterunon37.wix.com/terunon#!aliasache/fyncb
すぐにブラウザプレイするならこちら→ http://html5.plicy.net/GamePlay/19919
ソウル
記事: 10
登録日時: 2016年3月08日(火) 00:31

Re: ブレイクシステム(部位破壊のようなシステム)

投稿記事by ソウル » 2016年3月21日(月) 03:29

terunonさん

作り方を教えて頂きありがとうございます!
基本部分だけでも、ブレイクシステムと呼べる物ができそうですね。

全体的には試している最中ですが、取り急ぎこの基本部分のシステムを試してみると
敵の耐久力が見えないと、ちょっと分かりにくいと感じましたので、
「敵のHP」と「ウェポンの耐久力」と「ガードの耐久力」を画面のどこかに表示できないか
考えている最中です。
HPゲージを表示するプラグインはどこかで見かけた気がするので表示できるかもしれませんが
独自の耐久力を表示させることは難しいかもしれません。
これができたら、満足のいくものができそうです。
私の方でも、試してみたいと思いますが、うまく表示させる自信はありませんので
耐久力のゲージを表示させる方法を教えて頂ければ幸いです。

宜しくお願い致します。
アバター
terunon
記事: 76
登録日時: 2016年2月12日(金) 12:14
お住まい: 熊本県
連絡を取る:

Re: ブレイクシステム(部位破壊のようなシステム)

投稿記事by terunon » 2016年3月21日(月) 17:13

ソウルさん

>敵の耐久力が見えないと、ちょっと分かりにくいと感じましたので、
>「敵のHP」と「ウェポンの耐久力」と「ガードの耐久力」を画面のどこかに表示できないか
考えている最中です。

これはプラグインをいじる必要がありそうですね…。
ちなみにプラグインに頼らない解決策としては、耐久力の変数が一定値を切ったときに半壊ステートみたいなのを付与したり、文章の表示で「○○の装甲が半壊した!」みたいなのを出すとか、
使用効果コモンイベントのターンを消費しないスキル(プラグインがいくつかでてます)を使って変数の値をを文章の表示で出す「調べる」的なスキルを用意する手があります。

プラグインをいじる場合、どう表示させるかで細かいところが変わってくるので抽象的な説明になってしまいますが、敵HPゲージを表示させるプラグインは(ピクチャなどで装飾されている物でない限り)drawGaugeという命令(rpg_windows.js内で定義されてます)でゲージを出してるはずです。
なので、その類いのプラグインの中身を開いて、drawGaugeが書いてあるところの直下に
真似してdrawGaugeを書けばできると思います。

引数(drawGaugeに渡す値)のうち、x、yで表示位置を変えられ、
rateは $gameVariable.value(変数Aのid)/$gameVariable.value(変数Bのid)とすると、最大耐久力に対する現在耐久力のゲージになります。

わたしも今週なかばあたり時間ができたらそれっぽいサンプルを作ってみようと思いますが、ひとまずは方法の説明まで…。
terunon
絵描いたり、ボカロPしたり、ツクったりしてます。

ツクールMV製ローグライクアクションアドベンチャーRPG/ニコニコ自作ゲームフェス2016敢闘賞作品
『AliasAche:エイリアスエイク』 もりもり公開中です。
紹介ページ→ http://tri-nitroterunon37.wix.com/terunon#!aliasache/fyncb
すぐにブラウザプレイするならこちら→ http://html5.plicy.net/GamePlay/19919
ソウル
記事: 10
登録日時: 2016年3月08日(火) 00:31

Re: ブレイクシステム(部位破壊のようなシステム)

投稿記事by ソウル » 2016年3月22日(火) 02:23

terunonさん

お返事ありがとうございます。
drawGaugeに注目してみたのですが、なかなかうまくいかないので
YEP_X_VisualHpGaugeというプラグインを複製コピーして
YEP_X_VisualBreakHpGaugeという名前にして
ファイルの内容のHPという文字をBREAK_HPに、Hpという文字をBreakHpに置換して
とりあえず、HPゲージを二つ表示させようとしてみたのですが、
どちらか一つなら動作するのですが、両方のプラグインをONにすると

RangeError
maximum call stack size exceeded

というエラーが出てしまいます。
正直、意味が分からないので
他のプラグインを探して試してみようと思っている状況です。
アバター
terunon
記事: 76
登録日時: 2016年2月12日(金) 12:14
お住まい: 熊本県
連絡を取る:

Re: ブレイクシステム(部位破壊のようなシステム)

投稿記事by terunon » 2016年3月22日(火) 11:34

ソウルさん

>YEP_X_VisualHpGaugeというプラグインを複製コピーして
>YEP_X_VisualBreakHpGaugeという名前にして
>ファイルの内容のHPという文字をBREAK_HPに、Hpという文字をBreakHpに置換して
>とりあえず、HPゲージを二つ表示させようとしてみたのですが、

ええっと、実機確認等はまだ出来ておりませんが、
取り急ぎ回答します。(実機確認等必要でしたら今週後半以降までお待ちください)

プラグイン自体を複製する必要はないです。
そちらのエラーはプラグインが複製されたことで似たような処理同士で循環参照(詳細を知りたい場合ググってみてください)が起きたものと思います。

今ご使用のプラグインでしたら、単に一箇所のみ、以下のように書き加えればゲージが増えると思うのですが、どうでしょうか?
変数11(ウェポン最大耐久値)が0でないとき、敵のみ、本来のゲージの30ピクセル下に、変数10/変数11のゲージ、さらにその30ピクセル下に変数12/変数13のゲージが描画される想定です。
actor.isEnemy() という書き方がなんともモヤっときますが……。

Window_VisualHPGauge.prototype.drawActorHp = function(actor, x, y, width) {
width = width || 186;
var color1 = this.hpGaugeColor1();
var color2 = this.hpGaugeColor2();
var rate = this._displayedValue / actor.mhp;
if (Imported.YEP_AbsorptionBarrier && actor.barrierPoints() > 0) {
ww = this.drawBarrierGauge(actor, x, y, width);
} else {
this.drawGauge(x, y, width, rate, color1, color2);
if ($gameVariables.value(11) != 0 && actor.isEnemy()){
this.drawGauge(x, y + 30, width, $gameVariables.value(10)/$gameVariables.value(11), color1, color2);
this.drawGauge(x, y + 30*2, width, $gameVariables.value(12)/$gameVariables.value(13), color1, color2);
}

}
if (Yanfly.Param.VHGShowHP) {
this.changeTextColor(this.systemColor());
this.drawText(TextManager.hpA, x, y, 44);
}
if (Yanfly.Param.VHGShowValue) {
var val = this._displayedValue
var max = actor.mhp;
var w = width;
var color = this.hpColor(actor);
this.drawCurrentAndMax(val, max, x, y, w, color, this.normalColor());
}
};

でも、このプラグイン、_dropSpeedとかを見るに、ダメージとかの変動に対してゲージが若干アニメーションする造りになっているように思えるので、これだけだとアニメーションしてくれないか、どこかでエラーが出るかしそうで怖いですね…。
もうちょっと造りが単純なプラグインだったら実装が楽なのですが。。

このプラグインに対応した形での完全な実装をご所望でしたら、「YEP_X_VisualHpGauge.jsに変数を使ったゲージを追加したい」みたいな形で新しくトピックを立てるのが良いかもしれません。
要望が具体的になるので、プラグイン制作側も何が必要なのかわかりやすいと思いますので…!
terunon
絵描いたり、ボカロPしたり、ツクったりしてます。

ツクールMV製ローグライクアクションアドベンチャーRPG/ニコニコ自作ゲームフェス2016敢闘賞作品
『AliasAche:エイリアスエイク』 もりもり公開中です。
紹介ページ→ http://tri-nitroterunon37.wix.com/terunon#!aliasache/fyncb
すぐにブラウザプレイするならこちら→ http://html5.plicy.net/GamePlay/19919
ソウル
記事: 10
登録日時: 2016年3月08日(火) 00:31

Re: ブレイクシステム(部位破壊のようなシステム)

投稿記事by ソウル » 2016年3月22日(火) 21:17

terunonさん

お返事ありがとうございます。

if ($gameVariables.value(11) != 0 && actor.isEnemy()){
this.drawGauge(x, y + 30, width, $gameVariables.value(10)/$gameVariables.value(11), color1, color2);
this.drawGauge(x, y + 30*2, width, $gameVariables.value(12)/$gameVariables.value(13), color1, color2);
}

を加えてみたのですが、加えない時と何も変わってないように見えました。
私の方で何かミスをしている可能性もありますが、
今のところ、何かミスしている箇所は見当たりません。

>もうちょっと造りが単純なプラグインだったら実装が楽なのですが。。
単純なプラグインでも問題ありません。

HPだけ今のプラグインを使用して、耐久力だけ
他のプラグインを使用するというのでも構いません。

もう少しこのままアドバイスを頂いて、難しそうであれば、
ゲージのみのリクエストをさせて頂こうかと思います。

私の方も、色々と試していきたいと思います。

あと、ツクールの公式ツイッターで知ったのですが
ボカロファンタジー賞をもらったんですよね!?
おめでとうございます!!
アバター
terunon
記事: 76
登録日時: 2016年2月12日(金) 12:14
お住まい: 熊本県
連絡を取る:

Re: ブレイクシステム(部位破壊のようなシステム)

投稿記事by terunon » 2016年3月23日(水) 12:27

ソウルさん

こちらの方で既存プラグインの改造を行ってみました。
キャプチャ.JPG


うちでも使用しているのですが、Enemybars.js
http://forums.rpgmakerweb.com/index.php ... -hp-guage/
というプラグインがありまして、メモ欄で予め指定したエネミーについてHPバーを出すことができます。
こちらを導入し、以下下線部のように変更します。

//FUNCTION: draw the hp guage
Enemy_Bars.prototype.drawBar = function() {
//Go through the enemies and draw the bars
for(var i = 0; i < $gameTroop._enemies.length; i++){
var enemyId = $gameTroop._enemies[i]._enemyId;
var selected = $gameTroop._enemies[i]._selected;
if(BattleManager._phase === "action" || BattleManager._phase === "turn"){
var turn = true
}else{
var turn = false
//console.log(BattleManager._phase)
};

var enabled = false;
var meta = new Array(4);
meta[0] = $dataEnemies[enemyId].meta.hpBar
meta[1] = $dataEnemies[enemyId].meta.hpBarSelectionOnly
meta[2] = $dataEnemies[enemyId].meta.hpBarTurnASelection
meta[3] = $dataEnemies[enemyId].meta.hpBarTurnOnly

if(meta[0]){
enabled = true;
}else if(meta[1] && selected){
enabled = true;
}else if(meta[2] && (selected || turn)){
enabled = true;
}else if(meta[3] && turn){
enabled = true;
}else{
enabled = false;
}

//Current hp
var currentHp = $gameTroop._enemies[i]._hp;
//If the enemy hp is not zero then draw the hp bar
if(currentHp > 0 && enabled){
//Max hp defined from the enemies parameters.
var maxHp = $dataEnemies[enemyId].params[0];
//Rate is the currnet hp compared to the max hp
var rate = currentHp/maxHp;
//Width of the bar
var width = $dataEnemies[enemyId].battlerWidth;
var xOffset = $dataEnemies[enemyId].battlerWidth / 2 + 16;
var x = $gameTroop._enemies[i]._screenX - xOffset;
var y = $gameTroop._enemies[i]._screenY - 32;
//Draw the guage
this.drawIcon(1, x, y+4);
this.drawGauge(x+40, y, width, rate , this.guageColor(rate), this.guageColor(rate));
if ($gameVariables.value(2) > 0) {
this.drawIcon(2, x, y+30+4);
this.drawIcon(3, x, y+60+4);
this.drawGauge(x+40, y+30, width, $gameVariables.value(1)/$gameVariables.value(2) , this.guageColor(rate), this.guageColor(rate));
this.drawGauge(x+40, y+60, width, $gameVariables.value(3)/$gameVariables.value(4) , this.guageColor(rate), this.guageColor(rate));
}
};
};
};

バーのx,y座標はdrawGaugeに入れるx,y座標の情報をx+10みたいにすることでずらすことができ、横に表示するアイコンも
drawIconに対応するアイコンIDを入れれば変更することができます。
ゲージ色は、drawGauge に入れてある this.guageColor(rate) の一つ目が左端の色、二つ目が右端の色を表していて、この二色をグラデーションして表示するしくみになってます。
こちらを変更すれば色変えが可能です。
this.textColor(カラーID) と書き換えれば、制御文字\c[1]とかと同じ色が指定されます。

>あと、ツクールの公式ツイッターで知ったのですが
>ボカロファンタジー賞をもらったんですよね!?
>おめでとうございます!!

ありがとうございます!
これでよりいっそうたくさんの人に楽しんでいただけたらと願います。
terunon
絵描いたり、ボカロPしたり、ツクったりしてます。

ツクールMV製ローグライクアクションアドベンチャーRPG/ニコニコ自作ゲームフェス2016敢闘賞作品
『AliasAche:エイリアスエイク』 もりもり公開中です。
紹介ページ→ http://tri-nitroterunon37.wix.com/terunon#!aliasache/fyncb
すぐにブラウザプレイするならこちら→ http://html5.plicy.net/GamePlay/19919
ソウル
記事: 10
登録日時: 2016年3月08日(火) 00:31

Re: ブレイクシステム(部位破壊のようなシステム)

投稿記事by ソウル » 2016年3月24日(木) 00:51

terunonさん

お返事ありがとうございます。

教えて頂いた通りに試してみると、無事にゲージが表示されました!
最後までおつきあい頂き、本当にありがとうございました!

“MV:プラグイン素材のリクエスト” へ戻る