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