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

Project1

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

[已经解决] 虚拟日历脚本问题

[复制链接]

Lv4.逐梦者

梦石
0
星屑
6117
在线时间
1557 小时
注册时间
2011-6-14
帖子
520
跳转到指定楼层
1
发表于 2015-11-6 08:41:07 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有帐号?注册会员

x
我想用     变量49 50 51  来记录年数月数天数 让这些数字改动时变量也跟着+1
在别的地方找到记录是这个 $game_variables[49] += 1  但是具体要加在哪才能进行记录呢呢?


RUBY 代码复制
  1. #==============================================================================
  2. # ** 虚拟日历
  3. #  作者:影月千秋
  4. #  适用:VA
  5. #  要求:Smomo脚本核心 1.0+
  6. #------------------------------------------------------------------------------
  7. # * 简介:
  8. #  模拟时间流逝,并在地图(菜单)进行显示
  9. #  可以自定义计时规则和显示效果
  10. #  请为本脚本准备变量和开关,在下方进行设定
  11. #  本脚本需要Smomo脚本核心,请到此下载:[url]http://tinyurl.com/l9kvg2p[/url]
  12. #  如果链接失效,请到rpg.blue,@余烬之中 或 @影月千秋
  13. #------------------------------------------------------------------------------
  14. # * 使用方法:
  15. #  将此脚本插入到其他脚本以下,Main以上,在下面给出的设定区进行设定后即可
  16. #  在事件中操作指定的变量和开关,便可以获取和改变时间
  17. #  也可以通过事件脚本进行操作
  18. #  允许的脚本呼叫:
  19. #    Smomo.calendar(type) 取得日历的内部数据
  20. #   参数说明:type 想要获得的数据名
  21. #       【:all】 获取所有数据的数组 依次为:时段 色调 刷新标志 周期历时 周期序号
  22. #       【:zone】获取当前时段的名称(如:"早晨")
  23. #       【:tone】不常用,获取当前色调(Tone色调类的实例)
  24. #       【:need_change】没有任何实用意义,不常用,可以获取需要刷新的标志
  25. #       【:period】当前周期经过的时间(如:1366)
  26. #       【:prd】当前周期的序号,对应在周期名字(如:3)
  27. #       【:pname】当前周期的名字,与prd是对应的(如:周三)
  28. #   例:【Smomo.calendar(:zone)】获取时段名
  29. #  对于插件脚本:
  30. #   可以使用【Smomo::Calendar.routine.push(某方法)】来向列表中添加新方法
  31. #   例:【Smomo::Calendar.routine.push(lambda{ puts "一天过去了" })】
  32. #   列表中的方法会在一个时段周期结束时被调用
  33. #   有关时段周期,请参阅112行及以下
  34. #  更多内容,示例工程,请来发布帖查看:
  35. #   [url]https://rpg.blue/thread-330684-1-1.html[/url]
  36. #------------------------------------------------------------------------------
  37. # * 版本:
  38. #   V 3.3 2014.09.30 解决了时段计时与时间在变量干涉下不同步的问题
  39. #   V 3.2 2014.09.07 添加了公共接口routine
  40. #   V 3.1 2014.09.07 优化了室内地图的标记方式 修正了暂停计时时色调的转换问题
  41. #   V 3.0 2014.07.31 修正了2.7以为成功实际上未修正成功的问题 并做了一些其他调整
  42. #   V 2.9 2014.07.28 修正了Map不能为:none从2.3版延续过来的傻逼错误
  43. #   V 2.8 2014.07.26 对2.7的小修正 并修改了自定义提示语
  44. #   V 2.7 2014.07.24 修正了事件推进时不刷新周期的问题
  45. #   V 2.6 2014.05.24 修正了日期出现0的BUG
  46. #   V 2.5 2014.04.06 规范化脚本 消除冗余 重建逻辑结构 需要依赖Smomo脚本核心
  47. #   V 2.4 2014.01.31 修正读档时报错的BUG
  48. #   V 2.3 2014.01.29 可以自定义地图窗体的位置
  49. #   V 2.2 2013.12.27 修正Window_MoVMe的错误
  50. #   V 2.1 2013.12.15 修正过卡的BUG
  51. #   V 2.0 2013.10.04 基本重写
  52. #   V 1.0 2013.08.31 公开
  53. #------------------------------------------------------------------------------
  54. # * 声明:
  55. #   本脚本由来自【影月千秋】,使用和转载请保留此信息
  56. #==============================================================================
  57.  
  58. if $smomo["Core"].nil? || $smomo["Core"] < 1.0
  59.   msgbox "请先安装Smomo脚本核心!"; %x!start [url]http://tinyurl.com/l9kvg2p![/url]
  60. elsif $smomo["Calendar"].nil?
  61. $smomo["Calendar"] = true
  62.  
  63. #==============================================================================
  64. # ** Smomo::Calendar
  65. #==============================================================================
  66. module Smomo::Calendar
  67.   Menu = true
  68.   # 是否在菜单内显示日历
  69.    # true 使用  false 不使用
  70.    # 如果预设不能满足要求 请自行在下方自定义区更改
  71.  
  72.   Map = :bottom
  73.   # 是否在地图上显示日历
  74.    # :top 顶部  :bottom 底部  :none 不使用
  75.    # 如果预设不能满足要求 请自行在下方自定义区更改
  76.  
  77.   Use = 16
  78.   # 设定占用开关,只有当此开关打开时,才会计时
  79.    # !打开开关前 请确保下方Speed对应的变量不为0!
  80.  
  81.   Var = 81
  82.   # 设定占用变量的起始编号 会占用以这个号码为开端的连续几个号码对应的游戏变量
  83.  
  84.   # 继续设置需要了解的事实:
  85.   #  脚本内部用一个数字累加计时 然后依次推进到下一单位 把最开始的数字叫计时变量
  86.  
  87.   Speed = 100
  88.   # 设定游戏时间进行速度占用变量,代表经过多少帧后游戏内部计时变量增加一
  89.    # 一般情况下 1秒60帧
  90.    # 再打开Use对应的开关前 请确保这个常量不为0
  91.    # 请确保这个常量不与上面Var的常量(及其包括的范围内的变量)重合
  92.  
  93.   System = [
  94.     # ["单位", 满多少进一(比最大值大一), 是否以零起始(true/false)],
  95.     ["分", 60, true],
  96.     ["时", 24, true],
  97.     ["日", 30],
  98.     ["月", 12],
  99.     ["年", 9999],
  100.   ]
  101.   # 设定计时制,最后一个数据的单位与计时变量的单位统一
  102.    # 可以突破公元历法的限制
  103.     # 比如:636号时间线3145纪6887年6月4日 21:39:44:03
  104.    # !这里有几项 上面的Var就会占用几个变量!
  105.    # !从上往下! 单位由小到大 如:分-->时-->日-->月-->年
  106.    # 有的单位允许以0为值 比如 3:00 有的不行 比如 3月1日
  107.     # 默认不允许0值 如果需要允许 请将“以零起始”填为【true】
  108.  
  109.   Start = [13, 17, 7, 9, 2014]
  110.   # 设置游戏起始时间 与上面的单位从上到下依次对应
  111.  
  112.   PeriodName = ["周日", "周一", "周二", "周三", "周四", "周五", "周六"]
  113.   # 日期的别名 每经过一个周期都会自动推进并显示下一个名字
  114.    # 别名列表长度不固定 可以自行添加或缩短
  115.  
  116.   Start_PeriodName = 6
  117.   # 确定游戏起始时的那个周期的别名是什么 0为第一个别名
  118.    # 一定要用数字来指代 不要用"字符串"
  119.  
  120.   TimeZone = true
  121.   # 是否启用时段功能, 即一个周期内是否有各时段的区分(如:凌晨-中午-黄昏-黑夜)
  122.  
  123.   Zone = [
  124.   # [时段长度, Tone.new(红, 绿, 蓝, 灰), "名称"],
  125.     [120, Tone.new( -75,-100,   0,  75), "夜晚"], # 0...120
  126.     [120, Tone.new(-125,-125, -10, 125), "深夜"], # 120...240
  127.     [120, Tone.new( -75,-100,   0,  75), "黎明"], # 240...360
  128.     [300, Tone.new(   0,   0,   0,   0), "上午"], # 360...660
  129.     [240, Tone.new(  50,  50,  10, -30), "中午"], # 660...900
  130.     [120, Tone.new(   0,   0,   0,   0), "下午"], # 900...1020
  131.     [120, Tone.new(  34, -34, -68, 170), "黄昏"], # 1020...1140
  132.     [300, Tone.new( -75,-100,   0,  75), "夜晚"], # 1140...1440 则1440为周期长度
  133.   ]
  134.   # 设置时段周期内各时段的长度、色调及名称
  135.    # 时段长度以计时变量的单位为单位
  136.   # 到达对应时段时 会自动改变画面的色调
  137.    # 【所有时段的长度加起来就是周期长度!】
  138.    # 【所以,就算不需要使用时段功能,也一定要保证时段长度之和是一个合适的值!】
  139.   # 当一次时段轮回完毕 就会推移到下一个周期(如:周三-->周四)
  140.  
  141.   IndoorMap = /<IndoorMap>/i
  142.   # 用于匹配室内地图备注的正则式
  143.    # 默认为/<IndoorMap>/i
  144.    # 在地图的备注上写【<IndoorMap>】就可以标记其为室内地图
  145.    # 不区分大小写
  146.   # 处于室内地图时,不会受到时段色调的影响
  147.  
  148.   Format = {
  149.     # 菜单用的格式
  150.     menu: %W!
  151.             <4年>.<2月>.<2日>
  152.             \\I[234]___<Period>
  153.             <2时>:<2分>_<Zone>
  154.           !,
  155.     # 地图用的格式
  156.     map:  %W!
  157.             \\I[234]公元<4年>年<2月>月<2日>日___<Period>___<Zone>_<2时>:<2分>
  158.           !
  159.   }
  160.   # 输出格式 此处写多少行 游戏内就会依次对应输出多少行
  161.    # 每一行的内部不要使用空格( ),空格用下划线(_)代替
  162.    # 尽量不要使用英文感叹号(!),如果一定要用请在之前加上反斜杠(\!)
  163.    # 使用【<符号>】的形式来代替指定的数据 其他的文字用于修饰
  164.    # 可用的符号
  165.     # 在上面计时制中设定的单位 可以加上一个数字来代表格式化位数
  166.      # 如:<2时>:<2分> 显示 09:33 <时>:<分> 显示 9:33
  167.     # <Period> 当前周期的名字(如:星期三)
  168.     # <Zone>   当前时段的名字(如:早晨)
  169.    # 两个符号必须用两对<>分别括起来 不能写在同一对<>内
  170.     # 允许使用转义字符 但是必须有两个反斜杠
  171.      # 如 显示图标 \I[3] 应写成 \\I[3]
  172. end
  173.  
  174. #==============================================================================
  175. # 如果你懂脚本,可以在下面调整时间窗口的显示方式
  176. #==============================================================================
  177.  
  178. #============================================================================
  179. # ** Window_MoMenuCalendar 菜单画面中,显示当前游戏内部虚拟日历的窗口
  180. #============================================================================
  181. class Window_MoMenuCalendar < Window_Base
  182.   include Smomo::Calendar
  183.  
  184.   def initialize(gold_window)
  185.     unless $game_switches[Use]
  186.       super(0, 0, 1, 1)
  187.       self.opacity = 0
  188.       return
  189.     end
  190.     Smomo::Calendar.ensure_time_legal
  191.     Smomo::Calendar.check_period_and_zone
  192.     height = Format[:menu].size * 30 + 20
  193.     super(0, gold_window.y - height, gold_window.width, height)
  194.     format = Smomo.deep_clone(Format[:menu])
  195.     format.each_with_index do |t, l|
  196.       t.gsub!(/_/){" "}
  197.       System.each_with_index do |(u, m), i|
  198.         t.gsub!(/<(\d*)#{u}>/){
  199.           format("%0#{$1 ? $1.to_i : nil}d", $game_variables[Var + i])
  200.         }
  201.       end
  202.       t.gsub!(/<Period>/){"#{PeriodName[Smomo::Calendar.prd]}"}
  203.       t.gsub!(/<Zone>/){"#{Smomo::Calendar.zone}"}
  204.       draw_text_ex(0, l * 30, t)
  205.     end
  206.   end
  207. end
  208. #============================================================================
  209. # ** Window_MoMapCalendar 地图画面中,显示当前游戏内部虚拟日历的窗口
  210. #                         但本质上是一个精灵
  211. #============================================================================
  212. class Window_MoMapCalendar < Window_Base
  213.   include Smomo::Calendar
  214.  
  215.   def initialize
  216.     height = Format[:map].size * 30 + 10
  217.     @sprite = Sprite.new
  218.     @sprite.y = Smomo::Calendar::Map == :top ? 0 : Graphics.height - height
  219.     @sprite.bitmap = Bitmap.new(Graphics.width, height)
  220.     @use = true
  221.     update
  222.     refresh
  223.   end
  224.  
  225.   def update
  226.     unless @use == $game_switches[Use]
  227.       @use = $game_switches[Use]
  228.       @sprite.x = @use ? 0 : Graphics.width
  229.       refresh
  230.     else
  231.       refresh if @use && Graphics.frame_count % $game_variables[Speed] == 0 ||
  232.       $game_map.need_refresh
  233.     end
  234.   end
  235.  
  236.   def dispose
  237.     @sprite.bitmap.dispose if @sprite.bitmap
  238.     @sprite.dispose
  239.   end
  240.  
  241.   def refresh
  242.     Smomo::Calendar.ensure_time_legal
  243.     Smomo::Calendar.check_period_and_zone
  244.     contents.clear
  245.     contents.gradient_fill_rect(0, 0, @sprite.width, @sprite.height,
  246.     Color.new(30, 30, 30), Color.new(0, 0, 0, 0))
  247.     format = Smomo.deep_clone(Format[:map])
  248.     format.each_with_index do |t, l|
  249.       t.gsub!(/_/){" "}
  250.       System.each_with_index do |(u, m), i|
  251.         t.gsub!(/<(\d*)#{u}>/){
  252.           format("%0#{$1 ? $1.to_i : nil}d", $game_variables[Var + i])
  253.         }
  254.       end
  255.       t.gsub!(/<Period>/){"#{PeriodName[Smomo::Calendar.prd]}"}
  256.       t.gsub!(/<Zone>/){"#{Smomo::Calendar.zone}"}
  257.       draw_text_ex(0, l * 30 + 5, t)
  258.     end
  259.   end
  260.   #------------------------------------------------------------------------
  261.   # * 偷梁换柱 如果不明白这段的意义 请勿随意删除
  262.   #------------------------------------------------------------------------
  263.   def contents
  264.     @sprite.bitmap
  265.   end
  266.   def windowskin
  267.     Cache.system("Window")
  268.   end
  269. end
  270. #==============================================================================
  271. # ** Scene_Menu 建立菜单场景的窗口
  272. #==============================================================================
  273. class Scene_Menu
  274.   _def_ :start do |*args|
  275.     return unless Smomo::Calendar::Menu
  276.     # 在下面添加自定义内容
  277.     @mocalendar_window = Window_MoMenuCalendar.new(@gold_window)
  278.   end
  279. end
  280. #==============================================================================
  281. # ** Scene_Map 建立地图场景的窗口
  282. #==============================================================================
  283. class Scene_Map
  284.   _def_ :create_all_windows do |*args|
  285.     return if Smomo::Calendar::Map == :none
  286.     # 在下面添加自定义内容
  287.     @mocalendar_window = Window_MoMapCalendar.new
  288.   end
  289. end
  290. #=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+#
  291. #------------------------------------------------------------------------------#
  292.                                "请勿跨过这块区域"
  293. #------------------------------------------------------------------------------#
  294. #+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=#
  295.  
  296. #==============================================================================
  297. # ** Smomo::Calendar
  298. #==============================================================================
  299. module Smomo::Calendar
  300.   # 预处理
  301.   PeriodSize = Zone.inject(0){|s, (l)| s + l}
  302.   Zone.each_with_index{|z, i| z[0] += i == 0 ? 0 : Zone[i - 1][0]}
  303.   _ = Smomo.deep_clone(Zone)
  304.   _.each_with_index{|z, i| Zone[i][0] = (i == 0 ? 0 : _[i - 1][0])...z[0]}
  305.   class << self
  306.     attr_reader :zone, :prd, :ticking
  307.     attr_accessor :period, :routine
  308.     define_method(:data){[@zone, @tone, @need_change, @period, @prd]}
  309.     define_method(:data=){|d| @zone, @tone, @need_change, @period, @prd = d}
  310.     define_method(:function){|type| type == :all ? data : eval(type.to_s)}
  311.     # 获知周期名
  312.     def pname
  313.       PeriodName[@prd]
  314.     end
  315.     # 初始化
  316.     def ini
  317.       @ticking = true
  318.       System.each_index{|i| $game_variables[Var + i] = Start[i]}
  319.       @ticking = false
  320.       @zone = ""
  321.       @tone = Tone.new(0, 0, 0, 0)
  322.       @need_change = false
  323.       @period = init_period
  324.       @prd = Start_PeriodName
  325.       check_period_and_zone
  326.     end
  327.     # 初始化周期
  328.     def init_period
  329.       sta = Start.reverse
  330.       sta.each_with_index do |n, i|
  331.         next if i == sta.size - 1
  332.         sta[i + 1] += n * System.reverse[i + 1][1]
  333.       end
  334.       sta.reverse[0] % PeriodSize
  335.     end
  336.     # 重置周期
  337.     def reset_period
  338.       sta = System.each_index.map{|i| $game_variables[Var + i]}.reverse
  339.       sta.each_with_index do |n, i|
  340.         next if i == sta.size - 1
  341.         sta[i + 1] += n * System.reverse[i + 1][1]      
  342.       end
  343.       @period = sta.reverse[0] % PeriodSize
  344.     end
  345.     # 计时
  346.     def i_look_into_the_sky_as_time_passes_by
  347.       return unless $game_switches[Use]
  348.       return if $game_message.visible
  349.       return unless Graphics.frame_count % $game_variables[Speed] == 0
  350.       # 如果在这里报错 一定是你没有设置Speed所对应的变量的值
  351.       @ticking = true
  352.       $game_variables[Var] += 1
  353.       @period += 1
  354.       ensure_time_legal
  355.       ensure_period_legal
  356.       check_period_and_zone
  357.       change_tone if TimeZone
  358.       @ticking = false
  359.     end
  360.     # 确保变量在范围内
  361.     def ensure_time_legal
  362.       @ticking = true
  363.       System.each_with_index do |(u, m, o), i|
  364.         while $game_variables[Var + i] > m - (o ? 1 : 0)
  365.           $game_variables[Var + i] -= m
  366.           $game_variables[Var + i + 1] += 1   
  367.         end
  368.         while $game_variables[Var + i] < 1 - (o ? 1 : 0)
  369.           $game_variables[Var + i] += m
  370.           $game_variables[Var + i + 1] -= 1
  371.         end
  372.       end
  373.       @ticking = false
  374.     end
  375.     # 确保时段在范围内
  376.     def ensure_period_legal
  377.       [@routine.each(&:call), @prd += 1, @period = 0] if @period >= PeriodSize
  378.       @prd = 0 if @prd >= PeriodName.size
  379.     end
  380.     # 检查周期别名和时段
  381.     def check_period_and_zone
  382.       tone, @zone = Zone.find{|(r, t, n)| r.include?(@period)}[1, 2]
  383.       @tone == tone ? nil : [@tone = tone, @need_change = true]
  384.     end
  385.     # 改变画面色调
  386.     def change_tone(im = false, reset = false)
  387.       return unless @need_change || im
  388.       @need_change = false
  389.       if indoor? || !$game_switches[Use] && reset
  390.         $game_map.screen.start_tone_change(Tone.new(0, 0, 0, 0), 0)
  391.       else
  392.         return unless $game_switches[Use]
  393.         $game_map.screen.start_tone_change(@tone, im ? 0 : 60)
  394.       end
  395.     end
  396.     # 是否是室内地图
  397.     def indoor?
  398.       $game_map.instance_exec{ @map }.note =~ IndoorMap
  399.     end
  400.   end
  401.   Smomo::Calendar.routine = Array.new
  402. end
  403. #==============================================================================
  404. # ** Smomo.calendar(*a, &b)
  405. #==============================================================================
  406. def Smomo.calendar(*a, &b)
  407.   Smomo::Calendar.function(*a, &b)
  408. end
  409. #==============================================================================
  410. # ** Game_Switches
  411. #==============================================================================
  412. class Game_Switches
  413.   _def_ :on_change do
  414.     Smomo::Calendar.change_tone true, true
  415.   end
  416. end
  417. #==============================================================================
  418. # ** Game_Variables
  419. #==============================================================================
  420. class Game_Variables
  421.   _def_ :[]=, :c do |old, variable_id, value|
  422.     if Smomo::Calendar.ticking
  423.       old.call(variable_id, value)
  424.     else
  425.       min = Smomo::Calendar::Var
  426.       max = min + Smomo::Calendar::System.size - 1
  427.       if variable_id.between?(min, max)
  428.         Smomo::Calendar.period += value - @data[variable_id]
  429.         old.call(variable_id, value)
  430.         Smomo::Calendar.ensure_time_legal
  431.         Smomo::Calendar.ensure_period_legal
  432.         Smomo::Calendar.check_period_and_zone
  433.         Smomo::Calendar.change_tone
  434.         Smomo::Calendar.reset_period
  435.       else
  436.         old.call(variable_id, value)
  437.       end
  438.     end
  439.   end
  440. end
  441. #==============================================================================
  442. # ** Scene_Map
  443. #==============================================================================
  444. class Scene_Map
  445.   _def_ :update do |*args|
  446.     Smomo::Calendar.i_look_into_the_sky_as_time_passes_by
  447.   end
  448.   _def_ :post_transfer, :b do |*args| Smomo::Calendar.change_tone(true) end
  449. end
  450. #==============================================================================
  451. # ** DataManager
  452. #==============================================================================
  453. class << DataManager
  454.   _def_ :setup_new_game do Smomo::Calendar.ini end
  455.   _def_ :make_save_contents, :v do |contents, *args|
  456.     contents[:mocalendar] = Smomo::Calendar.data
  457.     contents
  458.   end
  459.   _def_ :extract_save_contents do |contents, *args|
  460.     Smomo::Calendar.data = contents[:mocalendar]
  461.   end
  462. end
  463.  
  464. else # if $smomo
  465.   msgbox "请不要重复加载此脚本 : )\n【虚拟日历】"
  466. end
  467. #==============================================================================#
  468. #=====                        =================================================#
  469.             "脚 本 尾"
  470. #=====                        =================================================#
  471. #==============================================================================#
  

Lv4.逐梦者 (版主)

百合控

梦石
0
星屑
6643
在线时间
1275 小时
注册时间
2013-8-21
帖子
3657

开拓者

2
发表于 2015-11-7 10:38:44 | 只看该作者
不太明白你要表达的

如果你设置了Var = 45
并且没有改System设置的话
那么49号变量就代表年
事件操作变量 或者直接在其他脚本中$game_variables[49] += 1 都可以达到改变时间的目的 这个更新是实时同步的 不需要其他操作

点评

好评 多谢大大  发表于 2015-11-8 20:51
改那个49就行了  发表于 2015-11-7 23:04
Smomo::Calendar.routine.push(lambda{ $game_variables[49] += 1 })  发表于 2015-11-7 23:03
.....不是改变时间 是记录时间,每当时间过去一天时,变量49也跟着+1这样,我想把年月天都用变量记录然后来控制事件的触发  发表于 2015-11-7 10:52

评分

参与人数 1星屑 +201 收起 理由
taroxd + 201 认可答案

查看全部评分

萌新瑟瑟发抖
看到我请叫我去干活
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-11-17 05:35

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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