Project1

标题: 请教如何在读取存档时可以重新读取一遍脚本 [打印本页]

作者: morningboo    时间: 2015-1-6 11:00
标题: 请教如何在读取存档时可以重新读取一遍脚本
具体是这样一个问题,就是在读取存档时可以重新读取一遍脚本,原因如下:用了一个任务脚本,此脚本的任务是在脚本中直接定义的,由于游戏本身的内容较多,因此任务不可能一次全部设定完毕,所以在测试的时候每当加了新的任务,就得重新开始一遍游戏,都则的话,新任务就不会被读取,请教各位大神,有没有办法可以在读档的时候可以重新载入一遍这个任务脚本,或者可以通过一个事件重新载入一遍那个任务脚本也可以。
作者: 喵呜喵5    时间: 2015-1-6 11:46
印象中每次读取存档时就是重新读取脚本吧…………

任务不刷新的问题,请检查任务的数据是否作为变量被保存到了存档中
作者: morningboo    时间: 2015-1-6 11:56
喵呜喵5 发表于 2015-1-6 11:46
印象中每次读取存档时就是重新读取脚本吧…………

任务不刷新的问题,请检查任务的数据是否作为变量被保存 ...

报告喵大,用的是疾风怒涛汉化的那个日版的任务系统,这个是那个任务系统数据库的脚本,请教如何可以在读档时重新载入
  1. #==============================================================================
  2. # ■ VXAce-RGSS3-4-db 任务系统【数据库】       by Claimh  汉化:疾风怒涛
  3. #------------------------------------------------------------------------------
  4. # 任务内容管理部分
  5. #------------------------------------------------------------------------------
  6. #【任务情报的参照方法】
  7. #◆ 任务开始可能? (检查前提条件Rank等级)
  8. # $game_system.quest[任务ID].can_start?
  9. #◆ 任务的clear条件是否满足? (检查clear条件)
  10. # $game_system.quest[任务ID].quest_clear?
  11. #◆ 任务进行中
  12. # $game_system.quest[任务ID].playing
  13. #◆ 任务成功
  14. # $game_system.quest[任务ID].clear_finish
  15. #◆ 任务失败
  16. # $game_system.quest[任务ID].fail_finish
  17. #==============================================================================

  18. module Quest
  19.   #=============================================================================
  20.   # ■ 报酬用类(本体)
  21.   #=============================================================================
  22.   class Result
  23.     #--------------------------------------------------------------------------
  24.     # ● 公开实例变量
  25.     #--------------------------------------------------------------------------
  26.     attr_reader :type     # ITEM / WEAPON / ARMOR / MONEY
  27.     attr_reader :id       # ID
  28.     attr_reader :num      # 数
  29.     attr_reader :view     # 显示
  30.     attr_reader :penalty  # 惩罚
  31.     #--------------------------------------------------------------------------
  32.     # ● object实体
  33.     #--------------------------------------------------------------------------
  34.     def obj
  35.       case @type
  36.       when ITEM;    return $data_items[@id]
  37.       when WEAPON;  return $data_weapons[@id]
  38.       when ARMOR;   return $data_armors[@id]
  39.       when SKILL;   return $data_skills[@id]
  40.       when EV;      return $data_common_events[@id]
  41.       when CLASS;   return $data_classes[@id]
  42.       when LEVEL;   return (@id == 0 ? LvAve.new : $game_actors[@id])
  43.       when ACTOR;   return $game_actors[@id]
  44.       when QUEST_T, QUEST_F, QUEST_S
  45.                     return $game_system.quest[@id]
  46.       end
  47.     end
  48.     #--------------------------------------------------------------------------
  49.     # ● 报酬入手
  50.     #--------------------------------------------------------------------------
  51.     def gain
  52.       return if @penalty
  53.       case @type
  54.       when ITEM;    $game_party.gain_item(obj, @num)
  55.       when WEAPON;  $game_party.gain_item(obj, @num)
  56.       when ARMOR;   $game_party.gain_item(obj, @num)
  57.       when MONEY;   $game_party.gain_gold(@num)
  58.       when SKILL
  59.         @view = false if $game_actors[@num].skill_learn?(obj)
  60.         $game_actors[@num].learn_skill(@id)
  61.       when EV;      exec_interpreter
  62.       when CLASS;
  63.         @view = false if $game_actors[@num].class_id == @id
  64.         $game_actors[@num].change_class(@id, CLASS_EXP)
  65.       when ACTOR;   $game_party.add_actor(@id)
  66.       when LEVEL
  67.         if @id == 0
  68.           $game_party.members.each do |actor|
  69.             actor.change_level(actor.level + @num, false)
  70.           end
  71.         else
  72.           obj.change_level(obj.level + @num, false)
  73.         end
  74.       when QUEST_T
  75.         @view = false if $game_system.quest[@id].visible
  76.         @view = false if $game_system.quest[@id].finish
  77.         $game_system.quest[@id].visible = true
  78.       when QUEST_F
  79.         @view = false if !$game_system.quest[@id].visible
  80.         @view = false if $game_system.quest[@id].finish
  81.         $game_system.quest[@id].visible = false
  82.       when QUEST_S
  83.         if $game_system.quest[@id].finish
  84.           @view = false
  85.         else
  86.           $game_system.quest[@id].quest_start
  87.         end
  88.       end
  89.     end
  90.     #--------------------------------------------------------------------------
  91.     # ● 惩罚
  92.     #--------------------------------------------------------------------------
  93.     def lose
  94.       return if !@penalty
  95.       case @type
  96.       when ITEM;    $game_party.gain_item(obj, -@num)
  97.       when WEAPON;  $game_party.gain_item(obj, -@num)
  98.       when ARMOR;   $game_party.gain_item(obj, -@num)
  99.       when MONEY;   $game_party.lose_gold(@num)
  100.       when SKILL
  101.         @view = false if !$game_actors[@num].skill_learn?(obj)
  102.         $game_actors[@num].forget_skill(@id)
  103.       when EV;      exec_interpreter
  104.       when CLASS
  105.         @view = false if $game_actors[@num].class_id == @id
  106.         $game_actors[@num].change_class(@id, CLASS_EXP)
  107.       when LEVEL
  108.         if @id == 0
  109.           $game_party.members.each do |actor|
  110.             actor.change_level(actor.level - @num, false)
  111.           end
  112.         else
  113.           obj.change_level(obj.level - @num, false)
  114.         end
  115.       when ACTOR;   $game_party.remove_actor(@id)
  116.       when QUEST_T
  117.         @view = false if $game_system.quest[@id].visible
  118.         @view = false if $game_system.quest[@id].finish
  119.         $game_system.quest[@id].visible = true
  120.       when QUEST_F
  121.         @view = false if !$game_system.quest[@id].visible
  122.         @view = false if $game_system.quest[@id].finish
  123.         $game_system.quest[@id].visible = false
  124.       when QUEST_S
  125.         if $game_system.quest[@id].finish
  126.           @view = false
  127.         else
  128.           $game_system.quest[@id].quest_start
  129.         end
  130.       end
  131.     end
  132.     #--------------------------------------------------------------------------
  133.     # ● 公共事件发动
  134.     #--------------------------------------------------------------------------
  135.     def exec_interpreter
  136.       $game_temp.reserve_common_event(@id)
  137.       if SceneManager.scene_is?(Scene_Map) or SceneManager.scene_is?(Scene_Battle)
  138.         return #可在Map或Battle中的场景使用interpreter
  139.       #else # 该方法还可以使用文字显示、但该方法必定返回Map(不推荐)
  140.       #  $game_temp.common_event_id = @id
  141.       #  return_scene
  142.       end
  143.       # Guild实行的场合会运行独自的interpreter
  144.       ev = Game_Interpreter.new
  145.       ev.setup_reserved_common_event
  146.       loop do
  147.         ev.update
  148.         break if ev.running?
  149.       end
  150.     end
  151.   end
  152.   #=============================================================================
  153.   # ■ 条件用类(本体)
  154.   #=============================================================================
  155.   class Condition
  156.     class LvAve
  157.       attr_reader :name
  158.       attr_reader :level
  159.       def initialize
  160.         @name  = "平均Level"
  161.         @level = Quest.level_ave
  162.       end
  163.     end
  164.     #--------------------------------------------------------------------------
  165.     # ● 公开实例変量
  166.     #--------------------------------------------------------------------------
  167.     attr_reader :type   # 0~9
  168.     attr_reader :id     # ID(MONEY以外)
  169.     attr_reader :num    # 数
  170.     attr_reader :lose   # 减少
  171.     #--------------------------------------------------------------------------
  172.     # ● object实体
  173.     #--------------------------------------------------------------------------
  174.     def obj
  175.       case @type
  176.       when ITEM;    return $data_items[@id]
  177.       when WEAPON;  return $data_weapons[@id]
  178.       when ARMOR;   return $data_armors[@id]
  179.       when MONEY;   return $game_party.gold
  180.       when SW;      return $game_switches[@id]
  181.       when VAL;     return $game_variables[@id]
  182.       when ACTOR;   return $game_actors[@id]
  183.       when LEVEL;   return (@id == 0 ? LvAve.new : $game_actors[@id])
  184.       when ENEMY;   return $data_enemies[@id]
  185.       when QUEST_T; return $game_system.quest[@id]
  186.       when QUEST_F; return $game_system.quest[@id]
  187.       when SKILL;   return $data_skills[@id]
  188.       when CLASS;   return $data_classes[@id]
  189.       when SCRIPT;  return nil # 无实体
  190.       end
  191.       return nil
  192.     end
  193.     def obj_num
  194.       case @type
  195.       when ITEM;    return $game_party.item_number(obj)
  196.       when WEAPON;  return $game_party.item_number(obj)
  197.       when ARMOR;   return $game_party.item_number(obj)
  198.       when MONEY;   return $game_party.gold
  199.       when SW;      return 0#$game_switches[@id]
  200.       when VAL;     return $game_variables[@id]
  201.       when EV;      return 0
  202.       when ACTOR;   return 0
  203.       when LEVEL;   return (@id == 0 ? Quest.level_ave : $game_actors[@id].level)
  204.       when ENEMY;   return (defined?(DefeatCounter) ? $game_actors.defeat_all(@id) : 0)
  205.       when QUEST_T; return 0
  206.       when QUEST_F; return 0
  207.       when SKILL;   return 0
  208.       when CLASS;   return 0
  209.       when SCRIPT;  return 0
  210.       end
  211.       return 0
  212.     end
  213.     def obj_name
  214.       if @name == ""
  215.         case @type
  216.         when ITEM;    return $data_items[@id].name
  217.         when WEAPON;  return $data_weapons[@id].name
  218.         when ARMOR;   return $data_armors[@id].name
  219.         when MONEY;   return $game_system.terms.gold
  220.         when ACTOR;   return $game_actors[@id].name
  221.         when LEVEL;   return (@id == 0 ? LvAve.new.name : $game_actors[@id].name)
  222.         when ENEMY;   return $data_enemies[@id].name
  223.         when QUEST_T; return Quest.conv_text($game_system.quest[@id].name)
  224.         when QUEST_F; return Quest.conv_text($game_system.quest[@id].name)
  225.         when SKILL;   return $data_skills[@id].name
  226.         when CLASS;   return $data_classes[@id].name
  227.         end
  228.       end
  229.       return Quest.conv_text(@name)
  230.     end
  231.     #--------------------------------------------------------------------------
  232.     # ● 报告是义务的?
  233.     #--------------------------------------------------------------------------
  234.     def report?
  235.       return (@type == EV)
  236.     end
  237.     #--------------------------------------------------------------------------
  238.     # ● 条件检查
  239.     #--------------------------------------------------------------------------
  240.     def condition_clear?(report=false)
  241.       case @type
  242.       when ITEM;    return ($game_party.item_number(obj) >= @num)
  243.       when WEAPON;  return ($game_party.item_number(obj) >= @num)
  244.       when ARMOR;   return ($game_party.item_number(obj) >= @num)
  245.       when MONEY;   return ($game_party.gold >= @num)
  246.       when SW;      return ($game_switches[@id])
  247.       when VAL;     return ($game_variables[@id] >= @num)
  248.       when EV;      return report # 如果在事件报告中则返回report状态
  249.       when ACTOR;
  250.         if @num == 0
  251.           return ($game_party.members.include?($game_actors[@id]))
  252.         else
  253.           return (!$game_party.members.include?($game_actors[@id]))
  254.         end
  255.       when LEVEL;   return (@id == 0 ? (Quest.level_ave >= @num) : ($game_actors[@id].level >= @num))
  256.       when ENEMY;   return (defined?(DefeatCounter) ? ($game_actors.defeat_all(@id) >= @num) : false)
  257.       when QUEST_T; return $game_system.quest[@id].clear_finish
  258.       when QUEST_F; return $game_system.quest[@id].fail_finish
  259.       when SKILL
  260.         if @num == 0
  261.           $game_party.members.each do |actor|
  262.             return true if actor.skill_learn?(obj)
  263.           end
  264.         else
  265.           return $game_actors[@num].skill_learn?(obj)
  266.         end
  267.       when CLASS
  268.         if @num == 0
  269.           $game_party.members.each do |actor|
  270.             return true if actor.class_id == @id
  271.           end
  272.         else
  273.           return ($game_actors[@num].class_id == @id)
  274.         end
  275.       when SCRIPT;  return script_clear?(@id, @num)
  276.       end
  277.       return false
  278.     end
  279.     #--------------------------------------------------------------------------
  280.     # ● 任务物品减少
  281.     #--------------------------------------------------------------------------
  282.     def condition_lose
  283.       return unless @lose
  284.       case @type
  285.       when ITEM;    $game_party.gain_item(obj, -@num)
  286.       when WEAPON;  $game_party.gain_item(obj, -@num)
  287.       when ARMOR;   $game_party.gain_item(obj, -@num)
  288.       when MONEY;   $game_party.lose_gold(@num)
  289.       when ACTOR;   $game_party.remove_actor(@id)
  290.       end
  291.     end
  292.     #--------------------------------------------------------------------------
  293.     # ● 条件未满足時的说明
  294.     #--------------------------------------------------------------------------
  295.     def cause(txt)
  296.       case @type
  297.       when ITEM, WEAPON, ARMOR
  298.         return "所需#{obj_name}还差\\n#{(@num - obj_num)}个"
  299.       when MONEY
  300.         return "所持金钱还差#{(@num - obj_num)} #{$data_system.currency_unit}"
  301.       when ACTOR
  302.         if @num == 0
  303.           return "#{obj_name}\\n不在队伍中"
  304.         else
  305.           return "#{obj_name}\\n还在队伍中"
  306.         end
  307.       when LEVEL
  308.         if @id == 0
  309.           return "#{obj_name}所需的Lv \\n#{num}没有达到"
  310.         else
  311.           return "#{obj_name}所需的Level\\n#{num}没有达到"
  312.         end
  313.       when ENEMY
  314.         return "还需要讨伐#{obj_name}\\n#{(@num - obj_num)}只"
  315.       when QUEST_T
  316.         return "『#{obj_name}』\\n尚未完成" if obj.visible
  317.       when QUEST_F
  318.         return "『#{obj_name}』\\n已经完成" if obj.visible
  319.       when SKILL
  320.         if @num == 0
  321.           return "#{obj_name}\\n尚未习得"
  322.         else
  323.           return "#{$game_actors[@num].name}的#{obj_name}\\n技能尚未习得"
  324.         end
  325.       when CLASS
  326.         if @num == 0
  327.           return "职业为#{obj_name}的成员尚未加入"
  328.         else
  329.           return "#{$game_actors[@num].name}的职业不是\\n#{obj_name}"
  330.         end
  331.       when SCRIPT
  332.         return script_cause((txt=="开始" ? 0 : 1), @id, @num)
  333.       end
  334.       return txt+"条件尚未满足"
  335.     end
  336.   end
  337.   #=============================================================================
  338.   # ■ SW操作用类(本体)
  339.   #=============================================================================
  340.   class Sw
  341.     #--------------------------------------------------------------------------
  342.     # ● 公开实例变量
  343.     #--------------------------------------------------------------------------
  344.     attr_reader :play   # 开始時切换到ON的ID
  345.     attr_reader :clear  # 成功時切换到ON的ID
  346.     attr_reader :fail   # 失败時切换到ON的ID
  347.     #--------------------------------------------------------------------------
  348.     # ● SW复位
  349.     #--------------------------------------------------------------------------
  350.     def reset
  351.       $game_switches[@play] = false  if [url=home.php?mod=space&uid=283834]@play[/url] != 0
  352.       $game_switches[@clr]  = false  if @clr  != 0
  353.       $game_switches[@fail] = false  if @fail != 0
  354.       $game_map.need_refresh = true
  355.     end
  356.     #--------------------------------------------------------------------------
  357.     # ● 任务开始時SW操作
  358.     #--------------------------------------------------------------------------
  359.     def play
  360.       $game_switches[@play] = true   if @play != 0
  361.       $game_switches[@clr]  = false  if @clr  != 0
  362.       $game_switches[@fail] = false  if @fail != 0
  363.       $game_map.need_refresh = true
  364.     end
  365.     #--------------------------------------------------------------------------
  366.     # ● 任务成功時SW操作
  367.     #--------------------------------------------------------------------------
  368.     def clear
  369.       $game_switches[@play] = false  if @play != 0
  370.       $game_switches[@clr]  = true   if @clr  != 0
  371.       $game_switches[@fail] = false  if @fail != 0
  372.       $game_map.need_refresh = true
  373.     end
  374.     #--------------------------------------------------------------------------
  375.     # ● 任务失败時SW操作
  376.     #--------------------------------------------------------------------------
  377.     def fail
  378.       $game_switches[@play] = false  if @play != 0
  379.       $game_switches[@clr]  = false  if @clr  != 0
  380.       $game_switches[@fail] = true   if @fail != 0
  381.       $game_map.need_refresh = true
  382.     end
  383.   end
  384.   #=============================================================================
  385.   # ■ 任务管理情报
  386.   #=============================================================================
  387.   class QuestData
  388.     #--------------------------------------------------------------------------
  389.     # ● 公开实例变数
  390.     #--------------------------------------------------------------------------
  391.     attr_reader   :id       # 任务ID(変更不可)
  392.     attr_accessor :name     # 任务名
  393.     attr_accessor :client   # 委托人
  394.     attr_accessor :rank     # 任务Rank等级
  395.     attr_accessor :visible  # 显示许可
  396.     attr_accessor :enable   # 公会接受许可
  397.     attr_accessor :pre      # 前提条件
  398.     attr_accessor :condition# clear条件
  399.     attr_accessor :result   # 报酬
  400.     attr_accessor :view_res # 报酬=有显示
  401.     attr_accessor :view_cond# 有进展显示
  402.     attr_reader   :sw       # 开关操作(play/clear/fail)
  403.     attr_accessor :text     # 委托内容
  404.     attr_reader   :playing  # 任务实行中
  405.     attr_reader   :status   # 任务结果
  406.     attr_reader   :report   # 任务报告OK
  407.     #--------------------------------------------------------------------------
  408.     # ● object初期化
  409.     #--------------------------------------------------------------------------
  410.     def initialize(id)
  411.       @id = id
  412.       reset
  413.     end
  414.     #--------------------------------------------------------------------------
  415.     # ● data重置
  416.     #--------------------------------------------------------------------------
  417.     def reset
  418.       @name     = Quest::QUEST[@id][0].dup
  419.       @client   = Quest::QUEST[@id][1].dup
  420.       [url=home.php?mod=space&uid=30039]@RAnk[/url]     = Quest::QUEST[@id][2].dup
  421.       @visible  = Quest::QUEST[@id][3].visible
  422.       @enable   = Quest::QUEST[@id][3].enable
  423.       @view_res = Quest::QUEST[@id][3].v_res
  424.       @view_cond= Quest::QUEST[@id][3].v_cond
  425.       @chg_ev   = Quest::QUEST[@id][3].chg_ev
  426.       @shop_ids = Quest::QUEST[@id][3].ids
  427.       [url=home.php?mod=space&uid=395398]@PRE[/url]      = Quest::QUEST[@id][4].dup
  428.       @condition= Quest::QUEST[@id][5].dup
  429.       @result   = Quest::QUEST[@id][6].dup
  430.       @sw       = Quest::QUEST[@id][7].dup
  431.       @text     = Quest::QUEST[@id][8].dup
  432.       @playing  = false
  433.       @status   = STAY
  434.       @report   = false
  435.       @sw.reset
  436.     end
  437.     #--------------------------------------------------------------------------
  438.     # ● 状态
  439.     #--------------------------------------------------------------------------
  440.     def clear # 成功
  441.       return (@status == CLEAR)
  442.     end
  443.     def fail  # 失败
  444.       return (@status == FAIL)
  445.     end
  446.     def finish  # 结束(不论结果)
  447.       return ((@status != STAY) and !@report) # 报告后尚未结束
  448.     end
  449.     def clear_finish  # 任务成功结束
  450.       return (finish and clear)
  451.     end
  452.     def fail_finish   # 任务失败结束
  453.       return (finish and fail)
  454.     end
  455.     def guild_report  # 等待向公会报告
  456.       return (!finish and @enable and @playing)
  457.     end
  458.     def guild_enable(id=0)  # 公会可接受任务
  459.       if !@shop_ids.empty?
  460.         return false if !@shop_ids.include?(id)
  461.       end
  462.       return (!finish and @enable and !@playing)
  463.     end
  464.     #--------------------------------------------------------------------------
  465.     # ● 页面数
  466.     #--------------------------------------------------------------------------
  467.     def page_num
  468.       return @text.split(/\\p/).size
  469.     end
  470.     #--------------------------------------------------------------------------
  471.     # ● 指定页面上的文本
  472.     #--------------------------------------------------------------------------
  473.     def page_text(page)
  474.       txt = @text.split(/\\p/)
  475.       return txt
  476.     end
  477.     #--------------------------------------------------------------------------
  478.     # ● 手续费
  479.     #--------------------------------------------------------------------------
  480.     def commission
  481.       ret = 0
  482.       for item in @pre
  483.         next if item.type != MONEY
  484.         ret += item.num
  485.       end
  486.       return ret
  487.     end
  488.     #--------------------------------------------------------------------------
  489.     # ● 报酬金额
  490.     #--------------------------------------------------------------------------
  491.     def premium
  492.       ret = 0
  493.       @result.each do |item|
  494.         next if item.penalty or item.type != MONEY
  495.         ret += item.num
  496.       end
  497.       return ret
  498.     end
  499.     #--------------------------------------------------------------------------
  500.     # ● 报酬金额 变更
  501.     #--------------------------------------------------------------------------
  502.     def change_premium(money)
  503.       @result.each_index do |i|
  504.         next if @result[i].penalty or @result[i].type != MONEY
  505.         @result.delete_at(i)  # 减去所有MONEY
  506.       end
  507.       @result.push(RsltMoney.new(money))
  508.     end
  509.     #--------------------------------------------------------------------------
  510.     # ● 报酬金额 追加
  511.     #--------------------------------------------------------------------------
  512.     def add_premium(money)
  513.       money += premium
  514.       change_premium(money)
  515.     end
  516.     #--------------------------------------------------------------------------
  517.     # ● 惩罚ー金额
  518.     #--------------------------------------------------------------------------
  519.     def penalty
  520.       ret = 0
  521.       @result.each do |item|
  522.         next if !item.penalty or item.type != MONEY
  523.         ret += item.num
  524.       end
  525.       return ret
  526.     end
  527.     #--------------------------------------------------------------------------
  528.     # ● 惩罚ー金额 变更
  529.     #--------------------------------------------------------------------------
  530.     def change_penalty(money)
  531.       @result.each_index do |i|
  532.         next if !@result[i].penalty or @result[i].type != MONEY
  533.         @result.delete_at(i)  # 减去所有MONEY
  534.       end
  535.       @result.push(RsltMoneyP.new(money))
  536.     end
  537.     #--------------------------------------------------------------------------
  538.     # ● 惩罚ー金额 追加
  539.     #--------------------------------------------------------------------------
  540.     def add_penalty(money)
  541.       money += penalty
  542.       change_penalty(money)
  543.     end
  544.     #--------------------------------------------------------------------------
  545.     # ● 任务开始可能?
  546.     #--------------------------------------------------------------------------
  547.     def can_start?
  548.       return false if finish
  549.       @pre.each do |cond|
  550.         return false unless cond.condition_clear?(true) # 前提条件未满足
  551.       end
  552.       return true if @rank.quest.nil?
  553.       return (@rank.quest <= $game_party.quest_rank)
  554.     end
  555.     #--------------------------------------------------------------------------
  556.     # ● 任务不能开始的理由[文本]
  557.     #--------------------------------------------------------------------------
  558.     def start_cause
  559.       unless @rank.quest.nil?
  560.         if @rank.quest > $game_party.quest_rank
  561.           return "Rank等级\\n不够接受该任务"
  562.         end
  563.       end
  564.       cause = []
  565.       @pre.each do |cond|
  566.         cause.push(cond) unless cond.condition_clear?(true)
  567.       end
  568.       unless cause.empty?
  569.         return cause[0].cause("开始") if cause.size == 1
  570.         return "开始条件尚未满足"
  571.       end
  572.       p "QuestData[#{@id}].start_cause  no cause"
  573.       return "" ## 在这里使用不好
  574.     end
  575.     #--------------------------------------------------------------------------
  576.     # ● 有报告的义务?
  577.     #--------------------------------------------------------------------------
  578.     def report?
  579.       return false if !@enable or @report # 没有公会任务 or 报告已完成
  580.       @condition.each do |cond|
  581.         return true if cond.report?
  582.       end
  583.       return false
  584.     end
  585.     #--------------------------------------------------------------------------
  586.     # ● 报告等待?
  587.     #--------------------------------------------------------------------------
  588.     def wait_report?
  589.       return (report? and @playing)
  590.     end
  591.     #--------------------------------------------------------------------------
  592.     # ● 任务的clear条件是否满足?
  593.     #--------------------------------------------------------------------------
  594.     def quest_clear?
  595.       @condition.each do |cond|
  596.         return false unless cond.condition_clear?(@report)
  597.       end
  598.       return true
  599.     end
  600.     #--------------------------------------------------------------------------
  601.     # ● 任务未成功的理由[文本]
  602.     #--------------------------------------------------------------------------
  603.     def clear_cause
  604.       cause = []
  605.       @condition.each do |cond|
  606.         cause.push(cond) unless cond.condition_clear?(@report)
  607.       end
  608.       unless cause.empty?
  609.         return cause[0].cause("clear") if cause.size == 1
  610.         return "clear条件不满足"
  611.       end
  612.       p "QuestData[#{@id}].clear_cause  no cause"
  613.       return "" ## 在这里使用不好
  614.     end
  615.     #--------------------------------------------------------------------------
  616.     # ● 任务开始
  617.     #--------------------------------------------------------------------------
  618.     def quest_start
  619.       $game_temp.questresult_id = @id
  620.       @enable = false if @chg_ev ## 公会任务→事件任务变更
  621.       @visible = true
  622.       @playing = true
  623.       @status  = STAY
  624.       @report  = false
  625.       @sw.play
  626.       @pre.each { |cond| cond.condition_lose } # 完成条件物品减少
  627.     end
  628.     #--------------------------------------------------------------------------
  629.     # ● 任务clear
  630.     #--------------------------------------------------------------------------
  631.     def quest_clear(force=false, audio=true)
  632.       if report? and !force # 是否有义务去报告、等待报告
  633.         @status  = CLEAR
  634.         @report  = true
  635.       else
  636.         $game_temp.questresult_id = @id
  637.         @playing = false
  638.         @status  = CLEAR
  639.         @report  = false
  640.         @view_cond = false # 进展显示OFF
  641.         @sw.clear
  642.         @condition.each { |cond| cond.condition_lose } # 完成条件物品减少
  643.         @result.each { |item| item.gain }  # 报酬
  644.         $game_temp.questresult_old_rank = $game_party.quest_rank
  645.         if @rank.r_next.nil?
  646.           # 什么也没有
  647.         elsif @rank.r_next == 0 # 加算
  648.           $game_party.quest_rank = [10, ($game_party.quest_rank+1)].min
  649.         elsif $game_party.quest_rank < @rank.r_next # jump up
  650.           $game_party.quest_rank = @rank.r_next
  651.         end
  652.         clear_audio if audio
  653.       end
  654.     end
  655.     #--------------------------------------------------------------------------
  656.     # ◆任务失败
  657.     #--------------------------------------------------------------------------
  658.     def quest_fail(force=false, audio=true)
  659.       if report? and !force # 是否有义务去报告、等待报告
  660.         @status  = FAIL
  661.         @report  = true
  662.       else
  663.         $game_temp.questresult_id = @id
  664.         @playing = false
  665.         @status  = FAIL
  666.         @report  = false
  667.         @view_cond = false # 进展显示OFF
  668.         @sw.fail
  669.         @result.each { |item| item.lose }  # 惩罚
  670.         $game_temp.questresult_old_rank = $game_party.quest_rank
  671.         if @rank.r_down.nil?
  672.           # 什么也没有
  673.         elsif @rank.r_down == 0 # 减算
  674.           $game_party.quest_rank = [1, ($game_party.quest_rank-1)].max
  675.         elsif $game_party.quest_rank > @rank.r_down # jump up
  676.           $game_party.quest_rank = @rank.r_down
  677.         end
  678.         fail_audio if audio
  679.       end
  680.     end
  681.     #----------------------------------------------------------------------------
  682.     # ● 成功時音效
  683.     #----------------------------------------------------------------------------
  684.     def clear_audio
  685.       CLR_A_FILE.play
  686.     end
  687.     #----------------------------------------------------------------------------
  688.     # ● 失败時音效
  689.     #----------------------------------------------------------------------------
  690.     def fail_audio
  691.       FAIL_A_FILE.play
  692.     end
  693.   end
  694.   #=============================================================================
  695.   # ■ 任务列表的管理情报
  696.   #=============================================================================
  697.   class QuestList
  698.     #--------------------------------------------------------------------------
  699.     # ● 公开实例变量
  700.     #--------------------------------------------------------------------------
  701.     attr_reader :ids
  702.     #--------------------------------------------------------------------------
  703.     # ● object初期化
  704.     #--------------------------------------------------------------------------
  705.     def initialize
  706.       reset
  707.     end
  708.     #--------------------------------------------------------------------------
  709.     # ● 任务列表重置
  710.     #--------------------------------------------------------------------------
  711.     def reset(id_only=false)
  712.       # reset时创建数据库、read時依序生成
  713.       @list = {} unless id_only
  714.       # 读取任务设定的ID
  715.       @ids = QUEST.keys.sort.dup
  716.     end
  717.     #--------------------------------------------------------------------------
  718.     # ● data参照
  719.     #--------------------------------------------------------------------------
  720.     def [](id)
  721.       unless @ids.include?(id)
  722.         unless QUEST.keys.include?(id)
  723.           p "不正确的任务ID[#{id}]被指定"
  724.           return nil # nil返回。应该会出现NoMethodError
  725.         end
  726.         @ids.push(id)
  727.         @ids.sort!
  728.       end
  729.       if @list[id].nil? # 因为没有object
  730.         @list[id] = QuestData.new(id)
  731.       end
  732.       return @list[id]
  733.     end
  734.     #--------------------------------------------------------------------------
  735.     # ● 进行中任务数
  736.     #--------------------------------------------------------------------------
  737.     def num_of_playing
  738.       cnt = 0
  739.       for id in @ids
  740.         cnt += 1 if @list[id].playing
  741.       end
  742.       return cnt
  743.     end
  744.     #--------------------------------------------------------------------------
  745.     # ● clear任务数
  746.     #--------------------------------------------------------------------------
  747.     def num_of_clear
  748.       cnt = 0
  749.       for id in @ids
  750.         cnt += 1 if @list[id].clear
  751.       end
  752.       return cnt
  753.     end
  754.     #--------------------------------------------------------------------------
  755.     # ● 失败任务数
  756.     #--------------------------------------------------------------------------
  757.     def num_of_fail
  758.       cnt = 0
  759.       for id in @ids
  760.         cnt += 1 if @list[id].fail
  761.       end
  762.       return cnt
  763.     end
  764.     #--------------------------------------------------------------------------
  765.     # ● 进行中公会任务数
  766.     #--------------------------------------------------------------------------
  767.     def num_of_shop_playing
  768.       cnt = 0
  769.       for id in @ids
  770.         cnt += 1 if @list[id].enable and @list[id].playing
  771.       end
  772.       return cnt
  773.     end
  774.     #--------------------------------------------------------------------------
  775.     # ● 进行中任务数是否超过规定上限?
  776.     #--------------------------------------------------------------------------
  777.     def over_playing?
  778.       return false if MAX == nil
  779.       return (num_of_shop_playing >= MAX)
  780.     end
  781.   end
  782.   #--------------------------------------------------------------------------
  783.   # ● 平均Level
  784.   #--------------------------------------------------------------------------
  785.   def self.level_ave
  786.     lv = 0
  787.     $game_party.members.each { |actor| lv += actor.level }
  788.     return (lv / $game_party.members.size).truncate
  789.   end
  790.   #----------------------------------------------------------------------------
  791.   # ● 任务列表名称
  792.   #----------------------------------------------------------------------------
  793.   def self.questlist_name
  794.     QUEST_LIST.collect { |c| LIST_NAME[c] }
  795.   end
  796.   #----------------------------------------------------------------------------
  797.   # ● 公会命令列表名称
  798.   #----------------------------------------------------------------------------
  799.   def self.guild_name
  800.     GUILD_LIST.collect { |c| GUILD_NAME[c] }
  801.   end
  802.   #--------------------------------------------------------------------------
  803.   # ● 控制文字的变换
  804.   #--------------------------------------------------------------------------
  805.   def self.conv_text(txt)
  806.     return "" if txt.nil? or txt == ""
  807.     text = txt.dup
  808.     ## 控制字符的解码变换
  809.     # 会先进行名称转换
  810.     # \\n[n]  : ID:n-角色ー名
  811.     text.gsub!(/\\[Nn]\[([0-9]+)\]/) { $game_actors[$1.to_i].name }
  812.     # \\e[n]  : ID:n-敌人ー名
  813.     text.gsub!(/\\[Ee]\[([0-9]+)\]/) { $data_enemies[$1.to_i].name }
  814.     # \\j[n]  : ID:n-职业名
  815.     text.gsub!(/\\[Jj]\[([0-9]+)\]/) { $data_classes[$1.to_i].name }
  816.     # \\s[n]  : ID:n-技能名
  817.     text.gsub!(/\\[Ss]\[([0-9]+)\]/) { $data_skills[$1.to_i].name }
  818.     # \\i[n]  : ID:n-物品名
  819.     text.gsub!(/\\[Tt]\[([0-9]+)\]/) { $data_items[$1.to_i].name }
  820.     # \\w[n]  : ID:n-武器名
  821.     text.gsub!(/\\[Ww]\[([0-9]+)\]/) { $data_weapons[$1.to_i].name }
  822.     # \\a[n]  : ID:n-防具名
  823.     text.gsub!(/\\[Aa]\[([0-9]+)\]/) { $data_armors[$1.to_i].name }
  824.     # \\m[n]  : ID:n-地图名
  825.     text.gsub!(/\\[Mm]\[([0-9]+)\]/) { load_data(sprintf("Data/Map%03d.rvdata2", $1.to_i)).display_name }
  826.     # \\q[n]  : ID:n-任务名
  827.     text.gsub!(/\\[Qq]\[([0-9]+)\]/) { $game_system.quest[$1.to_i].name }

  828.     return text
  829.   end
  830.   #--------------------------------------------------------------------------
  831.   # ● 委托内容描画
  832.   #--------------------------------------------------------------------------
  833.   def self.draw_quest_text(bitmap, x, y, w, text_h, txt)
  834.     txt = "" if txt.nil?
  835.     text = self.conv_text(txt)
  836.     y_org = y
  837.     xx = 0
  838.     line = 0
  839.    
  840.     # 便宜上
  841.     text.gsub!(/\\\\/) { "\000" }
  842.     # \\c[n]  : 文字色変更
  843.     text.gsub!(/\\[Cc]\[([0-9]+)\]/) { "\001[#{$1}]" }
  844.     # \\+     : 加粗表示 开始/结束
  845.     text.gsub!(/\\[+]/) { "\002" }
  846.     # \\-     : 斜体表示 开始/结束
  847.     text.gsub!(/\\[-]/) { "\003" }
  848.     # \\x[n]  : X轴方向 n 的当前位置刻画
  849.     text.gsub!(/\\[Xx]\[([0-9]+)\]/) { "\004[#{$1}]" }
  850.     # \\y[n]  : 指定行CR回车
  851.     text.gsub!(/\\[Yy]\[([0-9]+)\]/) { "\005[#{$1}]" }
  852.     # \\i     : icon表示
  853.     text.gsub!(/\\[Ii]\[(.*?+)\]/) { "\006[#{$1}]" }
  854.     # \\{}    : 扩大・缩小
  855.     text.gsub!(/\\{/) { "\007" }
  856.     text.gsub!(/\\}/) { "\008" }
  857.     # \\n     : 改行
  858.     text.gsub!(/\\[Nn]/) { "\n" }
  859.    
  860.    
  861.     bold   = bitmap.font.bold
  862.     italic = bitmap.font.italic
  863.     color  = bitmap.font.color.dup
  864.     size   = bitmap.font.size
  865.     while ((c = text.slice!(/./m)) != nil)
  866.       case c
  867.       when "\000"  # \\ 的场合,还原原来的文字
  868.         c = "\\"
  869.       when "\n"  # \\n     : 改行
  870.         xx = 0; y += text_h; line += 1
  871.         next  # 下一个字符
  872.       when "\001"  # \\c[n]  : 文字色变更
  873.         text.sub!(/\[([0-9]+)\]/, "")
  874.         bitmap.font.color = self.text_color($1.to_i)
  875.         next  # 下一个字符
  876.       when "\002"  # \\+     : 加粗表示 开始/结束
  877.         bitmap.font.bold = !bitmap.font.bold
  878.         next  # 下一个字符
  879.       when "\003"  # \\-     : 斜体表示 开始/结束
  880.         bitmap.font.italic = !bitmap.font.italic
  881.         next  # 下一个字符
  882.       when "\004"  # \\x[n]  : X轴方向 n 的当前位置刻画
  883.         text.sub!(/\[([0-9]+)\]/, "")
  884.         xx = $1.to_i
  885.         next  # 下一个字符
  886.       when "\005"  # \\y[n]  : 指定行CR回车
  887.         text.sub!(/\[([0-9]+)\]/, "")
  888.         y = y_org + $1.to_i * text_h
  889.         xx = 0
  890.         next  # 下一个字符
  891.       when "\006"  # \\i     : icon显示
  892.         text.sub!(/\[(.*?+)\]/, "")
  893.         xx += self.draw_icon(bitmap, x+xx, y, text_h, $1.to_i)
  894.         next  # 下一个字符
  895.       when "\007"  # \\{     : 扩大
  896.         bitmap.font.size += 8 if bitmap.font.size <= 64
  897.         next  # 下一个字符
  898.       when "\008"  # \\}     : 缩小
  899.         bitmap.font.size -= 8 if bitmap.font.size >= 16
  900.         next  # 下一个字符
  901.       end
  902.       # 文字描画
  903.       bitmap.draw_text(x+xx, y, 40, text_h, c)
  904.       # x 被绘制字符宽度的加算
  905.       xx += bitmap.text_size(c).width
  906.       # 自动改行
  907.       if xx > w
  908.         xx = 0; y += text_h
  909.       end
  910.     end
  911.     # 作为预防措施,还原初始设定
  912.     bitmap.font.bold   = bold
  913.     bitmap.font.italic = italic
  914.     bitmap.font.color  = color.dup
  915.     bitmap.font.size   = size
  916.   end
  917.   #--------------------------------------------------------------------------
  918.   # ● 描画(Icon)  \\icon用
  919.   #--------------------------------------------------------------------------
  920.   def self.draw_icon(bitmap, x, y, h, icon_index)
  921.     bit = Cache.system("Iconset")
  922.     rect = Rect.new(icon_index % 16 * 24, icon_index / 16 * 24, 24, 24)
  923.     bitmap.blt(x, y, bit, rect)
  924.     return rect.width
  925.   end
  926.   #--------------------------------------------------------------------------
  927.   # ● 描画色  \\c用
  928.   #--------------------------------------------------------------------------
  929.   def self.text_color(n)
  930.     return Cache.system("Window").get_pixel(64 + (n % 8) * 8, 96 + (n / 8) * 8)
  931.   end
  932. end

  933. #==============================================================================
  934. # ■ Game_System
  935. #==============================================================================
  936. class Game_System
  937.   #--------------------------------------------------------------------------
  938.   # ● 公开实例变量
  939.   #--------------------------------------------------------------------------
  940.   attr_reader   :quest          # 任务列表
  941.   #--------------------------------------------------------------------------
  942.   # ● object初期化
  943.   #--------------------------------------------------------------------------
  944.   alias initialize_quest initialize
  945.   def initialize
  946.     initialize_quest
  947.     @quest = Quest::QuestList.new
  948.   end
  949. end

  950. #==============================================================================
  951. # ■ Game_Party
  952. #==============================================================================
  953. class Game_Party
  954.   #--------------------------------------------------------------------------
  955.   # ● 公开实例变量
  956.   #--------------------------------------------------------------------------
  957.   attr_accessor :quest_rank
  958.   #--------------------------------------------------------------------------
  959.   # ● object初期化
  960.   #--------------------------------------------------------------------------
  961.   alias initialize_quest initialize
  962.   def initialize
  963.     initialize_quest
  964.     @quest_rank = 1
  965.   end
  966. end
复制代码

作者: 喵kano    时间: 2015-1-6 13:51
如果只是测试的话,最简单的办法是在呼出任务面板前追加事件脚本: $game_system.quest.reset 强制重置全部任务,经测试可刷新。
作者: 喵呜喵5    时间: 2015-1-6 15:05
morningboo 发表于 2015-1-6 11:56
报告喵大,用的是疾风怒涛汉化的那个日版的任务系统,这个是那个任务系统数据库的脚本,请教如何可以在读 ...

任务列表只在游戏初次运行时生成并被保存到了存有包括当前存档游戏时间在内各种数据的$game_system中,读取存档时自然无法刷新

解决方法同4楼,强制刷新一下即可
作者: morningboo    时间: 2015-1-6 20:14
喵kano 发表于 2015-1-6 13:51
如果只是测试的话,最简单的办法是在呼出任务面板前追加事件脚本: $game_system.quest.reset 强 ...

感谢解答,提供了思路,在reset方法的类里依样画葫芦,写一个只重置任务部分属性的方法就行了,谢谢解答,也谢谢喵大,谢谢




欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1