扫描二维码关注官方公众号
返回列表
+ 发新帖
查看: 93|回复: 0

[转载发布] VA冒险者公会任务交互系统/任务悬赏系统脚本

[复制链接]
累计送礼:
0 个
累计收礼:
0 个
  • TA的每日心情
    开心
    2025-7-8 01:43
  • 签到天数: 157 天

    连续签到: 2 天

    [LV.7]常住居民III

    2459

    主题

    506

    回帖

    1万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    VIP
    6
    卡币
    13441
    OK点
    16
    推广点
    0
    同能卷
    0
    积分
    16434

    灌水之王

    发表于 昨天 08:32 | 显示全部楼层 |阅读模式
    站内找到的任务系统似乎都是用来查看任务的,没有交互选项……
    于是作为ruby萌新的自己只好结合ds的帮助写了一点,分享出来希望可以帮到有类似想法的人。虽然但是都25年了真的还有人在玩VA吗
    这个任务系统有接受任务和提交、放弃的选项,比较类似于冒险者公会的悬赏面板。提交任务后可以根据需求打开开关,方便其他事件。比如想要在提交任务后,根据任务的完成情况来发放奖励的话,就可以用开关继续开启一个公共事件。
    每用一次添加任务描述都会换行,同时文本内容也支持使用转义符,需要使用双反斜杠。效果和VA文本框里面的一样,具体可以看事件里的脚本指令。其他指令在脚本开头的使用方法里。
    脚本里的常量配置部分是可以自行更改的,其中任务与开关映射表也需要自己编辑。修改时请务必注意格式。

    新人第一次发帖,可能有bug或者其他各种问题,欢迎积极反馈,只要我看到了消息并且有空的话就会改。如果能够帮到你,希望可以评论一下~

    游戏内效果如下:
      

    事件范例:


    脚本代码:
    RUBY 代码
    1. #===============================================================================
    2. #
    3. # ■ 公会任务系统 - By Adelina
    4. #
    5. #===============================================================================
    6. #===============================================================================
    7. # ● 事件指令使用方法
    8. #===============================================================================
    9. # 1. 打开公会面板: open_quest_board
    10. # 2. 创建任务:     $game_party.create_quest(任务id, "任务标题")
    11. # 3. 添加任务描述: $game_party.add_quest_text(任务id, "描述文本")
    12. # 4. 设置任务可见: $game_party.set_quest_visible(任务id, true/false)
    13. # 5. 接取任务:     $game_party.accept_quest(任务id)  # 可在事件中使用
    14. # 6. 完成任务:     $game_party.finish_quest(任务id)  # 可在事件中使用
    15. #===============================================================================
    16. # ● 常量配置
    17. #===============================================================================
    18. module QuestConfig
    19.   # 窗口尺寸比例
    20.   LEFT_WINDOW_WIDTH_RATIO  = 0.4     # 左侧窗口宽度比例
    21.   RIGHT_WINDOW_HEIGHT_RATIO = 0.827  # 右侧窗口高度比例
    22.   # 状态字体与文本设置
    23.   STATUS_FONT_SIZE = 18                         # 状态文字大小
    24.   AVAILABLE_STATUS  = "可接取 - 按Enter接取任务"# 可接取状态提示
    25.   ACCEPTED_STATUS   = "进行中 - 按Enter管理任务"# 进行中状态提示
    26.   ACCEPTED_COLOR   = Color.new(255, 255, 0)     # 进行中状态文本颜色
    27.   # 无任务时显示的文本内容
    28.   NO_QUEST_TEXT  = "暂无任务"  
    29.   # 可接受任务选项文本
    30.   ACCEPT_TEXT   = "接受任务"
    31.   DECLINE_TEXT  = "取消"
    32.   # 进行中任务选项文本
    33.   SUBMIT_TEXT   = "提交任务"  # 打开对应开关后,从系统中删除任务
    34.   ABANDON_TEXT  = "放弃任务"  # 直接从系统中删除任务
    35. end
    36. # 任务ID与开关映射表
    37. # 提交任务后会打开对应的开关,可以接各种事件
    38. QUEST_SWITCH_MAP = {
    39.   # 格式:任务ID => 开关ID
    40.   1 => 10,   # 任务1完成时打开开关10
    41.   2 => 11,   # 同理,任务2完成时打开开关11
    42.   3 => 12
    43. }
    44. #===============================================================================
    45. #===============================================================================
    46. #
    47. # ★ 请尽量不要修改以下内容
    48. #
    49. #===============================================================================
    50. #===============================================================================
    51. class Quest
    52.   attr_reader :id
    53.   attr_reader :name
    54.   attr_accessor :accepted
    55.   attr_accessor :visible
    56.   attr_reader :content
    57.   def initialize(id, name)
    58.     @id = id
    59.     @name = name
    60.     @accepted = false
    61.     @visible = true  # 默认可见
    62.     @content = []
    63.   end
    64.   def add_text(text)
    65.     @content  0
    66.   end
    67. end
    68. class Window_QuestRight < Window_Base
    69.   include QuestConfig
    70.   def initialize
    71.     left_width = (Graphics.width * LEFT_WINDOW_WIDTH_RATIO).to_i
    72.     width = Graphics.width - left_width
    73.     height = (Graphics.height * RIGHT_WINDOW_HEIGHT_RATIO).to_i
    74.     super(left_width, 0, width, height)
    75.     @quest = nil
    76.   end
    77.   def set_quest(quest)
    78.     @quest = quest
    79.     refresh
    80.   end
    81.   def refresh
    82.     returnif disposed? || contents.disposed?
    83.     contents.clear
    84.     if@quest.nil?
    85.       contents.font.color = system_color
    86.       rect = Rect.new(0, 0, contents_width, contents_height)
    87.       draw_text(rect, NO_QUEST_TEXT, 1)
    88.       contents.font.color = normal_color
    89.       return
    90.     end
    91.     original_size = contents.font.size
    92.     draw_text(0, 0, contents_width, line_height, @quest.name, 1)
    93.     y = line_height + 10
    94.     @quest.content.eachdo |text|
    95.       draw_text_ex(0, y, text)
    96.       y += line_height * 1.2
    97.     end
    98.     contents.font.size = STATUS_FONT_SIZE
    99.     status_text = @quest.accepted ? ACCEPTED_STATUS : AVAILABLE_STATUS
    100.     status_color = @quest.accepted ? ACCEPTED_COLOR : normal_color
    101.     contents.font.color = status_color
    102.     draw_text(0, contents_height - line_height, contents_width,
    103.               line_height, status_text, 1)
    104.     contents.font.color = normal_color
    105.     contents.font.size = original_size
    106.   end
    107. end
    108. class Window_QuestOption < Window_Command
    109.   include QuestConfig
    110.   attr_reader :closed
    111.   def initialize(quest)
    112.     @quest = quest
    113.     @closed = false
    114.     super(0, 0)
    115.     update_placement
    116.     self.openness = 255
    117.     activate
    118.   end
    119.   def window_width
    120.     return Graphics.width - (Graphics.width * LEFT_WINDOW_WIDTH_RATIO).to_i
    121.   end
    122.   def update_placement
    123.     left_width = (Graphics.width * LEFT_WINDOW_WIDTH_RATIO).to_i
    124.     self.x = left_width
    125.     self.y = (Graphics.height * RIGHT_WINDOW_HEIGHT_RATIO).to_i
    126.     self.width = Graphics.width - left_width
    127.   end
    128.   def make_command_list
    129.     if@quest.accepted
    130.       add_command(SUBMIT_TEXT, :submit)
    131.       add_command(ABANDON_TEXT, :abandon)
    132.     else
    133.       add_command(ACCEPT_TEXT, :accept)
    134.       add_command(DECLINE_TEXT, :decline)
    135.     end
    136.   end
    137.   def close_window
    138.     @closed = true
    139.     deactivate
    140.     self
    141.   end
    142. end
    143. class Scene_QuestBoard < Scene_Base
    144.   include QuestConfig
    145.   def start
    146.     super
    147.     create_left_window
    148.     create_right_window
    149.     @option_window = nil
    150.     select_first_quest
    151.   end
    152.   def select_first_quest
    153.     if@left_window.item_max > 0
    154.       @left_window.select(0)
    155.       update_right_window
    156.     else
    157.       @right_window.set_quest(nil)
    158.     end
    159.   end
    160.   def create_left_window
    161.     @left_window = Window_QuestLeft.new
    162.     @left_window.set_handler(:ok, method(:on_quest_ok))
    163.     @left_window.set_handler(:cancel, method(:return_scene))
    164.     @left_window.set_handler(:up, method(:on_selection_change))
    165.     @left_window.set_handler(:down, method(:on_selection_change))
    166.   end
    167.   def create_right_window
    168.     left_width = (Graphics.width * LEFT_WINDOW_WIDTH_RATIO).to_i
    169.     width = Graphics.width - left_width
    170.     height = (Graphics.height * RIGHT_WINDOW_HEIGHT_RATIO).to_i
    171.     @right_window = Window_QuestRight.new
    172.   end
    173.   def on_selection_change
    174.     update_right_window
    175.     close_option_window if@option_window
    176.   end
    177.   def update_right_window
    178.     quest = @left_window.quest
    179.     @right_window.set_quest(quest)if quest
    180.   end
    181.   def on_quest_ok
    182.     close_option_window if@option_window
    183.     @quest = @left_window.quest
    184.     returnunless@quest
    185.     returnunless$game_party.quest(@quest.id)
    186.     create_option_window
    187.   end
    188.   def update
    189.     super
    190.     returnif@left_window.disposed?
    191.     if !@option_window && @left_window.active
    192.       @right_window.set_quest(@left_window.quest)
    193.       update_right_window
    194.     end
    195.     if@option_window && @option_window.closed
    196.       @option_window.dispose
    197.       @option_window = nil
    198.       @left_window.activateif@left_window && !@left_window.disposed?
    199.     end
    200.   end
    201.   def create_option_window
    202.     returnunless@quest && $game_party.quest(@quest.id)
    203.     @option_window = Window_QuestOption.new(@quest)
    204.     if@quest.accepted
    205.       @option_window.set_handler(:submit, method(:submit_quest))
    206.       @option_window.set_handler(:abandon, method(:abandon_quest))
    207.     else
    208.       @option_window.set_handler(:accept, method(:accept_quest))
    209.       @option_window.set_handler(:decline, method(:close_option_window))
    210.     end
    211.     @option_window.set_handler(:cancel, method(:close_option_window))
    212.     @left_window.deactivate
    213.   end
    214.   def accept_quest
    215.     $game_party.accept_quest(@quest.id)
    216.     Sound.play_ok
    217.     @left_window.refresh
    218.     update_right_window
    219.     @option_window.close_windowif@option_window
    220.   end
    221.   def submit_quest
    222.     switch_id = QUEST_SWITCH_MAP[@quest.id]
    223.     if switch_id
    224.       $game_switches[switch_id] = true
    225.       $game_party.finish_quest(@quest.id)
    226.       Sound.play_ok
    227.       @left_window.refresh
    228.       if@left_window.item_max > 0
    229.         @left_window.select(0)
    230.         quest = @left_window.quest
    231.         @right_window.set_quest(quest)
    232.       else
    233.         @right_window.set_quest(nil)
    234.       end
    235.     else
    236.       Sound.play_buzzer
    237.       show_error_message("该任务尚未配置完成开关!")
    238.     end
    239.     @option_window.close_windowif@option_window
    240.     update_right_window
    241.   end
    242.   def abandon_quest
    243.     $game_party.abandon_quest(@quest.id)
    244.     Sound.play_cancel
    245.     @left_window.refresh
    246.     if@left_window.item_max > 0
    247.       @left_window.select(0)
    248.       quest = @left_window.quest
    249.       @right_window.set_quest(quest)
    250.     else
    251.       @right_window.set_quest(nil)
    252.     end
    253.     @option_window.close_windowif@option_window
    254.     update_right_window
    255.   end
    256.   def show_error_message(text)
    257.     $game_message.add(text)
    258.     SceneManager.call(Scene_Message)
    259.   end
    260.   def safe_close_option_window
    261.     returnunless@option_window
    262.     @option_window.close_window
    263.     @option_window.dispose
    264.     @option_window = nil
    265.     @left_window.activateif@left_window && !@left_window.disposed?
    266.   end
    267.   def close_option_window
    268.     @option_window.close_windowif@option_window
    269.     update_right_window
    270.   end
    271.   def terminate
    272.     super
    273.     close_option_window
    274.     @option_window.disposeif@option_window
    275.   end
    276. end
    277. def open_quest_board
    278.   SceneManager.call(Scene_QuestBoard)
    279. end
    复制代码

                本帖来自P1论坛作者Adelina,因Project1站服务器在国外有时候访问缓慢不方便作者交流学习,经联系P1站长fux2同意署名转载一起分享游戏制作经验,共同为国内独立游戏作者共同创造良好交流环境,原文地址:https://rpg.blue/forum.php?mod=viewthread&tid=497831  若有侵权,发帖作者可联系底部站长QQ在线咨询功能删除,谢谢。

    本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有账号?立即注册

    x
    天天去同能,天天有童年!
    回复 送礼论坛版权

    使用道具 举报

    文明发言,和谐互动
    文明发言,和谐互动
    高级模式
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    关闭

    幸运抽奖

    社区每日抽奖来袭,快来试试你是欧皇还是非酋~

    立即查看

    聊天机器人
    Loading...

    QQ|Archiver|手机版|小黑屋|同能RPG制作大师 ( 沪ICP备12027754号-3 )

    GMT+8, 2025-8-2 08:48 , Processed in 0.143899 second(s), 55 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2020, Tencent Cloud.

    快速回复 返回顶部 返回列表