Doki Doki Mods Maker小指南

-*- 做都做了,那就做到底吧。 -*-

前言:

项目的话,在莫盘里,在贴吧原帖下我有发具体地址。

这里是Doki Doki Mods Maker,是用来做DDLC Mods的小工具
说是“Mods”,实则不然,这个是我从零仿的DDLC,使用的是Python3与Cython3语言。
因为DDLC,我才选择的计算机专业,那肯定是要“返璞归真”一下啊。当然,如果能帮助到大家那就更好了。
这篇文章,就是DDMM的操作手册,毕竟个人作品,未定义行为是比较多的,所以需要讲述正规的使用方法

我相信,根据这个小指南,是几乎不可能出错的!


目录:

我将以以下顺序缓缓道来: 重要程度
(1)、DDMM的基本操作⭐⭐⭐⭐⭐
(2)、DDMM的基础语法⭐⭐⭐⭐⭐
(3)、DDMM的特殊语法⭐⭐⭐
(4)、DDMM的用户接口⭐⭐⭐
(5)、DDMM的模式转换⭐⭐⭐⭐
(6)、DDMM的底层实现⭐⭐
(7)、DDMM的其它功能⭐⭐⭐⭐⭐
(8)、DDMM的清空内存

(9)、DDMM的案例讲解⭐⭐⭐⭐


前言:

目录:

Ⅰ、DDMM的基本操作

Ⅱ、DDMM的基础语法

【语法一】:?与?在?说? 

第一个问号,代表着说话者的名字: 

第二个问号,代表着谁出现在场景里:

第三个问号,代表现在的场景图片:

第四个问号,代表着现在说的话:

【语法二】:?是?

【语法三】:选择语句

【语法四】:音乐起停

【语法五】:出现时【可用】、消失时【建议不用】

Ⅲ、DDMM的特殊语法

【语法六】:Magic Words

【语法七】:在场人物的小规模移动

【代码八】:调用子项目,强强联合为一个强大的整体

【语法九】:修改运行走向,单行代码灌注

【语法十】:最终结局走向

Ⅳ、DDMM的用户接口

Ⅴ、DDMM的模式转换

Ⅵ、DDMM的底层实现

Ⅶ、DDMM的其它功能

Ⅷ、DDMM的清空内存

Ⅸ、DDMM的案例讲解

DDOK代码:

DDOK1代码:

后记:


Ⅰ、DDMM的基本操作

(务必小心操作,没有撤退的选项可言;多点《保存》有好处)
点击DDMM.exe,映入眼帘的是图标与启动按钮,所以万年不变的第一步就是点击《启动》按钮
之后,会出现三个按钮,从上到下分别是《以下是已创建的项目!》《DDOK》《DDOK1》
其中,第二个与第三个按钮则是我给大家的示范案例,第二个包含于第三个。
假如大家想看其中一个,那就请点击相应的按钮,点击后会发现按钮都消失了,这时候不要慌,请找到上面的《已打开的项目》,点击这里面相应的菜单即可出现文本框。
现在大家看到的就是你选择的这个项目的源程序了,之后再点击上面《<运行>》里面的《以上全部》,即可进入游戏。
(为什么是以上全部?因为在新设备上需要重新编译来重新确定路径)
进入游戏后就点击开始游戏了,但需要提醒的是,本DDLC支持中文命名了,打错名字可以点击BackSpace键撤回,点Enter键也可以进入游戏。
-*- -*- -*- 等待大家看完后 -*- -*- -*-
看完后就可以退出游戏了,毕竟等待我们的则是属于自己的新邂逅。
关键来了,我们想要打开新项目(非切换已有项目),必须先点击上面《<文件>》的《关闭项目》,这时候你会发现之前的按钮都回来了;以此类推。
这时候就要建立属于自己的项目了,请点击上面《<文件>》的《新建项目》,选择一个地方来承载这美好的开始(建议选择DDMM根文件夹自带的project文件夹,方便管理嘛)
名字嘛,建议一锤定音,尽挥洒,填入自己深思熟虑的项目名。
这时候,故技重施嘛 —— 点击后会发现按钮都消失了,请找到上面的《已打开的项目》,点击这里面相应的菜单即可出现文本框。
看到文本框,就代表着你已经学会了五分之一了,真棒。
累了的话,点击退出即可,无论是里面的《退出》,还是《x》都可以的。
修改了的话,别忘了点《保存》哦
后面回来了,就是故技重施啊。


Ⅱ、DDMM的基础语法

(都是中文的程序语言,简单简单;连标点符号都是中文的呀)
进入了文本框,就来到了语法的世界了。

【语法一】:?与?在?说? 

这是最基本的语法,代表着一个场景的发生。

