Permanent
Creation

RPGツクールXP/VX用のRGSS素材です。
一部英語版対応です。 (A few materials can be used for English RPG MAKER XP/VX.)
競合率はルファーの独断と偏見なのでたまにハズレます。


#==============================================================================
# ■ 敗北ペナルティ
#------------------------------------------------------------------------------
#  エンカウント戦闘や、敗北を許可するイベント戦闘で所持金減少などのペナルティ
# を受けるようにします。
# (C)     ルファー
# WebSite https://tkoolerlufar.pages.dev/
#==============================================================================

=begin
  =対応RGSS
  2

  =他の素材との競合の可能性
  !.. おそらく大丈夫

  =数値の設定項目
  「=」の隣のところに半角で数字 (整数) を入れてください。
  文字色が茶色になっていない場合は全角スペースが入っていないか確認してください。

    * 経験値減少率
    敗北によって減少する経験値の割合です。メンバー全員の経験値が減ります。
    減少する経験値は、倒せなかった敵キャラの
    「経験値」パラメータの合計に比例します。
    百分率 (%単位) で指定してください。

    * 所持金減少率
    敗北によって減少する所持金の割合です。
    これも、倒せなかった敵キャラの「お金」パラメータの合計に比例します。
    百分率で指定してください。

    * アイテム損失確率
    敗北によってドロップアイテムを失う確率です。
    ドロップアイテムを失う確率は、
    倒せなかった敵キャラからドロップアイテムを手に入れる確率に比例します。
    百分率で指定してください。

    * 敗北 ME のボリューム
    敗北したときに鳴らす ME のボリュームです。
    ME を鳴らしたくない場合については後述の「敗北 ME のファイル名」参照。

    * 敗北 ME のピッチ
    敗北したときに鳴らす ME のピッチです。

  =メッセージの設定項目
  「"」で囲まれた紫色の所に書いてください。

    * 経験値損失メッセージ
    経験値が減ったときのメッセージです。
    経験値減少率が 0% のときは意味がありません。
    経験値の数値を入れたいところに「%d」と入れると
    そこに経験値が入ります。
    例:"経験値が %d 減ってしまった!"->「経験値が 100 減ってしまった!」

    * 所持金損失メッセージ
    所持金が減ったときのメッセージです。
    倒した敵から手に入れるお金と相殺します。
    所持金減少率が 0% のときは意味がありません。
    減ったお金を入れたいところに「%s」と入れると
    そこになくした金額が入ります。
    このとき、通貨単位は自動で入ります。
    例:"お金を %s 落としてしまった!"->「お金を 100G 落としてしまった!」

    * アイテム損失メッセージ
    アイテムをなくしたときのメッセージです。
    アイテム損失確率が 0% のときは意味がありません。
    なくしたアイテムの名前を入れたいところに「%s」と入れると
    そこにアイテムの名前が入ります。
    例:"%sを落としてしまった!"->「ポーションを落としてしまった!」

    * 敗北 ME のファイル名
    敗北したときに鳴らす ME のファイル名です。
    鳴らしたくない場合はカラッポ ("") にしてください。

  =フラグ設定項目
  青い文字で「true」または「false」と書いてあるところを書き換えてください。
  true でフラグが立ち、false でフラグが降ります。

    * エンカウント敗北許可フラグ
    エンカウントによる戦闘 (いわゆるザコ戦) で
    敗北を許可するかどうかを指定します。
    フラグを立てるとエンカウントによる戦闘でゲームオーバーにならなくなります。

    * イベントペナルティフラグ
    イベントによる戦闘 (中ボス以上) で負けたときに
    ペナルティを受けるかどうかを指定します。
    フラグを立てるとペナルティを受けるようになります。

  =更新履歴
  2010/10/01 お金の増減メッセージがうまく表示されないバグの修正
  2010/09/30 公開

  =再定義しているメソッド (いずれもエイリアス使用)
  Game_Troop#gold_total
  Scene_Title#battle_test
  Scene_Map#update_encounter
  Scene_Battle#process_defeat

  =新規定義しているメソッド
  Game_Troop#_Lufar_LossPenalty_LostExpTotal
  Game_Troop#_Lufar_LossPenalty_MakeStolenItems
  Scene_Battle#_Lufar_LossPenalty_DisplayExpAndGold
  Scene_Battle#_Lufar_LossPenalty_DisplayLostItems
