ページ 11

【解決済み】追加能力値の反撃率について

Posted: 2016年9月05日(月) 00:17
by ビービー
こんにちは。

反撃についてわからない事があるので質問させていただきます。
現在制作中のゲームで、反撃率を100%に設定したアクターが物理攻撃をされた場合、ダメージを受けずに反撃をしているのですが、これをダメージを受けたうえで反撃するようにするにはどのようにすればよいでしょうか?

Re: 追加能力値の反撃率について

Posted: 2016年9月13日(火) 21:57
by ビービー
色々やって見てはいるものの”ダメージを受けたうえで反撃”という事がなかなかできず困っています。
お知恵をお貸しください。

いちおうここまでやってみたことを書いておきます。
rpg_managers.jsをこのように書き換えてみました。

コード: 全て選択

BattleManager.invokeAction = function(subject, target) {
    this._logWindow.push('pushBaseLine');
//    if (Math.random() < this._action.itemCnt(target)) {
//        this.invokeCounterAttack(subject, target);
//    } else if 
// を切り取って、
    if (Math.random() < this._action.itemMrf(target)) {
        this.invokeMagicReflection(subject, target);
    } else {
        this.invokeNormalAction(subject, target);
    }
    subject.setLastTarget(target);
    this._logWindow.push('popBaseLine');
    this.refreshStatus();
};

BattleManager.invokeNormalAction = function(subject, target) {
    var realTarget = this.applySubstitute(target);
    this._action.apply(realTarget);
    this._logWindow.displayActionResults(subject, realTarget);
// ここにコピー
    if (Math.random() < this._action.itemCnt(target)) {
        this.invokeCounterAttack(subject, target);
    }
};
別パターンもやってみました。

コード: 全て選択

BattleManager.invokeAction = function(subject, target) {
    this._logWindow.push('pushBaseLine');
    if (Math.random() < this._action.itemCnt(target)) {
// ここを下の方から持ってきて追加
        this.invokeNormalAction(subject, target);
//-----------------------------------------------
        this.invokeCounterAttack(subject, target);
    } else if (Math.random() < this._action.itemMrf(target)) {
        this.invokeMagicReflection(subject, target);
    } else {
        this.invokeNormalAction(subject, target);
    }
    subject.setLastTarget(target);
    this._logWindow.push('popBaseLine');
    this.refreshStatus();
とやってみて、”攻撃を受けたうえで反撃する”という事自体はこれでできていました。
しかしダメージ表示がおかしく、敵がアクターを攻撃したタイミングで、アニメーションはアクターに表示されるんですがダメージ表示が出ず、その後反撃で受けるはずのダメージ数値が攻撃をしたはずの敵に教示され、そのあとで反撃アニメーションがはじまり何の数値も出ずに終了します。
敵とアクターのHPを見るとダメージ表示がおかしいだけで内部では正常に動作しているようなのです。
ちなみにバトルログも問題なかったです。

どうすればダメージ表示を”最初の攻撃を受けた側””反撃を受けた側”とちゃんと表示できるようになるのでしょうか?
よろしくお願いします。

Re: 追加能力値の反撃率について

Posted: 2016年9月14日(水) 21:28
by 奏ねこま
調べてみました。

どうやらBattleManager.updateActionメソッドは1回の実行につき1体分の処理しか想定しておらず、
invokeNormalActionとinvokeCounterAttackを同時に実行してしまうと
ダメージ表示対象が上書きされたりHPダメージがリセットされてしまったりするようです。

そこで、カウンター発生時はupdateActionを2回実行するようにし、
1回目はinvokeNormalAction、2回目はinvokeCounterAttackを実行するようにしてみました。

コード: 全て選択

BattleManager.updateAction = function() {
    // add start
    if (this._counter) {
        this.invokeCounterAttack(this._counter.subject, this._counter.target);
        this._counter = null;
        return;
    }
    // add end
    var target = this._targets.shift();
    if (target) {
        this.invokeAction(this._subject, target);
    } else {
        this.endAction();
    }
};

BattleManager.invokeAction = function(subject, target) {
    this._logWindow.push('pushBaseLine');
    if (Math.random() < this._action.itemCnt(target)) {
        this._counter = {subject:subject, target:target};   // add
        this.invokeNormalAction(subject, target);           // add
        //this.invokeCounterAttack(subject, target);        // delete
    } else if (Math.random() < this._action.itemMrf(target)) {
        this.invokeMagicReflection(subject, target);
    } else {
        this.invokeNormalAction(subject, target);
    }
    subject.setLastTarget(target);
    this._logWindow.push('popBaseLine');
    this.refreshStatus();
};
addとかdeleteとか書いてあるところが、追加、削除した部分です。
add startとadd endは、その間の行が追加した部分です。
this._counterは新しく追加した変数です。元のBattleManagerにはありません。

以上、まだ微妙に納得しきれない部分がありますが、こんな感じでいかがでしょうか。

Re: 追加能力値の反撃率について

Posted: 2016年9月18日(日) 15:03
by ビービー
調べていただきありがとうございます。

試してみたところダメージを受けたうえで反撃するようにすることができました。
これにて解決とさせていただきます。
本当にありがとうございました。