第一个问号,代表着说话者的名字: 

    名字嘛,都可以的。如纱世里也好,Monika也好,夏树也好,Yuri也好,MC也好,甚至蔡徐坤也行;中英文没限制、大小写没限制
    特殊之处的话:
        (1)、特定的名字有特定的字体颜色与对话框颜色,就如:Natsuki(大小写无限制)和夏树都会被自动的变为粉色,对话框也会变化(出自Salvation);
            现在有特定颜色就五个人,分别是莫妮卡、纱世里、夏树、尤里和纱妮卡(Sayonika 出自其它Mod)。
        (2)、有一种场景,是自言自语的,为了适应这种场景,可以写?来表示这种情况,此时就是说话框还在,但名字框就没了。

第二个问号,代表着谁出现在场景里:

一个人的话直接写就行了,多个人的话中间要以、分开。
这里面又有【三】个小语法。不急不急,先给大家普及一下DDLC原版放置人物图片的【三】种操作
    (1)、人物头像+人物下左半身+人物下右半身
    (2)、人物头像+人物下半身
    (3)、人物立绘
所以,这【三】个小语法就对应着这三种情况。
这时候请点击DDMM上面的《<帮助>》里面的《快捷词-人物》,这时会出现一个小窗口,里面每个图片左下角的编号就是每个图片的编号。
所以说,这三个小语法分别是(这里的人物名字只能是中文)

  (1)、人物头像编号+人物下左半身编号+人物下右半身编号+人物名字
  (2)、人物头像编号+人物下半身编号+人物名字
  (3)、人物立绘编号+人物名字

就比如

a+1l+2r+莫妮卡
2th+3+夏树、d2+3+尤里
3c+纱世里、b+2l+1r+莫妮卡、d2+3+尤里
3e+纱妮卡

因为是算法自动根据出现的人物数量规划空间,所以尽量不要同时放超过五个人,因为这样她们会互相重叠。
当然,人物这里也可以用?所代替,这时候代表着人物图片不刷新【可以与第三个问号联用达到特定效果】

第三个问号,代表现在的场景图片:

就和人物一样,场景图片(背景图片)也有对应的编号。
请点击DDMM上面的《<帮助>》里面的《快捷词-背景》,这时会出现一个小窗口,里面每个图片上面的快捷词就是每个图片的编号。
如大家所见,CG也算背景,同时我也把Salvation里面的一些图片拿进来了
一个场景只能有一个背景图片,所以直接写背景图片对应的关键词即可。
当然,背景这里也可以用?所代替,这时候代表着背景图片不刷新【可以与第二个问号联用达到特定效果】

第四个问号,代表着现在说的话:

这就没什么好说的了。
这里也可以用?所代替,这时候无论是对话框还是名字框都会消失【请区分于第一个问号】

四个问号灵活运用,会出现很多神奇的效果。


就比如吧:

Monika与a+1l+2r+莫妮卡在文学部说 你好!欢迎来到DDMM!
?与e+1l+1r+纱世里在文学部说
?与?在文学部说 这是自言自语。

 



【语法二】:?是?


上面的尤其是第二个来说,是不是每次写那么多字母会很麻烦?
这个时候,我们就可以给她们起别名了。
如:

微笑校服的老莫是a+1l+1r+莫妮卡
害羞的私服小夏是p+1bl+1br+夏树
害羞的私服尤里是e2+3b+尤里
嘟嘴的纱纱是3d+纱世里

当然,也可以多定义

害羞的两人是p+1bl+1br+夏树、e2+3b+尤里

......
值得注意的是,这个语句是全文语句+简单替换,也就是说,只要符合《是》左边定义的,就是单纯的替换,所以写的时候最好把别名写长点,难以有重名为好。
多说一句,无论在哪里起名,最好避免《与》《在》《说》此三字的出现,毕竟是关键字。

就比如吧:

害羞的两人是p+1bl+1br+夏树、e2+3b+尤里

?与害羞的两人在cafe说


【语法三】:选择语句


因为我们肯定是需要有分支的,所以我加了选择语句。
选择语句的基本模式是:

选择有【几】 【大标题】
1、【选择1描述】
【可以多个语句】
2、【选择2描述】
【可以多个语句】
【......以此类推......】
选择结束

其中值得注意的是
    (1)、【几】,是个位阿拉伯数字,所代表的是下面有几个分支
    (2)、【大标题】,这个大标题是给我们编码的人看的,游戏中不会显示出来,所以建议不写,直接空着就行
    (3)、每个分支前面的数字都是阿拉伯数字,之后都是中文的顿号
    (4)、【选择描述】,就是会呈现在屏幕上的文字
    (5)、一定要写最后的 选择结束
    (6)、不允许分支嵌套分支,也就是说,不允许选择里面写选择
例如

