Project1

标题: 請教魔劍腳本 跟隨型說明窗口的問題 [打印本页]

作者: str342650    时间: 2016-10-30 15:22
标题: 請教魔劍腳本 跟隨型說明窗口的問題
各位前輩好,小弟用了這個魔劍工鋪的 跟隨型說明窗口,但發現是被技能欄蓋住的...




腳本:


module Sword
#=======================================
#★ 魔劍工舖 - 跟隨型說明窗口(2)
# http://blog.yam.com/a870053jjkj/article/26694783
#=======================================
=begin
● 所需腳本
魔劍工舖整合腳本:http://blog.yam.com/a870053jjkj/article/25751998
控制碼轉換:http://blog.yam.com/a870053jjkj/article/28082241
========================================
● 控制碼(可以使用「控制碼轉換」中的控制碼,並且本腳本在新增以下控制碼)
\! : 該行控制碼之後內容為'0'、'0%'或沒內容時(換行為結尾),就清除該行
=end
#=======================================
#● 功能設定
S8_Width = 240 # 設定幫助窗口的寬度,當內容顯示不下也依此設置自動換行
S8_XY = [30, 20] # 可以對跟隨窗口的 [X座標, Y座標] 進行些微調整
#--------------------------------------------------------------
#○ 幫助窗口顯示突破的處理設定
#設置法1:S8_Location = 數值(數值選擇以下這些各有功能)
#(0直接超出;1底部為限;2頂部為限;3底部移動;4頂部移動;5一律居中)
#設置法2:S8_Location = [X座標, Y座標](自行指定顯示的位置)
S8_Location = 1
#--------------------------------------------------------------
#○ 幫助窗口格式設定
# 技能-------------------------------------------------------
S8_Skill = '\FS[20]\C[6]\DA[name]\C[0]\FS[18]
\DA[description]
\C[192,224,255]使用目標:\C[0]\SC[\DA[scope]]
\C[192,224,255]威力:\C[0]\!\DA[power]
\C[192,224,255]命中率:\C[0]\!\DA[hit]
\C[192,224,255]攻擊力:\C[0]\!\DA[atk_f]%
\C[192,224,255]物理防禦:\C[0]\!\DA[pdef_f]%
\C[192,224,255]魔法防禦:\C[0]\!\DA[mdef_f]%
\C[192,224,255]力量:\C[0]\!\DA[str_f]%
\C[192,244,255]靈巧:\C[0]\!\DA[dex_f]%
\C[192,244,255]速度:\C[0]\!\DA[agi_f]%
\C[192,244,255]魔力:\C[0]\!\DA[int_f]%
\C[192,224,255]迴避:\C[0]\!\DA[eva_f]%
\C[192,224,255]屬性:\!\EF
\C[192,224,255]狀態:\!\SS'
# 物品-------------------------------------------------------
S8_Item = '\FS[20]\C[6]\DA[name]\C[0]\FS[18]
\DA[description]
\C[192,224,255]使用目標:\C[0]\SC[\DA[scope]]
\C[192,224,255]\TY[\DA[parameter_type]]\C[0]+\!\DA[parameter_points]
\C[192,224,255]HP恢復率:\C[50]\!\DA[recover_hp_rate]%
\C[192,224,255]HP恢復量:\C[0]\!\DA[recover_hp]
\C[192,224,255]SP恢復率:\C[0]\!\DA[recover_sp_rate]%
\C[192,224,255]SP恢復量:\C[0]\!\DA[recover_sp]
\C[192,244,255]命中率:\C[0]\!\DA[hit]%
\C[192,224,255]屬性:\!\EF
\C[192,224,255]狀態:\!\SS
\C[192,224,255]販賣價格:\C[0]\!\DA[price]'
# 武器-------------------------------------------------------
S8_Weapon = '\FS[20]\C[6]\DA[name]\C[0]\FS[18]
\DA[description]
\C[192,224,255]攻擊力:\C[100]\!\DA[atk]
\C[192,224,255]物理防禦:\C[0]\!\DA[pdef]
\C[192,224,255]魔法防禦:\C[0]\!\DA[mdef]
\C[192,224,255]力量:\C[0]\!\DA[str_plus]
\C[192,244,255]靈巧:\C[0]\!\DA[dex_plus]
\C[192,244,255]速度:\C[0]\!\DA[agi_plus]
\C[192,244,255]魔力:\C[0]\!\DA[int_plus]
\C[192,224,255]屬性:\!\EF
\C[192,224,255]狀態:\!\SS
\C[192,224,255]販賣價格:\C[1000]\!\DA[price]'
# 防具-------------------------------------------------------
S8_Armor = '\FS[20]\C[6]\DA[name]\C[0]\FS[18]
\DA[description]
\C[192,224,255]附加狀態:\C[0]\!\TN[\DA[auto_state_id]]
\C[192,224,255]物理防禦:\C[0]\!\DA[pdef]
\C[192,224,255]魔法防禦:\C[0]\!\DA[mdef]
\C[192,224,255]力量:\C[0]\!\DA[str_plus]
\C[192,244,255]靈巧:\C[0]\!\DA[dex_plus]
\C[192,244,255]速度:\C[0]\!\DA[agi_plus]
\C[192,244,255]魔力:\C[0]\!\DA[int_plus]
\C[192,224,255]迴避:\C[0]\!\DA[eva]%
\C[192,224,255]屬性免疫:\!\EF
\C[192,224,255]狀態免疫:\!\SS
\C[192,224,255]販賣價格:\C[0]\!\DA[price]'
#=======================================
#● 追加設定
# S8_Complete
#=======================================
  BEGIN{$Sword ? $Sword[8] = 2 : $Sword = {8=>2}} # 腳本使用標誌
  ($Sword_VX = defined?(RPG::Weather) ? false : true) if $Sword_VX.nil?
  S8_Complete = $Sword[59] ? S59_Complete : false unless defined?(S8_Complete)
  $Sword_F12_Error = {} unless $Sword_F12_Error # F12除錯標誌
end
#=======================================
#■ 小型幫助窗口
class WSword_Help < Window_Base
  attr_writer(:top_row) # 開頭行數
  attr_writer(:visible2) # 第2隱藏標誌
  attr_writer(:use_text) # 設定採用的描繪內容
  #-------------------------------------------------------------
  #● 初始化物件(關連被顯示窗口, 資料)
  def initialize(corelation, data)
    @setting_wsword = Window_Base.new(0, 0, Sword::S8_Width, 33)
    super(0, 0, 640, 480) ; self.contents = Bitmap.new(width - 32, height - 32)
    self.opacity = 0 ; self.z = 155
    @setting_wsword.z = 150 ; @setting_wsword.opacity = 150
    @me_index = -1 # 儲存上次的位置
    @corelation = corelation # 關連被顯示窗口
    @visible2, @contrast = true, data.id
    refresh(data)
  end
  #-------------------------------------------------------------
  #● 更新內容(資料)
  def refresh(data)
    return unless data
    if @use_text then text = @use_text # 採用其它
    else
      case data # 資料類型
      when RPG::Skill ; text = Sword::S8_Skill.clone # 技能
      when RPG::Item ; text = Sword::S8_Item.clone # 物品
      when RPG::Weapon ; text = Sword::S8_Weapon.clone # 武器
      when RPG::Armor ; text = Sword::S8_Armor.clone # 防具
      end
    end
    $game_system.swordM_data = data # 對象資料
    text = text.code_explain
    text_array = text.split(/\n/) # 依照換行分解,確認每行底部內容之用
    text = ''
    text_array.each{|item| next if /\\\!0?%?\Z/ === item ; text += item + "\n"}
    text.gsub!(/\\\!/){''} # 清空無用的\!控制碼
    contents.clear
    contents.blt(0, 0, text.bitmap_explain(Sword::S8_Width, 300){},
    Rect.new(0, 0, Sword::S8_Width, 300))
    @setting_wsword.height = $Sword46[0][1] - 24
    place
  end
  #-------------------------------------------------------------
  #● 更新窗口位置
  def place
    if Sword::S8_Complete
      coord = Mouse.coord ; self.x, self.y = coord[0], coord[1]
    else
      self.x = @corelation.x + @corelation.cursor_rect.x + 16 + Sword::S8_XY[0]
      self.y = @corelation.y + @corelation.cursor_rect.y + 16 + Sword::S8_XY[1]
    end
    if XPVX.height < @setting_wsword.y + @setting_wsword.height
      case Sword::S8_Location
      when Array # 指定座標
        @setting_wsword.x = Sword::S8_Location[0]
        @setting_wsword.y = Sword::S8_Location[1]
        self.x = Sword::S8_Location[0] - 12 ; self.y = Sword::S8_Location[1] - 12
      when 1 # 底部為限
        @setting_wsword.y = XPVX.height - @setting_wsword.height
        self.y = @setting_wsword.y - 12
      when 2 # 頂部為限
        @setting_wsword.y = 0 ; self.y = 12
      when 3 # 底部移動
        @setting_wsword.y += @setting_wsword.height
        self.y += @setting_wsword.height
      when 4 # 頂部移動
        @setting_wsword.y -= @setting_wsword.height
        self.y -= @setting_wsword.height
      when 5 # 一律居中
        @setting_wsword.x = (XPVX.width - @setting_wsword.width) / 2
        @setting_wsword.y = (XPVX.height - @setting_wsword.height) / 2
        self.x = @setting_wsword.x - 12 ; self.y = @setting_wsword.y - 12
      end
    end
    #(self.x += 2 ; self.y += 2 ; @setting_wsword.height += 2) if Sword8_XPVX # VX顯示修正
  end
  #-------------------------------------------------------------
  #● 變更X座標
  def x=(x) ; @setting_wsword.x = x + 12 ; super ; end
  #-------------------------------------------------------------
  #● 變更Y座標
  def y=(y) ; @setting_wsword.y = y + 12 ; super ; end
  #-------------------------------------------------------------
  #● 釋放窗口
  def dispose ; @setting_wsword.dispose ; super ; end
  #-------------------------------------------------------------
  #● 隱藏窗口(隱藏標誌)
  def visible=(s) ; @setting_wsword.visible = s ; super ; end
  #-------------------------------------------------------------
  #● 更新窗口(索引, 對象, 強制更新標誌)
  def update(index, data, force = false)
    self.visible = data ? @visible2 : false  # 如果沒有資料就隱藏窗口
    place
    return if @me_index == index && @contrast == data.id or ! data unless force
    @me_index, @contrast = index, data.id ; refresh(data)
  end
