From 76581d0326df7c1e2491b70358486f6b039b65de Mon Sep 17 00:00:00 2001 From: cocos02 Date: Wed, 10 Jun 2026 14:47:45 +0800 Subject: [PATCH] feat: intro video, asset updates, roadmap and engine improvements --- ROADMAP.md | 59 ++++++++++++++++++++ engine/types.ts | 2 + public/demo/__intro__/intro_logo.mp4 | Bin 0 -> 19301 bytes public/demo/__intro__/menu_bg.mp4 | Bin 0 -> 18797 bytes public/scenes/demo.json | 2 + src/App.vue | 78 ++++++++++++++++++++++++++- src/composables/useGameEngine.ts | 5 ++ src/stores/gameStore.ts | 9 +++- 8 files changed, 152 insertions(+), 3 deletions(-) create mode 100644 public/demo/__intro__/intro_logo.mp4 create mode 100644 public/demo/__intro__/menu_bg.mp4 diff --git a/ROADMAP.md b/ROADMAP.md index 25f0d8e..83baa2c 100644 --- a/ROADMAP.md +++ b/ROADMAP.md @@ -1003,6 +1003,65 @@ npx @electron/packager . MyGame --platform=win32 --arch=x64 --out=release - [x] 删除 `moviegame-starter` 目录 - [x] 验证:`pack:html` 生成 release/mygame.zip +### P20 开场流程 — 启动视频 + 菜单背景视频 ✅ 已完成 2026-06-10 + +目标:对标行业标准,游戏启动时先播放开场视频,结束后淡入主菜单。 +菜单背景支持循环视频(如 Detroit 飘雪的城市夜景),按钮叠加其上。 + +**设计决策:** + +| 决策 | 做法 | +|------|------| +| **跳过逻辑** | 复用 P9 `watched` 表。开场视频用虚拟场景 ID `__intro__`。首次播放不可跳过,播放结束后 `markWatched('__intro__')`。后续启动 `isWatched('__intro__')` 为 true → 显示跳过按钮 | +| **跳过行为** | 和 P9 一致 — 停止视频 → 进入菜单 | +| **菜单背景** | `menuVideo` 循环播放,`MainMenu` 叠加其上 | +| **每次启动都播** | 不区分首次/再次,由 P9 跳过逻辑控制是否可跳 | + +**场景数据设计:** + +```json +{ + "startScene": "intro", + "introVideo": "/videos/studio_logo.mp4", + "menuVideo": "/videos/menu_bg.mp4", + "scenes": { ... } +} +``` + +**工作流:** + +``` +打开页面 + ├── 有 introVideo → 全屏播开场视频 + │ ├── watched? → 显示跳过按钮(和 P9 完全一致的交互) + │ └── ended / skip → markWatched('__intro__') → 进入菜单 + └── 无 introVideo → 直接显示菜单 + +主菜单 + ├── 有 menuVideo → 背景循环播 menuVideo + │ ├── [开始游戏] [继续] ... 按钮叠加在视频上 + │ ├── 开始游戏 → 停止 menuVideo → 进入第一场景 + │ └── 游戏结束 → 恢复 menuVideo 循环 + └── 无 menuVideo → 纯黑背景 +``` + +**实现改动:** + +| 文件 | 改动 | +|------|------| +| `engine/types.ts` | `GameData` 加 `introVideo?: string`、`menuVideo?: string` | +| `src/App.vue` | 加载后判断 `introVideo` → 播开场 → ended/跳过 → `MainMenu`;`MainMenu` 背景用 `menuVideo` 循环 | + +**实现清单:** + +- [x] `engine/types.ts` — `GameData.introVideo?` / `GameData.menuVideo?` +- [x] `src/composables/useGameEngine.ts` — `applyAssetBase` 处理 introVideo/menuVideo;`loadGame` 写入 store +- [x] `src/stores/gameStore.ts` — `introVideo` / `menuVideo` 状态 + setter +- [x] `src/App.vue` — 开场视频全屏播放 + P9 跳过逻辑(`__intro__` watched)+ 菜单背景视频循环 +- [x] `public/demo/videos/intro_logo.mp4` + `menu_bg.mp4` — 示例视频 +- [x] `public/scenes/demo.json` — 配置 `introVideo` / `menuVideo` +- [x] 验证:TypeScript + Vite build 通过 + ## 依赖清单 ```json diff --git a/engine/types.ts b/engine/types.ts index d9af853..0f0e46b 100644 --- a/engine/types.ts +++ b/engine/types.ts @@ -111,6 +111,8 @@ export interface GameData { chapters?: ChapterInfo[] achievements?: AchievementDef[] endings?: EndingDef[] + introVideo?: string + menuVideo?: string } export interface ChoiceRecord { diff --git a/public/demo/__intro__/intro_logo.mp4 b/public/demo/__intro__/intro_logo.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..8371b8ac5db83ef714da7bd47a4975d0489e4022 GIT binary patch literal 19301 zcmeHvXIxXw*6-{zLQUu$LX#pT1VlQaBO*mn5fKtP(n3>EgdMsRL9ieq1mqDB3s}KM z07XPpupu@QQ0x*^Br1}-@p;aBp7;FT59i$LmwT^6X3yF)Yu2p2=D*hzk^umaB2zOM zF)4}h0HDA^ibM*1QCZOc65K%#>_NGBb@ZwTiSt3OtMv29p)OuI@(WB*!(*2xoXi z7*gPz$jFF`h)g9>$Ye7k3YlVtWJaf^GOSHZHgDc+yeTF;A~BAhV4Rp7WwOwUadc{Y z9Kw^xNR3HMNU)#WG&PPNv0=6McA2Ikiw#q6XWS2 zNL5o(YH~zeTuchWVVQ0j9+rv_VM+1GH9UeIz9lgs!j58UXlhD|q^G2YFj8V;7)YhR z1SBy+5+fs1A{Hv8MkgZ`QtT)cQe0wUEIk^z3;9Q;87U<$CJfQ#9~op)Lh{cx!eZj- zsSA3G2T@if@jH ziHc5TAXIEb22yNCS@I7uBt9kqxh189MI=Oor7g(%S%1MO$q^~h$bE8{U08A?DLxdj z#DXo68#{`bF`1OK(7YYl*a9IL3vzy@^mIE5D^Isd@9zXy4^V2fw(0)~_gA#|v5?nAKT%^v_l6AY<98bZG)1SlFQ^CSS*sepPX07AXm0&yR7!qAXG zn#x{o8ju)dW60_vn%k0akG}(boZ(>`m+RFM6pXxzd||)Jyhxa{E~K^xDAgWE#whY; z6BbVnTL^^0HTTM1dEQXQGi-UwU&n?3pkjOr_!38K!|oDfi$9#nhE)NI5{SaFH*j9S zxXu6;AZ-{(1R~S`X(h^y-9tWS!vRDDM0L?UYW^R_^6w!JhJn~Bmadf4mg+XzRV_I& z2R7cTAomaXH27H*6r$v9N?~_o&u>+f&jT( z`=Kp0FC&}{cmOZ`1RNwe-_2bmtZAv@WZSV36g(LM9tv&18lbRB5-Rd3kVmP$rKxxI z^Ex@Ci*S$(=D=ahi_Yg+Wu@OF0+i9QULuW!+`U5cuj>(OqSmBC5K8jJFxm-qn6=wk zUBwVcz<}viNGvx*n>~4H!j|DAR)aja@g*LhVdP(cxtr+<@W6>t9Zy^rgCcC6-uX zrAfCW_f&c7As8pXmY_mrP_(F@lDE3)?%sQP&?LmFzHw23Fa+=mI?t6qLK}PvL`$5H zV5@6nzXPb#%#Jiad(j;!2Uv?)4lPrhMjN^8@n*BZ@}65j4B$nm=iF_>q;a@NLstb+ z;A-G<_>JRB4tSR%KQz*!M$gSsg991q<2MKKN{h0;_r6jJwp(BBlV70PHHQHr?_TM> zF^F!d3c13ThJHwVu6RtA^Zznu0%H+vJOEw-ybqTxU9V>BWiEZ9100fIi#vZ{&GmKx z@fs~~p9mEZ77+moGy?xKh@E5*J6f@*5yS&CE2?)c?kNp4wvWQ#RPDdKRQUP^503_EHO25nj5C;(T zpDfM0oag6CjOwb^fCoIV7~H*q+P+HOc^C~-;fZwFBT^eKeH^Vqz#Oflm+q3YOLBQ) z5insti7cx0*W1_T4^ZKeD0KyCUh~e^NMjyo7zKiFow7t+LL3Ai6RX%If&wTor`3ch za6Lbzb_3}eJP=bc-P;)&RUtn+?4Ua+#Ch~Uy*k8phX?XXYSf*&D(g%*pj?gk6-^p0 z`w|OP8V)NMZ#La|=$N+~4Uq5vcPkntKH3PP_K;AhFElsBoZI)>lnfltO+7cF2w4_) zJG!Og{6E)^Y)Jc$K0SOuLU4ohFQ-IAzjAd1uX0zhii-&wJ%ldtM@#+yD3`4~h+LWT zbT$M;MPFN%A|c>r&7@>h$GHklYyh7Wi+VPIF~7;urHGpUs4QEgn(Gjf5m z0|O0G2@uu)JD;goy;r8V=cCkm=19+N4xn;hT!%WZSB1b*ZzgB~66!_rfdLq`_}A|Y z3n9XTihC`pUeYnOgS&Doa&uqf(RR`3CvqK5=W58P-GHzeawDkG@i#R$2)P$8yIt@ufMIJX6DTUT9LB zX=DCp-YGsA=$Xr`U%va?yyW8e`qKPoYY*)_l*`r@rhMw8ACS+e2db;YJ)&3D<{bWj zcvoBs)xm)sy}2-4wC3cx*J^_9L5c37HMT(M(l?y1)V3mq(3UvxnZ7J|1wk|m6vE_0 zY=swwzeQCG&o%Rirhe47smtA5GLE1Jf`+`#N4%6VH^ml+j$O1wI)h{_yax)Pww`C8 z-C}*(hvdZG@jym%r{gD9mjaOR%UgkrK5XjOjfl5VU?~E*S!C%;5(0qwCV&AJp@eRr zb9PL!w=Z#rv24y?B_T_herui1k9rU(LXq_qSNrzW$uTg1_&j=fJr(iLq9}gHW=vSR zbRYYw^eFkwyZrJ38$>^V23{PLi5<^MQirYQLA|N8%(pdV2OW(I?NOQS%qw+Uw2e3R zUBh?l_>z;)79+2b1cH5%g0{v-bG6GFSz+AmNqfh9+C0|;a2N&@%q;)A8`R>B439)y zlUnIGNz1X5^`?)I!h&ELM@yLjJF+2pOXikp9kYjiQv-|7>|U3`8{h+6DxyuDFlsuK zMoxNQ#P(nv<0p5C19Gx&t+A)?50dC; zAiBGcC_u9S$&bbDPSeL~l3kMgEC+NId8c3!4Xn5Ygn^bzy3N_Id40F!M41iHGBsD< zUbB2;wgZTIPw9A6t@u3-MjJ~|;d&P~+RkZ6Ml6hVmA1tV1yO&=Za=0n%gcugm9UuW zz-T8JYUok6@{*rAa&kTGWRMBsH?@(zC`RS%PP>E8@q6j3%YcK3Z5wja(@iBGGN+?%XPi(P0MFc`Hpw>Ka5nC3Qdr^CTHwOh&(9KjH1SFul2g@Vhn8nE7 zh^|uptZDVtOq$qm*I2eG8xD;+vO{wCX~2o^@M$CJdCw;_xumK?0Rx6Lje#EEX4_{} zjA#;T-Gdb;q(yP8f(l?t1D5p6I$ot_qQhcb@_FGRj5cHMOTaGZUpBBh%+z&BZ=gpj zuiYLj^gBl-=2p>_+QW~N{xAq#(|~_qS4!I$owLP(BX1Dq@Q99}1(T{xEQ-oXxfX3p!gLN);b^bwg#9Kbi`bn4n;jx;%X+JVF5GS;n!l*nLBLOp zO|d`djHlq~YA29>h!T#f$Qa{EVrQAl@kuEYf(>~)9q)dm0m&cy*9k5IJqvpM9DLCj zxVrKEv!z$ZePS5RxBQCPkD5TG*S?_&NL|mU4z1x^Ibk&MM$u((AlFi|%<@!_=-0+D z(XgFWI=RG#ji+@gcP$o!mc)~}w?8SA-03}EMcpt;#EBnxeCifmMPvu&(_M&%2SyzY z+XBfzh>E&GMY%kGxX;R!B_A8E$3o^LJH(WX>~5|&6aes;!ao2p3F%af3YM^P@jAK1 ztCBjo*-RL3NI2wHIOnan>oehCHoF4S%RXrE?#RAQOc8e17bB=nITkhx6NwHs`Djhp zunl>ut-?P8jJO_I;W1IZ@Mdv>WSYYj0Qt(;2g|8QR95;1W@w!iGlRD))M#D!##Q?= zv2112N@^QQ8#8VC!&|5?oMMStIZZ%0$u7)2*nojs-ej1okuQv8SfV?;YFDo03d7IF zzxA$sGDl|V0X%+(wsGxdaUGnr{fELo2s}ALAnlc&uK2}=z9OH+IlCs>g1!p_3ehUq zR>M>FX?w1ZN*eUyEj>5XS01=84#GTKd)(c3h+2Ppm;77ayXJdHvoui87FYi+W-n(J zP^|@^&24IWGX~ox_5iU<%#{4?-*Nd3yx zeIFZh#2~*bYd0D3BjymZFt94^&4gM5VK?Gi;&RBw!uR2GVB?6fc|itv=n}F_fa>?b zAE9s8m?a~pIsSp)W_OSbJOy9ULC9BR#?TT*0;`{oKzjA9%Ntq%KJyY)>0J##*?Oqw zu_YiD%eEOnxsa9g2wDP0e7={0!R?&{Aq*>gVMbx`!yDM(w2LV1%o5(pTn{+VAtCeLZrUs&q=gTz(DZX^4*%e4nQxGe5wQ zG_?FH#hW{~_|#Y2BMZ7$4GTmM0}ddG0A{1URFh|S2~Js^#$eV_Sc5^fDAE)w>e=PYWJN0>9fGL61`4HE%T+9DWTE%I0leUM92!lR=RXR>!M=jrQec(D`z zZG&bG0DPbaZ6uV~>L-h%B zjuI|SDmG55L=tt1NEEuf$=AD0Y_rwJz`%9}Sj*pfyjJftYrxNG>r0Eb8U^LZ#1W-j zP)kt9(nW-y7ci8&Tn3v+AHX_=ljb|EDh~iivenjYQ*IPBK;YMZWN}{39fe|yGYe=g zp$`E`rMB(6=S=v>iV-7LcpfF4;$}BlJ{-Abg&f4~488EYS{vT3#?d@l~nTN9^^J_9 zZC2w=r^!pU<@@u)vxCW85dDfD-7k zPvYt`2h9@ibAW~soJ*?DexTH_hw$V}*h-m8x9C;eV@tkei_-AOyACtolY@4)2^06c z;P~g153?&h<#!kEV#sHe*l`RaB_+Kb+M4XA!lY~81Ry3ivJQl!MD3xHul=jv)6C;BZ(|qIo&3c#hR=CqpqiQOiPCd$J z1fQ_GY%N@tS!xev#1&PKHAs$4D9gBf#e5>rwQ)qYP%gjX^u>z&CIJr&l3nFOMd z&W*rmwkP}JLwsvWKxrMir6poy!?&sboqygSJ6=fr&q z4sQ)1_3A1-5#{d_{%++rprMAiAu+%q?CmyE_Yk?REqtPF%JDwxK?<^G=IPrtg|q0X z7|CzLJmkEoUdQ$-d38!7kwgsaP+&N2bv ztPTuXdYBaFJKrWxIvHD(D}gr(;&F2Bvp-Wh&bPTPvUq%xl|2ufe@^0Ure!SI5SJD` z(@7_vJu<-GkO?4A0jRbbn#Kuvhs!o9NSI$O>R&CC?W!#Z&?=9O?!g?@EX;ZkuE&sO z54U8$|1qy{>o^T1Hz%{|@yt%(3yj6}2aZY33FQQ1wT--1{J@@R@#yASVlEUvnTbIjk!m$@g( zU$-!0@g>4Sjg3oLxH82j#WXR)ZW7_eQ6?z0*#V`H2i`0m6!CGeV$v!St_zkw}; zL&aRC8Qr8YciYeU|Mj|i%h1G{m?G2*9iY*vK3>QeC{XWPqqLWLK)xL8h5 zbd=kfR+HxcXrt_(%*eDY#2%S;5dq9EY74)*_uH(^i4%-_Ct(yaEbnZvSH>8wHJ3WC z|A7r>$g~OGCQiTQAcI1&luw6#dDVQe+%SzU4$ve(T65$hdQ-f%b-kj(D0lFviGDbM zSP&fECYYD@g_>hwy2}aW%9zF#K>aQ0rZ*%bboo12-i1DPIQ>UKp@4}iqFCN&s=l*< zF!x&c1Pt7v!i3zFYiE+J)3lB&4A>l0uv&a}3cW>6%YO_4?{`cQgEc&h= zFv)2Oa9tvpcPS4+p%!BT@@o%PkXB;NmlZ+STf2*5%2T>Ha%uz-Pfd5l*3G=nVlPiT z93oKyEq@GzZVN(Ipa8w~>$K4newm%1#{ovRDM@P4I`L$1HZk7xmZ>R3Qj(q1SM`>tAS9k5qE6J~Bcwqn>iY~H%>KpG% zJXak(6l|4Qb17+60XnSxL-6+wsf;a+pVEAF({i6r(%JRTOfG+M5=cHBP5?pC0AMs6 zYp7eml5(uPqTCb+mZYKj$-LagoQU1s7!e0v0J%23c@D`q$Y;E_wuvL^OV=i(_n5=io;X7DQv<=HXA3#Pr- z_)b&r=pC57`zOlJP-*5u6HD}Vd^>zpq&tK>U9@uf zIq=0S3Xi7Nh4_+qj;fxomhVXC5jW8f++<%^F7y%q(opZq$efnCa-8%^F*2sRT(p?w z&!8EpoL@S+#|DN!f9M{n_hpW#?IU z3s|{t4=Y@>&tJjUZ`xBS%yyqzI(EU##C>niQY+${O?OZ5Ep_iQ6h_MTyf{PrFy>H5 zQEXmnerPX0LCLu{j;Qwd-4TcG$XXk`t(~0HKDoe(lsVFj_n6|EE=dYpvFJgLM5E&H z15z=6B6l;ew;*=dZfs)=ozZCVXmTXBGW3rtovR|n(&*|6kw;Bk9gi6wu(J~=&gNHj zr#I*11+3A2_D#HhsP_b0b&CWl8VsB0`=#HaWLd9um0Hs9s)VPu^#D_X4Pw3fx-lMw z1g>Y7?tagnIv5y@fUY)G4PU`vOQr^R1i~hdK3;$ zcyTbwmnx&TyXoQ-rv0^y=!xm(Kk_B&6=~QtXo)N47^$YDNADjV4E5=|R}yzz^qEEz z+qth&;bVWa>OOVDZA%5EN3;BI9u{XWZbP;Y9rTtAp5Ok6@YPW9m1%oV8->48VYgBS zyl+`@oz%0Z!#ls=`b;+VY(uGqP=j*5w%q-yU%}C|;Fu?`G%+nHFXstubW(yhK?IE| z)=dR+!h33|OmAo6eBi{%$E_utWgTLjS@zhgT_zH*^^_XdU~Vb&-5f!2EM!lv-Vr0n zIba>eoo1-N!TZ1F@|wve`amRDE%M^tdc`1ys-BlMZ~p;r%;hSg z(dMcuej>du-~90|7<1Vp!PgUF?SH8=Kd-($wp-SZ+Buym^#pRnm7Ho36FOio9BOjy z?SzYZfJG+9tof?*^*D#}mu%58&a>BoP^0r)de#h(ZqnLDwjLnV(W5tX7()28yuAefTW} zuZEg2&0JyEOraHb4DC>}8UJugmGv?0@!a@DyuN4YTM+lp9$B)(dre)z*( z6IJJU@xlf($}aK~V~rE3T%tB9My6Ce64%`p@1{Ff}TufIusbvYty-x`{Z*(1xc>@a21~?oY&;F zjZY!fGlg>0R%z^#kQ$RDXB0SUM`yN`cPA?Vy63QUQdiJR zfwe;UtS`&l@|mGs^P2P@Yi#iwQ+K6*tylc`E%~#ZW=M;CQO2(|K#>?Suh`u6?c?msmddDk>t4-OyGL== zoXl0zPFX@HnCd0GM`DQt9h=DskL>-2BQC@Hdpe13%n8zdAkwqbbM37^>c5^cQO@BF zHr&lWW|$flw$bO~wMEqmWYqIu(FqMMpJVP3Uq9RR*sqSaC`lny-hQ~)>#~PqUDA)u z)cv9+cHXi*H23QR(LKSE}Gz{w{ z&MnDG60_LL9eUAMLlX3+5+eq!g;)9)@=Gl zU3*@8Wo*~3>^a%={?%FP8zzLx#N#EsE?N;Zvf^AUjn7;^v}|6IcPAJhBi4sz?OuN; z2nWIHwycS4cn)tHIo*Dl0mLCC#=GM5wKl339VBiL(ksM{yBFPZVW9Po;qPQ-_XVr9 z$AyP-ZVAMeyf>K1Qaa5D>V8Kiy|}dG=oUe)$Yu<>Ja=8l50$38ykoDNm-Ty^Q!7pYs18HiVG zwad;s8rNiII6+%CVfaw_{xAW3c4!z4)y4f_nhHH=?#98o7DI>QMPJU*QfmPk+^?ef z9u*Y+;nKH59xLr)1fcZ0!Pb4vxpRhnH}ZuC1v&Vq8vZuczQD~b2Q`=DtVPYIeRr!Z z6cD^uC=pW8Q$Amv2NlR4$0WBoqHoMrBq(H0kLZy;^fJErUS7|lIdWTiv?T}!+Azm( z<28bhzM6`9)YE1ky4xZprhA5eyxEzq*&`OxL579f4BtaDzvcV599Dk#le zV%)oyk%1z4e#w3Y>n3f$5nmaa;@JIa^;ke2h zPltD}5yNfg*P;R(Payx8T!&iT+g!mMOS;F9w#nwNT?X}*4O*0}i7h$ztyEl2Ft0hD zJAURHLE+V-^*u`fL&;!~Zd<~YzD*3&1QnUB>N(c1kT-AZ%~*!+j7*VC#$i+}yYlDI zDCIyoXGFdWH@-=tidG@Ka*j1@1DN3T-%1sa|5?KMA4^avj{AWz@@8Ls@2saeJJf?7 zf3e09`ubvqvR2+ygJ&_5T3OBeO5cSs-2UdhT!--j}y(ED(xM{VhaCR!|Y(Q9m$ zEnt^CRG%kIrhMxO+(N#_BTcKM0=L$+D?hwx%Hn741Dr|(m5&tqtZRBvSSc7EO68B+E-@b!5)_i*A^WbURnX*hW2i8%JCdfL7)_UVlB!@rtAn z@r00=kh8cGEKVIR%9JIS;NM;jnV9AhZ^3DigOip%gy5!Hw*w&;t7}uHH}E zkdl@y|8zE6-mUDZ>e$uUZBK+XylnOexLThUC*Kvfl(kwCdHd<={baN#^-oc>pQ6qq zqMprOL`02^ZQk%;=IYbgZ7G{WePHd?nGOE`Dr%`)`O~LL{}cuPI;~j0 zPAm4W(~9%Uw5kEWOsg8wuhWY9>$IZ%I<4SerxokhX~q6^T5*1vRzC;2U*s7`zfLRa zFSFHt+ON|J{&iZhew|kAU#Au4mudCeU;X>zV9l??Rn4!%Rn4!%Rn4!%)o*|G@8fF! zufx^;Ux%yxzYbUXe;uxV`>TH+SHJz$zi+GG{^~!l)o*|GZ?Bzy`>TH+SHJz$zi+Gm zxBV5yJ3cXS6S9vL7r!Yw97+Ec(60ax?EuIR`H;^)!+*O$vj63t`cKaPi9#Vi3(P=H zX^BM&gHmIEwu$~5<6qK{cKNLW^zUkGhyPio5{{fPvrric3*};I$#JAVX;e^3YG@oncci4I{G&q_ zcn&X|RfMDq;qNkkW?&Z{+XEpN;zEFAy%2s2Q)5#rV^gvzDJ~{-;ZUJJ3x8e}1Og;A zM!1|IC$_qP3*@7a^btgrdxxPe{CE?&h~@T)9fklV`WB%d;U+TZDGVfCXn!HfAP3|8 zW!y_r$o)c4NJ;%^_yu}_XE|b%1zHAqo`nus2>+${NQIWDOf0ZpH zNWRX3#t1(~2a$OcQE{Q%5Q$2EM$~2`4M5_8jQ`&wV(+j-#10E#!QNyf($m6I=}5XR zKH_JJkU-<_;6`4EWIBVffWQ9=hB1G>LE0^;i3`L9KPImqn#&E&6IjYi&TSsEAPYEh@@?g4!2z-t&Fu^n1^F&-XtWm^;tRZ|0e~ zzj!jqsS=SA)tRBk?C+m) zJM!V_-)}~Lx6!o~ziHp~G{?)w8+XIS>6ud86N#B)JOzIE7*DCEf3iOUqTNvikBM=S zE0-oKaW8>jjGLFhYYZw(Q7RPy9v+JqFLuwCNu=p=QJQ;t z=6nxLFYYPIR5_}Xu29O-)3O3^u_#F-4iey*(&QjdTp~@9r;8T`2?Ed`E=m*0bF-wH z9G)r-lE_4O)}kaN32;SLE~<{MiJ6ihPj>;Tf-ZQfEJrFy)acT*NX!(a&6fsw`rzV} z%=A=IB5LZ1D>J2XxhxCS@XPU&h?PhXXQZO5L@JWxrKd@QygXe!J@I5wmNHS1wNR!& zjovHBP$Z@&Cud1Djg%>ws6kecmlrNiPhTiXLAk^ag=6q6xlD}4@}WS0r)3WGA(o|z zl$vqK(v;Fnxd>H4L z$ZL$d0MF2LA0%-1L83yVXCM{j1o`-*f-I#}5#)`_6o^(dd5CpyG({Of0w4jnYH4Y4 zz>qSa1=LaWd;i(+_`r$((*LnJz`zs~bHut`Hk|ScW4`}Bka%dE01xjEyEf7Dfg#W- zz-OpTfgvQPM~ar;=9NZg){Dy-MDx^1vJJ+lN^X+H0~looG09j`$w=h z#>tEO>2Tqr6fY7FX@(ikUkKdq$9j}(;ZKRtGjo2yi(d2F^&Q|+9Wss3d%W=(M}BU@ z>oz$kTu8wEqU(9|GhS&Ug z_vLh6>(1LeONB#7xA2rh#wGf-Jq>#TnJXLYo%eIcEj2y;(D&fdAHabwppih%-`Ce> zaohC5PrdM%EwwWvd8ADE$Mf2U>sdAh{LvYo)sy;%JnFX)^VwBz3L0DIiN@Zuq+_oU}bDXnWltT?0E(6I5i-GO+L0zTxtM*(>c-i~?vr8mK z0oQ3GSXW|Y9aAncBW8S2kW(_*y2r$Q{Pl<2BqHpAU(Wajv|BPjz`Wfqs6M?bY*uPv zn?C@V!|M)AdGmnd)vX5(u_W6l%B?CYp*W#q;fTI$S;~>N+vw%|DK%qv7bO0AKKGe}r9)Jx4?% zYrb+558pCQo_Mz2|K!-{ZtT$UauAH$nUAK%>_=@#R#Kr zOT_kHU)pJ9@aYj`q+G=bHFfBo_{7>ekK%5IXXKOWt}n0|q$L%GD28 z7&t$ak@{X_lUEw!P-uiDFo5JKj|gE=IWUY4M*tS*7h9`OWYVG|np!LB`?t)um{uM& zLGliWF^{h7g|P+Or{4t7c=`uHasO-o2 zZX!4sKL5w!-}+m{;y$CA)lL;>ZttQ1*I$eHR(;`g<|}e5eQoaX?ML{Zw(=kKADF&2 zB62xjUV2O22nOU6EZRurroY_&m6*W*hOtlERr$g0Gi?wN=pwY*5MS`qndgb<% z#?m1*z@RxYTa27`TEEsWD9p76n``&ysy~@jx#gnYo$EH;Ui4E;7kW~sp1MqiSIDMWZ|a%8&aw)+>(UZ*2z#7YQ)9rz74AN z?7Z^rQl_4nm*wlB-x#9Z;j9WGo*PZZcpHNNj^y9uFP*0tzh2IBWfhjo7&lhwTZ|q- zjvEEAb7o=TYDrpYIS1by6A_R9n1F{Li1HIjdPB^|o^%`0(mv`BUP<|q;<UPk$s|2$oDu6XNqff+{?v=<9JeeKTeI!tnmPN*l{DLmTyKSSKe?9U3Wcb)pO8#_&0 zD55>z9e-rN?%b1ptJ}P=Uy6*npKPUe zg{pn7ICrrU9CtizxQs1%Gjk?IJK^bJn`Ko-^o6MDo@(?=GdXlK;Y8+TUE6i>!ML{x zUp$p{*c7+zJoco0{oTU51-VCWv~{hGpUS{0hL2d?{Ib)m_idi_mmO8UL=5BdeU5(W zw$imrOJbI6oN8cmx3l$Ll8}nJaF8VsKE3Fz?j!AYDJF*#mrck9&f5f&%EaO235EJ=RwXv9-xt?2`pCYx z7P~g}0cKh6w#Vm|jRo@xG;mhvX3~Y!XHoBD)dzV+=w`~D%u|T?v@R>>mPPHW%@_Q( zt#|So2J615!4SW|XJ;n`5S;cYtL{LnFyR@jc)89yo!{$Xje{NhBq@pm>&oh^b3ETxfa{F3ug34816d#>y&>6!fC zdFN=0iTw}mHyZ6fL+MEfG&IxD&1!ctKP!Rx74hW{!U=P~if+Na6d;5XS_K*;r3<{1 z-{o;lUjFE>JfVdPwQy1kS83st7Owsn-wYq)n{h3i(87gUIH`rJv~WrbSAUG_?*C(c zs&FlS2rXQwg_ByiN(-m7aP`NyZvH>!M`!<9_CaXzBh)WTI-IHiTFKgMW}gN|MEvqcf8J_>FAB z8qSBPWIygMdL<>-*bC7B3aYD`fnjC)`O8KY&*1UBc;dBiIHN)INdbplI)3!ZwuC8c z&d4o*MiO>)7Uj5;Nth^=$JP9T4*HtwfuWAKeS_ATiq8HL5Xp>nRntizuMi~IRtJyd zM+Vz znXyP0@`{OhU4)9_854vKPIlA0e#Tu+Dkxl!(BI&|Je-D8`{XN-AAuf4BSWHxMb(pg z%}X=sm|Dn^P!)&NV`9GPT>KUan#x_<+ubISlM1S;PYe?TaFmm}Bl3O?-}c4fGjE3Q z#x1?Z1dLXWzT78|0gDX0zE}Cvn|TmXaq%sU7!T*4g|8ji!i>hu30HzKpLB%j&9-ql z9@J+QTPAh!Apt8ezP2aSsfqric<3*0u?FmByxOr||3zjun*_p{&!w%~RM+c2@^!G! znFWNP4(cyi6z3+gLeaef&@tL^p-D6ch7v$*hy$+uy7&!&I56la?+h>V1*k}jW>`5~ z2)JD&IkWE+&gPnjl0Y1>DZa!x8~sU_9(}ZvDfo@Y_LZ&=}&65;T%r!V5b9iqIaSrTm8`DYs$fq2o{kkIFEcjGaf6&D!DB?Eb8 zd;(DDPQ9J0>g4xsh$dBieKjn)n(VaM)=@ZA=!1rUBzGLWi?OD_q-buQ1_1&>&>I$|Evfy4m5!=kHj2k0YQDG}cYSn<(0L@T{t!*KoO|e@TDBPPb3G(MV>I23U0(TB@HU+>4pfPv& zBfC4WwFylJ3s|OTmzY~iQvla73Q-un9Ox$?gg?%@eeniz&LvgcH(X$laStVft2=s< zmJWa19!FuWL`_FGd`g)8iSt~PL<4QAA2n6(etZ)t zV?6=-Fog@yNwRb3H+r`Ov7)Ve4WYx_&(ZGqzI;p%+*~kE6}t9JmnXYS=zZWH%4Z zAhI=BakoofucK_Nxk;;2_j#K-oBcA)#1nv%e4n9{;o_&Gm|Pq(rm>p)(B20i{L+eo zfXz2gnMBCXZU+cME_!H(3f-OvfYS_fz;zUVdHlrZr!fA(dUzOBvW9L|zNd1PIG>`$ zf^$lke8R=~)hS_yTOXxlS~6kQZ;fIc@M6>KN?@t52tm~Xz2a=QN67h<#X~bs0n6wU zz22nE(ygDJE~#77sP~wv+Y~=1_v!7&pPKhCy+O?d21WwGd43|Fu5OAPX?vQr4BL^Q zCq?ELkwU+YDCZYGf2d!J0}adpb8xctplJM{xCcff+Vx6#;ZB>j+bvJn%L(BiZ^Ia5 zj~=8!IrHK0rUmw4B{uYv0Y?`4nbp>w=r&J44r!r;+}36Pa;fzR>(&qje_BzDyJfHj@-(ld(Jh>00^h&Xzd%98!Z)HiUr23zV8LGaqZIuRJHV) z(TSqT7}Isy1-k6#u8R6)HJ?z z4C}X8;43P)1ck>i-x4eO96~Sl3Kn$-jN|x#KK#%jj>8`7gT#t&gTvLJcH_>S89&^< z#e&b;A~0I57dR^^6EK5p98TO>%~hDl!Q4I~(xMmqL+_c@M_T#pAOl;g`>@?AlKfS(Pp*i2Z{pxfPWHK?PT!c*bu!@q-#pQVU5MXK#!J2^yx+wb1Tw# zX{1AM2&1=YuW0(hv0*Kuge1v#HoV}AKez7pK6B>WvbX+yzf3$@x-NoP(a2e5E^|J@ z{cMGE2xEHU-~7P2|8IGe{>{#Ged!p`F`#2W$AFFj9RoTB{8UKZ)cmgAzx7i>?a|}WzuKcmqaS3=W6{54e2`2Gl7)k0a*(VVBvXTA z^}l4zWB(8OHIKail8HgGaF9$6l2wCbYLKk{m#iBs-@$(@icmT$RXUJrK-<9wGCIUFMGA#n1AGXsvUjJx!#B!wjY3QG Vo+OPDjZ#1-V=_7!ebK?_^*=7e&zS%K literal 0 HcmV?d00001 diff --git a/public/scenes/demo.json b/public/scenes/demo.json index 6f53e8a..3c630c2 100644 --- a/public/scenes/demo.json +++ b/public/scenes/demo.json @@ -10,6 +10,8 @@ "courage": 0, "investigation": 0 }, + "introVideo": "__intro__/intro_logo.mp4", + "menuVideo": "__intro__/menu_bg.mp4", "achievements": [ { "id": "qte_master", diff --git a/src/App.vue b/src/App.vue index 6e36320..5ffda57 100644 --- a/src/App.vue +++ b/src/App.vue @@ -37,6 +37,10 @@ const canSkip = ref(false) const paused = ref(false) const promptToast = ref('') const showPromptToast = ref(false) +const showIntro = ref(false) +const introWatched = ref(false) +const introVideoRef = ref(null) +const menuVideoRef = ref(null) const { loadGame, start, resumeAutoSave, makeChoice, clickHotspot, startChapter, skipScene, setSpeed, getSpeed, isSceneWatched, @@ -68,6 +72,21 @@ async function init() { } loading.value = false hasAutoSave.value = (await saveSystem.load(0)) !== null + + if (store.introVideo) { + introWatched.value = await isSceneWatched('__intro__') + showIntro.value = true + } +} + +function onIntroEnded() { + saveSystem.markWatched('__intro__') + showIntro.value = false +} + +function skipIntro() { + saveSystem.markWatched('__intro__') + showIntro.value = false } function handleStart() { @@ -212,7 +231,16 @@ init()
{{ t('ui.loading') }}