选择有4
1、莫妮卡
Monika与b+1l+1r+莫妮卡在文学部说 好耶,你终于看到我了!
Monika与confess+莫妮卡在文学部说 谢谢你!我爱你!
2、纱世里
Sayori与3a+纱世里在文学部说 好耶我就知道,话说。。
Sayori与3b+纱世里在文学部说 能先陪我去买点面包吗?
3、夏树
Natsuki与2bt+1l+1r+夏树在文学部说 我,我才没有想和你回家呢!
4、尤里
Yuri与d+2l+2r+尤里在文学部说 嗯,先陪我去一趟书店吧!
选择结束

还有就是,在每次选择前,都需要让玩家知道选择什么啊。 

那么,如果我们需要统计每次不同的选择来达成结局分支呢?这属于特殊语法,之后再讲。


就比如:就拿Monika线举例子吧

?与b+1l+1r+莫妮卡、a+1l+1r+纱世里、a+1l+2r+夏树、a+1l+1r+尤里在文学部说 我究竟回家呢?

选择有4
1、莫妮卡
Monika与b+1l+1r+莫妮卡在文学部说 好耶,你终于看到我了!
Monika与confess+莫妮卡在文学部说 谢谢你!我爱你!
2、纱世里
Sayori与3a+纱世里在文学部说 好耶我就知道,话说。。
Sayori与3b+纱世里在文学部说 能先陪我去买点面包吗?
3、夏树
Natsuki与2bt+1l+1r+夏树在文学部说 我,我才没有想和你回家呢!
4、尤里
Yuri与d+2l+2r+尤里在文学部说 嗯,先陪我去一趟书店吧!
选择结束

 


【语法四】:音乐起停


请点击DDMM上面的《<帮助>》里面的《快捷词-音乐》,这时会出现一个小窗口,里面是一个小小的播放器,里面所对应的名字就是歌的快捷词。
可以试听,听完记得暂停关闭。
如:

音乐起早上好
【一些代码后】
音乐停

还有特殊的是:
如果在歌曲名前面加*,会变成音效来播放。
如:

音乐起*select

区别是,背景音乐一次只能播放一个,但音效可以一次播放多个。


【语法五】:出现时【可用】、消失时【建议不用】


简单地说,就是场景转换
仅仅是支持以下:
    (1)、黑、白、粉、绿、蓝、黄、紫、红、橙,9种颜色互转
    (2)、浮现
如:

出现时黑转白
【一些代码后】
出现时粉转蓝
【一些代码后】
出现时浮现

这个的话,仁者见仁智者见智吧,我自己也就是用用《出现时浮现》,仅此而已。


Ⅲ、DDMM的特殊语法

(奇妙的语法,为程序添彩)
倘若前五个都是白魔法,那么,下面便是黑魔法的世界。


【语法六】:Magic Words


Magic Words,顾名思义是魔法词,它可以嵌入代码里,它可以映射到现实,是为Meta元素爱好者举办的盛宴。
当然,里面也有我们需要常用的。
魔法词的语法规则是:需要被
中文书名号包裹着。
有以下几个:

《年》
《月》
《日》
《时》
《分》
《秒》
《玩家名》
《用户名》
《主机名》
《IP地址》
《?-?》

值得注意的有:
(1)大家常用的可能也就是:《玩家名》,就是我们在游戏里输入的。
(2)《用户名》,是电脑的用户的名字,理论上原版DDLC就是获取的这个。
(3)《主机名》,就是这台电脑的名字,我的电脑主机名是我的名字,反而电脑名不是。
(4)《?-?》,这两个问号都代表着数字,表示这里在运行时会嵌入随机数字,这个数字的区间是?-?。
举例子:

莫妮卡与confess+莫妮卡在文学部说 其实,你在现实生活中是叫《用户名》吧?
《玩家名》与confess+莫妮卡在文学部说 NoNoNo,其实我叫《主机名》。

【语法七】:在场人物的小规模移动


为了使人物表达更加生动形象,就添加了人物的小规模移动,暂仅支持上下
很简单,举个例子就懂了。
例子1:

*2Natsuki与2bt+1l+1r+夏树在文学部说 我,我才没有想和你回家呢!

*2代表的就是让人物下移,如果下一幕没有继续添加*2的话,人物自动上移回复原位置
例子2:

*1Monika与b+1l+1r+莫妮卡在文学部说 好耶,你终于看到我了!

只能添加在《与...在...说》语句的最前面。
*1代表的就是让人物上移,如果下一幕没有继续添加*1的话,人物自动下移回复原位置

(这些自动上下移来回复的,我可能之后会修改,但文章里没有修改说辞)

注意:场上的所有角色都会被影响!


【代码八】:调用子项目,强强联合为一个强大的整体


就是假设你有点小小的强迫,就是必须分篇分块来写程序,那么就可以使用这个。
之前给大家的演示,就是DDOK调用了DDOK1的程序
语法规则就是:

