Skip to content

FAS彩蛋设计:贡献者

前言

很多软件都有自己的彩蛋文化,比如最著名的就是出现在微软Office早期部分产品的内部。这篇来自量子位投稿的视频简单讲述了彩蛋的发展史,感兴趣的朋友可以去看一看(非有偿推广)。

为了给我自己的FAS里藏一个彩蛋,我发现可以选择在4月1日愚人节之前发布。前不久我迁移了新的仓库地址,而直到愚人节前夕我的项目Contributors也只有四位,为了感谢那些一直陪伴我开发的成员(即使有些成员可能贡献较少,但仍然进行了实际付出),我决定编写一个FurryArtStudio的彩蛋代码

Public Class Artifacts
    ''' <summary>
    ''' 2026 愚人节代码
    ''' </summary>
    Public Shared Sub AprilFools2026()
        If Now.Month = 4 And Now.Day = 1 Then
            Dim giWishContent As String = "
亲爱的旅行者,「码力全开」活动祈愿现已开启,「系统构筑者·雄龙ztz(逻辑)」概率UP!
活动期间,旅行者可以在活动祈愿中获得更多开发组成员与协作资源,组建强大的研发队伍!
〓祈愿时间〓
2026年4月1日 00:00:00 — 2026年4月1日 23:59:59
〓祈愿介绍〓
● 活动期间,限定5星角色「系统构筑者·雄龙ztz(逻辑)」的祈愿获取概率将大幅提升!
● 活动期间,4星角色「特性塑形者·ra1nyxin(功能)」「潜伏协助者·element115mc(文档)」「补丁编织者·狐小九Little_Jiu(修复)」的祈愿获取概率将大幅提升!
※ 以上角色中,限定角色不会进入「奔行世间」常驻祈愿。
※ 本祈愿属于「角色活动祈愿」,「角色活动祈愿」和「角色活动祈愿-2」的祈愿次数保底完全共享,会一直共同累计在「角色活动祈愿」和「角色活动祈愿-2」中,与其他祈愿的祈愿次数保底相互独立计算,互不影响。
※ 祈愿开启期间,还将开启相应的「码力全开」角色试用活动,旅行者可以使用包含试用角色的固定阵容进入指定的'测试环境'关卡进行体验,挑战成功后即可获得对应奖励(包含'Pull Requests'、'Issues'与'Releases'等)!
※ 更多祈愿信息可点击祈愿界面左下角【详情】按钮进行查询。
"
            Dim buttonInfo As New TaskDialogButton("详情")
            Dim buttonGi As New TaskDialogButton("原神?启动!")
            Using dlg As New TaskDialog With {
            .WindowTitle = My.Resources.FurryArtStudio,
            .MainInstruction = "更新公告",
            .Content = giWishContent,
            .CustomMainIcon = Icon.FromHandle(My.Resources.Icons.RickRollQRCode.GetHicon)
            }
                dlg.Buttons.Add(buttonInfo)
                dlg.Buttons.Add(buttonGi)
                dlg.Buttons.Add(New TaskDialogButton(ButtonType.Ok))
                Dim result As TaskDialogButton = dlg.ShowDialog()
                If result Is buttonInfo Then
                    Process.Start("https://github.com/PawLaboratory/FurryArtStudio")
                End If
                If result Is buttonGi Then
                    Process.Start("https://ys.mihoyo.com/")
                End If
            End Using
        End If
        '藏着么深应该没人注意到吧, 嘻嘻
        '这段代码写的有点乱, 有空重构好了
        '测试了下二维码应该是可以扫描的, 如果扫不了得换更高DPI的显示器
        '应该没人注意到是什么
    End Sub
End Class

这是一个很有意思的函数,它可以使用Ookii.Dialogs.WinForms这个库来弹出一个任务对话框,它相比于传统的MsgBox()MessageBox.Show()要具有更多的特性:按钮自定义,图标自定义等。

接下来我会详细为各位解释一下这段代码。

实现方式

2026年愚人节彩蛋效果

如题,为了弹出一个这样的对话框,需要我们的操作系统为Windows7及以上,可以通过WindowsAPI的方式调用,但是很麻烦,Ookii Dialogs为我们提供了解决方案。Ookii Dialogs虽然不再更新了,但是它还可以使用,而且作者开发了WPF和WinForms两个版本。我们的项目是WinForms,所以在NuGet里导入这个包即可。

首先,我们从米游社找到一个原神的版本更新内容(其实下面这个文案也是社区二创,而不是官方的):

亲爱的旅行者,「穹理翊筑」活动祈愿现已开启,限定6星角色「天穹之镜·卡维(草) 」概率UP!
〓祈愿时间〓
2025/07/09  00:00~永久
〓祈愿介绍〓
●活动期间,限定6星角色「天穹之镜·卡维(草)」的祈愿获取概率将大幅提升!
●活动期间,5星角色「诲韬诤言·艾尔海森(草)」 「缄秘的裁遣·赛诺(雷)」 「浅蔚轻行·提纳里(草) 」祈愿获取概率将大幅提升!
※以上角色中,限定角色均进入「奔行世间」常驻祈愿。
※本祈愿属于「角色活动祈愿-2」,「角色活动祈愿」和「角色活动祈愿-2」的祈愿次数保底完全共享,会一直共同累计在「角色活动祈愿」和「角色活动祈愿-2」中,与其他祈愿的祈愿次数保底相互独立计算,互不影响。
※从本次「角色活动祈愿-2」起,复刻5星和全新6星角色均有可能出现在「角色活动祈愿-2」。
※祈愿开启期间,还将开启相应的「且试身手」角色试用活动,旅行者可以使用包含试用角色的固定阵容进入指定的关卡进行体验,挑战成功后即可获得对应奖励!
※更多祈愿信息可点击祈愿界面左下角【详情】按钮进行查询

然后我们去掉其余的无用信息,按照格式重新填写一套字段,比如原神的角色始终为角色称号·名称(属性),例如仙蕊玲珑·瑶瑶(草),然后我根据我的项目的贡献者,以及贡献的内容进行一个总结,并赋予他们专属称号。

@xionglongztz是我本人,也是项目主要构建者,所以我是五星角色。其余帮过我的朋友如下:

这三人都是我的亲友,刚好符合原神版本更新文案的空白处,于是我完善了文案。

剩下就是一些条件判断了,例如:If Now.Month = 4 And Now.Day = 1 Then这段代码为判断当前日期是否为愚人节。

然后就是对话框的初始化:

Using dlg As New TaskDialog With {
            .WindowTitle = My.Resources.FurryArtStudio,
            .MainInstruction = "更新公告",
            .Content = giWishContent,
            .CustomMainIcon = Icon.FromHandle(My.Resources.Icons.RickRollQRCode.GetHicon)
            }

其中:

  • WindowTitle为对话框标题,也就是软件标题
  • MainInstruction为主要操作,对应的就是蓝色文本
  • Content为正文部分,也就是文案本身的内容
  • CustomMainIcon是一个自定义图标的参数,我通过传参加了一个RickRoll的二维码

随后添加按钮与显示对话框,获得它的返回值,返回值是按钮类型,可以通过对象判断来确定我们按下的按钮,从而执行操作,比如打开原神官网或者打开项目地址。

另外你可能注意到我给这个类命名为Artifacts,它的意思是人工制品,遗物。在原神里也就是圣遗物的英文。这是一个巧合,我其实可以使用Legacy这样的词,但是我觉得这个词放在这里很有意思,因为这段代码理论上今年用过了我就再也不会使用了,我会在明年设计一个新的愚人节内容,但直接删除比较可惜,我会把它放在这个遗物类,以后如果有用户希望自己编译,还可以复现那些以前的彩蛋。

以及,各位可能还有一个没有注意的地方,当对着对话框焦点按下Ctrl+C时,可以复制对话框的全部内容:

[Window Title]
FurryArtStudio

[Main Instruction]
更新公告

[Content]

亲爱的旅行者,「码力全开」活动祈愿现已开启,「系统构筑者·雄龙ztz(逻辑)」概率UP!
活动期间,旅行者可以在活动祈愿中获得更多开发组成员与协作资源,组建强大的研发队伍!
〓祈愿时间〓
2026年4月1日 00:00:00 — 2026年4月1日 23:59:59
〓祈愿介绍〓
● 活动期间,限定5星角色「系统构筑者·雄龙ztz(逻辑)」的祈愿获取概率将大幅提升!
● 活动期间,4星角色「特性塑形者·ra1nyxin(功能)」「潜伏协助者·element115mc(文档)」「补丁编织者·狐小九Little_Jiu(修复)」的祈愿获取概率将大幅提升!
※ 以上角色中,限定角色不会进入「奔行世间」常驻祈愿。
※ 本祈愿属于「角色活动祈愿」,「角色活动祈愿」和「角色活动祈愿-2」的祈愿次数保底完全共享,会一直共同累计在「角色活动祈愿」和「角色活动祈愿-2」中,与其他祈愿的祈愿次数保底相互独立计算,互不影响。
※ 祈愿开启期间,还将开启相应的「码力全开」角色试用活动,旅行者可以使用包含试用角色的固定阵容进入指定的'测试环境'关卡进行体验,挑战成功后即可获得对应奖励(包含'Pull Requests'、'Issues'与'Releases'等)!
※ 更多祈愿信息可点击祈愿界面左下角【详情】按钮进行查询。


[详情] [原神?启动!] [确定]

这也是我使用了Windows操作系统多年才知道的冷知识,而且这是系统原生功能,下次遇到报错的时候,完全可以直接按下Ctrl+C,而不是使用OCR等外部工具识别了。

需要说明,上面复制对话框的方式,对于MsgBox()以及其他系统对话框都是有效的,但对于很多自绘对话框来说可能没有任何作用。

这里也有个我很喜欢的地方,我个人非常喜欢那些与系统集成度紧密的东西,例如我不喜欢自绘窗体或者偏离系统操作风格过大的窗体(例如某些音乐播放器,游戏启动器等应用),它不能和系统窗体保持统一的风格,甚至不能兼容操作系统的无障碍模式,这给我一种程序不好好遵守操作系统规定的感觉,甚至有些冒犯

以上就是FurryArtStudio的愚人节部分彩蛋代码全解析了,如果你感兴趣,欢迎去原始仓库查看更多细节,也非常欢迎您一键三连(Watch,Fork和Star)。