RGSS小ネタ集


沈黙の修正Renew
戦闘不能表示の修正
スクリプトでコモンイベント
ピクチャー拡張
スクリプト行数削減
文字色追加の注意点
ダメージの処理でSPを
データベースの限界突破



・沈黙の修正
スクリプトとして公開してみました


・戦闘不能表示の修正  毒とかいろいろなステートを喰らいつつ戦闘不能になると[戦闘不能/毒]などと表示されるが、これを純粋に  [戦闘不能]だけに変える方法・・・ Window_Baseの194行目の

self.contents.draw_text(x, y, width, 32, text)

if actor.hp == 0
  self.contents.draw_text(x, y, width, 32, "[" + $data_states[1].name +"]")
else
  self.contents.draw_text(x, y, width, 32, text)
end
にするだけ。 オマケでツクールVXでの修正 Window_Baseの194行目の278〜282

for state in actor.states
  draw_icon(state.icon_index, x + 24 * count, y)
  count += 1
  break if (24 * count > width - 24)
end

if actor.hp == 0
  draw_icon($data_states[1].icon_index, x, y)
else
  for state in actor.states
    draw_icon(state.icon_index, x + 24 * count, y)
    count += 1
    break if (24 * count > width - 24)
  end
end
にするだけ。 ※他にステートの表示系を変更するスクリプトを使っている場合で、『ステートの描画』部分を変更している  場合そちらのスクリプトも変更する必要があります。 改編履歴 '08:09:10 戦闘不能時に『戦闘不能』を表示させるのではなく、『戦闘不能ステートの名前』を表示させるように変更 '09:11:21 ツクールVXの場合の対処を追加
・スクリプトでコモンイベント  RGSSでコモンイベントを操作する場合

common_event = $data_common_events[n]
$game_system.map_interpreter.setup(common_event.list, 0)
と入力する。薄緑色の部分でコモンイベントの番号を入力。 ↓オマケ↓ イベントのスクリプトで行う場合。(ってか普通にコマンド使えよ!)

common_event = $data_common_events[n]
setup(common_event.list, 0)

・ピクチャー拡張  ピクチャーの表示機能を使ってゲームオーバー画面、タイトル画面を表示する方法。  (これでゲームオーバー画面やタイトル画面を態々ピクチャーにインポートしなくてすむ。) Sprite_Pictureのフレーム更新を以下のように変更する

  #--------------------------------------------------------------------------
  # ● フレーム更新
  #--------------------------------------------------------------------------
  def update
    super
    # ピクチャのファイル名が現在のものと異なる場合
    if @picture_name != @picture.name
      # ファイル名をインスタンス変数に記憶
    @picture_name = @picture.name
      # ファイル名が空でない場合
      if @picture_name != ""
        # ピクチャグラフィックを取得
        if $game_variables[50] == 1
          self.bitmap = RPG::Cache.gameover($data_system.gameover_name)
          $game_variables[50] = 0
        elsif $game_variables[50] == 2
          self.bitmap = RPG::Cache.title($data_system.title_name)
          $game_variables[50] = 0
        else
          self.bitmap = RPG::Cache.picture(@picture_name)
        end
      end
    end
   〜以下略〜
これで変数50番に1を入力してピクチャーの表示(画像は何でもいい)を使用することでゲームオーバー画面、 2を入力して同じように使用するとタイトル画面を表示することが可能です。また、移動、回転などの処理も 使え、態々変数を0に戻す必要もありません。 ※バトラーとかも表示させたい場合も・・・いろいろ変更すれば一応実現可能のハズ。 ※また、変数50はお好みで変更してください。
・スクリプト行数削減  1部分だけが違い後は同じような記述が続くような場合の行数削減方法 例

# 防具でこの属性が防御されている場合の計算
for i in [@armor1_id]
  armor = $data_armors[i]
  if armor != nil and armor.guard_element_set.include?(element_id)
    for j in armor.guard_state_set
      if $data_states[j].name =~ /^#{element_name}([0-9]+)(%|%)/
        rate1 += $1.to_i
      end
    end
    for j in armor.guard_state_set
      if $data_states[j].name =~ /^#{element_name}マイナス/
        rate1 *= -1
      end
    end
  end
end
 
for i in [@armor2_id]
  armor = $data_armors[i]
  if armor != nil and armor.guard_element_set.include?(element_id)
    for j in armor.guard_state_set
      if $data_states[j].name =~ /^#{element_name}([0-9]+)(%|%)/
        rate2 += $1.to_i
      end
    end
    for j in armor.guard_state_set
      if $data_states[j].name =~ /^#{element_name}マイナス/
        rate2 *= -1
      end
    end
  end
end
 
for i in [@armor3_id]
  armor = $data_armors[i]
  if armor != nil and armor.guard_element_set.include?(element_id)
    for j in armor.guard_state_set
      if $data_states[j].name =~ /^#{element_name}([0-9]+)(%|%)/
        rate3 += $1.to_i
      end
    end
    for j in armor.guard_state_set
      if $data_states[j].name =~ /^#{element_name}マイナス/
        rate3 *= -1
      end
    end
  end
end
    