调用【子项目名】

例如在DDOK出现的:

调用DDOK1

【语法九】:修改运行走向,单行代码灌注


这个是给有Python基础的用户准备的,我提供了一些接口,可以在运行时改变程序走向。
相关原代码如下:

def exec(Screen self, str code) -> NoReturn:
    cdef object this = self.screen
    exec(code, globals(), {
        "screen": this,
        "image": '/'.join([basepath, "game", "images", "{}.png"]),
        "basepath": basepath,
        "font": "/".join([basepath, "game", "fonts", "{}.TTF"]),
        "monika": '/'.join([basepath, "game", "images", "monika", "{}.png"]),
        "sayori": '/'.join([basepath, "game", "images", "sayori", "{}.png"]),
        "natsuki": '/'.join([basepath, "game", "images", "natsuki", "{}.png"]),
        "yuri": '/'.join([basepath, "game", "images", "yuri", "{}.png"])
    })


所以说,我们可以就可以利用这些接口,包括pygame。
如:
(1)在屏幕原点上放置一张图片pic1.png,这张图片你放在了game/images/other/:

screen.blit(pygame.image.load('/'.join([basepath, "game", "images", "other", "pic1.png"])).convert_alpha(), (0, 0))

(2)让屏幕刷新为黑:

screen.fill((0, 0, 0))


......

当然,以上这些需要配合一些语法来使用。
其实用的不多,有些需求完全可以被一些语法所代替。



【语法十】:最终结局走向


这个语法的模式是绝对固定的。

并且,必须是之前有多个分支才能使用(至少两个分支)
就是:

选择有【几】 历史选择
1、【之前的选择顺序,下标从0开始,中间以+相连】
......
2、【之前的选择顺序,下标从0开始,中间以+相连】
......
......

给大家举一个“计算器”例子,如下: (就走一条线举例)

微笑的莫妮卡是a+1l+1r+莫妮卡

莫妮卡与微笑的莫妮卡在文学部说 MC,你先从下面选一个数字。
选择有2
1、我选3
莫妮卡与微笑的莫妮卡在文学部说 好的,第一个数你选的是3
2、我选6
莫妮卡与微笑的莫妮卡在文学部说 好的,第一个数你选的是6
选择结束

莫妮卡与微笑的莫妮卡在文学部说 MC,你再从下面选一个数字吧。
选择有2
1、我选1
莫妮卡与微笑的莫妮卡在文学部说 好的,第二个数你选的是1
2、我选5
莫妮卡与微笑的莫妮卡在文学部说 好的,第二个数你选的是5
选择结束

选择有4 历史选择
1、0+0
莫妮卡与微笑的莫妮卡在文学部说 答案是4!
2、0+1
莫妮卡与微笑的莫妮卡在文学部说 答案是8!
3、1+0
莫妮卡与微笑的莫妮卡在文学部说 答案是7!
4、1+1
莫妮卡与微笑的莫妮卡在文学部说 答案是11!
选择结束

 


Ⅳ、DDMM的用户接口

(放置自己的图片,大胆创造自己的故事)
点开DDMM的根文件夹,就是DDMM.exe的那个文件夹,是不是有个文件夹叫mod?
点进去,是不是里面又分为bgm与photo两个文件夹
对的,放进去的音乐可以直接被识别到,图片亦然。
那怎么用呢?
我在mod/bgm下放置了一个叫做DaisyMo.mp3的音乐,就拿这个演示:

音乐起DaisyMo.mp3

即可。
图片也是,都是必须写上后缀名的。
对于图片,我需要多说几句,
原DDLC的背景图片的规格是1280x720,人物图片的规格是960x960的。
所以建议大家如果需要的话,最好把自己的图片变成这两种规格。


Ⅴ、DDMM的模式转换

(工作台和游戏的转换)
点开DDMM的根文件夹,就是DDMM.exe的那个文件夹,是不是有个文件叫启动.txt
是的,如果大家想把这个DDMM变成一个游戏Mod发出去,直接在启动.txt里写上自己的项目名就行了,再点进去发现就是游戏了;
反之,把里面的文本都清空,就变成了工作台。

例如假设将我的DDOK项目变成游戏,直接在启动.txt里写上DDOK即可。


Ⅵ、DDMM的底层实现

(就姑且讲一讲实现吧,对下一部分起到承接作用)
本项目用的是Python3 + Cython3。
Python3是主语言;Cython3是Python的C语言拓展,属于Python的超集语言。
所以我使用静态编译来把这个项目分成了三大动态链接库。
分别是screen.pydwindow.pydparser.pyd

screen.pyd是游戏的实现;
window.pyd是编码环境的实现;
parser.pyd是语法解析器的实现。

