# ranch-moon **Repository Path**: li-luoqiang/ranch-moon ## Basic Information - **Project Name**: ranch-moon - **Description**: 月光牧场 · Moon Ranch 手机浏览器里玩的网页版《牧场物语》 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2026-10-02 - **Last Updated**: 2026-10-03 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 月光牧场 · Moon Ranch 手机浏览器里玩的网页版《牧场物语》。零依赖、零构建、纯 Canvas 像素风 —— 双击 `index.html` 就能玩,也可以丢到任意静态服务器 / Cloudflare Pages 上。 > 当前版本 **v1.7.0** ## 快速开始 ```bash # 方式一:双击 index.html 直接进入开始页(标题 → 新游戏 / 读档 / 说明 / 设置) # 方式二:起个静态服务(推荐,file:// 下各页面 localStorage 互相隔离) python -m http.server 8080 # 浏览器打开 http://localhost:8080 ``` - 开始页 `index.html`:选存档槽开新局 / 读档 / 游戏说明 / 设置(音效、点地自动走、地块网格、自动存档、摇杆大小、清空存档)。 - 游戏页 `game.html?slot=1`:游戏本体,`&new=1` 强制新开。 ## 三个场景 | 场景 | 内容 | 出口 | | --- | --- | --- | | 🏠 月光农场 | 木屋、农田、溪流、商店 | 东侧走道 → 向阳牧场 | | 🐄 向阳牧场 | 谷仓、围栏动物区(鸡/奶牛/绵羊) | 西 → 农场,东 → 月影森林 | | 🌲 月影森林 | 密林与月牙湖,砍树敲石的采集区 | 西 → 向阳牧场 | 走到场景边缘的土路出口即可切换(有路牌指示),切换自动存档。 ## 玩法 核心循环是 **锄地 → 播种 → 浇水 → 收获 → 卖钱 → 买动物**。 | 步骤 | 工具 | 说明 | | --- | --- | --- | | 翻地 | 锄头(1) | 对着土块按「使用」,变成耕地 | | 播种 | 双手(2) | 对着耕地按「使用」,消耗背包里该季的种子 | | 浇水 | 水壶(3) | **每天要浇一次**,不浇水不长 | | 收获 | 双手(2) | 成熟后(头顶水滴感叹号)收割,有概率掉种子 | | 睡觉 | — | 走到屋子门口按「使用」;作物成长、动物产出、体力回满、进入第二天 | | 买卖 | — | 走到商店柜台前按「使用」:**买种子 / 卖东西 / 牧场 / 图鉴** 四个页签 | | 采集 | 斧头(4)/ 镐子(5) | 砍树得木材,敲石得石头(森林里最多) | | 收动物 | 双手(2) | 牧场里已购买的动物每天产东西,走近按「使用」收取 | | 钓鱼 | 钓竿(6) | 对着水面按「使用」抛竿 → 浮标猛沉时再按 → 游标进绿区再按,共三次 | | 聊天 | 双手(2) | 走近村民(店长阿花 / 老约伯 / 小柯)按「使用」闲聊,会给你提示 | | 档案 | 菜单 / F 键 | 农场档案:当日收支、累计统计、作物产量、鱼获分布 | **NPC**:每个场景住着一位村民——农场的店长阿花(商店用法)、牧场的约伯老爹(养动物心得)、森林的小柯(采集与八卦),头顶感叹号提示可以对话,「再聊一句」会换台词。 **商店 · 牧场页签**:鸡 ¥500(每天 1 蛋)、绵羊 ¥1200(每天 1 羊毛)、奶牛 ¥1800(每天 1 奶);每种有上限(鸡 2、牛 2、羊 1),买下后出现在牧场围栏里(未买的显示为半透明影子)。 **商店 · 图鉴页签**:8 种鱼的收集进度。没钓到的显示「???」+ 季节提示,钓到过的显示名称、季节、所需水深、条数与售价。 **音乐**:程序化 chiptune BGM(三角波旋律 + 正弦低音,五声音阶 8 小节循环),首次触摸/按键自动开始,设置里可关。 ## 钓鱼 对着水面按「使用」抛竿,接下来是三段节奏: | 阶段 | 时机 | 操作 | | --- | --- | --- | | 等待 | 0.9~3.2s(浮标轻晃) | 等,别急 | | **咬钩** | 浮标猛沉 + 头顶「!」(0.65~1.05s,稀有鱼窗口更短) | **立刻**按「使用」起竿 | | **拉杆** | 游标在条上往返扫(速度随稀有度加快) | 游标进绿区时按「使用」 | 三次都准才上岸,中途失手会跑鱼/脱钩(只损失时间与 5 点体力)。 **站位与朝向就是策略**:钓竿是**远投**,射程 6 格,抛竿点取「沿当前朝向能到达的最远那格水」。落点离岸越远越深,能碰上的鱼越大 —— - 农场的溪流只有 1~2 格宽,全程 depth 1,只能钓到 1★ 的月光鲫 / 林溪鲈; - 月影森林的月影湖是圆形水域,站在湖边**朝湖心方向投**能落到 depth 2~3,才有 2★ / 3★。 抛竿前画面会画出虚线预览 + 落点脉冲圈(深水额外一圈黄环),照着圈投就行。 **鱼类图鉴**(depth = 离岸格数,`全` = 四季) | 鱼 | ★ | 季节 | depth | 售价 | | --- | --- | --- | --- | --- | | 月光鲫 | ★ | 全 | 0(岸边即可) | ¥45 | | 林溪鲈 | ★ | 春/夏/秋 | 1 | ¥70 | | 月影鲤 | ★★ | 春/夏 | 2 | ¥150 | | 虹斑鳟 | ★★ | 春/秋/冬 | 2 | ¥185 | | 夜行鲶 | ★★ | 夏/秋 | 2 | ¥210 | | 湖心梭鱼 | ★★★ | 夏 | 3 | ¥380 | | 琉璃鱼 | ★★★ | 冬 | 3 | ¥460 | | 月光鱼 | ★★★ | 全 | 3 | ¥900 | ## 季节事件 / 节日 **每季第一天必出该季主事件**,其余日子有 30% 概率撞上随机事件。事件当天生效,睡觉换天后重抽(换季时随季节一起换)。HUD 上有常驻徽标,商店里价格会直接标出涨跌箭头。 | 事件 | 出现 | 效果 | | --- | --- | --- | | 播种节 | 每季春第 1 天 | 全部种子 8 折 | | 夜市 | 每季夏第 1 天 | 卖出价 +40% | | 丰收祭 | 每季秋第 1 天 | 卖出价 +60%、收获额外 +1 | | 暖炉市 | 每季冬第 1 天 | 体力消耗减半 | | 动物嘉年华 | 随机 | 动物一律 5 折 | | 鱼群过境 | 随机 | 抛竿几乎立刻咬钩,稀有鱼权重 ×6 | | 阴雨连绵 | 随机 | 作物当天停止生长(浇的水仍被消耗) | **作物表**(11 种,每季 3 种;换季时未成熟的作物会枯死) | 季节 | 作物 | 种子价 | 售价 | 成熟天数 | | --- | --- | --- | --- | --- | | 春 | 芜菁 | 30 | 75 | 3 | | 春 | 土豆 | 40 | 110 | 4 | | 春 | 草莓 | 60 | 180 | 5 | | 夏 | 番茄 | 50 | 130 | 4 | | 夏 | 玉米 | 70 | 200 | 5 | | 夏 | 菠萝 | 90 | 260 | 6 | | 秋 | 茄子 | 60 | 170 | 5 | | 秋 | 圆白菜 | 80 | 210 | 6 | | 秋 | 南瓜 | 100 | 290 | 6 | | 冬 | 冬芜菁 | 50 | 140 | 4 | | 冬 | 洋葱 | 70 | 190 | 5 | > 冬季只有 2 种作物可种,是刻意的(冬季作物少、售价高,逼玩家攒钱跟春季节奏)。 **规则** - 每季 8 天,一年 4 季(春夏秋冬)。 - 体力用完只能睡觉,每推进一天体力上限略增。 - **砍掉的树、敲掉的石头第二天会重新长出来**(森林每天补 26 处、农场 8 处、牧场 5 处,且不会长在耕地/建筑/人物脸上)。 - 3 个存档槽,自动存档 + 手动存档,进度存在浏览器 localStorage。v1.6 的老存档会自动补齐 v1.7 新字段。 ## 时间与操作手感 - **时间流速**:现实 1 秒 = 游戏 1 分钟(一天 22 小时 ≈ 22 分钟真实时间)。到 22 点提示「天黑了,回屋睡觉吧」并强制结算。 - **作用格对齐**:角色**面前那一格**才是作用目标(脚下一格 + 朝向偏移 1 格),该格会显示**黄色呼吸高亮框**,每帧实时更新,按「使用」不会挖错格。 - 工具键带 `1~6` 序号角标,不用盲按。 - **钓鱼时移动被锁住**(浮标不能脱手);切工具或按 Esc 会顺手收竿。 ## 操作 | 平台 | 移动 | 交互 | | --- | --- | --- | | 手机 | 左下摇杆 / 点地面自动寻路 | 右下「使用」键 / 点工具格 | | 电脑 | WASD / 方向键 | 空格 或 E 使用;数字键 1~6 切工具;B 背包;F 农场档案;Esc 菜单(钓鱼中 = 收竿) | ## 美术素材 `assets/` 下的 PNG 是 AI 生成的像素素材(角色四方向、鸡牛羊、木屋/商店/谷仓、树、石头、12 个作物物品图标),经 `Pillow` 抠底(flood-fill 去棋盘格/白底 + 清残渣)、NEAREST 缩放、调色板量化压缩,**单张 ≤ 35KB**。`js/assets.js` 负责异步加载,加载完成前全部绘制走程序化兜底(色块像素风),所以断网或素材缺失游戏照样能跑。 ## 文件结构 ``` ranch-moon/ ├── index.html 开始页(标题、新游戏、读档、说明、设置) ├── game.html 游戏页(Canvas 容器,按依赖顺序加载脚本) ├── css/style.css 开始页 & 游戏页样式 ├── assets/ 像素素材(AI 生成 + Pillow 后处理) └── js/ ├── assets.js 素材加载器(加载完成重烘焙,缺图走程序化兜底) ├── config.js 常量:分辨率、瓦片、11 种作物、8 种鱼、7 个事件、动物价目、场景与出口 ├── utils.js RNG、插值、提示条、粒子 ├── core.js 应用版本、Settings 设置、Save 多槽位存档 ├── audio.js WebAudio 极简音效(可关) ├── state.js 全局状态、三场景地图生成、场景切换、存档打包 + 老档迁移 ├── world.js 地图查询、背包/种子、动物买卖、事件钩子、钓鱼状态机、资源再生、日子推进 ├── render.js 地面/立体物两层烘焙、图片化绘制、HUD、浮标/拉杆条、弹窗 ├── icons.js 程序化像素 UI 图标(16×16 离屏,硬边放大,零体积) ├── ui.js 布局计算、弹窗入口、切工具、重置 / 清空存档 ├── game.js 主循环、输入、场景出口检测、分辨率自适应 └── start.js 开始页逻辑(槽位、弹窗面板、跳转游戏页) ``` 数据流:`state.js` 持有唯一状态源(`SCENES` → 当前 `map` / `cropMap` / `animals`),`world.js` 改状态,`render.js` 只读绘制,`game.js` 驱动帧循环与输入。 ⚠️ 开始页只加载 `core.js` + `start.js`,**不要引 `config.js`** —— `config.js` 顶层就有 `document.getElementById('cv')`,加载即抛错。 ## 技术要点 - 逻辑分辨率 388~480 × 视口高,整数倍 `SCALE` 缩放 + `image-rendering: pixelated`,像素锐利、中文不糊。 - **两层烘焙**:地面层(草/土/耕地/水/路)+ 立体物层(树/石/墙/门/路牌按 y 行序画,前排遮后排),**建筑图片最后单独画**(否则会被后续墙行覆盖)。 - 多场景:`SCENES[sceneKey]` 各持一份 `map/cropMap/animals`,切换只换引用 + 重烘焙;边缘出口 `EXITS` 表驱动,带 0.8s 冷却防横跳。 - 存档 v3 含三场景数据;v2 老档自动迁移(农场保留、牧场/森林现生成、落点卡墙送回出生点),v1.7 新字段(`event` / `flow` / `byCrop` / `fish` / `wood`)由 `migrateState()` 统一补默认值。 - 动物两个状态位:`owned`(已购买,持久)与 `have`(今日有产出,每天结算置位、收取复位)——别混用。 - **事件钩子单一入口**:所有价格/体力/生长修正只从 `world.js` 的 `seedPrice / sellPrice / staminaCost / ev()` 读,render 层不硬编码任何事件倍率;加减金币统一走 `addGold()` 才能记进当日收支。 - **水深 = 到最近陆地的 8 邻域距离**(多源 BFS 距离变换,`SHORE_D` 缓存按 `map` 引用失效)。不能用水域连通块大小——溪流和湖的规模撞车;也不能用「离岸距离的最小值」——玩家不能进水,站在岸边时那一圈恒为 0,稀有鱼会 100% 钓不到。 - **抛竿是远投**:`rodCastTile(6)` 沿当前朝向前进取最远水格,让「朝湖心投 = 深水大鱼」成为可操作的策略。抛竿前画虚线 + 脉冲圈预览(深水加黄环)。 - 触屏 `pointerdown` + `setPointerCapture`,拖拽区 `touch-action: none`,防误触、防页面滚动。 - 全局 `let`/`const` 跨 `