设为首页收藏本站同能贴吧 切换语言 繁体中文
开启辅助访问 切换到窄版
扫描二维码关注官方公众号
返回列表
+ 发新帖
查看: 54|回复: 0

[转载发布] Local Achievements script VX + Ace

[复制链接]
累计送礼:
0 个
累计收礼:
1 个
  • TA的每日心情
    开心
    2026-7-12 04:10
  • 签到天数: 209 天

    连续签到: 2 天

    [LV.7]常住居民III

    5778

    主题

    864

    回帖

    3万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    VIP
    7
    卡币
    25563
    OK点
    16
    推广点
    0
    同能卷
    50
    积分
    32235

    灌水之王

    发表于 前天 11:00 | 显示全部楼层 |阅读模式
    Heya. I was dissapointed with absence of a propper Achievement handler besides Steam API for VX, so I made my own that utilizes local files and events!

    Keeps track of locked and unlocked achievements on title screen via extra window command, an option to reset collection progress as well.

    Progress saves between save files, and after a shutdown.

                    Ruby:       
    1. # Achievements Script for RPGMaker VX by @le_kastle (pls credit)
    2. module Achievements
    3.   # Create achievements.txt in Data folder, and achivement images in Graphics/Pictures
    4.   FILE_PATH = "Data/achievements.txt"
    5.   ACHIEVEMENTS = {
    6.     :achievement1 => { :name => "1", :description => "desc1", :achieved => false, :image => "achievement1", :common_event_id => 6 },
    7.     :achievement2 => { :name => "2", :description => "desc2", :achieved => false, :image => "achievement2", :common_event_id => 7 },
    8.     :achievement3 => { :name => "3", :description => "desc3", :achieved => false, :image => "achievement3", :common_event_id => 8 }
    9.   } # Common events used for displaying achievement acquirement in game (if you want it)
    10.    
    11.   # Loads achievements from a file
    12.   def self.load_achievements
    13.     return unless File.exist?(FILE_PATH)
    14.     File.readlines(FILE_PATH).each do |line|
    15.       key, value = line.strip.split(" = ")
    16.       key = key.downcase.to_sym
    17.       if ACHIEVEMENTS.has_key?(key)
    18.         ACHIEVEMENTS[key][:achieved] = (value == "true")
    19.       else
    20.         puts "Warning: Achievement key '#{key}' not found in ACHIEVEMENTS hash."
    21.       end
    22.     end
    23.   end
    24.   # Save the achievements to the file
    25.   def self.save_achievements
    26.     File.open(FILE_PATH, "w") do |file|
    27.       ACHIEVEMENTS.each do |key, data|
    28.         file.puts "#{key} = #{data[:achieved]}"
    29.       end
    30.     end
    31.   end
    32.   # Unlock an achievement
    33.   def self.unlock(achievement)
    34.     return if ACHIEVEMENTS[achievement][:achieved]
    35.     ACHIEVEMENTS[achievement][:achieved] = true
    36.     save_achievements
    37.   
    38.   end
    39.   # Check if an achievement is unlocked
    40.   def self.unlocked?(achievement)
    41.     ACHIEVEMENTS[achievement][:achieved]
    42.   end
    43.   # Reset all achievements
    44.   def self.reset_achievements
    45.     ACHIEVEMENTS.each do |key, data|
    46.       data[:achieved] = false
    47.     end
    48.     save_achievements
    49.   end
    50. end
    51. # Interpreter integration for unlocking achievements
    52. class Game_Interpreter
    53.   def unlock_achievement(achievement)
    54.     Achievements.unlock(achievement)
    55.   end
    56. end
    57. class Scene_Title < Scene_Base
    58.   alias achievements_update update unless method_defined?(:achievements_update)
    59.   def update
    60.     achievements_update
    61.     handle_achievements_input if @command_window && @command_window.active
    62.   end
    63.   private
    64.   # Handle Achievements command
    65.   def command_achievements
    66.     Sound.play_decision
    67.     $scene = Scene_Achievements.new
    68.   end
    69.   def handle_achievements_input
    70.     return unless Input.trigger?(Input::C)
    71.    
    72.     case @command_window.index
    73.     when 3 # Achievements
    74.       command_achievements
    75.     when 4 # Reset
    76.       command_reset_achievements
    77.     end
    78.   end
    79.   # Handle Reset Achievements command
    80.   def command_reset_achievements
    81.     Sound.play_decision
    82.     if confirm_reset_achievements
    83.       Achievements.reset_achievements
    84.       Sound.play_recovery
    85.     else
    86.       Sound.play_buzzer
    87.     end
    88.   end
    89.   # Confirmation to reset
    90.   def confirm_reset_achievements
    91.     Graphics.update
    92.     Input.update
    93.     # Wait for input for confirmation
    94.     loop do
    95.       Graphics.update
    96.       Input.update
    97.       if Input.trigger?(Input::C)  # Confirm
    98.         return true
    99.       elsif Input.trigger?(Input::B)  # Cancel with ESC
    100.         return false
    101.       end
    102.     end
    103.   end
    104. end
    105. class Scene_Achievements < Scene_Base
    106.   def start
    107.     super
    108.     create_achievement_window
    109.   end
    110.   def create_achievement_window
    111.     @achievement_window = Window_Achievements.new(0, 0, Graphics.width, Graphics.height)
    112.   end
    113.   def update
    114.     super
    115.     @achievement_window.update
    116.     if Input.trigger?(Input::B)
    117.       Sound.play_cancel
    118.       return_to_title
    119.     end
    120.   end
    121.   # Properly dispose of the window and return to the title
    122.   def return_to_title
    123.     @achievement_window.dispose
    124.     $scene = Scene_Title.new
    125.   end
    126. end
    127. # Achievement window
    128. class Window_Achievements < Window_Base
    129.   def initialize(x, y, width, height)
    130.     super(x, y, width, height)
    131.     @page = 0
    132.     refresh
    133.   end
    134.   def refresh
    135.     self.contents.clear
    136.     draw_page_indicator
    137.     achievements = Achievements::ACHIEVEMENTS.to_a[@page * 3, 3]  # Adjust number of achievements per page
    138.     achievements.each_with_index do |(key, data), index|
    139.       draw_achievement(data, index)
    140.     end
    141.   end
    142.   def draw_page_indicator
    143.     total_pages = (Achievements::ACHIEVEMENTS.size / 3.0).ceil
    144.     text = "Page #{@page + 1}/#{total_pages}"
    145.     self.contents.draw_text(0, self.contents.height - 24, self.contents.width, 24, text, 1)
    146.   end
    147.   def draw_achievement(data, index)
    148.     # Calculate manual position for each achievement entry
    149.     x = 12
    150.     y = index * WLH * 4  # Increase the spacing to reduce overlap
    151.    
    152.     # Draw achievement name and description
    153.     self.contents.font.color = normal_color
    154.     self.contents.draw_text(x + 110, y, contents.width - 110, WLH, data[:name])
    155.     if data[:achieved]
    156.       self.contents.draw_text(x + 110, y + WLH, contents.width - 110, WLH, data[:description])
    157.     end
    158.     # Draw achievement icon (if available)
    159.     draw_icon(data[:image], x, y)
    160.   end
    161.   def draw_icon(image_name, x, y)
    162.     bitmap = Cache.picture(image_name)
    163.     rect = Rect.new(0, 0, 100, 100)
    164.     self.contents.blt(x, y, bitmap, rect)
    165.   end
    166.   def update
    167.     super
    168.     if Input.trigger?(Input::RIGHT)
    169.       next_page
    170.     elsif Input.trigger?(Input::LEFT)
    171.       prev_page
    172.     end
    173.   end
    174.   def next_page
    175.     @page = (@page + 1) % total_pages
    176.     refresh
    177.   end
    178.   def prev_page
    179.     @page = (@page - 1) % total_pages
    180.     refresh
    181.   end
    182.   def total_pages
    183.     (Achievements::ACHIEVEMENTS.size / 3.0).ceil  # Adjust the page count
    184.   end
    185. end
    186. # Load achievements at game start
    187. Achievements.load_achievements
    复制代码



    How to utilize:

    1. Put anywhere in your custom scripts area in the editor (Above main)
    2. Use this in event tab:
                    Code:       
    1. if Achievements.unlocked?(:achievement1)
    2.   # Code to execute if the achievement is already unlocked (for example activate switch)
    3. else
    4.   # Unlock if not unlocked already
    5.   unlock_achievement(:achievement1)
    6. end
    复制代码



    Watch screenshots to see how it works


    本贴来自国际rpgmaker官方论坛作者:Kastle处,因国际论坛即将永久关站,为了存档多年珍贵资料,署名转载到本论坛存档,由于官方帖子为英文原帖,需要中文翻译请点击论坛顶部切换语言为中文就可以将帖子翻译成中文浏览,方便大家随时查看,原文地址:https://forums.rpgmakerweb.com/threads/local-achievements-script-vx-ace.175371/
    天天去同能,天天有童年!
    回复 送礼论坛版权

    使用道具 举报

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

    本版积分规则

    简体中文
    繁體中文
    English(英语)
    日本語(日语)
    Deutsch(德语)
    Русский язык(俄语)
    بالعربية(阿拉伯语)
    Türkçe(土耳其语)
    Português(葡萄牙语)
    ภาษาไทย(泰国语)
    한어(朝鲜语/韩语)
    Français(法语)
    关闭

    幸运抽奖

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

    立即查看

    聊天机器人
    Loading...

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

    GMT+8, 2026-7-26 03:54 , Processed in 0.138698 second(s), 51 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2020, Tencent Cloud.

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