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>
This commit is contained in:
2026-03-04 21:50:57 +08:00
parent e879b916c2
commit dce1aaf9b2
8 changed files with 376 additions and 23 deletions

View File

@@ -238,6 +238,7 @@ label Chapter1_Scene3:
label Chapter1_Scene4:
$ game_period = "after_school"
$ gallery_photo4_unlocked = True
play music "audio/MainMenu.ogg" fadein 2.0
scene bg classroom wide afterschool with fade
"{cps=20}【同日放学后·七班教室】" # system_ "【同日放学后·七班教室】"

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

View File

@@ -279,6 +279,60 @@ init python:
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)
style window is default
style say_label is default
style say_dialogue is default
@@ -516,40 +570,334 @@ screen gallery_panel():
button:
xfill True
yfill True
background "#00000077"
background "#00000066"
action Hide("gallery_panel")
## 主面板80% 屏幕1536×864
## 右侧侧边栏面板340×1080
frame:
xalign 0.5
yalign 0.5
xysize (1536, 864)
background "#0d0f1eee"
padding (30, 20, 30, 20)
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, 24, 0)
## 右上角:日期 + 关闭按钮
hbox:
xalign 1.0
yalign 0.0
spacing 24
xfill True
yalign 0.5
spacing 8
text get_game_date_str():
color "#a8c8f0"
size 32
size 26
yalign 0.5
font "fonts/AlibabaPuHuiTi-3-55-Regular.ttf"
frame:
xfill True
background None
textbutton "×":
action Hide("gallery_panel")
text_size 36
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 ShowScreen("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":
xfill True
yfill True
fit "contain"
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), ShowScreen("gallery_detail", photo=photo)]
add photo["file"]:
xfill True
yfill True
fit "cover"
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"
xmaximum 960
ymaximum 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")
################################################################################
## 标题和游戏菜单屏幕
################################################################################

View File

@@ -81,6 +81,10 @@ 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 # "力学之美"照片解锁标志
# ====== 可选:总字典管理(便于批量操作) ======
'''