设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 247|回复: 13
打印 上一主题 下一主题

[有事请教] 關於成就腳本一些問題

[复制链接]

Lv3.寻梦者

梦石
0
星屑
1018
在线时间
139 小时
注册时间
2023-7-29
帖子
21

极短25参与

跳转到指定楼层
1
发表于 2025-5-22 13:31:33 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
500星屑
本帖最后由 BTF060 于 2025-5-22 13:48 编辑

是關於tomoaky老師成就腳本的問題
想讓未獲得的成就顯然???的提示


類似養成遊戲黑之白的成就系統


但是我自己的沒有這種效果囧
然後獲得過的成就也沒辨法永久存在……
請問怎麼改?

  1. #==============================================================================
  2. # ★ RGSS3_成就系统 Ver1.01
  3. #==============================================================================
  4. =begin

  5. 作者:tomoaky
  6. 素材来自:(http://hikimoki.sakura.ne.jp/)

  7. 你可以用事件中“脚本”命令获取成就
  8.   例如)gain_medal(0)   # 获得第零个成就
  9.   设置对应的编号再设置主要内容


  10. 2012.01.25  Ver1.01
  11.   修正改变场景时重置成就
  12.   
  13. 2012.01.16  Ver1.0
  14.   公開

  15. =end

  16. #==============================================================================
  17. # □ 設定項目
  18. #==============================================================================
  19. module TMMEDAL
  20.   COMMAND_MEDAL = "成就"     # 菜单命令名称
  21.   
  22.   # メダルが1枚もない状態でメダルコマンドを隠すかどうか(true で隠す)
  23.   HIDE_COMMAND = false
  24.   
  25.     # 未取得のメダルを隠すかどうか(true で隠す)
  26.   HIDE_UNDISCOVERED = false

  27.   # メダル情報の設定
  28.   # [メダル名, アイコンID, 説明文, ヒント, 並び順ID, カテゴリID]
  29.   # 説明文やヒントは \n を挿入することで改行することができます
  30.   SE_GAIN_MEDAL = RPG::SE.new("item1", 90, 55)
  31.   
  32.   # メダル名とアイコンIDと説明文の設定
  33.   MEDAL_DATA = {}
  34.   MEDAL_DATA[0] = ["噩夢的開端?", 187, "遊戲正式開始。"]
  35.   MEDAL_DATA[1] = ["不讀嗎∑( ̄□ ̄;)", 222, "選擇不讀遊戲說明。@註:為什麼不讀,我明明很貼心嗚嗚嗚( ´•̥ו̥` )"]
  36.   MEDAL_DATA[2] = ["馬桶真的藏不了人!", 187, "多次調查馬桶會有驚喜哦。@註:咋這麼執著馬桶呢?"]

  37. end

  38. #==============================================================================
  39. # ■ Game_Party
  40. #==============================================================================
  41. class Game_Party
  42.   #--------------------------------------------------------------------------
  43.   # ● 公開インスタンス変数
  44.   #--------------------------------------------------------------------------
  45.   attr_reader   :medals                   # 獲得済みメダル
  46.   attr_reader   :new_medals               # 新規獲得メダル
  47.   attr_accessor :medal_info_count         # メダル情報表示カウント
  48.   attr_accessor :medal_info_opacity       # メダル情報表示不透明度
  49.   #--------------------------------------------------------------------------
  50.   # ● オブジェクト初期化
  51.   #--------------------------------------------------------------------------
  52.   alias tmmedal_game_party_initialize initialize
  53.   def initialize
  54.     tmmedal_game_party_initialize
  55.     @medals = []
  56.     @new_medals = []
  57.     @medal_info_count = 0
  58.     @medal_info_opacity = 0
  59.   end
  60.   #--------------------------------------------------------------------------
  61.   # ○ メダルの獲得
  62.   #--------------------------------------------------------------------------
  63.   def gain_medal(medal_id)
  64.     return if @medals.any? {|medal| medal[0] == medal_id }
  65.     t = Time.now.strftime(" (%Y/%m/%d %H:%M)")
  66.     @medals.push([medal_id, t])
  67.     @new_medals.push([medal_id, t])
  68.   end
  69.   #--------------------------------------------------------------------------
  70.   # ○ 獲得メダル情報の消去
  71.   #--------------------------------------------------------------------------
  72.   def delete_new_medal
  73.     @new_medals.shift
  74.   end
  75. end

  76. #==============================================================================
  77. # ■ Game_Interpreter
  78. #==============================================================================
  79. class Game_Interpreter
  80.   #--------------------------------------------------------------------------
  81.   # ○ メダルの獲得
  82.   #--------------------------------------------------------------------------
  83.   def gain_medal(medal_id)
  84.     $game_party.gain_medal(medal_id)
  85.   end
  86. end

  87. #==============================================================================
  88. # ■ Window_MenuCommand
  89. #==============================================================================
  90. class Window_MenuCommand
  91.   #--------------------------------------------------------------------------
  92.   # ● 独自コマンドの追加用
  93.   #--------------------------------------------------------------------------
  94.   alias tmmedal_window_menucommand_add_original_commands add_original_commands
  95.   def add_original_commands
  96.     tmmedal_window_menucommand_add_original_commands
  97.     unless TMMEDAL::HIDE_COMMAND && !medal_enabled
  98.       add_command(TMMEDAL::COMMAND_MEDAL, :medal, medal_enabled)
  99.     end
  100.   end
  101.   #--------------------------------------------------------------------------
  102.   # ○ メダルの有効状態を取得
  103.   #--------------------------------------------------------------------------
  104.   def medal_enabled
  105.     !$game_party.medals.empty?
  106.   end
  107. end

  108. #==============================================================================
  109. # □ Window_MedalInfo
  110. #==============================================================================
  111. class Window_MedalInfo < Window_Base
  112.   #--------------------------------------------------------------------------
  113.   # ● オブジェクト初期化
  114.   #--------------------------------------------------------------------------
  115.   def initialize
  116.     super(Graphics.width - window_width, 0, window_width, fitting_height(1))
  117.     self.opacity = 0
  118.     self.contents_opacity = $game_party.medal_info_opacity
  119.     refresh
  120.   end
  121.   #--------------------------------------------------------------------------
  122.   # ● ウィンドウ幅の取得
  123.   #--------------------------------------------------------------------------
  124.   def window_width
  125.     return 240
  126.   end
  127.   #--------------------------------------------------------------------------
  128.   # ● フレーム更新
  129.   #--------------------------------------------------------------------------
  130.   def update
  131.     super
  132.     if $game_party.medal_info_count > 0
  133.       self.contents_opacity += 16
  134.       $game_party.medal_info_count -= 1
  135.       $game_party.delete_new_medal if $game_party.medal_info_count == 0
  136.     else
  137.       self.contents_opacity -= 16
  138.       if self.contents_opacity == 0
  139.         open unless $game_party.new_medals.empty?
  140.       end
  141.     end
  142.     $game_party.medal_info_opacity = self.contents_opacity
  143.   end
  144.   #--------------------------------------------------------------------------
  145.   # ● ウィンドウを開く
  146.   #--------------------------------------------------------------------------
  147.   def open
  148.     refresh
  149.     TMMEDAL::SE_GAIN_MEDAL.play
  150.     $game_party.medal_info_count = 150
  151.     self.contents_opacity = 0
  152.     self
  153.   end
  154.   #--------------------------------------------------------------------------
  155.   # ○ リフレッシュ
  156.   #--------------------------------------------------------------------------
  157.   def refresh
  158.     contents.clear
  159.     unless $game_party.new_medals.empty?
  160.       draw_background(contents.rect)
  161.       medal = TMMEDAL::MEDAL_DATA[$game_party.new_medals[0][0]]
  162.       rect = contents.rect.clone
  163.       draw_icon(medal[1], rect.x, rect.y)
  164.       rect.x += 24
  165.       rect.width -= 24
  166.       draw_text(rect, medal[0])
  167.     end
  168.   end
  169.   #--------------------------------------------------------------------------
  170.   # ○ 背景の描画
  171.   #--------------------------------------------------------------------------
  172.   def draw_background(rect)
  173.     temp_rect = rect.clone
  174.     temp_rect.width /= 2
  175.     contents.gradient_fill_rect(temp_rect, back_color2, back_color1)
  176.     temp_rect.x = temp_rect.width
  177.     contents.gradient_fill_rect(temp_rect, back_color1, back_color2)
  178.   end
  179.   #--------------------------------------------------------------------------
  180.   # ○ 背景色 1 の取得
  181.   #--------------------------------------------------------------------------
  182.   def back_color1
  183.     Color.new(0, 0, 0, 192)
  184.   end
  185.   #--------------------------------------------------------------------------
  186.   # ○ 背景色 2 の取得
  187.   #--------------------------------------------------------------------------
  188.   def back_color2
  189.     Color.new(0, 0, 0, 0)
  190.   end
  191. end

  192. #==============================================================================
  193. # □ Window_Medal
  194. #==============================================================================
  195. class Window_Medal < Window_Selectable
  196.   #--------------------------------------------------------------------------
  197.   # ● オブジェクト初期化
  198.   #--------------------------------------------------------------------------
  199.   def initialize(x, y, width, height)
  200.     super
  201.     refresh
  202.     select(0)
  203.     activate
  204.   end
  205.   #--------------------------------------------------------------------------
  206.   # ● 桁数の取得
  207.   #--------------------------------------------------------------------------
  208.   def col_max
  209.     return 1
  210.   end
  211.   #--------------------------------------------------------------------------
  212.   # ● 項目数の取得
  213.   #--------------------------------------------------------------------------
  214.   def item_max
  215.     @data ? @data.size : 1
  216.   end
  217.   #--------------------------------------------------------------------------
  218.   # ● アイテムの取得
  219.   #--------------------------------------------------------------------------
  220.   def item
  221.     @data && index >= 0 ? @data[index] : nil
  222.   end
  223.   #--------------------------------------------------------------------------
  224.   # ● アイテムリストの作成
  225.   #--------------------------------------------------------------------------
  226.   def make_item_list
  227.     @data = $game_party.medals
  228.   end
  229.   #--------------------------------------------------------------------------
  230.   # ● 項目の描画
  231.   #--------------------------------------------------------------------------
  232.   def draw_item(index)
  233.     item = @data[index]
  234.     medal = TMMEDAL::MEDAL_DATA[item[0]]
  235.     rect = item_rect(index)
  236.     draw_icon(medal[1], rect.x, rect.y)
  237.     rect.x += 24
  238.     rect.width -= 216
  239.     draw_text(rect, medal[0])
  240.     rect.x = contents.width - 192
  241.     rect.width = 192
  242.     draw_text(rect, item[1], 2)
  243.   end
  244.   #--------------------------------------------------------------------------
  245.   # ● ヘルプテキスト更新
  246.   #--------------------------------------------------------------------------
  247.   def update_help
  248.     if item
  249.       medal = TMMEDAL::MEDAL_DATA[item[0]]
  250.       text = medal[2]
  251.       @help_window.set_text(text)
  252.     end
  253.   end
  254.   #--------------------------------------------------------------------------
  255.   # ● リフレッシュ
  256.   #--------------------------------------------------------------------------
  257.   def refresh
  258.     make_item_list
  259.     create_contents
  260.     draw_all_items
  261.   end
  262. end

  263. #==============================================================================
  264. # ■ Scene_Map
  265. #==============================================================================
  266. class Scene_Map
  267.   #--------------------------------------------------------------------------
  268.   # ● 全ウィンドウの作成
  269.   #--------------------------------------------------------------------------
  270.   alias tmmedal_scene_map_create_all_windows create_all_windows
  271.   def create_all_windows
  272.     tmmedal_scene_map_create_all_windows
  273.     create_medal_window
  274.   end
  275.   #--------------------------------------------------------------------------
  276.   # ○ メダルウィンドウの作成
  277.   #--------------------------------------------------------------------------
  278.   def create_medal_window
  279.     @medal_window = Window_MedalInfo.new
  280.   end
  281. end

  282. #==============================================================================
  283. # ■ Scene_Menu
  284. #==============================================================================
  285. class Scene_Menu
  286.   #--------------------------------------------------------------------------
  287.   # ● コマンドウィンドウの作成
  288.   #--------------------------------------------------------------------------
  289.   alias tmmedal_scene_menu_create_command_window create_command_window
  290.   def create_command_window
  291.     tmmedal_scene_menu_create_command_window
  292.     @command_window.set_handler(:medal, method(:command_medal))
  293.   end
  294.   #--------------------------------------------------------------------------
  295.   # ○ コマンド[メダル]
  296.   #--------------------------------------------------------------------------
  297.   def command_medal
  298.     SceneManager.call(Scene_Medal)
  299.   end
  300. end

  301. #==============================================================================
  302. # □ Scene_Medal
  303. #==============================================================================
  304. class Scene_Medal < Scene_MenuBase
  305.   #--------------------------------------------------------------------------
  306.   # ● 開始処理
  307.   #--------------------------------------------------------------------------
  308.   def start
  309.     super
  310.     create_help_window
  311.     create_item_window
  312.   end
  313.   #--------------------------------------------------------------------------
  314.   # ○ アイテムウィンドウの作成
  315.   #--------------------------------------------------------------------------
  316.   def create_item_window
  317.     wy = @help_window.height
  318.     wh = Graphics.height - wy
  319.     @item_window = Window_Medal.new(0, wy, Graphics.width, wh)
  320.     @item_window.viewport = @viewport
  321.     @item_window.help_window = @help_window
  322.     @item_window.set_handler(:cancel, method(:return_scene))
  323.   end
  324. end
复制代码

最佳答案

查看完整内容

第一个问题这样改下: 第二个问题,你需要研究任意一个 全局变量 脚本 1. 将你每次解锁的成就存入一个数组中,比如 * 或者,你也可以直接在脚本里 gain_medal 方法里修改 #-------------------------------------------------------------------------- # ○ メダルの獲得 #-------------------------------------------------------------------------- def gain_medal(medal_id) return if @medals.any? {|medal ...

Lv6.析梦学徒

老鹰

梦石
40
星屑
35159
在线时间
6751 小时
注册时间
2012-5-26
帖子
3245

极短24评委极短23参与极短22参与极短21评委老司机慢点开短篇十吟唱者组别冠军开拓者剧作品鉴家

2
发表于 2025-5-22 13:31:34 | 只看该作者
本帖最后由 百里_飞柳 于 2025-5-26 20:04 编辑

第一个问题这样改下:
  1. class Window_Medal
  2.   #--------------------------------------------------------------------------
  3.   # ● アイテムリストの作成
  4.   #--------------------------------------------------------------------------
  5.   def make_item_list
  6.     # 调整:修改为显示全部成就
  7.     #@data = $game_party.medals
  8.     @data = TMMEDAL::MEDAL_DATA.keys
  9.   end
  10.   #--------------------------------------------------------------------------
  11.   # ● 項目の描画
  12.   #--------------------------------------------------------------------------
  13.   def draw_item(index)
  14.     # 调整:修改为显示全部成就,但未解锁的显示为???
  15.     #item = @data[index]
  16.     #medal = TMMEDAL::MEDAL_DATA[item[0]]
  17.     id = @data[index]
  18.     data = $game_party.medals.select { |v| v[0] == id }[0]
  19.     if data == nil
  20.       # 这里的第一个字符串是未解锁时显示的名称,第二个数字是图标ID,第三个无意义
  21.       medal = ["???", 0, ""]
  22.       item = [id, ""]
  23.     else
  24.       medal = TMMEDAL::MEDAL_DATA[id]
  25.       item = [id, data[1]]
  26.     end
  27.    
  28.     rect = item_rect(index)
  29.     draw_icon(medal[1], rect.x, rect.y)
  30.     rect.x += 24
  31.     rect.width -= 216
  32.     draw_text(rect, medal[0])
  33.     rect.x = contents.width - 192
  34.     rect.width = 192
  35.     draw_text(rect, item[1], 2)
  36.   end
  37.   #--------------------------------------------------------------------------
  38.   # ● ヘルプテキスト更新
  39.   #--------------------------------------------------------------------------
  40.   def update_help
  41.     if item
  42.       # 调整:未解锁成就显示特别的帮助文本
  43.       #medal = TMMEDAL::MEDAL_DATA[item[0]]
  44.       #text = medal[2]
  45.       data = $game_party.medals.select { |v| v[0] == item }[0]
  46.       if data == nil
  47.         # 这里设置未解锁成就的帮助文本
  48.         text = "这个成就还未解锁……"
  49.       else
  50.         text = TMMEDAL::MEDAL_DATA[item][2]
  51.       end
  52.       
  53.       @help_window.set_text(text)
  54.     end
  55.   end
  56. end
复制代码


第二个问题,你需要研究任意一个 全局变量 脚本
1. 将你每次解锁的成就存入一个数组中,比如
  1. # 先将游戏变量转为数组
  2. $game_variables[1] = [] if $game_variables[1] == 0
  3. # 存入你解锁的成就,比如这次是 0
  4. $game_variables[1].push(0)
  5. # 去重,防止多次存入
  6. $game_variables[1].uniq!
复制代码

* 或者,你也可以直接在脚本里 gain_medal 方法里修改
RUBY 代码复制
  1. #--------------------------------------------------------------------------
  2.   # ○ メダルの獲得
  3.   #--------------------------------------------------------------------------
  4.   def gain_medal(medal_id)
  5.     return if @medals.any? {|medal| medal[0] == medal_id }
  6.     t = Time.now.strftime(" (%Y/%m/%d %H:%M)")
  7.     @medals.push([medal_id, t])
  8.     @new_medals.push([medal_id, t])
  9.  
  10.     vid = 1  # 所保存的变量ID
  11.     # 如果不是数组,则强制覆盖为数组
  12.     $game_variables[vid] = [] if !$game_variables[vid].is_a?(Array)
  13.     $game_variables[vid].push(medal_id)  # 将当前解锁的成就序号存入变量
  14.     $game_variables[vid].uniq!  # 去重
  15.   end

2. 调用 全局变量 脚本的保存,将这个变量存入独立的文件中
3. 在新游戏/读档后,调用 全局变量 脚本的读取,将存入了独立文件中的 $game_variables[1] 覆盖当前游戏中的$game_variables[1]
4. 依据覆盖后的$game_variables[1]中的值,再次调用成就脚本的增加指令
  1. $game_variables[1].each do |id|
  2.   $game_party.gain_medal_no_hint(id)
  3. end
复制代码

* 可以给原脚本加个没有提示的成就增加方法,避免每次读档都提示一大堆成就新增:
  1. class Game_Party
  2.   #--------------------------------------------------------------------------
  3.   # ○ メダルの獲得
  4.   #--------------------------------------------------------------------------
  5.   def gain_medal_no_hint(medal_id)
  6.     gain_medal(medal_id)
  7.     # 更新:清除存储新成就的变量即可
  8.     @new_medals.clear
  9.   end
  10. end
复制代码

* 可以在脚本里加入,避免每次都手动写一遍
   记得要放在全局变量的脚本之下,确保先读取了全局变量,再进行这里的成就获取
RUBY 代码复制
  1. class << DataManager
  2.   #--------------------------------------------------------------------------
  3.   # ● 设置新游戏
  4.   #--------------------------------------------------------------------------
  5.   alias tomoaky_medal_setup_new_game setup_new_game
  6.   def setup_new_game
  7.     tomoaky_medal_setup_new_game
  8.     $game_variables[1].each { |id| $game_party.gain_medal_no_hint(id) }
  9.   end
  10. end
  11. #-------------------------------------------------------------------------------
  12. class Game_System
  13.   #--------------------------------------------------------------------------
  14.   # ● 读档后的处理
  15.   #--------------------------------------------------------------------------
  16.   alias tomoaky_medal_on_after_load  on_after_load
  17.   def on_after_load
  18.     tomoaky_medal_on_after_load
  19.     $game_variables[1].each { |id| $game_party.gain_medal_no_hint(id) }
  20.   end
  21. end

这样就能制作多存档通用的成就了
回复

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
1018
在线时间
139 小时
注册时间
2023-7-29
帖子
21

极短25参与

3
 楼主| 发表于 2025-5-25 21:29:28 | 只看该作者
百里_飞柳 发表于 2025-5-23 21:51
第一个问题这样改下:

