Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Sign in / Register
Toggle navigation
phpdts
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Locked Files
Issues
0
Issues
0
List
Boards
Labels
Service Desk
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Security & Compliance
Security & Compliance
Dependency List
License Compliance
Packages
Packages
List
Container Registry
Analytics
Analytics
CI / CD
Code Review
Insights
Issues
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Nemo Ma
phpdts
Commits
d6456425
Commit
d6456425
authored
Apr 23, 2025
by
Nemo Ma
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
FEAT: revevent basic logic + sliding panel
parent
81111a50
Changes
23
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
23 changed files
with
1692 additions
and
607 deletions
+1692
-607
.gitignore
.gitignore
+2
-0
doc/etc/20240712_revevent_implementation.txt
doc/etc/20240712_revevent_implementation.txt
+67
-0
doc/etc/20240719_itmpara_fix_exchange_issue.txt
doc/etc/20240719_itmpara_fix_exchange_issue.txt
+0
-66
doc/etc/20240719_itmpara_fix_inventory_clear.txt
doc/etc/20240719_itmpara_fix_inventory_clear.txt
+0
-62
doc/etc/20240719_itmpara_fix_itemoff_issue.txt
doc/etc/20240719_itmpara_fix_itemoff_issue.txt
+0
-40
doc/etc/20240719_itmpara_fix_itmpara0_clear.txt
doc/etc/20240719_itmpara_fix_itmpara0_clear.txt
+0
-51
doc/etc/20240719_itmpara_fix_weppara_clear.txt
doc/etc/20240719_itmpara_fix_weppara_clear.txt
+0
-19
doc/etc/20240719_slidingpanel_implementation_final.txt
doc/etc/20240719_slidingpanel_implementation_final.txt
+102
-0
doc/etc/20240719_slidingpanel_redesign.txt
doc/etc/20240719_slidingpanel_redesign.txt
+52
-0
doc/etc/20240719_slidingpanel_summary.txt
doc/etc/20240719_slidingpanel_summary.txt
+91
-0
doc/etc/20240719_slidingpanel_update_button.txt
doc/etc/20240719_slidingpanel_update_button.txt
+136
-0
doc/etc/20240719_slidingpanel_update_fix.txt
doc/etc/20240719_slidingpanel_update_fix.txt
+191
-0
doc/etc/20250408-201259-item-refactor.txt
doc/etc/20250408-201259-item-refactor.txt
+0
-53
doc/etc/20250412-190000-fishing-rest-fix.txt
doc/etc/20250412-190000-fishing-rest-fix.txt
+0
-51
doc/etc/20250417_213905_tl_2ndchance_fix.txt
doc/etc/20250417_213905_tl_2ndchance_fix.txt
+0
-45
doc/etc/20250417_224500_item_consumption_fix.txt
doc/etc/20250417_224500_item_consumption_fix.txt
+0
-40
doc/etc/20250417_225126_fireseed4_poison_fix.txt
doc/etc/20250417_225126_fireseed4_poison_fix.txt
+0
-45
doc/etc/20250417_225450_fireseed4_skill_check_fix.txt
doc/etc/20250417_225450_fireseed4_skill_check_fix.txt
+0
-56
doc/etc/20250421_120724_npc_skills_fix.txt
doc/etc/20250421_120724_npc_skills_fix.txt
+0
-49
include/game/revevent.func.php
include/game/revevent.func.php
+156
-0
include/game/search.func.php
include/game/search.func.php
+7
-0
templates/default/game.htm
templates/default/game.htm
+3
-2
templates/default/slidingpanel.htm
templates/default/slidingpanel.htm
+885
-28
No files found.
.gitignore
View file @
d6456425
...
...
@@ -109,3 +109,5 @@ gamedata/adminlog.php
config.inc.php
templates/default/lastgb.htm
img/NPCAvatar_Temp.psd
/doc/etc/archive
/test
doc/etc/20240712_revevent_implementation.txt
0 → 100644
View file @
d6456425
# 事件机制基础逻辑实现
日期:2024-07-12
## 实现内容
1. 创建了新文件 `include/game/revevent.func.php`,实现了以下功能:
- `update_charge_values(&$data)`: 更新玩家的charge值
- charge1: 最高到101,提升速度按照randver1而定,最高4点每次
- charge2: 不设上限,提升速度按照randver2而定,最高100点每次
- charge3: 最高值128,最低值-128,可提升或削减
- charge4: 没有上限或下限,可提升或削减
- `get_charge_value($data, $charge_key = '')`: 获取玩家的charge值
- 可以获取单个charge值或所有charge值
- `set_charge_value(&$data, $charge_key, $value)`: 修改玩家的charge值
- 根据不同的charge_key应用不同的限制
- `process_charge_events(&$data)`: 在玩家移动或探索时调用此函数来更新charge值
2. 修改了 `include/game/search.func.php` 文件:
- 在文件头部引入了 `revevent.func.php`
- 在 `move` 和 `search` 函数中调用 `process_charge_events` 函数,更新玩家的charge值
## 实现逻辑
1. charge1 的更新逻辑:
- 最高值为101
- 提升速度基于randver1,计算公式为 min(4, max(1, ceil(randver1/32)))
- randver1范围为1-128,所以提升速度为1-4点
2. charge2 的更新逻辑:
- 没有上限
- 提升速度基于randver2,计算公式为 min(100, max(1, ceil(randver2/3)))
- randver2范围为1-256,所以提升速度为1-100点
3. charge3 的更新逻辑:
- 范围为-128到128
- 随机提升或削减1-3点
4. charge4 的更新逻辑:
- 没有上下限
- 随机提升或削减1-10点
## 使用方法
1. 获取charge值:
```php
$charge1 = get_charge_value($player_data, 'charge1');
// 或获取所有charge值
$all_charges = get_charge_value($player_data);
```
2. 设置charge值:
```php
set_charge_value($player_data, 'charge1', 50);
```
3. 更新所有charge值:
```php
update_charge_values($player_data);
```
这些函数已经集成到玩家移动和探索的流程中,每次玩家移动或探索时都会自动更新charge值。
doc/etc/20240719_itmpara_fix_exchange_issue.txt
deleted
100644 → 0
View file @
81111a50
2024年7月19日 修复 $itmpara 字段在装备交换时的问题
在2024年7月19日,我们修复了将具有itmpara字段的武器装备时,背包里面的itmpara(如itmpara6)没有被正确剔除的问题。
但在修复后,出现了一个新问题:已有itmpara字段的武器在和没有itmpara字段的武器交换时,前者的itmpara字段会被错误地清空,而它应该被保留。
以下是对应此问题的修复记录:
1. 修复 `item.weapon.php` 文件中的装备逻辑
- 在装备武器或防具时,确保清零背包中的 `itmpara` 字段,但保留 `itmpara` 变量中的值
- 修改前:
```php
${$eqp} = $itm;
${$eqp.'k'} = $itmk;
${$eqp.'e'} = $itme;
${$eqp.'s'} = $itms;
${$eqp.'sk'} = $itmsk;
${$eqp.'para'} = $itmpara;
$log .= "装备了<span class=\"yellow\">$itm</span>。<br>";
$itm = $itmk = $itmsk = '';
$itme = $itms = 0;
// 清除背包中的itmpara字段
${'itmpara' . $itmn} = '';
```
- 修改后:
```php
${$eqp} = $itm;
${$eqp.'k'} = $itmk;
${$eqp.'e'} = $itme;
${$eqp.'s'} = $itms;
${$eqp.'sk'} = $itmsk;
${$eqp.'para'} = $itmpara;
$log .= "装备了<span class=\"yellow\">$itm</span>。<br>";
$itm = $itmk = $itmsk = '';
$itme = $itms = 0;
// 清除背包中的itmpara字段,但保留itmpara变量中的值
${'itmpara' . $itmn} = '';
```
2. 修复 `item.weapon.php` 文件中的替换装备逻辑
- 在替换武器或防具时,确保将卸下装备的 `itmpara` 值正确地设置到背包中的 `itmpara` 字段
- 修改前:
```php
$itm = $itmt;
$itmk = $itmkt;
$itme = $itmet;
$itms = $itmst;
$itmsk = $itmskt;
$itmpara = $itmparat;
// 清除背包中的itmpara字段
${'itmpara' . $itmn} = '';
$log .= "卸下了<span class=\"red\">$itm</span>,装备了<span class=\"yellow\">{${$eqp}}</span>。<br>";
```
- 修改后:
```php
$itm = $itmt;
$itmk = $itmkt;
$itme = $itmet;
$itms = $itmst;
$itmsk = $itmskt;
$itmpara = $itmparat;
// 将背包中的itmpara字段设置为卸下装备的itmpara值
${'itmpara' . $itmn} = $itmparat;
$log .= "卸下了<span class=\"red\">$itm</span>,装备了<span class=\"yellow\">{${$eqp}}</span>。<br>";
```
这些修改确保了当武器或防具被装备时,背包中的 `itmpara` 字段会被正确处理,同时在交换装备时,已有 `itmpara` 字段的武器的 `itmpara` 值会被正确保留。
doc/etc/20240719_itmpara_fix_inventory_clear.txt
deleted
100644 → 0
View file @
81111a50
2024年7月19日 修复 $itmpara 字段在背包中的清零问题
在2024年7月19日,游戏中的物品添加了新的字段$itmpara,该字段为一数组,可让物品有着数组中定义的键值的属性。
在实现过程中,发现当将具有itmpara字段的武器装备时,其背包里面的itmpara(如itmpara6)并没有被正确剔除,导致背包中的itmpara字段仍然存在,可能会影响后续的物品操作。
以下是对应此问题的修复记录:
1. 修复 `item.weapon.php` 文件中的装备逻辑
- 在装备武器或防具时,确保清零背包中的 `itmpara` 字段
- 修改前:
```php
${$eqp} = $itm;
${$eqp.'k'} = $itmk;
${$eqp.'e'} = $itme;
${$eqp.'s'} = $itms;
${$eqp.'sk'} = $itmsk;
${$eqp.'para'} = $itmpara;
$log .= "装备了<span class=\"yellow\">$itm</span>。<br>";
$itm = $itmk = $itmsk = $itmpara = '';
$itme = $itms = 0;
```
- 修改后:
```php
${$eqp} = $itm;
${$eqp.'k'} = $itmk;
${$eqp.'e'} = $itme;
${$eqp.'s'} = $itms;
${$eqp.'sk'} = $itmsk;
${$eqp.'para'} = $itmpara;
$log .= "装备了<span class=\"yellow\">$itm</span>。<br>";
$itm = $itmk = $itmsk = '';
$itme = $itms = 0;
// 清除背包中的itmpara字段
${'itmpara' . $itmn} = '';
```
2. 修复 `item.weapon.php` 文件中的替换装备逻辑
- 在替换武器或防具时,确保清零背包中的 `itmpara` 字段
- 修改前:
```php
$itm = $itmt;
$itmk = $itmkt;
$itme = $itmet;
$itms = $itmst;
$itmsk = $itmskt;
$itmpara = $itmparat;
$log .= "卸下了<span class=\"red\">$itm</span>,装备了<span class=\"yellow\">{${$eqp}}</span>。<br>";
```
- 修改后:
```php
$itm = $itmt;
$itmk = $itmkt;
$itme = $itmet;
$itms = $itmst;
$itmsk = $itmskt;
$itmpara = $itmparat;
// 清除背包中的itmpara字段
${'itmpara' . $itmn} = '';
$log .= "卸下了<span class=\"red\">$itm</span>,装备了<span class=\"yellow\">{${$eqp}}</span>。<br>";
```
这些修改确保了当武器或防具被装备时,背包中的 `itmpara` 字段会被正确清零,避免背包中的 `itmpara` 字段影响后续的物品操作。
doc/etc/20240719_itmpara_fix_itemoff_issue.txt
deleted
100644 → 0
View file @
81111a50
2024年7月19日 修复装备卸下时 itmpara 数据丢失问题
## 问题描述
在2024年7月19日,游戏中的物品添加了新的字段 $itmpara,该字段为一数组,可让物品有着数组中定义的键值的属性。在实现过程中,发现当卸下有 weppara 属性的武器时,其 itmpara 数据会丢失,导致武器返回背包后失去了特殊属性。
## 问题原因
经过检查,发现问题出在 `itemoff` 函数中。当卸下装备时,`$itmpara0` 变量被正确设置为装备的 `$itmpara` 值,但在 `itemget` 函数调用时,这个值没有被正确地传递到背包中的 `itmpara` 字段,因为 `$itmpara0` 变量没有被声明为全局变量。
## 修复内容
1. 修复 `itemoff` 函数中的全局变量声明
- 修改前:
```php
function itemoff($item){
global $log,$mode,$cmd,$itm0,$itmk0,$itme0,$itms0,$itmsk0,$nosta,$pdata;
```
- 修改后:
```php
function itemoff($item){
global $log,$mode,$cmd,$itm0,$itmk0,$itme0,$itms0,$itmsk0,$itmpara0,$nosta,$pdata;
```
2. 检查其他相关函数
- `item.weapon.php` 文件中的装备替换逻辑已经正确处理了 `itmpara` 字段:
```php
// 将背包中的itmpara字段设置为卸下装备的itmpara值
${'itmpara' . $itmn} = $itmparat;
```
## 测试结果
修复后,当卸下有 weppara 属性的武器时,其 itmpara 数据会被正确地保存到背包中的 itmpara 字段,武器的特殊属性不会丢失。
## 注意事项
1. 在处理 itmpara 字段时,需要确保在所有相关函数中都正确声明全局变量
2. 在装备和卸下装备时,需要正确处理 itmpara 字段的传递
3. 在替换装备时,需要确保卸下装备的 itmpara 值被正确地设置到背包中的 itmpara 字段
doc/etc/20240719_itmpara_fix_itmpara0_clear.txt
deleted
100644 → 0
View file @
81111a50
2024年7月19日 修复 $itmpara0 字段清零问题
在2024年7月19日,游戏中的物品添加了新的字段$itmpara,该字段为一数组,可让物品有着数组中定义的键值的属性。
在实现过程中,发现获得具有itmpara字段的物品时,itmpara0没有被正确清除,导致后续获得的物品可能会继承之前物品的itmpara属性。
以下是对应此问题的修复记录:
1. 修复 `itemget` 函数中的物品合并逻辑
- 在物品合并后,确保清零 `itmpara0` 字段
- 修改前:
```php
$itm0 = $itmk0 = $itmsk0 = '';
$itme0 = $itms0 = 0;
$itmpara0 = '';
$mode = 'command';
return;
```
- 修改后:
```php
$itm0 = $itmk0 = $itmsk0 = $itmpara0 = '';
$itme0 = $itms0 = 0;
$mode = 'command';
return;
```
2. 修复 `itemadd` 函数中的物品添加逻辑
- 在物品添加到背包后,确保清零 `itmpara0` 字段
- 修改前:
```php
${'itm'.$i} = $itm0;
${'itmk'.$i} = $itmk0;
${'itme'.$i} = $itme0;
${'itms'.$i} = $itms0;
${'itmsk'.$i} = $itmsk0;
${'itmpara'.$i} = $itmpara0;
$itm0 = $itmk0 = $itmsk = $itmpara = '';
$itme0 = $itms0 = 0;
```
- 修改后:
```php
${'itm'.$i} = $itm0;
${'itmk'.$i} = $itmk0;
${'itme'.$i} = $itme0;
${'itms'.$i} = $itms0;
${'itmsk'.$i} = $itmsk0;
${'itmpara'.$i} = $itmpara0;
$itm0 = $itmk0 = $itmsk0 = $itmpara0 = '';
$itme0 = $itms0 = 0;
```
这些修改确保了当获得物品时,`itmpara0` 字段会被正确清零,避免后续获得的物品继承之前物品的 `itmpara` 属性。
doc/etc/20240719_itmpara_fix_weppara_clear.txt
deleted
100644 → 0
View file @
81111a50
2024年7月19日 修复 $itmpara 字段清零问题
在2024年7月19日,游戏中的物品添加了新的字段$itmpara,该字段为一数组,可让物品有着数组中定义的键值的属性。
在实现过程中,发现当卸下有weppara属性的武器时,其itmpara数据(也即该weppara)并没有被更新·清零,导致如果有没有itmpara数据的武器被换上,该武器也会具有之前的weppara属性。
以下是对应此问题的修复记录:
1. 修复 `weapon_loss` 函数
- 在武器损坏时,确保清零 `weppara` 字段
- 修改前:`$pa['wep'] = '拳头'; $pa['wep_kind'] = 'N'; $pa['wepk'] = 'WN'; $pa['wepe'] = 0; $pa['weps'] = $nosta; $pa['wepsk'] = '';`
- 修改后:`$pa['wep'] = '拳头'; $pa['wep_kind'] = 'N'; $pa['wepk'] = 'WN'; $pa['wepe'] = 0; $pa['weps'] = $nosta; $pa['wepsk'] = ''; $pa['weppara'] = '';`
2. 检查其他相关函数
- `itemoff` 函数:已经正确处理了 `weppara` 字段的清零
- `change_subwep` 函数:已经正确处理了 `weppara` 和 `wep2para` 字段的交换
- `destory_single_equip` 函数:已经正确处理了装备 `para` 字段的清零
- `armor_hurt` 函数:已经正确处理了防具 `para` 字段的清零
这些修改确保了当武器或装备被卸下或损坏时,相应的 `para` 字段会被正确清零,避免新装备的武器或装备继承之前的属性。
doc/etc/20240719_slidingpanel_implementation_final.txt
0 → 100644
View file @
d6456425
# 滑动面板(Sliding Panel)功能最终实装总结
日期:2024年7月19日
## 功能概述
滑动面板是一个位于游戏界面右侧的可滑动面板,用于显示玩家的任务信息和其他游戏数据。该功能的主要目的是提供一个不干扰主游戏界面的方式来查看额外信息,并为未来的任务系统和其他功能提供扩展性。
## 主要功能
1. **界面元素**:
- 屏幕右侧的"副面板"按钮
- 从右侧滑入的面板,宽度为550px
- 面板顶部的标签栏,支持多个标签页
- 面板右上角的关闭按钮
- 面板底部的"更新信息"按钮
2. **标签页**:
- **任务窗体**:显示玩家的任务信息(目前为示例数据)
- **其他信息**:显示玩家的charge1-4值,以进度条形式展示
3. **交互功能**:
- 点击"副面板"按钮打开面板,同时隐藏按钮
- 点击关闭按钮关闭面板,同时显示"副面板"按钮
- 点击面板外区域自动关闭面板
- 点击标签页切换不同的内容
- 点击"更新信息"按钮手动更新数据
4. **数据更新机制**:
- 打开面板时自动获取最新数据
- 点击"更新信息"按钮手动更新数据
- 定期自动更新数据(当面板打开时)
- 更新成功/失败时显示相应的消息提示
## 技术实现
1. **HTML结构**:
- 使用div元素创建面板和各个组件
- 使用button元素创建按钮
- 使用CSS类和ID标识不同的元素
2. **CSS样式**:
- 使用固定定位(position: fixed)将面板和按钮固定在屏幕右侧
- 使用transform和transition实现面板的滑入滑出动画
- 使用flex布局组织面板内的元素
- 使用自定义字体和颜色保持与游戏整体风格一致
3. **JavaScript功能**:
- 使用事件监听器处理按钮点击和面板交互
- 使用AJAX请求获取最新的clbpara数据
- 使用正则表达式从响应中提取数据
- 使用定时器实现定期更新和动画效果
4. **数据处理**:
- 从game.php页面获取最新的clbpara数据
- 解析JSON格式的数据
- 更新进度条和其他显示元素
- 处理可能的错误情况
## 关键文件
1. **templates/default/slidingpanel.htm**:
- 包含滑动面板的HTML结构、CSS样式和JavaScript功能
- 负责面板的显示、交互和数据更新
## 实装过程中的主要挑战与解决方案
1. **样式问题**:
- **挑战**:任务窗体内容过窄,显示不完整
- **解决方案**:增加面板宽度,优化内容区域的样式,添加文本换行和行高设置
2. **交互问题**:
- **挑战**:点击"副面板"文字时面板不会滑出,显示面板时副面板按钮仍然可见
- **解决方案**:为span元素添加事件处理器,在打开面板时隐藏按钮,关闭面板时显示按钮
3. **数据更新问题**:
- **挑战**:无法从服务器获取最新的clbpara数据
- **解决方案**:直接从game.php页面获取数据,使用更精确的正则表达式提取数据,添加错误处理机制
## 未来扩展
滑动面板的设计考虑了未来的扩展性:
1. **标签系统**:
- 支持添加更多标签页,如成就系统、统计信息等
- 标签容器支持水平滚动,可容纳更多标签
2. **内容区域**:
- 使用统一的区块设计,便于添加新的内容
- 支持不同类型的数据展示,如列表、进度条、图表等
3. **数据更新机制**:
- 可用于其他类型的数据,如玩家状态、物品信息等
- 支持实时更新,为未来的实时任务系统做准备
4. **消息提示系统**:
- 可用于显示各种类型的消息,如任务完成、成就解锁等
- 支持不同的消息类型和样式
## 结论
滑动面板功能已成功实装,提供了一个美观、实用的界面元素,用于显示玩家的任务信息和其他游戏数据。该功能的设计考虑了未来的扩展性,为游戏的后续开发提供了良好的基础。通过解决实装过程中遇到的各种挑战,我们不仅实现了预期的功能,还提高了代码的质量和可维护性。
doc/etc/20240719_slidingpanel_redesign.txt
0 → 100644
View file @
d6456425
修改日期:2024年7月19日
修改内容:完全重新设计slidingpanel.htm的外观和功能
需求概述:
1. 一般状态时,在屏幕右侧显示"副面板"按钮,点击后,该面板从屏幕右侧滑入
2. 面板上有着可切换的标签页,目前包括"任务窗体"和"其他信息"
3. 面板的右上方是关闭按钮,点击后面板滑动隐藏至屏幕外,只剩下"副面板"按钮
4. 为未来实装的新标签页预留空间
修改文件:
- templates/default/slidingpanel.htm
主要改进:
1. 整体布局改进:
- 将面板改为全高设计,从屏幕顶部到底部
- 增加面板宽度至450px,提供更宽敞的显示空间
- 添加了专门的面板头部区域,包含标签和关闭按钮
- 添加了滚动条样式,使长内容可以平滑滚动
2. 标签系统改进:
- 标签按钮放置在面板顶部,水平排列
- 添加了标签容器的水平滚动功能,支持更多标签
- 预留了标签空间,为未来添加更多标签做准备
- 优化了标签切换的视觉反馈
3. 内容区域改进:
- 统一了内容区块的样式,使用section-container包装
- 每个区块都有标题栏和内容区
- 为列表项添加了项目符号和缩进,提高可读性
- 优化了进度条的视觉效果,添加了内阴影
4. 交互体验改进:
- 添加了专门的关闭按钮,位于面板右上角
- 点击面板外区域可以自动关闭面板
- 优化了按钮的悬停效果
- 添加了滚动条样式,使其与整体设计协调
5. 代码结构改进:
- 重构了JavaScript代码,使其更加模块化
- 添加了initPanel函数,集中处理面板初始化逻辑
- 添加了isPanelOpen函数,简化状态检查
- 优化了事件处理,减少不必要的事件监听
6. 样式优化:
- 使用更现代的CSS布局技术,如flex布局
- 添加了更多的过渡效果,使界面变化更加平滑
- 统一了颜色方案,保持与游戏整体风格一致
- 优化了移动设备上的显示效果
这次重新设计使得滑动面板更加美观、功能更加清晰,并为未来的扩展做好了准备。新的设计更加符合现代UI设计标准,同时保持了游戏原有的视觉风格。
doc/etc/20240719_slidingpanel_summary.txt
0 → 100644
View file @
d6456425
# 滑动面板(Sliding Panel)功能实装与除错总结
日期:2024年7月19日
## 功能概述
滑动面板是一个位于游戏界面右侧的可滑动面板,包含以下功能:
1. 在屏幕右侧显示"副面板"按钮,点击后面板从右侧滑入
2. 面板包含可切换的标签页,目前有"任务窗体"和"其他信息"两个标签
3. 面板右上角有关闭按钮,点击后面板滑出并隐藏
4. 面板中显示玩家的charge1-4值,以进度条形式展示
5. 面板底部有"更新信息"按钮,可手动更新面板中的数据
## 实装过程
### 1. 初始实装
- 创建了基本的滑动面板结构,包括副面板按钮、面板容器和标签页
- 实现了面板的滑入滑出动画效果
- 添加了标签页切换功能
- 添加了charge1-4进度条显示
### 2. 界面优化
- 重新设计了面板的整体布局,使其更加美观
- 增加了面板宽度,提供更宽敞的显示空间
- 优化了标签系统,支持更多标签的扩展
- 改进了内容区域的样式,使用统一的区块设计
- 优化了进度条的视觉效果
### 3. 交互优化
- 修复了点击"副面板"文字时面板不会滑出的问题
- 实现了显示面板时隐藏副面板按钮,关闭面板时显示按钮的功能
- 添加了点击面板外区域自动关闭面板的功能
- 添加了"更新信息"按钮,可手动更新面板中的数据
### 4. 数据更新机制
- 实现了从服务器获取最新clbpara数据的功能
- 添加了定期自动更新数据的功能
- 添加了手动更新数据的功能
- 添加了更新成功/失败的消息提示
## 除错过程
### 1. 样式问题修复
- 修复了任务窗体内容过窄的问题
- 统一了任务窗体和其他信息窗体的样式
- 优化了列表项的样式,添加了文本换行和行高设置
### 2. 交互问题修复
- 修复了点击"副面板"文字时面板不会滑出的问题
- 修复了显示面板时副面板按钮仍然可见的问题
### 3. 数据更新问题修复
- 最初尝试使用额外的PHP文件(get_clbpara.php)获取数据,但遇到了会话识别问题
- 修改为直接从game.php页面获取数据,解决了会话识别问题
- 修复了"Could not find clbpara_data in response"错误,使用更精确的正则表达式提取数据
- 添加了错误处理机制,在更新失败时提供友好的用户反馈
## 最终实现
1. **界面结构**:
- 屏幕右侧的"副面板"按钮
- 从右侧滑入的面板,包含标签页和关闭按钮
- 标签页包含"任务窗体"和"其他信息"两个标签
- 面板底部的"更新信息"按钮
2. **数据显示**:
- 任务窗体显示任务列表(目前为示例数据)
- 其他信息窗体显示charge1-4的进度条
- 进度条根据不同的charge值类型使用不同的颜色和显示方式
3. **交互功能**:
- 点击"副面板"按钮打开面板
- 点击关闭按钮或面板外区域关闭面板
- 点击标签页切换不同的内容
- 点击"更新信息"按钮更新数据
4. **数据更新机制**:
- 打开面板时自动获取最新数据
- 点击"更新信息"按钮手动更新数据
- 定期自动更新数据(当面板打开时)
- 更新成功/失败时显示相应的消息提示
## 未来扩展
滑动面板的设计考虑了未来的扩展性:
1. 标签系统支持添加更多标签页
2. 内容区域使用统一的区块设计,便于添加新的内容
3. 数据更新机制可用于其他类型的数据
4. 消息提示系统可用于显示各种类型的消息
这些设计为未来实装实时更新的任务记录等功能提供了良好的基础。
doc/etc/20240719_slidingpanel_update_button.txt
0 → 100644
View file @
d6456425
修改日期:2024年7月19日
问题描述:
滑动面板中的charge值不会随着玩家的行动进行实时更新,必须重新刷新整个game.php才能看到最新值。需要一种简单的方式让用户手动更新面板中的信息。
修改内容:
1. 在滑动面板底部添加了"更新信息"按钮,用于手动更新面板中的信息
2. 添加了manualUpdate函数,用于处理按钮点击事件
3. 添加了showUpdateMessage函数,用于显示更新成功的消息
4. 添加了相关的CSS样式,确保按钮与面板整体风格一致
修改文件:
- templates/default/slidingpanel.htm
修改细节:
1. 添加更新按钮HTML:
```html
<!-- 更新按钮 -->
<div class="update-button-container">
<button id="update-button" class="update-button" onclick="manualUpdate()">更新信息</button>
</div>
```
2. 添加按钮样式:
```css
/* 更新按钮样式 */
.update-button-container {
text-align: center;
padding: 15px 0;
margin-top: 10px;
border-top: 1px solid rgba(225, 124, 226, 0.2);
}
.update-button {
background-color: rgba(225, 124, 226, 0.8);
color: #fff;
border: none;
border-radius: 5px;
padding: 8px 20px;
font: bold 11pt "FusionPixel10px";
cursor: pointer;
transition: all 0.3s;
box-shadow: 0 2px 5px rgba(0, 0, 0, 0.3);
}
.update-button:hover {
background-color: rgba(225, 124, 226, 1);
box-shadow: 0 3px 7px rgba(0, 0, 0, 0.5);
transform: translateY(-2px);
}
.update-button:active {
transform: translateY(1px);
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.3);
}
```
3. 添加manualUpdate函数:
```javascript
// 手动更新函数
function manualUpdate() {
// 显示加载效果
const updateButton = document.getElementById('update-button');
if (updateButton) {
updateButton.textContent = '正在更新...';
updateButton.disabled = true;
}
// 从服务器获取最新数据
fetchLatestClbpara();
// 更新显示
setTimeout(function() {
updateChargeProgressBars();
// 恢复按钮状态
if (updateButton) {
updateButton.textContent = '更新信息';
updateButton.disabled = false;
}
// 显示更新成功消息
showUpdateMessage('信息已更新');
}, 500);
}
```
4. 添加showUpdateMessage函数,用于显示更新成功的消息:
```javascript
// 显示更新消息
function showUpdateMessage(message) {
// 创建消息元素
const messageElement = document.createElement('div');
messageElement.className = 'update-message';
messageElement.textContent = message;
// 添加到面板
const panel = document.getElementById('sliding-panel');
if (panel) {
panel.appendChild(messageElement);
// 添加样式
messageElement.style.position = 'absolute';
messageElement.style.bottom = '20px';
messageElement.style.left = '50%';
messageElement.style.transform = 'translateX(-50%)';
messageElement.style.backgroundColor = 'rgba(0, 200, 0, 0.8)';
messageElement.style.color = 'white';
messageElement.style.padding = '8px 15px';
messageElement.style.borderRadius = '5px';
messageElement.style.fontWeight = 'bold';
messageElement.style.zIndex = '1002';
messageElement.style.boxShadow = '0 2px 5px rgba(0, 0, 0, 0.3)';
messageElement.style.opacity = '0';
messageElement.style.transition = 'opacity 0.3s';
// 显示消息
setTimeout(function() {
messageElement.style.opacity = '1';
}, 10);
// 延时后移除
setTimeout(function() {
messageElement.style.opacity = '0';
setTimeout(function() {
if (panel.contains(messageElement)) {
panel.removeChild(messageElement);
}
}, 300);
}, 2000);
}
}
```
这些修改提供了一种简单的方式让用户手动更新面板中的信息,而不必刷新整个页面。当用户点击"更新信息"按钮时,系统会从服务器获取最新的clbpara数据,并更新面板中的显示。同时,系统会显示一个简短的成功消息,提供良好的用户反馈。
doc/etc/20240719_slidingpanel_update_fix.txt
0 → 100644
View file @
d6456425
修改日期:2024年7月19日
问题描述:
在点击"更新信息"按钮后,控制台显示错误信息:"Could not find clbpara_data in response",表明无法从响应中找到clbpara_data变量。
修改内容:
1. 修改了fetchLatestClbpara函数,使用更可靠的方法获取最新的clbpara数据
2. 重写了manualUpdate函数,直接在函数内部处理AJAX请求,而不是调用fetchLatestClbpara函数
3. 添加了handleUpdateError函数,用于处理更新失败的情况
4. 修改了showUpdateMessage函数,使其能够显示不同类型的消息(成功/错误)
修改文件:
- templates/default/slidingpanel.htm
修改细节:
1. 修改fetchLatestClbpara函数,使用更可靠的方法获取最新数据:
```javascript
// 从服务器获取最新的clbpara数据
function fetchLatestClbpara() {
// 创建XHR对象
const xhr = new XMLHttpRequest();
// 请求当前页面,以获取最新的clbpara数据
// 添加时间戳防止缓存
xhr.open('GET', 'game.php?t=' + new Date().getTime(), true);
// 处理响应
xhr.onload = function() {
if (xhr.status === 200) {
// 尝试从响应中提取clbpara_data
const responseText = xhr.responseText;
// 使用更精确的正则表达式
const scriptRegex = /var clbpara_data = ([\\s\\S]*?);/;
const match = responseText.match(scriptRegex);
if (match && match[1]) {
try {
// 尝试解析JSON
const newClbpara = JSON.parse(match[1]);
clbpara = newClbpara;
console.log('clbpara updated from page:', clbpara);
} catch (e) {
console.error('Failed to parse clbpara data:', e);
}
} else {
console.error('Could not find clbpara_data in response');
// 如果无法找到数据,尝试刷新整个页面
console.log('Attempting to refresh the page...');
setTimeout(function() {
window.location.reload();
}, 1000);
}
} else {
console.error('Failed to fetch page data:', xhr.statusText);
}
};
// 处理错误
xhr.onerror = function() {
console.error('Network error when fetching page data');
};
// 发送请求
xhr.send();
}
```
2. 重写manualUpdate函数,直接在函数内部处理AJAX请求:
```javascript
// 手动更新函数
function manualUpdate() {
// 显示加载效果
const updateButton = document.getElementById('update-button');
if (updateButton) {
updateButton.textContent = '正在更新...';
updateButton.disabled = true;
}
// 创建XHR对象
const xhr = new XMLHttpRequest();
// 请求当前页面,以获取最新的clbpara数据
// 添加时间戳防止缓存
xhr.open('GET', 'game.php?t=' + new Date().getTime(), true);
// 处理响应
xhr.onload = function() {
if (xhr.status === 200) {
// 尝试从响应中提取clbpara_data
const responseText = xhr.responseText;
// 使用更精确的正则表达式
const scriptRegex = /var clbpara_data = ([\\s\\S]*?);/;
const match = responseText.match(scriptRegex);
if (match && match[1]) {
try {
// 尝试解析JSON
const newClbpara = JSON.parse(match[1]);
clbpara = newClbpara;
console.log('clbpara updated from page:', clbpara);
// 更新显示
updateChargeProgressBars();
// 恢复按钮状态
if (updateButton) {
updateButton.textContent = '更新信息';
updateButton.disabled = false;
}
// 显示更新成功消息
showUpdateMessage('信息已更新');
} catch (e) {
console.error('Failed to parse clbpara data:', e);
handleUpdateError(updateButton);
}
} else {
console.error('Could not find clbpara_data in response');
handleUpdateError(updateButton);
}
} else {
console.error('Failed to fetch page data:', xhr.statusText);
handleUpdateError(updateButton);
}
};
// 处理错误
xhr.onerror = function() {
console.error('Network error when fetching page data');
handleUpdateError(updateButton);
};
// 发送请求
xhr.send();
}
```
3. 添加handleUpdateError函数,用于处理更新失败的情况:
```javascript
// 处理更新错误
function handleUpdateError(updateButton) {
// 恢复按钮状态
if (updateButton) {
updateButton.textContent = '更新信息';
updateButton.disabled = false;
}
// 显示错误消息
showUpdateMessage('更新失败,请刷新页面', 'error');
// 使用当前数据更新显示
updateChargeProgressBars();
}
```
4. 修改showUpdateMessage函数,使其能够显示不同类型的消息:
```javascript
// 显示更新消息
function showUpdateMessage(message, type = 'success') {
// 创建消息元素
const messageElement = document.createElement('div');
messageElement.className = 'update-message';
messageElement.textContent = message;
// 添加到面板
const panel = document.getElementById('sliding-panel');
if (panel) {
panel.appendChild(messageElement);
// 添加样式
messageElement.style.position = 'absolute';
messageElement.style.bottom = '20px';
messageElement.style.left = '50%';
messageElement.style.transform = 'translateX(-50%)';
// 根据消息类型设置颜色
if (type === 'error') {
messageElement.style.backgroundColor = 'rgba(200, 0, 0, 0.8)';
} else {
messageElement.style.backgroundColor = 'rgba(0, 200, 0, 0.8)';
}
// 其他样式...
}
}
```
这些修改解决了"Could not find clbpara_data in response"错误,使"更新信息"按钮能够正常工作。现在,当用户点击按钮时,系统会尝试从当前页面获取最新的clbpara数据,并更新面板中的显示。如果无法获取数据,系统会显示错误消息,提示用户刷新页面。
doc/etc/20250408-201259-item-refactor.txt
deleted
100644 → 0
View file @
81111a50
# item.func.php 重构记录
## 重构目标
将 item.func.php 根据物品类型进行拆分,使代码更加模块化和易于维护。
## 重构方法
1. 创建一个新的主文件 `item.main.php`,它包含主要的 `itemuse()` 函数,该函数根据物品类型将处理委托给特定的处理程序。
2. 根据物品类型创建多个专门的处理程序文件。
3. 保留原始的 `item.func.php` 文件,但将其简化为仅包含对新主文件的引用,以保持向后兼容性。
## 创建的文件
1. `item.main.php` - 主要的物品使用函数和分发逻辑
2. `item.weapon.php` - 武器和装备处理 (W, D, A, ss)
3. `item.recovery.php` - 恢复物品处理 (HS, HH, HM, HT, HR, HB)
4. `item.poison.php` - 毒药处理 (P)
5. `item.trap.php` - 陷阱处理 (T)
6. `item.ammo.php` - 弹药处理 (GB, GA)
7. `item.radar.php` - 雷达和电池处理 (R, ER, B)
8. `item.cure.php` - 治疗药剂处理 (C)
9. `item.skillbook.php` - 技能书处理 (V)
10. `item.enhance.php` - 强化物品处理 (M)
11. `item.weather.php` - 天气控制物品处理 (EW)
12. `item.electronic.php` - 电子设备处理 (EE)
13. `item.giftbox.php` - 礼品盒处理 (p, ygo, fy, f99)
14. `item.dice.php` - 骰子物品处理 (🎲)
15. `item.other.php` - 其他物品处理 (🎆 等)
## 物品类型分类
- 武器和装备 (W, D, A, ss) - 60-159行
- 恢复物品 (HS, HH, HM, HT, HR, HB) - 160-268行
- 毒药 (P) - 333-396行
- 陷阱 (T) - 396-432行
- 弹药 (GB, GA) - 432-518行
- 雷达 (R, ER) - 519-532行, 914-942行
- 治疗药剂 (C) - 533-633行
- 技能书 (V) - 634-796行
- 强化物品 (M) - 797-905行
- 天气控制 (EW) - 905-914行
- 电子设备 (EE) - 914-917行
- 礼品盒 (p, ygo, fy) - 969-1118行
- 骰子 (🎲) - 1139-1530行
- 烟花 (🎆) - 1530行之后
## 后续工作
1. 将原始 `item.func.php` 中的骰子逻辑(第1139-1530行)移植到 `item.dice.php` 中
2. 将原始 `item.func.php` 中的烟花逻辑移植到 `item.other.php` 中
3. 测试所有物品类型的功能
4. 在确认所有功能正常后,将 `item.func.php.new` 重命名为 `item.func.php`
## 注意事项
- 所有新文件都保持了与原始代码相同的逻辑和功能
- 代码被组织成更小、更专注的模块,使维护和理解更容易
- 保留了向后兼容性,现有代码不需要修改即可使用新的结构
doc/etc/20250412-190000-fishing-rest-fix.txt
deleted
100644 → 0
View file @
81111a50
# 修复休息状态下钓鱼功能问题
## 问题描述
在休息/静养/治疗状态下,点击钓鱼按钮后,会直接退出休息状态,获得的提示也和退出休息状态的提示相同,中途没有任何报错信息。这与预期的处理(休息/静养/治疗的场合点击钓鱼按钮进入钓鱼状态并适用钓鱼逻辑)不同。
## 问题分析
通过检查代码,发现问题出在两个地方:
1. 在 `command.php` 中,休息状态下没有对钓鱼命令进行特殊处理,导致直接调用 `rest()` 函数处理所有命令
2. 在 `state.func.php` 的 `rest()` 函数中,对于非 'rest' 命令,会直接退出休息状态并返回到命令模式
## 解决方案
1. 修改 `command.php` 文件,在处理休息状态的部分添加对钓鱼命令的特殊处理:
```php
} elseif($mode == 'rest') {
include_once GAME_ROOT.'./include/state.func.php';
// 如果在休息状态下点击钓鱼按钮,则进入钓鱼状态
if($command == 'fishing') {
include_once GAME_ROOT.'./include/game/fishing.func.php';
start_fishing($pdata);
// 如果成功进入钓鱼状态,保持原有的休息状态
if($mode == 'fishing') {
// 不需要调用rest函数,因为钓鱼状态下会自动应用休息效果
}
} else {
rest($command);
}
}
```
2. 修改 `state.func.php` 文件中的 `rest()` 函数,使其在处理 'fishing' 命令时不会退出休息状态:
```php
// 如果命令不是 rest 或 fishing,则退出休息状态
if ($command != 'rest' && $command != 'fishing') {
$state = 0;
$endtime = $now;
$mode = 'command';
}
```
## 预期效果
这些修改后,玩家在休息/静养/治疗状态下点击钓鱼按钮,将会正确进入钓鱼状态,同时保持原有的休息状态效果。这样玩家可以一边钓鱼一边享受休息/静养/治疗的效果,符合游戏设计的预期。
## 注意事项
1. 钓鱼状态下已经包含了对休息效果的应用,所以不需要重复调用 `rest()` 函数
2. 这个修复不会影响其他游戏功能,只是修正了休息状态下钓鱼功能的行为
doc/etc/20250417_213905_tl_2ndchance_fix.txt
deleted
100644 → 0
View file @
81111a50
# 奇机技能修复
## 问题描述
技能"奇机"(tl_2ndchance)在玩家生命值为1的时候也会发动,这与技能的设计初衷不符。该技能应该只在玩家生命值大于1且即将受到致命伤害时才发动,将伤害减少到只剩1点生命值。
## 问题原因
在 `include/game/revattr.func.php` 文件的 `get_final_dmg_fix` 函数中,"奇机"技能的判定条件不完整。原来的代码只检查了两个条件:
1. 玩家拥有"奇机"技能
2. 即将受到的伤害大于当前生命值
但是缺少了第三个条件:当前生命值必须大于1。这导致即使玩家生命值已经是1,技能仍然会触发,这是不必要的,因为此时应该由"起迹"技能来处理。
## 修复内容
在 `include/game/revattr.func.php` 文件的 `get_final_dmg_fix` 函数中,修改了"奇机"技能的判定条件,添加了对当前生命值的检查:
```php
# 「奇机」效果判定:
if(isset($pd['skill_tl_2ndchance']) && $fin_dmg > $pd['hp'] && $pd['hp'] > 1)
{
$fin_dmg = $pd['hp'] - 1;
$log .= "<span class='yellow'>「奇机」使{$pd['nm']}在危险时刻保留了1点生命值!</span><br>";
return $fin_dmg;
}
```
添加了 `$pd['hp'] > 1` 条件,确保只有当玩家当前生命值大于1时,"奇机"技能才会触发。
## 修复效果
1. 现在"奇机"技能只会在玩家生命值大于1且即将受到致命伤害时触发
2. 当玩家生命值已经是1时,"奇机"技能不会触发,而是由"起迹"技能来处理(如果玩家拥有该技能)
3. 这样两个技能可以更好地配合工作,不会出现功能重叠的情况
## 技能组合效果
修复后,"奇机"和"起迹"技能的组合效果更加明确:
1. 当玩家受到致命伤害时,"奇机"会使玩家剩下1点生命值
2. 然后,如果玩家再次受到攻击,"起迹"会使这次伤害变为0,保护玩家
3. 玩家可以利用这个机会使用补给或治疗物品恢复生命值
4. 恢复生命值后,"起迹"的flag会被清除,可以再次使用
这种组合为玩家提供了强大的生存能力,特别是在危险的战斗中。
doc/etc/20250417_224500_item_consumption_fix.txt
deleted
100644 → 0
View file @
81111a50
# 物品消耗问题修复
## 问题描述
在使用 "☢核子核心☢" 物品和技能书物品("现实逃避论~风中残烛之卷"、"现实逃避论~一转攻势之卷"、"现实逃避论~全卷")后,这些物品没有从玩家物品栏中消失,导致玩家可以无限使用同一个物品。
## 问题原因
在 `item.nouveau_booster1.php` 文件中,物品消耗的代码使用了局部变量 `$itm`、`$itmk`、`$itmsk`、`$itme` 和 `$itms`,而不是直接修改玩家物品栏中的对应变量 `${'itm'.$itmn}`、`${'itmk'.$itmn}`、`${'itmsk'.$itmn}`、`${'itme'.$itmn}` 和 `${'itms'.$itmn}`。
这导致虽然局部变量被清空了,但玩家物品栏中的物品并没有被移除。
## 修复内容
修改了 `item.nouveau_booster1.php` 文件中的物品消耗代码,将局部变量替换为直接修改玩家物品栏的变量:
1. 对于 "☢核子核心☢" 物品:
```php
// 消耗物品
${'itm'.$itmn} = '';
${'itmk'.$itmn} = '';
${'itmsk'.$itmn} = '';
${'itme'.$itmn} = 0;
${'itms'.$itmn} = 0;
${'itmpara'.$itmn} = '';
```
2. 对于三本技能书物品,也进行了相同的修改。
## 修复效果
1. 现在使用 "☢核子核心☢" 物品后,该物品会正确地从玩家物品栏中消失
2. 使用技能书物品后,技能书也会正确地从玩家物品栏中消失
3. 玩家不能再无限使用同一个物品
## 注意事项
1. 在 PHP 中,使用 `extract($data, EXTR_REFS)` 后,局部变量 `$itm`、`$itmk` 等并不会自动映射回 `$data` 数组中的对应元素
2. 当需要修改玩家物品栏中的物品时,应该使用 `${'itm'.$itmn}` 这样的变量引用方式
3. 这个问题可能存在于其他物品处理代码中,建议检查其他物品处理函数是否有类似问题
doc/etc/20250417_225126_fireseed4_poison_fix.txt
deleted
100644 → 0
View file @
81111a50
# 种火IV毒物伤害免疫修复
## 问题描述
在食用有毒的物品时,哪怕未持有fireseed4技能,也会显示种火IV被触发,并受到0点伤害。
## 问题原因
问题出在 `include/game/item.poison.php` 文件中对种火IV技能的检查方式。原代码使用了 `check_skill_unlock('fireseed4', $data)` 函数来检查玩家是否拥有种火IV技能,但这个函数的返回值与预期不符。
`check_skill_unlock` 函数在玩家没有技能时返回字符串 "noskill",而不是布尔值 false。在PHP中,非空字符串在布尔上下文中会被视为 true,这导致条件判断始终为真,即使玩家没有种火IV技能。
## 修复内容
修改了 `include/game/item.poison.php` 文件中的技能检查方式,不再使用 `check_skill_unlock` 函数,而是直接检查玩家的 `clbpara['skill']` 数组中是否包含 'fireseed4':
```php
# 「种火IV」效果判定:
if(!empty($data['clbpara']['skill']) && in_array('fireseed4', $data['clbpara']['skill'])) {
$log .= "<span class='yellow'>「种火IV」使{$name}受到的所有伤害变为0!</span><br>";
$damage = 0;
}
```
## 修复前代码
```php
# 「种火IV」效果判定:
if(check_skill_unlock('fireseed4', $data)) {
$log .= "<span class='yellow'>「种火IV」使{$name}受到的所有伤害变为0!</span><br>";
$damage = 0;
}
```
## 修复效果
1. 现在只有当玩家真正拥有种火IV技能时,才会触发伤害免疫效果
2. 没有种火IV技能的玩家在食用有毒物品时会正常受到伤害
3. 不会再显示错误的种火IV触发消息
## 注意事项
1. `check_skill_unlock` 函数的返回值需要特别注意,它返回0表示技能已解锁,返回其他值(如字符串)表示技能未解锁
2. 在进行技能检查时,直接检查 `clbpara['skill']` 数组是更可靠的方法
3. 这个问题可能存在于其他使用 `check_skill_unlock` 函数的地方,建议检查其他相关代码
doc/etc/20250417_225450_fireseed4_skill_check_fix.txt
deleted
100644 → 0
View file @
81111a50
# 种火IV技能检查修复
## 问题描述
在游戏中,种火IV技能的检查存在问题,导致即使玩家没有该技能,也会触发种火IV的效果。具体表现为:
1. 在食用有毒物品时,即使没有种火IV技能,也会显示种火IV被触发,并受到0点伤害
2. 在陷阱伤害计算中,使用了正确的检查方式,但代码结构可能导致其他问题
## 问题原因
问题出在使用 `check_skill_unlock` 函数来检查玩家是否拥有种火IV技能。这个函数在玩家没有技能时返回字符串 "noskill",而不是布尔值 false。在PHP中,非空字符串在布尔上下文中会被视为 true,这导致条件判断始终为真。
## 修复内容
1. 在 `include/game/item.poison.php` 文件中修改了种火IV技能的检查方式:
```php
# 「种火IV」效果判定:
if(!empty($data['clbpara']['skill']) && in_array('fireseed4', $data['clbpara']['skill'])) {
$log .= "<span class='yellow'>「种火IV」使{$name}受到的所有伤害变为0!</span><br>";
$damage = 0;
}
```
2. 在 `include/game/itemmain.func.php` 文件中,陷阱伤害计算部分已经使用了正确的检查方式,但为了保持一致性,确认了代码结构:
```php
# 「种火IV」效果判定:
if(!empty($data['clbpara']['skill']) && in_array('fireseed4', $data['clbpara']['skill']))
{
$log .= "<span class='yellow'>「种火IV」使{$name}受到的所有伤害变为0!</span><br>";
$damage = 0;
}
else
{
# 计算陷阱伤害
$damage = calc_trap_damage($data,NULL,$playerflag,$selflag);
# 检查陷阱是否被迎击
$damage = check_trap_def_event($data,$damage,$playerflag,$selflag);
}
```
## 修复效果
1. 现在只有当玩家真正拥有种火IV技能时,才会触发伤害免疫效果
2. 没有种火IV技能的玩家在食用有毒物品时会正常受到伤害
3. 没有种火IV技能的玩家在触发陷阱时会正常受到伤害
4. 不会再显示错误的种火IV触发消息
## 注意事项
1. 在进行技能检查时,直接检查 `clbpara['skill']` 数组是更可靠的方法
2. 使用 `check_skill_unlock` 函数时需要特别注意其返回值,它返回0表示技能已解锁,返回其他值(如字符串)表示技能未解锁
3. 在条件判断中,应该使用 `check_skill_unlock('skill_name', $data) === 0` 这样的严格比较,而不是简单的 `if(check_skill_unlock('skill_name', $data))`
4. 对于其他可能使用 `check_skill_unlock` 函数的地方,建议检查并修改为直接检查技能数组的方式,或使用严格比较
doc/etc/20250421_120724_npc_skills_fix.txt
deleted
100644 → 0
View file @
81111a50
# NPC技能修复:来潮(npc_mecstasy)和勇谍(npc_perfectspy)的协同问题
## 问题描述
当NPC同时拥有"来潮"(npc_mecstasy)和"勇谍"(npc_perfectspy)技能,且"来潮"处于激活状态时,"来潮"技能会在"勇谍"技能之前适用。这导致只要使用攻击力超过NPC血量的武器成功击中NPC,"勇谍"技能便不会发动,无法让NPC保留200点HP。
## 问题原因
在当前的实现中,"来潮"技能在 `get_fix_damage` 函数中处理,而"勇谍"技能在 `get_final_dmg_fix` 函数中处理。根据战斗流程,`get_fix_damage` 函数会先于 `get_final_dmg_fix` 函数执行,这导致"来潮"技能的真实伤害会直接返回,跳过后续的伤害处理流程,包括"勇谍"技能的HP保护效果。
## 修复内容
在 `include/game/revattr.func.php` 文件的 `get_fix_damage` 函数中,修改了"来潮"技能的处理逻辑,添加了对"勇谍"技能的检查:
```php
# 「来潮」效果判定:
if((!empty($pa['clbpara']['skill']) && in_array('npc_mecstasy', $pa['clbpara']['skill']) && !empty($pa['clbpara']['skillpara']['npc_mecstasy']['active'])) ||
(!empty($pd['clbpara']['skill']) && in_array('npc_mecstasy', $pd['clbpara']['skill']) && !empty($pd['clbpara']['skillpara']['npc_mecstasy']['active'])))
{
# 检查是否对种火玩家无效
if((!empty($pd['clbpara']['skill']) && (in_array('fireseed3', $pd['clbpara']['skill']) || in_array('fireseed4', $pd['clbpara']['skill']))) || $pd['def'] > 10000)
{
$log .= "<span class='red'>{$pa['nm']}展开了Ecstasy Mode结界!但{$pd['nm']}早已不受这种东西的影响了!</span><br>";
return 0;
}
# 检查防守方是否有「勇谍」技能且HP大于200
if(!empty($pd['clbpara']['skill']) && in_array('npc_perfectspy', $pd['clbpara']['skill']) && $pd['hp'] > 200 && $pd['hp'] - $pa['wepe'] < 200)
{
# 先记录「来潮」效果的文案
$log .= "<span class='red'>「{$pa['nm']}展开了Ecstasy Mode结界!武器直接造成了等同于其效果值的真实伤害!</span><br>";
# 然后计算「勇谍」效果保护后的伤害
$damage = $pd['hp'] - 200;
$log .= "<span class='yellow'>「勇谍」技能发动!{$pd['nm']}的生命值不会低于200!</span><br>";
return $damage;
}
$damage = $pa['wepe'];
$log .= "<span class='red'>「{$pa['nm']}展开了Ecstasy Mode结界!武器直接造成了等同于其效果值的真实伤害!</span><br>";
return $damage;
}
```
## 修复效果
通过这个修改,当NPC同时拥有"来潮"和"勇谍"技能时,系统会先检查"来潮"技能是否对当前玩家有效,然后检查NPC是否拥有"勇谍"技能且当前HP大于200,且受到的伤害会导致HP低于200。如果满足这些条件,则会先显示"来潮"技能的效果文案,然后计算"勇谍"技能保护后的伤害,确保NPC的HP不会低于200。
这样,即使玩家使用攻击力超过NPC血量的武器成功击中NPC,"勇谍"技能也能正常发动,保护NPC的生命值不低于200点。
include/game/revevent.func.php
0 → 100644
View file @
d6456425
<?php
if
(
!
defined
(
'IN_GAME'
))
{
exit
(
'Access Denied'
);
}
/**
* 更新玩家的charge值
*
* 该函数在玩家移动与探索时调用,更新玩家$clbpara中的四个charge键值
*
* @param array &$data 玩家数据
* @return void
*/
function
update_charge_values
(
&
$data
)
{
if
(
!
isset
(
$data
))
{
global
$pdata
;
$data
=
&
$pdata
;
}
extract
(
$data
,
EXTR_REFS
);
// 确保clbpara是数组
$clbpara
=
get_clbpara
(
$clbpara
);
// 更新charge1:最高到101,提升速度按照randver1而定,最高4点每次
if
(
!
isset
(
$clbpara
[
'charge1'
]))
{
$clbpara
[
'charge1'
]
=
0
;
}
if
(
$clbpara
[
'charge1'
]
<
101
)
{
// 计算提升值,基于randver1,最高4点
$increase
=
min
(
4
,
max
(
1
,
ceil
(
$clbpara
[
'randver1'
]
/
32
)));
$clbpara
[
'charge1'
]
=
min
(
101
,
$clbpara
[
'charge1'
]
+
$increase
);
}
// 更新charge2:不设上限,提升速度按照randver2而定,最高100点每次
if
(
!
isset
(
$clbpara
[
'charge2'
]))
{
$clbpara
[
'charge2'
]
=
0
;
}
// 计算提升值,基于randver2,最高100点
$increase
=
min
(
100
,
max
(
1
,
ceil
(
$clbpara
[
'randver2'
]
/
3
)));
$clbpara
[
'charge2'
]
+=
$increase
;
// 更新charge3:最高值128,最低值-128,可提升或削减
if
(
!
isset
(
$clbpara
[
'charge3'
]))
{
$clbpara
[
'charge3'
]
=
0
;
}
// 随机决定是提升还是削减
$direction
=
(
rand
(
0
,
1
)
==
1
)
?
1
:
-
1
;
// 变化量在1-3之间随机
$change
=
rand
(
1
,
3
)
*
$direction
;
$clbpara
[
'charge3'
]
=
max
(
-
128
,
min
(
128
,
$clbpara
[
'charge3'
]
+
$change
));
// 更新charge4:没有上限或下限,可提升或削减
if
(
!
isset
(
$clbpara
[
'charge4'
]))
{
$clbpara
[
'charge4'
]
=
0
;
}
// 随机决定是提升还是削减
$direction
=
(
rand
(
0
,
1
)
==
1
)
?
1
:
-
1
;
// 变化量在1-10之间随机
$change
=
rand
(
1
,
10
)
*
$direction
;
$clbpara
[
'charge4'
]
+=
$change
;
}
/**
* 获取玩家的charge值
*
* @param array $data 玩家数据
* @param string $charge_key 要获取的charge键名 (charge1, charge2, charge3, charge4)
* @return int 对应的charge值,如果不存在则返回0
*/
function
get_charge_value
(
$data
,
$charge_key
=
''
)
{
if
(
!
isset
(
$data
))
{
global
$pdata
;
$data
=
&
$pdata
;
}
$clbpara
=
get_clbpara
(
$data
[
'clbpara'
]);
// 如果没有指定键名,返回所有charge值
if
(
empty
(
$charge_key
))
{
$result
=
array
();
for
(
$i
=
1
;
$i
<=
4
;
$i
++
)
{
$key
=
'charge'
.
$i
;
$result
[
$key
]
=
isset
(
$clbpara
[
$key
])
?
$clbpara
[
$key
]
:
0
;
}
return
$result
;
}
// 返回指定的charge值
return
isset
(
$clbpara
[
$charge_key
])
?
$clbpara
[
$charge_key
]
:
0
;
}
/**
* 修改玩家的charge值
*
* @param array &$data 玩家数据
* @param string $charge_key 要修改的charge键名 (charge1, charge2, charge3, charge4)
* @param int $value 新的值
* @return bool 是否成功修改
*/
function
set_charge_value
(
&
$data
,
$charge_key
,
$value
)
{
if
(
!
isset
(
$data
))
{
global
$pdata
;
$data
=
&
$pdata
;
}
extract
(
$data
,
EXTR_REFS
);
// 确保clbpara是数组
$clbpara
=
get_clbpara
(
$clbpara
);
// 验证charge_key是否有效
if
(
!
in_array
(
$charge_key
,
array
(
'charge1'
,
'charge2'
,
'charge3'
,
'charge4'
)))
{
return
false
;
}
// 根据不同的charge_key应用不同的限制
switch
(
$charge_key
)
{
case
'charge1'
:
// charge1最高到101
$clbpara
[
$charge_key
]
=
min
(
101
,
$value
);
break
;
case
'charge3'
:
// charge3范围是-128到128
$clbpara
[
$charge_key
]
=
max
(
-
128
,
min
(
128
,
$value
));
break
;
default
:
// charge2和charge4没有限制
$clbpara
[
$charge_key
]
=
$value
;
break
;
}
return
true
;
}
/**
* 在玩家移动或探索时调用此函数来更新charge值
*
* 此函数应该在search.func.php的move和search函数中调用
*
* @param array &$data 玩家数据
* @return void
*/
function
process_charge_events
(
&
$data
)
{
// 更新玩家的charge值
update_charge_values
(
$data
);
}
?>
include/game/search.func.php
View file @
d6456425
...
...
@@ -10,6 +10,7 @@ include_once GAME_ROOT.'./include/game/itemmain.func.php';
include_once
GAME_ROOT
.
'./include/game/revbattle.func.php'
;
include_once
GAME_ROOT
.
'./include/game/revbattle.calc.php'
;
include_once
GAME_ROOT
.
'./include/game/revcombat.func.php'
;
include_once
GAME_ROOT
.
'./include/game/revevent.func.php'
;
function
check_can_move
(
$pls
,
$pgroup
,
$moveto
)
{
...
...
@@ -115,6 +116,9 @@ function move($moveto = 99,&$data=NULL)
move_search_events
(
$data
,
'move'
);
if
(
$hp
<=
0
)
return
;
# 更新charge值
process_charge_events
(
$data
);
$enemyrate
=
\revbattle\calc_meetman_rate
(
$data
);
discover
(
$enemyrate
,
$data
);
return
;
...
...
@@ -160,6 +164,9 @@ function search(&$data=NULL)
move_search_events
(
$data
,
'search'
);
if
(
$hp
<=
0
)
return
;
# 更新charge值
process_charge_events
(
$data
);
$enemyrate
=
\revbattle\calc_meetman_rate
(
$data
);
discover
(
$enemyrate
,
$data
);
return
;
...
...
templates/default/game.htm
View file @
d6456425
...
...
@@ -48,7 +48,7 @@
<div>
<!--{if !isset($plsinfo[$pls]) && isset($hplsinfo[$pgroup])}-->
<span
class=
"yellow"
id=
"pls"
>
$hplsinfo[$pgroup][$pls]
</span>
<!--{else}-->
<!--{else}-->
<span
class=
"yellow"
id=
"pls"
>
$plsinfo[$pls]
</span>
<!--{/if}-->
【
<span
class=
"red"
>
剩余:
<span
id=
"anum"
>
$alivenum
</span>
人
</span>
】
...
...
@@ -72,7 +72,7 @@
<!--{else}-->
{template command}
<!--{/if}-->
</div>
</div>
</form>
</div>
</td>
...
...
@@ -86,4 +86,5 @@
</td>
</tr>
</table>
{template slidingpanel}
{template footer}
templates/default/slidingpanel.htm
View file @
d6456425
This diff is collapsed.
Click to expand it.
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment