官方网站 · 参赛作品Official site · Competition entry

Gift No.188 188号礼物

三十天,把母亲留下的驿站重新开张,否则土地被依法收回。
而那条上山的路,是个「8」字。
Thirty days to reopen the inn his mother left him — or the law takes the land. And the road up there is a figure eight.

在线试玩Play online 下载桌面版Desktop build

Reel 01 · 1:49 看一遍实机录屏Watch the real thing 真实按键 · 非生成画面Real keystrokes, not generated

Three.js r169 · Blender(绑定与动画)· Tripo(3D 资产生成)· TypeScript · Vite Three.js r169 · Blender (rigging & animation) · Tripo (3D asset generation) · TypeScript · Vite

向下Scroll

一条路The road

一圈 1228.8 米的山路,写成一个「8」。沿路 16 座驿站,其间散着 15 枚碎片——走到最后,它们被压成一张可以手写的明信片。One loop of mountain road, 1228.8 metres, written as an eight. 16 stations line it, 15 fragments lie between them — and at the end they are pressed into a postcard you can write on.

01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 N
碎片驿站 × 5Fragment stations × 5 路边驿站 × 11Roadside stations × 11 示意图,不按比例Schematic, not to scale
  • 1,228.8m环线长 · 961 个中线点loop · 961 centreline points
  • 16座路边驿站roadside stations
  • 15枚碎片 → 一张明信片fragments → one postcard
  • 20–30min分钟一程minutes a run

三件交付物Three deliverables

录屏、在线 Demo、下载入口都在这一页上。免注册、免登录、不需要装任何东西。网页版有两个镜像,任选一个都能玩;嫌加载慢就直接装桌面版。Recording, live demo and downloads all live on this page. No sign-up, nothing to install. The web build is mirrored in two places — either one works; if loading feels slow, take the desktop build.

  1. 01 演示录屏视频Demo recording 1:49 · 英配 · 字幕已烧录1:49 · English VO · burned-in subs
  2. 02 在线 DemoLive demo 浏览器直接运行 · 两个镜像In the browser · two mirrors
  3. 03 下载Download Windows / macOS / Linux · 源码Windows / macOS / Linux · source
01

演示录屏视频Demo screen recording

本机实机录制 · 真实按键 · 非生成画面 Captured on the real build with real keystrokes — not generated

这次构建没有把录屏文件带上(多半是跑了 --no-media)。母版在仓库的 promo/footage/07-walkthrough-vo-web.mp4。This build shipped without the recording bundled. The master is at promo/footage/07-walkthrough-vo-web.mp4.

实录Recorded
1920×1080
网页版Web
1280×720 / 30fps
时长Length
1:49
大小Size
21.76 MB
播放Playback
直链播放,无需登录direct link, no login
  1. 1 分 49 秒一镜到底:标题页 → 引导页 → 进世界 → 序章 → 上路 → 骑完整整一圈 1228.8 m → 花房·禽语湖湾打卡 → 小游戏 → 退出面板 → 回到起点。1:49, one continuous session: title → tutorial → world → prologue → on the road → the full 1228.8 m lap → a fragment station → a minigame → back to the start.
  2. 真人操作链路:点按钮、按方向键、走游戏自己的相机。没有导轨机位,也没有后期生成的画面。A real session — actual button clicks, real keypresses, the game's own camera. No dolly rigs, no generated shots.
  3. 英配解说(20 句旁白),字幕已烧进画面——静音也看得懂,不开声音不损失任何一句。English narration (20 cues) with the subtitles burned into the picture — watch it on mute and you lose no line.
  4. 它骑的是自行车、只打了 1/5 块碎片——这是一次真实的通关尝试,不是宣传片。It rides the bicycle the whole way and collects one fragment of five — a real playthrough attempt, not a promo cut.
02

在线 DemoLive demo

浏览器直接运行 · 点开即玩 · 两个镜像任选其一 Runs in the browser · nothing to install · two mirrors, pick either

主镜像Primary · GitHub Pages 打开在线 DemoOpen the live demo

https://jasper-leung.github.io/188js/?

备用Backup · Cloudflare 备用镜像Backup mirror

https://gift-no188.jasperaptx4868.workers.dev/

备用镜像(Cloudflare)在部分网络下打不开——workers.dev 常被 DNS 拦掉,打不开就用上面那个。The Cloudflare mirror is unreachable on some networks — workers.dev is often DNS-blocked. If it doesn't open, use the first one.

  1. 模型要现下,网页版起步慢。三个资源加起来约 21 MB,其中模型占 16.84 MB(81%);网络一般时,进度条会在模型上停挺久。介意的话装桌面版——同一份内容,装完本地加载,打开就是进世界,没有下载过程。Models are fetched on the spot, so the web build starts slowly. The payload is ~21 MB, of which models are 16.84 MB (81%); on a middling connection the progress bar sits there for a while. If that bothers you, take the desktop installer — the same content, loaded locally, straight into the world with nothing to download.
  2. 开局直接给你一辆自行车。三种车分批现下:2.79 MB 的自行车跟着启动链走,4.82 MB 的摩托车则被单独挂在链外单跑,免得它拖住整批。所以自行车模型一落地,只要你自己没按过 E,游戏就先把人放上车——这是「开局不要走路」那条决定的落点。等进度条把剩下的模型跑完,E 才会把摩托车和滑板一起串进来。模型没到位的车会被直接跳过,不会切到一个看不见的车。You start on the bicycle. The three rides load in separate batches: the 2.79 MB bicycle rides the boot chain, while the 4.82 MB motorcycle is deliberately kept outside it so it can't hold up the whole batch. So the moment the bicycle model lands — as long as you haven't touched E yet — the game puts you on it rather than opening a game about cycling with a walk. Once the progress bar has pulled in the rest, E picks up the motorcycle and skateboard too. Rides whose models haven't landed are skipped outright rather than switched into empty air.
  3. 首屏 3.45 MB,之后按需加载;弱机走最低档也能跑。3.45 MB to first playable frame, then on demand — the low tier holds up on weak hardware.
  4. 不想动手也有得看。标题页第二颗按钮是「演示 · 90 秒」——车自己往前骑,你的手不用碰键盘。九十秒预算到点会自己收场进结算页(所以它真的会结束);第 62 秒之后不再玩小游戏,到站直接记一次拜访,不判你输。想自己开,就点左边那颗「开启旅程」。You don't have to drive to see it. The second button on the title screen is Demo · 90s: the bike rides itself, no keys required. The 90-second budget really does end — it closes out on the settlement screen — and past 62 s the minigames are stepped aside rather than failed. To take over yourself, press Start Journey.
  5. 键盘 W/A/S/D + 方向键,触屏有虚拟摇杆;空格是对话键。Keyboard W/A/S/D and arrows, touch stick on mobile; space advances dialogue.
  6. 中英双语完整(各 415 条文案,键集合由回归钉住)。Fully bilingual — 415 strings per language, key parity held by the regression.
  7. 需要 WebGL 2;浏览器若拦截自动播放,点一下画面即可。Needs WebGL 2; if the browser blocks autoplay, click once.
03

下载Download

源码 · 本地运行 · 可分发产物 Source · run it locally · distributable build

  1. 桌面版安装包Desktop installers Windows / macOS / Linux 三个平台,在 Release 页面挑自己那个;装完是独立运行的桌面版Windows / macOS / Linux — pick yours on the Releases page; it runs standalone 前往下载Download
  2. 源码(完整仓库,main 分支)Source (full repo, main) 约 4 MB,不含 node_modules 与 dist;下面两步就能自己跑起来~4 MB, no node_modules or dist — two commands below and it runs 下载 zipDownload zip 仓库Repository
  3. 本地运行(三步,Node 20+)Run locally (3 steps, Node 20+) typecheck + 无头回归是上线的门,构建前置;npm run dev 是开发服务器typecheck and the headless regression gate the build; npm run dev starts the dev server

    npm ci && npm run build && npm run preview

  4. 自己打一个可分发包Make a distributable build 产物落在 release/,可挂到 GitHub Release 上当下载链接lands in release/ — attach it to a GitHub Release

    npm run package:web

这是什么What it is

路俊航靠修旧物为生。六年前母亲在这条路上失踪,只留下一间空的第十八驿站。一封律师函给了三十天:开张,否则土地被依法收回——而山下有人想要那口温泉。Miles Lu repairs broken things for a living. His mother disappeared on this road six years ago and left him the family business: the Eighteenth Station inn, empty ever since. Then a lawyer's letter gives him thirty days to open it, or the land is taken by law — and someone would like what sits under the hot spring.

路上不空。守碑人记得这条路,不记得自己;你替所有人留着回家的路,代价是没人记得你。沿途四块碑这么写着,其中一块的字被凿掉了,只剩「半個 188」。The road is not empty. The keeper remembers the road, not himself. You keep the way home for everyone — the price is that no one remembers you. Four chiselled steles say so along the way; one has had its letters scraped off, leaving half a 188.

碎片之间散着五件乐事——云、茶、琴、竹、禽,每样都要来三次才肯给点什么。没有战斗,没有失败状态,没有过场动画:每一句对白都在车还在动的时候到来。最后,十五枚碎片被压成一张明信片,你可以手写、导出 PNG,或者留白;然后在「留下那扇门」和「放手」之间选一个。Between them are five small joys — cloud, tea, zither, bamboo, bird — each wanting three visits before it gives anything up. No combat. No fail state. No cutscene: every line arrives while the bicycle is still moving. At the end the fifteen fragments you collected are pressed into a postcard you can write on and export as a PNG — or leave blank — and then choose between Leave the Door and Let Go.

  • 云Cloud三次three visits
  • 茶Tea三次three visits
  • 琴Zither三次three visits
  • 竹Bamboo三次three visits
  • 禽Bird三次three visits

5 件乐事 × 3 次 = 15 枚碎片 → 1 张明信片 → 「留下那扇门」或「放手」5 joys × 3 visits = 15 fragments → 1 postcard → Leave the Door, or Let Go

宣传物料Promotional material

清晨的光,一杯放下的茶——为「茶」这一乐事拍的一支氛围片,配三张静帧。这些是 AI 生成的画面(TapNow),不是游戏实录;游戏本身长什么样,看上面 01 号那张录屏。Morning light and a cup set down — a mood film for the tea joy, with three stills. These frames are AI-generated (TapNow), not gameplay; for what the game actually looks like, watch the recording in card 01 above.

AI 生成AI-generated
镜头 1 · 清晨放茶 · 5.0 秒静音循环 · 864×496 · 无音轨 · AI 生成(TapNow)Shot 1 · morning, tea set down · 5.0 s silent loop · 864×496 · no audio track · AI-generated (TapNow)
  1. 为什么是「茶」。故事里有五件乐事——云、茶、琴、竹、禽;茶是其中最一眼看得懂的那件,也最接近一间驿站真正在做的事:烧水、放下、等它凉一点。Why tea. The story has five small joys — cloud, tea, zither, bamboo, bird; tea is the one that reads at a glance, and the closest to what an inn actually does: boil water, set it down, wait for it to cool a little.
  2. 方向定在清晨。候选里另有一版更暗的黄昏调(候选 C),最后没有采用:故事是从清晨开始的,这一页本身也是纸色——黄昏那张摆在中间,像另一部片子。The direction settled on morning. A darker dusk grade was also explored (candidate C) and left unused: the story opens in the morning and this page is paper-coloured — the dusk frame sat in the middle looking like a different film.
  3. 循环播放、没有声音(源文件就没有音轨);系统开了「减少动态效果」时停在封面帧上。封面帧是从片子里 t=2.5s 抽的;三张静帧都是 1280×720——两张候选由 TapNow 的 2560×1440 原件降采样而来,成片那张本来就是 1280×720。It loops silently (the source has no audio track) and holds on the poster frame when the system asks for reduced motion. The poster is a frame pulled from the film at t=2.5s; the three stills are all 1280×720 — the two candidates downsampled from TapNow's 2560×1440 originals, the final one already 1280×720.
清晨的客厅,两杯新茶放在矮桌上,阳光穿过窗帘。Two cups of new tea on a low table in morning light. AI 生成AI-generated
成片 · 清晨闭环 · 两杯新茶 Final · morning loop · two cups of new tea
清晨,一道光斜落在矮桌上,一只杯子冒着热气。A single cup under a beam of morning light. AI 生成AI-generated
风格候选 A · 清晨 Style candidate A · morning
黄昏,两杯茶摆在暗下来的房间里,窗外是城市的暮色。Two cups in a dim room at dusk. AI 生成AI-generated
风格候选 C · 两杯茶(未采用) Style candidate C · two cups (not used)

工程与实测Engineering & measured

游戏本体Game build
20.78MB63 个文件63 files
其中模型of which models
16.84MB占 81%81%
首屏必下First playable frame
3.45MBJS gzip 285 KB285 KB gzipped JS
开发规模Development
4天days四天 · 49 笔提交 · 一人Four days · 49 commits · one person
本机实测(游戏本体,不含本页素材)· 数字量自本机 dist/,2026-10-07。Measured locally (game build, excluding this page's media) · from the local dist/ on 2026-10-07.
  • Three.js r169
  • TypeScript
  • Vite
  • Blender
  • Tripo
  • Godot 4.6 → three.js

i

为弱机而生Built for weak hardware

  • 路面、地形、草皮、水面不下载任何贴图文件,质感全部在着色器里算——一张铺满屏幕的草片,每层就是一次全屏纹理采样,而集显恰好卡在这里。Road, terrain, grass and water download no texture files at all; their detail is computed in shaders, because a grass card filling the screen costs a full-screen fetch per layer.
  • 16 座驿站落在 13 个模型位上:其中 7 个是代码生成的(屋檐、柱、基座、栏杆,每座 0.01 MB,零图片字节),6 个加载真模型——5 座碎片驿站由 Tripo 生成、自带贴图,第 6 个位置本身就是一棵榕树。The 16 stations stand on 13 model slots: 7 are generated in code at 0.01 MB each with zero image bytes, and 6 load real models — the 5 fragment stations come from Tripo and do carry their own textures, and the sixth slot is a banyan tree in its own right.
  • 三档画质切内部分辨率 0.60× / 0.85× / 1.0×、阴影与植被距离;低档直接删草皮,把预算花在分辨率上。没有后处理——暗角是一个 DOM 覆盖层,GPU 成本为零。Three tiers cut internal resolution (0.60× / 0.85× / 1.0×), shadows and vegetation range; the low tier deletes grass and spends that budget on resolution. No post-processing.

ii

Tripo 用了在哪Where Tripo did the work

  • 22 个 3D 资产里 14 个来自 Tripo:摩托车的 69 个零件、自行车的 19 个、滑板的 5 个,外加 5 座碎片驿站、松树、竹丛、灌木与两栋现代建筑。14 of 22 3D assets came out of Tripo: 69 motorcycle parts, 19 bicycle parts, 5 skateboard parts, plus 5 fragment stations, pines, bamboo, shrubs and two modern buildings.
  • 两份车模导出时都是 0 骨骼 0 动画,摩托的骑手和车体还焊在同一批零件里。在 Blender 里按实测轴位重建两骨 IK、把踩踏循环烘成动画;three.js 侧再用协方差 Jacobi 特征分解从几何里量出车轴,修正导出时未对齐 three 轴向的偏差(自行车车头偏 10.67°、摩托偏 26.58°)。Both vehicles exported with zero bones and zero animation, the motorcycle's rider welded to the frame. Two-bone IK was rebuilt in Blender against measured axes; on the three.js side a covariance Jacobi eigendecomposition recovers the drive axis and corrects the export's axis mismatch (bicycle 10.67°, motorcycle 26.58°).
  • 自行车的曲柄轴、曲柄臂与两只踏板共 7 个零件是导出件里没有的,是在 Tripo 模型之上自己搭的传动机构。Seven bicycle parts — crank axle, crank arms, both pedals — are not in the export at all: the drivetrain was built on top of the Tripo model.

iii

怎么保证它没坏How it is kept honest

  • 移植自 Godot 4.6 原型,本届比赛期间重做为 three.js r169 + TypeScript + Vite;玩法与数值 1:1 保留,双语文案在此基础上补到 415 条,表现层与工程结构重做。The original was Godot 4.6. This build is three.js r169 + TypeScript + Vite — a full port rebuilt during the competition: gameplay and numbers kept 1:1, the bilingual strings carried over and grown to 415, the presentation layer and project structure rebuilt.
  • 几何不变量写成无头回归:60 条 / 935 条断言,钉住 961 个中线点、1228.8 m、4 处交叉、16 座驿站可达、经济系统总量、水位、双语键集合一致。它是上线的门。Geometric invariants live in a headless regression — 60 suites / 935 assertions pinning the 961 centreline points, 1228.8 m, 4 crossings, 16 reachable stations, economy totals, water level and bilingual key parity. It gates the deploy.
  • 它抓到过真问题:一个漏掉的 fmod 把群山压成了一片高原,而当时所有按数量写的断言还是绿的。It has caught real bugs: a missing fmod flattened the mountains into a plateau while every count-based assertion stayed green.

联系开发者Contact the developer

《188号礼物》是一个人做的:代码、模型、动画、音乐、双语文案,全部出自同一双手。扫下面的码,加开发者本人的微信——反馈 Bug、讨论玩法、谈合作,直接找到他,没有客服中间层。Gift No.188 is made by one person — code, models, animation, music and both languages, all the same pair of hands. Scan the code to add the developer on WeChat — bug reports, gameplay talk or collaboration reach him directly, with no support desk in between.

  • 最快的路就是它。没有客服、没有工单中间层——反馈 Bug、讨论玩法、谈合作,在微信里直接说,通常一天内回复。The fastest way in. No support desk, no ticket queue — bug reports, gameplay talk or collaboration, said straight to the person who built it, usually answered within a day.
  • 加上好友之前。开发日志和 49 笔提交记录都公开在页脚的仓库里,想先翻一遍再扫码,完全没问题。Before you add him. The dev log and all 49 commits are public in the repository linked in the footer — scout through them first, then scan, that works just as well.
开发者微信二维码:扫二维码,添加我为好友。WeChat QR code of the developer — scan to add him as a friend.
微信 · 开发者本人的账号 WeChat · the developer himself