Project1
标题:
請問如何新增文字控制指令(gsub)?
[打印本页]
作者:
sai90306
时间:
2012-6-11 02:39
标题:
請問如何新增文字控制指令(gsub)?
本帖最后由 sai90306 于 2012-6-11 03:01 编辑
請問如何給這個腳本加上新的"文字指令"?
也就是透過增加新的gsub方法來實現
例如增加字體大小和文字加外框兩個指令
module Sword
#=======================================
#★魔劍工舖 - 地圖任意顯示文字窗口
#轉貼腳本請著名出處:[url]http://blog.yam.com/a870053jjkj/article/24354553[/url]
#如果採用在遊戲中,看你高興是否顯示腳本出處,但嚴禁說是自己寫的腳本!!
#=======================================
#● 使用者自定設置
SWORD_TEXT_DISP = 1 # 切換畫面時是否釋放所有窗口,0表示不使用
#=======================================
#● 文字指令
# \V[數值] : 顯示指定編號的變數(可用來代替 [數值] 使用!!)
# \C[數值] : 變更文字的顏色,顏色請在Window_Base類的text_color方法中設置
# \N[數值] : 顯示指定編號的角色名稱
# \S[數值] : 顯示指定編號的技能名稱
# \I[數值] : 顯示指定編號的物品名稱
# \W[數值] : 顯示指定編號的武器名稱
# \A[數值] : 顯示指定編號的防具名稱
# \E[數值] : 顯示指定編號的敵人名稱
# \\ : 顯示「\」符號
#=======================================
#● 呼叫方法
# sword_text(編號, X座標, 座標, 寬度, 高度, 不透明度, '
# 文字內容
# ')
#--------------------------------------------------------------
# [X座標] 輸入 「true」 : 窗口的X座標為呼叫此腳本的事件的中央顯示
# [Y座標] 輸入 「true」 : 窗口的Y座標為呼叫此腳本的事件的上方顯示
# [寬度] 輸入 「true」 : 窗口的寬度依照文字內容最長的內容自動調整
# [高度] 輸入 「true」 : 窗口的高度依照文字內容的行數來自動調整
#=======================================
#● 關閉窗口
# sword_text_dispose(編號) : 關閉指定編號的窗口
# sword_text_dispose(true) : 關閉目前顯示編號最大的窗口
# sword_text_dispose(false) : 關閉目前顯示編號最小的窗口
# sword_text_dispose(nil) : 關閉目前顯示的所有窗口
#詳細設置說明請參考:[url]http://blog.yam.com/a870053jjkj/article/24354553[/url]
#=======================================
$sword_text_window = []
end
class WSword_Text < Window_Base
def initialize(z, x, y, ox, oy, text)
contents = Bitmap.new(33 - 32 , 33 - 32)
# 將字串分解成數組並計算最長文字寬度與行數
text = text.scan(/\S*/)
cx = []
br = 0
for i in 0...text.size
text[i] == "" ? text[i] = nil : 0
text[i] == nil ? br += 32 : cx[i] = contents.text_size(text[i]).width + 32
end
br -= 32
cx.compact!
for i in 1...cx.size
cx[0] >= cx[i] ? 0 : cx[0] = cx[i]
end
# 刪除不必要的部份,只留字串
text.shift and text.pop and text.pop
text.compact!
# 當指定位置或大小為true時自動調整
@x = x
x.is_a?(Array) ? x = x[0] - (cx[0] / 2 - 16) : 0
y.is_a?(Array) ? y = y[0] - br / 2 - br / 2 - 16 : 0
ox == true ? @ox = true : 0
@ox == true ? ox = cx[0] : 0
oy == true ? oy = br : 0
super(x, y, ox, oy)
self.contents = Bitmap.new(width - 32, height - 32)
self.z = z
@text = text
refresh
end
def refresh
self.contents.clear
# 防止相同字符串被更動,加上標記
a = @text[0] + "\\br"
if @ox == true
text_width(@text)
end
a.gsub!(/\\br/) { "" } # 刪除標記
@text[0] = a
y = 0 # 文字的Y座標
# 循環每行的內容
for i in @text
text = [] # 儲存一行內容和指令之用
b = 0 # 數組欄位
a = "" # 暫存字串中的1個字
i.gsub!(/\\[Vv]\[([0-9]+)\]/) { $game_variables[$1.to_i] }
i.gsub!(/\\[Cc]\[([0-9]+)\]/) { "\000[#{$1}]" }
i.gsub!(/\\[Nn]\[([0-9]+)\]/) do
$game_actors[$1.to_i] != nil ? $game_actors[$1.to_i].name : ""
end
i.gsub!(/\\[Ss]\[([0-9]+)\]/) do
$data_skills[$1.to_i] != nil ? $data_skills[$1.to_i].name : ""
end
i.gsub!(/\\[Ii]\[([0-9]+)\]/) do
$data_items[$1.to_i] != nil ? $data_items[$1.to_i].name : ""
end
i.gsub!(/\\[Ww]\[([0-9]+)\]/) do
$data_weapons[$1.to_i] != nil ? $data_weapons[$1.to_i].name : ""
end
i.gsub!(/\\[Aa]\[([0-9]+)\]/) do
$data_armors[$1.to_i] != nil ? $data_armors[$1.to_i].name : ""
end
i.gsub!(/\\[Ee]\[([0-9]+)\]/) do
$data_enemies[$1.to_i] != nil ? $data_enemies[$1.to_i].name : ""
end
while ((c = i.slice!(/./m)) != nil)
if c == "\000" # \C 顏色
text[b] = a
b += 1
i.sub!(/\[([0-9]+)\]/, "")
text[b] = ["c", $1.to_i]
b += 1
a = ""
next
end
a += c
end
text[b] = a
# 產生窗口內容
x = 0
self.contents.font.color = normal_color
# 循環該行內容(判斷指令)
for i in text
if i.is_a?(String) # 顯示文字
self.contents.draw_text(x, y, 640, 32, i)
x += contents.text_size(i).width
else
case i[0]
when "c" # 更換顏色
self.contents.font.color = text_color(i[1])
end
end
end
y += 32
end
end
# 自動調整寬度的方法
def text_width(text)
text = [] # 用來記錄每行文字的寬度
b = 0 # 數組欄位
for i in @text
i.gsub!(/\\[Vv]\[([0-9]+)\]/) { $game_variables[$1.to_i] }
i.gsub!(/\\[Cc]\[([0-9]+)\]/) { "" }
i.gsub!(/\\[Nn]\[([0-9]+)\]/) do
$game_actors[$1.to_i] != nil ? $game_actors[$1.to_i].name : ""
end
i.gsub!(/\\[Ss]\[([0-9]+)\]/) do
$data_skills[$1.to_i] != nil ? $data_skills[$1.to_i].name : ""
end
i.gsub!(/\\[Ii]\[([0-9]+)\]/) do
$data_items[$1.to_i] != nil ? $data_items[$1.to_i].name : ""
end
i.gsub!(/\\[Ww]\[([0-9]+)\]/) do
$data_weapons[$1.to_i] != nil ? $data_weapons[$1.to_i].name : ""
end
i.gsub!(/\\[Aa]\[([0-9]+)\]/) do
$data_armors[$1.to_i] != nil ? $data_armors[$1.to_i].name : ""
end
i.gsub!(/\\[Ee]\[([0-9]+)\]/) do
$data_enemies[$1.to_i] != nil ? $data_enemies[$1.to_i].name : ""
end
text[b] = contents.text_size(i).width
b += 1
end
# 獲取數組中數值最高的數值
for i in 1...text.size
text[0] >= text[i] ? 0 : text[0] = text[i]
end
self.width = text[0] + 32
# 窗口X座標修正
if @x.is_a?(Array)
x = @x[0] - (self.width / 2 - 16)
self.x = x
end
self.contents = Bitmap.new(width - 32, height - 32)
end
end
#☆ 事件中呼叫的處理
class Interpreter
# 產生窗口的方法
def sword_text(i, x, y, width, height, opacity, text)
# 防止非法編號
if i <= 0
return
end
x == true ? x = [$game_map.events[@event_id].x * 32] : 0
y == true ? y = [$game_map.events[@event_id].y * 32] : 0
unless $sword_text_window[i] == nil
$sword_text_window[i].dispose
end
$sword_text_window[i] = WSword_Text.new(i, x, y, width, height, text)
$sword_text_window[i].opacity = opacity
end
# 釋放窗口的方法
def sword_text_dispose(dispose)
case dispose
when Integer # 整數(釋放指定編號的窗口)
unless $sword_text_window[dispose] == nil
$sword_text_window[dispose].dispose
$sword_text_window[dispose] = nil
end
when TrueClass # true(釋放最前面的窗口)
i = 1
loop do
a = $sword_text_window.size - i
unless $sword_text_window[a] == nil
$sword_text_window[a].dispose
$sword_text_window[a] = nil
return
end
if a <= 0
return
end
i += 1
end
when FalseClass # false(釋放最後面的窗口)
for i in 1...$sword_text_window.size
unless $sword_text_window[i] == nil
$sword_text_window[i].dispose
$sword_text_window[i] = nil
return
end
end
when NilClass # nil(釋放所有顯示的窗口)
for i in 1...$sword_text_window.size
unless $sword_text_window[i] == nil
$sword_text_window[i].dispose
$sword_text_window[i] = nil
end
end
end
end
end
#☆ 切換畫面時釋放窗口
class Scene_Map
include Sword
alias sword_main4 main
def main
sword_main4
SWORD_TEXT_DISP == 0 ? 0 : Interpreter.new.sword_text_dispose(nil)
end
end
复制代码
另附上可能有相關的參考腳本
module Sword
#=======================================
#★ 魔劍工舖 - 多功能對話框
# 轉貼腳本請著名出處:[url]http://blog.yam.com/a870053jjkj/[/url]
# 如果採用在遊戲中,看你高興是否顯示腳本出處,但嚴禁說是自己寫的腳本!!
#=======================================
#● 使用者自定設置
#○ 基本設置
SWORD_MESS_POSI = [16, 0, 0] # 設定對話框的 [上, 中, 下]的Y座標,0為自動調整
SWORD_MESS_PAUS = 10 # 設定暫停標誌的每格動畫的時間
SWORD_MESS_SWIT = ['開', '關'] # 設定控制碼「\S」顯示的內容 ([ON,OFF)
SWORD_MESS_SEVP = [80, 100] # 設定控制碼「\SE」預設的 [音量, 音調]
SWORD_MESS_NACO = [192, 224, 255] # 設定用頭像+名稱控制碼的名稱文字顏色
SWORD_MESS_HEAD = [120, 140] # 設定頭像 [寬度, 高度],0表示依圖片自動調整
SWORD_MESS_NAME = '' # 設定對話框預設的字體,找不到該字體就用預設字體
SWORD_MESS_SIZE = 22 # 設定對話框預設的文字大小,0表示使用預設大小
SWORD_MESS_BOIT = [0, 0] # 設定對話框預設是否 [粗體, 斜體],0否、1是
SWORD_MESS_COLO = [255, 255, 255] # 設定對話框預設的文字顏色 [紅, 綠, 藍]
#--------------------------------------------------------------
#○ 追蹤字詞添加設置
# 找到指定內容,就在內容前後附加內容,'追蹤內容'=>['前附加內容', '後附加內容'],
SWORD_MESS_TRAY = {
'你好'=>['\c[6]', '\c[0]'],
'阻止他'=>['\fs[32]', '\fs[22]'],
} # 設置結束
#=======================================
#● 控制碼
#○ 內容控制碼
# \V[變數編號] : 顯示指定變數編號的數值,可當成其他控制碼的參數用(深度為5)
# \S[開關編號] : 顯示指定開關編號目前的狀態文字,依設置SWORD_MESS_SWIT
# \N[角色編號] : 顯示指定角色編號的角色名稱
# \CN[職業編號] : 顯示指定職業編號的職業名稱
# \SN[技能編號] : 顯示指定技能編號的技能名稱
# \IN[物品編號] : 顯示指定物品編號的物品名稱
# \WN[武器編號] : 顯示指定武器編號的武器名稱
# \AN[防具編號] : 顯示指定防具編號的防具名稱
# \EN[敵人編號] : 顯示指定敵人編號的敵人名稱
# \GV : 顯示目前玩家持有的金錢
# \EQ[角色編號,部位] : 顯示角色編號裝備的名稱,部位-0武、1盾、2頭、3身、4飾
# \\ : 顯示「\」,通常被此控制碼顯示的左斜線通常不會被當成是控制碼而使用
# \MA[地圖編號] : 顯示指定地圖編號的地圖名稱,設置0表示目前的地圖
# \NN[角色編號] : 顯示指定角色編號的戰鬥圖檔案名稱(可配合頭像控制碼使用)
# \NS[技能編號] : 顯示指定技能編號的圖標檔案名稱(可配合 \I 控制碼使用)
# \NI[物品編號] : 顯示指定物品編號的圖標檔案名稱(可配合 \I 控制碼使用)
# \NW[武器編號] : 顯示指定武器編號的圖標檔案名稱(可配合 \I 控制碼使用)
# \NA[防具編號] : 顯示指定防具編號的圖標檔案名稱(可配合 \I 控制碼使用)
# \I[檔案名稱] : 顯示Icons資料夾中指定檔案名稱的圖片
# \HR : 顯示分隔線,會從此控制碼作為起點顯示到該行結束為止,會前進一行
#--------------------------------------------------------------
#○ 文字控制碼
# \C[顏色代碼] : 變更預設的顏色,可在「Window_Base」腳本的text_color方法設置
# \CR[紅,綠,藍] : 變更自定的顏色
# \CU[紅,綠,藍] : 文字上下顏色漸層效果,會受變更顏色而取消此控制碼
# \FN[字體名稱] : 變更指定的字體,如果該玩家電腦無該字體,則什麼都不做
# \FS[大小] : 變更文字的大小,離下行的距離會受到影響,預設大小為22
# \FB : 將文字變更為粗體表示,在使用一次會恢復原裝
# \FI : 將文字往右斜倒表示,在使用一次會恢復原狀
# \F_ : 將文字下面附加一條底線,在使用一次會恢復原狀
# \F- : 將文字中央附加一條刪除線,在使用一次會恢復原狀
# \FH : 將文字右下方附加上陰影,在使用一次會恢復原狀
# \F : 回到無使用文字控制碼時的預設狀態
#--------------------------------------------------------------
#○ 頭像控制碼
# \LS[檔案名稱] : 對話框左邊顯示指定檔案名稱的圖片,顯示內容寬度會減少
# \LSU[角色名稱,檔案名稱] : 效果同 \LS 控制碼,只不過圖片上方加上角色名稱
# \LSD[角色名稱,檔案名稱] : 效果同 \LS 控制碼,只不過圖片下方加上角色名稱
#--------------------------------------------------------------
#○ 聲音控制碼
# \SE[檔案名稱] : 演奏指定檔案名稱的ME,音量和音調依SWORD_MESS_SEVP
# \SE[檔案名稱,音量,音調] : 和上面的 \SE 控制碼一樣,但這可指定音量和音調
# \SEX : 停止目前演奏的SE,可能會影響其他的SE,請找適當實機來使用
#--------------------------------------------------------------
#○ 功能控制碼
# \G : 在右上方顯示金錢窗口
# \M[幀數] : 變更每個字顯示的延遲時間,0表示1次全顯示,變更後會保存!!
# \.[幀數] : 內容顯示到此控制碼會停止顯示,指定幀數到後才繼續顯示後面的內容
# \! : 內容顯示到此控制碼會停止顯示,當按下確定鍵後才繼續顯示後面的內容
# \> : 內容顯示到此控制碼後,則之後的內容會瞬間顯示完畢(暫時無效 \M 控制碼)
# \^[幀數] : 內容顯示到此控制碼後開始計時,時間到時顯示下個事件指令
# \L[編號] : 此控制碼視同指定編號的[設定記憶]的設置內容( \V 控制碼深度為2)
# \XN : 增加1次無視換行標誌來防止換行(突破事件限制),但超過對話框則不適用
# \SS[開關編號] : 該控制碼後面的內容隱藏,如果指定的開關為ON才會顯示
# \SX : 使用 \SS 控制碼將後面的內容隱藏時,當執行到此控制碼就停止隱藏
# \BR : 同Enter換行(突破事件換行限制用),此換行也會被 \XN 控制碼無效的可能
# \P : 判斷下個事件是否為 [顯示文章],如果是就當做是同一個 [顯示文章] 事件
# \SH[幀數] : 讓對話框震動指定的時間,後面內容會無法顯示(尚未找到解決方式)
#=======================================
#● 設置方法
# 變更對話大小:$game_system.swordM_WidthHeight = [寬度, 高度]
# 打字效果延遲:$game_system.swordM_rate = 延遲幀數
# 存記憶控制碼:$game_system.swordM_save[編號] = '文字內容'
# 變更按鍵顯示:$game_system.swordM_key
#--------------------------------------------------------------
$Sword ? $Sword[1] = true : $Sword = {1=>true} # 腳本使用標誌
SWORD_MESS_INHE = 0 # 未完成物,請勿更動
end
# 詳細設置說明請參考:[url]http://blog.yam.com/a870053jjkj/article/[/url]
#=======================================
#■ 處理系統附屬資料的類別
class Game_System
alias sword5_initialize initialize
attr_accessor :swordM_rate # 對話框打字延遲速度
attr_accessor :swordM_save # 記憶控制碼的儲存庫
attr_accessor :swordM_WidthHeight # 對話框大小
#● 初始化狀態
def initialize
sword5_initialize
@swordM_rate = 5
@swordM_save = []
@swordM_key = true
@swordM_WidthHeight = [500, 160]
end
#-------------------------------------------------------------
#● 更換按鍵輸入全部顯示的方法
def swordM_key(a = false)
@swordM_key = (not @swordM_key) unless a
return @swordM_key if a
end
end
#=======================================
#■ 暫停標誌窗口
class WSword_MessagePause < Window_Base
include Sword
#● 初始化狀態
def initialize
super($game_system.swordM_WidthHeight[0] / 2 - 4,
33 + $game_system.swordM_WidthHeight[1] - 32, 48, 48)
self.contents = Bitmap.new(width - 32, height - 32)
self.visible = false
self.opacity = 0
self.z = 6010
end
#-------------------------------------------------------------
#● 更新內容
def refresh
@pause[1] -= 1
return unless @pause[1] == 0
self.contents.clear
cache = RPG::Cache.windowskin($data_system.windowskin_name)
case @pause[0]
when 1 # 左上
rx = 0 and ry = 0 and @pause = [2, SWORD_MESS_PAUS+1]
when 2 # 右上
rx = 1 and ry = 0 and @pause = [3, SWORD_MESS_PAUS+1]
when 3 # 左下
rx = 0 and ry = 1 and @pause = [4, SWORD_MESS_PAUS+1]
when 4 # 右下
rx = 1 and ry = 1 and @pause = [1, SWORD_MESS_PAUS+1]
end
self.contents.blt(0, 0, cache, Rect.new(160 + 16 * rx, 64 + 16 * ry, 16, 16))
end
#-------------------------------------------------------------
#● 顯示標誌(初始化暫停標記用)
def visible=(visible)
super(visible)
@pause = [4, 1]
case $game_system.message_position
when 0 # 上
self.y = SWORD_MESS_POSI[0] == 0 ? 16 : SWORD_MESS_POSI[0]
when 1 # 中
self.y = SWORD_MESS_POSI[1] == 0 ?
320 - $game_system.swordM_WidthHeight[1] : SWORD_MESS_POSI[1]
when 2 # 下
self.y = SWORD_MESS_POSI[2] == 0 ?
464 - $game_system.swordM_WidthHeight[1] : SWORD_MESS_POSI[2]
end
# 戰鬥時的場合
if $game_temp.in_battle
self.y = SWORD_MESS_POSI[0] == 0 ? 16 : SWORD_MESS_POSI[0]
end
self.y += $game_system.swordM_WidthHeight[1] - 32
self.x = (640 - $game_system.swordM_WidthHeight[0]) / 2 +
($game_system.swordM_WidthHeight[0] / 2) - 24
end
end
#=======================================
#■ 對話框戰鬥圖(頭像)窗口
class WSword_MessageCharacter < Window_Base
include Sword
#● 初始化物件
def initialize(x, y)
super(x - 48, y - 48, 640, 480)
self.contents = Bitmap.new(width - 32, height - 32)
self.z = 6005
self.visible = false
self.opacity = 0
@name = ['', 0] # 記錄 [角色名稱, 頭像類型]
end
#-------------------------------------------------------------
#● 更新內容
def refresh(type = 0, battler = '', name = '')
#○ 描繪圖片
battler = RPG::Cache.battler(battler, 0)
a = SWORD_MESS_HEAD[0] == 0 ? battler.width : SWORD_MESS_HEAD[0]
b = SWORD_MESS_HEAD[1] == 0 ? battler.height : SWORD_MESS_HEAD[1]
record = [type, battler.width, battler.height, 0]
record[1] = SWORD_MESS_HEAD[0] if SWORD_MESS_HEAD[0] > 0
record[2] = SWORD_MESS_HEAD[1] if SWORD_MESS_HEAD[1] > 0
return record if @name[0] == name if type == @name[1]
@name = [name, type]
self.contents.clear
y = 0 # 圖片Y座標修正用
#○ 描繪角色名稱
color = SWORD_MESS_NACO
self.contents.font.color = Color.new(color[0], color[1], color[2])
case type
when 2 ; y = 32 ; self.contents.draw_text(0, 0, SWORD_MESS_HEAD[0], 32, name, 1)
when 3
self.contents.draw_text(0, record[2], SWORD_MESS_HEAD[0], 32, name, 1)
end
self.contents.blt(0, y, battler, Rect.new(0, 0, a, b))
return record
end
end
#=======================================
#■ 顯示對話的訊息視窗
class Window_Message < Window_Selectable
include Sword
attr_accessor :afresh # 重新產生窗口標誌
#● 初始化物件
def initialize
super((640 - $game_system.swordM_WidthHeight[0]) / 2,
304, $game_system.swordM_WidthHeight[0], $game_system.swordM_WidthHeight[1])
self.contents = Bitmap.new(width - 32, height - 32)
self.visible = false
self.z = 6000
@fade_out = false
@font = Font.exist?(SWORD_MESS_NAME) ? SWORD_MESS_NAME : Font.default_name
@wait_count = -1 # 自動關閉對話框時間
@delay_input = 0 # 按鍵全部顯示後的延遲時間
@messagepause_wsword = WSword_MessagePause.new # 產生暫停標誌窗口
@messagecharacter_wsword = WSword_MessageCharacter.new(self.x, self.y) # 頭像窗口
self.opacity = 160
self.index = -1 # 選擇項位置
end
#-------------------------------------------------------------
#● 設定視窗位置與不透明度
def reset_window
# 更改對話框的情況
unless $game_system.swordM_WidthHeight == [self.width, self.height]
self.x = (640 - $game_system.swordM_WidthHeight[0]) / 2
self.width = $game_system.swordM_WidthHeight[0]
self.height = $game_system.swordM_WidthHeight[1]
self.contents = Bitmap.new(width - 32, height - 32)
end
if $game_temp.in_battle
self.y = SWORD_MESS_POSI[0] == 0 ? 16 : SWORD_MESS_POSI[0]
else
case $game_system.message_position
when 0 # 上
self.y = SWORD_MESS_POSI[0] == 0 ? 16 : SWORD_MESS_POSI[0]
when 1 # 中
self.y = SWORD_MESS_POSI[1] == 0 ?
320 - $game_system.swordM_WidthHeight[1] : SWORD_MESS_POSI[1]
when 2 # 下
self.y = SWORD_MESS_POSI[2] == 0 ?
464 - $game_system.swordM_WidthHeight[1] : SWORD_MESS_POSI[2]
end
end
if $game_system.message_frame == 0
self.opacity = 160
else
self.opacity = 0
end
self.back_opacity = 160
end
#-------------------------------------------------------------
#● 更新內容
def refresh
self.contents.clear
# 字體變更為預設值
unless $game_switches[SWORD_MESS_INHE]
self.contents.font.name = @font
self.contents.font.size = SWORD_MESS_SIZE == 0 ?
Font.default_size : SWORD_MESS_SIZE
self.contents.font.bold = SWORD_MESS_BOIT[0] == 0 ?
Font.default_bold : SWORD_MESS_BOIT[0]
self.contents.font.italic = SWORD_MESS_BOIT[1] == 0 ?
Font.default_italic : SWORD_MESS_BOIT[1]
color = SWORD_MESS_COLO
self.contents.font.color = Color.new(color[0], color[1], color[2])
@record[0] = nil if @record
end
@cursor_width = [0, $game_system.swordM_WidthHeight[0] - 32]
# 定義控制碼用的記錄空間
# [瞬間顯示,瞬間顯示2,忽略換行,頭像記錄,開關隱藏,圖示,文字大小,該行大小]
x = 0 and y = 0 and record = [false, false, 0, [0, 0, 0, 0], {}, nil, 0, []]
# [漸層,底線,刪除線,陰影,底色]
@record = [nil, false, false, false, nil]
message_text = $game_temp.message_text
#○ 追蹤字詞處理
for i in SWORD_MESS_TRAY
message_text.gsub!(/#{i[0]}/) { i[1][0] + i[0] + i[1][1] }
end
#○ 轉換控制碼
message_text.gsub!(/\\[Vv]\[(\d+)\]/) { $game_variables[$1.to_i] } while
/\\[Vv]\[\d+\]/ === message_text
message_text.gsub!(/\\[Ss]\[([\d]+)\]/) do
$game_switches[$1.to_i] ? SWORD_MESS_SWIT[0] : SWORD_MESS_SWIT[1]
end
message_text.gsub!(/\\[Nn]\[([\d]+)\]/) do
$game_actors[$1.to_i] != nil ? $game_actors[$1.to_i].name : ''
end
message_text.gsub!(/\\[Cc][Nn]\[([\d]+)\]/) do
$game_classes[$1.to_i] != nil ? $game_classes[$1.to_i].name : ''
end
message_text.gsub!(/\\[Ss][Nn]\[([\d]+)\]/) do
$game_skills[$1.to_i] != nil ? $game_skills[$1.to_i].name : ''
end
message_text.gsub!(/\\[Ii][Nn]\[([\d]+)\]/) do
$game_items[$1.to_i] != nil ? $game_items[$1.to_i].name : ''
end
message_text.gsub!(/\\[Ww][Nn]\[([\d]+)\]/) do
$game_weapons[$1.to_i] != nil ? $game_weapons[$1.to_i].name : ''
end
message_text.gsub!(/\\[Aa][Nn]\[([\d]+)\]/) do
$game_armors[$1.to_i] != nil ? $game_armors[$1.to_i].name : ''
end
message_text.gsub!(/\\[Ee][Nn]\[([\d]+)\]/) do
$game_enemies[$1.to_i] != nil ? $game_enemies[$1.to_i].name : ''
end
message_text.gsub!(/\\[Nn][Nn]\[([\d]+)\]/) do
$game_actors[$1.to_i] != nil ? $game_actors[$1.to_i].character_name : ''
end
message_text.gsub!(/\\[Nn][Ss]\[([\d]+)\]/) do
$data_skills[$1.to_i] != nil ? $data_skills[$1.to_i].icon_name : ''
end
message_text.gsub!(/\\[Nn][Ii]\[([\d]+)\]/) do
$data_items[$1.to_i] != nil ? $data_items[$1.to_i].icon_name : ''
end
message_text.gsub!(/\\[Nn][Ww]\[([\d]+)\]/) do
$data_weapons[$1.to_i] != nil ? $data_weapons[$1.to_i].icon_name : ''
end
message_text.gsub!(/\\[Nn][Aa]\[([\d]+)\]/) do
$data_armors[$1.to_i] != nil ? $data_armors[$1.to_i].icon_name : ''
end
message_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
message_text.gsub!(/\\[Mm][Aa]\[([\d]+)\]/) do
load_data("Data/MapInfos.rxdata")[$1.to_i].name
end
# 頭像
message_text.gsub!(/\\[Ll][Ss]\[([\w_\-]+)\]/) do
next if record[3][0] > 0
record[3] = @messagecharacter_wsword.refresh(1, $1)
@messagecharacter_wsword.visible = true
@cursor_width[0] = record[3][1] ; @cursor_width[1] -= record[3][2]
''
end
# 頭像,並上面加上名稱
message_text.gsub!(/\\[Ll][Ss][Uu]\[([\w_\-]+)\,([\w_\-]+)\]/) do
next if record[3][0] > 0
record[3] = @messagecharacter_wsword.refresh(2, $1, $2)
@messagecharacter_wsword.visible = true
@cursor_width[0] = record[3][1] ; @cursor_width[1] -= record[3][2]
''
end
# 頭像,並下面加上名稱
message_text.gsub!(/\\[Ll][Ss][Dd]\[([\w_\-]+)\,([\w_\-]+)\]/) do
next if record[3][0] > 0
record[3] = @messagecharacter_wsword.refresh(3, $1, $2)
@messagecharacter_wsword.visible = true
@cursor_width[0] = record[3][1] ; @cursor_width[1] -= record[3][2]
''
end
@messagecharacter_wsword.visible = false if record[3][0] == 0
message_text.gsub!(/\\[Gg][Vv]/) { $game_party.gold }
message_text.gsub!(/\\[Pp]/) { '' }
message_text.gsub!(/\\[Bb][Rr]/) { "\n" }
message_text.gsub!(/\\[Cc]\[([\d]+)\]/) { "\001[#{$1}]" }
message_text.gsub!(/\\[Gg]/) { "\002" }
message_text.gsub!(/\\\.\[([\d]+)\]/) { "\003[#{$1}]" }
message_text.gsub!(/\\\!/) { "\004" }
message_text.gsub!(/\\>/) { "\005" }
message_text.gsub!(/\\[Mm]\[([\d]+)\]/) { "\006[#{$1}]" }
message_text.gsub!(/\\[Cc][Rr]\[([\d]+)\,([\d]+)\,([\d]+)\]/) { "\007[#{$1},#{$2},#{$3}]" }
message_text.gsub!(/\\\^\[([\d]+)\]/) { "\010[#{$1}]" }
message_text.gsub!(/\\[Xx][Nn]/) { "\011" }
message_text.gsub!(/\\[Ss][Ee]\[([\w_\-]+)\]/) { "\016[#{$1}]" }
message_text.gsub!(/\\[Ss][Ee]\[([\w_\-]+)\,(\d+)\,(\d+)\]/) { "\017[#{$1},#{$2},#{$3}]" }
message_text.gsub!(/\\[Ss][Ee][Xx]/) { "\037" }
message_text.gsub!(/\\[Ss][Ss]\[(\d+)\]/) { "\020[#{$1}]" }
message_text.gsub!(/\\[Ss][Xx]/) { "\021" }
message_text.gsub!(/\\[Ii]\[([\w_\-]+)\]/) { "\022[#{$1}]" }
message_text.gsub!(/\\[Ff][Nn]\[([\w_\-]+)\]/) { "\023[#{$1}]" }
message_text.gsub!(/\\[Ff][Ss]\[(\d+)\]/) { "\024[#{$1}]" }
message_text.gsub!(/\\[Ff][Bb]/) { "\025" }
message_text.gsub!(/\\[Ff][Ii]/) { "\026" }
message_text.gsub!(/\\[Ff]_/) { "\032" }
message_text.gsub!(/\\[Ff]\-/) { "\033" }
message_text.gsub!(/\\[Ff][Hh]/) { "\034" }
message_text.gsub!(/\\[Ff]/) { "\027" }
message_text.gsub!(/\\[Cc][Uu]\[(\d+)\,(\d+)\,(\d+)\]/) { "\030[#{$1},#{$2},#{$3}]" }
message_text.gsub!(/\\[Hh][Rr]/) { "\031" }
message_text.gsub!(/\\[Cc][Bb]\[(\d+)\,(\d+)\,(\d+)\]/) { "\035[#{$1},#{$2},#{$3}]" }
message_text.gsub!(/\\[Ss][Hh]\[(\d+)\]/) { "\042[#{$1}]" }
#message_text.gsub!(/ /) { "\034" }
#○ 執行控制碼功能
while ((c = message_text.slice!(/./m)) != nil)
record[6] = self.contents.font.size + 10
case c
when "\n" # 換行
if record[2] > 0 # 有無效換行標誌的場合
record[2] -= 1
next
end
x = 0 and y += record[6]
next
when "\001" # 換色
message_text.sub!(/\[(\d+)\]/, '')
self.contents.font.color = text_color($1.to_i)
@record[0] = nil
next
when "\002" # 顯示金錢窗口
if @gold_window == nil
@gold_window = Window_Gold.new
@gold_window.x = 560 - @gold_window.width
if $game_temp.in_battle
@gold_window.y = 192
else
@gold_window.y = self.y >= 128 ? 32 : 384
end
@gold_window.opacity = self.opacity
@gold_window.back_opacity = self.back_opacity
end
next
when "\003" # 等待
message_text.sub!(/\[(\d+)\]/, '')
for i in 1..$1.to_i
Graphics.update
end
when "\004" # 等待按鍵
loop do
Graphics.update
Input.update
if Input.trigger?(Input::C)
break
end
end
Graphics.update
Input.update
when "\005" # 瞬間顯示內容
record[0] = true
when "\006" # 變更打字效果
message_text.sub!(/\[(\d+)\]/, '')
$game_system.swordM_rate = $1.to_i
when "\007" # 變更自定顏色
message_text.sub!(/\[(\d+),(\d+),(\d+)\]/, '')
self.contents.font.color = Color.new($1.to_i, $2.to_i, $3.to_i)
@record[0] = nil
next
when "\010" # 自動確定
message_text.sub!(/\[(\d+)\]/, '')
@wait_count = $1.to_i
when "\011" # 無視換行
record[2] += 1
next
when "\016" # 演奏SE(預設)
message_text.sub!(/\[([\w_\-]+)\]/, '')
next unless (FileTest.exist?('Audio/SE/' + $1) or (not record[0]))
Audio.me_play('Audio/SE/' + $1, SWORD_MESS_SEVP[0], SWORD_MESS_SEVP[1])
next
when "\017" # 演奏SE(自定)
message_text.sub!(/\[([\w_\-]+)\,(\d+)\,(\d+)\]/, '')
next unless (FileTest.exist?('Audio/SE/' + $1) or (not record[0]))
Audio.me_play('Audio/SE/' + $1, $2.to_i, $3.to_i)
next
when "\037" # 停止SE
Audio.me_stop
next
when "\020" # 開啟開關隱藏
message_text.sub!(/\[(\d+)\]/, '')
i = 0 # 執行次數
loop do
i += 1
if record[4][i] == nil # 檢查是否是空值
$game_switches[$1.to_i] ? record[4][i] = false : record[4][i] = true
break
end
end
when "\021" # 中斷開關隱藏
record[4].delete(record[4].keys.sort[record[4].size - 1])
next
when "\022" # 顯示圖示
a = $game_system.swordM_WidthHeight[0] - Font.default_size - 32 - record[3][1]
message_text.sub!(/\[([\w_\-]+)\]/, '')
record[5] = Bitmap.new('Graphics/Icons/' + $1) rescue next
when "\023" # 變更字體
message_text.sub!(/\[([\w_\-]+)\]/, '')
self.contents.font.name = [$1] if Font.exist?($1)
next
when "\024" # 變更文字大小
message_text.sub!(/\[(\d+)\]/, '')
self.contents.font.size = $1.to_i
record[6] = $1.to_i + 10
next
when "\025" # 變更為粗體
self.contents.font.bold = (not self.contents.font.bold)
next
when "\026" # 變更為斜體
self.contents.font.italic = (not self.contents.font.italic)
next
when "\027" # 變回預設
self.contents.font.name = Font.exist?(SWORD_MESS_NAME) ?
SWORD_MESS_NAME : Font.default_name
self.contents.font.size = SWORD_MESS_SIZE == 0 ?
Font.default_size : SWORD_MESS_SIZE
self.contents.font.bold = SWORD_MESS_BOIT[0] == 0 ?
Font.default_bold : SWORD_MESS_BOIT[0]
self.contents.font.italic = SWORD_MESS_BOIT[1] == 0 ?
Font.default_italic : SWORD_MESS_BOIT[1]
color = SWORD_MESS_COLO
self.contents.font.color = Color.new(color[0], color[1], color[2])
@record = [nil, false, false, false, nil]
next
when "\030" # 文字顏色上下漸變
message_text.sub!(/\[(\d+)\,(\d+)\,(\d+)\]/, '')
@record[0] = [self.contents.font.color.red, self.contents.font.color.green,
self.contents.font.color.blue, $1.to_i, $2.to_i, $3.to_i]
when "\031" # 分隔線
a= $game_system.swordM_WidthHeight[0] - Font.default_size - 32 - record[3][1]
if @record[0] # 漸層處理
self.contents.fill_rect(x + 16 + record[3][1], y + self.contents.font.size / 2 - 1, a - x, 1,
self.contents.font.color)
self.contents.fill_rect(x + 16 + record[3][1], y + self.contents.font.size / 2, a - x, 1,
Color.new(@record[0][3], @record[0][4], @record[0][5]))
else # 一般處理
self.contents.fill_rect(x+16+record[3][1], y+(self.contents.font.size + 10)/2 - 1,a - x, 2,
self.contents.font.color)
end
y += self.contents.font.size + 10 and x = 0
next
when "\032" # 底線
@record[1] = (not @record[1])
next
when "\033" # 刪除線
@record[2] = (not @record[2])
next
when "\034" # 陰影
@record[3] = (not @record[3])
next
when "\035" # 底色
message_text.sub!(/\[(\d+)\,(\d+)\,(\d+)\]/, '')
@record[4] = [$1.to_i, $2.to_i, $3.to_i]
next
when "\036" # 顯示「\」
c = "\\"
when "\042" # 震動
message_text.sub!(/\[(\d+)\]/, '')
x = self.x ; y = self.y # 記憶位置
for i in 1..$1.to_i / 2
a = [rand(21) - 10, rand(21) - 10]
self.x += a[0] ; @messagecharacter_wsword.x += a[0]
self.y += a[1] ; @messagecharacter_wsword.y += a[1]
Graphics.update
self.x -= a[0] ; @messagecharacter_wsword.x -= a[0]
self.y -= a[1] ; @messagecharacter_wsword.y -= a[1]
Graphics.update
end
self.x = x ; self.y = y # 還原位置
next
end
next if record[4].values.include?(true) # 如果是在開關隱藏有效的內容就隱藏
#○ 打字效果
if $game_system.swordM_rate != 0 and record[0] == false
for i in 1..$game_system.swordM_rate
Input.update
if Input.press?(Input::C) and $game_system.swordM_key(true) and record[1]
record[0] = true
elsif record[1] == false
record[1] = true
record[1] = false if Input.press?(Input::C)
end
Graphics.update
end
end
#○ 描繪圖示或是內容
self.contents.fill_rect(x + 3 + record[3][1], y + self.contents.font.size ,
self.contents.font.size, 1, self.contents.font.color) if @record[1] # 底線
self.contents.fill_rect(x + 3 + record[3][1], y + (self.contents.font.size ) / 2,
self.contents.font.size, 1, self.contents.font.color) if @record[2] # 刪除線
# 底色處理
if @record[4]
self.contents.fill_rect(4 + x + record[3][1], y + 5, self.contents.font.size,
self.contents.font.size, Color.new(@record[4][0], @record[4][1], @record[4][2]))
end
if record[5] # 存在圖示時
self.contents.blt(4 + x + record[3][1], y, record[5], Rect.new(0, 0, 640, 480))
x += record[5].width
record[5] = nil
else # 不存在圖示時
if @record[0] # 文字上下漸層顏色
color = []
text_size = self.contents.font.size / 2
for i in 1..text_size
@record[0][0] == @record[0][3] ? color[0] = @record[0][0] :
color[0] = (@record[0][0] - @record[0][3]) / text_size * i
@record[0][1] == @record[0][4] ? color[1] = @record[0][1] :
color[1] = (@record[0][1] - @record[0][4]) / text_size * i
@record[0][2] == @record[0][5] ? color[2] = @record[0][2] :
color[2] = (@record[0][2] - @record[0][5]) / text_size * i
self.contents.font.color = Color.new(color[0], color[1], color[2])
#self.contents.draw_text(4 + x + record[3][1], y + 4, 40, self.contents.font.size - 2 * i, c)
self.contents.draw_text(4 + x + record[3][1], y, 40, self.contents.font.size - 2 * i, c)
end
else # 一般文字顏色
if @record[3] # 加上陰影
a = [self.contents.font.color.red, self.contents.font.color.green,
self.contents.font.color.blue]
self.contents.font.color = Color.new(0, 0, 0)
self.contents.draw_text(4 + x + record[3][1] + 1, y + 1, 40, self.contents.font.size, c)
self.contents.font.color = Color.new(a[0], a[1], a[2])
end
self.contents.draw_text(4 + x + record[3][1], y, 40, self.contents.font.size, c)
end
x += self.contents.text_size(c).width
end
# 強制換行換行判定
a= $game_system.swordM_WidthHeight[0] - Font.default_size - 32 - record[3][1]
y += record[6] if x >= a
x = 0 if x >= a
end
Graphics.update
@messagepause_wsword.visible = true if $game_temp.choice_max == 0
#○ 選擇項的情況
if $game_temp.choice_max > 0
@item_max = $game_temp.choice_max
self.active = true
self.index = 0
end
#○ 輸入數值的情況
if $game_temp.num_input_variable_id > 0
@messagepause_wsword.visible = false
digits_max = $game_temp.num_input_digits_max
number = $game_variables[$game_temp.num_input_variable_id]
@input_number_window = Window_InputNumber.new(digits_max)
@input_number_window.number = number
@input_number_window.x = self.x + 8 + record[3][1]
@input_number_window.y = self.y + $game_temp.num_input_start * 32
end
$game_temp.message_text = nil
end
#-------------------------------------------------------------
#● 更新
def update
super
#○ 當設置文章時就顯示對話框
if $game_temp.message_text != nil
self.visible = true
self.opacity += 28 while self.opacity < 160
reset_window
refresh
@delay_input = 5 # 設置顯示完畢後的延遲時間
Graphics.frame_reset
@contents_showing = true
end
@contents_showing = nil if @contents_showing == false
#○ 輸入數值的情況下
if @input_number_window != nil
@input_number_window.update
if Input.trigger?(Input::C) # 送出輸入的數值
$game_system.se_play($data_system.decision_se)
$game_variables[$game_temp.num_input_variable_id] = @input_number_window.number
$game_map.need_refresh = true
# 釋放輸入數值窗口
@input_number_window.dispose
@input_number_window = nil
terminate_message
end
return
end
#○ 當對話框開啟的場合
if @contents_showing
@wait_count -= 1 if @wait_count > 0 # 自動確定
@delay_input -= 1 if @delay_input > 0 # 全部顯示後的延遲
@messagepause_wsword.refresh # 更新暫停標誌
if Input.trigger?(Input::B) or @wait_count == 0 and $game_temp.choice_max != 0
if $game_temp.choice_max > 0 and $game_temp.choice_cancel_type > 0
$game_system.se_play($data_system.cancel_se)
$game_temp.choice_proc.call($game_temp.choice_cancel_type - 1)
terminate_message
end
elsif Input.trigger?(Input::C) and @delay_input == 0 or @wait_count == 0
@wait_count = -1
@contents_showing = false
@messagepause_wsword.visible = false
if $game_temp.choice_max > 0
$game_system.se_play($data_system.decision_se)
$game_temp.choice_proc.call(self.index)
end
terminate_message
end
end
#○ 當無內容時關閉對話框
if @contents_showing == nil and self.visible
@messagecharacter_wsword.visible = false
self.opacity -= 48
if self.opacity == 0
self.visible = false
end
return
end
end
#-------------------------------------------------------------
#● 更新游標
def update_cursor_rect
if @index >= 0
n = $game_temp.choice_start + @index
self.cursor_rect.set(@cursor_width[0], n * 32, @cursor_width[1], 32)
else
self.cursor_rect.empty
end
end
end
#=======================================
#■ 執行事件命令的解釋器
class Interpreter
#● 顯示文章
def command_101
if $game_temp.message_text != nil
return false
end
# 設定訊息結束後待機和返回呼叫標誌
@message_waiting = true
$game_temp.message_proc = Proc.new { @message_waiting = false }
# 設定為 1 行
$game_temp.message_text = @list[@index].parameters[0] + "\n"
line_count = 1
# 循環
loop do
$game_temp.message_text.gsub!(/\\\\/) { "\036" }
# 插入記憶控制碼
$game_temp.message_text.gsub!(/\\[Ll]\[([\d]+)\]/) do
$game_system.swordM_save[$1.to_i] != nil ? $game_system.swordM_save[$1.to_i] : ''
end
$game_temp.message_text.gsub!(/\\\\/) { "\036" }
# 判斷下一個事件
if @list[@index+1].code == 401
$game_temp.message_text += @list[@index+1].parameters[0] + "\n"
line_count += 1
else
if @list[@index+1].code == 102 # 下個事件為 [顯示選擇項] 的場合
@index += 1
$game_temp.choice_start = line_count
setup_choices(@list[@index].parameters)
elsif @list[@index+1].code == 103 # 下個事件為 [數值輸入處理] 的場合
@index += 1
$game_temp.num_input_start = line_count
$game_temp.num_input_variable_id = @list[@index].parameters[0]
$game_temp.num_input_digits_max = @list[@index].parameters[1]
elsif @list[@index+1].code == 101 # 下個事件為 [顯示文章] 的場合
if /\\[Pp]/ === $game_temp.message_text # 有「\P」控制碼的場合
$game_temp.message_text.gsub!(/\\[Pp]/) { '' }
@index += 1
$game_temp.message_text += @list[@index].parameters[0] + "\n"
next
end
end
return true
end
@index += 1
end
end
end
复制代码
麻煩大大們幫忙想想辦法了 自己弄了半天還是不知所以@@ dsu_plus_rewardpost_czw
作者:
end55rpg
时间:
2012-6-11 17:40
偶也修改过,你最好拿原版来改,不然看不懂。。。就是gusb!替换/XX东西为00X然后来弄,去学会儿正则表达式就知道咯
作者:
hys111111
时间:
2012-6-11 17:47
message_text.gsub!(/\\[Ss]\[([\d]+)\]/) do
299. $game_switches[$1.to_i] ? SWORD_MESS_SWIT[0] : SWORD_MESS_SWIT[1]
300. end
复制代码
看的头晕了……
应该是参照这样子改。
欢迎光临 Project1 (https://rpg.blue/)
Powered by Discuz! X3.1