其中,
对于screen,主要用pygame实现的;pygame是renpy的底层的一部分。
对于window,主要用tkinter实现的。
对于parser,主要用正则式实现的。

其实我最想说的是基础的数据结构,就是json里面的数据结构。
它有多种形态,通过适配器转换。

在window.pyd,原型如下:

cdef dict[str, object] proj_json = {
    "proj": proj_name,
    "backup": '/'.join([basepath, "game", "project", os_path.basename(proj_name)]),
    "file": proj_name.replace(".json", ".py"),
    "path": '/'.join(proj_name.split('/')[:-1]),
    "obj" : proj_name.replace(".json", ".pkl"),
    "script": [],
    "icon": "",
    "action text": "",
    "message back": "",
}

其中:

proj   - 项目选择的json文件路径
backup - 项目的备用路径
file   - 用于编码保存的文件
path   - 项目选择的保存路径
obj    - 是废弃的项目文件格式的路径
script - 是剧本,单独的数据结构
icon   - 图标文件路径
action text  - 就是开场会出现的那句话
message back - 是最基础的对话框(区别于每个角色的独特对话框)

在screen.pyd,原型如下:

self.setup = {
    "title": "Doki Doki Literature Club",
    "icon":  '/'.join([basepath, "game", "icon.png"]),
    "action text": "Welcome To Doki Doki Literature Club",
    "message back": '/'.join([basepath, "game", "images", "other", "talk_bar.png"]),
    "player name": "",
    "script": []
}

其中: 

title - 游戏名字
icon  - 游戏图标
action text  - 就是开场会出现的那句话
message back - 是最基础的对话框(区别于每个角色的独特对话框)
player name  - 玩家名字,对应Magic Words的《玩家名》
script - 和上面的一样

而在parser.pyd里,也就是script的数据结构,则是:

cdef dict[str, object] dt = {
    "who": None,
    "where": None,
    "say": {
        "name": None,
        "text": None
    },
    "bgm": None,
    "show": None,
    "if": {
        "ok": None,
        "title": None,
        "select num": None,
        "selects": None,
        "select": None,
        "if": None
    },
    "magic": 0,
    "python": '',
    "wsad": ''
}

其中:

who    - 谁出现在屏幕上
where  - 场景图片
say    - name: 说话者的名字
         text: 说的话
bgm    - 要播放的背景音乐
show   - 转场方式
if     - ok: 是否有支线
         title: 支线的描述,就是供编码者看的
         select num: 有几个支线选择
         selects: 支线的选项
         select: 我的支线选择
         if: 支线剧情
magic  - 出现的魔法词
python - 出现的代码
wsad   - 人物小移动

⭐所以说,只要符合这些形式,就可以被游戏所读取,也就是有特殊想法的用户可以根据这个数据结构自创编码环境。
⭐但是,我们最终的游戏模式,是每次都需要现场编译的,因为如果要发给别人的话,本来json里面存储的静态数据就用不了了。
⭐所以,.py文件实质上比.json文件重要;在工作模式,都是读取py文件;在游戏模式,也是读取py文件;.json文件就是个中间文件。


Ⅶ、DDMM的其它功能

(有些小按钮还未被提及)
在《<文件>》里:
    《打开项目》:建议弃用,因为主界面已经有加载项目的按钮了,点这个很可能有未知的bug。

在《<帮助>》里:
    《查看结构》:在打开一个项目后,点击查看结构,可以看见上述所说的数据结构,用以排查错误,以及预测运行状态。
    《添加开场语》:就是开场会出现的那句话,大家有特殊需求可以修改。

在《<运行>》里:
    《保存》:第一步,就是保存代码,一定要勤点!!!真的!!!
    《解析》:第二步,就是把代码转换成数据结构,使之可以被screen识别。会检测一定的错误,检测出错误会出现弹框,然后请改正;没有弹框一般是对了。
    《测试》:第三步,如果点前两步都没动静,那就可以点这个了,运行游戏mod。
    《以上全部》:类似于依次点《保存》-《解析》-《测试》。不建议用,因为一旦前面的一步有错误,那就不可预知了。

在《已打开的项目》里:
    建议:要先关闭当前项目,再切换项目!

在游戏里:

    Tab键 -> 返回最近上次的选择点的前一幕。


Ⅷ、DDMM的清空内存

随着项目与存档的不断增多,有可能DDMM可能会占不必要的内存,这时候就要手动管理存档了。
请大家来到game/save这个文件夹里,里面就是每个项目所对应的存档点。
里面的不同编号对应的不同的存档点。
有需求清空即可。 


Ⅸ、DDMM的案例讲解

主要就是DDOK1与DDOK的代码讲解。

DDOK代码:

# -*- coding: utf-8 -*-   讲解:井号之后的都是注释,注释就是不会被识别的东西
# -*- proj: DDOK -*-