首先感謝鷹大師的回答XD
第一個問題是解決了,但是第二個問題我不太懂怎麼弄(掩面


關於全局變量腳本我尋思應該類似永久開關,所以我用的是來自巴哈姆特的魂老師(play123)
我設定永久變量参開關是60~120,所以上面我將變量數字[1]改成了[61]


然後腳本就顯示錯誤說這個指令用不了,但是大師舉例的可以用囧…

点评

我更新了下,你可以直接把存入变量的处理放到脚本里,省的每次都在事件里写一遍;类似的,在新游戏和读档后处理里,也可以加入变量的处理  发表于 7 天前
你这个永久变量是什么原理的,怎么会直接把它设置成了一个大数字,看起来不像是存储到另外的文件里啊。试试这个吧 https://rpg.blue/thread-402630-1-1.html  发表于 7 天前
回复

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
1018
在线时间
139 小时
注册时间
2023-7-29
帖子
21

极短25参与

4
 楼主| 发表于 6 天前 | 只看该作者
百里_飞柳 发表于 2025-5-23 21:51
第一个问题这样改下:

我不好意思我又來打擾了囧…
我按照您的方法把代碼都加了進去
然後全局變量的腳本又出了問題囧…

我加進去的時侯還沒有把腳本改過 測試遊戲就跳出這個類似糸統錯誤的提示


然後我試著按你的代碼加進全局變量裡,又跳出這個




我有想過是不是跟我上面提到的永久開關腳本有衝突,所以我試著把那個腳本刪掉,但結果還是一樣囧……
給您看看我跟著您說加的的變量跟永久開關腳本看看?
  1. #===============================================================================
  2. # 全局变量开关
  3. #  By:VIPArcher [email: [email][email protected][/email]]
  4. #  -- 本脚本来自 [url]https://rpg.blue[/url] 使用或转载请保留以上信息。
  5. #===============================================================================
  6. # 说明:
  7. #   把所有开关变量储存到一个文件中,开始新游戏时或者读档时自动载入该文件中设定好的
  8. #   某些开关变量,应该也可以用于制作多结局多周目之类的功能。通关一个结局时事件脚本
  9. #   调用 save_vs_data 一下就可以把当前的开关变量储存到一个文件中。
  10. #===============================================================================
  11. $VIPArcherScript ||= {};$VIPArcherScript[:save_varsw] = 20150121
  12. #-------------------------------------------------------------------------------
  13. module VIPArcher end
  14. #==============================================================================
  15. #  ☆ 设定部分 ☆
  16. #==============================================================================
  17. module VIPArcher::GLOBAL
  18.   FILEURL = "Saves"             #储存数据的文件夹
  19.   NAME = "System_Save.rvdata2"  #储存数据的文件名
  20.   VAR = [99]   # 新游戏/读档时载入的变量
  21.   SW  = [100]   # 新游戏/读档时载入的开关
  22. end
  23. #==============================================================================
  24. #  ★ 设定结束 ★
  25. #==============================================================================
  26. module VIPArcher::GLOBAL
  27.   FILENAME = FILEURL + "/" + NAME
  28.   #--------------------------------------------------------------------------
  29.   # ● 储存开关变量数据
  30.   #--------------------------------------------------------------------------
  31.   def self.save_data
  32.     Dir.mkdir(FILEURL) unless FileTest.exist?(FILEURL)
  33.     File.open(FILENAME , "wb") do |file|
  34.       Marshal.dump(make_contents, file)
  35.     end
  36.   end
  37.   #--------------------------------------------------------------------------
  38.   # ● 获取开关变量数据
  39.   #--------------------------------------------------------------------------
  40.   def self.make_contents
  41.     contents = {}
  42.     contents[:switches] = $game_switches
  43.     contents[:variable] = $game_variables
  44.     contents
  45.   end
  46.   #--------------------------------------------------------------------------
  47.   # ● 读取变量数据
  48.   #--------------------------------------------------------------------------
  49.   def self.load_var(id)
  50.     File.open(FILENAME , "rb") do |file|
  51.       game_variables = Marshal.load(file)[:variable]
  52.       $game_variables[id] = game_variables[id]
  53.     end ; rescue
  54.   end
  55.   #--------------------------------------------------------------------------
  56.   # ● 读取开关数据
  57.   #--------------------------------------------------------------------------
  58.   def self.load_sw(id)
  59.     File.open(FILENAME , "rb") do |file|
  60.       game_switches = Marshal.load(file)[:switches]
  61.       $game_switches[id] = game_switches[id]
  62.     end ; rescue
  63.   end
  64.   #--------------------------------------------------------------------------
  65.   # ● 载入 VAR 和 SW 的开关和变量
  66.   #--------------------------------------------------------------------------
  67.   def self.load_game_versw
  68.     VAR.each { |id| load_var(id) } ; SW.each { |id| load_sw(id) }
  69.   end
  70. end
  71. #-------------------------------------------------------------------------------
  72. class << DataManager
  73.   #--------------------------------------------------------------------------
  74.   # ● 设置新游戏
  75.   #--------------------------------------------------------------------------
  76.   alias tomoaky_medal_setup_new_game setup_new_game
  77.   def setup_new_game
  78.     tomoaky_medal_setup_new_game
  79.     $game_variables[1].each { |id| $game_party.gain_medal_no_hint(id) }
  80.   end
  81. end
  82. #-------------------------------------------------------------------------------
  83. class Game_System
  84.   #--------------------------------------------------------------------------
  85.   # ● 读档后的处理
  86.   #--------------------------------------------------------------------------
  87.   alias tomoaky_medal_on_after_load  on_after_load
  88.   def on_after_load
  89.     tomoaky_medal_on_after_load
  90.     $game_variables[1].each { |id| $game_party.gain_medal_no_hint(id) }
  91.   end
  92. end
  93. #-------------------------------------------------------------------------------
  94. class Game_Interpreter
  95.   #--------------------------------------------------------------------------
  96.   # ● 储存开关变量数据
  97.   #--------------------------------------------------------------------------
  98.   def save_vs_data ; VIPArcher::GLOBAL.save_data end
  99.   #--------------------------------------------------------------------------
  100.   # ● 读取变量数据
  101.   #--------------------------------------------------------------------------
  102.   def load_var(*args)
  103.     args.each { |id| VIPArcher::GLOBAL.load_var(id) }
  104.   end
  105.   #--------------------------------------------------------------------------
  106.   # ● 读取开关数据
  107.   #--------------------------------------------------------------------------
  108.   def load_sw(*args)
  109.     args.each { |id| VIPArcher::GLOBAL.load_sw(id)  }
  110.   end
  111. end
复制代码


  1. #encoding:utf-8

  2. =begin
  3. *******************************************************************************************

  4.    * 遊戲共用變數 *

  5.                        for RGSS3

  6.         Ver 1.2.0   2015.07.30

  7.    原作者:魂(Lctseng),巴哈姆特論壇ID:play123


  8.    轉載請保留此標籤

  9.    個人小屋連結:http://home.gamer.com.tw/homeindex.php?owner=play123

  10.    主要功能:
  11.                        一、設定某些範圍的開關和變量將永遠在遊戲間共用


  12.    更新紀錄:
  13.     Ver 1.0.0 :
  14.     日期:2014.06.30
  15.     摘要:■、最初版本
  16.                 ■、功能:
  17.                        一、設定某些範圍的開關和變量將永遠在遊戲間共用

  18.     Ver 1.1.0 :
  19.     日期:2014.08.15
  20.     摘要:■、錯誤修正:
  21.                        一、打包後的遊戲專案使用會有找不到檔案的問題


  22.     Ver 1.2.0 :
  23.     日期:2015.07.30
  24.     摘要:■、新增安全機制

  25.     撰寫摘要:一、此腳本修改或重新定義以下類別:
  26.                            ■ Game_Switches
  27.                            ■ Game_Variables

  28.                         二、此腳本新定義以下類別和模組:
  29.                            ■ Lctseng::PermanentlyVariables
  30.                            ■ Game_PermanentlyVariables


  31. *******************************************************************************************

  32. =end

  33. #encoding:utf-8
  34. #==============================================================================
  35. # ■ Lctseng::PermanentlyVariables
  36. #------------------------------------------------------------------------------
  37. #  管理模組
  38. #==============================================================================

  39. module Lctseng
  40. module PermanentlyVariables
  41.   #--------------------------------------------------------------------------
  42.   # ● 設定永久的開關和變量範圍
  43.   #--------------------------------------------------------------------------
  44.   # 開關:10~20
  45.   SWITCH_RANGE = Range.new(541,590)
  46.   # 變量:20~30
  47.   VARIABLE_RANGE = Range.new(61,120)
  48.   #--------------------------------------------------------------------------
  49.   # ● 安全設定:設定兩個很大的質數,以避免永久存檔遭到修改
  50.   #--------------------------------------------------------------------------
  51.   PRIME_1 = 179424779
  52.   PRIME_2 = 179428399

  53. end
  54. end



  55. #*******************************************************************************************
  56. #
  57. #   請勿修改從這裡以下的程式碼,除非你知道你在做什麼!
  58. #   DO NOT MODIFY UNLESS YOU KNOW WHAT TO DO !
  59. #
  60. #*******************************************************************************************

  61. #--------------------------------------------------------------------------
  62. # ★ 紀錄腳本資訊
  63. #--------------------------------------------------------------------------
  64. if !$lctseng_scripts
  65.   $lctseng_scripts = {}
  66. end


  67. $lctseng_scripts[:permanently_variable] = "1.2.0"

  68. puts "載入腳本:Lctseng - 遊戲共用變數,版本:#{$lctseng_scripts[:permanently_variable]}"



  69. #encoding:utf-8
  70. #==============================================================================
  71. # ■ Lctseng::PermanentlyVariables
  72. #------------------------------------------------------------------------------
  73. #  管理模組
  74. #==============================================================================

  75. module Lctseng
  76. module PermanentlyVariables
  77.   #--------------------------------------------------------------------------
  78.   # ● 讀取共用開關
  79.   #--------------------------------------------------------------------------
  80.   def self.get_switch(switch_id)
  81.     ensure_record
  82.     $game_permanent.get_switch(switch_id)
  83.   end
  84.   #--------------------------------------------------------------------------
  85.   # ● 寫入共用開關
  86.   #--------------------------------------------------------------------------
  87.   def self.set_switch(switch_id,value)
  88.     ensure_record
  89.     $game_permanent.set_switch(switch_id,value)
  90.     sync_record
  91.   end
  92.   #--------------------------------------------------------------------------
  93.   # ● 讀取共用變數
  94.   #--------------------------------------------------------------------------
  95.   def self.get_variable(switch_id)
  96.     ensure_record
  97.     $game_permanent.get_variable(switch_id)
  98.   end
  99.   #--------------------------------------------------------------------------
  100.   # ● 寫入共用變數
  101.   #--------------------------------------------------------------------------
  102.   def self.set_variable(var_id,value)
  103.     ensure_record
  104.     $game_permanent.set_variable(var_id,value)
  105.     sync_record
  106.   end
  107.   #--------------------------------------------------------------------------
  108.   # ● 確保共用資訊存在於記憶體
  109.   #--------------------------------------------------------------------------
  110.   def self.ensure_record
  111.     if $game_permanent.nil?
  112.       $game_permanent = load_record
  113.     end
  114.   end
  115.   #--------------------------------------------------------------------------
  116.   # ● 讀取永久變數,若不存在,則創立新物件
  117.   #--------------------------------------------------------------------------
  118.   def self.load_record
  119.     data = nil
  120.     begin
  121.       data = load_data("Permanent.dat")
  122.       if data.check_checksum
  123.         puts "已讀取存在的檔案"
  124.       else
  125.         puts "檔案遭到修改!"
  126.         raise RuntimeError, "檔案損壞!"
  127.       end
  128.     rescue
  129.       puts "檔案不存在或損壞!創立新物件"
  130.       data = Game_PermanentlyVariables.new
  131.     end
  132.     return data
  133.   end
  134.   #--------------------------------------------------------------------------
  135.   # ● 同步永久變數,將寫入檔案
  136.   #--------------------------------------------------------------------------
  137.   def self.sync_record
  138.     puts "正在同步檔案"
  139.     $game_permanent.generate_checksum
  140.     save_data($game_permanent, "Permanent.dat")
  141.   end

  142. end
  143. end


  144. #encoding:utf-8
  145. #==============================================================================
  146. # ■ Game_PermanentlyVariables
  147. #------------------------------------------------------------------------------
  148. #  儲存永久不變的開關與變數
  149. #     只是個套殼的Hash
  150. #==============================================================================

  151. class Game_PermanentlyVariables
  152.   #--------------------------------------------------------------------------
  153.   # ● 初始化
  154.   #--------------------------------------------------------------------------
  155.   def initialize
  156.     clear
  157.   end
  158.   #--------------------------------------------------------------------------
  159.   # ● 清除
  160.   #--------------------------------------------------------------------------
  161.   def clear
  162.     @switchs = {}
  163.     @variables = {}
  164.     @checksum = 0
  165.   end
  166.   #--------------------------------------------------------------------------
  167.   # ● 產生檢查碼
  168.   #--------------------------------------------------------------------------
  169.   def generate_checksum
  170.     @checksum = calculate_checksum
  171.   end
  172.   #--------------------------------------------------------------------------
  173.   # ● 計算檢查碼
  174.   #--------------------------------------------------------------------------
  175.   def calculate_checksum
  176.     checksum = 0
  177.     @switchs.each_pair do |id,val|
  178.       checksum += (id*Lctseng::PermanentlyVariables::PRIME_1 * (val ? -1 : 1))
  179.     end
  180.     @variables.each_pair do |id,val|
  181.       checksum += (id*Lctseng::PermanentlyVariables::PRIME_1 + val*Lctseng::PermanentlyVariables::PRIME_2)
  182.     end
  183.     puts "檢查碼:#{checksum}"
  184.     return checksum
  185.   end
  186.   #--------------------------------------------------------------------------
  187.   # ● 測試檢查碼
  188.   #--------------------------------------------------------------------------
  189.   def check_checksum
  190.     @checksum == calculate_checksum
  191.   end
  192.   #--------------------------------------------------------------------------
  193.   # ● 取得開關
  194.   #--------------------------------------------------------------------------
  195.   def get_switch(switch_id)
  196.     @switchs[switch_id] || false
  197.   end
  198.   #--------------------------------------------------------------------------
  199.   # ● 設定開關
  200.   #--------------------------------------------------------------------------
  201.   def set_switch(switch_id,value)
  202.     @switchs[switch_id]  = value
  203.   end
  204.   #--------------------------------------------------------------------------
  205.   # ● 取得變數
  206.   #--------------------------------------------------------------------------
  207.   def get_variable(var_id)
  208.     @variables[var_id] || 0
  209.   end
  210.   #--------------------------------------------------------------------------
  211.   # ● 設定變數
  212.   #--------------------------------------------------------------------------
  213.   def set_variable(var_id,value)
  214.     @variables[var_id]  = value
  215.   end

  216. end


  217. #encoding:utf-8
  218. #==============================================================================
  219. # ■ Game_Switches
  220. #------------------------------------------------------------------------------
  221. #  處理開關的類。本質上是套了個殼的 Array 。本類的實例請參考 $game_switches 。
  222. #==============================================================================

  223. class Game_Switches
  224.   #--------------------------------------------------------------------------
  225.   # ● 獲取開關 - 重新定義
  226.   #--------------------------------------------------------------------------
  227.   alias :lctseng_get :[]
  228.   #--------------------------------------------------------------------------
  229.   def [](switch_id)
  230.     if Lctseng::PermanentlyVariables::SWITCH_RANGE.include?(switch_id)
  231.       puts "讀取共用開關:#{switch_id}"
  232.       return Lctseng::PermanentlyVariables.get_switch(switch_id)
  233.     else
  234.       puts "讀取普通開關:#{switch_id}"
  235.       return lctseng_get(switch_id)
  236.     end
  237.   end
  238.   #--------------------------------------------------------------------------
  239.   # ● 設置開關 - 重新定義
  240.   #     value : 開啟 (true) / 關閉 (false)
  241.   #--------------------------------------------------------------------------
  242.   alias :lctseng_set :[]=
  243.   #--------------------------------------------------------------------------
  244.   def []=(switch_id, value)
  245.     if Lctseng::PermanentlyVariables::SWITCH_RANGE.include?(switch_id)
  246.       puts "寫入共用開關:#{switch_id}:#{value}"
  247.       Lctseng::PermanentlyVariables.set_switch(switch_id, value)
  248.       on_change
  249.     else
  250.       puts "寫入普通開關:#{switch_id}:#{value}"
  251.       lctseng_set(switch_id, value)
  252.     end

  253.   end
  254. end


  255. #encoding:utf-8
  256. #==============================================================================
  257. # ■ Game_Variables
  258. #------------------------------------------------------------------------------
  259. #  處理變量的類。本質上是套了個殼的 Array 。本類的實例請參考 $game_variables 。
  260. #==============================================================================

  261. class Game_Variables
  262.   #--------------------------------------------------------------------------
  263.   # ● 獲取變物 - 重新定義
  264.   #--------------------------------------------------------------------------
  265.   alias :lctseng_get :[]
  266.   #--------------------------------------------------------------------------
  267.   def [](variable_id)
  268.     if Lctseng::PermanentlyVariables::VARIABLE_RANGE.include?(variable_id)
  269.       puts "讀取共用變數:#{variable_id}"
  270.       return Lctseng::PermanentlyVariables.get_variable(variable_id)
  271.     else
  272.       puts "讀取普通變數:#{variable_id}"
  273.       return lctseng_get(variable_id)
  274.     end
  275.   end
  276.   #--------------------------------------------------------------------------
  277.   # ● 設置變數 - 重新定義
  278.   #--------------------------------------------------------------------------
  279.   alias :lctseng_set :[]=
  280.   #--------------------------------------------------------------------------
  281.   def []=(variable_id, value)
  282.     if Lctseng::PermanentlyVariables::VARIABLE_RANGE.include?(variable_id)
  283.       puts "寫入共用變數:#{variable_id}:#{value}"
  284.       Lctseng::PermanentlyVariables.set_variable(variable_id, value)
  285.       on_change
  286.     else
  287.       puts "寫入普通變數:#{variable_id}:#{value}"
  288.       lctseng_set(variable_id, value)
  289.     end

  290.   end
  291. end
复制代码



插圖2.png (5.53 KB, 下载次数: 0)

插圖2.png
回复

使用道具 举报

Lv6.析梦学徒

老鹰

梦石
40
星屑
35159
在线时间
6751 小时
注册时间
2012-5-26
帖子
3245

极短24评委极短23参与极短22参与极短21评委老司机慢点开短篇十吟唱者组别冠军开拓者剧作品鉴家

5
发表于 6 天前 | 只看该作者
BTF060 发表于 2025-5-27 19:08
我不好意思我又來打擾了囧…
我按照您的方法把代碼都加了進去
然後全局變量的腳本又出了問題囧…

1. 我的都是直接在原始脚本下再新建一页粘贴进去,不要修改原始脚本,
比如那个 全局变量开关 脚本,就不要修改它原本的内容了,不然就没用了……

2. 这个 遊戲共用變數 我看了下,只支持开关和数字变量这种原始类型,不支持数组,
所以你设置的要存储成就数组的变量ID不要在它的启用范围内了。
直接用  全局变量开关 的 save_vs_data 保存,然后在 VAR = [99] 里面加入你要存储成就数组的变量ID,比如 VAR = [99, 1] 。

3. 报错 stack level too deep 是因为你直接改了 全局变量开关 里的内容,粘贴原始版本的,然后把我的放在它下面的新增一页里
回复

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
1018
在线时间
139 小时
注册时间
2023-7-29
帖子
21

极短25参与

6
 楼主| 发表于 5 天前 | 只看该作者
百里_飞柳 发表于 2025-5-27 22:43
1. 我的都是直接在原始脚本下再新建一页粘贴进去,不要修改原始脚本,
比如那个 全局变量开关 脚本,就不 ...

嗯……stack level too deep是解決了,但是上面那個顯示underined method的還是沒有解決,就是那個
  1. class << DataManager
  2.   #--------------------------------------------------------------------------
  3.   # ● 设置新游戏
  4.   #--------------------------------------------------------------------------
  5.   alias tomoaky_medal_setup_new_game setup_new_game
  6.   def setup_new_game
  7.     tomoaky_medal_setup_new_game
  8.     $game_variables[1].each { |id| $game_party.gain_medal_no_hint(id) }
  9.   end
  10. end
  11. #-------------------------------------------------------------------------------
  12. class Game_System
  13.   #--------------------------------------------------------------------------
  14.   # ● 读档后的处理
  15.   #--------------------------------------------------------------------------
  16.   alias tomoaky_medal_on_after_load  on_after_load
  17.   def on_after_load
  18.     tomoaky_medal_on_after_load
  19.     $game_variables[1].each { |id| $game_party.gain_medal_no_hint(id) }
  20.   end
  21. end
复制代码

我什麼都還沒改就報錯了0.0
但是刪掉就沒問題,這個實在不行的話是可以直接刪掉的對吧?只是需要手動emmm
那個變量是要先把gain_medal(0) 寫上去 然後用 save_vs_data 就可以保存成就,不用打開開關的嗎?

点评

好的好的,感恩  发表于 4 天前
VAR = [35] 就好了,不要读取其它变量,省的日后冲突出问题  发表于 4 天前
$game_variables[1] 要改成 $game_variables[35],我写1是作为示例啦,同样的,vid = 1 中的1也要改成35  发表于 4 天前
其實我有點不太懂 VAR = [99, 1] 那個 ,1 的作用,我使用的變量ID是35,所以我打的VAR = [35, 1] 是可以的吧?(不好意思我真的是腳本小白,打擾很抱歉囧)  发表于 5 天前
回复

使用道具 举报

Lv6.析梦学徒

老鹰

梦石
40
星屑
35159
在线时间
6751 小时
注册时间
2012-5-26
帖子
3245

极短24评委极短23参与极短22参与极短21评委老司机慢点开短篇十吟唱者组别冠军开拓者剧作品鉴家

7
发表于 4 天前 | 只看该作者
BTF060 发表于 2025-5-28 21:28
嗯……stack level too deep是解決了,但是上面那個顯示underined method的還是沒有解決,就是那個
我什 ...

改成这样,只有是数组时才会执行成就获得,应该就可以了
  1. class << DataManager
  2.   #--------------------------------------------------------------------------
  3.   # ● 设置新游戏
  4.   #--------------------------------------------------------------------------
  5.   alias tomoaky_medal_setup_new_game setup_new_game
  6.   def setup_new_game
  7.     tomoaky_medal_setup_new_game
  8.     if $game_variables[35].is_a?(Array)
  9.       $game_variables[35].each { |id| $game_party.gain_medal_no_hint(id) }
  10.     end
  11.   end
  12. end
  13. #-------------------------------------------------------------------------------
  14. class Game_System
  15.   #--------------------------------------------------------------------------
  16.   # ● 读档后的处理
  17.   #--------------------------------------------------------------------------
  18.   alias tomoaky_medal_on_after_load  on_after_load
  19.   def on_after_load
  20.     tomoaky_medal_on_after_load
  21.     if $game_variables[35].is_a?(Array)
  22.       $game_variables[35].each { |id| $game_party.gain_medal_no_hint(id) }
  23.     end
  24.   end
  25. end
复制代码

点评

好的解決了,感謝老鷹老師( ´∀`)  发表于 前天 01:02
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2025-6-2 00:42

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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