制御文字拡張 in VX Ace



制御文字を拡張します。

※draw_text_exを拡張しています。

VX Ace 標準
\v[n]         : 変数n番の値を表示
\n[n]         : アクターn番目の名前を表示
\p[n]         : パーティーn番目の名前を表示
\g            : ゴールド表示
\c[n]         : n番目の色に変更
\i[n]         : n番目のアイコン表示
\{            : 描画文字サイズを大きく
\}            : 描画文字サイズを小さく
\.            : 1/4 sec wait
\|            : 1sec wait
\!            : 入力待ち
\>            : \< まで瞬間表示
\<            : \> から瞬間表示
\^            : 入力待ちなし

追加
\nn[n]        : アクターn番目のニックネームを表示
\e[n]         : エネミーn番目の名前を表示
\m[n]         : マップn番目の名前を表示
\md[n]        : マップn番目の表示名を表示
\j[n]         : n番目の職業を表示
\t[n]         : n番目の道具をアイコンつきで表示
\w[n]         : n番目の武器をアイコンつきで表示
\a[n]         : n番目の防具をアイコンつきで表示
\s[n]         : n番目のスキルをアイコンつきで表示
\r[text,ruby] : rubyをふりがなにtextを描画
\rfix[text]   : 定型句が割り振られているルビつき文字を描画

変更点
2012:01:15
・XP風アイコン描画 VX Aceに対応
・一度に複数回ルビを振ることが出来なかったバグを修正

2012:03:18
・VX Aceのミスだと思っていた convert_escape_characters の
 $game_variablesが二つあるのを復帰。
 \v[\v[n]]のために必要なんですね・・・

2012:10:01
・Ver.1.01aからData/MapInfos.rvdata2には表示名が存在しないためスクリプト変更
・アクター名などに制御文字が入っていた場合の制御文字にも対応

#==============================================================================
# ■ 制御文字拡張 VX Ace By 貪藻矢射妥←
#------------------------------------------------------------------------------
#  制御文字を拡張します。
#  
#  ※draw_text_exを拡張しています。
# 
#  ※ルビ描画にてルビ、もしくは本文に半角スペースを入れないでください。
#   正しく表示できません。
# 
#==============================================================================
# 
# VX Ace 標準
# \v[n]         : 変数n番の値を表示
# \n[n]         : アクターn番目の名前を表示
# \p[n]         : パーティーn番目の名前を表示
# \g            : ゴールド表示
# \c[n]         : n番目の色に変更
# \i[n]         : n番目のアイコン表示
# \{            : 描画文字サイズを大きく
# \}            : 描画文字サイズを小さく
# \.            : 1/4 sec wait
# \|            : 1sec wait
# \!            : 入力待ち
# \>            : \< まで瞬間表示
# \<            : \> から瞬間表示
# \^            : 入力待ちなし
# 追加
# \nn[n]        : アクターn番目のニックネームを表示
# \e[n]         : エネミーn番目の名前を表示
# \m[n]         : マップn番目の名前を表示
# \md[n]        : マップn番目の表示名を表示
# \j[n]         : n番目の職業を表示
# \t[n]         : n番目の道具をアイコンつきで表示
# \w[n]         : n番目の武器をアイコンつきで表示
# \a[n]         : n番目の防具をアイコンつきで表示
# \s[n]         : n番目のスキルをアイコンつきで表示
# \r[text,ruby] : rubyをふりがなにtextを描画
# \rfix[text]   : 定型句が割り振られているルビつき文字を描画
# 
#==============================================================================
# 更新っぽいもの
# 2012:01:15
# ・XP風アイコン描画 VX Aceに対応
# ・一度に複数回ルビを振ることが出来なかったバグを修正
# 
# 2012:03:18
# ・VX Aceのミスだと思っていた convert_escape_characters の
#  $game_variablesが二つあるのを復帰。
#  \v[\v[n]]のために必要なんですね・・・
# 
# 2012:10:01
# ・Ver.1.01aからData/MapInfos.rvdata2には表示名が存在しないためスクリプト変更
# ・アクター名などに制御文字が入っていた場合の制御文字にも対応

#==============================================================================
# ■ Window_Base
#------------------------------------------------------------------------------
#  ゲーム中の全てのウィンドウのスーパークラスです。
#==============================================================================

