初めて自分でスクリプトを書いてみた。初心者丸出しのコードのため、処理が重い。しかもエイリアスを使わない再定義だ。理由は、このメソッドなら変更する人少なそうだし、というただの勘。本当はGame_Enemyのinitializeメソッドに、@anger_flag = 0を仕込んである。じゃないと初期値がnilだからエラーを吐く。フラグって表記なのにTrue、Falseでなく数値が入るのは仕様。
ドラクエ10では、敵のHPが一定値を下回ると、その敵は怒り状態になり攻撃力が上がる。怒りは数ターンで自然に静まるが、ロストアタックという特技で強制的に静めることも可能。また、この状態の間は、自分を怒り状態にさせたキャラを狙う。
つまりドラクエ10の再現がしたかったのだが、難しかった。特定アクターを狙うというのが俺には無理だった。たとえば怒りと同時にアクターに狙われ率+100%のステートを付与したら、怒り状態でない敵の標的にもなるし、そもそも相撲要素の無いRPGで集中攻撃は死亡確定のようなもの。というわけで、ただ怒るだけ。怒りはステートに2種類作り、片方はロストアタックで解除出来ない。ドラクエ10ユーザーならお馴染み、ver2.0のラスト戦ヘルバトラーが持つ激怒だ。この間はTPチャージ率3倍にしたが、モンスターにTPの概念を入れるかは未定。HP規定値以下の場合、殴られる度に怒るのは意味がわからないため、クールタイム制にした。なるべく少ないメソッドで作りたかったので、完全にイベントコマンド的な処理になっている。クールタイムはターン制ではなく攻撃回数制。一度怒り状態になった後、解除されても数回攻撃される間は再度怒ることは無い。怒るタイプはHP75%以下、50%以下、25%以下、あとランダム、最後に75%以下で激怒、の5種類した。それぞれ一度しか怒らないようにするか迷ったが、戦闘が長引くと全然怒らなくなるのも変だな、と思ったためにこうした。
#==============================================================================
# ! 怒りステート Ver1.0
#==============================================================================
=begin
ドラクエ10の怒り状態に似た仕様を実装する画期的でもないスクリプ君
エネミーのメモ欄に
<ANGER:2>
これでタイプ2番が適用される<ANGER:3>ならタイプ3番になる。
## 怒りタイプ
1 ランダム ## ダメージを受けた時、ANGER_RATEの確率で怒る
2 半分 ## HPが半分以下になると怒る
3 瀕死 ## HPが25%以下になると怒る
4 短気 ## HPが75%以下になると怒る
5 激情 ## HPが75%以下になると激怒
表記なし ## 怒らない
=end
module GCC
ANGER_STATE = 92 ## 怒りステートのID
RAGE_STATE = 93 ## 激怒ステートのID
ANGER_RATE = 10 ## ランダムで怒る確率。この値に1回の割合。
COOL_TIME = 3 ## 一度怒った後、2+ランダム(この数字未満)の回数は怒らない
end
class RPG::BaseItem
#--------------------------------------------------------------------------
# 怒りタイプ識別
#--------------------------------------------------------------------------
def anger_type
if /<ANGER:(d+)>/ =~ @note
$1.to_i
end
end
end
class Game_Enemy
attr_accessor :anger_flag # フラグ
def perform_damage_effect
@sprite_effect_type = :blink
Sound.play_enemy_damage
if !self.state?(GCC::ANGER_STATE) && !self.state?(GCC::RAGE_STATE) && self.movable?
add_anger_state
self.anger_flag -= 1 if self.anger_flag >= 1
end
end
#--------------------------------------------------------------------------
# !! モンスターの怒り(追加)
#--------------------------------------------------------------------------
def add_anger_state
case self.enemy.anger_type
when 1
if rand(GCC::ANGER_RATE) == 1 && self.anger_flag < 1
add_state(GCC::ANGER_STATE)
self.anger_flag = 2 + rand(GCC::COOL_TIME)
end
when 2
if hp_rate <= 0.5 && self.anger_flag < 1
add_state(GCC::ANGER_STATE)
self.anger_flag = 2 + rand(GCC::COOL_TIME)
end
when 3
if hp_rate <= 0.25 && self.anger_flag < 1
add_state(GCC::ANGER_STATE)
self.anger_flag = 2 + rand(GCC::COOL_TIME)
end
when 4
if hp_rate <= 0.75 && self.anger_flag < 1
add_state(GCC::ANGER_STATE)
self.anger_flag = 2 + rand(GCC::COOL_TIME)
end
when 5
if hp_rate <= 0.75 && self.anger_flag < 1
add_state(GCC::RAGE_STATE)
self.anger_flag = 2 + rand(GCC::COOL_TIME)
end
end
end
end</font>
ドラクエ10では、敵のHPが一定値を下回ると、その敵は怒り状態になり攻撃力が上がる。怒りは数ターンで自然に静まるが、ロストアタックという特技で強制的に静めることも可能。また、この状態の間は、自分を怒り状態にさせたキャラを狙う。
つまりドラクエ10の再現がしたかったのだが、難しかった。特定アクターを狙うというのが俺には無理だった。たとえば怒りと同時にアクターに狙われ率+100%のステートを付与したら、怒り状態でない敵の標的にもなるし、そもそも相撲要素の無いRPGで集中攻撃は死亡確定のようなもの。というわけで、ただ怒るだけ。怒りはステートに2種類作り、片方はロストアタックで解除出来ない。ドラクエ10ユーザーならお馴染み、ver2.0のラスト戦ヘルバトラーが持つ激怒だ。この間はTPチャージ率3倍にしたが、モンスターにTPの概念を入れるかは未定。HP規定値以下の場合、殴られる度に怒るのは意味がわからないため、クールタイム制にした。なるべく少ないメソッドで作りたかったので、完全にイベントコマンド的な処理になっている。クールタイムはターン制ではなく攻撃回数制。一度怒り状態になった後、解除されても数回攻撃される間は再度怒ることは無い。怒るタイプはHP75%以下、50%以下、25%以下、あとランダム、最後に75%以下で激怒、の5種類した。それぞれ一度しか怒らないようにするか迷ったが、戦闘が長引くと全然怒らなくなるのも変だな、と思ったためにこうした。
#==============================================================================
# ! 怒りステート Ver1.0
#==============================================================================
=begin
ドラクエ10の怒り状態に似た仕様を実装する画期的でもないスクリプ君
エネミーのメモ欄に
<ANGER:2>
これでタイプ2番が適用される<ANGER:3>ならタイプ3番になる。
## 怒りタイプ
1 ランダム ## ダメージを受けた時、ANGER_RATEの確率で怒る
2 半分 ## HPが半分以下になると怒る
3 瀕死 ## HPが25%以下になると怒る
4 短気 ## HPが75%以下になると怒る
5 激情 ## HPが75%以下になると激怒
表記なし ## 怒らない
=end
module GCC
ANGER_STATE = 92 ## 怒りステートのID
RAGE_STATE = 93 ## 激怒ステートのID
ANGER_RATE = 10 ## ランダムで怒る確率。この値に1回の割合。
COOL_TIME = 3 ## 一度怒った後、2+ランダム(この数字未満)の回数は怒らない
end
class RPG::BaseItem
#--------------------------------------------------------------------------
# 怒りタイプ識別
#--------------------------------------------------------------------------
def anger_type
if /<ANGER:(d+)>/ =~ @note
$1.to_i
end
end
end
class Game_Enemy
attr_accessor :anger_flag # フラグ
def perform_damage_effect
@sprite_effect_type = :blink
Sound.play_enemy_damage
if !self.state?(GCC::ANGER_STATE) && !self.state?(GCC::RAGE_STATE) && self.movable?
add_anger_state
self.anger_flag -= 1 if self.anger_flag >= 1
end
end
#--------------------------------------------------------------------------
# !! モンスターの怒り(追加)
#--------------------------------------------------------------------------
def add_anger_state
case self.enemy.anger_type
when 1
if rand(GCC::ANGER_RATE) == 1 && self.anger_flag < 1
add_state(GCC::ANGER_STATE)
self.anger_flag = 2 + rand(GCC::COOL_TIME)
end
when 2
if hp_rate <= 0.5 && self.anger_flag < 1
add_state(GCC::ANGER_STATE)
self.anger_flag = 2 + rand(GCC::COOL_TIME)
end
when 3
if hp_rate <= 0.25 && self.anger_flag < 1
add_state(GCC::ANGER_STATE)
self.anger_flag = 2 + rand(GCC::COOL_TIME)
end
when 4
if hp_rate <= 0.75 && self.anger_flag < 1
add_state(GCC::ANGER_STATE)
self.anger_flag = 2 + rand(GCC::COOL_TIME)
end
when 5
if hp_rate <= 0.75 && self.anger_flag < 1
add_state(GCC::RAGE_STATE)
self.anger_flag = 2 + rand(GCC::COOL_TIME)
end
end
end
end</font>
※コメント投稿者のブログIDはブログ作成者のみに通知されます