module Sword #======================================= #★ 魔劍工舖 - 任務系統 2.04 # http://blog.yam.com/a870053jjkj/ #======================================= Sword48_Assignment, Sword48_Name, Sword48_Color, Sword48_Statu = [], [], [], [] #======================================= =begin ● 所需腳本 控制碼轉換:http://blog.yam.com/a870053jjkj/article/28082241(非必要) ======================================== ● 控制碼 支援使用「控制碼轉換」中的控制碼,但必須裝「控制碼轉換」才可以使用 ---------------------------------------------------------------- ○ 一般控制碼 C[數值] : 變更文字的顏色,顏色請在Window_Base類的text_color方法中設置 C[紅,綠,藍] : 變更文字的顏色,依據三原色指定顏色 AC : 依照任務狀態決定變更的顏色(顏色為任務狀態的顏色) A : 依照任務狀態,顯示你設定的任務狀態內容,可參考使用者自定設置的部分 ---------------------------------------------------------------- ○ 任務控制碼(自動產生任務,符合任務條件後會自動變更任務狀態) AV[變數編號,所需數值] : 開通變數任務,顯示指定編號的數值 AE[敵人編號,擊殺數] : 開通擊殺任務,顯示該編號的敵人目前的擊殺數量 AG[所需金錢] : 開通金錢任務,顯示目前的金錢(同 G) AI[種類,道具編號,數量] : 開通物品任務,顯示該編號種類目前的物品數量 種類:0為物品,1為武器,2為防具 AT[秒數] : 開通限時任務,顯示倒數計時器(時間到會轉到任務失敗) ATS[秒數] : 開通限時任務,顯示倒數計時器(時間到會轉到任務成功) ======================================== ● 函數 呼叫全部任務:$scene = Sword_Assignment.new 呼叫分類任務:$scene = Sword_Assignment.new(分類編號) 添加任務項目:$game_party.add_assignment(任務編號, 分類編號, '名稱', '內容') 獲取狀態狀態:$game_party.sword_assignment(任務編號) 修改狀態狀態:$game_party.sword_assignment(任務編號, 任務狀態) 重置指定任務:$game_party.again_assignment(任務編號) ---------------------------------------------------------------- ○ 任務狀態 0和5以上為隱藏、1為任務未完成、2為回報任務、3為任務失敗、4為任務完成 =end #======================================= #● 功能設定 Sword48_Help = ['任務', 1] # 設定上方說明窗口文字 [窗口文字, 位置] # 窗口文字:空的的(需保留 ' 符號)則不顯示說明窗口,位置:0左;1中;2右 Sword48_Width = 180 # 設定左邊任務選項的寬度 Sword48_Center = [true, true] # 任務選項的部分文字是否置中 [種類文字, 選項文字] Sword48_Statu[1] = '任務未完成' # 設定控制碼「A」顯示任務未完成的內容 Sword48_Statu[2] = '可回報任務' # 設定控制碼「A」顯示回報任務的內容 Sword48_Statu[3] = '任務已失敗' # 設定控制碼「A」顯示任務失敗的內容 Sword48_Statu[4] = '任務已完成' # 設定控制碼「A」顯示任務完成的內容 Sword48_Color[1] = Color.new(255, 255, 255) # 設定任務未完成的顯示顏色 Sword48_Color[2] = Color.new(255, 150, 100) # 設定回報任務的顯示顏色 Sword48_Color[3] = Color.new(0, 0, 0) # 設定任務失敗的顯示顏色 Sword48_Color[4] = Color.new(255, 255, 0) # 設定任務完成的顯示顏色 Sword48_Time = 2 # 計時器顯示格式,0為總秒數,1為分:秒,2為時:分:秒 Sword48_Menu = 0 # 0為回到地圖,1以上為回到選單畫面並指標在第幾個 Sword48_Permutation = 1 # 任務的排列順序,0依照編號;1新的在後;2新的在前 Sword48_InsistPerm = false # 是否只要有變更狀態,一律重新排列順序 Sword48_Acquiesce = true # 是否打開任務畫面時,選項自動起始在最新的任務上 Sword48_NotVisible = true # 啟動分類文字時,該分類無任務時是否不要顯示分類 #-------------------------------------------------------------- #○ 任務種類名稱表(Sword48_Name[種類編號] = '種類名稱') # 如果不希望在任務列表中顯示種類名稱的話,請移除1號設置即可 Sword48_Name[1] = '--主線任務--' Sword48_Name[2] = '--試驗任務--' #-------------------------------------------------------------- #○ 任務資料表(Sword48_Assignment[任務編號] = ['任務名稱', 種類編號,'內容') # 設定任務的名稱與內容,任務內容可以使用控制碼來表示 # 可以自行新增多個Sword48_Assignment[任務編號],第1行通常不顯示 Sword48_Assignment[1] = ['四重試驗', 1,' av[1,4] 四重試驗(ACAC[0]) 你莫名其妙的掉到了這個神祕的空間,遇到 了一位莫名其妙的傢伙,指派了4個任務要 我去完成,C[2]利用那4顆水晶的力量完成試煉 c[6]無關的話:C[2] 這窗口可以顯示12行文字 一行能顯示19個字,但還是視使用者而定']#設置結束 #-------------------------------------------------------------- Sword48_Assignment[2] = ['炎的試煉', 2,' 炎的試驗(ACAC[0]) 幽靈擊殺數量:AE[1,5] / 5 魚人擊殺數量:AE[3,3] / 3 這是獵殺怪物的任務範例,必須兩種都要殺 到特定的數目才算是完成任務條件,當擊殺 完畢後,此任務會自動變成可回報任務的狀 態,當然也可配合其他任務控制碼進行組合 c[6]無關的話:C[2] 如果想要無內容換行,記得加1個空白鍵喔']#設置結束 #-------------------------------------------------------------- Sword48_Assignment[3] = ['金的試驗', 2,' 金的試驗(ACAC[0]) 金錢數:ag[1000] / 1000 鐵劍數:ai[1,2,10] / 10 銅盾數:ai[2,1,15] / 15 完全恢復劑:ai[0,3,30] / 30 這是金錢與需要指定東西的範例,收集以上 所有的物品即可完成任務,1個都不能少, 也不能只完成其中一項,必須全部達成喔 C[7]水桶裡沒有東西的,不要亂點喔^^']#設置結束 #-------------------------------------------------------------- Sword48_Assignment[4] = ['海的試煉', 2,' 海的試驗(ACAC[0]) 剩餘時間:at[30] (c[5]會動耶!!c[0]) 這個是計時任務的範例,計時器有動態效果 ,當計時器的時間到00:00:00之時,就會 判定這個任務失敗了!! 如果任務已經完成而但還有剩餘時間之時, 則計時器的剩餘時間將會停止運作不動!!']#設置結束 #-------------------------------------------------------------- Sword48_Assignment[5] = ['天的試驗', 2,' 天的試驗(ACAC[0]) 拉動拉桿數:av[2,50] / 50 這個是變數與連續任務的範例,雖然任務名 稱相同,也不會重複出現相同的任務,這是 善用隱藏功能的連續任務!! 你目前正在進行此任務的第c[2]1c[0]個任務']#設置結束 #-------------------------------------------------------------- Sword48_Assignment[6] = ['天的試驗', 2,' 天的試驗(ACAC[0]) 傳話給右邊那位白頭髮的!! 你目前正在進行此任務的第c[2]2c[0]個任務']#設置結束 #-------------------------------------------------------------- Sword48_Assignment[7] = ['天的試驗', 2,' 天的試驗(ACAC[0]) 幫忙回話...c[7](好像捲入了別人的戰爭了)c[0] 你目前正在進行此任務的第c[2]3c[0]個任務']#設置結束 #======================================= $Sword ? $Sword[48] = true : $Sword = {48=>true} # 腳本使用標誌 ($Sword_VX = false ; RPG::Weather rescue $Sword_VX = true) if $Sword_VX == nil Sword48_Center[0] = Sword48_Center[0] ? 1 : 0 Sword48_Center[1] = Sword48_Center[1] ? 1 : 0 end #======================================= #■ 處理敵人的類 class Game_Enemy (def id ; @enemy_id ; end) if $Sword_VX end #======================================= #■ 處理同伴的類別 class Game_Party include Sword # 連接自動設置 attr_reader :assig_perm # 任務排列表(選項順序用) attr_reader :assig_sort # 任務種類表(只顯示特定種類或分類用) attr_reader :new_assig # 最新任務表(起始選項用) attr_accessor :sword_assig # 任務資料表 #------------------------------------------------------------- #● 初始化物件 alias sword48_initialize initialize def initialize sword48_initialize ; @new_assig = {true=>nil} # 最新任務 @sword_assig, @assig_sort, @assig_perm = [], {}, [] # 任務資料,分類表,排列表 Sword48_Assignment.each_index{|i| next unless item = Sword48_Assignment[i] add_assignment(i, item[1], item[0], item[2])} # 生成腳本中的任務 end #------------------------------------------------------------- #● 產生任務資料(任務編號, 分類編號, 任務名稱, 任務內容) def add_assignment(id, sort_id, name, text) # [任務狀態, 任務條件, 任務名稱, 任務內容], 任務內容拷貝 # 任務條件:[任務數, {變數}, {擊殺}, {金錢}, {道具}, {計時}] @sword_assig[id], text = [0, [0, {}, {}, {}, {}, {}], name, text], text.dup @assig_sort[id], no_end = sort_id, 0 text.gsub!(/\[Vv][(d+)]/){$game_variables[$1.to_i]} while /\[Vv][(d+)]/ === text text.gsub!(/\[Aa][Vv][(d+)[, ]+(d+)]/){"00[#{$1},#{$2}]"} # AV text.gsub!(/\[Aa][Ee][(d+)[, ]+(d+)]/){"01[#{$1},#{$2}]"} # AE text.gsub!(/\[Aa][Gg][(d+)]/){"02[#{$1}]"} # AG text.gsub!(/\[Aa][Ii][(d+)[, ]+(d+)[, ]+(d+)]/){"03[#{$1},#{$2},#{$3}]"}#AI text.gsub!(/\[Aa][Tt][(d+)]/){"04[#{$1}]"} # AT text.gsub!(/\[Aa][Tt][Ss][(d+)]/){"05[#{$1}]"} # AT while ((c = text.slice!(/./m)) != nil) ; case c when "00" ; text =~ /[(d+),(d+)/ ; ii = 1 # 產生變數任務 # [變數編號, 所需數值] loop{@sword_assig[id][1][1][ii] ? ii += 1 : (@sword_assig[id][1][0] += 1 @sword_assig[id][1][1][ii] = [$1.to_i, $2.to_i] ; break)} when "01" ; text =~ /[(d+),(d+)/ ; ii = 1 # 產生擊殺任務 # [敵人編號, 所需擊殺數, 目前擊殺數] loop{@sword_assig[id][1][2][ii] ? ii += 1 : (@sword_assig[id][1][0] += 1 @sword_assig[id][1][2][ii] = [$1.to_i, $2.to_i, 0] ; break)} when "02" ; text =~ /[(d+)/ ; ii = 1 # 產生金錢任務 # [所需金錢] loop{@sword_assig[id][1][3][ii] ? ii += 1 : (@sword_assig[id][1][0] += 1 @sword_assig[id][1][3][ii] = [$1.to_i] ; break)} when "03" ; text =~ /[(d+),(d+),(d+)/ ; ii = 1 # 產生道具任務 # [道具種類, 道具編號, 所需數量] loop{@sword_assig[id][1][4][ii] ? ii += 1 : (@sword_assig[id][1][0] += 1 @sword_assig[id][1][4][ii] = [$1.to_i, $2.to_i, $3.to_i] ; break)} when "04", "05" ; text =~ /[(d+)/ ; ii = 1 # 產生計時任務 # [開始時間, 結束時間, 計時時間, 回報標誌, 完成剩餘秒數] loop{@sword_assig[id][1][5][ii] ? ii += 1 : (@sword_assig[id][1][0] += 1 @sword_assig[id][1][5][ii] = [0, 0, $1.to_i, c == "05" ? true : false, $1.to_i] ; break)} no_end += 1 if c == "04" end ; end @sword_assig[id][1][0] -= no_end if @sword_assig[id][1][0] > no_end end #------------------------------------------------------------- #● 變更與獲取任務狀態(編號, 任務狀態, 不更新時間標誌) def sword_assignment(number, statu = nil, reset = false) if statu assig = @sword_assig[number][1] assig[2].each{|key, value| assig[2][key][2] = 0 if statu == 1} # 擊殺數歸0 assig[5].each{|key, value| assig[5][key][4] = assig[5][key][1] - Graphics.frame_count / Graphics.frame_rate if statu == 4 next unless (1..2) === statu # 限時時間重新產生 assig[5][key][0] = Graphics.frame_count / Graphics.frame_rate assig[5][key][1] = assig[5][key][0] + assig[5][key][2]} unless reset @sword_assig[number][0] = statu # 變更任務狀態 (1..4) === statu ? (@assig_perm -= [number] if Sword48_InsistPerm # 更新順序 (Sword48_Permutation == 1 ? @assig_perm += [number] : @assig_perm.insert( 0, number)) unless @assig_perm.include?(number)) : @assig_perm -= [number] if Sword48_Acquiesce # 記錄最新修改或添加的任務 @new_assig[@assig_sort[number]] = number ; @new_assig[true] = number end else ; update_assignment ; return @sword_assig[number][0] # 獲取任務狀態 end end #------------------------------------------------------------- #● 更新任務控制碼的任務狀態 def update_assignment @comm_up = [] @sword_assig.each_index do |i| next unless @sword_assig[i] assig, fulfill = @sword_assig[i][1], 0 next unless (1..4) === @sword_assig[i][0] # 跳過未接任務及隱藏任務 assig[1].each{|key, value| fulfill += 1 if $game_variables[value[0]] >= value[1]} # 變數 assig[2].each{|key, value| fulfill += 1 if value[2] >= value[1]} # 擊殺 assig[3].each{|key, value| fulfill += 1 if $game_party.gold >= value[0]} # 金錢 assig[4].each do |key, value| case value[0] # 道具 when 0 ; number = $Sword_VX ? $game_party.item_number( # 物品 $data_items[value[1]]) : $game_party.item_number(value[1]) when 1 ; number = $Sword_VX ? $game_party.item_number( # 武器 $data_weapons[value[1]]) : $game_party.weapon_number(value[1]) when 2 ; number = $Sword_VX ? $game_party.item_number( # 防具 $data_armors[value[1]]) : $game_party.armor_number(value[1]) end ; fulfill += 1 if number >= value[2] ; end assig[5].each{|key, value| assig[5][key][3] ? fulfill += 1 : (sword_assignment(i, 3)) if Graphics.frame_count / Graphics.frame_rate >= assig[5][key][1]} # 限時 if assig[0] == 0 elsif @sword_assig[i][0] == 1 ; sword_assignment(i, 2, true) if fulfill >= assig[0] elsif @sword_assig[i][0] == 2 ; sword_assignment(i, 1, true) unless fulfill >= assig[0] end end @comm_up end #------------------------------------------------------------- #● 重新產生自定設置的任務(任務編號) def again_assignment(v) a = Sword48_Assignment[v] ; add_assignment(v, a[1], a[0], a[2]) end end #======================================= #■ 任務選項窗口 class WSword_AssiCommand < Window_Base include Sword # 連接自定設置 Size = Sword48_Help[0].empty? ? ($Sword_VX ? 12 : 14) : ($Sword_VX ? 10 : 12) XPVX = $Sword_VX ? [WLH + 32, 416, 384 - WLH] : [64, 480, 416] attr_reader :index # 選項位置 #------------------------------------------------------------- #● 初始化物件(選項表, 分類表, 編號表) def initialize(comm, assig_sort = nil) super(0, (Sword48_Help[0].empty? ? 0 : XPVX[0]), Sword48_Width, (Sword48_Help[0].empty? ? XPVX[1] : XPVX[2])) @sorts = [] ; assig_sort.each{|a, b| Sword48_NotVisible ? (@sorts += [a] unless b.empty?) : @sorts += [a]} if assig_sort self.contents = Bitmap.new(width - 32, (comm.size + (Sword48_Name[1] ? @sorts.size : 0)) * 32) # 選項位置, 選項顏色, 選項文字, 跳過選項表(分類用), 分類表 @index, @color, @comm, @assig_sort, @sort_index = 0, [], comm, assig_sort, {} @i, @sort_true = 0, true end #------------------------------------------------------------- #● 更新內容 def refresh self.contents.clear # 選項行數, 分類編號 br, sort_v, i, sort_size, sort_v2 = 0, @assig_sort.keys.sort[0], 0, @assig_sort.size, 0 return unless sort_v # 無分類資料就中斷 if @assig_sort and Sword48_Name[1] # 分類文字的場合 loop do ; if @sort_true # 描繪分類文字 self.contents.font.color = system_color raise("有設定分類編號為#{sort_v}的任務,但卻未設定該分類的Sword48_Name" ) unless Sword48_Name[sort_v] # 無分類的場合 self.contents.draw_text(4, br * 32, Sword48_Width - 40, 32, Sword48_Name[sort_v], Sword48_Center[0]) br += 1 ; @sort_true = false else # 描繪分類中的選項文字 @assig_sort[sort_v].each{|id| assig = $game_party.sword_assig[id] @index = i if $game_party.new_assig[true] == id # 起始游標設定 self.contents.font.color = Sword48_Color[assig[0]] self.contents.draw_text(4, br * 32, Sword48_Width - 40, 32, assig[2], Sword48_Center[1]) ; @sort_index[i] = [id, br] ; i += 1 ; br += 1} sort_v2 += 1 ; sort_v = @assig_sort.keys.sort[sort_v2] # 獲取下個存在分類 @sort_true = true ; break unless sort_v#sort_size# < sort_v end ; end else # 描繪選項文字(無設定分類用) @comm.each_index{|i| self.contents.font.color = @color[i] ? @color[i] : normal_color self.contents.draw_text(4, i * 32, Sword48_Width - 40, 32, @comm[i], Sword48_Center[1])} end @off = @sort_index[@index] # 無選項判定 self.contents.clear unless @off if Sword48_Name[1] and Sword48_NotVisible # 無就清空 (self.index = -2 ; return) unless @off if Sword48_Name[1] unless Sword48_NotVisible rect_y = Sword48_Name[1] ? (@off ? @sort_index[@index][1] : 0) : @index (self.oy = [(rect_y - Size) * 32 + 32, 0].max ; @thend = true) unless @thend self.cursor_rect.set(0, (rect_y - top_row) * 32, Sword48_Width - 32, 32) end #------------------------------------------------------------- #● 更新畫面 def update super ; return unless @off if Sword48_Name[1] if Input.repeat?(Input::UP) @index == 0 ? @index = @comm.size - 1 : @index -= 1 rect_y = Sword48_Name[1] ? @sort_index[@index][1] : @index self.oy = (rect_y - Size + 1) * 32 if @index == @comm.size - 1 # 移至最後 $Sword_VX ? Sound.play_cursor : $game_system.se_play($data_system.cursor_se) self.cursor_rect.set(0, comm_oy(rect_y, 8) * 32, Sword48_Width - 32, 32) elsif Input.repeat?(Input::DOWN) @index == @comm.size - 1 ? @index = 0 : @index += 1 self.oy = 0 if @index == 0 # 選項移至第1個 $Sword_VX ? Sound.play_cursor : $game_system.se_play($data_system.cursor_se) rect_y = Sword48_Name[1] ? @sort_index[@index][1] : @index self.cursor_rect.set(0, comm_oy(rect_y, 2) * 32, Sword48_Width - 32, 32) end end #------------------------------------------------------------- #● 獲取開頭行 def top_row ; self.oy / 32 ; end #------------------------------------------------------------- #● 選項位置更新=(索引) def index=(index) @index = index ; self.cursor_rect.set(0, @index * 32, Sword48_Width - 32, 32) end #------------------------------------------------------------- #● 變更選項顏色(編號, 顏色) def color(id, color) ; @color[id] = color ; end #------------------------------------------------------------- #● 獲取游標目前指著的編務編號(任務用) def assig_id ; @sort_index[@index] ? @sort_index[@index][0] : nil ; end #------------------------------------------------------------- #● 選項顯示內容位置調整(滾動效果用) def comm_oy(v, n) if n == 2 ; Size <= v - top_row ? (self.oy = (a = v - Size + 1) * 32 ; v - a) : v - top_row else ; self.oy += (v - top_row) * 32 if v - top_row <= -1 self.oy = [self.oy, 0].max # 防止過度滾動 self.oy = 0 if top_row == 1 and v == 1 ; v - top_row end end end #======================================= #■ 任務內容顯示窗口 class WSword_Assignment < Window_Base include Sword # 連接自定設置 #------------------------------------------------------------- #● 初始化物件(任務編號) def initialize(number) if $Sword_VX ; super(Sword48_Width, (Sword48_Help[0].empty? ? 0 : WLH + 32), 544 - Sword48_Width, (Sword48_Help[0].empty? ? 416 : 416 - (WLH + 32))) else ; super(Sword48_Width, (Sword48_Help[0].empty? ? 0 : 64), 640 - Sword48_Width, (Sword48_Help[0].empty? ? 480 : 416)) end self.contents = Bitmap.new(width - 32, height - 32) refresh(number) end #------------------------------------------------------------- #● 更新內容(任務編號) def refresh(number = 0) return unless number # 無任務的場合 self.contents.clear ; self.contents.font.color = normal_color ; color = nil return if number == 0 text, @number = $game_party.sword_assig[number][3].dup, number @frequency = [0, 0] # [擊殺, 計時] assig = $game_party.sword_assig[number][1] text = text.critical_word if $Sword[46] # 轉換關鍵字(控制碼轉換用) text = text.code_explain if $Sword[46] # 轉換控制碼(控制碼轉換用) text.gsub!(/\[Cc][(d+)]/){"00[#{$1}]"} # C text.gsub!(/\[Cc][(d+)[, ]+(d+)[, ]+(d+)]/){"01[#{$1},#{$2},#{$3}]"} # C text.gsub!(/\[Aa][Cc]/){color = Sword48_Color[$game_party.sword_assig[number][0]] "01[#{color.red.to_i},#{color.green.to_i},#{color.blue.to_i}]"} # AC text.gsub!(/\[Aa][Vv][(d+)[, ]+(d+)]/){[$game_variables[$1.to_i], $2.to_i].min} # AV text.gsub!(/\[Aa][Ee][d+[, ]+(d+)]/){@frequency[0] += 1 assig[2][@frequency[0]][0] == nil ? 0 : [assig[2][@frequency[0]][2], $1.to_i].min} # AE text.gsub!(/\[Aa][Tt][Ss]?[([d]+)]/) do @frequency[1] += 1 a = [assig[5][@frequency[1]][1] - Graphics.frame_count / Graphics.frame_rate, 0].max a = [assig[5][@frequency[1]][4], 0].max if $game_party.sword_assig[number][0] == 4 case Sword48_Time when 0 ; a # 秒 when 1 ; sprintf("%02d:%02d", a / 60 % 60, a % 60) # 分、秒 when 2 ; sprintf("%02d:%02d:%02d", a / 60 / 60, a / 60 % 60, a % 60) # 時、分、秒 end end text.gsub!(/\[Aa][Gg][(d+)]/){[$game_party.gold, $1.to_i].min} # AG text.gsub!(/\[Aa][Ii][(d+)[, ]+(d+)[, ]+(d+)]/) do if $game_party.sword_assig[number][0] == 4 ; $3.to_i else ; case $1.to_i # AI when 0 # 物品 $Sword_VX ? [$game_party.item_number($data_items[$2.to_i]), $3.to_i].min : [$game_party.item_number($2.to_i), $3.to_i].min when 1 # 武器 $Sword_VX ? [$game_party.item_number($data_weapons[$2.to_i]), $3.to_i].min : [$game_party.weapon_number($2.to_i), $3.to_i].min when 2 # 防具 $Sword_VX ? [$game_party.item_number($data_armors[$2.to_i]), $3.to_i].min : [$game_party.armor_number($2.to_i), $3.to_i].min end ; end end text.gsub!(/\[Aa]/){Sword48_Statu[$game_party.sword_assig[number][0]]} # AC x, y = 0, -32 # 起始文字X座標, Y座標 while ((c = text.slice!(/./m)) != nil) ; case c when "n" ; x = 0 ; y += 32 # 換行 when "00" ; text.sub!(/[(d+)]/, '') # 指定代碼顏色 self.contents.font.color = text_color($1.to_i) when "01" ; text.sub!(/[(d+),(d+),(d+)]/, '') # 指定三原色 self.contents.font.color = Color.new($1.to_i, $2.to_i, $3.to_i) else ; self.contents.draw_text(x, y, 32, 32, c) x += self.contents.text_size(c).width end end end end #======================================= #■ 處理戰鬥畫面的類別 class Scene_Battle include Sword # 連接自定設置 #------------------------------------------------------------- #● 戰鬥結束(結果) alias sword1_battle_end battle_end def battle_end(result) members = $Sword_VX ? $game_troop.members : $game_troop.enemies $game_party.sword_assig.each_index do |i| assig = $game_party.sword_assig[i] next unless assig ; next if assig[0] != 1 ; assig = $game_party.sword_assig[i][1][2] assig.each do |key, value| members.each do |enemy| $game_party.sword_assig[i][1][2][key][2] += 1 if value[0] == enemy.id end ; end end sword1_battle_end(result) end end #======================================= #■ 任務系統畫面 class Sword_Assignment include Sword # 連接自定設置 #------------------------------------------------------------- #● 初始化物件 def initialize(id = nil, sort = nil) $game_party.update_assignment # 更新任務狀況 @menu_index = Sword48_Permutation == 0 ? id : ($game_party.assig_perm.index(id) if $game_party.assig_perm.index(id)) # 起始選項 (@menu_index = sort ? $game_party.new_assig[sort] : $game_party.new_assig[true] @new_index = true) unless id if Sword48_Acquiesce # 指定最新的任務 @menu_index = 0 unless @menu_index @sort = sort # 指定顯示的任務種類 end #------------------------------------------------------------- #● 主處理 def main @count = Graphics.frame_count / Graphics.frame_rate # 紀錄當前時間 # 獲取要顯示的任務選項 hmain, @hmain, assig_sort = [], [], Hash.new{|a, b| a[b] = []} # 選項字, 選項號, 分類 # 產生選項資料 (Sword48_Permutation == 0 ? 1...$game_party.sword_assig.size : $game_party.assig_perm).each do |i| unless i == nil or $game_party.sword_assig[i][0] == 0 or $game_party.sword_assig[i][0] > 4 next if $game_party.assig_sort[i] != @sort if @sort # 種類判定,種類不符就跳過 assig_sort[$game_party.assig_sort[i]] += [i] hmain.push($game_party.sword_assig[i][2]) ; @hmain.push(i) end ; end menu_index = @menu_index hmain = [' '] if hmain.empty? ; @hmain = [] if @hmain.empty? # 無任務時 (menu_index = @hmain.index(@menu_index) ? @hmain.index(@menu_index) : 0) if Sword48_Permutation == 0 or @new_index # 任務選項位置計算 Sword48_Name.each_index{|index| next unless Sword48_Name[index] assig_sort[index] = assig_sort[index]} unless Sword48_NotVisible # 生成默認值 @command_window = WSword_AssiCommand.new(hmain, assig_sort) # 選項窗口 @command_window.index = menu_index # 變更選項顏色 ii = -1 ; @hmain.each do |i| ; ii += 1 ; case $game_party.sword_assig[i][0] when 1 ; @command_window.color(ii, Sword48_Color[1]) # 任務未完成 when 2 ; @command_window.color(ii, Sword48_Color[2]) # 回報任務 when 3 ; @command_window.color(ii, Sword48_Color[3]) # 任務失敗 when 4 ; @command_window.color(ii, Sword48_Color[4]) # 任務完成 end ; end @command_window.refresh # 產生選項內容 # 產生其他窗口 @assignmen_wswordt = WSword_Assignment.new(@hmain[0]) update_cgty (@help_window = Window_Help.new @help_window.set_text(Sword48_Help[0], Sword48_Help[1])) unless Sword48_Help[0].empty? # 如果有設定說明窗口文字,就產生說明窗口 Graphics.transition loop{Graphics.update ; Input.update ; update ; break if $scene != self} Graphics.freeze # 釋放窗口 @command_window.dispose ; @assignmen_wswordt.dispose @help_window.dispose if @help_window end #------------------------------------------------------------- #● 更新畫面 def update # 更新窗口 @command_window.update ; @assignmen_wswordt.update # 更新計時器與顯示內容(每秒更新1次) unless @count == Graphics.frame_count / Graphics.frame_rate comm_up = $game_party.update_assignment unless comm_up.empty? # 更新任務 ii = -1 @hmain.each do |i| ; ii += 1 ; case $game_party.sword_assig[i][0] when 1 ; @command_window.color(ii, Sword48_Color[1]) # 任務未完成 when 2 ; @command_window.color(ii, Sword48_Color[2]) # 回報任務 when 3 ; @command_window.color(ii, Sword48_Color[3]) # 任務失敗 when 4 ; @command_window.color(ii, Sword48_Color[4]) # 任務完成 end ; end @command_window.refresh end update_cgty @count = Graphics.frame_count / Graphics.frame_rate # 更新計算時間 end # 按下確定鍵或取消鍵時回到指定畫面 if Input.trigger?(Input::B) or Input.trigger?(Input::C) $Sword_VX ? Sound.play_cancel : $game_system.se_play($data_system.cancel_se) if Sword48_Menu == 0 ; $scene = Scene_Map.new # 回到地圖畫面的場合 else ; $scene = Scene_Menu.new(Sword48_Menu - 1) # 回到選單畫面的場合 end elsif Input.repeat?(Input::UP) or Input.repeat?(Input::DOWN) ; update_cgty # 更新內容 end end #------------------------------------------------------------- #● 用於更新窗口內容的方法 def update_cgty @assignmen_wswordt.refresh(Sword48_Name[1] ? @command_window.assig_id : @hmain[@command_window.index]) end end
mori13 发表于 2018-1-29 22:53
应该是/\[(d+),(d+)/ 吧,下面几个都是这样吧
TTTTT.PNG (89.9 KB, 下载次数: 13)
cht94512 发表于 2018-2-15 12:52
很感謝大大的幫忙。
這樣是可以解決error問題,但開出來顯示不了任務的資料頁面。
請看圖。 ...
mori13 发表于 2018-2-16 11:19
好的。那么乃试试把/\[(d+),(d+)/改成/\[(\d+)\,(\d+)/ ,也就是不只是在 [ 前加 \ ,在“d”,“,”前 ...
cht94512 发表于 2018-2-19 19:22
還是不行呀
其實這個腳本本身已經設置了一些任務,測試時只需在事件的腳本打
"$game_party.swor ...
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[i] ? Sword::S0_Set[i] : nil set += color ? " x01#{color.red.to_i},#{color.green.to_i},#{ color.blue.to_i},#{color.alpha.to_i}]" + $data_system.elements[i] + "x001]" : ' ' + $data_system.elements[i] 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[i].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(/nn/); 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
mori13 发表于 2018-2-24 01:39
抱歉没注意看到已经更新了。毕竟编辑并不会提醒_(:з」∠)_
98行那个啊,原本是
中间有个逗号没有加斜杠
欢迎光临 Project1 (https://rpg.blue/) | Powered by Discuz! X3.1 |