欢迎来到 AlfFarmTale
欢迎来到《芙田物语 AlfFarmTale》启动页面,右方三组按键均为游戏启动通道,点击任意按钮就能进入种田 Demo 开始游玩。
本作是时长约十分钟的治愈箱庭种田 Demo,故事围绕女仆阿芙的成长历程展开。游戏操作简单易懂,没有繁琐复杂的硬核玩法,你可以体验耕种、浇水、收割、伐木全套农耕内容,自由游览银岚城、灯湾小镇等场景,沉浸式感受阿芙孤身踏上试炼,慢慢变得独立坚强的暖心剧情。
进入游戏后若遇到角色卡住无法移动的问题,按下键盘 ESC 返回主菜单重新开启新的游戏就能解决。Demo 当前只开放序章与基础劳作系统,完整主线剧情、农场建造、角色成长体系还在持续开发完善中,感谢你愿意前来陪伴阿芙开启这场田间冒险。
资源加载敬请耐心等候
在线人数较少时推荐三号阿里云服务器
若出现长时间加载停滞、网络连接异常等情况
可切换一、二号备用节点重新尝试
这是一款十分钟体量的治愈线性箱庭种田 Demo,故事围绕内向胆怯的女仆阿芙展开。在侦探的安排下,她离开熟悉的银岚城,独自奔赴孤岛完成成长试炼。游戏摒弃复杂硬核数值与繁琐机制,主打松弛舒缓的田园体验,你可以亲手开垦土地、播种浇灌、收割作物,走进灯湾小镇、旧邮路与海岸农场自由漫步,在日复一日的劳作里,见证阿芙摆脱依赖、变得独立坚定的完整心路。 四季流转会改变林间光影与作物生长节奏,没有残酷枯萎惩罚,不用焦虑赶进度,只需慢慢享受耕种与探索带来的平淡治愈。所有采集、农耕、建造内容都服务于角色成长剧情,不存在无意义的重复刷取,安静陪伴阿芙走完这场属于她的温柔旅途。
NO.1
这里收藏着芙田物语的每一段旅程
NO.2
Beta 0.20.0・阶段终版更新
NO.3
Readme说明文档
NO.4
过场动画
NO.5
游戏概念
《芙田物语 AlfFarmTale》的所有版本变更。版本格式遵循 主版本.次版本.修订号,并按发布阶段加 Alpha / Beta 前缀。
Beta 0.20.0
2026-06-21Prologue 章节解锁
"故事开始了:雨夜、卷宗、即将到来的海鸥岛。"
本次更新在 alpha0.19.2 的基础上,正式解锁序章 Prologue 章节、引入体力 / 食物双轨制、重做可破坏建筑系统,并大幅扩展银岚城(SilverMist)内容。属于一次较大的内容性版本重写。
✦ 故事・新内容
全新 Prologue 章节「WuningHouse」
解锁 Wuning 居所三联场景 + 完整开场剧情。新增 / 改动的场景:
- WuningHouse(wuning 居所):雨夜 Alf 闯入收卷宗的房间,屋内带事故片段视频播放(自带 Skip 按钮)
- WuningHouseAlf(卧室):按 F 拾取关键道具 → 走到床边点 "Sleep" → 推进一日 + 切到走廊
- WuningHouseCorridor(走廊):走到 Wuning 私人房间入口触发回忆对话门
- 三联场景统一接入 PointLight2D 烛火闪烁系统
- 专属 BGM《Silent Rain Narrative》全程循环
配套新增资产
- 音效:雨声、雷声(3 变种)、翻页声、开锁声、撞击声
- 角色立绘:Wuning 全身立绘、Alf 剑击 + 放置动画
- 场景贴图:Wuning 三联场景全套室内贴图、SilverMist 屋内贴图
新任务
| ID | 摘要 | 触发方式 | 奖励 |
|---|---|---|---|
| 101 | 海鸥岛旧农场代管 | 到达 Birth 场景自动完成 | 10× 卷心菜种子 |
✦ 玩法・系统大改
体力 / 食物 / 休息系统(核心升级)
旧版单一能量条改为「跑步消耗可自然回复」+「劳作永久扣除」双轨制:
- 跑步消耗(按住 Shift):归零后 2 秒喘息期,期间 Shift 无效但不致死锁
- 永久扣除:锄地 / 浇水 / 砍树 / 建造 / 播种 全部累加 energy_floor,封顶 energy_max
- 8 种食物可食用:右键手持 Food 类物品直接吃,吃掉永久降低体力下限 → 上限自动上升
- 苹果 / 胡萝卜 +5、番茄 / 茄子 +6、小麦 +4、卷心菜 +8、南瓜 +10、小黄瓜 +7
- 体力 ≤ 0 拦截:锄头 / 浇水壶 / 斧头完全无法使用,range 提示自动隐藏
- 累瘫对话:体力跌到 0 那一帧边沿触发一句 Alf 提示,不会反复弹
- 能量条 UI 升级:体力归零时变暗红色,条不再消失(避免玩家误判为 bug)
农田生长 × 浇水联动
- 旧版:时间推进就生长
- 新版:只有 moisture > 0.5(视觉湿润)时才生长
- 不浇水约 50 分钟后生长自动暂停,再浇水立即恢复
- 所见即所得,wet 视觉 ↔ 生长状态对齐
可破坏建筑系统重做
- 砍栅栏 / 箱子 / 床 / 装饰 统一走斧头(HoldEffectResource 抽象),大部分 1 下碎
- 砍宝箱:先吐内部所有物品到地上,再让宝箱消失,不会丢东西
- 锄头新功能:可擦带
metadata/tellable = true的装饰 tile(如 Afforest 层),擦完自动变可耕地,主动扩展开垦空间 - 配置集中在 Level 顶部两张 const 表,加新特例改表不动 Inventory 资源
SilverMist 热闹起来了
新增 3 个 NPC + 3 家新商店:
| NPC | 角色 | 商品 |
|---|---|---|
| NPC 4001 | 装饰 / 家具店主 | 90+ 件摆设(床、椅子、沙发、书架、画作、食物摆盘、餐具、盆栽、钟、衣柜) |
| NPC 4002 | 食材 / 种子店主 | 全 8 种食物 + 全 7 种种子 |
| NPC 4003 | 武器 / 工具店主 | sword、wood、axe、hoe、sprinkler |
旧 npc2001 工具店大幅精简:只留 axe / hoe / sprinkler / sword / carrot / carrot_seed
✦ 视觉・体验优化
- 启用 MSAA 2D / 3D 抗锯齿,场景锯齿大幅缓解
- 室外相机缩放 1.2 → 1.8,视野更近更舒适
- 室内相机缩放 1.5 → 2.0,屋内更聚焦
- Wuning 三联场景 + Alf 全身动画 + Wuning 立绘全套到位
- SilverMist 场景首次加入室内
- 新增 BGM 池混合播放:未注册专属 BGM 的场景自动从
village_01 + birth两池随机选播
🐛 修复
- 「砍完树后不能耕地」:4 个 outdoor 场景的 hidden 美术辅助 Tree 层不再阻挡锄地判定
- 满体力误判守卫:旧版
floor > 0时吃东西被误拦,现在用future_current预测算法判断 - 开局能量条不满:默认
energy_floor从 1 改回 0.0,且 .tres 显式声明energy_max / current / floor三字段 - Afforest 装饰 tile 阻挡开垦:锄头走 BreakableTellable 通用入口
- 「离开区间反复触发对话」:状态机改用
Area2D._on_*_body_entered边沿信号,不再每帧检测 - Web 镜像种子路径错位:
birth_fellable_tree_exist_resource.tres→birth_fellable_tree_resource.tres对齐桌面端 - 室内
mouse_focus光标方块错乱:indoor 场景自动隐藏 - BGM 衔接错乱:Wuning → SilverMist 切换时按当前
level_name重播 - 能量条归零完全看不见:旧版直接
visible=false,现在保留条 + 暗红色提示
⚡ 性能 / 存档
- 桌面端存档全部写到
res://archives/<slot>/,不再覆盖 res:// 源文件,多 slot 不再互相污染 - Web 端 cold-start 镜像范围扩展到 16 个新场景存档
- WebSaveAdapter 新增
swap_to_runtime_deep递归 swap,Inventory 物品引用刷新 InventoryNode._relink_inventory_after_swap()修正 Web deep-swap 后玩家改动写到旧 bag 的 bug
📁 文件改动(按模块)
历史版本日志 · Changelog Archive
Alpha 0.19.2 双端存档系统 ❯
整体架构
项目采用 WebSaveAdapter 适配层 + ResourceManager 统一接口 + GameManager 生命周期管理 的三层架构,实现了 Windows 桌面端和 Web 端的跨平台存档支持。
一、Windows 桌面端存档实现
1.1 存储路径
桌面端使用 res://archives/<slot>/ 目录结构,其中 <slot> 格式为 序号_月日_时分(如 1_0609_1431)。
1.2 存档流程
- 用户主动保存(暂停菜单
save_to_archives()) - 退出游戏时(
NOTIFICATION_WM_CLOSE_REQUEST触发)
核心流程(GameManager.on_quit()):
1.3 多存档槽实现
桌面端通过目录复制实现多存档槽:new_game 时创建新目录,从 _original.tres 文件加载初始状态;load_game 时将对应目录的 .tres 文件复制回 res://resources/。
二、Web 端存档实现
2.1 存储路径
Web 端使用 user://runtime_state/ 作为运行时状态根目录。
2.2 核心机制:镜像替换
冷启动(Cold Start):首次加载时,将 SEED_RUNTIME_PATHS 中的资源从 res:// 复制到 user://runtime_state/,确保 WebAssembly 只读文件系统的可写性。
运行时替换:
2.3 保存触发机制
Web 端没有 WM_CLOSE_REQUEST 事件,采用多重保险:
| 触发时机 | 机制 | 作用 |
|---|---|---|
| 每 30 秒 | Timer 自动保存 | 防止意外丢失 |
| beforeunload | JavaScript 事件 | 传统刷新/关闭 |
| pagehide | JavaScript 事件 | 移动端切后台更可靠 |
| visibilitychange → hidden | JavaScript 事件 | 切换标签页立即保存 |
关键代码(_register_beforeunload()):
三、核心类职责
| 类 | 职责 |
|---|---|
| WebSaveAdapter | 跨平台路径适配、Web 端事件监听、runtime_state 管理 |
| GameManager | 游戏生命周期管理、quit 信号分发、存档触发 |
| ResourceManager | 统一的资源加载/保存接口,递归处理子资源 |
| Main | 主菜单 UI、存档列表管理、新游戏/加载游戏逻辑 |
四、路径转换逻辑
五、设计亮点
5.1 零侵入式适配:桌面端可以完全移除 WebSaveAdapter autoload,不影响原有逻辑;通过 is_web 分支实现平台隔离。
5.2 递归子资源处理:swap_to_runtime_deep() 解决了 Godot 子资源引用问题,确保导出的 .tres 文件中 ext_resource 指向正确路径。
5.3 事件覆盖完整性:Web 端监听三种浏览器事件,覆盖所有退出场景;移动端切换后台也能正确保存。
5.4 冷启动容错:首次加载自动 seed,无需手动初始化;检查文件存在性,避免覆盖已有存档。
六、数据流向图
七、总结
| 对比维度 | Windows 桌面端 | Web 端 |
|---|---|---|
| 存储路径 | res://archives/<slot>/ | user://runtime_state/<slot>/ |
| 触发机制 | NOTIFICATION_WM_CLOSE_REQUEST | JavaScript 事件 + 定时器 |
| 资源加载 | 直接读 res:// | 优先读 user:// 镜像 |
| 多存档管理 | 目录复制 | slot 子目录隔离 |
| 冷启动 | 不需要 | seed 默认资源到 user:// |
该设计通过适配器模式优雅地解决了 WebAssembly 只读文件系统的限制,同时保持了桌面端的原有行为,实现了真正的跨平台存档兼容性。
Dev 0.18.1 重写光影系统 ❯
SDF 数据是 CPU 预先计算后作为普通纹理上传的,不依赖 GPU 的特殊 SDF 支持。
1. GlobalLight 光照系统
- 删除了
color_rect和着色器相关代码 - 修改
DirectionalLight2D角度为完整 24 小时周期:凌晨 3 点 -90°、正午 12 点 -180°、19 点 -270°、午夜 -360°(即 0°) - 角度变化改为线性(移除缓入缓出)
- 添加
max_dist时间变化逻辑(控制阴影距离)
2. ShadowShader 阴影着色器
- 将 angle 参数反向旋转(添加负号)
- 将
angle=0偏移为 180°
3. SoundManager 音效管理
- 背景音乐随机播放间隔从 60-180 秒改为 30-90 秒
4. 背包交互系统
- 修复右键拖拽误触:区分"左键拿起"和"右键平分"模式,只有左键拿起后右键拖拽才能逐格放置
- 禁止鼠标点击选择 hold 栏:只能通过快捷键(pageup/pagedown/1-9)选择
- 修复物品放入 hold 栏不刷新问题:在
HoldItem.update_display()中自动检测并刷新 lift sprite 和 range 显示
这些修改提升了游戏体验,减少了误触操作,优化了光照系统的动态效果。
Dev 0.17.2 修复 bug ❯
1. Menu 互斥逻辑修复
- 移除不存在的 handbook 调用:修复了
attribute.handbook.reset()的报错 - 实现互斥打开:点击 Bag 时关闭 Task,点击 Task 时关闭 Bag
- 使用
call_deferred:确保切换操作在帧结束时执行,避免动画冲突
2. Bag 和 Task 动画效果增强
- 添加缩放动画:参考 Shop 的实现,为 Bag 和 Task 添加了缩放动画效果
- 修复居中问题:将
pivot_offset设置移到_ready()中,确保缩放以面板中心为原点
3. StatusInfo 能量条控制
- 动态显示/隐藏:当能量为 0 时隐藏
%EnergyInner,否则显示
4. Shop 功能增强
- ESC 键关闭:添加 ESC 键关闭商店的功能
- 互斥控制:商店打开时禁止打开 Bag 和 Task(快捷键和点击菜单都禁用),并自动关闭现有的 Bag 和 Task
- 滚轮操作控制:商店打开时禁用 Hold 的滚轮操作(Page Up/Page Down),商店中 Page Up/Page Down 用于翻页
- Sell 逻辑优化:出售物品后保持选中状态,直到物品卖完才取消选择
5. 快捷键统一处理
- Bag 和 Task 的快捷键都通过 Menu 的
on_click_item()方法处理,确保互斥逻辑一致
Dev 0.17.1 新增建筑系统 ❯
栅栏 + 箱子持久化
- 新增完整建筑放置功能,支持放置栅栏、箱子两种建筑道具
- 栅栏拥有自动连接逻辑,相邻栅栏可自动衔接,视觉效果连贯自然
- 栅栏配置专属碰撞体,玩家无法穿越,满足地形阻挡需求
- 全数据持久化生效:栅栏、箱子的放置位置永久保存
- 箱子支持独立储物,内部存放的物品数据同步持久化,重启游戏不丢失
斧头栅栏砍伐功能
修改文件:
building_resource.gd:新增fence_axe_count字典,用于存储栅栏砍伐累计次数level.gd:新增get_current_tile_can_axe_fence()、axe_fence()核心逻辑函数7003.gd(斧头效果脚本):新增栅栏专属砍伐执行逻辑8001.gd(栅栏配置脚本):新增AXE_NEEDED配置常量
- 解锁斧头砍伐栅栏的能力,需累计砍伐指定次数才可破坏栅栏
- 砍伐所需次数可在
8001.gd中自由配置,默认需要砍伐 3 次 - 栅栏砍伐成功后,自动掉落 1 个对应栅栏物品
- 完全保留原生砍树逻辑,互不冲突、互不影响
Shift+左键 物品快速转移功能
修改文件:inventory_node.gd
- 箱子存储空间已满时,物品自动转移至对应互补栏位(背包 ↔ 持握栏互换填充)
- 完整支持物品堆叠合并逻辑,自动补齐同类物品堆叠数量,优化转移体验
极速连续拾取物品功能
修改文件:
character.gd:优化拾取逻辑,物品拾取后立即从物品列表移除interact.gd:移除拾取动画播放期间隐藏交互提示的限制条件
- 支持玩家快速连续按下 F 键批量拾取物品,无需等待拾取动画播放完成
- 场景物品交互提示永久显示,无隐藏限制,方便玩家连续操作拾取
Dev 0.16.3 更新界面 UI、修复商店 bug ❯
StatusInfo 能量消耗功能 (statusinfo.gd)
- 监听角色操作信号(锄地/收获、浇水、砍树),每次操作消耗 1 点能量
- 确保能量不会低于 0
- 实时更新生命条和能量条的 UI 显示
商店出售价格修复 (shop.gd)
- 价格显示:出售模式下显示八折价格,且最低为 1 金币(避免价格为 1 的物品打八折后变成 0)
- 实时更新:在
_process中持续更新价格,确保通过任何方式修改数量(点击按钮、手动输入、回车)都能正确显示
实际交易价格修复 (character.gd)
- 出售物品时实际获得的金币也应用八折计算,且最低为 1 金币
- 确保显示价格和实际交易价格保持一致
Dev 0.16.2 修复 bag 操作 bug ❯
- 修复了背包满时拾取 pickable 导致重复生成的问题
- 修复了右键按住拖拽时误触发平分的问题
- 修复了右键点击和拖拽重复放置的问题
Dev 0.16.1 优化 bag 操作 ❯
1. 物品堆叠上限
设置物品堆叠上限为 64 个;超过 64 个时会自动寻找新的空位放置。
2. 左键点击操作
- 拾取物品:左键点击物品,物品附着到鼠标上,显示半透明预览
- 放置物品:点击空格子直接放入;点击相同物品合并(超过 64 个时剩余继续附着);点击不同物品交换位置
3. 右键点击操作
- 平分物品:右键短按(< 200ms)物品,将物品平分到鼠标上,余数留在原格子
- 放置 1 个物品:右键点击空格子放置 1 个,或点击相同物品增加 1 个
4. 右键拖拽操作
- 按住右键滑过空格子:每个空格子放置 1 个物品
- 按住右键滑过相同物品格子:每个格子增加 1 个物品
- 同一个格子在一次拖拽中只能放置一次
5. 双击操作
双击物品:合并背包和手持中所有相同的物品,直到达到 64 个上限。
6. 快捷键操作
Q 键:丢弃鼠标悬停的物品,每次只丢弃 1 个。
7. 界面外操作
点击背包/手持界面外:掉落附着的物品。
8. 背包关闭处理
- 尝试返回原格子
- 如果原格子被占用,寻找空格子
- 如果背包已满,触发掉落
Dev 0.16.0 添加商店功能 ❯
一、商店购买功能实现
在 shop.gd 完善 _on_buy_pressed() 方法,实现完整购买逻辑:检查是否选中商品 → 获取选中商品的 inventory 数据 → 获取 spinbox 选择的购买数量 → 调用角色 to_buy_inventory() 方法,完成扣除金币 + 添加物品到背包。
二、代码结构优化(shop.gd)
添加 region 代码分类,提升可读性:
三、UI 功能优化
- 物品价格显示:选中物品时,
%Price标签显示总价 = 单价 × 数量,仅显示整数 - 实时价格更新:点击 sub/add 按钮、直接修改 SpinBox 数值时,价格自动同步更新
- 界面缩放优化:初始/关闭缩放从 80% 调整为 95%,缩放差值降至 5%,效果更自然
四、问题修复
- Shop 界面 Buy 模式 SpinBox 最大值限制:购买数量最高只能为 1,add 按钮失效 → 修复:
update_current_select()区分模式,Buy 模式spinbox.max_value = 99(无限库存),Sell 模式为物品实际持有数量 - BGM 提前停止:音乐硬编码限制 120 秒,播放中断 → 修复:
play_level_audio_loop()使用back_audio_player.finished信号,让音乐自然播放完毕 - 出售物品逻辑失效:仅修改商店临时数据,未真正扣除背包/手持物品 → 修复:
_on_sell_pressed()中先定位背包/手持物品节点,再调用出售方法,同步修改真实数据 - 物品添加优先级调整:购买物品优先放入手持 (hold),再存入背包 (bag) → 修复:
find_can_use_item()、find_exist_item()中交换遍历顺序,先检查手持
五、涉及文件
AlfFarmTale/managers/utils_manager/children/shop/shop.gdAlfFarmTale/managers/sound_manager/sound_manager.gdAlfFarmTale/compoents/character/character.gd