end
#=======================================
#■ 物品窗口
class Window_Item
  #-------------------------------------------------------------
  #● 初始化物件
  alias sword8_initialize initialize
  def initialize(*args)
    $Sword_VX ? sword8_initialize(*args) : sword8_initialize
    @help_wsword = WSword_Help.new(self, item)
    @help_wsword.visible = false if $Sword_VX && $scene.is_a?(Scene_Equip)
  end
  #-------------------------------------------------------------
  #● 更新窗口
  alias sword8_update update unless $Sword_F12_Error[8]
  def update
    sword8_update
    @help_wsword.top_row = top_row
    @help_wsword.update(index, item)
  end
  #-------------------------------------------------------------
  #● 釋放窗口
  alias sword8_dispose dispose unless $Sword_F12_Error[8]
  def dispose
    sword8_dispose ; @help_wsword.dispose
  end
  #-------------------------------------------------------------
  #● 窗口顯示狀態=(顯示標誌)
  alias sword8_visible= visible= unless $Sword_F12_Error[8]
  def visible=(visible)
    @help_wsword.visible = @help_wsword.visible2 = visible
    self.sword8_visible = visible
  end
  #-------------------------------------------------------------
  #● 裝備壞面一開始隱藏跟隨型說明窗口
  if $Sword_VX
    def sword8_no_visible
      @help_wsword.visible = false
    end
  end
end
#=======================================
#■ 技能窗口
class Window_Skill
  #-------------------------------------------------------------
  #● 初始化物件(角色編號)
  alias sword8_initialize initialize
  def initialize(*args)
    $Sword_VX ? sword8_initialize(*args) : sword8_initialize(*args)
    @help_wsword = WSword_Help.new(self, skill)
  end
  #-------------------------------------------------------------
  #● 更新窗口
  alias sword8_update update unless $Sword_F12_Error[8]
  def update
    sword8_update
    @help_wsword.top_row = top_row
    @help_wsword.update(index, skill)
  end
  #-------------------------------------------------------------
  #● 釋放窗口
  alias sword8_dispose dispose unless $Sword_F12_Error[8]
  def dispose
    sword8_dispose ; @help_wsword.dispose
  end
  #-------------------------------------------------------------
  #● 窗口顯示狀態=(顯示標誌)
  alias sword8_visible= visible= unless $Sword_F12_Error[8]
  def visible=(visible)
    @help_wsword.visible = @help_wsword.visible2 = visible
    self.sword8_visible = visible
  end
end
#=======================================
#■ 購買窗口
class Window_ShopBuy
  #-------------------------------------------------------------
  #● 初始化物件(商品資料)
  alias sword8_initialize initialize
  def initialize(*args)
    sword8_initialize(*args)
    @help_wsword = WSword_Help.new(self, item)
  end
  #-------------------------------------------------------------
  #● 更新窗口
  alias sword8_update update unless $Sword_F12_Error[8]
  def update
    sword8_update
    @help_wsword.top_row = top_row
    @help_wsword.update(index, item)
  end
  #-------------------------------------------------------------
  #● 釋放窗口
  alias sword8_dispose dispose unless $Sword_F12_Error[8]
  def dispose
    sword8_dispose ; @help_wsword.dispose
  end
  #-------------------------------------------------------------
  #● 窗口顯示狀態=(顯示標誌)
  alias sword8_visible= visible= unless $Sword_F12_Error[8]
  def visible=(visible)
    @help_wsword.visible = @help_wsword.visible2 = visible
    self.sword8_visible = visible
  end
end
#=======================================
#■ 販賣窗口
unless $Sword_VX
class Window_ShopSell
  #-------------------------------------------------------------
  #● 初始化物件
  alias sword8_initialize initialize
  def initialize
    sword8_initialize
    @help_wsword = WSword_Help.new(self, item)
  end
  #-------------------------------------------------------------
  #● 更新窗口
  alias sword8_update update unless $Sword_F12_Error[8]
  def update
    sword8_update
    @help_wsword.top_row = top_row
    @help_wsword.update(index, item)
  end
  #-------------------------------------------------------------
  #● 釋放窗口
  alias sword8_dispose dispose unless $Sword_F12_Error[8]
  def dispose
    sword8_dispose ; @help_wsword.dispose
  end
  #-------------------------------------------------------------
  #● 窗口顯示狀態=(顯示標誌)
  alias sword8_visible= visible= unless $Sword_F12_Error[8]
  def visible=(visible)
    @help_wsword.visible = @help_wsword.visible2 = visible
    self.sword8_visible = visible
  end
