桌面宠物「宠物记事本」Skill
把爸爸的桌面宠物(C# 单文件 WinForms 桌宠)封装成可重新生成、可维护、可自包含的 skill。
当前形象:海豹(Seal) / 猫咪(Cat) / 狗狗(Dog) 三宠物,右键宠物→转盘→「切换宠物」可切换,选择框支持滚轮翻阅。
目录结构(本 skill 自包含)
pet-desktop/
SKILL.md # 本文件
build.bat # 一键重建 exe(纯 ASCII、无 BOM、无中文注释)
scripts/ # 全部源码(权威可重建副本)
*.cs # 13 个源文件(+ EmbeddedAssets.cs 由 gen_embedded.py 生成)
gen_embedded.py # 把 ../assets 里的素材包内嵌成 EmbeddedAssets.cs(相对路径,自包含)
EmbeddedAssets.cs # 自动生成,勿手改
assets/ # 素材与图标(随包分发,改图后重跑 gen 即重新内嵌)
sealy_sprite_pack_v2/ # 海豹 6 帧 _alpha.png
cat_anim_pack_v2/ # 猫 6 帧 _alpha.png
dog_anim_pack/ # 狗 4 帧 _alpha.png(01_sit/02_blink/03_sleep_a/04_sleep_b)
app.ico # 程序图标(ASCII 名,宠物记事本.ico 的副本)
> ⚠️ 日常迭代的源码权威副本在 F:\WorkBuddy\sealpet_src\(见下方「与 F 盘工作副本的关系」)。本 skill 的 scripts/ 是同一份的可重新生成封装副本,用于归档/分发;两者要保持同步。
构建(生成 exe)
方式一:一键 bat(推荐)
build.bat
输出 <skill>\pet.exe(单文件、自带图标)。bat 内部先跑 gen_embedded.py 重新生成 EmbeddedAssets.cs,再用系统 csc.exe(.NET Framework 4.x)编译。
- E:\PythonRunning\python.exe 不存在时自动回退 python;csc.exe 默认走 C:\Windows\Microsoft.NET\Framework64\v4.0.30319\csc.exe。
方式二:手动(Git Bash 沙箱内需绕过 csc 路径守卫)
E:/PythonRunning/python.exe scripts/gen_embedded.py
export MSYS_NO_PATHCONV=1
DIR=/c/Windows/Microsoft.NET/Framework64/v4.0.30319
CC="$DIR/c"sc".exe"
"$CC" /nologo /target:winexe /win32icon:assets/app.ico /out:pet.exe \
/r:System.Windows.Forms.dll /r:System.Drawing.dll /r:System.dll /r:System.Core.dll \
scripts/Assets.cs scripts/BubbleInput.cs scripts/EmbeddedAssets.cs scripts/LayeredForm.cs \
scripts/LayeredImage.cs scripts/Models.cs scripts/Native.cs scripts/PetForm.cs \
scripts/Program.cs scripts/RingMenu.cs scripts/SpeechBubble.cs scripts/TaskListForm.cs \
scripts/PetPickerForm.cs
⚠️ composite.cs 不要加进编译命令行(它依赖别的东西/已废弃)。编译需含 PetPickerForm.cs。
部署(到桌面)
交付的 exe 路径:C:\Users\25080\Desktop\办公小工具\电子宠物\宠物记事本.exe
🔴 铁律(改前必读):
1. 改 exe 前先备份旧 exe:copy 宠物记事本.exe F:\WorkBuddy\AgentTemp\pet_backup\宠物记事本_backup_<时间戳>.exe
2. 绝不要无脑覆盖桌面 exe:除非爸爸明确要求更新;覆盖前必须备份。
3. 只交付一个 exe:不维护「不裁边」等变体;单 exe 自带全部素材(内嵌 base64),无 _internal 目录。
4. 编译后用离屏验收(见下)确认无回归,再覆盖桌面 exe。
离屏验收桩(无需 GUI、可在沙箱跑)
编译出的 exe 支持隐藏参数出图,用 Python/OpenCV 量化(绝不可靠肉眼,透明背景会被读成黑):
pet.exe --render-pets <out.png> # 海豹+猫+狗 三列并排
pet.exe --render-pet <seal|cat|dog> <out.png> [action] [phase] [blink] # 单帧
pet.exe --render-petpicker <out.png> # 切换宠物选择框
pet.exe --render-sleep/-ring/-bubble/-speech/-tasklist <out.png> # 其它交互框
验收要点:用 np.fromfile(p,np.uint8)+cv2.imdecode 读中文路径;取 alpha 通道数不透明像素(狗三帧约 9860、应与海豹/猫同尺寸),确认无黑块/无重叠。
另:无参数启动 exe 进程存活 ≥4s 即 GUI 正常;最后比对 md5。
加新宠物(如再加一只)
- 把新宠物的素材包(每帧
<name>.png+<name>_alpha.png,_alpha.png是完整 RGBA)放进assets/<pack>/。 scripts/gen_embedded.py的MAPPING加 4 行((内嵌名, 包目录, *_alpha.png)),内嵌名约定xxx_sit0/1、xxx_sleep0/1。Assets.cs:enum PetKind加新值;CoreNames加 4 个名;GetFor加该宠物的选帧分支(idle=…sit0 / 眨眼=…sit1;Sleep=…sleep0/1 交替;Jump/Puff/Shout/Walk 回落 sit0/1)。Models.cs持久化解析支持新枚举值(pet.json的{"pet":N})。PetForm.csOpenPetPicker加一行PetOption(新Kind, "名字", frame.Clone())。Program.cs的--render-pet/--render-pets/--render-petpicker补新宠物(可选,方便验收)。- 跑
build.bat→ 离屏验收 → 备份并部署桌面。
已知铁律(改代码前必读,踩过的坑)
- 高分屏去模糊(DPI 感知):
Program.cs声明SetProcessDpiAwareness(2),Px/PxInv按真实 DPI 物理解码+1:1 绘制;改尺寸相关偏移/字号必须随SealSize(=180) 等比,写死像素会裁切/变粗。 - 透明窗:要透明一律用
LayeredForm真逐像素 alpha(UpdateLayeredWindow)。输入卡因承载真实 TextBox 等子控件,不能用 LayeredForm(会让子控件不显示)——输入卡用普通 Form +Region精确裁切(BuildRegion的 E=0 不外扩),白边靠描边内移解决,绝不可靠改BackColor糊弄。 - 切换宠物选择框闪退:
IsInsideAnyFloating()必须包含_petPicker,且OpenPetPicker()末尾设_lastDialogAt宽限。 - 交互框风格 = cupcake:米白卡
#FAF7F4+ 暖灰描边#CBC1BB(已加深,原#E6DDD7太淡发虚)+ 青绿主色#63C6C0;尺寸常量全走BubbleArt.UI(当前 5/3),字号走BubbleArt.UIFont=UI*0.5(字不可乘 UI 双重放大)。 - z 序:所有浮动窗提升
HWND_TOPMOST,PetForm 每秒保活。 - 沙箱出公网被 TLS 拦截:做样式预览直接发 HTML 给爸爸本地看,别在沙箱截图。
当前版本
- 桌面 exe:
C:\Users\25080\Desktop\办公小工具\电子宠物\宠物记事本.exe,md520b227adb417dd455d5c745ab5eb6010(8549888 B,2026-11-03,三宠物版)。 - 16 帧内嵌(海豹6 + 猫6 + 狗4),
pet.json存{"pet":0/1/2}。
与 F 盘工作副本的关系
- 日常改代码在
F:\WorkBuddy\sealpet_src\(记忆铁律要求源码持久于此、绝不放 AgentTemp);改完跑构建验证后部署桌面。 - 本 skill 的
scripts//assets/是该工作副本的同步封装;如需对外分发/归档,先把F:最新源码与素材同步进本 skill,再跑build.bat产出pet.exe。 - 不要只改 skill 不更新 F:,也不要只改 F: 不更新 skill——两处保持同源。