持久化数据和判断
# 持久化数据和判断
注意!!!
本文将假定您有一定的 Python 基础,因为本文涉及到变量和判断,虽然也很简单,但我仍建议您在了解 Python 基础知识后再来完成本教程。
今天学的内容会有一点点的难,但如果你利用的好,能够使 Mod 更有趣。
# 持久化数据
提示
持久化数据听上去似乎很复杂,但将其理解为 “不会随着读档、删档而改变的数据” 是不是就会更好理解一些?
一般来说,在使用 Ren'Py 制作的游戏的标准主存档位置里会有一个名为 DDLCModTemplateZh-v4
的文件夹,那就是模组模板的存档位置;而里面通常有一个名为 persistent
的文件,那就是我们今天要重点介绍的持久化数据的存档文件。
扩展知识
您可以去 options.rpy
更改持久化数据文件夹名称。 请不要在存档文件夹的名称中包含中文,以免存档失败,引发异常。
各操作系统的持久化数据存档位置如下:
- Windows:
%APPDATA%\RenPy
- Linux:
~/.renpy
- macOS:
$HOME/Library/RenPy
# 用法
您可以在脚本文件里输入:
$ persistent.<变量名称> = <数字、布尔值、字符串...>
提示
请按需修改上面标注的内容。
这样,这个变量就会被保存到存档文件里。
# 记录周目
您可以在脚本里输入:
$ persistent.playthrough = <数字>
来记录玩家游玩到了哪一个周目(虽然你可能用不到)。
提示:
请按需修改上面标注的内容。一般情况下为了保证兼容性,请保持数值范围在 0 到 4 之间。
# 防作弊
您可以在脚本里输入:
$ persistent.anticheat = renpy.random.randint([特殊数字一], [特殊数字二])
来防止玩家作弊,跨周目 / 设备读取存档(除非你删除了 after_load 里的对应代码)。
提示:
请手动替换[]
里的内容(包括中括号)。
等等...
把上面的都结合起来:
label ch1_start:
$ persistent.playthrough = 0
$ persistent.anticheat = renpy.random.randint(100000, 999999)
stop music fadeout 2.0
scene bg club_day with dissolve_scene_full
"今天是学园祭的第一天。"
show monika 2 at t42
m "好了,各位!我们开始准备吧!"
show sayori 4r at t43
s "耶!小饼干!"
show natsuki 2l at t41
n "要不也来尝下我的纸杯蛋糕?"
show yuri 3m at t44
y "...其实都可以了。"
$ n_aff = 0
$ s_aff = 0
menu:
"那么,我该先吃些什么呢?"
"纸杯蛋糕":
n "怎么样,是不是很好吃啊?"
$ n_aff += 1
$ s_aff -= 1
$ persistent.winner = "natsuki"
"小饼干":
s "怎么样,是不是很好吃?"
$ s_aff += 1
$ n_aff -= 1
$ persistent.winner = "sayori"
menu:
"我该先和谁交流?"
"纱世里":
s "你好啊!在文学部感觉怎么样?"
"莫妮卡":
m "嗨,有什么事吗?"
"夏树":
n "哼,看我干什么?"
"优里":
y "你好..."
mc "总之,以后也要多多关照!"
return
以上就是存档文件的基本用法,在以后的章节,我(或许)会详细地讲一下。
# 判断
在剧情里,我们或许需要判断某个角色对玩家的好感度是否满足某个条件。
Python 自带以下几个比较常用的比较表达式:
a == b
判断 a 是否等于 ba > b
判断 a 是否大于 ba < b
判断 a 是否小于 ba != b
判断 a 是否不等于b
==
和 >/<
可以连续使用:
a >= b
判断 a 是否大于或等于 ba <= b
判断 a 是否小于或等于 b
警告
以下内容牵涉到等效语句。
在 Ren'Py 文档里是这样介绍的:
为了允许 Ren'Py 能够在 Python 中脚本化,每个 Ren'Py 语句都有一条等效的 Python 语句。每条等效 Python 语句通常包含一个 Python 函数,也可能包含一个 Python 正则表达式,执行一个等效行为。
最后就是和 if
连在一起的几个判断:
elif <条件>: ...
代表如果 if 链里的以上条件均不能被满足,但这里定义的条件能够被满足,就执行某些语句。如:
if a == b: renpy.say(None, "a 等于 b。") elif a > b: renpy.say(None, "a 大于 b。")
代表如果 a 等于 b 就让旁白说:"a 等于 b";否则,如果 a 大于 b 就让旁白说:"a 大于 b"。
else: ...
代表如果 if 链里的以上条件均不能被满足,就执行某些语句。如:
if a == b: renpy.say(None, "a 等于 b。") else: renpy.say(None, "a 不等于 b。")
代表如果 a 等于 b 就让旁白说:"a 等于 b";否则就让旁白说:"a 不等于 b"。
提示
这里的 renpy.say()
等于一句对话。
elif
和 else
可以一起使用。
尝试理解并运行下面的代码:
label ch1_start:
$ persistent.playthrough = 0
$ persistent.anticheat = renpy.random.randint(1000, 0)
stop music fadeout 2.0
scene bg club_day with dissolve_scene_full
"今天是学园祭的第一天。"
show monika 2 at t42
m "好了,各位!我们开始准备吧!"
show sayori 4r at t43
s "耶!小饼干!"
show natsuki 2l at t41
n "要不也来尝下我的纸杯蛋糕?"
show yuri 3m at t44
y "...其实都可以了。"
$ n_aff = 0
$ s_aff = 0
menu:
"那么,我该先吃些什么呢?"
"纸杯蛋糕":
n "怎么样,是不是很好吃啊?"
$ n_aff += 1
$ s_aff -= 1
$ persistent.winner = "natsuki"
"小饼干":
s "怎么样,是不是很好吃?"
$ s_aff += 1
$ n_aff -= 1
$ persistent.winner = "sayori"
menu:
"我该先和谁交流?"
"纱世里":
s "你好啊!在文学部感觉怎么样?"
"莫妮卡":
m "嗨,有什么事吗?"
"夏树":
n "哼,看我干什么?"
"优里":
y "你好..."
if s_aff >= 1:
s "诶嘿嘿~"
mc "总之,以后也要多多关照!"
执行上面的代码,s_aff
大于或等于 1(在选择吃什么时选择了小饼干),在后面纱世里就会说"诶嘿嘿~",否则只会继续。
# 本章原作者
@PartyParrot359 (opens new window)