hejunjie/text-adventure-engine

一个轻量级、可扩展的 PHP 文字冒险游戏核心引擎 Composer 包,专注于游戏流程管理和玩家状态维护,帮助开发者快速搭建基于文字选择的冒险游戏

v0.0.1 2025-08-11 11:53 UTC

This package is auto-updated.

Last update: 2025-08-12 01:56:42 UTC


README

开发中:当前版本尚未稳定,功能可能会有调整。
目前处于基础功能开发阶段,仅供测试与预览使用。
计划在完善后发布稳定版本,并附带完整 Demo。

一个轻量级、可扩展的 PHP 文字冒险游戏核心引擎 Composer 包,
专注于 游戏流程管理玩家状态维护,帮助开发者快速搭建基于文字选择的冒险游戏。

✨ 特性

  • 灵活的场景与选项系统 — 自由定义游戏分支与流程
  • 内置玩家状态管理 — 轻松维护生命值、金币、背包等属性
  • 可扩展的存档机制 — 支持文件、数据库、Redis 等多种持久化方案
  • 易于集成 — 设计简单,几乎可以无缝嵌入任何 PHP 项目或框架

适合用于快速开发单人文字冒险游戏,或作为更复杂游戏的核心逻辑基础。

📦 安装

composer require hejunjie/text-adventure-engine

🛠 使用说明

1. 场景配置

游戏场景使用 JSON 格式定义,例如:

{
  "start": {
    "id": "start", // 场景唯一 ID
    "description": "你站在一个岔路口,前方有两条路。",
    "options": [
      {
        "key": "go-left", // 选项唯一 ID
        "label": "走左边的小路", // 展示给玩家的文字
        "desc": "你选择了左边的小路。", // 选择后的描述
        "conditions": [ // 条件判断
          {
            "type": "always_true", // 无条件跳转
            "nextSceneId": "forest" // 跳转到的下一个场景 ID
          }
        ],
        "effects": [ // 选项的影响
          {
            "type": "change_attribute", // 改变属性值
            "key": "hp", // 生命值
            "value": -5 // 生命值减少 5
          }
        ]
      },
      {
        "key": "go-right",
        "label": "走右边的大路",
        "desc": "你选择了右边的大路。",
        "conditions": [
          {
            "type": "attribute_check", // 检查玩家属性
            "logic": [
              { "attribute": "gold", "operator": ">=", "value": 10 } // 金币 >= 10 才能进入
            ],
            "nextSceneId": "town"
          }
        ]
      }
    ]
  }
}

2. 开始游戏 / 加载存档

use Hejunjie\TextAdventureEngine\Engine;
use Hejunjie\TextAdventureEngine\Persistence\FilePersistence;
use Hejunjie\TextAdventureEngine\PlayerState;
use Hejunjie\TextAdventureEngine\Repositories\JsonSceneRepository;

// 存档目录
$saveDir = __DIR__ . '/../save_data';
$persistence = new FilePersistence($saveDir);

// 模拟用户 ID
$user_id = 'game-1'; 

// 从文件加载存档
$save = $persistence->load($user_id);

if ($save) {
    // 如果有存档,恢复状态
    $state = $save['state'];
    $sceneId = $save['currentScene'];
} else {
    // 否则初始化新游戏
    $state = [];
    $sceneId = 'start';
}

// 初始化玩家状态
$state = new PlayerState($state, $sceneId);

// 从 JSON 文件中加载场景(也可实现数据库版)
$repo = new JsonSceneRepository('游戏场景.json');

// 构建游戏引擎
$engine = new Engine($state, $repo, $persistence);

// 输出当前场景信息
print_r($engine->start($sceneId));

3. 玩家做出选择

// 让玩家选择某个选项(传入选项 key)
print_r($engine->choose($user_id, 'go-left'));

💡 提示

  • JsonSceneRepository 仅作为示例,你可以替换为数据库实现
  • FilePersistence 可替换为 Redis / MySQL 存储
  • 属性、条件和效果类型都可以扩展