赞 | 0 |
VIP | 0 |
好人卡 | 0 |
积分 | 1 |
经验 | 6823 |
最后登录 | 2020-3-1 |
在线时间 | 141 小时 |
Lv1.梦旅人
- 梦石
- 0
- 星屑
- 65
- 在线时间
- 141 小时
- 注册时间
- 2012-4-29
- 帖子
- 54
|
加入我们,或者,欢迎回来。
您需要 登录 才可以下载或查看,没有帐号?注册会员
x
各位前輩好,小弟用了這個魔劍工鋪的 跟隨型說明窗口,但發現是被技能欄蓋住的...
腳本:
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
請前輩幫幫忙.... |
|