微笑说话的纱妮卡是3b+纱妮卡

音乐起8

*1Sayonika与3b+纱妮卡在morningclub说 大家好,我是纱妮卡,就让我来为大家介绍一下我们的文学部...
Sayori与p+2l+2r+纱世里、3e+纱妮卡在morningclub说 停停停!!!
*1Sayori与3a+纱世里在morningclub说 我还没点录像!
Sayori与3b+纱世里在morningclub说 哎嘿嘿。
Sayonika与c+1+纱妮卡在morningclub说 啊,好尴尬啊。
?与?在morningclub说 就这样,两个人慌慌张张地录了一上午。  #这里的两个问号的配合,
                                                        #形成的效果是:自述
?与?在morningclub说         #这里的最后是没有文字的,说明对话框消失,为后来的场景转换做铺垫
音乐起6
出现时浮现

Sayori与m+1l+2r+纱世里、a+1+纱妮卡在文学部说 啊,已经到中午了,要不然我们去吃点饭吧!
Sayonika与a+1l+1r+纱世里、b+2+纱妮卡在文学部说 好啊,最近新开了一家咖啡厅呢,我们去看看吧!
Sayori与r+2l+2r+纱世里、3a+纱妮卡在文学部说 好啊!
*1Sayori与r+2l+2r+纱世里在文学部说 Go Go Go!

?与?在文学部说        #这里的最后是没有文字的,说明对话框消失,为后来的场景转换做铺垫

出现时浮现
音乐起*dooropen
Sayonika与q+2l+1r+纱世里、e+2+纱妮卡在cafe说 就是这家了。
?与?在cafe说 放眼望去,好像看到了熟悉的身影。
音乐起natsuki
*1Sayori与s+2l+2r+纱世里在cafe说 夏树!
Sayori与s+2l+2r+纱世里在cafe说 怎么看见你在这摸鱼!
Natuski与p+1bl+2br+夏树、q+2l+2r+纱世里在cafe说 我我我
Natuski与v+1bl+1br+夏树、q+2l+2r+纱世里在cafe说 我才没有摸鱼呢!
Sayonika与o+1bl+1br+夏树、e+2+纱妮卡在cafe说 夏树真的好可爱!
*2Natuski与v+1bl+1br+夏树在cafe说 我才不可爱呢!
?与?在cafe说 真是美好的下午。
?与?在cafe说 饱餐一顿,就要回到文学部了。

?与?在cafe说        #这里的最后是没有文字的,说明对话框消失,为后来的场景转换做铺垫

出现时浮现
?与?在courtyard说    #这里的最后是没有文字的,说明对话框消失,为后来的场景转换做铺垫,但显示当前背景
出现时浮现
?与?在学校走廊说
?与?在文学部说 就这样又过了一个下午。
?与?在文学部说 但在上午的时候,那一边做了什么呢?

调用DDOK1    #联合DDOK1的剧情。

DDOK1代码:

# -*- coding: utf-8 -*-
# -*- proj: DDOK1 -*-

发呆的尤里是e+1l+1r+尤里

音乐起8

?与发呆的尤里、lam5+莫妮卡在mall_exterior_day说?
Monika与发呆的尤里、lam2+莫妮卡在mall_exterior_day说 一个小时了,夏树那小子怎么还不来。。
Monika与发呆的尤里、lam3+莫妮卡在mall_exterior_day说 你说对不对,尤里?
?与发呆的尤里、lam6+莫妮卡在mall_exterior_day说?
Monika与发呆的尤里、l+1l+2r+莫妮卡在mall_exterior_day说 哈哈哈尤里。
Yuri与d2+3+尤里、l+1l+2r+莫妮卡在mall_exterior_day说 我是不是错过了什么?!
Yuri与c2+3+尤里、l+1l+2r+莫妮卡在mall_exterior_day说 。
Yuri与c2+3+尤里、l+1l+2r+莫妮卡在mall_exterior_day说 。。
Yuri与c2+3+尤里、l+1l+2r+莫妮卡在mall_exterior_day说 。。。
?与?在mall_exterior_day说

出现时浮现
?与?在mall_interior说 这个时候的夏树。
Natsuki与f+1l+1r+夏树在mall_interior说 莫妮卡和尤里那两个小子。
Natsuki与w+1l+2r+夏树在mall_interior说 居然整整迟到了一个小时!
Natsuki与h+2l+1r+夏树在mall_interior说 那我该怎么办呢?

选择有3
1、去附近的咖啡店摸会鱼
Natsuki与d+1l+2r+夏树在mall_interior说 真是个好主意!
2、去商场外找她们
Natsuki与c+2l+1r+夏树在mall_interior说 感觉有点小累了。
3、不知道啊!
选择结束

Natsuki与d+1l+2r+夏树在mall_interior说 那我姑且去咖啡厅坐着继续等吧!