end end
#=======================================
#■ 目前裝備窗口
eval("
class #{$Sword_VX ? 'Window_Equip' : 'Window_EquipRight'}
  #-------------------------------------------------------------
  #● 初始化物件(角色)
  alias sword8_initialize initialize
  def initialize(*args)
    sword8_initialize(*args)
    @help_wsword = WSword_Help.new(self, item)
  end
  #-------------------------------------------------------------
  #● 更新窗口
  alias sword8_update update unless $Sword_F12_Error[8]
  def update
    sword8_update
    @help_wsword.top_row = top_row
    @help_wsword.update(index, item)
  end
  #-------------------------------------------------------------
  #● 釋放窗口
  alias sword8_dispose dispose unless $Sword_F12_Error[8]
  def dispose
    sword8_dispose ; @help_wsword.dispose
  end
  #-------------------------------------------------------------
  #● 窗口顯示狀態=(顯示標誌)
  alias sword8_visible= visible= unless $Sword_F12_Error[8]
  def visible=(visible)
    @help_wsword.visible = @help_wsword.visible2 = visible
    self.sword8_visible = visible
  end
end")
#=======================================
#■ 選擇裝備窗口
unless $Sword_VX
class Window_EquipItem
  #-------------------------------------------------------------
  #● 初始化物件(角色, 裝備部位)
  alias sword8_initialize initialize
  def initialize(*args)
    sword8_initialize(*args)
    @help_wsword = WSword_Help.new(self, item)
    @help_wsword.visible = false
  end
  #-------------------------------------------------------------
  #● 更新窗口
  alias sword8_update update unless $Sword_F12_Error[8]
  def update
    sword8_update
    @help_wsword.top_row = top_row
    @help_wsword.update(index, item)
  end
  #-------------------------------------------------------------
  #● 釋放窗口
  alias sword8_dispose dispose unless $Sword_F12_Error[8]
  def dispose
    sword8_dispose ; @help_wsword.dispose
  end
  #-------------------------------------------------------------
  #● 窗口顯示狀態=(顯示標誌)
  alias sword8_visible= visible= unless $Sword_F12_Error[8]
  def visible=(visible)
    @help_wsword.visible = @help_wsword.visible2 = visible if active and item
    self.sword8_visible = visible
  end
end end
#=======================================
#■ 裝備畫面
if $Sword_VX
class Scene_Equip
  #---------------------------------------------------------------
  #● 創建可裝備窗口
  alias sword8_create_item_windows create_item_windows
  def create_item_windows
    sword8_create_item_windows
    (0...EQUIP_TYPE_MAX).each{|i| @item_windows.sword8_no_visible}
  end
end end
$Sword_F12_Error[8] = true



但必須先裝這2個腳本才能使用:

module Sword
#=======================================
#★ 魔劍工舖整合腳本(3)
# http://blog.yam.com/a870053jjkj/article/25751998
#---------------------------------------
# 參與:呆呆的
#=======================================
=begin
● 設置腳本
----------------------------------------------------------------
○ 預設函數擴充
獲取遊戲窗口句柄:hWnd
返回隨機內容:rand(值)
       值:可指定數值、空值(nil)、範圍、數組、哈希表、字串
快速產生精靈:【1】sprite(X座標, Y座標, 寬度, 高度)
       【2】sprite(X座標, Y座標, '位圖路徑')
轉換數組中的範圍:數組.range
將數值轉換為負數:數值.minus
獲取數值百分比:【1】數值.per
        【2】數值.per(百分比)
        【3】數值.per(百分, 之幾)
獲取數值的位數:【1】數值.digit 
        【2】數值.digit(位數)
數值分解成數組:數值.digit_a
返回空哈希表:nil.to_h
返回空正則表達式:nil.to_reg
字串轉為正則表達式:'文字內容'.to_reg
模擬按下按鍵:【1】Input.simulate(預設鍵值)
       【2】Input.simulate(預設鍵值, 忽略次數)
設定主角移動:【1】$game_player.setup_move(朝向)
       【2】$game_player.setup_move(朝向, false)
設定事件移動:【1】$game_map.events[事件編號].setup_move(朝向)
       【2】$game_map.events[事件編號].setup_move(朝向, false)
設定主角朝向:$game_player.setup_direction(朝向)
設定事件朝向:$game_map.events[事件編號].setup_direction(朝向)
----------------------------------------------------------------
○ RM共通環境函數(支援之前的XPVX)
獲取RM檔副檔名:RM.vice_file
獲取遊戲畫面寬度:RM.width
獲取遊戲畫面高度:RM.height
獲取單行窗口高度:RM.wlh
獲取我方隊伍列表:RM.members
獲取道具數量:【1】RM.item_number(道具數據)
       【2】RM.item_number(道具種類, 道具編號)
獲取防具屬性列表:RM.armor_element(防具編號)
獲取防具狀態列表:RM.armor_state(防具編號)
變更我方隊伍角色:RM.members(第幾個角色 - 1, 角色)
增減道具:【1】RM.gain_item(道具數據, 增減量)
     【2】RM.gain_item(道具數據, 增減量, 包含身上裝備標誌)
演奏游標SE:RM.se_cursor
演奏確定SE:RM.se_decision
演奏取消SE:RM.se_cancel
演奏無效SE:RM.se_buzzer
演奏裝備SE:RM.se_equip
演奏存檔SE:RM.se_save
演奏讀檔SE:RM.se_load
演奏商店SE:RM.se_shop
演奏戰鬥開始SE:RM.se_battle_start
演奏角色擊倒SE:RM.se_actor_collapse
演奏敵人擊倒SE:RM.se_enemy_collapse
獲取動畫圖塊位圖:RM.animation('圖片檔案名稱', 色相)
獲取戰鬥圖位圖:RM.battler('圖片檔案名稱', 色相)
獲取行走圖位圖:RM.character('圖片檔案名稱', 色相)
獲取遠景圖位圖:RM.parallax('圖片檔案名稱', 色相)
獲取一般圖片位圖:RM.picture('圖片檔案名稱', 色相)
場所移動:RM.reserve_transfer(地圖編號, X座標, Y座標, 朝向)
=end
#=======================================
#● 功能設定
S0_API = true # 是否啟用本腳本API功能,不適合執行API的RM版本請設為false
#=======================================
#● 資料設定(公共自定設置)
S0_Recover_HP = ['HP 回復率', 'HP 回復量'] # HP恢復
S0_Recover_SP = ['SP 回復率', 'SP 回復量'] # SP恢復
S0_Scope = ['無', '敵單體', '敵全體', '己方單體', '己方全體', '己方單體(HP 0)', '己方全體(HP 0)', '使用者'] # 效果範圍
S0_Occasion = ['平時', '戰鬥中', '菜單中', '不能使用'] # 可能使用時
S0_Consumable = ['消耗', '不消耗'] # 是否消耗
S0_Words = ['無', 'MaxHP', 'MaxSP', '力量', '靈巧', '速度', '魔力'] # 能力值
S0_Kind = ['盾', '頭部防具', '身體防具', '裝飾品', '武器'] # 武器防具種類
S0_Position = ['前衛', '中衛', '後衛'] # 職業位置
S0_Restriction = ['無', '禁用魔法', '攻擊敵人', '攻擊同伴', '不行動'] # 狀態限制
S0_Audio = ['BGM', 'BGS', 'ME', 'SE'] # 聲音用詞
S0_Lv = 'Lv' # 等級
S0_Exp = 'E' # 經驗值
S0_Next = 'NEXT' # 升級目標經驗值
S0_Hit = '命中率'
S0_Eva = '迴避修正'
S0_Number = '持有數'
S0_Need = '所需數'
S0_Name = ['技能名稱', '物品名稱', '武器名稱', '防具名稱']
S0_Shop = ['購買', '販賣', '離開'] # 商店
S0_Ability = ['無', 'MaxHP', 'MaxSP', '力量', '靈巧', '速度', '魔力'] # 物品能力值
#--------------------------------------------------------------
#○ RM按鍵資料
S0_KeyC = Input::C # RM按鍵C(確定鍵)設定
S0_KeyB = Input::B # RM按鍵B(取消鍵)設定
S0_KeyDOWN = Input::DOWN # RM按鍵下設定
S0_KeyLEFT = Input::LEFT # RM按鍵左設定
S0_KeyRIGHT = Input::RIGHT # RM按鍵右設定
S0_KeyUP = Input::UP # RM按鍵上設定
#--------------------------------------------------------------
#○ 狀態顏色設置(Color.new(紅, 綠, 藍, 不透明度))
S0_StatuMax = 5 # 捨定狀態的最大顯示數量
S0_StatuX = [Color.new(255, 255, 255, 128), '無'] # 無狀態時的 [顏色, 內容]
S0_StatuX.push([]) # 忽略列表,每個狀態編號用「,」分開
S0_Plus = Color.new(255, 235, 91, 255) # 狀態為附加時
S0_Minus = Color.new(255, 255, 255, 128) # 狀態為解除時
#--------------------------------------------------------------
#○ 這開始設定屬性顏色,S0_Set[屬性編號] = Color.new(紅, 綠, 藍, 不透明度)
S0_Set = [5] # 設定屬性的最大顯示數量
S0_SetX = [Color.new(255, 255, 255, 128), '無'] # 無屬性時的 [顏色, 內容]
S0_SetX.push([]) # 忽略列表,每個屬性編號用「,」分開
S0_Set[1] = Color.new(198, 0, 0, 255)
S0_Set[2] = Color.new(210, 252, 255, 255)
S0_Set[3] = Color.new(187, 0, 168, 255)
S0_Set[4] = Color.new(112, 204, 254, 255)
S0_Set[5] = Color.new(140, 81, 0, 255)
S0_Set[6] = Color.new(0, 191, 10, 255)
S0_Set[7] = Color.new(242, 255, 6, 255)
S0_Set[8] = Color.new(116, 116, 116, 255)
#=======================================
  $Sword ? $Sword[0] = ['魔劍工舖整合腳本', 3] : $Sword = {0=>['魔劍工舖整合腳本', 3]}
  ($Sword_RM = defined?(RPG::Tileset) ? false : :VX) if $Sword_RM.nil?
  ($Sword_RM = defined?(RPG::Weather) ? :XP : :VA) unless $Sword_RM
  $Sword_VX = true if $Sword_RM == :VX # VX使用標誌
  $Sword_F12_Error = {} unless $Sword_F12_Error # F12除錯標誌
end
#=======================================
#■ 魔劍工舖腳本用異常類
class SwordError < Exception
end
#=======================================
#■ RM資料類
class Sword_RM
  case $Sword_RM
  when :VA
    def data_element_set(data) ; data.element_set ; end
    def data_state_set(data)
      data.is_a?(RPG::UsableItem) ?
     [data.plus_state_set , data.minus_state_set] : data.state_set
    end
    def vice_file ; 'rvdata2' ; end
    def width ; Graphics.width ; end
    def height ; Graphics.height ; end
    def wlh ; 24 ; end
    def se_cursor ; Sound.play_cursor ; end
    def se_decision ; Sound.play_decision ; end
    def se_cancel ; Sound.play_cancel ; end
    def se_buzzer ; Sound.play_buzzer ; end
    def se_equip ; Sound.play_equip ; end
    def se_save ; Sound.play_save ; end
    def se_load ; Sound.play_load ; end
    def se_shop ; Sound.play_shop ; end
    def se_battle_start ; Sound.play_battle_start ; end
    def se_actor_collapse ; Sound.play_actor_collapse ; end
    def se_enemy_collapse ; Sound.play_enemy_collapse ; end
    def animation(filename, hue) ; Cache.animation(filename, hue) ; end
    def battler(filename, hue) ; Cache.battler(filename, hue) ; end
    def character(filename, hue) ; Cache.character(filename) ; end
    def parallax(filename, hue) ; Cache.parallax(filename) ; end
    def picture(filename) ; Cache.picture(filename) ; end
    def skill_learn?(actor, skill)
      actor = $game_actors[actor] unless actor.is_a?(Game_Actor)
      actor.skill_learn?(skill.is_a?(RPG::Skill) ? skill : $data_skills[skill])
    end
  when :VX
    def data_element_set(data) ; data.element_set ; end
    def data_state_set(data)
      data.is_a?(RPG::UsableItem) ?
     [data.plus_state_set , data.minus_state_set] : data.state_set
    end
    def vice_file ; 'rvdata' ; end
    def width ; Graphics.width ; end
    def height ; Graphics.height ; end
    def wlh ; Window_Base::WLH ; end
    def se_cursor ; Sound.play_cursor ; end
    def se_decision ; Sound.play_decision ; end
    def se_cancel ; Sound.play_cancel ; end
    def se_buzzer ; Sound.play_buzzer ; end
    def se_equip ; Sound.play_equip ; end
    def se_save ; Sound.play_save ; end
    def se_load ; Sound.play_load ; end
    def se_shop ; Sound.play_shop ; end
    def se_battle_start ; Sound.play_battle_start ; end
    def se_actor_collapse ; Sound.play_actor_collapse ; end
    def se_enemy_collapse ; Sound.play_enemy_collapse ; end
    def animation(filename, hue) ; Cache.animation(filename, hue) ; end
    def battler(filename, hue) ; Cache.battler(filename, hue) ; end
    def character(filename, hue) ; Cache.character(filename) ; end
    def parallax(filename, hue) ; Cache.parallax(filename) ; end
    def picture(filename) ; Cache.picture(filename) ; end
    def skill_learn?(actor, skill)
      actor = $game_actors[actor] unless actor.is_a?(Game_Actor)
      actor.skill_learn?(skill.is_a?(RPG::Skill) ? skill : $data_skills[skill])
    end
  when :XP
    def data_element_set(data)
      data.is_a?(RPG::Armor) ? data.guard_element_set : data.element_set
    end
    def data_state_set(data)
      data.is_a?(RPG::Armor) ? data.guard_state_set :
      [data.plus_state_set, data.minus_state_set]
    end
    def vice_file ; 'rxdata' ; end
    def width ; 640 ; end
    def height ; 480 ; end
    def wlh ; 32 ; end
    def se_cursor ; $game_system.se_play($data_system.cursor_se) ; end
    def se_decision ; $game_system.se_play($data_system.decision_se) ; end
    def se_cancel ; $game_system.se_play($data_system.cancel_se) ; end
    def se_buzzer ; $game_system.se_play($data_system.buzzer_se) ; end
    def se_equip ; $game_system.se_play($data_system.equip_se) ; end
    def se_save ; $game_system.se_play($data_system.save_se) ; end
    def se_load ; $game_system.se_play($data_system.load_se) ; end
    def se_shop ; $game_system.se_play($data_system.shop_se) ; end
    def se_battle_start ; $game_system.se_play($data_system.battle_start_se) ; end
    def se_actor_collapse ; $game_system.se_play($data_system.actor_collapse_se) ; end
    def se_enemy_collapse ; $game_system.se_play($data_system.enemy_collapse_se) ; end
    def animation(filename, hue) ; RPG::Cache.animation(filename, hue) ; end
    def battler(filename, hue) ; RPG::Cache.battler(filename, hue) ; end
    def character(filename, hue) ; RPG::Cache.character(filename, hue) ; end
    def parallax(filename, hue) ; RPG::Cache.parallax(filename, hue) ; end
    def picture(filename) ; RPG::Cache.picture(filename) ; end
    def skill_learn?(actor, skill)
      actor = $game_actors[actor] unless actor.is_a?(Game_Actor)
      actor.skill_learn?(skill.is_a?(RPG::Skill) ? skill.id : skill)
    end
  end
  #-------------------------------------------------------------
  #● 獲取隊伍列表(索引, 新值)
  def members(index = nil, new_id = nil)
    new_id = new_id.id if new_id.is_a?(Game_Actor)
    if index then if $Sword_VX ; $game_party.actors[index] = new_id
    else $game_party.actors[index] = $game_actors[new_id]
    end end
    $Sword_VX ? $game_party.members : $game_party.actors
  end
  #-------------------------------------------------------------
  #● 獲取道具數量(道具數據或種類, 道具編號)
  def item_number(item, id = nil)
    if id then case item
    when 0 then item = $data_items[id]
    when 1 then item = $data_weapons[id]
    when 2 then item = $data_armors[id]
    end end
    if $Sword_RM != :XP then $game_party.item_number(item) # 道具
    else case item
    when RPG::Item ; $game_party.item_number(item.id) # 物品
    when RPG::Weapon ; $game_party.weapon_number(item.id) # 武器
    when RPG::Armor ; $game_party.armor_number(item.id) # 防具
    end end
  end
  #-------------------------------------------------------------
  #● 增減道具(道具數據, 增減量, 包含已裝備標誌)
  def gain_item(item, n, include_equip = true)
    if $Sword_RM != :XP then $game_party.gain_item(item, n, include_equip) # 道具
    else
      number = item_number(item) ; n1 = n + number # 獲取持有數量
      case item
      when RPG::Item ; $game_party.gain_item(item.id, n) # 物品
      when RPG::Weapon # 武器
        members.each{|actor| break if n1 >= 0
        (actor.equip(0, 0) ; n1 += 1) if actor.weapon_id == item.id} if include_equip and n1 < 0
        $game_party.gain_weapon(item.id, n)
     when RPG::Armor # 防具
        members.each{|actor| break if n1 >= 0
        (actor.equip(1, 0) ; n1 += 1) if actor.armor1_id == item.id
        (actor.equip(2, 0) ; n1 += 1) if actor.armor2_id == item.id and n1 >= 0
        (actor.equip(3, 0) ; n1 += 1) if actor.armor3_id == item.id and n1 >= 0
        (actor.equip(4, 0) ; n1 += 1) if actor.armor4_id == item.id and n1 >= 0} if
       include_equip and n1 < 0
        $game_party.gain_armor(item.id, n)
      end
    end
  end
  #-------------------------------------------------------------
  #● 獲取防具數據的屬性列表(防具編號)
  def armor_element(id)
    $Sword_RM != :XP ? $data_armors[id].element_set : $data_armors[id].guard_element_set
  end
  #-------------------------------------------------------------
  #● 獲取防具數據的狀態列表(防具編號)
  def armor_state(id)
    $Sword_RM != :XP ? $data_armors[id].state_set : $data_armors[id].guard_state_set
  end
  #-------------------------------------------------------------
  #● 事件指令-場所移動(地圖編號, X座標, Y座標, 朝向)
  def reserve_transfer(map_id, x, y, direction)
    if $Sword_RM != :XP
      $game_player.reserve_transfer(map_id, x, y, direction)
    else
      $game_temp.player_transferring = true
      $game_temp.player_new_map_id = map_id
      $game_temp.player_new_x = x
      $game_temp.player_new_y = y
      Graphics.freeze
      $game_temp.transition_processing = true
      $game_temp.transition_name = ""
    end
    $game_player.setup_direction(direction)
  end
end
RM = XPVX = Sword_RM.new # 定義常量
#=======================================
#□ 該模塊中定義了可供所有類使用的方法
module Kernel
  NaN = 0 / 0.0 # 無限
  Infinity = 1 / 0.0 # 無限
  Regexps = %w(^ $ . * + - ? [ ] \w \W \s \S \d \D \b \B \A \Z \z \G ( ) { } , |) # 正則符號表
  if Sword::S0_API # API使用標誌
    GetForegroundWindow = Win32API.new('user32','GetForegroundWindow', %(v), 'l')
    Graphics.update # 降低句柄誤判率用
    HWND = GetForegroundWindow.call
    #-----------------------------------------------------------
    #● 獲取遊戲窗口的句柄
    def hWnd
      HWND
    end
  end
  #-------------------------------------------------------------
  #● 隨機數
  alias sword0_rand rand unless $Sword_F12_Error[0]
  def rand(max = false)
    case max
    when TrueClass, FalseClass ; sword0_rand(2) == 0 ? true : false # 真, 偽
    when Range ; rand(max.to_a) # 範圍
    when Array ; max[sword0_rand(max.size)] # 數組
    when Hash ; a = max.keys[sword0_rand(max.size)] ; [a, max[a]] # 哈希表
    when String ; max.split(//)[sword0_rand(max.split(//).size)] # 字符串
    else ; sword0_rand(max) # 其他(數值, 空)
    end
  end
  #-------------------------------------------------------------
  #● 快速產生顯示精靈
  def sprite(x, y, width, height = nil)
    spr = Sprite.new
    spr.x, spr.y = x, y
    spr.bitmap = height ? Bitmap.new(width, height) : Bitmap.new(width)
    spr
  end
end
#=======================================
#■ 數組類
class Array
  #-------------------------------------------------------------
  #● 單元值範圍轉換
  def range
    a, e = [], -1 # 結果數組, 索引
    self.each do |i|
      e += 1
      if i.is_a?(Range)
        b = i.begin and c = i.end
        i.exclude_end? ? d = 0 : d = 1
        a += Array.new(c - b + d){|f|f + b}
        next
      end
      a +=
    end
    a
  end
  #-------------------------------------------------------------
  #● 單元值交換
  def swap(index1, index2)
    item1, item2 = self[index1], self[index2]
    self[index1], self[index2] = item2, item1
    self
  end
end
#=======================================
#■ 哈希表類
class Hash
  #-------------------------------------------------------------
  #● 單元值交換
  def swap(key1, key2)
    value1, value2 = self[key1], self[key2]
    self[key1], self[key2] = value2, value1
    self
  end
end
#=======================================
#■ 數字的抽像類
class Numeric
  #-------------------------------------------------------------
  #● 負數
  def minus ; return self if self < 0 ; self - self * 2 ; end
  #-------------------------------------------------------------
  #● 百分比
  def per(per = 100, of = 1) ; self * of / per ; end
  #-------------------------------------------------------------
  #● 總位數
  def digit(digit = 0)
    digit > 0 ? self.digit_a[-digit] : self.digit_a.size
  end
  #-------------------------------------------------------------
  #● 分解位數數組
  def digit_a ; a = [] ; self.to_s.scan(/\d/).each{|i| a += [i.to_i]} ; a ; end
end
#=======================================
#■ nil 的類
class NilClass
  #-------------------------------------------------------------
  #● 空哈希表
  def to_h ; {} ; end
  #-------------------------------------------------------------
  #● 空正則表達式
  def to_reg ; // ; end
end
#=======================================
#■ 字符串類
class String
  #-------------------------------------------------------------
  #● 轉換為正則表達式
  def to_reg
    text = dup ; Regexps.each {|i| text.gsub!(/#{"\\" + i}/){"\\#{i}"}} ; /#{text}/
  end
  #-------------------------------------------------------------
  #● 半全形轉換(轉換類型)
  def holomorphic(type = 0)
    text = ''
    self.split(//).each do |c| case [0, 2].include?(type) ? c : nil
    when / / ; text += ' '
    when /[!-_]/ ; text += (c[2] - 96).chr
    when /‵/ ; text += '`'
    when /[a-~]/ ; text += (c[2] - 32).chr
    else
      case [0, 1].include?(type) ? c : nil
      when / / ; text += "\343\200\200" # 32
      when /[\!-_]/ ; text += "\357\274#{(c[0] + 96).chr}" # 33..95
      when /`/ ; text += "\342\200\265" # 96
      when /[a-~]/ ; text += "\357\275#{(c[0] + 32).chr}" # 97..126
      else ; text += c
      end
    end ; end
    text
  end
end
#=======================================
#□ 處理遊戲手柄和鍵盤輸入信息的模塊
class << Input
  #-------------------------------------------------------------
  #● 更新輸入訊息
  alias sword5_update update unless $Sword_F12_Error[0]
  def update
    (@simv > 0 ? @simv -= 1 : @simulate = nil) if @simv ; sword5_update
  end
  #-------------------------------------------------------------
  #● 按住的場合
  alias sword5_press? press? unless $Sword_F12_Error[0]
  def press?(num) ; return true if @simulate == num ; sword5_press?(num) ; end
  #-------------------------------------------------------------
  #● 按下的場合
  alias sword5_trigger? trigger? unless $Sword_F12_Error[0]
  def trigger?(num) ; return true if @simulate == num ; sword5_trigger?(num) ; end
  #-------------------------------------------------------------
  #● 連續按住的場合
  alias sword5_repeat? repeat? unless $Sword_F12_Error[0]
  def repeat?(num) ; return true if @simulate == num ; sword5_repeat?(num) ; end
  #-------------------------------------------------------------
  #● 模擬按下按鍵
  def simulate(num, v = 0) ; @simulate = num ; @simv = v ; end
end
#=======================================
#■ 同伴
if $Sword_RM != :XP
  class Game_Party < Game_Unit
   attr_accessor(:actors) # 目前隊伍中的角色
  end
end
#=======================================
#■ 戰鬥者
class Game_Battler
  if $Sword_RM == :XP then def action ; current_action ; end
  else def current_action ; action ; end
  end
end
#=======================================
#■ 地圖角色
class Game_Character
if $Sword_RM == :VA
  #-------------------------------------------------------------
  #● 臉向下
  def turn_down ; set_direction(2) ; end
  #-------------------------------------------------------------
  #● 臉向左
  def turn_left ; set_direction(4) ; end
  #-------------------------------------------------------------
  #● 臉向右
  def turn_right ; set_direction(6) ; end
  #-------------------------------------------------------------
  #● 臉向上
  def turn_up ; set_direction(8) ; end
  #-------------------------------------------------------------
  #● 向下移動(允許原地轉向)
  def move_down(turn_ok = true)
    if passable?(@x, @y+1)                  # 可通行?
      turn_down
      @y = $game_map.round_y(@y+1)
      @real_y = (@y-1)*256
      increase_steps
      @move_failed = false
    else                                    # 不可通行?
      turn_down if turn_ok
      check_event_trigger_touch(@x, @y+1)   # 一觸即發的事件被觸發?
      @move_failed = true
    end
  end
  #-------------------------------------------------------------
  #● 向左移動(允許原地轉向)
  def move_left(turn_ok = true)
    if passable?(@x-1, @y)                  # 可通行?
      turn_left
      @x = $game_map.round_x(@x-1)
      @real_x = (@x+1)*256
      increase_steps
      @move_failed = false
    else                                    # 不可通行?
      turn_left if turn_ok
      check_event_trigger_touch(@x-1, @y)   # 一觸即發的事件被觸發?
      @move_failed = true
    end
  end
  #-------------------------------------------------------------
  #● 向右移動(允許原地轉向)
  def move_right(turn_ok = true)
    if passable?(@x+1, @y)                  # 可通行?
      turn_right
      @x = $game_map.round_x(@x+1)
      @real_x = (@x-1) * 256
      increase_steps
      @move_failed = false
    else                                    # 不可通行?
      turn_right if turn_ok
      check_event_trigger_touch(@x+1, @y)   # 一觸即發的事件被觸發?
      @move_failed = true
    end
  end
  #-------------------------------------------------------------
  #● 向上移動(允許原地轉向)
  def move_up(turn_ok = true)
    if passable?(@x, @y-1)                  # 可通行?
      turn_up
      @y = $game_map.round_y(@y-1)
      @real_y = (@y+1) * 256
      increase_steps
      @move_failed = false
    else                                    # 不可通行?
      turn_up if turn_ok
      check_event_trigger_touch(@x, @y-1)   # 一觸即發的事件被觸發?
      @move_failed = true
    end
  end
  #-------------------------------------------------------------
  #● 向左下移動
  def move_lower_left
    unless @direction_fix
      @direction = (@direction == 6 ? 4 : @direction == 8 ? 2 : @direction)
    end
    if (passable?(@x, @y+1) and passable?(@x-1, @y+1)) or
       (passable?(@x-1, @y) and passable?(@x-1, @y+1))
      @x -= 1
      @y += 1
      increase_steps
      @move_failed = false
    else @move_failed = true
    end
  end
  #-------------------------------------------------------------
  #● 向右下移動
  def move_lower_right
    unless @direction_fix
      @direction = (@direction == 4 ? 6 : @direction == 8 ? 2 : @direction)
    end
    if (passable?(@x, @y+1) and passable?(@x+1, @y+1)) or
       (passable?(@x+1, @y) and passable?(@x+1, @y+1))
      @x += 1
      @y += 1
      increase_steps
      @move_failed = false
    else @move_failed = true
    end
  end
  #-------------------------------------------------------------
  #● 向左上移動
  def move_upper_left
    unless @direction_fix
      @direction = (@direction == 6 ? 4 : @direction == 2 ? 8 : @direction)
    end
    if (passable?(@x, @y-1) and passable?(@x-1, @y-1)) or
       (passable?(@x-1, @y) and passable?(@x-1, @y-1))
      @x -= 1
      @y -= 1
      increase_steps
      @move_failed = false
    else @move_failed = true
    end
  end
  #-------------------------------------------------------------
  #● 向右上移動
  def move_upper_right
    unless @direction_fix
      @direction = (@direction == 4 ? 6 : @direction == 2 ? 8 : @direction)
    end
    if (passable?(@x, @y-1) and passable?(@x+1, @y-1)) or
       (passable?(@x+1, @y) and passable?(@x+1, @y-1))
      @x += 1
      @y -= 1
      increase_steps
      @move_failed = false
    else @move_failed = true
    end
  end
end
  #-------------------------------------------------------------
  #● 設定地圖角色移動(朝向, 轉向標誌)
  def setup_move(direction, turn_ok = true)
    case direction
    when 1 ; move_lower_left # 左下
    when 2 ; move_down(turn_ok) # 下
    when 3 ; move_lower_right # 右下
    when 4 ; move_left(turn_ok) # 左
    when 6 ; move_right(turn_ok) # 右
    when 7 ; move_upper_left # 左上
    when 8 ; move_up(turn_ok) # 上
    when 9 ; move_upper_right # 右上
    end
  end
  #-------------------------------------------------------------
  #● 設定地圖角色朝向(朝向)
  def setup_direction(direction)
    case direction
    when 1 ; turn_left_down if $Sword[14] # 左下
    when 2 ; turn_down # 下
    when 3 ; turn_right_down if $Sword[14] # 右下
    when 4 ; turn_left # 左
    when 6 ; turn_right # 右
    when 7 ; turn_left_up if $Sword[14] # 左上
    when 8 ; turn_up # 上
    when 9 ; turn_right_up if $Sword[14] # 右上
    end
  end
end
$Sword_F12_Error[0] = true # 開啟F12除錯標誌



module Sword
#=======================================
#★ 魔劍工舖 - 控制碼轉換(3)
# http://blog.yam.com/a870053jjkj/article/28082241
#=======================================
=begin
● 所需腳本
魔劍工舖整合腳本:http://blog.yam.com/a870053jjkj/article/25751998(非必要)
========================================
● 設置腳本
轉換控制碼:字符串.code_explain(清空描繪標誌&)
轉換關鍵字:字符串.critical_word
檢查關鍵字:字符串.critical_word?
產生位圖:字符串.bitmap_explain(寬度, 高度, 間隔距離, 字體){塊}
位圖資料變量:$Sword46
記憶控制碼:$game_system.swordM_save[編號] = '文字內容'
引用對象資料:$game_system.swordM_data = 對象
========================================
● 控制碼
○ 內容控制碼(code_explain中有效)
\V[變數編號] : 顯示指定變數編號的數值,可當成其他控制碼的參數用
\TXT[檔案名稱] : 顯示指定的txt的所有內容
\TXT[檔案名稱][索引] : 顯示指定的txt指定索引的內容
\L[編號] : 此控制碼視同指定編號的[設定記憶]的設置內容
\SW[開關編號] : 顯示指定開關編號目前的狀態文字,依設置S46_Switche而定
\SW[開關編號][內容] : 當指定的開關為ON時,就顯示內容,為OFF則啥都不顯示
\N[角色編號] : 顯示指定角色編號的角色名稱
\CI[角色編號] : 顯示指定角色編號的職業名稱
\CN[職業編號] : 顯示指定職業編號的職業名稱
\SN[技能編號] : 顯示指定技能編號的技能名稱
\IN[物品編號] : 顯示指定物品編號的物品名稱
\WN[武器編號] : 顯示指定武器編號的武器名稱
\AN[防具編號] : 顯示指定防具編號的防具名稱
\EN[敵人編號] : 顯示指定敵人編號的敵人名稱
\TN[狀態編號] : 顯示指定狀態編號的狀態名稱
\MN[屬性編號] : 顯示指定屬性編號的屬性名稱
\TY[能力位置] : 顯示S0_Ability設定指定位置-1的能力值名稱
\GV : 顯示目前玩家持有的金錢
\EQ[角色編號,部位] : 顯示角色編號裝備的名稱,部位-0武、1盾、2頭、3身、4飾
\MA[地圖編號] : 顯示指定地圖編號的地圖名稱,設置0表示目前的地圖
\NN[角色編號] : 顯示指定角色編號的戰鬥圖檔案名稱(VX:頭像檔案名稱)
\NS[技能編號] : 顯示指定技能編號的圖標檔案名稱(VX:該圖標索引號)
\NI[物品編號] : 顯示指定物品編號的圖標檔案名稱(VX:該圖標索引號)
\NW[武器編號] : 顯示指定武器編號的圖標檔案名稱(VX:該圖標索引號)
\NA[防具編號] : 顯示指定防具編號的圖標檔案名稱(VX:該圖標索引號)
\NT[狀態編號] : 顯示指定狀態編號的圖標索引號(VX專用)
<<<<< 需要有使用$game_system.swordM_data存入對象資料才可使用以下控制碼 >>>>>
\DA[函數名稱] : 顯示指定對象中的函數返回值,能用的函數名稱請參考F1幫助文檔
\EF : 顯示該對象中的屬性名稱,會自動使用公共設定來附加\C控制碼
\SS : 顯示該對象中的狀態名稱,會自動使用公共設定來附加\C控制碼
----------------------------------------------------------------
○ 描繪控制碼(bitmap_explain中有效)
\C[色碼] : 變更文字顏色,使用方式和對話框的\C控制碼相同
\C[紅,綠,藍] : 變更文字顏色,指定三原色來組合顏色(單一顏色可設定0~255的數值)
\C[紅,綠,藍,透] : 變更文字顏色,指定三原色來組合顏色+不透明度,其他同上
\C[#紅綠藍] : 變更文字顏色,指定三原色來組合顏色(方式同網頁16進位顏色設定)
\C[#紅綠藍透] : 變更文字顏色,指定三原色來組合顏色+不透明度,其他同上
\C : 還原顏色,回到未使用\C控制碼(不含自己)的狀況
------以上任一個\C控制碼如果連續2個放置一起時,則視同為漸層顏色------
\F : 回到文字原始的字型狀態,簡單來說就是用過的控制碼都將在此失效
\FN[字體名稱] : 變更指定的字體,如果指定的字體不存在則不會變更字體
\FN : 還原成原本的字體
\FS[大小] : 變更文字的大小,有可能會影響該行的高度
\FS : 還原成原本的文字大小
\FH[位置] : 在文字哪個位置旁附加陰影,位置對應鍵盤數字九宮格,0為不顯示
\FH : 取消附加陰影,效果同\FH[0]
\B : 將文字變更為粗體,在使用一次會恢復原狀
\I : 將文字變更為斜體,在使用一次會恢復原狀
\U : 將文字附加底線,在使用一次會恢復原狀
\S : 將文字附加刪除線,在使用一次會恢復原狀
\BS[路徑] : 顯示指定路徑的圖片,起始路徑為遊戲所在資料夾,不需副檔名
\BS[路徑,色相] : 和上面的效果相同,只是可以設定該圖片的色相而已
\CO[寬度,高度] : 描繪一個指定大小的方形
\X[像素] : 描繪的位置往右指定像素的距離,正數為向右移;負數為向左移
\Y[像素] : 描繪的位置往下指定像素的距離,正數為向下移;負數為向上移
=end
#=======================================
#● 功能設定
S46_Switche = ['開', '關'] # 設定控制碼「\SW」顯示的內容 ([ON,OFF)
S46_NilText = 24 # 當該行無任何內容時,視同該行的最大高度為多少
#--------------------------------------------------------------
#○ 關鍵字添加修改設置
# 找到指定內容,就在內容前後附加內容,與就是在 {} 之間放置
# 設置法1:  '追蹤內容'=>['前附加內容', '後附加內容'],
# 設置法2:  '追蹤內容'=>['新的內容'],
S46_Chase = {
  '你好'=>['\c[6]', '\c[0]'],
  '阻止他'=>['\fs[32]', '\fs[22]'],
  '英文'=>['English']
} # 設置結束
#=======================================
  BEGIN{$Sword ? $Sword[46] = 3 : $Sword = {46=>3}} # 腳本使用標誌
  ($Sword_VX = defined?(RPG::Weather) ? false : true) if $Sword_VX.nil?
end
#=======================================
#■ 字符串
class String
  Rege = '([\dA-Za-z一-龥\-\+\*\/_\$\!\?`~!@#\$%\^&\*\(\)_=\\|\'."<>?/;:\{\}]+)' # 可匹配內容
  #-------------------------------------------------------------
  #● 控制碼內容轉換(清除描繪控制碼標誌)
  def code_explain(no_depict = false)
    text, @def_depth = self.dup, true
    text = code_explain_update(text) while @def_depth
    (return no_depict ? text.code_explain_updateX : text) unless $scene # 遊戲尚未正式開始就中斷
    data = $game_system.swordM_data
    text.gsub!(/\\[Dd][Aa]\[#{String::Rege}\]/){eval("data.#{$1}")} if data # 函數返回值
    text.gsub!(/\\[Ss][Ww]\[(\d+)\]\[#{Rege}\]/){$game_switches[$1.to_i] ? $2 : ''} # 開關自訂
    text.gsub!(/\\[Ss][Ww]\[(\d+)\]/){$game_switches[$1.to_i] ?
    Sword::S46_Switche[0] : Sword::S46_Switche[1]} # 開關設定內容
    text.gsub!(/\\[Nn]\[(\d+)\]/){$game_actors[$1.to_i] != nil ?
    $game_actors[$1.to_i].name : ''} # 角色名稱
    text.gsub!(/\\[Cc][Ii]\[(\d+)\]/){$game_actors[$1.to_i] != nil ?
    $data_classes[$game_actors[$1.to_i].class_id].name : ''} # 角色的職業名稱
    text.gsub!(/\\[Cc][Nn]\[(\d+)\]/){$data_classes[$1.to_i] != nil ?
    $data_classes[$1.to_i].name : ''} # 職業名稱
    text.gsub!(/\\[Ss][Nn]\[(\d+)\]/){$data_skills[$1.to_i] != nil ?
    $data_skills[$1.to_i].name : ''} # 技能名稱
    text.gsub!(/\\[Ii][Nn]\[(\d+)\]/){$data_items[$1.to_i] != nil ?
    $data_items[$1.to_i].name : ''} # 物品名稱
    text.gsub!(/\\[Ww][Nn]\[(\d+)\]/){$data_weapons[$1.to_i] != nil ?
    $data_weapons[$1.to_i].name : ''} # 武器名稱
    text.gsub!(/\\[Aa][Nn]\[(\d+)\]/){$data_armors[$1.to_i] != nil ?
    $data_armors[$1.to_i].name : ''} # 防具名稱
    text.gsub!(/\\[Ee][Nn]\[(\d+)\]/){$data_enemies[$1.to_i] != nil ?
    $data_enemies[$1.to_i].name : ''} # 敵人名稱
    text.gsub!(/\\[Tt][Nn]\[(\d+)\]/){$data_states[$1.to_i] != nil ?
    $data_states[$1.to_i].name : ''} # 狀態名稱
    text.gsub!(/\\[Mm][Nn]\[(\d+)\]/){$data_system.elements[$1.to_i] != nil ?
    $data_system.elements[$1.to_i] : ''} # 屬性名稱
    text.gsub!(/\\[Nn][Nn]\[(\d+)\]/){$game_actors[$1.to_i] != nil ?
    $game_actors[$1.to_i].character_name : ''} # 角色圖片名稱
    text.gsub!(/\\[Nn][Ss]\[(\d+)\]/){$data_skills[$1.to_i] != nil ?
    ($Sword_VX ? $data_skills[$1.to_i].icon_index :
    $data_skills[$1.to_i].icon_name) : ''} # 技能圖片名稱
    text.gsub!(/\\[Nn][Ii]\[(\d+)\]/){$data_items[$1.to_i] != nil ?
    ($Sword_VX ? $data_items[$1.to_i].icon_index :
    $data_items[$1.to_i].icon_name) : ''} # 物品圖片名稱
    text.gsub!(/\\[Nn][Ww]\[(\d+)\]/){$data_weapons[$1.to_i] != nil ?
    ($Sword_VX ? $data_weapons[$1.to_i].icon_index :
    $data_weapons[$1.to_i].icon_name) : ''} # 武器圖片名稱
    text.gsub!(/\\[Nn][Aa]\[(\d+)\]/){$data_armors[$1.to_i] != nil ?
    ($Sword_VX ? $data_armors[$1.to_i].icon_index :
    $data_armors[$1.to_i].icon_name) : ''} # 防具圖片名稱
    text.gsub!(/\\[Tt][Yy]\[(\d+)\]/){Sword::S0_Ability[$1.to_i]} #
    text.gsub!(/\\[Nn][Tt]\[(\d+)\]/){$data_states[$1.to_i] != nil ?
    $data_states[$1.to_i].icon_index : ''} if $Sword_VX # 狀態圖片索引號
    text.gsub!(/\\[Ee][Qq]\[(\d+)\,(\d+)\]/) do case $2.to_i # 角色目前裝備編號
    when 0 ; $game_actors[$1.to_i].weapon_id != 0 ?  
      $data_weapons[$game_actors[$1.to_i].weapon_id].name : '' # 武器
    when 1 ; $game_actors[$1.to_i].armor1_id != 0 ?
      $data_armors[$game_actors[$1.to_i].armor1_id].name : '' # 盾
    when 2 ; $game_actors[$1.to_i].armor2_id != 0 ?
      $data_armors[$game_actors[$1.to_i].armor2_id].name : '' # 頭部防具
    when 3 ; $game_actors[$1.to_i].armor3_id != 0 ?
      $data_armors[$game_actors[$1.to_i].armor3_id].name : '' # 身體防具
    when 4 ; $game_actors[$1.to_i].armor4_id != 0 ?
      $data_armors[$game_actors[$1.to_i].armor4_id].name : '' # 裝飾品
    end ; end
    text.gsub!(/\\[Mm][Aa]\[(\d+)\]/){a = $1.to_i == 0 ? $game_map.map_id : $1.to_i
    xv = $Sword_VX ? 'v' : 'x' ; load_data("Data/MapInfos.r#{xv}data")[a].name} # 地圖名
    text.gsub!(/\\[Gg][Vv]/){$game_party.gold} # 目前金錢
    text.gsub!(/\\[Ss][Cc]\[(\d+)\]/){Sword::S0_Scope[$1.to_i]} # 攻擊目標用語
    text.gsub!(/\\[Ee][Ff]/) do # 屬性控制碼
      set, v = '', 0
      if XPVX.data_element_set(data).empty?
        color = Sword::S0_SetX[0]
        set = "\x01#{color.red.to_i},#{color.green.to_i},#{
        color.blue.to_i},#{color.alpha.to_i}]" + Sword::S0_SetX[1]
      else
        XPVX.data_element_set(data).each do |i|
          break if v >= Sword::S0_Set[0]
          next if Sword::S0_SetX[2].include?(i)
          v += 1
          color = Sword::S0_Set ? Sword::S0_Set : nil
          set += color ? " \x01#{color.red.to_i},#{color.green.to_i},#{
          color.blue.to_i},#{color.alpha.to_i}]" +
          $data_system.elements + "\x001]" : ' ' + $data_system.elements
        end
        set[0] = '' unless set.empty?
      end
      set
    end
    text.gsub!(/\\[Ss][Ss]/) do # 狀態控制碼
      set, v, state_set, color = '', 0, XPVX.data_state_set(data), Sword::S0_Plus
      state_set.each do |states|
        states.each do |i|
          break if v >= Sword::S0_StatuMax
          next if Sword::S0_StatuX[2].include?(i)
          set += " \x01#{color.red.to_i},#{color.green.to_i},#{
          color.blue.to_i},#{color.alpha.to_i}]" + $data_states.name + "\x001]"
        end
        color = Sword::S0_Minus
      end
      set[0] = '' unless set.empty?
      if set.empty?
        color = Sword::S0_StatuX[0]
        set = "\x01#{color.red.to_i},#{color.green.to_i},#{
        color.blue.to_i},#{color.alpha.to_i}]" + Sword::S0_StatuX[1]
      end
      set
    end
    no_depict ? text.code_explain_updateX : text
  end
  def code_explain_updateX
    az = '([\dA-Za-z][\dA-Za-z])'
    [/\\[Aa][Ll]\[(\d+)\]/, /\\[Bb][Ss]\[#{Rege} ?\, ?(\d+)\]/, /\\[Bb][Ss]\[#{Rege}\]/,
    /\\[Cc][Oo]\[(\d+) ?\, ?(\d+)\]/, /\\[Cc]\[(\d+)\]/,
    /\\[Cc]\[(\d+) ?\, ?(\d+) ?\, ?(\d+)(?: ?\, ?(\d+)|)\]/,
    /\\[Cc]\[\##{az}#{az}#{az}(?:#{az}|)\]/,
    /\\[Cc]/, /\\[Bb]/, /\\[Ii]/, /\\[Uu]/, /\\[Ss]/, /\\[Ff][Nn]\[#{Rege}\]/,
    /\\[Ff][Nn]/, /\\[Ff][Ss]\[(\d+)\]/, /\\[Ff][Ss]/, /\\[Ff][Hh]\[(\d+)\]/,
    /\\[Ff][Hh]/, /\\[Ff]/, /\\[Xx]\[(\-?\d+)\]/, /\\[Yy]\[(\-?\d+)\]/].each{
    |sxp| self.gsub!(sxp){''}} # 清除描繪控制碼
    self
  end
  #-------------------------------------------------------------
  #● 處理重複性質的控制碼(字符串)
  def code_explain_update(text)
    @def_depth = false # 將執行此方法用的標誌關閉
    text.gsub!(/\\[Tt][Xx][Tt]\[([0-龥]+)\]\[([0-龥]+)\]/) do @def_depth = true
      tex, a, i = '', $2, true ; b = open("#{$1}.txt").read.split(/\n\n/); b.each do |sin|
      if (/\[#{a}\]\n/ =~ sin) == (i ? 3 : 0) ; tex = sin.sub(/\[#{a}\]\n/, '') ; break
      else ; tex = '' ; i = nil ; end ; end ; tex ; end
    text.gsub!(/\\[Tt][Xx][Tt]\[([0-龥]+)\]/){@def_depth = true ; open("#{$1}.txt").read}
    return text unless $scene # 遊戲尚未正式開始就中斷
    text.gsub!(/\\[Vv]\[(\d+)\]/){@def_depth = true ; $game_variables[$1.to_i]}
    text.gsub!(/\\[Ll]\[(\d+)\]/){@def_depth = true # 記憶控制碼
    $game_system.swordM_save[$1.to_i] != nil ? $game_system.swordM_save[$1.to_i] : ''}
  text ; end
  #-------------------------------------------------------------
  #● 關鍵字轉換
  def critical_word
    text = self.dup
    Sword::S46_Chase.each{|key, value| value.size == 1 ? text.gsub!(/#{key}/){value[0]} :
    text.gsub!(/#{key}/){value[0] + key + value[1]}}
  text ; end
  #-------------------------------------------------------------
  #● 描繪位圖(寬度, 高度, 間隔距離, 字體)
  def bitmap_explain(width, height, distance = 0, font = nil)
    bitmap = Bitmap.new(width, height)
    # 轉換內容控制碼的內容, X座標, Y座標, 行數, 單行資料, 最大資料
    text, x, y, br, row, max = self.dup, 0, 0, 0, [[0, 0, []]], [0, 0]
    # 字體表, 底線, 刪除線, 顏色紀錄, 陰影位置, 圖片表, VX預設陰影紀錄用
    font_n, font_u, font_s, gradually, shadow, picture, vshadow = [], false, false, nil, 0, [], nil
    font ? bitmap.font = font : font = bitmap.font.dup  # 未設定字體時,產生預設字體
    text.gsub!(/\\[Aa][Ll]\[(\d+)\]/){"\x08#{$1}]"}
    text.gsub!(/\\[Bb][Ss]\[#{Rege} ?\, ?(\d+)\]/){
    picture << [$1, $2.to_i] ; "\x05#{picture.size - 1}]"}
    text.gsub!(/\\[Bb][Ss]\[#{Rege}\]/){picture << [$1, 0] ; "\x05#{picture.size - 1}]"}
    text.gsub!(/\\[Cc][Oo]\[(\d+) ?\, ?(\d+)\]/){"\x06#{$1},#{$2}]"}
    text.gsub!(/\\[Cc]\[(\d+)\]/){color = Window_Base.new(-33, -33, 33, 33).text_color($1.to_i)
    "\x01#{color.red.to_i},#{color.green.to_i},#{color.blue.to_i},#{color.alpha.to_i}]"}
    text.gsub!(/\\[Cc]\[(\d+) ?\, ?(\d+) ?\, ?(\d+)(?: ?\, ?(\d+)|)\]/){alpha = $4 ? $4.to_i : 255
    "\x01#{$1},#{$2},#{$3},#{alpha}]"}
    az = '([\dA-Za-z][\dA-Za-z])'
    text.gsub!(/\\[Cc]\[\##{az}#{az}#{az}(?:#{az}|)\]/){alpha = $4 ? $4.to_i(16) : 255
    "\x01#{$1.to_i(16)},#{$2.to_i(16)},#{$3.to_i(16)},#{alpha}]"}
    text.gsub!(/\\[Cc]/){"\x001]"}
    text.gsub!(/\\[Bb]/){"\x002]"}
    text.gsub!(/\\[Ii]/){"\x003]"}
    text.gsub!(/\\[Uu]/){"\x004]"}
    text.gsub!(/\\[Ss]/){"\x005]"}
    text.gsub!(/\\[Ff][Nn]\[#{Rege}\]/){font_n << $1 ; "\x02#{font_n.size - 1}]"}
    text.gsub!(/\\[Ff][Nn]/){"\x006]"}
    text.gsub!(/\\[Ff][Ss]\[(\d+)\]/){"\x03#{$1}]"}
    text.gsub!(/\\[Ff][Ss]/){"\x007]"}
    text.gsub!(/\\[Ff][Hh]\[(\d+)\]/){"\x04#{$1}]"}
    text.gsub!(/\\[Ff][Hh]/){"\x040]"}
    text.gsub!(/\\[Ff]/){"\x000]"}
    text.gsub!(/\\[Xx]\[(\-?\d+)\]/){"\x07X#{$1}]"}
    text.gsub!(/\\[Yy]\[(\-?\d+)\]/){"\x07Y#{$1}]"}
    while ((c = text.slice!(/./m)) != nil) ; case c
    when "\n" ; max[0] = x if x > max[0] # 換行
      row[br][1] += Sword::S46_NilText if row[br][1] == 0 # 該行無內容可能就附加隱藏高度
      row[br][1] += distance # 增加間隔距離
      row[br][0] = x ; x = 0 ; y += row[br][1] ; br += 1 ; row[br] = [0, 0, []] # 換行
    when "\x00" ; text.sub!(/(\d+)\]/, '')
      case $1
      when '0' ; bitmap.font.color, gradually, bitmap.font.bold, bitmap.font.italic, font_u, font_s,
        bitmap.font.name, bitmap.font.size, shadow =
        font.color, nil, font.bold, font.italic, false, false, font.name, font.size, 0
        (bitmap.font.shadow = vshadow ; vshadow = nil) if $Sword_VX and vshadow != nil
      when '1' ; bitmap.font.color, gradually = font.color, nil # 還原顏色
        (bitmap.font.shadow = vshadow ; vshadow = nil) if $Sword_VX and vshadow != nil
      when '2' ; bitmap.font.bold = ! bitmap.font.bold # 粗細體互換
      when '3' ; bitmap.font.italic = ! bitmap.font.italic # 斜直體互換
      when '4' ; font_u = ! font_u # 底線附加或解除
      when '5' ; font_s = ! font_s # 刪除線附加或解除
      when '6' ; bitmap.font.name = font.name # 還原字體
      when '7' ; bitmap.font.size = font.size # 還原大小
      end
    when "\x01" ; text.sub!(/(\d+)\,(\d+)\,(\d+)\,(\d+)\]/, '') # 變更文字顏色
      gradually = nil if gradually.is_a?(Color) # 取消漸層色
      gradually ? gradually = Color.new($1.to_i, $2.to_i, $3.to_i, $4.to_i) :
      bitmap.font.color = Color.new($1.to_i, $2.to_i, $3.to_i, $4.to_i)
      gradually = true if (/\x01/ =~ text) == 0 unless gradually # 設定漸層判斷標誌
    when "\x02" ; text.sub!(/(\d+)\]/, '') # 變更字體
      bitmap.font.name = font_n[$1.to_i] if Font.exist?(font_n[$1.to_i])
    when "\x03" ; text.sub!(/(\d+)\]/, '') ; bitmap.font.size = $1.to_i # 變更大小
    when "\x04" ; text.sub!(/(\d+)\]/, '') ; shadow = $1.to_i # 變更陰影位置
    when "\x05" ; text.sub!(/(\d+)\]/, '') ; # 描繪圖片
      cache = Bitmap.new(picture[$1.to_i][0])
      cache.hue_change(picture[$1.to_i][1]) # 色相處理
      rect = Rect.new(0, 0, cache.width, cache.height)
      bitmap.blt(x, y, cache, rect)
      row[br][2] << [1, picture[$1.to_i], Rect.new(x, y, rect.width, rect.height)]
      x += rect.width
      row[br][1] = rect.height if rect.height > row[br][1]
      max[1] = rect.height if rect.height > max[1]
    when "\x06" ; text.sub!(/(\d+),(\d+)\]/, '') ; # 描繪矩形
      bitmap.fill_rect(x, y, $1.to_i, $2.to_i, bitmap.font.color)
      row[br][2] << [2, nil, Rect.new(x, y, $1.to_i, $2.to_i)]
      x += $1.to_i
      row[br][1] = $2.to_i if $2.to_i > row[br][1] ; max[1] = $2.to_i if $2.to_i > max[1]
    when "\x07" ; text.sub!(/([XY])(\-?\d+)\]/, '') ; $1 == 'X' ? x += $2.to_i : y += $2.to_i # 移動
    when "\x08" ; text.sub!(/(\d+)\]/, '') ; align = $1.to_i
    else ; cx, cy = bitmap.text_size(c).width, bitmap.text_size(c).height
      (x = 0 ; y += cy) if x + cx >= width # 自動換行
      if shadow > 0 # 陰影文字的場合
        color_dup = bitmap.font.color.dup
        bitmap.font.color = Color.new(0, 0, 0)
        bitmap.draw_text(x - 1, y + 1, cx, cy, c) if [1, 5].include?(shadow)
        bitmap.draw_text(x, y + 1, cx, cy, c) if [2, 5].include?(shadow)
        bitmap.draw_text(x + 1, y + 1, cx, cy, c) if [3, 5].include?(shadow)
        bitmap.draw_text(x - 1, y, cx, cy, c) if [4, 5].include?(shadow)
        bitmap.draw_text(x + 1, y, cx, cy, c) if [6, 5].include?(shadow)
        bitmap.draw_text(x - 1, y - 1, cx, cy, c) if [7, 5].include?(shadow)
        bitmap.draw_text(x, y - 1, cx, cy, c) if [8, 5].include?(shadow)
        bitmap.draw_text(x + 1, y - 1, cx, cy, c) if [9, 5].include?(shadow)
        bitmap.font.color = color_dup
      end
      if gradually # 描繪漸層文字的場合
        (vshadow = bitmap.font.shadow ; bitmap.font.shadow = false) if
        $Sword_VX and vshadow == nil # 取消陰影
        grad = [(gradually.red - bitmap.font.color.red) / cy,
        (gradually.green - bitmap.font.color.green) / cy,
        (gradually.blue - bitmap.font.color.blue) / cy,
        (gradually.alpha - bitmap.font.color.alpha) / cy]
        col = [bitmap.font.color.red, bitmap.font.color.green,
        bitmap.font.color.blue, bitmap.font.color.alpha]
        colr = col.dup
        cy.times{|i| bitmap.font.color =
        Color.new(col[0] += grad[0], col[1] += grad[1], col[2] += grad[2], col[3] += grad[3]).dup
        bitmap.draw_text(x, y, cx, cy - i, c)}
        bitmap.font.color = Color.new(colr[0], colr[1], colr[2], colr[3])
      else ; bitmap.draw_text(x, y, cx, cy, c) # 描繪文字
      end
      bitmap.fill_rect(x, y + cy - 1, cx, 1, bitmap.font.color) if font_u # 描繪底線
      bitmap.fill_rect(x, y + cy / 2, cx, 1, bitmap.font.color) if font_s # 描繪刪除線
      row[br][2] << [0, c, Rect.new(x, y, cx, cy)]
      x += cx
      row[br][1] = cy if cy > row[br][1] ; max[1] = cy if cy > max[1]
    end ; yield bitmap ; end
    $Sword46 = [[max[0], max[1] + y + cy], row]
    GC.start
    bitmap
  end
end
#=======================================
#■ 系統
class Game_System
  attr_accessor(:swordM_save) # 記憶控制碼
  attr_accessor(:swordM_data) # 讀取的數據資料
  #-------------------------------------------------------------
  #● 初始化狀態
  alias sword46_initialize initialize
  def initialize ; sword46_initialize
    @swordM_save, @swordM_data = [], nil
  end
end




請前輩幫幫忙....




欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1