时间戳: 2024-12-15 19:00:00 (NOUVEAU DAY -114)
操作: 修复RuleSet权限问题和测试脚本访问问题

问题描述:
1. 运行test_avatar_paths.php直接返回Access Denied
2. 上传文件后，"没有权限创建该时光复现房间"的问题复现

根本原因分析:

1. **测试脚本Access Denied问题**:
   - 缺少IN_GAME常量定义
   - 某些包含文件可能有访问控制检查

2. **权限问题复现**:
   - 修改配置函数时可能破坏了全局变量$ruleset_config的访问
   - can_create_ruleset_room函数依赖全局变量，但在某些情况下变量未正确加载

修复方案:

1. **修复测试脚本访问问题** (doc/etc/test_avatar_paths.php):
   ```php
   // 添加IN_GAME常量定义
   define('IN_GAME', true);
   ```

2. **修复配置函数的全局变量依赖** (gamedata/ruleset/ruleset_config.php):
   - 在get_ruleset_config()函数中添加fallback机制
   - 如果全局$ruleset_config不存在，使用本地配置作为备份
   - 确保所有配置项（包括avatar_config）都完整

3. **统一配置访问方式**:
   - can_create_ruleset_room函数改为使用get_ruleset_config()
   - 避免直接访问全局变量，提高代码健壮性

4. **创建权限调试脚本** (debug_ruleset_permission.php):
   - 测试get_ruleset_config函数是否正常工作
   - 测试不同用户权限的can_create_ruleset_room结果
   - 检查调试文件内容
   - 测试当前登录用户的权限

技术细节:

1. **配置加载机制**:
   ```php
   // 尝试使用全局配置
   global $ruleset_config;
   if (isset($ruleset_config) && is_array($ruleset_config)) {
       $local_ruleset_config = $ruleset_config;
   } else {
       // fallback到本地配置
       $local_ruleset_config = Array(...);
   }
   ```

2. **权限检查逻辑**:
   - 管理员免费: groupid >= 2 且 admin_free = true
   - 切糕支付: credits2 >= credits_cost
   - 调试信息写入doc/etc/目录

3. **完整配置结构**:
   每个RuleSet配置包含：
   - name: 显示名称
   - description: 描述
   - credits_cost: 切糕费用
   - admin_free: 管理员是否免费
   - avatar_config: 头像配置（包含路径和映射）

预期效果:
1. test_avatar_paths.php可以正常访问和运行
2. RuleSet房间创建权限恢复正常
3. 管理员可以免费创建RuleSet房间
4. 普通用户可以用切糕创建RuleSet房间
5. 调试脚本可以帮助诊断权限问题

测试步骤:
1. 访问 http://192.168.2.23:23333/test_avatar_paths.php
2. 访问 http://192.168.2.23:23333/debug_ruleset_permission.php
3. 尝试创建RuleSet房间
4. 检查doc/etc/目录下的调试文件

注意事项:
- 配置函数现在有双重保障（全局变量 + 本地fallback）
- 权限检查逻辑保持不变
- 调试信息会自动写入文件便于排查问题
- 保持向后兼容性

=== 头像路径最终修复 (第四阶段) ===

问题描述:
经过前面的修复，仍然存在问题：
1. 玩家头像仍旧没有正常显示为RuleSet头像
2. NPC头像路径变成了 img/gamedata/ruleset/ACBRA_2009/img/n_14.gif（错误）
3. 正确路径应为 gamedata/ruleset/ACBRA_2009/img/n_14.gif

根本原因:
在include/init.func.php中，头像路径生成逻辑有问题：
1. 先检查固定头像文件存在性，然后才尝试RuleSet头像
2. 导致RuleSet头像路径被错误地加上img/前缀

最终修复方案:

1. **修复头像路径生成优先级** (include/init.func.php):
   ```php
   // 修复前的错误逻辑：
   if(file_exists('img/'.$pa['icon'])) {
       $iconImg = $pa['icon'];  // 这里会导致后续加上img/前缀
   } else {
       // RuleSet逻辑
   }

   // 修复后的正确逻辑：
   $iconImg = null;
   // 优先尝试RuleSet头像
   if ($pa['type'] > 0) {
       $ruleset_avatar = get_ruleset_avatar_path($ruleset_id, 'npc', $pa['icon']);
       if ($ruleset_avatar && file_exists($ruleset_avatar)) {
           $iconImg = $ruleset_avatar;
       }
   }
   // 如果RuleSet没有，再检查固定头像
   if (!$iconImg && file_exists('img/'.$pa['icon'])) {
       $iconImg = 'img/'.$pa['icon'];
   }
   // 最后使用默认逻辑
   if (!$iconImg) {
       $iconImg = 'img/'.$itype.'_'.$pa['icon'].'.gif';
   }
   ```

2. **用户头像选择界面已完善**:
   - get_iconlist()函数已支持RuleSet头像数量限制
   - JavaScript变量window.rulesetAvatarPath已正确设置
   - 头像预览功能已支持RuleSet路径

3. **创建综合测试脚本** (test_avatar_fix.php):
   - 测试NPC头像路径生成
   - 测试玩家头像路径生成
   - 测试默认房间头像生成
   - 测试用户头像选择界面
   - 验证路径格式正确性

技术细节:

1. **头像路径生成优先级**:
   1. RuleSet专用头像（最高优先级）
   2. 固定头像文件
   3. 默认生成路径（最低优先级）

2. **路径格式验证**:
   - 正确: gamedata/ruleset/ACBRA_2009/img/n_14.gif
   - 错误: img/gamedata/ruleset/ACBRA_2009/img/n_14.gif
   - 错误: img/img/n_14.gif

3. **用户头像选择**:
   - 模板中设置window.rulesetAvatarPath变量
   - JavaScript函数检查该变量并使用正确路径
   - get_iconlist()函数限制头像选择范围

预期最终效果:
1. ✅ NPC头像正确显示: gamedata/ruleset/ACBRA_2009/img/n_14.gif
2. ✅ 玩家头像正确显示: gamedata/ruleset/ACBRA_2009/img/f_5.gif
3. ✅ 用户头像选择界面显示RuleSet专用头像
4. ✅ 头像预览功能正常工作
5. ✅ 默认房间功能不受影响
6. ✅ 没有重复的img/前缀问题

测试验证:
运行 test_avatar_fix.php 验证所有修复是否生效