?与?在mall_interior说

出现时浮现
?与?在cafe说
Natsuki与d+1l+1r+夏树在cafe说 一时摸鱼一时爽,一直摸鱼一直爽啊!
Natsuki与m+2l+1r+夏树在cafe说 等等。。。
Natsuki与p+1l+1r+夏树在cafe说 那个身影不是纱世里吗?

后记:

可惜的就是给我的自由时间不多,因为我回校之后要考非常多的证书和竞赛一个接一个,所以抽出这十多天的时间已经是一笔非常多的自由时间了。
正因为时间不是很多,所以只能做到这种程度了。我相信写个简简单单的mod是完全没问题的。
写的这个小工具,确实是让我学到了不少东西,也让我挑战了自己的小技术的极限。
还请多多理解。
这段时间也是我比较开心的时间,因为没有被任何功利的事务所烦恼。
我非常珍惜这段时间。
如果有人用的话,我也会根据反馈来更新程序。

如果之后还有大规模的自由时间的话,我是想更新一下游戏技术,可能以后就不用pygame来写东西了(pygame的限制太多了,想写个人视觉小说的话还是用renpy吧)。


ALL OVER
window.pyd: 800+ Line
screen.pyd: 2000+ Line
parser.pyd: 600+ Line
from 2025.01.19 to 2025.02.01

DDMM END


我们的色彩永远留在彼此的花园里

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/963075.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

nodejs:express + js-mdict 网页查询英汉词典

向 DeepSeek R1 提问&#xff1a; 我想写一个Web 前端网页&#xff0c;后台用 nodejs js-mdict, 实现在线查询英语单词 1. 项目结构 首先&#xff0c;创建一个项目目录&#xff0c;结构如下&#xff1a; mydict-app/ ├── public/ │ ├── index.html │ ├── st…

LabVIEW纤维集合体微电流测试仪

LabVIEW开发纤维集合体微电流测试仪。该设备精确测量纤维材料在特定电压下的电流变化&#xff0c;以分析纤维的结构、老化及回潮率等属性&#xff0c;对于纤维材料的科学研究及质量控制具有重要意义。 ​ 项目背景 在纤维材料的研究与应用中&#xff0c;电学性能是评估其性能…

dfs枚举问题

碎碎念&#xff1a;要开始刷算法题备战蓝桥杯了&#xff0c;一切的开头一定是dfs 定义 枚举问题就是咱数学上学到的&#xff0c;从n个数里面选m个数&#xff0c;有三种题型(来自Acwing) 从 1∼n 这 n个整数中随机选取任意多个&#xff0c;输出所有可能的选择方案。 把 1∼n这…

SOME/IP--协议英文原文讲解3

前言 SOME/IP协议越来越多的用于汽车电子行业中&#xff0c;关于协议详细完全的中文资料却没有&#xff0c;所以我将结合工作经验并对照英文原版协议做一系列的文章。基本分三大块&#xff1a; 1. SOME/IP协议讲解 2. SOME/IP-SD协议讲解 3. python/C举例调试讲解 Note: Thi…

leetcode——二叉树的中序遍历(java)

给定一个二叉树的根节点 root &#xff0c;返回 它的 中序 遍历 。 示例 1&#xff1a; 输入&#xff1a;root [1,null,2,3] 输出&#xff1a;[1,3,2] 示例 2&#xff1a; 输入&#xff1a;root [] 输出&#xff1a;[] 示例 3&#xff1a; 输入&#xff1a;root [1] 输出…

91,【7】 攻防世界 web fileclude

进入靶场 <?php // 包含 flag.php 文件 include("flag.php");// 以高亮语法显示当前文件&#xff08;即包含这段代码的 PHP 文件&#xff09;的内容 // 方便查看当前代码结构和逻辑&#xff0c;常用于调试或给解题者提示代码信息 highlight_file(__FILE__);// 检…

Microsoft Power BI:融合 AI 的文本分析

Microsoft Power BI 是微软推出的一款功能强大的商业智能工具&#xff0c;旨在帮助用户从各种数据源中提取、分析和可视化数据&#xff0c;以支持业务决策和洞察。以下是关于 Power BI 的深度介绍&#xff1a; 1. 核心功能与特点 Power BI 提供了全面的数据分析和可视化功能&…

海外问卷调查,最常用到的渠道查有什么特殊之处

市场调研&#xff0c;包含市场调查和市场研究两个步骤&#xff0c;是企业和机构根据经营方向而做出的决策问题&#xff0c;最终通过海外问卷调查中的渠道查&#xff0c;来系统地设计、收集、记录、整理、分析、研究市场反馈的工作流程。 市场调研的工作流程包括&#xff1a;确…

《苍穹外卖》项目学习记录-Day10来单提醒

