27 Commits
v0.0.6 ... dev

Author SHA1 Message Date
b8a458223c feat: 深度重写第1-2章剧情,版本号升至dev0.1.0.0
第1章优化:新增2个玩家选择、修正POV叙述标记、精炼开篇与结尾语言
第2章重写:修复13天空白过渡、扩展比赛场景、完善角色支线
新增背景与立绘素材

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-17 00:41:32 +08:00
6c65eafa32 Add review reports for Chapter 1, Chapter 2, and Chapter 2-Side; include image assets and logic checks
- Created Chapter1-review.md with syntax, character definitions, and dialogue checks.
- Created Chapter2-review.md with syntax, missing images, and logic errors.
- Created Chapter2-Side-review.md addressing syntax, character definitions, and dialogue issues.
- Added SUMMARY.md to summarize review findings and highlight critical issues.
- Included new image assets for xiaowei and backup files.
- Identified and documented several logic errors and suggestions for code cleanup across chapters.
2026-04-26 13:32:11 +08:00
eb38af6045 feat: 新的版本号 2026-03-04 23:29:56 +08:00
d602d3afe9 fix: 修正新照片显示时间 2026-03-04 23:21:57 +08:00
8cc7e2ebbc fix: 背景音乐fadein时间减少 2026-03-04 23:19:34 +08:00
673b0882ea feat: 新增清除数据按钮 2026-03-04 23:01:16 +08:00
e00c084e61 fix: 用 Function(renpy.show_screen) 替换 ShowScreen
Ren'Py 8.5.2 中 ShowScreen 不在 py_eval globals 内,
改用 renpy.show_screen 经 Function 包装的方式调用:
- gallery_panel 花朵按钮 → Function(renpy.show_screen, "yitao_gallery")
- yitao_gallery 卡片按钮 → Function(renpy.show_screen, "gallery_detail", photo=photo)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-04 22:01:34 +08:00
591d10a5cc fix: 修正 add 语句不支持 xfill/yfill/xmaximum 的错误
Ren'Py add 语句不接受 xfill、yfill、xmaximum、ymaximum,
改用 xsize/ysize 显式指定尺寸:
- icon_gallery: xsize 112, ysize 112
- 照片卡片: xsize 425, ysize 567
- 详情页图片: xsize 960, ysize 1008

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-04 21:57:25 +08:00
dce1aaf9b2 feat: 实现 YITAO-REN GALLERY 画廊功能
- 新增 game/images/gallery/ 目录(5 张处理过的图片资源)
  · icon_gallery.png(花朵图标,256x256)
  · photo_pearl.png / photo_monalisa.jpg / photo_corridor.jpg / photo_sleeping.jpg(统一裁切 720x960)
- game/script.rpy: 新增 persistent.gallery_seen 和 gallery_photo4_unlocked 变量
- game/Chapters/Chapter1.rpy: Chapter1_Scene4 开头自动解锁"力学之美"照片
- game/screens.rpy:
  · gallery_panel 改造为右侧侧边栏(340px),含花朵图标入口
  · 新增 yitao_gallery 屏幕(4 张卡片横排,NEW 角标,锁定状态)
  · 新增 gallery_detail 屏幕(左图右文详情页)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-04 21:50:57 +08:00
e879b916c2 fix: 将渐进式下载文件移出gitignore 2026-03-02 23:30:57 +08:00
9c0f65f420 refactor: 修正安卓版本号 2026-03-02 23:17:36 +08:00
118f3d9462 refactor: dev0.0.8 2026-03-02 22:55:46 +08:00
acbce20e18 Merge remote dev: 保留本地最新版本
远程为旧版,冲突文件(script.rpy / screens.rpy / Chapter1.rpy)均以本地版本为准。

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-27 03:47:23 +08:00
4e305599f2 Initial commit: XinLanDiary dev0.0.7
添加 HUD 画廊/日期面板:右上角页面图标按钮,点击弹出叠层显示当前游戏内日期(Day 1 = 2029年9月3日)。
修复 renpy.pygame.draw.rect 不支持 border_radius 的兼容性问题。

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-27 03:44:59 +08:00
f447de7f62 fix: 修正版本 2026-02-26 22:51:17 +08:00
8e7b156d19 fix: 版本号更新 2026-02-26 22:50:20 +08:00
b9dc8b7105 fix: 修复一个错误 2026-02-26 22:38:23 +08:00
47f1733a95 feat: 增加了2个游戏背景音乐 2026-02-26 22:29:46 +08:00
230e5f8892 refactor: 将下课铃修改为ogg格式 2026-02-26 16:12:27 +08:00
4a348e578b 添加:主菜单背景音乐 2026-02-26 16:09:55 +08:00
2e273a782c 解决冲突:保留CLAUDE.md 2026-02-26 13:15:05 +08:00
b5452a0a8a 忽略编译的文件 2026-02-26 13:11:06 +08:00
890dea326d 忽略.rpymc 2026-02-26 13:02:35 +08:00
ec39996d7c 修改网页版加载界面 2026-02-26 13:00:07 +08:00
d2da64618a 删除重复的mac包 2026-02-26 12:59:49 +08:00
7bf578b6b0 删除错误的“语法错误判断” 2026-02-26 12:59:10 +08:00
13ecbdb246 删除 CLAUDE.md 2026-02-25 23:08:05 +08:00
49 changed files with 2038 additions and 125 deletions

2
.gitignore vendored
View File

@@ -3,6 +3,7 @@
# ============================================= # =============================================
*.rpyc *.rpyc
*.rpyb *.rpyb
*.rpymc
game/cache/ game/cache/
game/saves/ game/saves/
game/temp/ game/temp/
@@ -57,7 +58,6 @@ CLAUDE.md
# ============================================= # =============================================
# Ren'Py / Android Build Artifacts # Ren'Py / Android Build Artifacts
# ============================================= # =============================================
progressive_download.txt
rapt/ rapt/
.android/ .android/

View File

