一个可挂载的 Rails 引擎,用于网络安全培训的密室逃脱游戏。
在你的 Gemfile 中:
gem 'break_escape', path: 'path/to/break_escape'
然后:
bundle install
rails break_escape:install:migrations
rails db:migrate
rails db:seed # 可选:从场景创建任务
在你的 config/routes.rb 中:
mount BreakEscape::Engine => "/break_escape"
export BREAK_ESCAPE_STANDALONE=true
rails server
# 访问 http://localhost:3000/break_escape/
在 Hacktivity 或其他 Rails 应用中挂载。引擎将使用主机应用的 current_user(通过 Devise)。
# config/initializers/break_escape.rb
BreakEscape.configure do |config|
config.standalone_mode = false # 开发环境设为 true
config.demo_user_handle = 'demo_player'
end
break_escape_missions - 场景元数据(名称、显示名称、发布状态、难度)break_escape_games - 玩家状态 + 场景快照(JSONB)break_escape_demo_users - 仅独立模式(可选)GET /games/:id/scenario - 场景 JSON(ERB 生成)GET /games/:id/ink?npc=X - NPC 脚本(从 .ink 即时编译)GET /games/:id/bootstrap - 初始游戏数据PUT /games/:id/sync_state - 同步玩家状态POST /games/:id/unlock - 验证解锁尝试POST /games/:id/inventory - 更新物品栏场景存储为 .json.erb 模板,按需渲染并带有随机值:
<%= random_password %> - 为每个游戏生成唯一密码<%= random_pin %> - 生成唯一的 4 位 PIN 码<%= random_code %> - 生成唯一的十六进制代码NPC 对话脚本在首次请求时编译(约 300ms):
.json 是否存在且比 .ink 更新inklecate 编译玩家状态存储在 JSONB 列中:
测试在 GitHub Actions 上自动运行。提交的 Gemfile.lock 固定了所使用的确切 gem 版本。
bundle install
bundle exec rails db:create db:migrate RAILS_ENV=test
bundle exec rails test
引擎附带一个 bin/setup 脚本,可从同级 Hacktivity 检出目录引导 bundle(其中已包含所有必需的 gem):
# 从 BreakEscape 根目录运行 — Hacktivity 必须在 ../Hacktivity
bin/setup
bundle exec rails test
# 如果 Hacktivity 在其他位置,设置 HACKTIVITY_DIR:
HACKTIVITY_DIR=/path/to/Hacktivity bin/setup
bin/setup 将解析后的 .gem 文件复制到 vendor/cache/ 中,并运行 bundle install --local。vendor/cache/ 和 vendor/bundle/ 目录已被 gitignore;仅提交 Gemfile.lock。
集成指南请参见 HACKTIVITY_INTEGRATION.md。
感谢所有为该项目做出贡献的人。请参考 GitHub 历史记录。