class Window_Base < Window
  # ルビ定型句セット
  FIX_RUBY = {
    "赤眉"               => "チーメイ", 
    "傾奇"               => "かぶき", 
    "明殺"               => "みょうさつ", 
    "開封"               => "かいほう", 
    "綺羅神無"           => "らじんきむ", 
    "応龍"               => "おうりゅう", 
    "齎"                 => "もたら", 
    "麒麟"               => "キリン", 
    "霊龜"               => "れいき", 
    "素盞嗚尊"           => "スサノオノミコト", 
    "燭龍"               => "しょくりゅう", 
    "月陽歳刑"           => "つきかげさいぎょう", 
    "歳星黄幡"           => "さいせいおうばん", 
    "天下太陰"           => "てんげだいおん", 
    "元屠歳殺"           => "げんとさいさつ" , 
    "天蓋流剣鞘"         => "てんがいりゅうけんしょう", 
    "絳征"               => "こうせい", 
    "炎一刀"             => "ほむらいっとう", 
    "虹影"               => "にじかげ", 
    "誘薙双剣"           => "いざなぎそうけん", 
    "天狼碎牙"           => "てんろうさいが", 
    "天狼真牙"           => "てんろうしんが", 
    "穀蔵院一刀"         => "こくぞういんいっとう", 
    "愛染"               => "あいぜん", 
    "舞雅"               => "むげ", 
    "雅閃"               => "がせん", 
    "秘雅閃"             => "ひがせん", 
    "極雅閃"             => "きょくがせん", 
    "終雅閃"             => "しゅうがせん", 
    "黎淵夢"             => "くろきふちのゆめ", 
    "夢刃"               => "むじん", 
    "示現流瞬槍"         => "じげんりゅうしゅんそう", 
    "黎杭打刳撃"         => "パイルドライバー", 
    "逆転黎杭打刳撃"     => "リバース・パイルドライバー", 
    "回転黎杭打刳撃"     => "スピニング・パイルドライバー", 
    "跳躍黎杭打刳撃"     => "ジャンピング・パイルドライバー", 
    "旋抉黎杭打刳撃"     => "スクリュー・パイルドライバー", 
    "削岩錐穴黎杭打刳撃" => "ドリル・ア・ホール・パイルドライバー", 
    "被覆鋼弾"           => "フルメタルジャケット", 
    "撤甲弾"             => "アーマーピアシング", 
    "炸 裂 弾"         => "エクスプロージョンブリット", 
    "黒き猛禽の爪"       => "ブラックタロン", 
    "鵺帛主"             => "ヤヌス", 
    "王宮一級品"         => "ロイヤルコレクション", 
    "零道漓"             =>"プルウィウス", 
    " 真 "             => "チェンジ!!", 
    "殺形刀"             => "サルヒヨンド", 
    " S  D "         => "SEED DESTINY", 
    "天国"               => "あまくに", 
    "碧聖刃"             => "シアンセイクレド", 
    "  S   T  "   => "シャイニング・トラペゾヘドロン", 
    "保護陰盾"           => "プロテクトシェード", 
    "蘭花"               => "ランファ", 
    " A T "           => "アナザータイプ", 
    "夢龍"               => "モンリョン", 
    "春香"               => "チュンヒャン", 
    "文秀"               => "ムンス", 
    "元述"               => "ウォンスル", 
    "英實"               => "ヨンシル", 
    "暗行御史"           => "アメンオサ", 
    "山道"               => "サンド", 
    "朱羅姫"             => "シュラキ", 
    "奠夷瑪"             => "ディーヴァ", 
    "女王禍"             => "ジョーカー", 
    "茜瑙哭"             => "セドナ", 
    "爾幽樟"             => "ニュクス", 
    "刺舞鴉"             => "シヴァ", 
    "逢喇且雫"           => "アフラ・マズダ", 
    "槃導邏"             => "パンドラ", 
    "霹瓏婚枢"           => "ペルクナス", 
    "炳佩鍍嵩"           => "ヘパイトス", 
    "宕瓏牙"             => "ドゥルガー", 
    "微朱主"             => "ヴィシュヌ", 
    "魔血玉"             => "デモンブラッド", 
    "呪符"               => "タリズマン", 
    "閣氏"               => "カクシ", 
    "歳殺陽天"           => "さいさつようてん", 
    "歳刑星天"           => "さいぎょうせいてん", 
    "黄幡暗天"           => "おうばんあんてん", 
    "太陰邪天"           => "だいおんじゃてん", 
    "陰轟留牡鴉"         => "アンゴルモア", 
    "緋々色金"           => "ヒヒイロカネ", 
    "青生生魂"           => "アボイタカラ", 
  }
  #--------------------------------------------------------------------------
  # ● 制御文字の事前変換
  #    実際の描画を始める前に、原則として文字列に変わるものだけを置き換える。
  #    文字「\」はエスケープ文字(\e)に変換。
  #--------------------------------------------------------------------------
  def convert_escape_characters(text)
    result = text.to_s.clone
    # 既存
    result.gsub!(/\\/)            { "\e" }
    result.gsub!(/\e\e/)          { "\\" }
    result.gsub!(/\eV\[(\d+)\]/i) { $game_variables[$1.to_i] }
    result.gsub!(/\eV\[(\d+)\]/i) { $game_variables[$1.to_i] }
    result.gsub!(/\eN\[(\d+)\]/i) { actor_name($1.to_i) }
    result.gsub!(/\eP\[(\d+)\]/i) { party_member_name($1.to_i) }
    result.gsub!(/\eG/i)          { Vocab::currency_unit }
    # 追加
    result.gsub!(/\eNN\[(\d+)\]/i) { actor_nickname($1.to_i) }
    result.gsub!(/\eE\[(\d+)\]/i)  { enemy_name($1.to_i) }
    result.gsub!(/\eM\[(\d+)\]/i)  { map_name($1.to_i) }
    result.gsub!(/\eMD\[(\d+)\]/i) { map_display_name($1.to_i) }
    result.gsub!(/\eJ\[(\d+)\]/i)  { job_name($1.to_i) }
    result
  end
  #--------------------------------------------------------------------------
  # ● アクター n 番の名前を取得
  #--------------------------------------------------------------------------
  def actor_name(n)
    actor = n >= 1 ? $game_actors[n] : nil
    actor ? convert_escape_characters(actor.name) : ""
  end
  #--------------------------------------------------------------------------
  # ● アクター n 番のニックネームを取得
  #--------------------------------------------------------------------------
  def actor_nickname(n)
    actor = n >= 1 ? $game_actors[n] : nil
    actor ? convert_escape_characters(actor.nickname) : ""
  end
  #--------------------------------------------------------------------------
  # ● パーティメンバー n 番の名前を取得
  #--------------------------------------------------------------------------
  def party_member_name(n)
    actor = n >= 1 ? $game_party.members[n - 1] : nil
    actor ? convert_escape_characters(actor.name) : ""
  end
  #--------------------------------------------------------------------------
  # ● エネミー n 番の名前を取得
  #--------------------------------------------------------------------------
  def enemy_name(n)
    enemy = n >= 1 ? $data_enemies[n] : nil
    enemy ? convert_escape_characters(enemy.name) : ""
  end
  #--------------------------------------------------------------------------
  # ● 職業 n 番の名前を取得
  #--------------------------------------------------------------------------
  def job_name(n)
    job = n >= 1 ? $data_classes[n] : nil
    job ? convert_escape_characters(job.name) : ""
  end
  #--------------------------------------------------------------------------
  # ● マップ n 番の名前を取得
  #--------------------------------------------------------------------------
  def map_name(n)
    map = load_data(sprintf("Data/MapInfos.rvdata2"))[n]
    map ? convert_escape_characters(map.name) : ""
  end
  #--------------------------------------------------------------------------
  # ● マップ n 番の表示名を取得
  #--------------------------------------------------------------------------
  def map_display_name(n)
    map = load_data(sprintf("Data/Map%03d.rvdata2", n))
    map ? convert_escape_characters(map.display_name) : ""
  end
  #--------------------------------------------------------------------------
  # ● 制御文字の処理
  #     code : 制御文字の本体部分(「\C[1]」なら「C」)
  #--------------------------------------------------------------------------
  def process_escape_character(code, text, pos)
    case code.upcase
    # 既存
    when 'C'
      change_color(text_color(obtain_escape_param(text)))
    when 'I'
      process_draw_icon(obtain_escape_param(text), pos)
    when '{'
      make_font_bigger
    when '}'
      make_font_smaller
    # 追加
    when 'T'    # 道具
      process_draw_item(obtain_escape_param(text), pos)
    when 'W'    # 武器
      process_draw_weapon(obtain_escape_param(text), pos)
    when 'A'    # 防具
      process_draw_armor(obtain_escape_param(text), pos)
    when 'S'    # スキル
      process_draw_skill(obtain_escape_param(text), pos)
    when 'R'    # ルビ
      process_draw_ruby(obtain_escape_param2(text), pos)
    when "RFIX" # 定型句ルビ
      process_draw_ruby_fix(obtain_escape_param2(text), pos)
    end
  end
  #--------------------------------------------------------------------------
  # ● 制御文字の引数を破壊的に取得 文字列編
  #--------------------------------------------------------------------------
  def obtain_escape_param2(text)
    text.slice!(/^\[(.+?)\]/)[/\S+/] rescue 0
  end
  #--------------------------------------------------------------------------
  # ● 制御文字によるルビ描画の処理
  #--------------------------------------------------------------------------
  def process_draw_ruby(str, pos)
    str.gsub!(/\[(.+?),(.+?)\]/, "")
    text = $1
    ruby = $2
    process_draw_ruby_root(text, ruby, pos)
  end
  #--------------------------------------------------------------------------
  # ● 制御文字によるルビ定型句描画の処理
  #--------------------------------------------------------------------------
  def process_draw_ruby_fix(str, pos)
    str.gsub!(/\[(.+?)\]/, "")
    text = $1
    ruby = FIX_RUBY[$1]
    process_draw_ruby_root(text, ruby, pos)
  end
  #--------------------------------------------------------------------------
  # ● 制御文字によるルビ描画の処理 おおもと
  #--------------------------------------------------------------------------
  def process_draw_ruby_root(text, ruby, pos)
    text_w = text_size(text).width
    text_h = text_size(text).height
    f_size_back = contents.font.size
    ruby_size = [(f_size_back + 66) / 8, f_size_back * 2 / 3].min
    contents.font.size = ruby_size
    draw_text(pos[:x], pos[:y] + 8 - ruby_size, text_w,     ruby_size, ruby, 1)
    contents.font.size = f_size_back
    draw_text(pos[:x], pos[:y] + 6,             text_w + 4, text_h,    text)
    pos[:x] += text_w
  end
  #--------------------------------------------------------------------------
  # ● 制御文字によるアイテム描画の処理
  #--------------------------------------------------------------------------
  def process_draw_item(id, pos)
    item = id.to_i >= 1 ? $data_items[id.to_i] : nil
    process_draw_data(item, pos)
  end
  #--------------------------------------------------------------------------
  # ● 制御文字による武器描画の処理
  #--------------------------------------------------------------------------
  def process_draw_weapon(id, pos)
    weapon = id.to_i >= 1 ? $data_weapons[id.to_i] : nil
    process_draw_data(weapon, pos)
  end
  #--------------------------------------------------------------------------
  # ● 制御文字による防具描画の処理
  #--------------------------------------------------------------------------
  def process_draw_armor(id, pos)
    armor = id.to_i >= 1 ? $data_armors[id.to_i] : nil
    process_draw_data(armor, pos)
  end
  #--------------------------------------------------------------------------
  # ● 制御文字によるスキル描画の処理
  #--------------------------------------------------------------------------
  def process_draw_skill(id, pos)
    skill = id.to_i >= 1 ? $data_skills[id.to_i] : nil
    process_draw_data(skill, pos)
  end
  #--------------------------------------------------------------------------
  # ● 制御文字によるアイテム、武器、防具、スキル描画の処理 おおもと
  #--------------------------------------------------------------------------
  def process_draw_data(data, pos)
    if data != nil
      data_name = data.name
      data_icon = data.icon_index
      
      if $OuterFlgs["Icon_Extend"]
        text = data.note.clone
        @icon_name = text =~ /ICON#{DIA_IC::STT}(\S+)#{DIA_IC::FIN}/ ? $1 : nil
        if  @icon_name != nil
          draw_icon_XP(@icon_name, pos[:x], pos[:y])
        else
          draw_icon(data_icon, pos[:x], pos[:y])
        end
      else
        draw_icon(data_icon, pos[:x], pos[:y])
      end
      pos[:x] += 24
      text_width = text_size(data_name).width
      #draw_text(pos[:x], pos[:y], text_width, pos[:height], data_name)
      draw_text_ex(pos[:x], pos[:y], data_name)
      pos[:x] += text_width
    end
  end
  
  #--------------------------------------------------------------------------
  # ● 名前の描画
  #--------------------------------------------------------------------------
  def draw_actor_name(actor, x, y, width = 112)
    change_color(hp_color(actor))
    draw_text_ex(x, y, actor.name)
  end
  #--------------------------------------------------------------------------
  # ● 職業の描画
  #--------------------------------------------------------------------------
  def draw_actor_class(actor, x, y, width = 112)
    change_color(normal_color)
    draw_text_ex(x, y, actor.class.name)
  end
  #--------------------------------------------------------------------------
  # ● 二つ名の描画
  #--------------------------------------------------------------------------
  def draw_actor_nickname(actor, x, y, width = 180)
    change_color(normal_color)
    draw_text_ex(x, y, actor.nickname)
  end
end
※拡張しているのはdraw_text_exとなります。  使用の場合は、各種draw_textをdraw_text_exに変更してください。

戻る