for i in [@armor4_id]
  armor = $data_armors[i]
  if armor != nil and armor.guard_element_set.include?(element_id)
    for j in armor.guard_state_set
      if $data_states[j].name =~ /^#{element_name}([0-9]+)(%|%)/
        rate4 += $1.to_i
      end
    end
    for j in armor.guard_state_set
      if $data_states[j].name =~ /^#{element_name}マイナス/
        rate4 *= -1
      end
    end
  end
end
↑のプログラムと↓のプログラムは同じ結果を示します。

list = [@armor1_id, @armor2_id, @armor3_id, @armor4_id]
 
# 防具でこの属性が防御されている場合の計算
for h in 0..3
  for i in [list[h]]
    armor = $data_armors[i]
    if armor != nil and armor.guard_element_set.include?(element_id)
      for j in armor.guard_state_set
        if $data_states[j].name =~ /^#{element_name}([0-9]+)(%|%)/
          rate[h] += $1.to_i
        end
      end
      for j in armor.guard_state_set
        if $data_states[j].name =~ /^#{element_name}マイナス/
          rate[h] *= -1
        end
      end
    end
  end
end
う〜〜ん、スッキリ。 要は『違っている』部分だけを配列に格納してそれをfor文やwhile文などに使えばいいんです。
・文字色追加の注意点 RGSSではWindow_Baseの文字色に変更を加えただけでは文字色が追加されません。(Window_Messageの部分で 規制があるため) そこで、忘れないうちに以下のように変更を加えましょう。 〜Window_Message〜
〜略〜
        # \C[n] の場合
        if c == "\001"
          # 文字色を変更
          text.sub!(/\[([0-9]+)\]/, "")
          color = $1.to_i
          #if color >= 0 and color <= 7
            self.contents.font.color = text_color(color)
          #end
〜略〜
〜Window_Base〜
  #--------------------------------------------------------------------------
  # ● 文字色取得
  #     n : 文字色番号 (0〜14)
  #--------------------------------------------------------------------------
  def text_color(n)
    case n
    when 0
〜略〜
    else    #Normal_Color!!
      return normal_color
    end
  end
これで後はWindow_Baseに自由に色を追加していけばOKです。
・ダメージの処理でSPを ダメージの処理でSPにもダメージ(回復)を表示させたい場合の処理。 (※でもこれを入れるとSPダメージとかも欲しくなるんだよね・・・)  →SPダメージは他のサイトから探してください。(ちょっと待ちなさい・・・) 〜Interpreter (分割定義 7)〜
module DIAMOND
  # ダメージの処理のSP版のためのスイッチ番号
  SP_DAMAGE = 24
end
〜略〜
  include DIAMOND
  #--------------------------------------------------------------------------
  # ● ダメージの処理
  #--------------------------------------------------------------------------
  def command_338
    # 操作する値を取得
    value = operate_value(0, @parameters[2], @parameters[3])
    # イテレータで処理
    iterate_battler(@parameters[0], @parameters[1]) do |battler|
      # バトラーが存在する場合
      if battler.exist?
        if $game_switches[DIAMOND::SP_DAMAGE] == true
          # SP を変更
          battler.sp -= value
        else
          # HP を変更
          battler.hp -= value
        end
        # 戦闘中なら
        if $game_temp.in_battle
          # ダメージを設定
          if $game_switches[DIAMOND::SP_DAMAGE] == true
            battler.SPダメージとして使用している変数 = value
          else
            battler.damage = value
          end
          battler.damage_pop = true
        end
      end
    end
    $game_switches[DIAMOND::SP_DAMAGE] = false
    # 継続
    return true
  end
〜略〜
SPダメージのスクリプトがない場合は薄緑色の部分はいりません。 バトルのイベントでカスタマイズポイントで設定したスイッチをOnにしてからダメージの処理を行うと SPに対してダメージを表示させることができます。 ※使用後、スイッチはoffにしなくても自動的にoffになります。
・データベースの限界突破 ツクールXP/VXは'0Xと違い武器、防具、スキルなどのデータベースの最大値が9999から999に減ってしまいました。 しかし、999に設定した後、 スクリプトにて
for i in 0..n
  $w = load_data("Data/Weapons.rxdata")
  $w.push RPG::Weapon.new
  save_data($w,"Data/Weapons.rxdata")
end
をイベントに設定、セーブして、テストプレイし、このイベントを実行するとデータベースの最大値を突破する ことができます。 nには増加したい数値を設定します。 防具なら
for i in 0..n
  $w = load_data("Data/Armors.rxdata")
  $w.push RPG::Armor.new
  save_data($w,"Data/Armors.rxdata")
end
アイテムなら
for i in 0..n
  $w = load_data("Data/Items.rxdata")
  $w.push RPG::Item.new
  save_data($w,"Data/Items.rxdata")
end
スキルなら
for i in 0..n
  $w = load_data("Data/Skills.rxdata")
  $w.push RPG::Skill.new
  save_data($w,"Data/Skills.rxdata")
end
また、VXの場合、拡張子を『rvdata』に変更します。 ※あまりに大きな数値を増加しようとするとハングアップして強制終了します。  (その場合、成功したループ回数までは一応限界を突破できますが、   運が悪ければデータがぶっ壊れます・・・多分)

戻る