=end

#----------------------------------------------------------------------------
# ◆ Lufar モジュール
#----------------------------------------------------------------------------
module Lufar
  #--------------------------------------------------------------------------
  # ◆ LossPenalty モジュール
  #--------------------------------------------------------------------------
  module LossPenalty
    #------------------------------------------------------------------------
    # ◎ 設定項目
    #------------------------------------------------------------------------
    LOSS_EXP = 0                              # 経験値減少率
    LOSS_MONEY = 50                           # 所持金減少率
    LOSS_ITEM = 50                            # アイテム損失確率
    MSG_LOSS_EXP = "%d の経験値を損失!"      # 経験値損失メッセージ
    MSG_LOSS_MONEY = "お金を %s 落とした!"   # 所持金損失メッセージ
    MSG_LOSS_ITEM = "%sを奪われてしまった!"  # アイテム損失メッセージ
    FLAG_ENCOUNTER_LOSS = true                # エンカウント敗北許可フラグ
    FLAG_EVENT_PENALTY = true                 # イベントペナルティフラグ
    LOSS_ME = RPG::ME.new(
      "",                                     # 敗北 ME のファイル名
      100,                                    # 敗北 ME のボリューム
      100)                                    # 敗北 ME のピッチ
  end
end
#----------------------------------------------------------------------------
# ◆ Game_Troop クラス
#----------------------------------------------------------------------------
class Game_Troop < Game_Unit
  #--------------------------------------------------------------------------
  # ● 失う経験値の合計計算
  #--------------------------------------------------------------------------
  def _Lufar_LossPenalty_LostExpTotal
    lost_exp = 0
    for enemy in existing_members
      lost_exp += enemy.exp
    end
    lost_exp = lost_exp * Lufar::LossPenalty::LOSS_EXP / 100
    return lost_exp
  end
  #--------------------------------------------------------------------------
  # ● お金の合計計算 (相殺あり)
  #--------------------------------------------------------------------------
  alias _Lufar_LossPenalty_GoldTotal gold_total
  def gold_total(*args)
    lost_gold = 0
    for enemy in existing_members
      lost_gold += enemy.gold
    end
    lost_gold = lost_gold * Lufar::LossPenalty::LOSS_MONEY / 100
    return _Lufar_LossPenalty_GoldTotal(*args) - lost_gold
  end
  #--------------------------------------------------------------------------
  # ● とられるアイテムの配列作成
  #--------------------------------------------------------------------------
  def _Lufar_LossPenalty_MakeStolenItems
    stolen_items = []
    for enemy in existing_members
      for di in [enemy.drop_item1, enemy.drop_item2]
        next if di.kind == 0
        next if rand(di.denominator*100) >= Lufar::LossPenalty::LOSS_ITEM
        if di.kind == 1
          stolen_items.push($data_items[di.item_id])
        elsif di.kind == 2
          stolen_items.push($data_weapons[di.weapon_id])
        elsif di.kind == 3
          stolen_items.push($data_armors[di.armor_id])
        end
      end
    end
    return stolen_items
  end
end
#----------------------------------------------------------------------------
# ◆ Scene_Title クラス
#----------------------------------------------------------------------------
class Scene_Title < Scene_Base
  #--------------------------------------------------------------------------
  # ● 戦闘テスト
  #--------------------------------------------------------------------------
  alias _Lufar_LossPenalty_BattleTest battle_test
  def battle_test(*args)
    _Lufar_LossPenalty_BattleTest(*args)
    $game_troop.can_lose = true
  end
