#==============================================================================#
# 便民任务界面 by EngShun #
# $scene = Scene_Mission.new 打开脚本 #
# 由于此版本仅做出了一些小优化, #
# 因此设置方法请参考v0.7的范例 #
# #
# 效果说明: #
# 支持普通对话框效果 #
# \a[号码] :更改左右对齐方式(0,1,2)。 #
# \itm[物品id] :物品数量 #
# \wpn[武器id] :武器数量 #
# \amr[防具id] :防具数量 #
# \eval{脚本} :运行脚本 #
# \1line{内容} :把多行的内容显示为一行 #
# \bold :字体加粗,插入多一次关闭 #
# \italic :字体打斜,插入多一次关闭 #
# \f[字体名称] :更改字体 #
# \s[号码] :更改字体大小 #
# \p[名称] :插入图片 #
# \icon[名称] :插入图标 #
# #
#==============================================================================#
#===============================================================================
# ■ 队伍
#===============================================================================
class Game_Party
Mission = Struct.new(:id, :name, :info, :status)
alias org_init_mission initialize if !defined?(org_init_mission)
#--------------------------------------------------------------------------
# ● 重定义初始化
#--------------------------------------------------------------------------
def initialize
@mission = {}
org_init_mission
end
def no_mission?
return @mission == {}
end
def missions
if no_mission?
m = Mission.new(0,"没有任务"," ",0)
return [m]
end
return @mission.values.sort_by {|m|m.id}
end
def get_mission(mission,info)
return if @mission.has_key?(mission)
id = missions[-1].id + 1
@mission[mission] = Mission.new(id,mission,info,0)
end
def done_mission(mission)
@mission[mission].status = 1 if @mission[mission].status == 0
end
def delete_mission(mission)
@mission.delete(mission)
end
def fail_mission(mission)
@mission[mission].status = 2 if @mission[mission].status == 0
end
def resume_mission(mission)
@mission[mission].status = 0 if @mission[mission].status == 2
end
def done_all_mission
@mission.each{|k,m|m.status = 1}
end
def update_mission(mission,info)
@mission[mission].info = info
end
def add_mission_info(mission,info)
@mission[mission].info += "\n" + info
end
def delete_all_mission
@mission = {}
end
def resume_all_mission
@mission.each{|k,m|m.status = 0 if m.status == 2}
end
end
#===============================================================================
# ■ 任务列表窗口
#===============================================================================
class Window_Mission < Window_Selectable
#--------------------------------------------------------------------------
# ● 初始化对象
#--------------------------------------------------------------------------
def initialize
super(0, 64, 200, 416)
self.index = 0
@mission = $game_party.missions
@item_max = @mission.size
if self.contents != nil
self.contents.dispose
self.contents = nil
end
self.contents = Bitmap.new(width - 32, @item_max * 32)
for i in 0...@mission.size
t = @mission[i].status != 0
self.contents.font.color = t ? disabled_color : normal_color
text = @mission[i].name
self.contents.draw_text(4, i * 32, 160, 32, text.to_s)
self.contents.font.color = system_color
self.contents.draw_text(self.contents.width-32, i * 32, 32, 32, "□",1) unless $game_party.no_mission?
if @mission[i].status == 1
self.contents.font.color = crisis_color
self.contents.draw_text(self.contents.width-32, i * 32, 32, 32, "√",1)
elsif @mission[i].status == 2
self.contents.font.color = knockout_color
self.contents.draw_text(self.contents.width-32, i * 32, 32, 32, "×",1)
end
end
end
end
#===============================================================================
# ■ 任务详情窗口
#===============================================================================
class Window_MissionInfo < Window_Base
attr_accessor :wait
attr_accessor :scroll_up
#--------------------------------------------------------------------------
# ● 初始化对象
#--------------------------------------------------------------------------
def initialize
super(200,64,440,416)
self.contents = Bitmap.new(408, 384)
@scroll_up = false
@wait = 90
@items = []
@progress = 0
@draw_y = 0
@align = 0
@cache = Bitmap.new(160,160)
@font = Font.new
end
#--------------------------------------------------------------------------
# ● 刷新画面
#--------------------------------------------------------------------------
def update
super
parse_items if @items.size > 0
return if self.contents.height <= 384
return @wait -= 1 if @wait > 0
self.oy += @scroll_up ? -1 : 1
self.oy = 0 if self.oy < 0
self.oy = oy_max if self.oy > oy_max
if self.oy <= 0
@scroll_up = false
@wait = 60
elsif self.oy >= oy_max
@scroll_up = true
@wait = 60
end
end
#--------------------------------------------------------------------------
# ● 释放
#--------------------------------------------------------------------------
def dispose
super
@cache.dispose
end
#--------------------------------------------------------------------------
# ● 滚动最大值
#--------------------------------------------------------------------------
def oy_max
return self.contents.height - 384
end
#--------------------------------------------------------------------------
# ● 刷新
#--------------------------------------------------------------------------
def refresh(str)
str = str.clone
@scroll_up = false
@wait = 120
@draw_y = 0
@align = 0
@progress = 0
@lines = []
self.oy = 0
@cache.font = Font.new
@font = Font.new
self.contents.dispose
self.contents = Bitmap.new(408, 384)
parse_text(str)
12.times{parse_items}
end
#--------------------------------------------------------------------------
# ● 描绘行
#--------------------------------------------------------------------------
def draw_line(width, height, items)
bitmap = Bitmap.new(width, height)
bitmap.font = @font
x = 0
for item in items
if item.is_a?(Color)
bitmap.font.color = item
elsif item.is_a?(Integer)
bitmap.font.size = item
elsif item.is_a?(Array)
bitmap.font.name = item[0] if item.size == 1
elsif item.is_a?(Bitmap)
bitmap.blt(x + 2, (height - item.height) / 2,
item, Rect.new(0,0,item.width,item.height))
x += item.width + 4
elsif item == :bold
bitmap.font.italic = !bitmap.font.bold
elsif item == :italic
bitmap.font.italic = !bitmap.font.italic
else
bitmap.draw_text(x,0,width,height,item)
x += bitmap.text_size(item).width
end
end
return bitmap
end
#--------------------------------------------------------------------------
# ● 解析文本
#--------------------------------------------------------------------------
def parse_text(str)
begin
last_text = str.clone
str.gsub!(/\\v\[(\d+)\]/i) { $game_variables[$1.to_i] }
str.gsub!(/\\g/i) { $game_party.gold.to_s }
str.gsub!(/\\itm\[(\d+)\]/i) { $game_party.item_number($1.to_i) }
str.gsub!(/\\wpn\[(\d+)\]/i) { $game_party.weapon_number($1.to_i) }
str.gsub!(/\\amr\[(\d+)\]/i) { $game_party.armor_number($1.to_i) }
str.gsub!(/\\1line{(.+?)}/im) { $1.delete("\n") }
str.gsub!(/\\eval{(.+?)}/im) { eval($1) }
end until str == last_text
str.gsub!(/\\n\[(\d+)\]/i) do
$game_actors[$1.to_i] != nil ? $game_actors[$1.to_i].name : ""
end
str.gsub!(/\n/){"\000\002n\000"}
str.gsub!(/\\\\/) { "\001" }
str.gsub!(/\\a\[([0-2])\]/i){ "\000\0027#{$1}" }
str.gsub!(/\\c\[(\d+)\]/i) { "\000\0020#{$1}\000" }
str.gsub!(/\\bold/i) { "\000\0021\000" }
str.gsub!(/\\italic/i) { "\000\0022\000" }
str.gsub!(/\\f\[(\w+)\]/i) { "\000\0023#{$1}\000" }
str.gsub!(/\\s\[(\d+)\]/i) { "\000\0024#{$1}\000" }
str.gsub!(/\\p\[(.+?)\]/i) { "\000\0025#{$1}\000" }
str.gsub!(/\\icon\[(.+?)\]/i){ "\000\0026#{$1}\000" }
str.gsub!(/\001/) {"\\"}
@items = str.split("\000")
@items.delete("")
end
#--------------------------------------------------------------------------
# ● 深度解析
#--------------------------------------------------------------------------
def parse_items
return unless @items.size > 0
bitmap = @cache
width, height, items = 1, 32, []
while item = @items.delete_at(0)
if item[/^\002([0-9a-z])(.*)/]
case (a = $1)
when '7'
@align = $2.to_i
when '0'
color = $2.to_i
bitmap.font.color = if color >= 0 and color <= 9
text_color(color)
elsif color == 8
disabled_color
elsif color == 9
system_color
end
items.push bitmap.font.color
when '1'
items.push :bold
when '2'
items.push :italic
when '3'
bitmap.font.name = $2
items.push [bitmap.font.name]
when '4'
bitmap.font.size = $2.to_i
items.push bitmap.font.size
when '5', '6'
item = (a == 5) ? RPG::Cache.picture($2) : RPG::Cache.icon($2)
if item.width > 408
item.dispose
items.unshift("[图片太大无法显示]")
next
elsif width + item.width > 408
@items.unshift(item)
break
end
items.push(item)
width += item.width + 4
height = item.height + 4 if item.height + 4 > height
when 'n'
break
end
else
str = ""
size = Rect.new(0, 0, 0, 0)
while s = item.slice!(/./)
size = bitmap.text_size(str + s)
if width + size.width > 408
item.insert(0, s)
break
else
str += s
end
end
if items[-1].is_a?(String)
items[-1] += str
else
items.push(str)
end
width += size.width
height = size.height + 4 if size.height + 4 > height
if item != ""
@items.unshift(item)
break
end
end
end
b = draw_line(width, height, items)
if @draw_y + b.height > 384
c = self.contents
self.contents = Bitmap.new(408, @draw_y + b.height)
self.contents.blt(0, 0, c, Rect.new(0,0,c.width, c.height))
c.dispose
end
x = 0
x = 204 - (b.width / 2) if @align == 1
x = 408 - b.width if @align == 2
self.contents.blt(x, @draw_y, b, Rect.new(0,0,b.width, b.height))
@draw_y += b.height
end
end
#===============================================================================
# ■ 任务界面
#===============================================================================
class Scene_Mission
#--------------------------------------------------------------------------
# ● 初始化
#--------------------------------------------------------------------------
def initialize
@last_scene = $scene
end
#--------------------------------------------------------------------------
# ● 主处理
#--------------------------------------------------------------------------
def main
screen = Spriteset_Map.new
@mission = $game_party.missions
@window1 = Window_Base.new(0,0,200,64)
@window1.contents = Bitmap.new(168,32)
@window1.contents.draw_text(0,0,168,32,"任务",1)
@window2 = Window_Base.new(200,0,440,64)
@window2.contents = Bitmap.new(408,32)
@window2.contents.draw_text(0,0,408,32,"任务说明",1)
@mission_window = Window_Mission.new
@mission_window.index = @mission.size - 1
@index = @mission_window.index
@info_window = Window_MissionInfo.new
@info_window.refresh(@mission[@index].info)
Graphics.transition
loop do
Graphics.update
Input.update
update
if $scene != self
break
end
end
Graphics.freeze
@window1.dispose
@window2.dispose
@mission_window.dispose
@info_window.dispose
screen.dispose
end
#--------------------------------------------------------------------------
# ● 刷新画面
#--------------------------------------------------------------------------
def update
@mission_window.update
@info_window.update
if @index != @mission_window.index
@index = @mission_window.index
@info_window.refresh(@mission[@index].info)
end
return update_mission if @mission_window.active
update_info
end
#--------------------------------------------------------------------------
# ● 刷新任务
#--------------------------------------------------------------------------
def update_mission
if Input.trigger?(Input::C)
$game_system.se_play($data_system.decision_se)
@mission_window.active = false
@info_window.oy = 0
elsif Input.trigger?(Input::B)
$game_system.se_play($data_system.cancel_se)
$scene = Scene_Menu.new(5)#$scene = @last_scene
return
end
end
#--------------------------------------------------------------------------
# ● 刷新人物详情
#--------------------------------------------------------------------------
def update_info
@info_window.wait = 90
if Input.press?(Input::UP)
@info_window.oy -= 3
@info_window.oy = 0 if @info_window.oy < 0
elsif Input.press?(Input::DOWN)
@info_window.oy += 3
@info_window.oy = @info_window.oy_max if @info_window.oy > @info_window.oy_max
elsif Input.repeat?(Input::L)
$game_system.se_play($data_system.cursor_se)
@mission_window.index -= 1
@mission_window.index = $game_party.missions.size - 1 if @mission_window.index < 0
elsif Input.repeat?(Input::R)
$game_system.se_play($data_system.cursor_se)
@mission_window.index += 1
@mission_window.index = 0 if @mission_window.index >= $game_party.missions.size
elsif Input.trigger?(Input::B)
$game_system.se_play($data_system.cancel_se)
@mission_window.active = true
@info_window.scroll_up = false
@info_window.oy = 0
end
end
end
#===============================================================================
# ■ 事件处理器
#===============================================================================
class Interpreter
alias orig_ec_mission execute_command if !defined?(orig_ec_mission)
alias orig_ec_tonghua execute_command if !defined?(orig_ec_tonghua)
#--------------------------------------------------------------------------
# ● 重定义执行事件命令
#--------------------------------------------------------------------------
def execute_command
if @index >= @list.size - 1
command_end
return true
end
@parameters = @list[@index].parameters
return command_108 if @list[@index].code == 108
return orig_ec_mission
end
#--------------------------------------------------------------------------
# ● 注释
#--------------------------------------------------------------------------
def command_108
case @list[@index].parameters[0]
when (/^删除任务\[(\w+)\]$/)
$game_party.delete_mission($1)
return true
when (/^完成任务\[(\w+)\]$/)
$game_party.done_mission($1)
return true
when "删除所有任务"
$game_party.delete_all_mission
return true
when "完成所有任务"
$game_party.done_all_mission
return true
when (/^放弃任务\[(\w+)\]$/)
$game_party.fail_mission($1)
return true
when (/^恢复任务\[(\w+)\]$/)
$game_party.resume_mission($1)
return true
when "恢复所有任务"
$game_party.resume_all_mission
return true
when (/^删除电话\[(\w+)\]$/)
$game_party.delete_tonghua($1)
return true
when (/^完成电话\[(\w+)\]$/)
$game_party.done_tonghua($1)
return true
when "删除所有电话"
$game_party.delete_all_tonghua
return true
when "完成所有电话"
$game_party.done_all_tonghua
return true
when (/^放弃电话\[(\w+)\]$/)
$game_party.fail_tonghua($1)
return true
when (/^恢复电话\[(\w+)\]$/)
$game_party.resume_tonghua($1)
return true
when "恢复所有电话"
$game_party.resume_all_tonghua
return true
end
text = @list[@index].parameters[0]
loop do
if @list[@index+1].code == 108 or @list[@index+1].code == 408
text += "\n" + @list[@index+1].parameters[0]
else
break
end
@index += 1
end
split = text.split("\n")
if (split[0] == "任务设置" or split[0] == "任务更新" or split[0] == "追加说明" or split[0] == "电话设置" or split[0] == "电话更新" or split[0] == "电话追加说明") and split.size >= 3
info , name = split[2] , split[1]
if split.size >= 4
for i in 3...split.size
info += "\n" + split[i]
end
end
$game_party.get_mission(name,info) if split[0] == "任务设置"
$game_party.update_mission(name,info) if split[0] == "任务更新"
$game_party.add_mission_info(name,info) if split[0] == "追加说明"
$game_party.get_tonghua(name,info) if split[0] == "电话设置"
$game_party.update_tonghua(name,info) if split[0] == "电话更新"
$game_party.add_tonghua_info(name,info) if split[0] == "电话追加说明"
end
return true
end
end