type&#xff1a;用来标识消息的类型&#xff0c;比如说type1表示来单提醒&#xff0c;type2表示客户催单。 orderId&#xff1a;表示订单id&#xff0c;因为不管是来单提醒还是客户催单&#xff0c;这一次提醒都对应一个订单。是用户下了某个单或者催促某个订单&#xff0c;这…

【全栈】SprintBoot+vue3迷你商城(10)

【全栈】SprintBootvue3迷你商城&#xff08;10&#xff09; 往期的文章都在这里啦&#xff0c;大家有兴趣可以看一下 后端部分&#xff1a; 【全栈】SprintBootvue3迷你商城&#xff08;1&#xff09; 【全栈】SprintBootvue3迷你商城&#xff08;2&#xff09; 【全栈】Sp…

【Numpy核心编程攻略:Python数据处理、分析详解与科学计算】1.27 线性代数王国:矩阵分解实战指南

1.27 线性代数王国&#xff1a;矩阵分解实战指南 #mermaid-svg-JWrp2JAP9qkdS2A7 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-JWrp2JAP9qkdS2A7 .error-icon{fill:#552222;}#mermaid-svg-JWrp2JAP9qkdS2A7 .erro…

【愚公系列】《循序渐进Vue.js 3.x前端开发实践》030-自定义组件的插槽Mixin

标题详情作者简介愚公搬代码头衔华为云特约编辑&#xff0c;华为云云享专家&#xff0c;华为开发者专家&#xff0c;华为产品云测专家&#xff0c;CSDN博客专家&#xff0c;CSDN商业化专家&#xff0c;阿里云专家博主&#xff0c;阿里云签约作者&#xff0c;腾讯云优秀博主&…

langchain 实现多智能体多轮对话

这里写目录标题 工具定义模型选择graph节点函数定义graph 运行 工具定义 import random from typing import Annotated, Literalfrom langchain_core.tools import tool from langchain_core.tools.base import InjectedToolCallId from langgraph.prebuilt import InjectedSt…

pytorch生成对抗网络

人工智能例子汇总&#xff1a;AI常见的算法和例子-CSDN博客 生成对抗网络&#xff08;GAN&#xff0c;Generative Adversarial Network&#xff09;是一种深度学习模型&#xff0c;由两个神经网络组成&#xff1a;生成器&#xff08;Generator&#xff09;和判别器&#xff0…

ui-automator定位官网文档下载及使用

一、ui-automator定位官网文档简介及下载 AndroidUiAutomator&#xff1a;移动端特有的定位方式&#xff0c;uiautomator是java实现的&#xff0c;定位类型必须写成java类型 官方地址&#xff1a;https://developer.android.com/training/testing/ui-automator.html#ui-autom…

RabbitMQ持久化队列配置修改问题

文章目录 1.问题产生2.问题解决1.询问gpt2.独立思考 1.问题产生 我在给一个普通队列去绑定死信交换机和死信队列的时候&#xff0c;发现总是报错x-dead-letter-exchange的属性为none ERROR [PFTID:] [Module:defaultModule] org.springframework.amqp.rabbit.connection.Cach…

MySQL常用数据类型和表的操作

文章目录 (一)常用数据类型1.数值类2.字符串类型3.二进制类型4.日期类型 (二)表的操作1查看指定库中所有表2.创建表3.查看表结构和查看表的创建语句4.修改表5.删除表 (三)总代码 (一)常用数据类型 1.数值类 BIT([M]) 大小:bit M表示每个数的位数&#xff0c;取值范围为1~64,若…

OpenCV:图像轮廓

目录 简述 1. 什么是图像轮廓&#xff1f; 2. 查找图像轮廓 2.1 接口定义 2.2 参数说明 2.3 代码示例 2.4 运行结果 3. 绘制图像轮廓 3.1 接口定义 3.2 参数说明 3.3 代码示例 3.4 运行结果 4. 计算轮廓周长 5. 计算轮廓面积 6. 示例&#xff1a;计算图像轮廓的面…

C++哈希(链地址法)(二)详解

文章目录 1.开放地址法1.1key不能取模的问题1.1.1将字符串转为整型1.1.2将日期类转为整型 2.哈希函数2.1乘法散列法&#xff08;了解&#xff09;2.2全域散列法&#xff08;了解&#xff09; 3.处理哈希冲突3.1线性探测&#xff08;挨着找&#xff09;3.2二次探测&#xff08;跳…

记6(人工神经网络

目录 1、M-P神经元2、感知机3、Delta法则4、前馈型神经网络&#xff08;Feedforward Neural Networks&#xff09;5、鸢尾花数据集——单层前馈型神经网络&#xff1a;6、多层神经网络&#xff1a;增加隐含层7、实现异或运算&#xff08;01、10为1,00、11为0&#xff09;8、线性…