diff --git a/game/Chapters/Chapter1.rpy b/game/Chapters/Chapter1.rpy index a4764fe..77fe0de 100755 --- a/game/Chapters/Chapter1.rpy +++ b/game/Chapters/Chapter1.rpy @@ -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_ "【同日放学后·七班教室】" diff --git a/game/images/gallery/icon_gallery.png b/game/images/gallery/icon_gallery.png new file mode 100644 index 0000000..048ca91 Binary files /dev/null and b/game/images/gallery/icon_gallery.png differ diff --git a/game/images/gallery/photo_corridor.jpg b/game/images/gallery/photo_corridor.jpg new file mode 100644 index 0000000..babacbd Binary files /dev/null and b/game/images/gallery/photo_corridor.jpg differ diff --git a/game/images/gallery/photo_monalisa.jpg b/game/images/gallery/photo_monalisa.jpg new file mode 100644 index 0000000..1c16f84 Binary files /dev/null and b/game/images/gallery/photo_monalisa.jpg differ diff --git a/game/images/gallery/photo_pearl.png b/game/images/gallery/photo_pearl.png new file mode 100644 index 0000000..7163de6 Binary files /dev/null and b/game/images/gallery/photo_pearl.png differ diff --git a/game/images/gallery/photo_sleeping.jpg b/game/images/gallery/photo_sleeping.jpg new file mode 100644 index 0000000..d284ee3 Binary files /dev/null and b/game/images/gallery/photo_sleeping.jpg differ diff --git a/game/screens.rpy b/game/screens.rpy index 162273c..84e69f6 100644 --- a/game/screens.rpy +++ b/game/screens.rpy @@ -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) - ## 右上角:日期 + 关闭按钮 - hbox: - xalign 1.0 - yalign 0.0 - spacing 24 + vbox: + xfill True + spacing 0 - text get_game_date_str(): - color "#a8c8f0" - size 32 - yalign 0.5 - font "fonts/AlibabaPuHuiTi-3-55-Regular.ttf" + ## 顶部:日期 + 关闭按钮 + frame: + xfill True + ysize 72 + background None + padding (24, 0, 24, 0) - textbutton "×": - action Hide("gallery_panel") - text_size 36 - text_color "#a8c8f0" - text_hover_color "#ffffff" - yalign 0.5 + 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 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") + + ################################################################################ ## 标题和游戏菜单屏幕 ################################################################################ diff --git a/game/script.rpy b/game/script.rpy index 2f19afd..848a792 100755 --- a/game/script.rpy +++ b/game/script.rpy @@ -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 # "力学之美"照片解锁标志 + # ====== 可选:总字典管理(便于批量操作) ====== '''