- 累计送礼:
- 0 个
- 累计收礼:
- 0 个
TA的每日心情 | 开心 2025-7-8 01:43 |
---|
签到天数: 157 天 连续签到: 2 天 [LV.7]常住居民III

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


|
站内找到的任务系统似乎都是用来查看任务的,没有交互选项……
于是作为ruby萌新的自己只好结合ds的帮助写了一点,分享出来希望可以帮到有类似想法的人。 虽然但是都25年了真的还有人在玩VA吗
这个任务系统有 接受任务和提交、放弃的选项,比较类似于冒险者公会的悬赏面板。提交任务后可以根据需求打开开关,方便其他事件。比如想要在提交任务后,根据任务的完成情况来发放奖励的话,就可以用开关继续开启一个公共事件。
每用一次添加任务描述都会换行,同时文本内容也 支持使用转义符,需要使用双反斜杠。效果和VA文本框里面的一样,具体可以看事件里的脚本指令。其他指令在脚本开头的使用方法里。
脚本里的常量配置部分是可以自行更改的,其中任务与开关映射表也需要自己编辑。修改时请务必注意格式。
新人第一次发帖,可能有bug或者其他各种问题,欢迎积极反馈,只要我看到了消息并且有空的话就会改。如果能够帮到你,希望可以评论一下~
游戏内效果如下:
事件范例:
脚本代码:
RUBY 代码 - #===============================================================================
- #
- # ■ 公会任务系统 - By Adelina
- #
- #===============================================================================
- #===============================================================================
- # ● 事件指令使用方法
- #===============================================================================
- # 1. 打开公会面板: open_quest_board
- # 2. 创建任务: $game_party.create_quest(任务id, "任务标题")
- # 3. 添加任务描述: $game_party.add_quest_text(任务id, "描述文本")
- # 4. 设置任务可见: $game_party.set_quest_visible(任务id, true/false)
- # 5. 接取任务: $game_party.accept_quest(任务id) # 可在事件中使用
- # 6. 完成任务: $game_party.finish_quest(任务id) # 可在事件中使用
- #===============================================================================
- # ● 常量配置
- #===============================================================================
- module QuestConfig
- # 窗口尺寸比例
- LEFT_WINDOW_WIDTH_RATIO = 0.4 # 左侧窗口宽度比例
- RIGHT_WINDOW_HEIGHT_RATIO = 0.827 # 右侧窗口高度比例
- # 状态字体与文本设置
- STATUS_FONT_SIZE = 18 # 状态文字大小
- AVAILABLE_STATUS = "可接取 - 按Enter接取任务"# 可接取状态提示
- ACCEPTED_STATUS = "进行中 - 按Enter管理任务"# 进行中状态提示
- ACCEPTED_COLOR = Color.new(255, 255, 0) # 进行中状态文本颜色
- # 无任务时显示的文本内容
- NO_QUEST_TEXT = "暂无任务"
- # 可接受任务选项文本
- ACCEPT_TEXT = "接受任务"
- DECLINE_TEXT = "取消"
- # 进行中任务选项文本
- SUBMIT_TEXT = "提交任务" # 打开对应开关后,从系统中删除任务
- ABANDON_TEXT = "放弃任务" # 直接从系统中删除任务
- end
- # 任务ID与开关映射表
- # 提交任务后会打开对应的开关,可以接各种事件
- QUEST_SWITCH_MAP = {
- # 格式:任务ID => 开关ID
- 1 => 10, # 任务1完成时打开开关10
- 2 => 11, # 同理,任务2完成时打开开关11
- 3 => 12
- }
- #===============================================================================
- #===============================================================================
- #
- # ★ 请尽量不要修改以下内容
- #
- #===============================================================================
- #===============================================================================
- class Quest
- attr_reader :id
- attr_reader :name
- attr_accessor :accepted
- attr_accessor :visible
- attr_reader :content
- def initialize(id, name)
- @id = id
- @name = name
- @accepted = false
- @visible = true # 默认可见
- @content = []
- end
- def add_text(text)
- @content 0
- end
- end
- class Window_QuestRight < Window_Base
- include QuestConfig
- def initialize
- left_width = (Graphics.width * LEFT_WINDOW_WIDTH_RATIO).to_i
- width = Graphics.width - left_width
- height = (Graphics.height * RIGHT_WINDOW_HEIGHT_RATIO).to_i
- super(left_width, 0, width, height)
- @quest = nil
- end
- def set_quest(quest)
- @quest = quest
- refresh
- end
- def refresh
- returnif disposed? || contents.disposed?
- contents.clear
- if@quest.nil?
- contents.font.color = system_color
- rect = Rect.new(0, 0, contents_width, contents_height)
- draw_text(rect, NO_QUEST_TEXT, 1)
- contents.font.color = normal_color
- return
- end
- original_size = contents.font.size
- draw_text(0, 0, contents_width, line_height, @quest.name, 1)
- y = line_height + 10
- @quest.content.eachdo |text|
- draw_text_ex(0, y, text)
- y += line_height * 1.2
- end
- contents.font.size = STATUS_FONT_SIZE
- status_text = @quest.accepted ? ACCEPTED_STATUS : AVAILABLE_STATUS
- status_color = @quest.accepted ? ACCEPTED_COLOR : normal_color
- contents.font.color = status_color
- draw_text(0, contents_height - line_height, contents_width,
- line_height, status_text, 1)
- contents.font.color = normal_color
- contents.font.size = original_size
- end
- end
- class Window_QuestOption < Window_Command
- include QuestConfig
- attr_reader :closed
- def initialize(quest)
- @quest = quest
- @closed = false
- super(0, 0)
- update_placement
- self.openness = 255
- activate
- end
- def window_width
- return Graphics.width - (Graphics.width * LEFT_WINDOW_WIDTH_RATIO).to_i
- end
- def update_placement
- left_width = (Graphics.width * LEFT_WINDOW_WIDTH_RATIO).to_i
- self.x = left_width
- self.y = (Graphics.height * RIGHT_WINDOW_HEIGHT_RATIO).to_i
- self.width = Graphics.width - left_width
- end
- def make_command_list
- if@quest.accepted
- add_command(SUBMIT_TEXT, :submit)
- add_command(ABANDON_TEXT, :abandon)
- else
- add_command(ACCEPT_TEXT, :accept)
- add_command(DECLINE_TEXT, :decline)
- end
- end
- def close_window
- @closed = true
- deactivate
- self
- end
- end
- class Scene_QuestBoard < Scene_Base
- include QuestConfig
- def start
- super
- create_left_window
- create_right_window
- @option_window = nil
- select_first_quest
- end
- def select_first_quest
- if@left_window.item_max > 0
- @left_window.select(0)
- update_right_window
- else
- @right_window.set_quest(nil)
- end
- end
- def create_left_window
- @left_window = Window_QuestLeft.new
- @left_window.set_handler(:ok, method(:on_quest_ok))
- @left_window.set_handler(:cancel, method(:return_scene))
- @left_window.set_handler(:up, method(:on_selection_change))
- @left_window.set_handler(:down, method(:on_selection_change))
- end
- def create_right_window
- left_width = (Graphics.width * LEFT_WINDOW_WIDTH_RATIO).to_i
- width = Graphics.width - left_width
- height = (Graphics.height * RIGHT_WINDOW_HEIGHT_RATIO).to_i
- @right_window = Window_QuestRight.new
- end
- def on_selection_change
- update_right_window
- close_option_window if@option_window
- end
- def update_right_window
- quest = @left_window.quest
- @right_window.set_quest(quest)if quest
- end
- def on_quest_ok
- close_option_window if@option_window
- @quest = @left_window.quest
- returnunless@quest
- returnunless$game_party.quest(@quest.id)
- create_option_window
- end
- def update
- super
- returnif@left_window.disposed?
- if !@option_window && @left_window.active
- @right_window.set_quest(@left_window.quest)
- update_right_window
- end
- if@option_window && @option_window.closed
- @option_window.dispose
- @option_window = nil
- @left_window.activateif@left_window && !@left_window.disposed?
- end
- end
- def create_option_window
- returnunless@quest && $game_party.quest(@quest.id)
- @option_window = Window_QuestOption.new(@quest)
- if@quest.accepted
- @option_window.set_handler(:submit, method(:submit_quest))
- @option_window.set_handler(:abandon, method(:abandon_quest))
- else
- @option_window.set_handler(:accept, method(:accept_quest))
- @option_window.set_handler(:decline, method(:close_option_window))
- end
- @option_window.set_handler(:cancel, method(:close_option_window))
- @left_window.deactivate
- end
- def accept_quest
- $game_party.accept_quest(@quest.id)
- Sound.play_ok
- @left_window.refresh
- update_right_window
- @option_window.close_windowif@option_window
- end
- def submit_quest
- switch_id = QUEST_SWITCH_MAP[@quest.id]
- if switch_id
- $game_switches[switch_id] = true
- $game_party.finish_quest(@quest.id)
- Sound.play_ok
- @left_window.refresh
- if@left_window.item_max > 0
- @left_window.select(0)
- quest = @left_window.quest
- @right_window.set_quest(quest)
- else
- @right_window.set_quest(nil)
- end
- else
- Sound.play_buzzer
- show_error_message("该任务尚未配置完成开关!")
- end
- @option_window.close_windowif@option_window
- update_right_window
- end
- def abandon_quest
- $game_party.abandon_quest(@quest.id)
- Sound.play_cancel
- @left_window.refresh
- if@left_window.item_max > 0
- @left_window.select(0)
- quest = @left_window.quest
- @right_window.set_quest(quest)
- else
- @right_window.set_quest(nil)
- end
- @option_window.close_windowif@option_window
- update_right_window
- end
- def show_error_message(text)
- $game_message.add(text)
- SceneManager.call(Scene_Message)
- end
- def safe_close_option_window
- returnunless@option_window
- @option_window.close_window
- @option_window.dispose
- @option_window = nil
- @left_window.activateif@left_window && !@left_window.disposed?
- end
- def close_option_window
- @option_window.close_windowif@option_window
- update_right_window
- end
- def terminate
- super
- close_option_window
- @option_window.disposeif@option_window
- end
- end
- def open_quest_board
- SceneManager.call(Scene_QuestBoard)
- end
复制代码
本帖来自P1论坛作者Adelina,因Project1站服务器在国外有时候访问缓慢不方便作者交流学习,经联系P1站长fux2同意署名转载一起分享游戏制作经验,共同为国内独立游戏作者共同创造良好交流环境,原文地址: https://rpg.blue/forum.php?mod=viewthread&tid=497831 若有侵权,发帖作者可联系底部站长QQ在线咨询功能删除,谢谢。 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
|