@@ -20,11 +20,6 @@ This file provides guidance to Claude Code (claude.ai/code) when working with co
构建多平台发行版需通过 Ren'Py 启动器 GUI 操作,配置见 `project.json``android.json` 构建多平台发行版需通过 Ren'Py 启动器 GUI 操作,配置见 `project.json``android.json`
## 已知语法错误(需要修复)
- `game/Chapters/Chapter1.rpy:31` — 引用了未定义的变换 `move_to_bottomleft`
- `game/screens.rpy:318` — 按钮定义中存在非法中文标点符号(`。`
## 项目架构 ## 项目架构
### 核心文件 ### 核心文件

View File

@@ -7,7 +7,7 @@
"include_pil": false, "include_pil": false,
"include_sqlite": false, "include_sqlite": false,
"layout": null, "layout": null,
"name": "\u8398\u6f9c\u65e5\u8bb0b0.0.6", "name": "\u8398\u6f9c\u65e5\u8bb0b0.0.8.5",
"numeric_version": 1, "numeric_version": 1,
"orientation": "sensorLandscape", "orientation": "sensorLandscape",
"package": "com.rytstudio.xinlandiary", "package": "com.rytstudio.xinlandiary",

View File

@@ -1,73 +1,88 @@
# Chapter 1: 画廊风波 # Chapter 1: 画廊风波
# Characters defined here that are not in script.rpy
label Chapter1_Scene1: label Chapter1_Scene1:
scene bg classroom featryt with fade $ game_day = 1
$ game_period = "morning"
me "{cps=25}九月的风还带着夏末的燥热,那道斜切过窗台的阳光,在黑板上画出一道明晃晃的线。\n就像我的人生被分成了两半——线的那头是重点班线的这头是我。" scene bg classroom featryt with fade
me "这道光就这么直直地切过来,像是在提醒我,你就在这儿,也只能在这儿了。\n曾经唾手可得如今遥不可及。" system_ "【Day 1·上午·七班教室】"
me "{cps=25}九月的风还带着夏末的燥热,那道斜切过窗台的阳光,在黑板上画出一道明晃晃的线。"
pause 0.4
me "{cps=20}线的那头,是重点班。线的这头,是我。"
me "{cps=20}这道光就这么直直地切过来——不偏不倚,像拿尺子量过一样。{cps=1} {cps=20}曾经唾手可得,如今……不在这一边了。"
pause 0.5 pause 0.5
show xingyu thinking at left
show xingyu thinking at left with dissolve
play music "audio/XinLanDiary-Part1.ogg" fadein 0.5
xingyu "涛哥,你咋又对着黑板发呆?" xingyu "涛哥,你咋又对着黑板发呆?"
show xingyu laughing show xingyu laughing
xingyu "该不会是在研究光线折射角度吧?" xingyu "该不会是在研究光线折射角度吧?"
show ryt dialogue normal at right with dissolve
me "{cps=28}错!{cps=15}我在思考一个深刻的哲学问题——"
pause 0.3
me "{cps=18}为什么物理老师的头发总是逆着地心引力生长?"
show lhy dialogue normal at left with dissolve
hide xingyu hide xingyu
show ryt dialogue normal at right
me "{cps=28}错!{cps=1} {cps=17}我在思考一个深刻的哲学问题 ——{cps=5} {cps=18}为什么物理老师的头发总是逆着地心引力生长?"
hide ryt
show lhy dialogue normal at left
lhy "根据观察王老师的发际线在过去六个月里上移了0.8厘米,主要集中于期中考试前后。\n相关性系数0.76。" lhy "根据观察王老师的发际线在过去六个月里上移了0.8厘米,主要集中于期中考试前后。\n相关性系数0.76。"
show ryt hit at right show ryt hit at right
me "你们看!{cps=6} {cps=20}这就是重点班的余孽,看什么都得用数据说话。吃我一掌!" me "你们看!{cps=6} {cps=18}这就是重点班的余孽,看什么都得用数据说话。吃我一掌!"
show lhy dialogue normal at left, shake_rotate show lhy dialogue normal at shake_rotate
lhy "你的发力角度今天调整了从之前的斜上45度改为42度动能转化效率提升了约5\%。有进步。" lhy "你的发力角度今天调整了从之前的斜上45度改为42度动能转化效率提升了约5\%。有进步。"
hide lhy hide lhy
show lhy dialogue normal at left
show xingyu laughing big at left with dissolve
show ryt dialogue embarrass pocket at right show ryt dialogue embarrass pocket at right
xingyu "{cps=5}哈哈哈哈哈{cps=15}\n你俩锁死吧钥匙我扔了"
hide xingyu
hide ryt
show xingyu laughing big $ game_period = "after_school"
xingyu "{cps=5}哈哈哈哈哈{cps=15}\n真是一对苦命鸳鸯" stop music fadeout 1.0
play sound "audio/AfterClassRing.ogg" noloop
play sound "audio/xiakering.mp3" queue sound "audio/MainMenu.ogg" fadein 1.0
scene bg black with fade scene bg black with fade
pause 1.0 pause 1.0
scene bg playground twilight scene bg playground twilight with dissolve
show xingyu laughing 2 show xingyu laughing 2 at left with dissolve
xingyu "终于放学了!\n操场三对三今天必须把九班那群人打趴下" xingyu "终于放学了!\n操场三对三今天必须把九班那群人打趴下"
hide xingyu
mom "「17:40校门口便利店别迟到。」"
show ryt dialogue normal at right
me "......妈妈又给我发这消息"
me "我得等车。\n你们先打下次我一定来 {cps=3} {cps=20}——前提是我妈能接受她儿子在篮球场上挥洒青春而不是在车里背单词。"
show xingyu at left
xingyu "涛哥,你这样不行啊,迟早得「起义」。"
stop sound fadeout 1.0
show ryt dialogue normal at right with dissolve
mom "「17:40校门口便利店别迟到。」"
me "……我妈又发这消息。"
xingyu "涛哥,你这样不行啊,迟早得「起义」。"
hide xingyu with dissolve hide xingyu with dissolve
me "那声'起义'在心里荡开了一个小涟漪。" stop sound fadeout 1.0
me "他说得对——但说出口的代价,比他想的要重得多。"
play music "audio/MainMenu.ogg" fadein 0.5
me "那声'起义'在我心里荡开了一个小涟漪。"
me "他说得对,但是——\n上周因为训练赛多待了半小时我妈念叨了两天。不是骂就是每次路过我房间门口停一下。什么都不说。"
me "那比骂我还难受。"
hide ryt with dissolve hide ryt with dissolve
pause 0.8 pause 0.8
scene bg classroom wide afterschool with dissolve
play music "audio/XinLanDiary-Part1.ogg" fadein 0.5
$ gallery_photo4_unlocked = True
lzx "画廊更新了,有惊喜。友情提示:这次可能会火。" lzx "画廊更新了,有惊喜。友情提示:这次可能会火。"
me "……“任懿涛观察日志?”" show ryt dialogue normal at right with dissolve
me "……\"任懿涛观察日志\""
system_ "【画廊更新】力学之美:作用力与反作用力在友谊中的应用。\n图注请注意研究对象在空中时的肢体协调度与落地后的平衡恢复能力。" system_ "【画廊更新】力学之美:作用力与反作用力在友谊中的应用。\n图注请注意研究对象在空中时的肢体协调度与落地后的平衡恢复能力。"
#system_ "图注:请注意研究对象在空中时的肢体协调度与落地后的平衡恢复能力。"
show ryt dialogue embarrass pocket at center with dissolve show ryt dialogue embarrass pocket at center with dissolve
me "三张连拍……全程记录,还加了学术注释。行吧,就是个玩笑。" me "三张连拍……全程记录,还加了学术注释。行吧,就是个玩笑。"
hide ryt with dissolve hide ryt with dissolve
stop music fadeout 1.0
$ lhy_stats["affection"] += 3 $ lhy_stats["affection"] += 3
$ lhy_stats["trust"] += 2 $ lhy_stats["trust"] += 2
@@ -79,44 +94,67 @@ label Chapter1_Scene1:
jump Chapter1_Scene2 jump Chapter1_Scene2
label Chapter1_Scene2: label Chapter1_Scene2:
$ game_day = 2
$ game_period = "morning"
scene bg classroom morning featryt with fade scene bg classroom morning featryt with fade
#system_ "【第二天早上】" play music "audio/XinLanDiary-Part1.ogg" fadein 2.0
system_ "【Day 2·早自习前·七班教室】"
me "第二天早上,一切都不一样了。" me "第二天早上,一切都不一样了。"
me "刚踏进七班,就感觉空气里有种微妙的兴奋。" me "刚踏进七班,就感觉空气里有种微妙的兴奋。几个别班男生挤在后门,看到我进来——"
me "几个别班男生挤在后门,看到我进来——"
tongxue "涛哥!高手啊!" tongxue "涛哥!高手啊!"
tongxue "这弹跳力,不考虑加入校篮球队?" tongxue "这弹跳力,不考虑加入校篮球队?"
tongxue "刘泓予还好吗?需要验伤不?" tongxue "刘泓予还好吗?需要验伤不?"
show ryt dialogue normal at c1s2_ryt_pos with dissolve show ryt dialogue normal at c1s2_ryt_pos with dissolve
me "笑,我只管笑。" me "笑,我只管笑。一个接一个地应付过去,脸都快笑僵了。"
hide ryt with dissolve hide ryt with dissolve
me "到座位,拿出手机——" me "到座位,拿出手机——"
system_ "【匿名论坛·置顶】震惊!高二学霸竟在教室对同学实施「物理攻击」!\n 回复502层 | 转发88" system_ "【匿名论坛·置顶】震惊!高二学霸竟在教室对同学实施「物理攻击」!\n回复502层 | 转发88"
show ryt dialogue embarrass pocket at c1s2_ryt_pos with dissolve show ryt dialogue embarrass pocket at c1s2_ryt_pos with dissolve
me "……五百多层?" me "……五百多层?"
me "李泽瑄那个链接,被人转到论坛上了" me "李泽瑄那个链接,被人转到论坛上了"
hide ryt with dissolve hide ryt with dissolve
scene bg playground morning aerial with fade scene bg playground morning aerial with fade
me "课间操,成了公开处刑。" me "课间操,成了公开处刑。"
me "站在队列里,我能感觉到四面八方投来的目光,听到各处的窃窃私语。" me "{cps=40}站在队列里,我能感觉到四面八方投来的目光。\n前排两个女生凑在一起看手机其中一个抬头扫了我一眼又赶紧低下去。\n后排有男生在憋笑喉咙里发出那种压不住的\"库库\"声。"
#show ryt hit at center with dissolve
scene bg playground with dissolve scene bg playground with dissolve
me "深吸一口气——经过八班队列时,我故意做了个跳起来打空气的动作,表情夸张。" me "深吸一口气——经过八班队列时,我故意做了个跳起来打空气的动作,表情夸张。"
hide ryt with dissolve
tongxue "哈哈哈哈——" tongxue "哈哈哈哈——"
stop music fadeout 1.0
me "果然,又是一阵笑声。" me "果然,又是一阵笑声。"
me "我的那层盔甲还在。 对吗?" me "我听着那些笑声,自己也跟着笑了。声音有点大。"
pause 0.3
me "……好像太大了。"
pause 0.3 pause 0.3
# 关键场景:刘泓予看穿 menu:
"再夸张一点,把场面圆过去":
play music "audio/XinLanDiary-Part1.ogg" fadein 0.2
$ flag["temp00001"] = True
$ tao_stats["humorSense"] += 2
$ tao_stats["selfAcceptance"] += 1
me "行,既然观众这么热情——我转过身,对着那个方向又来了个更夸张的起跳。笑声更大了。"
me "搞定。收工。"
me "……但收工之后呢?"
"算了,就这样吧":
$ flag["temp00001"] = False
$ tao_stats["selfAcceptance"] += 3
$ tao_stats["studyStress"] += 1
me "我收回手,插进裤兜里。不演了。"
me "周围的窃窃私语还在,但我突然觉得——爱咋咋地吧。"
pause 0.3
#play music "audio/MainMenu.ogg" fadein 2.0
if not flag["temp00001"]:
play music "audio/XinLanDiary-Part1.ogg" fadein 0.2
show lhy dialogue normal at right with dissolve show lhy dialogue normal at right with dissolve
lhy "你刚才那个假动作面部肌肉的紧张程度是平时的1.3倍。" lhy "你刚才那个假动作面部肌肉的紧张程度是平时的1.3倍。"
show ryt dialogue embarrass pocket at left with dissolve show ryt dialogue embarrass pocket at left with dissolve
@@ -126,9 +164,10 @@ label Chapter1_Scene2:
hide ryt with dissolve hide ryt with dissolve
hide lhy with dissolve hide lhy with dissolve
stop music fadeout 0.2
me "他说这话的时候,语气跟讲公式一模一样。" me "他说这话的时候,语气跟讲公式一模一样。"
me "但不知道为什么,被他这么一说……我反而松了口气。" me "但不知道为什么,被他这么一说——我反而松了口气。"
me "有人看见了,但没有嘲笑。只是……记录。" me "有人看见了,但没有嘲笑。只是……看到了。"
$ lhy_stats["affection"] += 5 $ lhy_stats["affection"] += 5
$ lhy_stats["trust"] += 5 $ lhy_stats["trust"] += 5
@@ -139,11 +178,13 @@ label Chapter1_Scene2:
jump Chapter1_Scene3 jump Chapter1_Scene3
label Chapter1_Scene3: label Chapter1_Scene3:
# —— 视角A苏雨桐·学生会会议室 —— $ game_period = "afternoon"
scene bg meetingroom meeting with fade
"{cps=20}【同日下午·学生会会议室】" # system_ "【同日下午·学生会会议室】" scene bg meetingroom meeting with fade
play music "audio/XinLanDiary-Part1.ogg" fadein 2.0
system_ "【与此同时:学生会会议室】"
"下午的学生会会议室里,宣传部的干事正滔滔不绝地讲着新学期公众号的选题计划。"
me "下午的学生会会议室里,宣传部的干事滔滔不绝。"
ganshi "——就像最近论坛里很火的那个'力学之美'系列,这种原生内容特别容易引发共鸣,我们宣传部可以朝这个方向多发掘——" ganshi "——就像最近论坛里很火的那个'力学之美'系列,这种原生内容特别容易引发共鸣,我们宣传部可以朝这个方向多发掘——"
pause 0.3 pause 0.3
@@ -153,19 +194,24 @@ label Chapter1_Scene3:
yutong "这类内容涉及肖像权问题。根据《民法典》第一千零一十九条,未经同意使用他人肖像,即便没有营利目的,如果造成当事人困扰,也涉嫌侵权。" yutong "这类内容涉及肖像权问题。根据《民法典》第一千零一十九条,未经同意使用他人肖像,即便没有营利目的,如果造成当事人困扰,也涉嫌侵权。"
yutong "尤其是这种可能引发负面关注的传播,我们需要更谨慎。" yutong "尤其是这种可能引发负面关注的传播,我们需要更谨慎。"
me "会议室陷入短暂沉默。" # 把me删掉 不删!.lzx "会议室安静了两秒。窗外的阳光正好打在她面前的笔记本上,字迹工整得像印刷体。"
scene bg meetingroom meeting with dissolve scene bg meetingroom meeting with dissolve
ganshi "雨桐提醒得对……这个问题我们后续会注意的。那继续下一项——" ganshi "雨桐提醒得对……这个问题我们后续会注意的。那继续下一项——"
"{cps=20}会议继续。没人看见,她放在桌下的手机屏幕上——" # 这个me也删掉删掉.lzx "会议继续。没人看见,她放在桌下的手机屏幕上——"
system_ "【苏雨桐手机·加密相册·新增1张】" system_ "【苏雨桐手机·加密相册·新增1张】"
yutong "……力学之美……有趣的视角。" yutong "……力学之美……有趣的视角。"
"{cps=20}她把第三张连拍放大,看了很久。" "她把第三张连拍放大,看了很久。"
"{cps=20}那个落地踉跄、表情错愕的瞬间,和高一时那个数学竞赛获奖后,在走廊里短暂发呆的男生微妙地重合了。" "那个落地踉跄、表情错愕的瞬间,和高一时那个数学竞赛获奖后,在走廊里短暂发呆的男生——微妙地重合了。"
yutong "「给岁月以文明,而不是给文明以岁月。」" yutong "「给岁月以文明,而不是给文明以岁月。」"
yutong "我那天递给他的纸条上可不仅写了“恭喜”二字……" yutong "我那天递给他的纸条上可不仅写了“恭喜”二字……"
yutong "这句话,他没有回应。\n 或许他根本就没有看见……" yutong "这句话,他没有回应。\n 或许他根本就没有看见……"
pause 0.5
"她把照片拖进名为\"观察样本\"的加密相册。里面已经存了二十几张——从高一开始,断断续续地,像某种只有自己在做的研究。"
stop music fadeout 1.0
$ yutong_stats["affection"] += 3 $ yutong_stats["affection"] += 3
$ yutong_stats["attention"] += 5 $ yutong_stats["attention"] += 5
@@ -173,21 +219,22 @@ label Chapter1_Scene3:
pause 0.5 pause 0.5
# —— 视角B:林晓薇·高二一班走廊 —— system_ "【视角:林晓薇·高二一班走廊】"
play music "audio/XinLanDiary-Part1.ogg" fadein 2.0
scene bg corridor with dissolve scene bg corridor with dissolve
"【同日下午·高二一班走廊】"
show xiaowei at left with dissolve
"同一时间,另一个人也在看那张照片。" "同一时间,另一个人也在看那张照片。"
tongxue "晓薇你快看!这不是你们一班那个任懿涛吗?他怎么还是这么搞笑!"
tongxue "晓薇你快看!这不是你们高一班那个任懿涛吗?他怎么还是这么搞笑!"
show xiaowei at right with dissolve
xiaowei "拍得好生动啊!你们说,要是我也这样跳起来打人,会不会也这么有效果?" xiaowei "拍得好生动啊!你们说,要是我也这样跳起来打人,会不会也这么有效果?"
tongxue "哈哈哈哈!" tongxue "哈哈哈哈!"
stop music fadeout 1.0
"她笑着,眼睛却没有离开屏幕。"
"文科班的课间从没这么吵过。大家都很客气,玩笑也开得小心翼翼。但照片上那种全力以赴的笨拙,让她想起高一——想起那时候,笑是不需要理由的。"
hide xiaowei with dissolve hide xiaowei with dissolve
"{cps=20}她笑着,眼睛却没有离开屏幕。" play music "audio/XinLanDiary-Part1.ogg" fadein 2.0
"{cps=20}那种真实的活力,让她觉得……在礼貌而疏离的文科班里,有什么东西被触动了。"
#system_ "【切换账号:薇风拂晓】"
scene bg classroom phone closeup with dissolve scene bg classroom phone closeup with dissolve
system_ "好友列表:逍遥剑客 [[在线]" system_ "好友列表:逍遥剑客 [[在线]"
xiaowei_w "在吗?问个事。你们学校是不是有个挺搞笑的人?最近好像因为什么照片火了。" xiaowei_w "在吗?问个事。你们学校是不是有个挺搞笑的人?最近好像因为什么照片火了。"
@@ -195,13 +242,14 @@ label Chapter1_Scene3:
pause 0.8 pause 0.8
me_w "???你哪个学校的?" me_w "???你哪个学校的?"
xiaowei_w "就随便问问,不想说算了。" xiaowei_w "就随便问问,不想说算了。"
me "她收起手机。上课铃响了。" "她收起手机。上课铃响了。"
me "路过七班门口时,她下意识往里看了一眼——" "路过七班门口时,她下意识往里看了一眼——"
show ryt dialogue normal at right with dissolve show ryt dialogue normal at right with dissolve
show xingyu at left with dissolve show xingyu at left with dissolve
me "任懿涛正背对门口,和陈星宇比划着什么。大概又是游戏攻略。" "任懿涛正背对门口,和陈星宇比划着什么。大概又是游戏攻略。"
hide ryt with dissolve hide ryt with dissolve
hide xingyu with dissolve hide xingyu with dissolve
stop music fadeout 1.0
$ xiaowei_stats["affection"] += 4 $ xiaowei_stats["affection"] += 4
$ xiaowei_stats["interactionFrequency"] += 2 $ xiaowei_stats["interactionFrequency"] += 2
@@ -210,20 +258,22 @@ label Chapter1_Scene3:
jump Chapter1_Scene4 jump Chapter1_Scene4
label Chapter1_Scene4: label Chapter1_Scene4:
$ game_period = "after_school"
play music "audio/MainMenu.ogg" fadein 2.0
scene bg classroom wide afterschool with fade scene bg classroom wide afterschool with fade
"{cps=20}【同日放学后·七班教室】" # system_ "【同日放学后·七班教室】" system_ "【同日放学后·七班教室】"
show ryt dialogue normal at right with dissolve show ryt dialogue normal at right with dissolve
me "放学了。教室里还剩几个人。" me "放学了。教室里还剩几个人。"
me "'薇风拂晓'……你哪个学校的?" me "'薇风拂晓'……你哪个学校的?"
me "这个账号……我好像只在游戏里见过。" me "这个账号我好像只在游戏里见过。"
show xingyu at left with dissolve show xingyu at left with dissolve
xingyu "涛哥,你咋了?还在想那个破照片的事?" xingyu "涛哥,你咋了?还在想那个破照片的事?"
me "我在思考更严肃的问题——为什么总有人对我的英姿如此念念不忘?" me "我在思考更严肃的问题——为什么总有人对我的英姿如此念念不忘?"
me "我来看看画廊的统计数据\n论坛转发之后,访问量肯定不少——就当看个热闹。" me "我来看看画廊的统计数据——论坛转发之后,访问量肯定不少。"
hide ryt with dissolve hide ryt with dissolve
system_ "【画廊后台·访问统计】今日新增347次 | 来源:匿名论坛转发" system_ "【画廊后台·访问统计】今日新增347次 | 来源:匿名论坛转发"
show ryt dialogue normal at right with dissolve show ryt dialogue normal at right with dissolve
@@ -241,7 +291,7 @@ label Chapter1_Scene4:
xingyu "哟有人盯上你了啊。对那个段就是13班和几个竞赛实验室专用。" xingyu "哟有人盯上你了啊。对那个段就是13班和几个竞赛实验室专用。"
xingyu "怎么,涛哥的英姿连重点班都征服了?" xingyu "怎么,涛哥的英姿连重点班都征服了?"
hide xingyu with dissolve hide xingyu with dissolve
show ryt dialogue embarrass pocket2 at right with dissolve show ryt dialogue embarrass pocket2 at right
me "13班。那个我刚离开的世界。" me "13班。那个我刚离开的世界。"
me "……是谁?" me "……是谁?"
@@ -249,38 +299,66 @@ label Chapter1_Scene4:
pause 0.5 pause 0.5
hide ryt with dissolve hide ryt with dissolve
# 反侦察行动 menu:
"告诉星宇这个发现":
$ xingyu_stats["cooperation"] += 3
$ lzx_stats["infoOpenness"] += 1
show xingyu at left with dissolve
me "星宇,你过来看看这个。"
show ryt dialogue normal at right with dissolve
xingyu "卧槽,从高一上学期就开始看?这人比我还关注你啊涛哥!"
xingyu "行,这事交给我了。我先把实验楼三层的课表摸一遍——"
me "你哪来的课表?"
xingyu "问题不大!"
hide xingyu with dissolve
"先自己查查看":
$ lzx_stats["infoOpenness"] += 2
$ tao_stats["selfAcceptance"] += 2
me "这事先不说。"
me "我关掉统计数据,假装在看别的东西。"
me "不知道为什么关于这个13班的IP——我想自己先搞清楚。"
pause 0.4
play music "audio/XinLanDiary-Part1.ogg" fadein 2.0
show xingyu at left with dissolve show xingyu at left with dissolve
xingyu "各位!我有个绝妙的主意——" xingyu "各位!我有个绝妙的主意——"
xingyu "既然那个画廊这么喜欢拍涛哥,咱们不如搞个「反侦察行动」!" xingyu "既然那个画廊这么喜欢拍涛哥,咱们不如搞个「反侦察行动」!"
xingyu "找出那个偷拍者,然后拍他的黑历史!怎么样?" xingyu "找出那个偷拍者,然后拍他的黑历史!怎么样?"
show lhy dialogue normal with dissolve show lhy dialogue normal with dissolve
lhy "理论上可行,但需要注意几个问题:\n第一如何确定拍摄者会再次行动\n第二如何在保护自身隐私的前提下进行反追踪\n第三——" lhy "理论上可行,但几个问题:拍摄者的行动规律、隐私保护、还有——"
lhy "不过……如果是你的事,我愿意参与。"
me "小卡没有把这句话包装成概率或数据。他就这么直接说了。"
me "我愣了一下,差点没反应过来。"
xingyu "哎呀小卡你别扫兴!就是玩嘛!涛哥,你说干不干?" xingyu "哎呀小卡你别扫兴!就是玩嘛!涛哥,你说干不干?"
hide lhy with dissolve hide lhy with dissolve
stop music fadeout 0.8
show ryt dialogue normal at right with dissolve show ryt dialogue normal at right with dissolve
me "看着眼前这群人。认识不过一个多月——但他们就这么凑过来,商量这种无聊又有趣的计划。" me "看着眼前这群人。认识不过一个多月——但他们就这么凑过来,商量这种无聊又有趣的计划。"
me "在重点班时,从来没有过这样的时刻。"
play music "audio/XinLanDiary-Part1.ogg" fadein 1.0
me "行啊!但咱们得专业!要有分工!有排班表!有应急预案!还要有——" me "行啊!但咱们得专业!要有分工!有排班表!有应急预案!还要有——"
hide ryt with dissolve hide ryt with dissolve
hide xingyu with dissolve hide xingyu with dissolve
pause 0.4 pause 0.4
# 颜涵出场
show yh camerabag at left with dissolve show yh camerabag at left with dissolve
yh "要有旁观席位。" yh "要有旁观席位。"
#me "声音从后门传来。颜涵,拎着相机包,表情平静。"
yh "我负责记录你们的失败过程。" yh "我负责记录你们的失败过程。"
hide yh with dissolve hide yh with dissolve
tongxue "哈哈哈哈哈!" tongxue "哈哈哈哈哈!"
stop music fadeout 1.0
show ryt dialogue normal at right with dissolve show ryt dialogue normal at right with dissolve
me "我也跟着笑。但眼睛不自觉地望向窗外。" me "我也跟着笑。但眼睛不自觉地望向窗外。"
me "夕阳下的实验楼泛着暖黄的光,三楼东侧的窗户反射着落日的余晖。" me "夕阳下的实验楼泛着暖黄的光,三楼东侧的窗户反射着落日的余晖。"
me "那里有谁,在看着我?" me "那里有谁,在看着我?"
me "还有那个'薇风拂晓'到底是谁?" me "还有那个'薇风拂晓'——到底是谁?"
hide ryt with dissolve hide ryt with dissolve
$ xingyu_stats["affection"] += 5 $ xingyu_stats["affection"] += 5
@@ -289,11 +367,12 @@ label Chapter1_Scene4:
$ lhy_stats["affection"] += 3 $ lhy_stats["affection"] += 3
$ yh_stats["affection"] += 3 $ yh_stats["affection"] += 3
$ yh_stats["understanding"] += 2 $ yh_stats["understanding"] += 2
$ tao_stats["selfAcceptance"] += 2
pause 0.5 pause 0.5
# 便利店 # —— 便利店 ——
$ game_period = "evening"
play music "audio/XinLanDiary-Part2.ogg" fadein 2.0
scene bg convenience store with fade scene bg convenience store with fade
system_ "【傍晚17:25·校门外便利店】" system_ "【傍晚17:25·校门外便利店】"
@@ -301,43 +380,47 @@ label Chapter1_Scene4:
me "17:25准时出现在校门外三百米处的便利店。" me "17:25准时出现在校门外三百米处的便利店。"
me "买瓶饮料,站在店门口等车,看着其他学生自由地走过。" me "买瓶饮料,站在店门口等车,看着其他学生自由地走过。"
me "骑车的,步行的,三五成群说笑的。每个人脸上都有种松弛感。" me "骑车的,步行的,三五成群说笑的。每个人脸上都有种松弛感。"
#hide ryt with dissolve
show aunt normal at left with dissolve show aunt normal at left with dissolve
"便利店主" "小任,新品。尝尝,你们年轻人喜欢这个。" "便利店主" "小任,新品。尝尝,你们年轻人喜欢这个。"
#show ryt dialogue normal at right with dissolve
me "谢了阿姨。" me "谢了阿姨。"
hide ryt with dissolve hide ryt with dissolve
hide aunt with dissolve hide aunt with dissolve
me "拧开那瓶柚子味气泡水,靠在栏杆上。" me "拧开那瓶柚子味气泡水,靠在栏杆上。气泡冲出来的声音很脆。"
pause 0.6 pause 0.6
# 苏雨桐骑车经过——本章关键镜头 # —— 苏雨桐骑车经过 ——
scene bg schoolgate featsyt with dissolve scene bg schoolgate featsyt with dissolve
me "那是 ——{cps=1} {cps=20}苏雨桐" me "那是——苏雨桐"
me "她推着自行车从校门口出来。车篮里放着一本厚厚的书。" me "她推着自行车从校门口出来。车篮里放着一本厚厚的书,看封面不像教材。"
me "她停在路口等红灯,低头看了眼手机——" me "她停在路口等红灯,低头看了眼手机——"
me "然后嘴角很轻地抬了一下。几乎算不上笑,只是一个微小的弧度。" me "然后嘴角很轻地抬了一下。几乎算不上笑,只是一个微小的弧度。"
scene bg convenience store with dissolve scene bg convenience store with dissolve
show ryt normal spec at c1s4_ryt_pos with dissolve show ryt normal spec at c1s4_ryt_pos with dissolve
show ryt normal spec at slide_right(distance=200, duration=0.5) with dissolve show ryt normal spec at slide_right(distance=200, duration=0.5) with dissolve
me "我下意识往便利店的阴影里退了半步。" me "我下意识往便利店的阴影里退了半步。"
hide ryt with dissolve
scene bg sunset featsyt with dissolve scene bg sunset featsyt with dissolve
me "绿灯。她跨上车,黑发在傍晚的风里扬起,朝着与我家相反的方向骑远了。" me "绿灯。她跨上车,黑发在傍晚的风里扬起。"
me "朝着与我家相反的方向骑远了。"
pause 0.5
scene bg convenience store with dissolve scene bg convenience store with dissolve
pause 0.5 show ryt normal spec at c1s4_ryt_pos with dissolve
me "自由。" me "自由。"
me "这个词突然撞进脑子里——不是解题时的快感,而是一种更基础的东西:掌控自己轨迹的权利。" me "这个词突然撞进脑子里——不是解题时的快感,而是一种更基础的东西:掌控自己轨迹的权利。"
pause 0.4
me "她骑车的方向,和我回家的方向,刚好相反。"
hide ryt with dissolve
mom "「到了。」" mom "「到了。」"
show ryt dialogue normal at right with dissolve show ryt dialogue normal at right with dissolve
me "好的。特别开心。" me "好的,我来了。特别开心。"
hide ryt with dissolve hide ryt with dissolve
me "……我说出这句话的时候,语气轻松得像是真的。" me "我说出这句话的时候,语气轻松得像是真的。"
me "车驶入车流。靠在车窗上,看着外面倒退的街景。" me "车驶入车流。靠在车窗上,看着外面倒退的街景。"
$ yutong_stats["affection"] += 2 $ yutong_stats["affection"] += 2
$ yutong_stats["attention"] += 3 $ yutong_stats["attention"] += 3
@@ -346,44 +429,45 @@ label Chapter1_Scene4:
pause 0.5 pause 0.5
# 双视角结尾 # —— 双视角夜晚 ——
$ game_period = "night"
scene bg black with fade scene bg black with fade
system_ "【同夜·城市另一头】" system_ "【同夜·城市另一头】"
me "城市的另一头,苏雨桐刚回到家。" scene bg yutong room night with dissolve
"城市的另一头,苏雨桐刚回到家。"
yutong "TaoliTaoli……今天依然没有更新。" yutong "TaoliTaoli……今天依然没有更新。"
system_ "【任懿涛画廊·访问计数器:+1】" system_ "【任懿涛画廊·访问计数器:+1】"
me "她一张张翻看那些照片。相册里已经积累了二十几张,按时间顺序排列。" "她一张张翻看那些照片。相册里已经积累了二十几张,按时间顺序排列。"
yutong "……在这个高度秩序化的生活里,观察一个如此不协调、如此鲜活的存在……有种奇妙的慰藉。" yutong "……在这个高度秩序化的生活里,观察一个如此不协调、如此鲜活的存在……有种奇妙的慰藉。"
$ yutong_stats["affection"] += 3 $ yutong_stats["affection"] += 3
$ yutong_stats["attention"] += 4 $ yutong_stats["attention"] += 4
pause 0.5 pause 0.5
system_ "【几公里外·林晓薇的房间】" system_ "【几公里外·林晓薇的房间】"
me "几公里外,林晓薇躺在床上,盯着天花板发呆。" scene bg xiaowei room night with dissolve
"几公里外,林晓薇躺在床上,盯着天花板发呆。"
me_w "你问的那个人,确实是我们学校的。怎么,你认识?" me_w "你问的那个人,确实是我们学校的。怎么,你认识?"
me "那条回复躺在对话框里,她还没想好怎么回。" "那条回复躺在对话框里,她还没想好怎么回。"
me "她翻看相册,看着任懿涛在空中那个狰狞又认真的表情,看着落地时那个措手不及的踉跄。" "她翻看相册,看着任懿涛在空中那个狰狞又认真的表情,看着落地时那个措手不及的踉跄。"
me "然后,她做了个决定。" "然后,她做了个决定。"
xiaowei "明天,课间的时候,以真实身份去七班找他。" xiaowei "找个机会,以真实身份去七班找他。"
xiaowei "就说:那张照片拍得真好,特别生动。" xiaowei "就说:那张照片拍得真好,特别生动。"
xiaowei "……就想看看,他会是什么反应。" xiaowei "……就想看看,他会是什么反应。"
"她翻了个身,把手机扣在枕头旁边。心跳声在安静的房间里有点响。"
$ xiaowei_stats["affection"] += 3 $ xiaowei_stats["affection"] += 3
$ xiaowei_stats["interactionFrequency"] += 3 $ xiaowei_stats["interactionFrequency"] += 3
pause 0.5 pause 0.5
# 章节尾声 # —— 章节尾声 ——
scene bg black with fade scene bg night city with fade
me "窗外,九月的夜晚渐渐深了。城市灯火一盏盏亮起,每扇窗户后都是一个正在展开的故事。" me "窗外,九月的夜晚渐渐深了。城市灯火一盏盏亮起,每扇窗户后都是一个正在展开的故事。"
me "任懿涛的故事,在这一天,因为几张滑稽的照片,悄悄拐上了一条自己都未曾预料的路。" me "而我的故事——因为几张滑稽的照片,在这一天悄悄拐上了一条自己都未曾预料的路。"
me "这条路上,已经有两位女生在等着他——"
me "一个在暗处静静观察,一个在明处准备靠近。"
pause 1.0
me "而他自己,还不知道。"
pause 1.5 pause 1.5
system_ "【第一章·画廊风波·完】" system_ "【第一章·画廊风波·完】"
return jump Chapter2_Scene1

View File

@@ -0,0 +1,133 @@
# Chapter 2: Side Stories
# 支线剧情
label C2Side1:
# —— 天台 ——
if lhy_stats["affection"] < 11:
jump C2S2
$ game_day = 16
$ game_period = "lunch"
scene bg rooftop with fade
system_ "【Day 16·午休·天台】"
pause 0.5
show lhy dialogue normal at left with dissolve
lhy "任懿涛。能占用你一点时间吗?"
show ryt dialogue normal at right with dissolve
me "小卡主动找我说话?概率大概跟哈雷彗星过境差不多。"
lhy "关于昨天的邀请。我想确认一下——你是认真的吗?"
lhy "我的意思是我技术不好。KD只有0.6。"
me "所以呢?"
lhy "所以……你不怕拖累胜率?"
me "他表情很平静。但\"拖累胜率\"这四个字——他在认真确认一件事。不是在自嘲,不是在谦虚,是真的想知道答案。"
hide ryt with dissolve
hide lhy with dissolve
menu:
"胜率不重要,重要的是有人兜底。":
$ lhy_stats["affection"] += 3
jump C2Side1S1
"怕什么,我可以一打三。":
$ lhy_stats["affection"] += 2
jump C2Side1S2
"你负责战略,我负责送死,公平吧?":
$ lhy_stats["affection"] += 1
jump C2Side1S3
label C2Side1S1:
show ryt dialogue normal at right with dissolve
me "胜率不重要,重要的是有人兜底。"
show lhy dialogue normal at left with dissolve
lhy "……"
lhy "你总是这样说。好像什么都可以轻描淡写地过去。"
lhy "其实,我有件事想问你。"
lhy "你是怎么做到……想跳起来就跳起来的?"
me "……啊?"
lhy "那天在教室里。你跳起来打我的后背。动作很笨拙,角度也不对,落地的时候还踉跄了。"
lhy "但你还是跳了。"
pause 0.3
lhy "我有时候也想跳起来。但每次到最后一秒,脑子里已经把所有的可能性都算了一遍——跳起来之后会不会撞到人,落地的时候平衡点在哪里,旁边的人会怎么想——然后身体就不动了。"
me "小卡难得说这么多话。而且这次——没有数字。没有概率。就是一个朋友在说他做不到的事。"
me "跳起来,需要理由吗?"
lhy "……"
lhy "也许不需要。"
pause 0.5
lhy "但我还没学会。"
lhy "比赛的时候,我会试试。"
pause 0.3
"天台上安静了几秒。风把远处的广播体操音乐吹过来,模糊得像另一个世界。"
lhy "走吧。该回去上课了。"
lhy "对了,比赛那天……我会准备好的。"
$ flag["C4"] = 1
$ flag["competition_note"] = True
$ lhy_stats["trust"] += 2
$ tao_stats["humorSense"] += 1
$ lhy_stats["empathy"] += 2
jump C2S2
label C2Side1S2:
show ryt dialogue normal at right with dissolve
me "怕什么,我可以一打三。"
show lhy dialogue normal at left with dissolve
lhy "你的自信心从何而来我一直很好奇。但这确实有一定作用。"
me "行行行,你说得对。但我就是自信,天生的。"
lhy "……"
lhy "那这次,我也试着给自己一点。"
me "小卡说这句话的时候,嘴角动了一下。幅度很小,但确实是往上的。"
pause 0.3
"楼下有人在喊——好像是体育课的学生。笑声从下面传上来,飘散在午后的阳光里。"
lhy "走吧。该回去上课了。"
lhy "对了,比赛那天……我会准备好的。"
$ lhy_stats["trust"] += 1
$ tao_stats["humorSense"] += 1
$ lhy_stats["empathy"] += 1
jump C2S2
label C2Side1S3:
show ryt dialogue normal at right with dissolve
me "你负责战略,我负责送死,公平吧?"
show lhy dialogue normal at left with dissolve
lhy "战术性牺牲确实是一种可行的策略。"
pause 0.3
lhy "但我的意思是……"
lhy "算了。我会准备好的。"
me "他没把话说完。但在转身之前,我看到他嘴角动了一下——那个幅度,约等于刘泓予式的\"笑\"。"
pause 0.3
"下楼铃响了。远处传来教室门开关的声音,午休结束了。"
lhy "走吧。该回去上课了。"
lhy "对了,比赛那天……我会准备好的。"
$ tao_stats["humorSense"] += 1
$ lhy_stats["empathy"] += 1
jump C2S2

View File

@@ -0,0 +1,534 @@
# Chapter 2: 游戏内外
define zhuchi = Character("主持人", color="#3c3fff", what_slow_cps=19, who_outlines=[(1, "#404040", 0, 0)])
define yang = Character("杨义涵", color="#ff3c3c", what_slow_cps=19, who_outlines=[(1, "#404040", 0, 0)])
label Chapter2_Scene1:
$ game_day = 15
$ game_period = "afternoon"
scene bg classroom wide afterschool with fade
play music "audio/XinLanDiary-Part1.ogg" fadein 2.0
system_ "【Day 15·下午·七班教室】"
me "十一月的风从窗缝钻进来,带走了夏末最后的余热。距离那张照片闹得全校皆知,已经过去了快两周。"
me "论坛的置顶早就换了新的话题。走在走廊里,也不再有人对我指指点点。热闹来得快,散得也快。"
me "倒是有一件事没变——林晓薇确实来找过我。课间的时候,站在七班后门,说\"那张照片拍得真好\"。"
me "我记得她当时耳朵有点红。我说\"谢了\",然后上课铃就响了。"
me "之后在走廊里碰到过几次,她会笑着打招呼,但也就这样。不知道为什么,我总觉得她看我的眼神里藏着点什么——可能是我想多了。"
pause 0.5
me "总之,生活恢复了它本来的节奏。直到今天下午,陈星宇的手机屏幕戳到了我脸上。"
show xingyu at left with dissolve
xingyu "涛哥!看公告没?校内赛!电竞社这次玩真的,冠军有机械键盘和——重点班旁听一周体验券!"
hide xingyu with dissolve
show ryt dialogue normal at right with dissolve
me "……最后那个,是什么鬼奖励。"
me "重点班旁听体验券。好像是从那个世界发来的一张请帖,上面写着:想回来看看吗?"
me "我把手机屏幕按灭。重新盯着黑板。"
hide ryt with dissolve
show lhy dialogue normal at left with dissolve
lhy "从概率学角度,我们组队胜率取决于三个变量:枪法、战术配合、以及对手里有几个挂。"
show xingyu at right with dissolve
xingyu "小卡你也会玩?"
hide xingyu with dissolve
lhy "不怎么会。但我可以学。"
hide lhy with dissolve
show ryt dialogue normal at right with dissolve
me "他说这话的表情,跟宣布今天要交数学作业一模一样。做啥事都认真。"
me "而且——他说的不是\"我可以试试\",是\"我可以学\"。"
menu:
"邀请刘泓予":
$ lhy_stats["affection"] += 5
$ flag["lhy_team"] = True
scene bg classroom wide afterschool with dissolve
me "放学后我去找小卡,他正在收拾书包。我说了比赛的事,他点头,但表情跟平时不太一样——像是有话要说,又没想好怎么开口。"
me "第二天午休,他把我叫上了天台。"
jump C2Side1
"只找个游戏高手":
$ xingyu_stats["affection"] -= 5
$ flag["lhy_team"] = False
me "我张了张嘴,最后只是说:\"行,那咱找个枪硬的。\""
me "陈星宇看了我一眼,没说什么。但我总觉得他那个眼神有点失望。"
jump C2S2
"还没想好":
$ flag["C2S1_think"] = False
me "我犹豫了一下。不是因为小卡技术不好——是因为我怕拖累他。"
me "\"再想想吧。\"我说。陈星宇耸耸肩。"
jump C2S2
label C2S2:
$ game_day = 18
$ game_period = "after_school"
scene bg computer lab with fade
play music "audio/XinLanDiary-Part1.ogg" fadein 2.0
system_ "【Day 18·放学后·机房】"
show ryt dialogue normal at right with dissolve
me "训练赛。对手是颜涵和杨天赐——一个能在音游里全连魔王曲的怪物,一个能把任何战术会议变成单口相声的活宝。"
me "胜率计算器对着这阵容直接黑屏了。"
hide ryt with dissolve
show yh camerabag at left with dissolve
yh "任懿涛。"
yh "你是主突击位?"
hide yh with dissolve
show ryt dialogue normal at right with dissolve
me "嗯,习惯了。"
hide ryt with dissolve
show yh camerabag at left with dissolve
yh "那我针对你。"
hide yh with dissolve
show ryt dialogue normal at right with dissolve
me "为啥?"
hide ryt with dissolve
show yh camerabag at left with dissolve
yh "练习赛的意义就在于此。找到弱点。"
yh "除非……你怕我?"
show ryt dialogue normal at right with dissolve
me "他怎么又笑了。那种\"我已经知道你会输\"的笑。"
me "我咽了下口水。但嘴上不能输。"
me "来啊。谁怕谁。"
hide ryt with dissolve
hide yh with dissolve
stop music fadeout 1.0
pause 1.0
play music "audio/XinLanDiary-Part1.ogg" fadein 2.0
system_ "【练习赛结束·2:2平】"
show yh camerabag at left with dissolve
yh "手速很快。但你的移动轨迹有pattern。每三次变向就有一次习惯性右偏。"
hide yh with dissolve
show ryt dialogue normal at right with dissolve
me "……你连这个都记?"
hide ryt with dissolve
show yh camerabag at left with dissolve
yh "习惯了。音游打多了,眼睛会自动追踪移动目标。"
yh "对了。"
yh "下周嘉年华筹备开始了。摄影社要做\"莘澜面孔\"影展。"
yh "你会出镜的。"
hide yh with dissolve
show ryt dialogue normal at right with dissolve
me "……凭什么?"
hide ryt with dissolve
show yh camerabag at left with dissolve
yh "因为我会拍你。"
yh "无论你同意与否。"
hide yh with dissolve
show ryt dialogue normal at right with dissolve
me "他说完就走了。语气跟高一那回点评我的头发之后转身就走一模一样——不像威胁,像是已经做完了决定,只是在通知你一声。"
hide ryt with dissolve
# —— 机房门口 ——
scene bg computer lab door with dissolve
pause 0.5
show xiaowei at right with dissolve
me "林晓薇?你怎么在这?"
xiaowei "欸——是不是打扰到你们了?"
me "林晓薇……她怎么会出现在机房门口?这栋楼离文科班教室隔了一个操场。"
show xiaowei embarrass at right with dissolve
xiaowei "我、我是来还机房钥匙的!正好路过!"
me "她耳朵红了。高一我就发现了,她说谎的时候先红耳朵。"
show xiaowei at right with dissolve
xiaowei "那、那个……比赛加油!我会去旁观的!"
me "旁观?"
xiaowei "啊不不是那个意思——就是——呃——友好支持!"
hide xiaowei with dissolve
me "她转身就跑。背影消失在楼梯拐角。"
me "\"友好支持\"……什么鬼。"
me "但我发现自己在笑。"
pause 0.5
me "手机响了。"
scene bg classroom phone closeup with dissolve
system_ "【游戏内私聊】薇风拂晓:在吗?"
me "又是她。每次都在我刚上线的时间出现。太巧了。"
xiaowei_w "下周比赛,你会参加对吧?"
me_w "你怎么知道?"
xiaowei_w "……猜的。你游戏ID不是'逍遥剑客'吗,电竞社报名名单上有。"
me_w "你还看报名名单?"
xiaowei_w "随便看看!"
xiaowei_w "那……比赛见。"
me_w "等等,你到底哪个学校的?"
system_ "【对方已离线】"
me "又跑了。每次问到这个问题就消失。"
me "但奇怪的是……我好像并没有很想知道答案。就这么聊着,也挺好。"
$ xiaowei_stats["affection"] += 3
$ xiaowei_stats["interactionFrequency"] += 2
$ yh_stats["affection"] += 2
$ yh_stats["understanding"] += 2
if yutong_stats["affection"] >= 8 and yutong_stats["attention"] >= 12:
jump C2S3
label C2S3:
$ game_day = 20
$ game_period = "afternoon"
scene bg computer lab with fade
play music "audio/XinLanDiary-Part1.ogg" fadein 2.0
system_ "【Day 20·下午·机房】"
show ryt dialogue normal at right with dissolve
me "赛前最后一次训练。机房设备嗡嗡响。"
me "诶?门口什么时候站着个人。"
hide ryt with dissolve
show yutong at left with dissolve
yutong "学习部检查。"
yutong "学生会接到投诉,说电竞社训练影响晚自习秩序。"
show ryt dialogue normal at right with dissolve
me "是苏雨桐。语气跟开会时一模一样。但她的眼睛在看我手机屏幕,不是看我。"
me "我们只是利用课余时间——"
yutong "《四角州行动》,是吗?"
me "……你怎么知道游戏名?"
yutong "资料调查。"
yutong "……"
yutong "手速确实很快。"
me "她说这句话的时候,声音比刚才轻。然后推了推眼镜,像在掩饰什么。"
yutong "但要小心重复性劳损。腕关节每天最好不要超过两万次点击。"
me "……学生会还管这个?"
yutong "这是学习部对参赛同学的健康提示。"
yutong "另外……"
yutong "重点班旁听体验券,是真的。"
yutong "如果你想的话。"
hide yutong with dissolve
me "她转身走了。跟高一一样,走路很快,从不回头看。"
pause 0.5
me "\"如果你想的话\"——她是在传达一个信息,还是在问一个问题?"
me "高一那次数学竞赛之后,她好像递过一张纸条给我。上面写了什么来着——恭喜?还有一句……我记不清了。"
me "我那时候满脑子都是下一场考试。"
me "现在想想,可能错过了什么。"
$ yutong_stats["affection"] += 2
$ yutong_stats["attention"] += 2
jump C2S4
label C2S4:
$ game_day = 22
$ game_period = "afternoon"
scene bg auditorium with fade
play music "audio/XinLanDiary-Part2.ogg" fadein 2.0
system_ "【Day 22·周六·报告厅·电竞社校内赛】"
if flag.get("competition_note"):
show ryt dialogue normal at left with dissolve
me "人比想象的多多了!后排都站满了。陈星宇在调试设备,刘泓予戴着耳机,腿上摊着笔记本——他真的记了笔记,还画了地图,每条路线用不同颜色标出来。"
me "我瞄了一眼,密密麻麻的。\"这都是你弄的?\"他头也不抬:\"数据分析。胜率大概能提升6\%。\""
me "6\%。为了这6\%他记了整整一本。"
hide ryt with dissolve
else:
show ryt dialogue normal at left with dissolve
me "人比想象的多多了!后排都站满了。陈星宇在调试设备,颜涵端着相机在前排调试角度。"
hide ryt with dissolve
show ryt dialogue normal at left with dissolve
me "而我在找一个人。'薇风拂晓'说'比赛见'。如果她真的是本校的——"
hide ryt with dissolve
zhuchi "下面请最后一支签到队伍,'七星文学部'——呃,七班的队伍!"
show xingyu at left with dissolve
xingyu "走了涛哥!上场!"
hide xingyu with dissolve
hide ryt with dissolve
pause 1.0
system_ "【第一轮·胜】"
pause 0.3
system_ "【第二轮·胜】"
if flag.get("competition_note"):
me "第二轮僵持的时候,耳机里刘泓予的声音出奇地稳,报了个时间窗口。我照做了。击杀音效响起,他那边轻轻地说了声\"好\"。"
pause 0.3
system_ "【第三轮·平局·小组第一出线】"
show ryt dialogue normal at left with dissolve
me "手在抖,但不是因为紧张——是因为太用力了。苏雨桐说的两万次点击,估计早就超了。"
me "我放下手机活动手腕,抬头扫了一眼观众席。"
me "林晓薇正举着手机拍我。目光对上的时候,她没有躲。"
me "她笑了。虎牙露出来。"
hide ryt with dissolve
scene bg classroom phone closeup with dissolve
xiaowei_w "打得不错。"
me_w "你在现场?"
xiaowei_w "嗯。"
me_w "哪里?"
xiaowei_w "你猜。"
scene bg auditorium with dissolve
show ryt dialogue normal at right with dissolve
me "我抬头扫了一圈。后排靠左,她戴着耳机,低头看手机。像是感应到什么,她忽然抬头——"
me "虎牙。"
me "高一的时候,每次我讲完笑话,她都是第一个笑的那个。"
me "等等。每次都在我刚上线的时候出现。每次都对接下来的比赛了如指掌。"
me "\"薇风拂晓\"——林晓薇——"
me "不是吧。"
hide ryt with dissolve
$ xiaowei_stats["affection"] += 3
$ xiaowei_stats["interactionFrequency"] += 2
$ xiaowei_stats["is_xiaowei_w"] = True
jump C2S5
label C2S5:
scene bg auditorium with dissolve
zhuchi "那么,决赛即将开始——"
yang "等一下!"
show ryt dialogue normal at right with dissolve
me "杨义涵?他在另一组半决赛,我刚才没注意他们队的战绩——"
hide ryt with dissolve
yang "在决赛之前,我有话要说!"
yang "任懿涛——从刚才你绕后秒三个那一刻起,我就知道了。"
yang "你就是我这学期要找的——心中的她!"
yang "打完这场,不管谁赢——我都要跟你生下冠军宝宝!"
show ryt dialogue normal at right with dissolve
me "他指着我的时候,眼睛在发光。不是挑衅——是那种憋了一整个学期终于找到猎物的兴奋。"
me "全场爆笑。主持人手里的麦克风差点掉了。刘泓予——刘泓予低着头,肩膀在抖。"
me "连他都在笑。"
hide ryt with dissolve
menu:
"……行啊。":
$ flag["yang_rival"] = "accept"
me "我愣了两秒,然后也笑了。\"行啊。不过你到时候别后悔。\""
# me "杨义涵一拍桌子:\"后悔的是你!我一个月的午饭不便宜!\""
# 赛后杨义涵会主动找任懿涛深入聊天
jump C2S5_final
"先赢比赛再说。":
$ flag["yang_rival"] = "deflect"
$ yh_stats["affection"] += 1
me "\"先赢比赛再说。\"我笑着摆手。"
me "杨义涵不依不饶:\"那就是答应了!裁判你听见了啊!\""
# 杨义涵赛后会在群里刷屏"任懿涛欠我一顿饭"
jump C2S5_final
"生冠军宝宝你是臭gay吗":
$ flag["yang_rival"] = "joke"
$ lhy_stats["affection"] += 1
me "\"生冠军宝宝你是臭gay吗\""
me "台下林晓薇笑得趴在了前排椅背上。"
jump C2S5_final
label C2S5_final:
pause 0.5
system_ "【决赛】"
me "第一张图我们输了。对面配合很默契。"
me "中场陈星宇说:\"换战术,涛哥你自由发挥。\""
if flag.get("competition_note"):
me "刘泓予翻开他那本笔记:\"对面有个习惯,我能预测他的走位。\""
me "\"你怎么知道的?\""
me "\"我把他们前面的比赛录像都看了一遍。\"他推了下并没有戴的眼镜。\"数据分析嘛。\""
me "第二张图,我们换了战术,扳回来。"
me "第三张图,最后十几秒还是平局。我想起颜涵说我\"习惯性右偏\"——既然我有pattern对手肯定也有。反着来就行了。"
me "赢了。"
system_ "【决赛结果·七星文学部 2:1 获胜】"
pause 0.5
me "领奖的时候陈星宇举着键盘拍了十几张自拍。刘泓予站在旁边,嘴角那个弧度约等于\"笑\"。"
me "散场了。人潮往外涌,外面天已经快黑了。"
$ tao_stats["humorSense"] += 2
jump C2S6
label C2S6:
$ game_period = "evening"
scene bg schoolgate evening with fade
play music "audio/XinLanDiary-Part2.ogg" fadein 2.0
system_ "【赛后·傍晚·校门口】"
show ryt dialogue normal at right with dissolve
me "陈星宇说去庆祝,刘泓予说有事,先走了。我故意走慢了一点。"
me "我在等一个人。"
hide ryt with dissolve
show xiaowei at left with dissolve
xiaowei "那个……"
me "路灯下面,她的短发被风吹得有点乱。"
me "你来了。"
xiaowei "恭喜你。冠军。"
xiaowei "我说了会旁观的嘛。"
show ryt dialogue normal at right with dissolve
me "我没有拿出手机。我只是看着她。"
me "\"薇风拂晓\"——每次都在我上线的时候出现。每次都知道关于我的事。"
me "我举起手机。屏幕上,是\"薇风拂晓\"的对话框。"
hide ryt with dissolve
xiaowei "……"
xiaowei "我就知道瞒不过你。"
hide xiaowei with dissolve
menu:
"所以游戏里的配合,都是演的?":
$ xiaowei_stats["affection"] += 1
show xiaowei at left with dissolve
xiaowei "不是演的!我真的觉得我们配合很好——啊不对,我不是那个意思——"
hide xiaowei with dissolve
"怎么不早说?":
$ xiaowei_stats["affection"] += 2
show xiaowei at left with dissolve
xiaowei "因为怕你觉得奇怪……高一之后就分班了,突然游戏里相认什么的……而且——"
xiaowei "而且其实,我段位比你高。"
hide xiaowei with dissolve
me "……什么?"
show xiaowei at left with dissolve
xiaowei "全服前五百。\n用小号是因为……不想被你当成\"那个打游戏很厉害的女生\"。就想,先当个普通队友。"
hide xiaowei with dissolve
"……下次排位带带我?":
$ xiaowei_stats["affection"] += 3
show xiaowei at left with dissolve
xiaowei "……欸?{cps=2}啊、好!{cps=20}不对,你段位比我高!"
me "是吗?我怎么觉得你在骗我。"
xiaowei "我、我没有!"
me "耳朵红了。每次说谎都这样。"
xiaowei "好吧好吧!其实我大号全服前五百……"
me "……什么?"
hide xiaowei with dissolve
show xiaowei at left with dissolve
xiaowei "总之……对不起?瞒了你这么久。"
hide xiaowei with dissolve
me "高一那个课间,她也是这样低头翻笔记,然后抬头说\"你刚才那个笑话再讲一遍\"。"
me "没什么好道歉的。"
me "只是下次要说实话。"
me "游戏里——如果有下次配合的话。"
show xiaowei at left with dissolve
xiaowei "……欸?"
xiaowei "一定!"
hide xiaowei with dissolve
me "她笑了。虎牙露出来。跟高一那个课间一样的笑。"
$ xiaowei_stats["synergy"] += 3
$ xiaowei_stats["interactionFrequency"] += 2
jump C2S7
label C2S7:
$ game_period = "night"
scene bg ryt room night with fade
stop music fadeout 1.0
play music "audio/XinLanDiary-Part2.ogg" fadein 2.0
system_ "【同夜·家中】"
show ryt dialogue normal at right with dissolve
me "躺在床上,盯着天花板。今天发生了太多事——冠军、挑战书、她的身份。"
me "手机亮了。一条是陈星宇发的庆祝表情包,一条是杨义涵的好友申请——备注写\"午饭的事别忘了\"。"
me "我笑了笑,点了通过。"
mom "「今天怎么样?」"
pause 0.3
me "打了场比赛。赢了。"
mom "「别玩太晚。」"
me "就三句话。但这次,我不觉得烦了。可能是赢了比赛心情好吧。"
hide ryt with dissolve
show ryt dialogue normal at right with dissolve
me "然后——手机又亮了。"
hide ryt with dissolve
yutong "《四角州行动》概率计算题,我出在了学习部的下周挑战里。如果你有兴趣的话。"
me "她怎么有我的联系方式。"
me "不对,她是学习部部长,找谁的联系方式都行。但为什么专门发给我?"
me "概率计算题。用游戏出题——她知道我会感兴趣。"
system_ "【画廊更新】电竞时刻:手速与反应速度的实证研究。"
me "果然。李泽瑄不会放过任何素材。"
me "但照片里——不止我一个人。陈星宇在画面边缘大笑,刘泓予低头记笔记,林晓薇在观众席举起手机。"
me "还有角落里,苏雨桐抱着笔记本,假装在看别的地方。"
me "我突然想起那个反侦察计划——陈星宇提了一回就再没下文了。但不知什么时候开始,我已经不在乎是谁在拍我了。"
me "原来被拍下来的时候,我一直不是一个人。"
me "窗外,十一月的夜空很干净。高一的时候我从没注意过这些。"
me "现在我开始观察。"
$ yutong_stats["affection"] += 2
$ yutong_stats["attention"] += 2
$ lzx_stats["infoOpenness"] += 1
$ tao_stats["selfAcceptance"] += 2
pause 0.8
scene bg street night with fade
system_ "【林晓薇·回家路上】"
"几公里外,林晓薇走在回家的路上,耳机里放着播客。"
"她低头看着手机——屏幕上还是下午偷拍的任懿涛。照片上他咬着嘴唇,手指悬在屏幕上方,在做一个关键判断。"
"她放大照片,又缩小。然后打开游戏,看了看\"逍遥剑客\"的离线状态。"
xiaowei "下次排位……应该不用再装了吧。"
"她把耳机音量调大。虎牙又露了出来。"
$ xiaowei_stats["affection"] += 2
$ xiaowei_stats["synergy"] += 2
pause 1.0
scene bg black with fade
pause 1.5
system_ "【第二章·游戏内外·完】"
return

Binary file not shown.

BIN
game/audio/MainMenu.ogg Normal file

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.2 MiB

After

Width:  |  Height:  |  Size: 3.2 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 MiB

BIN
game/images/bg rooftop.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 96 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 54 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 89 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 106 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 438 KiB

BIN
game/images/xiaowei.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 403 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.5 MiB

BIN
game/images/yutong.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 323 KiB

View File

@@ -27,7 +27,7 @@ define gui.show_name = True
## 游戏版本号。 ## 游戏版本号。
define config.version = "dev0.0.6" define config.version = "dev0.1.0.0"
## 放置在游戏内“关于”屏幕上的文本。将文本放在三个引号之间,并在段落之间留出空 ## 放置在游戏内“关于”屏幕上的文本。将文本放在三个引号之间,并在段落之间留出空
@@ -39,7 +39,8 @@ define gui.about = _p("""
\n 角色设计xwhy \n 角色设计xwhy
\n 程序FL \n 程序FL
\n 图像FL \n 图像FL
\n 感谢以下人员对项目做出的贡献yh, wjj等。 \n 音乐FL
\n 感谢以下人员对项目做出的贡献yh, Zeptyer等。
""") """)
@@ -69,7 +70,7 @@ define config.has_voice = False
## 将以下语句取消注释就可以设置标题界面播放的背景音乐文件。此文件将在整个游戏中 ## 将以下语句取消注释就可以设置标题界面播放的背景音乐文件。此文件将在整个游戏中
## 持续播放,直至音乐停止或其他文件开始播放。 ## 持续播放,直至音乐停止或其他文件开始播放。
# define config.main_menu_music = "main-menu-theme.ogg" define config.main_menu_music = "audio/MainMenu.ogg"
## 转场 ########################################################################## ## 转场 ##########################################################################

View File

@@ -136,6 +136,217 @@ screen say(who, what):
init python: init python:
config.character_id_prefixes.append('namebox') config.character_id_prefixes.append('namebox')
## 齿轮图标 Displayable 类
import math
import pygame
class GearDisplayable(renpy.Displayable):
"""
创建一个现代简洁风格的齿轮图标 Displayable
参数:
- size: 图标大小(像素)
- color: 齿轮颜色(十六进制)
- alpha: 透明度 (0.0-1.0)
"""
def __init__(self, size=48, color="#FFFFFF", alpha=0.85):
super(GearDisplayable, self).__init__()
self.size = size
self.color = color
self.alpha = alpha
def render(self, width, height, st, at):
# 创建渲染对象
render = renpy.Render(self.size, self.size)
# 创建surface
surface = pygame.Surface((self.size, self.size), pygame.SRCALPHA)
# 解析颜色
color_rgb = tuple(int(self.color.lstrip('#')[i:i+2], 16) for i in (0, 2, 4))
color_with_alpha = color_rgb + (int(self.alpha * 255),)
center = self.size // 2
outer_radius = self.size // 2 - 4 # 外圈半径
inner_radius = int(outer_radius * 0.4) # 内圆半径
tooth_height = int(outer_radius * 0.25) # 齿高
num_teeth = 8 # 齿数
# 绘制齿轮路径点
points = []
for i in range(num_teeth * 2):
angle = (i * 360 / (num_teeth * 2)) * math.pi / 180
if i % 2 == 0: # 齿尖
radius = outer_radius
else: # 齿根
radius = outer_radius - tooth_height
x = center + int(radius * math.cos(angle))
y = center + int(radius * math.sin(angle))
points.append((x, y))
# 绘制齿轮外圈
pygame.draw.polygon(surface, color_with_alpha, points, 0)
# 绘制内圆(镂空效果)
pygame.draw.circle(surface, (0, 0, 0, 0), (center, center), inner_radius)
# 绘制中心圆(增强设计感)
center_circle_radius = int(inner_radius * 0.5)
pygame.draw.circle(surface, color_with_alpha, (center, center), center_circle_radius, 0)
# 将surface绘制到render
render.blit(surface, (0, 0))
return render
def create_settings_gear_hover(size=96):
"""创建hover状态的齿轮更亮"""
return GearDisplayable(size=size, color="#FFFFFF", alpha=1.0)
def create_settings_gear_idle(size=96):
"""创建idle状态的齿轮"""
return GearDisplayable(size=size, color="#FFFFFF", alpha=0.9)
## 圆形画廊/日期图标 Displayable 类
class PageDisplayable(renpy.Displayable):
"""圆形画廊图标:白圆 + 深色纸张 + 白色线条"""
def __init__(self, size=48, alpha=0.85):
super(PageDisplayable, self).__init__()
self.size = size
self.alpha = alpha
def render(self, width, height, st, at):
size = self.size
a = int(self.alpha * 255)
surface = pygame.Surface((size, size), pygame.SRCALPHA)
center = size // 2
radius = size // 2 - 4
# 白色圆形背景
pygame.draw.circle(surface, (255, 255, 255, a), (center, center), radius)
# 深色纸张(圆角矩形,手动实现以兼容 renpy.pygame
pw = int(radius * 0.78)
ph = int(radius * 1.05)
px = center - pw // 2
py = center - ph // 2
paper_color = (32, 42, 68, min(a + 30, 255))
cr = 4 # 圆角半径
pygame.draw.rect(surface, paper_color, (px + cr, py, pw - 2 * cr, ph))
pygame.draw.rect(surface, paper_color, (px, py + cr, pw, ph - 2 * cr))
pygame.draw.circle(surface, paper_color, (px + cr, py + cr), cr)
pygame.draw.circle(surface, paper_color, (px + pw - cr, py + cr), cr)
pygame.draw.circle(surface, paper_color, (px + cr, py + ph - cr), cr)
pygame.draw.circle(surface, paper_color, (px + pw - cr, py + ph - cr), cr)
# 三条白色横线
lc = (210, 225, 245, int(self.alpha * 210))
lx0 = px + int(pw * 0.16)
lx1 = px + int(pw * 0.84)
for i in range(3):
ly = py + int(ph * 0.28) + i * int(ph * 0.22)
pygame.draw.line(surface, lc, (lx0, ly), (lx1, ly), max(2, size // 48))
render = renpy.Render(size, size)
render.blit(surface, (0, 0))
return render
def visit(self):
return []
def create_gallery_page_idle(size=96):
return PageDisplayable(size=size, alpha=0.85)
def create_gallery_page_hover(size=96):
return PageDisplayable(size=size, alpha=1.0)
## 游戏内日期字符串函数
import datetime as _dt
def get_game_date_str():
"""根据 game_day 和 game_period 返回完整游戏内日期字符串"""
base = _dt.date(store.game_start_year, store.game_start_month, store.game_start_day)
current = base + _dt.timedelta(days=store.game_day - 1)
period_map = {
"morning": "上午",
"afternoon": "下午",
"after_school": "放学后",
"evening": "傍晚",
"night": "深夜",
}
period_text = period_map.get(store.game_period, "")
return "{}年{}月{}日 {}".format(current.year, current.month, current.day, period_text)
## 画廊数据与辅助函数
GALLERY_PHOTOS = [
{
"id": "pearl",
"file": "images/gallery/photo_pearl.png",
"title": "珍珠耳环",
"desc": "某个无聊的午后,\n镜子里映出一张陌生的脸。\n古典与现代在此刻奇异地重叠。",
"date": "2029.09.05",
"always_unlocked": True,
},
{
"id": "monalisa",
"file": "images/gallery/photo_monalisa.jpg",
"title": "永恒的微笑",
"desc": "AI说你和她很像。\n我觉得那是在骂我。",
"date": "2029.09.05",
"always_unlocked": True,
},
{
"id": "corridor",
"file": "images/gallery/photo_corridor.jpg",
"title": "考前",
"desc": "考场门外,时间凝固了一样。\n走廊的灯光把影子拉得很长。",
"date": "2029.09.10",
"always_unlocked": True,
},
{
"id": "sleeping",
"file": "images/gallery/photo_sleeping.jpg",
"title": "力学之美",
"desc": "一切运动都趋向静止。\n这是物理定律也是我的日常。\n\n——任懿涛",
"date": "2029.10.01",
"always_unlocked": False,
},
]
def is_gallery_photo_unlocked(photo):
if photo["always_unlocked"]:
return True
if photo["id"] == "sleeping":
return store.gallery_photo4_unlocked
return False
def is_photo_new(photo_id):
seen = persistent.gallery_seen
if seen is None:
return True
return photo_id not in seen
def mark_photo_seen(photo_id):
if persistent.gallery_seen is None:
persistent.gallery_seen = set()
persistent.gallery_seen.add(photo_id)
def has_any_new_gallery_photo():
for photo in GALLERY_PHOTOS:
if is_gallery_photo_unlocked(photo) and is_photo_new(photo["id"]):
return True
return False
def clear_all_game_data():
"""清除所有存档和持久化数据,然后重启游戏。"""
for slot, _, _, _ in renpy.list_saved_games(regexp=r'.+'):
renpy.unlink_save(slot)
persistent._clear(progress=True)
renpy.save_persistent()
renpy.full_restart()
style window is default style window is default
style say_label is default style say_label is default
style say_dialogue is default style say_dialogue is default
@@ -295,6 +506,451 @@ style quick_button_text:
properties gui.text_properties("quick_button") properties gui.text_properties("quick_button")
################################################################################
## HUD Overlay - 游戏内浮动图标
################################################################################
## 该屏幕在游戏进行时显示在左上角,提供快速访问菜单的图标按钮
screen hud_overlay():
## 确保在所有UI之上
zorder 101
## 只在游戏进行时显示,不在主菜单显示
if not main_menu and not renpy.context()._menu:
## 桌面版 - 左上角齿轮图标
if renpy.variant("pc") or renpy.variant("web"):
vbox:
xpos 40
ypos 40
imagebutton:
idle create_settings_gear_idle(96)
hover create_settings_gear_hover(96)
action ShowMenu()
tooltip "游戏菜单"
## 右上角画廊/日期图标1920 - 96 - 40 = 1784
fixed:
xpos 1784
ypos 40
xysize (96, 96)
button:
xfill True
yfill True
background create_gallery_page_idle(96)
hover_background create_gallery_page_hover(96)
action ToggleScreen("gallery_panel")
tooltip "画廊 / 日期"
if has_any_new_gallery_photo():
frame:
xanchor 1.0
xpos 96
yanchor 0.0
ypos 0
xysize (36, 20)
background "#e03030"
padding (3, 2, 3, 2)
text "NEW":
xalign 0.5
yalign 0.5
color "#ffffff"
size 13
bold True
## 移动端 - 稍大的图标,更易点击
elif renpy.variant("touch") or renpy.variant("small"):
vbox:
xpos 30
ypos 30
imagebutton:
idle create_settings_gear_idle(112)
hover create_settings_gear_hover(112)
action ShowMenu()
## 移动端增大点击区域
xysize (120, 120)
## 移动端右上角画廊/日期图标
fixed:
xpos 1730
ypos 30
xysize (112, 112)
button:
xfill True
yfill True
background create_gallery_page_idle(112)
hover_background create_gallery_page_hover(112)
action ToggleScreen("gallery_panel")
if has_any_new_gallery_photo():
frame:
xanchor 1.0
xpos 112
yanchor 0.0
ypos 0
xysize (36, 20)
background "#e03030"
padding (3, 2, 3, 2)
text "NEW":
xalign 0.5
yalign 0.5
color "#ffffff"
size 13
bold True
## 注册HUD overlay为持久显示的屏幕
init python:
config.overlay_screens.append("hud_overlay")
################################################################################
## 画廊/日期面板
################################################################################
screen gallery_panel():
zorder 150
modal True
## 全屏半透明背景,点击关闭
button:
xfill True
yfill True
background "#00000066"
action Hide("gallery_panel")
## 右侧侧边栏面板340×1080
frame:
xanchor 1.0
xpos 1920
yanchor 0.0
ypos 0
xysize (340, 1080)
background "#0d0f1ef0"
padding (0, 0, 0, 0)
vbox:
xfill True
spacing 0
## 顶部:日期 + 关闭按钮
frame:
xfill True
ysize 72
background None
padding (24, 0, 40, 0)
hbox:
xfill True
yalign 0.5
spacing 8
text get_game_date_str():
color "#a8c8f0"
size 26
yalign 0.5
font "fonts/AlibabaPuHuiTi-3-55-Regular.ttf"
frame:
xfill True
background None
textbutton "×":
action Hide("gallery_panel")
text_size 34
text_color "#a8c8f0"
text_hover_color "#ffffff"
yalign 0.5
## 分割线
frame:
xfill True
ysize 1
background "#ffffff22"
## 工具栏标题
frame:
xfill True
background None
padding (24, 16, 24, 8)
text "工具栏":
color "#778899"
size 22
font "fonts/AlibabaPuHuiTi-3-55-Regular.ttf"
## 画廊图标按钮
button:
xalign 0.5
ysize 160
background None
hover_background "#ffffff11"
action Function(renpy.show_screen, "yitao_gallery")
vbox:
xalign 0.5
yalign 0.5
spacing 10
frame:
xalign 0.5
xysize (112, 112)
background None
padding (0, 0, 0, 0)
add "images/gallery/icon_gallery.png":
fit "contain"
xsize 112
ysize 112
text "画廊":
xalign 0.5
color "#cccccc"
size 22
font "fonts/AlibabaPuHuiTi-3-55-Regular.ttf"
## ESC 键关闭
key "game_menu" action Hide("gallery_panel")
################################################################################
## YITAO-REN GALLERY 主画廊屏幕
################################################################################
screen yitao_gallery():
zorder 155
modal True
## 全屏深色背景
frame:
xfill True
yfill True
background "#0a0c1a"
padding (0, 0, 0, 0)
vbox:
xfill True
yfill True
spacing 0
## 顶栏(高 80px
frame:
xfill True
ysize 80
background "#0d0f28cc"
padding (48, 0, 48, 0)
hbox:
xfill True
yalign 0.5
spacing 0
text "YITAO-REN GALLERY":
color "#c8d8f0"
size 32
yalign 0.5
font "fonts/AlibabaPuHuiTi-3-55-Regular.ttf"
frame:
xfill True
background None
textbutton "×":
action Hide("yitao_gallery")
text_size 38
text_color "#a8c8f0"
text_hover_color "#ffffff"
yalign 0.5
## 照片卡片区(占剩余空间,垂直居中)
frame:
xfill True
yfill True
background None
padding (0, 0, 0, 0)
hbox:
xalign 0.5
yalign 0.5
spacing 24
for photo in GALLERY_PHOTOS:
$ _pid = photo["id"]
$ _unlocked = is_gallery_photo_unlocked(photo)
$ _is_new = _unlocked and is_photo_new(_pid)
## 单张卡片(白色边框 = NEW
frame:
xysize (425, 567)
yalign 0.5
background ("#ffffff" if _is_new else "#1a1c2a")
padding ((3, 3, 3, 3) if _is_new else (0, 0, 0, 0))
if _unlocked:
button:
xfill True
yfill True
background None
hover_background "#ffffff14"
action [Function(mark_photo_seen, _pid), Function(renpy.show_screen, "gallery_detail", photo=photo)]
add photo["file"]:
fit "cover"
xsize 425
ysize 567
else:
## 未解锁:锁定状态
frame:
xfill True
yfill True
background "#111320"
padding (0, 0, 0, 0)
text "?":
xalign 0.5
yalign 0.5
color "#445566"
size 80
## NEW 角标(绝对定位于卡片右上角)
if _is_new:
frame:
xanchor 1.0
xpos 422
yanchor 0.0
ypos 0
xysize (60, 28)
background "#e03030"
padding (4, 2, 4, 2)
text "NEW":
xalign 0.5
yalign 0.5
color "#ffffff"
size 16
bold True
key "game_menu" action Hide("yitao_gallery")
################################################################################
## 画廊详情屏幕
################################################################################
screen gallery_detail(photo):
zorder 160
modal True
## 全屏背景
frame:
xfill True
yfill True
background "#0a0c1a"
padding (0, 0, 0, 0)
vbox:
xfill True
yfill True
spacing 0
## 顶栏(高 72px
frame:
xfill True
ysize 72
background "#0d0f28cc"
padding (40, 0, 40, 0)
textbutton "← YITAO-REN GALLERY":
action Hide("gallery_detail")
text_size 26
text_color "#a8c8f0"
text_hover_color "#ffffff"
yalign 0.5
## 主体区域(左图右文)
frame:
xfill True
yfill True
background None
padding (0, 0, 0, 0)
hbox:
xfill True
yfill True
spacing 0
## 左栏图片55%xsize 1056
frame:
xsize 1056
yfill True
background None
padding (0, 0, 0, 0)
add photo["file"]:
xalign 0.5
yalign 0.5
fit "contain"
xsize 960
ysize 1008
## 右栏文字信息45%xsize 864
frame:
xsize 864
yfill True
background "#0d0f28"
padding (60, 0, 60, 0)
vbox:
xfill True
yalign 0.3
spacing 20
## 照片标题
frame:
xfill True
background None
padding (0, 40, 0, 16)
text photo["title"]:
color "#ffffff"
size 52
font "fonts/AlibabaPuHuiTi-3-55-Regular.ttf"
## 水平分割线
frame:
xfill True
ysize 1
background "#ffffff44"
## 描述文字
frame:
xfill True
background None
padding (0, 20, 0, 20)
text photo["desc"]:
color "#aaaaaa"
size 26
font "fonts/AlibabaPuHuiTi-3-55-Regular.ttf"
line_spacing 12
## 发布日期
text photo["date"]:
color "#666666"
size 20
font "fonts/AlibabaPuHuiTi-3-55-Regular.ttf"
key "game_menu" action Hide("gallery_detail")
################################################################################ ################################################################################
## 标题和游戏菜单屏幕 ## 标题和游戏菜单屏幕
################################################################################ ################################################################################
@@ -819,6 +1475,23 @@ screen preferences():
action Preference("all mute", "toggle") action Preference("all mute", "toggle")
style "mute_all_button" style "mute_all_button"
null height (4 * gui.pref_spacing)
hbox:
style_prefix "check"
box_wrap True
vbox:
label _("危险操作")
textbutton _("清除所有数据"):
action Confirm(
_("此操作将清除所有存档和游戏进度,且无法撤销。\n确定要继续吗"),
yes=Function(clear_all_game_data),
no=Hide("confirm")
)
style "mute_all_button"
style pref_label is gui_label style pref_label is gui_label
style pref_label_text is gui_label_text style pref_label_text is gui_label_text

View File

@@ -1,4 +1,4 @@
# 游戏的脚本可置于此文件中。 # 游戏的脚本可置于此文件中。
# 声明此游戏使用的角色。颜色参数可使角色姓名着色。 # 声明此游戏使用的角色。颜色参数可使角色姓名着色。
define me = Character("任懿涛", color="#71b4e4", what_slow_cps=19, who_outlines=[(1, "#565656", 0, 0)]) define me = Character("任懿涛", color="#71b4e4", what_slow_cps=19, who_outlines=[(1, "#565656", 0, 0)])
@@ -62,9 +62,9 @@ default yh_stats = {
# 徐卫浩宇 - 指数0-100 # 徐卫浩宇 - 指数0-100
default xwhy_stats = { default xwhy_stats = {
"affection": 0, # 好感度 "affection": 0, # 好感度
"reliance": 0, # 依赖度 "reliance": 0, # 依赖度
"helpfulness": 0 # 帮助度 "helpfulness": 0 # 帮助度
} }
# lzx - 指数0-10 # lzx - 指数0-10
@@ -72,6 +72,23 @@ default lzx_stats = {
"infoOpenness": 0, # 信息开放度 "infoOpenness": 0, # 信息开放度
} }
# ====== 其他全局变量 ======
default flag = {
}
# ====== 时间系统变量 ======
default game_day = 1 # 游戏内日期(第几天)
default game_period = "morning"
# 可选值morning / afternoon / after_school / evening / night
default game_start_year = 2029
default game_start_month = 9
default game_start_day = 3 # Day 1 = 2029年9月3日开学周一
# ====== 画廊系统变量 ======
default persistent.gallery_seen = set() # 已查看的照片 id 集合
default gallery_photo4_unlocked = False # "力学之美"照片解锁标志
# ====== 可选:总字典管理(便于批量操作) ====== # ====== 可选:总字典管理(便于批量操作) ======
''' '''
@@ -113,10 +130,14 @@ transform zoom_to_upper_right:
# 快速放大并向左下偏移(画面看起来往右上移动) # 快速放大并向左下偏移(画面看起来往右上移动)
ease 0.3 zoom 1.7 xalign 0.6 yalign 0.2 ease 0.3 zoom 1.7 xalign 0.6 yalign 0.2
#label before_main_menu:
# $ renpy.music.play("andio/MainMenu.ogg", loop=True, fadein=2.0)
# 游戏在此开始。 # 游戏在此开始。
label start: label start:
# stop music fadeout 1.0
jump Chapter1_Scene1 jump Chapter1_Scene1
# 此处为游戏结尾。 # 此处为游戏结尾。

Binary file not shown.

BIN
game/xiaowei.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 MiB

10
progressive_download.txt Normal file
View File

@@ -0,0 +1,10 @@
# RenPyWeb progressive download rules - first match applies
# '+' = progressive download, '-' = keep in game.zip (default)
# See https://www.renpy.org/doc/html/build.html#classifying-and-ignoring-files for matching
#
# +/- type path
- image game/gui/**
- image game/images/ryt%20normal%20spec.png
+ image game/**
+ music game/audio/**
+ voice game/voice/**

View File

@@ -1,7 +1,9 @@
{ {
"build_update": false, "build_update": false,
"packages": [ "packages": [
"mac" "mac",
"linux",
"win"
], ],
"add_from": true, "add_from": true,
"force_recompile": true, "force_recompile": true,

131
review/Chapter1-review.md Normal file
View File

@@ -0,0 +1,131 @@
# Chapter1.rpy 审阅报告
## 文件信息
- 文件路径: `game/Chapters/Chapter1.rpy`
- 行数: 429
- 包含场景: Chapter1_Scene1 ~ Chapter1_Scene4
- 跳转终点: Chapter2_Scene1位于 Chapter2.rpy
---
## 语法错误
**无严重语法错误**。Ren'Py 基本语法正常,`scene`/`show`/`hide`/`jump` 语句格式正确,`$` Python 赋值语句语法正常。
---
## 角色定义检查
| 角色 | 定义位置 | 使用情况 | 状态 |
|------|----------|----------|------|
| `me` | script.rpy:4 | 正常 | ✓ |
| `system_` | script.rpy:11 | 正常 | ✓ |
| `xingyu` | script.rpy:5 | 正常 | ✓ |
| `lhy` | script.rpy:6 | 正常 | ✓ |
| `lzx` | script.rpy:7 | 仅旁白引用,未使用 Character 发言 | ✓ |
| `tongxue` | script.rpy:16 | 正常 | ✓ |
| `yutong` | script.rpy:13 | 正常 | ✓ |
| `ganshi` | script.rpy:17 | 正常 | ✓ |
| `xiaowei` | script.rpy:9 | 正常 | ✓ |
| `xiaowei_w` | script.rpy:10 | 正常 | ✓ |
| `me_w` | script.rpy:15 | 正常 | ✓ |
| `mom` | script.rpy:12 | 正常 | ✓ |
| `yh` | script.rpy:14 | 正常 | ✓ |
| `"便利店主"` | 行343字符串字面量 | ⚠️ 见下方说明 | ✓ |
### 关于"便利店主"角色(行 343
```renpy
"便利店主" "小任,新品。尝尝,你们年轻人喜欢这个。"
```
此角色未在 script.rpy 中定义为 Character 对象使用了内联字符串作为说话人。Ren'Py **允许**此写法,会自动生成临时角色。但建议统一在 script.rpy 中定义,便于管理颜色、语速等属性。
---
## 图像引用检查
所有 `show` 命令引用的图像均在 `game/images/` 目录中找到对应文件:
| 引用 | 文件 |
|------|------|
| `aunt normal` | `aunt normal.png` ✓ |
| `xingyu thinking/laughing/laughing big/laughing 2` | 对应 png 均存在 ✓ |
| `ryt dialogue normal/hit/embarrass pocket/embarrass pocket2/normal spec` | 对应 png 均存在 ✓ |
| `lhy dialogue normal` | `lhy dialogue normal.png` ✓ |
| `yh camerabag` | `yh camerabag.png` ✓ |
| `xiaowei` / `xiaowei embarrass` | 对应 png 均存在 ✓ |
所有背景图像文件均存在 ✓
---
## Flag 和变量检查
### 统计变量修改
| 变量 | 修改位置 | 累计修改值 |
|------|----------|-----------|
| `lhy_stats["affection"]` | 行85, 153, 323 | +3, +5, +3 = **+11** |
| `lhy_stats["trust"]` | 行86, 154 | +2, +5 = **+7** |
| `lhy_stats["empathy"]` | 行155 | **+3** |
| `xingyu_stats["affection"]` | 行87, 320 | +3, +5 = **+8** |
| `xingyu_stats["cooperation"]` | 行88, 321 | +2, +5 = **+7** |
| `xingyu_stats["helpfulness"]` | 行322 | **+3** |
| `tao_stats["humorSense"]` | 行89 | **+2** |
| `tao_stats["selfAcceptance"]` | 行156, 326, 380 | +1, +2, +1 = **+4** |
| `tao_stats["studyStress"]` | 行157, 381 | +2, +1 = **+3** |
| `lzx_stats["infoOpenness"]` | 行90 | **+1** |
| `yutong_stats["affection"]` | 行193, 378, 397 | +3, +2, +3 = **+8** |
| `yutong_stats["attention"]` | 行194, 379, 398 | +5, +3, +4 = **+12** |
| `yutong_stats["h_academicSupport"]` | 行195 | **+1** |
| `xiaowei_stats["affection"]` | 行233, 412 | +4, +3 = **+7** |
| `xiaowei_stats["interactionFrequency"]` | 行234, 413 | +2, +3 = **+5** |
| `xiaowei_stats["is_xiaowei_w"]` | 行235 | 设为 False |
| `yh_stats["affection"]` | 行324 | **+3** |
| `yh_stats["understanding"]` | 行325 | **+2** |
所有修改的 stat key 均在 script.rpy 中定义 ✓
### 其他变量
- `gallery_photo4_unlocked = True` (行73): 定义在 script.rpy:90 ✓
- `game_day` / `game_period`: 正常赋值 ✓
---
## 逻辑错误
### ⚠️ 1. `hide ryt` 冗余调用(行 128
```renpy
# 行125: #show ryt hit at center with dissolve ← 已被注释
# 行126: scene bg playground with dissolve ← scene 清空所有图像
# 行127: me "深吸一口气..." ← me 无 sprite 也能说话
# 行128: hide ryt with dissolve ← ryt 已不存在,无操作
```
`show ryt` 已被注释,且 `scene` 语句已清空场景,`hide ryt` 为无效操作。不会导致运行时错误,但可删除。
### ⚠️ 2. `$ xiaowei_stats["is_xiaowei_w"] = False` 冗余(行 235
`is_xiaowei_w` 默认值已为 `False`script.rpy:46此处重新赋值无实际效果。虽不致命但如果意图是"在特定剧情点重置该 flag",应确认逻辑正确性。
---
## 奇怪/不当的对话
### 无明显问题
Chapter1 的对话整体符合角色设定,叙事流畅,不存在明显不当内容。
### 小建议
- 行58: `me "你们先打,下次我一定来 {cps=3} {cps=20}——前提是我妈能接受她儿子在篮球场上挥洒青春而不是在车里背单词。"``{cps=3}` 后跟空格再 `{cps=20}`,在空格处会以 cps=20 显示,即瞬间且无声停顿后正常语速。符合预期停顿效果。
---
## 清理建议
1. 删除无效注释行如行61 的 `#stop music fadeout 1.0`、行125 的 `#show ryt hit...` 等)
2. 删除元数据注释行71, 78, 165, 177, 182, 218, 243 中的 `.lzx` 标注属于作者审阅标记,不应留在正式脚本中)
3.`"便利店主"` 统一定义为 Character 对象
4. 删除行128 的冗余 `hide ryt`

View File

@@ -0,0 +1,110 @@
# Chapter2-Side.rpy 审阅报告
## 文件信息
- 文件路径: `game/Chapters/Chapter2/Chapter2-Side.rpy`
- 行数: 126
- 包含场景: C2Side1, C2Side1S1, C2Side1S2, C2Side1S3
- 入口: 仅从 Chapter2_Scene1 菜单"邀请刘泓予"跳入
---
## 语法错误
**无语法错误**
---
## 角色定义检查
| 角色 | 定义位置 | 使用情况 | 状态 |
|------|----------|----------|------|
| `me` | script.rpy:4 | 正常 | ✓ |
| `lhy` | script.rpy:6 | 正常 | ✓ |
| `tongxue` | script.rpy:16 | 正常 | ✓ |
---
## 图像引用检查
- `bg rooftop`: `bg rooftop.png` 存在untracked
- `lhy dialogue normal`: 存在 ✓
- `ryt dialogue normal` / `ryt dialogue embarrass pocket` / `ryt dialogue embarrass pocket2`: 存在 ✓
---
## Flag 和变量检查
| 变量/Flag | 设置位置 | 值 | 读取位置 |
|-----------|----------|-----|----------|
| `flag["C4"]` | 行75 | 1 | **未读取** |
| `flag["competition_note"]` | 行75 | True | Chapter2.rpy:237 |
| `lhy_stats["trust"]` | 行77, 100 | +2 / +1 | — |
| `lhy_stats["empathy"]` | 行79, 101, 123 | +1 each | — |
| `tao_stats["humorSense"]` | 行78, 101, 122 | +1 each | — |
| `lhy_stats["affection"]` | 行38, 41, 44 | +3/+2/+1 (按选择) | — |
### 未使用的 Flag
`flag["C4"]` (行75): 在 C2Side1S1 分支中设为 1但代码库中未读取。推测为第4章的预留 flag建议加注释说明。
---
## 逻辑错误
### 🔴 严重: `return` 导致游戏直接结束 (行 6-7)
```renpy
label C2Side1:
if lhy_stats["affection"] < 11:
return
```
**问题**: 进入 C2Side1 的方式是通过 `jump C2Side1`Chapter2.rpy:45没有 `call` 调用栈。当 `return` 被执行时Ren'Py 会**返回主菜单**,而非继续游戏。
**触发条件**: `lhy_stats["affection"] < 11`。实际上 Chapter1 结束时 lhy affection = 113+5+3加上 Chapter2_Scene1 选择"邀请刘泓予"后 +5 = 16所以当前数据下该条件永远为 False。但
- 若有其他路径进入 C2Side1 且 affection 不足,游戏会异常退出
- 代码意图是"好感度不够时跳过支线"
**修复**:
```renpy
if lhy_stats["affection"] < 11:
jump C2S2
```
---
## 奇怪/不当的对话
### 🔴 严重: 行89 — 极度不当的辱骂
```renpy
me "你妈死了刘泓予!"
```
这是 C2Side1S2选择"怕什么,我可以一打三")分支中的主角台词。上下文:
```
lhy "你的自信心从何而来我一直很好奇。但这确实有一定作用。"
me "你妈死了刘泓予!" ← 突兀的辱骂
```
**问题严重**:
1. 与前后文**完全脱节**——刘泓予刚说完一句中性偏正面的话,主角毫无理由地突然辱骂
2. 与主角**人设严重冲突**——任懿涛是使用幽默应对压力的高中生,不是毫无理由口出恶言的人
3. 在校园题材视觉小说中加入此类粗口极为不协调
**建议**: 立刻替换为符合角色性格的台词。例如:
```renpy
me "你说话怎么跟我妈似的..."
```
或:
```renpy
me "行行行,你说得对。但我就是自信,天生的。"
```
---
## 清理建议
1. **立即修改行89的辱骂台词**(最高优先级)
2. 修复行7的 `return``jump C2S2`
3.`flag["C4"]` 添加用途注释

160
review/Chapter2-review.md Normal file
View File

@@ -0,0 +1,160 @@
# Chapter2.rpy 审阅报告
## 文件信息
- 文件路径: `game/Chapters/Chapter2/Chapter2.rpy`
- 行数: 440
- 包含场景: Chapter2_Scene1, C2S2 ~ C2S7 + C2S5_end
- 新增角色定义: `zhuchi` (主持人), `yang` (杨义涵)
---
## 语法错误
**无语法错误**`menu` 语句、条件跳转、`if`/`else` 结构基本正确(详见下方逻辑错误部分)。
---
## 角色定义检查
| 角色 | 定义位置 | 使用情况 | 状态 |
|------|----------|----------|------|
| `me` | script.rpy:4 | 正常 | ✓ |
| `system_` | script.rpy:11 | 正常 | ✓ |
| `xingyu` | script.rpy:5 | 正常 | ✓ |
| `lhy` | script.rpy:6 | 正常 | ✓ |
| `yh` | script.rpy:14 | 正常 | ✓ |
| `xiaowei` | script.rpy:9 | 正常 | ✓ |
| `xiaowei_w` | script.rpy:10 | 正常 | ✓ |
| `me_w` | script.rpy:15 | 正常 | ✓ |
| `yutong` | script.rpy:13 | 正常 | ✓ |
| `zhuchi` | Chapter2.rpy:2 | 正常 | ✓ |
| `yang` | Chapter2.rpy:3 | 正常 | ✓ |
| `tongxue` | script.rpy:16 | 未在 Chapter2 使用 | — |
### yutong 角色使用
`yutong` 在 C2S3 (行194) 中被 `show` 显示为 sprite`game/images/` 中**不存在 `yutong.png`**,游戏运行到此时会报错。详见下方"缺失资源"。
---
## 图像引用检查
### 🔴 缺失的图像文件
| 引用位置 | 图像名 | 文件 | 状态 |
|----------|--------|------|------|
| 行58 | `bg computer lab` | — | **缺失!** |
| 行130 | `bg computer lab door` | — | **缺失!** |
| 行194 | `yutong` (sprite) | — | **缺失!** |
| 行337 | `bg schoolgate evening` | — | **缺失!** |
| 行406 | `bg ryt room night` | — | **缺失!** |
### 已存在但未跟踪的资源
| 引用 | 文件 | Git 状态 |
|------|------|-----------|
| `bg auditorium` (行233) | `bg auditorium.png` | untracked |
| `bg rooftop` | `bg rooftop.png` | untracked |
| `bg xiaowei room night` | `bg xiaowei room night.png` | untracked |
---
## Flag 和变量检查
### Flag 字典
| Flag | 设置位置 | 读取位置 | 状态 |
|------|----------|----------|------|
| `flag["lhy_team"]` | 行44 (True) / 行48 (False) | 未读取 | ⚠️ 只写未读 |
| `flag["C2S1_think"]` | 行51 (False) | 未读取 | ⚠️ 只写未读 |
| `flag["competition_note"]` | C2Side1.rpy:75 (True) | 行237 `.get(...)` | ✓ |
### 统计变量修改
| 变量 | 修改位置 | 值 |
|------|----------|-----|
| `lhy_stats["affection"]` | 行43, 318 | +5, +1 |
| `xingyu_stats["affection"]` | 行47 | -5 (惩罚分支) |
| `yh_stats["affection"]` | 行175, 314 | +2, +1 |
| `yh_stats["understanding"]` | 行176 | +2 |
| `xiaowei_stats["affection"]` | 行173, 281, 367-378 | 根据选择 +1~3 |
| `xiaowei_stats["interactionFrequency"]` | 行174, 282, 398 | +2 × 2 |
| `xiaowei_stats["synergy"]` | 行397 | +3 |
| `xiaowei_stats["is_xiaowei_w"]` | 行283 | True |
| `yutong_stats["affection"]` | 行224, 429 | +2 × 2 |
| `yutong_stats["attention"]` | 行225, 430 | +2 × 2 |
| `tao_stats["humorSense"]` | 行330 | +2 |
| `tao_stats["selfAcceptance"]` | 行432 | +2 |
| `lzx_stats["infoOpenness"]` | 行431 | +1 |
所有 key 均在 script.rpy 中定义 ✓
---
## 逻辑错误
### 🔴 严重: C2S3 条件跳转无效 (行 178-181)
```renpy
if yutong_stats["affection"] >= 8 and yutong_stats["attention"] >= 12:
jump C2S3
label C2S3:
```
**问题**: `if` 语句没有 `else` 分支。条件为 False 时,代码将"掉入"下一行——而下一行正好是 `label C2S3:`。意味着 **无论条件真假C2S3 都会执行**,条件形同虚设。
实际上Chapter1 结束时 `yutong_stats["affection"]` = 8, `attention` = 12恰好等于阈值所以当前数据下条件始终为 True。但:
1. 如果后续修改 Chapter1 的数值bug 就会暴露
2. 代码意图显然是"条件满足才进入 C2S3"
**修复**: 添加 else 跳转:
```renpy
if yutong_stats["affection"] >= 8 and yutong_stats["attention"] >= 12:
jump C2S3
else:
jump C2S4
```
### ⚠️ 2. `flag["lhy_team"]` 和 `flag["C2S1_think"]` 只写未读
- `flag["lhy_team"]` 在行44/48 被设置,但整个代码库中从未读取。如果未来章节需要使用,建议添加注释说明用途。
- `flag["C2S1_think"]` 同样只设置未使用。
---
## 奇怪/不当的对话
### 🔴 行63: 不当用词
```renpy
me "训练赛,对手是颜涵和杨天赐。一个音游龙👃,一个不知道是男娘还是男同的玩意儿。"
```
- emoji `👃` 在 Ren'Py 中可能无法正确渲染
- "男娘"和"男同"属于对同学不尊重的称呼,与主角"用幽默掩饰不自信"的人设不完全吻合。建议修改为更符合高中生日常表达的方式。
### ⚠️ 行301: 疑似错别字
```renpy
yang "我要和仁懿涛——"
```
"任懿涛"写成了"仁懿涛"。若是刻意设计(体现角色口误),建议加注释;否则应修正。
### ⚠️ 行326: 注释中的存疑台词
```renpy
# me "最终事件平息。比赛继续。但我鼻子里残留着韭菜盒子的味道,还有满场的笑声没散。"
```
这段被注释掉了。如果决定不用,建议直接删除而非保留注释。
---
## 清理建议
1. **补充 5 个缺失的图像文件**(见上方清单)
2. 修复 C2S3 条件跳转逻辑行178-181
3. 修改行63的不当用词
4. 确认行301的"仁懿涛"是否为刻意
5. 删除行325-326的注释代码
6. 为只写未读的 flag 添加注释说明用途,或标记为 `# TODO: 第X章使用`

59
review/SUMMARY.md Normal file
View File

@@ -0,0 +1,59 @@
# 审阅总览
> 审阅日期: 2026-04-26 | 项目版本: dev0.0.8.5
## 审阅范围
| 文件 | 行数 | 场景数 | 报告 |
|------|------|--------|------|
| `game/Chapters/Chapter1.rpy` | 429 | 4 (Scene1~4) | [Chapter1-review.md](Chapter1-review.md) |
| `game/Chapters/Chapter2/Chapter2.rpy` | 440 | 7 (Scene1, C2S2~S7) | [Chapter2-review.md](Chapter2-review.md) |
| `game/Chapters/Chapter2/Chapter2-Side.rpy` | 126 | 4 (C2Side1, S1~S3) | [Chapter2-Side-review.md](Chapter2-Side-review.md) |
---
## 问题汇总(按严重程度排序)
### 🔴 严重 — 必须修复
| # | 文件 | 位置 | 问题 |
|---|------|------|------|
| 1 | Chapter2-Side.rpy | 行89 | **极度不当台词**`me "你妈死了刘泓予!"` — 突兀辱骂,与角色人设完全不符 |
| 2 | Chapter2-Side.rpy | 行7 | **`return` 导致游戏退出**:好感不足时应 `jump C2S2` 而非 `return` |
| 3 | Chapter2.rpy | 行178-181 | **C2S3 条件跳转无效**:缺少 `else`,条件形同虚设 |
| 4 | Chapter2.rpy | — | **5 个图像文件缺失**`bg computer lab`, `bg computer lab door`, `yutong` (sprite), `bg schoolgate evening`, `bg ryt room night` |
### ⚠️ 警告 — 建议修复
| # | 文件 | 位置 | 问题 |
|---|------|------|------|
| 5 | Chapter2.rpy | 行63 | 不当用词("男娘"/"男同" 称呼同学) |
| 6 | Chapter2.rpy | 行301 | "仁懿涛"疑为"任懿涛"错别字 |
| 7 | Chapter2.rpy | 行44,48,51 | `flag["lhy_team"]` / `flag["C2S1_think"]` 只写未读 |
| 8 | Chapter2-Side.rpy | 行75 | `flag["C4"]` 只写未读 |
| 9 | Chapter1.rpy | 行128 | `hide ryt` 无效操作scene 已清空show 已被注释) |
| 10 | Chapter1.rpy | 行235 | `is_xiaowei_w = False` 冗余(默认已是 False |
### 💡 建议 — 清理优化
| # | 文件 | 位置 | 问题 |
|---|------|------|------|
| 11 | Chapter1.rpy | 多处 | 删除元数据注释(`.lzx` 标注、注释掉的废弃代码) |
| 12 | Chapter1.rpy | 行343 | `"便利店主"` 建议定义为 Character 对象 |
| 13 | Chapter2.rpy | 行325-326 | 删除废弃的注释代码 |
---
## 各角色 stats 定义完整性
全部通过。所有在 Chapters 中使用的 stat key 均在 `script.rpy` 中正确定义,无拼写错误。
## 跳转目标完整性
| 跳转 | 目标标签 | 所在文件 | 状态 |
|------|----------|----------|------|
| `jump Chapter1_Scene2/3/4` | 同文件 | Chapter1.rpy | ✓ |
| `jump Chapter2_Scene1` | Chapter2_Scene1 | Chapter2.rpy:5 | ✓ |
| `jump C2Side1` | C2Side1 | Chapter2-Side.rpy:4 | ✓ |
| `jump C2S2~S7` | 同文件 | Chapter2.rpy | ✓ |
| `jump C2Side1S1/S2/S3` | 同文件 | Chapter2-Side.rpy | ✓ |

BIN
web-presplash.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 261 KiB