end
#----------------------------------------------------------------------------
# ◆ Scene_Map クラス
#----------------------------------------------------------------------------
class Scene_Map < Scene_Base
  #--------------------------------------------------------------------------
  # ● エンカウントの処理
  #--------------------------------------------------------------------------
  alias _Lufar_LossPenalty_UpdateEncounter update_encounter
  def update_encounter(*args)
    _Lufar_LossPenalty_UpdateEncounter(*args)
    return if $game_player.encounter_count > 0        # 遭遇歩数未満?
    return if $game_map.interpreter.running?          # イベント実行中?
    return if $game_system.encounter_disabled         # エンカウント禁止中?
    troop_id = $game_player.make_encounter_troop_id   # 敵グループを決定
    return if $data_troops[troop_id] == nil           # 敵グループが無効?
    $game_troop.can_lose = Lufar::LossPenalty::FLAG_ENCOUNTER_LOSS
  end
end
#----------------------------------------------------------------------------
# ◆ Scene_Battle クラス
#----------------------------------------------------------------------------
class Scene_Battle < Scene_Base
  #--------------------------------------------------------------------------
  # ● インクルード
  #--------------------------------------------------------------------------
  include Lufar::LossPenalty
  #--------------------------------------------------------------------------
  # ● 敗北の処理
  #--------------------------------------------------------------------------
  alias _Lufar_LossPenalty_ProcessDefeat process_defeat
  def process_defeat(*args)
    if $game_temp.battle_proc.nil?
      unless FLAG_ENCOUNTER_LOSS
        return _Lufar_LossPenalty_ProcessDefeat(*args)
      end
    else
      unless $game_troop.can_lose and FLAG_EVENT_PENALTY
        return _Lufar_LossPenalty_ProcessDefeat(*args)
      end
    end
    @info_viewport.visible = false
    @message_window.visible = true
    unless LOSS_ME.name.empty?
      RPG::BGM.stop
      LOSS_ME.play
      unless $BTEST
        $game_temp.map_bgm.play
        $game_temp.map_bgs.play
      end
    end
    _Lufar_LossPenalty_DisplayExpAndGold
    display_drop_items
    _Lufar_LossPenalty_DisplayLostItems
    if LOSS_ME.name.empty?
      unless $BTEST
        $game_temp.map_bgm.play
        $game_temp.map_bgs.play
      end
    end
    battle_end(2)
  end
  #--------------------------------------------------------------------------
  # ● 獲得・損失した経験値とお金の表示
  #--------------------------------------------------------------------------
  def _Lufar_LossPenalty_DisplayExpAndGold
    exp = $game_troop._Lufar_LossPenalty_LostExpTotal
    gold = $game_troop.gold_total
    gold = 9999999 - $game_party.gold if $game_party.gold + gold > 9999999
    gold = -$game_party.gold if $game_party.gold + gold < 0
    for actor in $game_party.dead_members
      actor.gain_exp(-exp, false)
    end
    $game_party.gain_gold(gold)
    text = sprintf(Vocab::Defeat, $game_party.name)
    $game_message.texts.push((LOSS_ME.name.empty? ? "" : '\|') + text)
    if exp < 0
      text = sprintf(MSG_LOSS_EXP, exp)
      $game_message.texts.push('\.' + text)
    end
    if gold > 0
      text = sprintf(Vocab::ObtainGold, gold, Vocab::gold)
      $game_message.texts.push('\.' + text)
    elsif gold < 0
      text = sprintf(MSG_LOSS_MONEY, sprintf("%d%s", -gold, Vocab::gold))
      $game_message.texts.push('\.' + text)
    end
    wait_for_message
  end
  #--------------------------------------------------------------------------
  # ● 損失したドロップアイテムの表示
  #--------------------------------------------------------------------------
  def _Lufar_LossPenalty_DisplayLostItems
    stolen_items = $game_troop._Lufar_LossPenalty_MakeStolenItems
    for item in stolen_items
      next if $game_party.item_number(item) == 0
      $game_party.lose_item(item, 1)
      text = sprintf(MSG_LOSS_ITEM, item.name)
      $game_message.texts.push(text)
    end
    wait_for_message
  end
end

戻る