Commit 35819b9d authored by Nemo Ma's avatar Nemo Ma

FEAT:Fishing

TODO: cache/fishing.php - the placeholder values needs to be changed.
parent 4d480481
...@@ -8,7 +8,7 @@ require './include/common.inc.php'; ...@@ -8,7 +8,7 @@ require './include/common.inc.php';
require GAME_ROOT.'./include/game.func.php'; require GAME_ROOT.'./include/game.func.php';
//判断是否进入游戏 //判断是否进入游戏
if(!$cuser||!$cpass) { gexit($_ERROR['no_login'],__file__,__line__); } if(!$cuser||!$cpass) { gexit($_ERROR['no_login'],__file__,__line__); }
//$result = $db->query("SELECT * FROM {$tablepre}players WHERE name = '$cuser' AND type = 0"); //$result = $db->query("SELECT * FROM {$tablepre}players WHERE name = '$cuser' AND type = 0");
$pdata = fetch_playerdata_by_name($cuser); $pdata = fetch_playerdata_by_name($cuser);
...@@ -69,7 +69,7 @@ if($hp > 0){ ...@@ -69,7 +69,7 @@ if($hp > 0){
$log .= "<span class=\"yellow\">{$noisemin}分钟前,{$plsinfo[$noisepls]}传来了{$noiseinfo[$noisemode]}。</span><br>"; $log .= "<span class=\"yellow\">{$noisemin}分钟前,{$plsinfo[$noisepls]}传来了{$noiseinfo[$noisemode]}。</span><br>";
} }
} }
if ($club==0 && !isset($clubavl)) if ($club==0 && !isset($clubavl))
{ {
include_once GAME_ROOT.'./include/game/clubslct.func.php'; include_once GAME_ROOT.'./include/game/clubslct.func.php';
...@@ -85,7 +85,7 @@ if($hp > 0){ ...@@ -85,7 +85,7 @@ if($hp > 0){
include_once GAME_ROOT.'./include/game/itembag.func.php'; include_once GAME_ROOT.'./include/game/itembag.func.php';
overnumlimit(); overnumlimit();
} }
//判断冷却时间是否过去 //判断冷却时间是否过去
if($coldtimeon){ if($coldtimeon){
$cdover = $cdsec*1000 + $cdmsec + $cdtime; $cdover = $cdsec*1000 + $cdmsec + $cdtime;
...@@ -165,11 +165,19 @@ if($hp > 0){ ...@@ -165,11 +165,19 @@ if($hp > 0){
$state = substr($command,4,1); $state = substr($command,4,1);
$mode = 'rest'; $mode = 'rest';
} }
} elseif($command == 'fishing') {
include_once GAME_ROOT.'./include/game/fishing.func.php';
start_fishing($pdata);
if($mode == 'fishing') {
// 如果成功开始钓鱼,同时应用休息效果
include_once GAME_ROOT.'./include/state.func.php';
rest('rest', $pdata);
}
} elseif($command == 'itemmain') { } elseif($command == 'itemmain') {
if(($club == 20 && $itemcmd == 'itemmix') || ($club != 20 && ($itemcmd == 'elementmix' || $itemcmd == 'elementbag'))){ if(($club == 20 && $itemcmd == 'itemmix') || ($club != 20 && ($itemcmd == 'elementmix' || $itemcmd == 'elementbag'))){
$log .= "你的手突然掐住了你的头左右摇摆!<br><span class='yellow'>“你还想要干什么,啊?你还想要干什么!!”</span><br>看来你的手和脑子之间起了一点小摩擦。<br><br>"; $log .= "你的手突然掐住了你的头左右摇摆!<br><span class='yellow'>“你还想要干什么,啊?你还想要干什么!!”</span><br>看来你的手和脑子之间起了一点小摩擦。<br><br>";
$mode = 'command'; $mode = 'command';
} else { } else {
if($itemcmd == 'itemmix' || $itemcmd == 'elementmix'){ if($itemcmd == 'itemmix' || $itemcmd == 'elementmix'){
$main = 'itemmix_tips'; $main = 'itemmix_tips';
} }
...@@ -201,13 +209,13 @@ if($hp > 0){ ...@@ -201,13 +209,13 @@ if($hp > 0){
}elseif($sp_cmd == 'sp_trapadtsk'){ }elseif($sp_cmd == 'sp_trapadtsk'){
$position = 0; $position = 0;
if ($club==7) if ($club==7)
{ {
foreach(Array(1,2,3,4,5,6) as $imn) foreach(Array(1,2,3,4,5,6) as $imn)
if(strpos(${'itmk'.$imn},'B')===0 && ${'itme'.$imn} > 0 ){ if(strpos(${'itmk'.$imn},'B')===0 && ${'itme'.$imn} > 0 ){
$position = $imn; $position = $imn;
break; break;
} }
if (!$position) if (!$position)
{ {
$log .= '<span class="red">你没有电池,无法改造陷阱!</span><br />'; $log .= '<span class="red">你没有电池,无法改造陷阱!</span><br />';
$mode = 'command'; $mode = 'command';
...@@ -220,13 +228,13 @@ if($hp > 0){ ...@@ -220,13 +228,13 @@ if($hp > 0){
$position = $imn; $position = $imn;
break; break;
} }
if (!$position) if (!$position)
{ {
$log .= '<span class="red">你没有毒药,无法改造陷阱!</span><br />'; $log .= '<span class="red">你没有毒药,无法改造陷阱!</span><br />';
$mode = 'command'; $mode = 'command';
} }
} }
else else
{ {
$log .= '<span class="red">你不懂得如何改造陷阱!</span><br />'; $log .= '<span class="red">你不懂得如何改造陷阱!</span><br />';
$mode = 'command'; $mode = 'command';
...@@ -375,7 +383,7 @@ if($hp > 0){ ...@@ -375,7 +383,7 @@ if($hp > 0){
$p12[1]=1; $p12[2]=2; $p12[1]=1; $p12[2]=2;
$mode='sp_skpts'; $mode='sp_skpts';
//妙手技能 //妙手技能
}elseif($sp_cmd == 'sp_pickpocket_selected'){ }elseif($sp_cmd == 'sp_pickpocket_selected'){
if (!isset($choice)) { if (!isset($choice)) {
$mode = 'command'; $mode = 'command';
} else { } else {
...@@ -383,13 +391,13 @@ if($hp > 0){ ...@@ -383,13 +391,13 @@ if($hp > 0){
include_once GAME_ROOT . './include/game/revclubskills_extra.func.php'; include_once GAME_ROOT . './include/game/revclubskills_extra.func.php';
skill_tl_pickpocket_act($choice); skill_tl_pickpocket_act($choice);
} }
$mode = 'command'; $mode = 'command';
}else{ }else{
$mode = $sp_cmd; $mode = $sp_cmd;
} }
} elseif($command == 'team') { } elseif($command == 'team') {
include_once GAME_ROOT.'./include/game/team.func.php'; include_once GAME_ROOT.'./include/game/team.func.php';
if($teamcmd == 'teamquit') { if($teamcmd == 'teamquit') {
teamquit(); teamquit();
} else{ } else{
teamcheck(); teamcheck();
...@@ -419,10 +427,19 @@ if($hp > 0){ ...@@ -419,10 +427,19 @@ if($hp > 0){
//$log.="【DEBUG】关闭了对话框。"; //$log.="【DEBUG】关闭了对话框。";
if(!empty($dialogue_log[$clbpara['dialogue']])) $log.= $dialogue_log[$clbpara['dialogue']]; if(!empty($dialogue_log[$clbpara['dialogue']])) $log.= $dialogue_log[$clbpara['dialogue']];
unset($clbpara['dialogue']); unset($clbpara['noskip_dialogue']); unset($clbpara['dialogue']); unset($clbpara['noskip_dialogue']);
} elseif ($command == 'choose_fish') {
// 处理鱼篓子物品选择
if (isset($clbpara['fish_basket'])) {
include_once GAME_ROOT.'./include/game/item.nouveau_booster1.php';
item_nouveau_booster1($clbpara['fish_basket']['position'], $pdata);
} else {
$log .= '出现了错误,请重新使用鱼篓子。<br>';
$mode = 'command';
}
} elseif (strpos($command,'memory')===0) { } elseif (strpos($command,'memory')===0) {
$smn = substr($command,6); $smn = substr($command,6);
if(!empty($clbpara['smeo'] && isset($clbpara['smeo'][$smn]))){ if(!empty($clbpara['smeo'] && isset($clbpara['smeo'][$smn]))){
$iid = $clbpara['smeo'][$smn][0]; $itp = $clbpara['smeo'][$smn][1]; $iid = $clbpara['smeo'][$smn][0]; $itp = $clbpara['smeo'][$smn][1];
lost_searchmemory($smn,$pdata); lost_searchmemory($smn,$pdata);
if($itp == 'itm'){ if($itp == 'itm'){
include_once GAME_ROOT.'./include/game/search.func.php'; include_once GAME_ROOT.'./include/game/search.func.php';
...@@ -550,9 +567,9 @@ if($hp > 0){ ...@@ -550,9 +567,9 @@ if($hp > 0){
$horizon = $chor; $horizon = $chor;
$log .= "视界切换为<span class=\"yellow\">$horizoninfo[$chor]</span>。<br> "; $log .= "视界切换为<span class=\"yellow\">$horizoninfo[$chor]</span>。<br> ";
# 切换视界后,丢失所有视野 # 切换视界后,丢失所有视野
lost_searchmemory('all',$pdata); lost_searchmemory('all',$pdata);
# 向页面发送刷新标记 # 向页面发送刷新标记
$log .= "<span id='HsUipfcGhU'></span>"; $log .= "<span id='HsUipfcGhU'></span>";
}else{ }else{
$log .= "<span class=\"yellow\">这种想法太奇怪了!</span><br> "; $log .= "<span class=\"yellow\">这种想法太奇怪了!</span><br> ";
} }
...@@ -593,7 +610,23 @@ if($hp > 0){ ...@@ -593,7 +610,23 @@ if($hp > 0){
\revbattle\revbattle_prepare($command,$message); \revbattle\revbattle_prepare($command,$message);
} elseif($mode == 'rest') { } elseif($mode == 'rest') {
include_once GAME_ROOT.'./include/state.func.php'; include_once GAME_ROOT.'./include/state.func.php';
rest($command); // 如果在休息状态下点击钓鱼按钮,则进入钓鱼状态
if($command == 'fishing') {
include_once GAME_ROOT.'./include/game/fishing.func.php';
start_fishing($pdata);
// 如果成功进入钓鱼状态,保持原有的休息状态
if($mode == 'fishing') {
// 不需要调用rest函数,因为钓鱼状态下会自动应用休息效果
}
} else {
rest($command);
}
} elseif($mode == 'fishing') {
include_once GAME_ROOT.'./include/game/fishing.func.php';
fishing_command($command, $pdata);
// 在钓鱼的同时也应用休息效果
include_once GAME_ROOT.'./include/state.func.php';
rest($command, $pdata);
// } elseif($mode == 'chgpassword') { // } elseif($mode == 'chgpassword') {
// include_once GAME_ROOT.'./include/game/special.func.php'; // include_once GAME_ROOT.'./include/game/special.func.php';
// chgpassword($oldpswd,$newpswd,$newpswd2); // chgpassword($oldpswd,$newpswd,$newpswd2);
...@@ -698,8 +731,8 @@ if($hp > 0){ ...@@ -698,8 +731,8 @@ if($hp > 0){
skill_merc_chase($sk,${$sk.'mkey'}); skill_merc_chase($sk,${$sk.'mkey'});
} elseif(isset(${$sk.'mkey'}) && isset(${$sk.${$sk.'mkey'}.'moveto'})){ } elseif(isset(${$sk.'mkey'}) && isset(${$sk.${$sk.'mkey'}.'moveto'})){
skill_merc_move($sk,${$sk.'mkey'},${$sk.${$sk.'mkey'}.'moveto'}); skill_merc_move($sk,${$sk.'mkey'},${$sk.${$sk.'mkey'}.'moveto'});
} }
} }
} }
} }
$mode = 'command'; $mode = 'command';
...@@ -711,7 +744,7 @@ if($hp > 0){ ...@@ -711,7 +744,7 @@ if($hp > 0){
command_end_flag: command_end_flag:
$mode = 'command'; $mode = 'command';
} }
if($action == 'pacorpse' && $gamestate < 40){ if($action == 'pacorpse' && $gamestate < 40){
// if($state == 1 || $state == 2 || $state ==3){ // if($state == 1 || $state == 2 || $state ==3){
// $state = 0; // $state = 0;
...@@ -722,11 +755,11 @@ if($hp > 0){ ...@@ -722,11 +755,11 @@ if($hp > 0){
if($db->num_rows($result)>0){ if($db->num_rows($result)>0){
$edata = $db->fetch_array($result); $edata = $db->fetch_array($result);
include_once GAME_ROOT.'./include/game/battle.func.php'; include_once GAME_ROOT.'./include/game/battle.func.php';
findcorpse($edata); findcorpse($edata);
} }
} }
} }
//指令执行完毕,更新冷却时间 //指令执行完毕,更新冷却时间
if($coldtimeon && isset($cmdcdtime)){ if($coldtimeon && isset($cmdcdtime)){
$nowmtime = floor(getmicrotime()*1000); $nowmtime = floor(getmicrotime()*1000);
...@@ -779,7 +812,7 @@ if($hp <= 0) { ...@@ -779,7 +812,7 @@ if($hp <= 0) {
include template('death'); include template('death');
$gamedata['innerHTML']['cmd'] = ob_get_contents(); $gamedata['innerHTML']['cmd'] = ob_get_contents();
$mode = 'death'; $mode = 'death';
} elseif($cmd){ } elseif($cmd){
$gamedata['innerHTML']['cmd'] = $cmd; $gamedata['innerHTML']['cmd'] = $cmd;
} elseif($itms0){ } elseif($itms0){
ob_clean(); ob_clean();
...@@ -787,7 +820,13 @@ if($hp <= 0) { ...@@ -787,7 +820,13 @@ if($hp <= 0) {
$gamedata['innerHTML']['cmd'] = ob_get_contents(); $gamedata['innerHTML']['cmd'] = ob_get_contents();
} elseif($state == 1 || $state == 2 || $state ==3) { } elseif($state == 1 || $state == 2 || $state ==3) {
ob_clean(); ob_clean();
include template('rest'); if($mode == 'fishing') {
// 在钓鱼模式下显示钓鱼界面
$fishing_count = count($clbpara['fishing']['caught_items']);
include template('fishing');
} else {
include template('rest');
}
$gamedata['innerHTML']['cmd'] = ob_get_contents(); $gamedata['innerHTML']['cmd'] = ob_get_contents();
} elseif(!$cmd) { } elseif(!$cmd) {
ob_clean(); ob_clean();
......
# 钓鱼功能实现记录
## 功能目标
为游戏添加钓鱼机制,让玩家可以在休息或静养时进行钓鱼活动,钓到的物品会存入鱼篓子中。
## 实现方法
1. 创建钓鱼物品抽选池文件 `fishing.php`
2. 创建钓鱼功能的核心逻辑文件 `fishing.func.php`
3. 创建钓鱼界面模板 `fishing.htm`
4. 修改休息界面,添加钓鱼选项
5. 修改 `command.php` 文件,添加钓鱼命令处理
6. 修改 `command.php` 文件,添加钓鱼模式处理
7. 修改模板加载部分,支持钓鱼界面
## 创建的文件
1. `gamedata/cache/fishing.php` - 钓鱼物品抽选池
2. `include/game/fishing.func.php` - 钓鱼功能的核心逻辑
3. `templates/default/fishing.htm` - 钓鱼界面模板
## 修改的文件
1. `templates/default/rest.htm` - 添加钓鱼按钮
2. `command.php` - 添加钓鱼命令处理和钓鱼模式处理
3. `command.php` - 修改模板加载部分,支持钓鱼界面
## 功能详情
### 钓鱼物品抽选池
在 `fishing.php` 文件中定义了各种可钓到的物品,包括:
- 常见鱼类(小鲫鱼、鲤鱼、黄鳝等)
- 中等稀有度鱼类(鲈鱼、鲑鱼等)
- 稀有鱼类(大马哈鱼、鲟鱼等)
- 非常稀有鱼类(金鱼、龙鱼等)
- 其他水生物(海藻、水草、贝壳等)
- 垃圾物品(破鞋、塑料袋等)
- 特殊物品(古代硬币、神秘宝箱等)
同时,还定义了不同地点可钓到的物品列表,以及时间和天气对钓鱼概率的影响。
### 钓鱼功能核心逻辑
在 `fishing.func.php` 文件中实现了钓鱼功能的核心逻辑,包括:
- `can_fishing()` - 检查当前位置是否可以钓鱼
- `start_fishing()` - 开始钓鱼
- `end_fishing()` - 结束钓鱼
- `check_fishing()` - 检查钓鱼状态,看是否钓到了新物品
- `create_fish_basket()` - 创建鱼篓子并将钓到的物品放入其中
- `fishing_command()` - 处理钓鱼状态下的命令
### 钓鱼界面
在 `fishing.htm` 文件中定义了钓鱼界面,显示当前钓到的物品数量,并提供继续钓鱼和结束钓鱼的按钮。
### 休息界面修改
在 `rest.htm` 文件中添加了钓鱼按钮,只在可钓鱼的地点显示。
### 命令处理修改
在 `command.php` 文件中添加了钓鱼命令处理和钓鱼模式处理,使玩家可以开始钓鱼、继续钓鱼和结束钓鱼。
### 模板加载修改
在 `command.php` 文件中修改了模板加载部分,支持钓鱼界面的显示。
## 使用方法
1. 玩家在可钓鱼的地点(广场、小树林、后山、湖滨、码头、温泉、白穗神社)进行休息或静养时,会看到钓鱼按钮。
2. 点击钓鱼按钮,开始钓鱼。
3. 钓鱼过程中,玩家会在一定时间后(约1分钟)开始累计钓上的东西。
4. 钓鱼结束后(点击钓鱼界面的返回按钮),显示钓到的物品,并将它们存入鱼篓子中。
5. 鱼篓子会放入玩家的 $itm0 中,玩家可以像使用普通背包一样使用鱼篓子。
## 后续改进
1. 添加钓鱼技能,影响钓鱼成功率和钓到稀有物品的概率
2. 添加钓鱼装备,如不同种类的鱼竿和鱼饵
3. 添加钓鱼成就系统
4. 添加钓鱼比赛活动
5. 添加钓鱼物品的特殊用途,如烹饪系统
# 钓鱼功能属性提升机制添加记录
## 功能目标
为钓鱼功能添加随时间推移随机提升玩家基础属性的机制,使钓鱼不仅能获得物品,还能提升玩家的基础能力。
## 实现方法
1. 修改 `check_fishing` 函数,添加随机提升属性的逻辑
2. 修改 `end_fishing` 函数,在结束钓鱼时显示属性提升的总结
3. 修复代码中的一些问题,确保变量正确声明和使用
## 修改的文件
1. `include/game/fishing.func.php` - 添加属性提升机制
## 功能详情
### 属性提升机制
在 `check_fishing` 函数中,每次检查钓鱼状态时(约每分钟一次),除了有机会钓到物品外,还有 15% 的概率提升玩家的基础属性:
- 基础攻击($att):每次提升 1-3 点
- 基础防御($def):每次提升 1-3 点
- 生命上限($mhp):每次提升 5-15 点,同时提升当前生命
- 体力上限($msp):每次提升 5-15 点,同时提升当前体力
### 属性提升记录
在 `end_fishing` 函数中,添加了显示属性提升总结的逻辑,在结束钓鱼时会显示钓鱼期间各项属性的总提升量。
### 代码修复
1. 在 `create_fish_basket` 函数中添加了全局变量声明,确保正确使用 $itm0, $itmk0 等变量
2. 移除了 `fishing_command` 函数中未使用的 $mode 变量
3. 移除了 `end_fishing` 函数中未使用的 $now 变量
## 使用方法
玩家在钓鱼过程中,除了有机会钓到物品外,还有机会随机提升基础属性。钓鱼结束后,会显示钓鱼期间各项属性的总提升量。
## 效果展示
钓鱼结束时,玩家会看到类似以下的信息:
```
钓鱼期间,你的属性得到了提升:
- 基础攻击 +5
- 基础防御 +3
- 生命上限 +25
- 体力上限 +20
```
这个机制使钓鱼成为一种有价值的活动,即使没有钓到有用的物品,玩家也能通过提升基础属性获得收益。
# 钓鱼功能钓竿增强机制添加记录
## 功能目标
为钓鱼功能添加钓竿增强机制,使装备了名字中带有"钓竿"或"钓鱼竿"的物品的玩家能够获得更高的钓鱼效率。
## 实现方法
1. 修改 `check_fishing` 函数,添加检测钓竿的功能并提高钓鱼效率
2. 修改钓鱼物品获取概率,使装备钓竿的玩家有更高的钓鱼成功率
3. 修改属性提升部分,使装备钓竿的玩家有更高的属性提升概率和幅度
4. 在 `fishing.php` 文件中添加钓竿物品,并更新钓鱼地点配置
## 修改的文件
1. `include/game/fishing.func.php` - 添加钓竿检测和效率提升机制
2. `gamedata/cache/fishing.php` - 添加钓竿物品和更新钓鱼地点配置
## 功能详情
### 钓竿检测和效率提升
在 `check_fishing` 函数中,添加了检测玩家是否装备了钓竿的功能:
- 如果玩家装备了名字中带有"钓竿"或"钓鱼竿"的物品,钓鱼效率提高 50%
- 如果钓竿有稀有属性(r),额外提高 30% 效率
- 如果钓竿有史诗属性(R),额外提高 50% 效率
- 钓鱼效率提高会增加每次检查的次数,从而增加钓到物品的机会
### 钓鱼成功率提升
修改了钓鱼物品获取概率的计算方式:
- 基础成功率是 70%,装备钓竿可提高成功率,最高可达 95%
- 装备钓竿时,稀有物品的获取概率也会提高
### 属性提升概率和幅度增加
修改了属性提升的部分:
- 基础属性提升概率是 15%,装备钓竿可提高到最高 30%
- 装备钓竿时,属性提升的幅度也会增加,与钓竿效率成正比
### 钓竿物品和钓鱼地点配置
在 `fishing.php` 文件中添加了三种钓竿物品:
- 简易钓竿(WP, 15, 1, '', 3)
- 高级钓竿(WP, 25, 1, 'r', 2)
- 传说中的钓鱼竿(WP, 40, 1, 'R', 1)
同时,更新了钓鱼地点配置,使钓竿也可以在某些地点钓到:
- 简易钓竿可在广场、湖滨、小树林、后山等地点钓到
- 高级钓竿可在白穗神社、码头等地点钓到
- 传说中的钓鱼竿只能在温泉钓到
## 使用效果
### 钓鱼效率提升
玩家装备钓竿后,会看到类似以下的消息:
```
你使用了简易钓竿,钓鱼效率提高了 50%!
```
### 钓鱼成功率提升
装备钓竿的玩家有更高的几率钓到物品,特别是稀有物品。钓到物品时会看到类似以下的消息:
```
你熟练地操作简易钓竿,钓到了一个 金鱼!
```
### 属性提升增强
装备钓竿的玩家有更高的几率获得属性提升,且提升幅度更大。获得属性提升时会看到类似以下的消息:
```
使用简易钓竿钓鱼的过程中,你的手臂和意志得到了锻炼,你的基础攻击提升了 3 点!
```
这个新机制使钓鱼成为一种更有策略性的活动,玩家可以通过获取和使用更好的钓竿来提高钓鱼效率和收益。
# 钓鱼系统更新记录
## 更新目标
根据新的要求修改钓鱼系统,包括:
1. 将钓鱼竿类型从 WP(武器)改为 DA(手臂装备)
2. 修改补给品类型为 HH(生命恢复)、HS(体力恢复)或 HB(生命体力恢复)
3. 使用 Z(精英)和 z(天然)作为稀有和史诗属性的标识
4. 更新可钓鱼地点列表,限制为特定地点
5. 为特殊地点添加独特的钓鱼物品
## 修改内容
### 1. 钓鱼竿类型修改
- 将钓鱼竿类型从 WP(武器)改为 DA(手臂装备)
- 修改 `check_fishing` 函数,检查手臂装备($ara)而不是武器($wep)
- 钓鱼竿属性从 r/R 改为 z/Z
### 2. 补给品类型修改
- 将鱼类物品类型从 FL 改为 HH(生命恢复)
- 将部分水生物类型改为 HB(生命体力恢复)或 HS(体力恢复)
### 3. 稀有属性标识修改
- 将稀有属性从 r 改为 z(天然)
- 将史诗属性从 R 改为 Z(精英)
### 4. 可钓鱼地点更新
- 限制钓鱼地点为:
- 3 - "雪之镇"(靠海的北海道,可以钓鱼)
- 7 - "清水池"(是一个湖泊,可以钓鱼)
- 12 - "夏之镇"(设定中靠海,可以钓鱼)
- 4 - "索拉利斯"(致敬了1961年的波兰科幻小说Solaris,可以钓上外星鱼和其他部件)
- 24 - "永恒的世界"(设定中是一片云海,可以钓上奇幻风格的东西)
### 5. 特殊地点物品添加
- 为索拉利斯添加特有物品:
- 外星鱼(HB, 50, 1, Z, 2)
- 奇异水晶(MA, 100, 1, Z, 1)
- 未知生物组织(HH, 30, 1, z, 3)
- 索拉利斯之泪(HS, 80, 1, Z, 1)
- 为永恒的世界添加特有物品:
- 云朵鱼(HB, 40, 1, Z, 2)
- 天空宝石(MA, 120, 1, Z, 1)
- 彩虹水滴(HS, 60, 1, z, 3)
- 永恒之羽(DA, 50, 1, Z, 1)
## 修改的文件
1. `include/game/fishing.func.php` - 修改钓鱼功能的核心逻辑
2. `gamedata/cache/fishing.php` - 修改钓鱼物品和地点配置
## 功能详情
### 钓鱼竿检测和效率提升
```php
// 检查手臂装备是否有钓竿
if (strpos($ara, '钓竿') !== false || strpos($ara, '钓鱼竿') !== false) {
$has_fishing_rod = true;
$fishing_rod_bonus = 1.5; // 装备钓竿时提高 50% 效率
// 如果钓竿有特殊属性,可以进一步提高效率
if (strpos($arask, 'z') !== false) { // 天然属性
$fishing_rod_bonus += 0.3; // 再提高 30%
}
if (strpos($arask, 'Z') !== false) { // 精英属性
$fishing_rod_bonus += 0.5; // 再提高 50%
}
}
```
### 可钓鱼地点列表
```php
// 可以钓鱼的地点列表
$fishing_places_list = array(
3, // 雪之镇(靠海的北海道,可以钓鱼)
7, // 清水池(是一个湖泊,可以钓鱼)
12, // 夏之镇(设定中靠海,可以钓鱼)
4, // 索拉利斯(致敬了1961年的波兰科幻小说Solaris,可以钓上外星鱼和其他部件)
24, // 永恒的世界(设定中是一片云海,可以钓上奇幻风格的东西)
);
```
### 特殊地点物品配置
```php
// 索拉利斯(致敬了1961年的波兰科幻小说Solaris,可以钓上外星鱼和其他部件)
'索拉利斯' => array('外星鱼', '奇异水晶', '未知生物组织', '索拉利斯之泪', '海藻', '水草', '贝壳', '海星', '塑料袋', '空罐头', '高级钓竿'),
// 永恒的世界(设定中是一片云海,可以钓上奇幻风格的东西)
'永恒的世界' => array('云朵鱼', '天空宝石', '彩虹水滴', '永恒之羽', '彩虹鱼', '金鱼', '龙鱼', '传说中的钓鱼竿'),
```
## 使用效果
### 钓鱼效率提示
```
你使用了简易钓竿,钓鱼效率提高了 50%!
```
### 钓鱼成功消息
```
你熟练地操作简易钓竿,钓到了一个 金鱼!
```
### 属性提升消息
```
使用简易钓竿钓鱼的过程中,你的手臂和意志得到了锻炼,你的基础攻击提升了 3 点!
```
这个更新使钓鱼系统更加符合游戏的设定,并增加了更多的特色和策略性。玩家现在可以在特定的地点钓到独特的物品,使用手臂装备的钓竿提高钓鱼效率,并获得各种类型的补给品。
# 钓鱼系统更新记录 - 基于地点ID的钓鱼功能
## 更新目标
修改钓鱼功能,使其通过地点ID而不是地点名称来判断可钓鱼的地点,这样可以避免因地点名称变化而导致的问题,并使代码更加健壮。
## 修改内容
### 1. 钓鱼地点配置修改
- 将 `fishing.php` 中的钓鱼地点配置从使用地点名称作为键改为使用地点ID作为键
- 地点ID与名称的对应关系:
- 3 - 雪之镇(靠海的北海道,可以钓鱼)
- 7 - 清水池(是一个湖泊,可以钓鱼)
- 12 - 夏之镇(设定中靠海,可以钓鱼)
- 4 - 索拉利斯(致敬了1961年的波兰科幻小说Solaris)
- 24 - 永恒的世界(设定中是一片云海)
### 2. 钓鱼功能逻辑修改
- 修改 `check_fishing` 函数,直接使用地点ID获取可钓的物品列表
- 移除了获取地点名称的步骤,简化了代码逻辑
## 修改的文件
1. `include/game/fishing.func.php` - 修改钓鱼功能的核心逻辑
2. `gamedata/cache/fishing.php` - 修改钓鱼地点配置
## 功能详情
### 基于地点ID的钓鱼地点配置
```php
// 钓鱼地点配置
// 不同地点可以钓到不同的鱼(使用地点ID作为键)
$fishing_places = array(
// 3 - 雪之镇(靠海的北海道,可以钓鱼)
3 => array('小鲫鱼', '鲤鱼', '黄鳝', '鲶鱼', '鲈鱼', '鲑鱼', '大马哈鱼', '海藻', '水草', '贝壳', '海星', '破鞋', '塑料袋', '空罐头', '简易钓竿'),
// 7 - 清水池(是一个湖泊,可以钓鱼)
7 => array('小鲫鱼', '鲤鱼', '草鱼', '鲶鱼', '鲈鱼', '彩虹鱼', '金鱼', '水草', '贝壳', '破鞋', '塑料袋', '简易钓竿', '高级钓竿'),
// 12 - 夏之镇(设定中靠海,可以钓鱼)
12 => array('鲈鱼', '鲑鱼', '金枪鱼', '河豚', '大马哈鱼', '鲟鱼', '剑鱼', '海藻', '贝壳', '海星', '螃蟹', '龙虾', '珍珠', '塑料袋', '空罐头', '废轮胎', '神秘宝箱', '高级钓竿'),
// 4 - 索拉利斯(致敬了1961年的波兰科幻小说Solaris,可以钓上外星鱼和其他部件)
4 => array('外星鱼', '奇异水晶', '未知生物组织', '索拉利斯之泪', '海藻', '水草', '贝壳', '海星', '塑料袋', '空罐头', '高级钓竿'),
// 24 - 永恒的世界(设定中是一片云海,可以钓上奇幻风格的东西)
24 => array('云朵鱼', '天空宝石', '彩虹水滴', '永恒之羽', '彩虹鱼', '金鱼', '龙鱼', '传说中的钓鱼竿'),
// 默认地点(其他所有地点)
'default' => array('小鲫鱼', '鲤鱼', '黄鳝', '破鞋', '塑料袋', '空罐头')
);
```
### 直接使用地点ID获取可钓的物品列表
```php
// 直接使用地点ID获取可钓的物品列表
$available_items = isset($fishing_places[$pls]) ? $fishing_places[$pls] : $fishing_places['default'];
```
## 优势
1. **更加健壮**:即使地点名称发生变化,钓鱼功能仍然可以正常工作,因为它现在基于不变的地点ID
2. **更高效**:直接使用地点ID进行查找,避免了额外的地点名称查找步骤
3. **更易维护**:代码逻辑更加清晰,减少了潜在的错误来源
4. **更好的兼容性**:与游戏中其他基于地点ID的功能保持一致
这个更新使钓鱼系统更加稳定和可靠,同时保持了所有现有的功能和特性。
# 修复休息状态下钓鱼功能问题
## 问题描述
在休息/静养/治疗状态下,点击钓鱼按钮后,会直接退出休息状态,获得的提示也和退出休息状态的提示相同,中途没有任何报错信息。这与预期的处理(休息/静养/治疗的场合点击钓鱼按钮进入钓鱼状态并适用钓鱼逻辑)不同。
## 问题分析
通过检查代码,发现问题出在两个地方:
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. 这个修复不会影响其他游戏功能,只是修正了休息状态下钓鱼功能的行为
# 钓鱼功能实装与除错记录
本文档整合了钓鱼功能的实装和除错过程,包括功能设计、实现步骤和问题修复。
## 1. 功能设计
### 1.1 基本钓鱼功能
- 玩家可以在特定地点(雪之镇、清水池、夏之镇、索拉利斯、永恒的世界)进行钓鱼活动
- 钓鱼时,玩家有机会获得各种物品,包括鱼类和其他物品
- 钓到的物品会存入鱼篓子中,玩家可以从中选择获取物品
- 钓鱼效率受装备影响,如果玩家装备了钓竿(名称中包含"钓竿"或"钓鱼竿"),钓鱼效率会提高
### 1.2 属性提升功能
- 钓鱼过程中,玩家有机会随机提升基础属性(攻击力、防御力、最大生命值、最大体力值)
- 属性提升的概率和幅度可以通过配置文件进行调整
- 属性提升会在日志中显示,让玩家知道自己获得了什么提升
### 1.3 鱼篓子功能
- 钓到的物品会自动存入鱼篓子中
- 鱼篓子是一种特殊物品(Z类型),可以存储多个物品
- 玩家可以使用鱼篓子,查看里面的物品列表,并选择一个物品取出
- 如果鱼篓子中的物品被取完,鱼篓子会自动消失
## 2. 实现步骤
### 2.1 基本钓鱼功能实现
1. 创建 `fishing.func.php` 文件,实现钓鱼的核心逻辑
2.`rest.php` 文件中添加钓鱼按钮和相关处理代码
3. 创建 `fishing.php` 文件,处理钓鱼请求
4. 创建 `templates/default/fishing.htm` 模板文件,显示钓鱼界面
5. 实现钓鱼物品的随机生成和获取逻辑
6. 实现鱼篓子功能,将钓到的物品存入鱼篓子中
### 2.2 属性提升功能实现
1.`fishing.func.php` 文件中添加属性提升逻辑
2. 实现随机属性提升的概率和幅度计算
3. 在日志中显示属性提升信息
### 2.3 鱼篓子功能实现
1. 创建 `item.nouveau_booster1.php` 文件,实现鱼篓子的使用逻辑
2. 创建 `templates/default/fish_basket.htm` 模板文件,显示鱼篓子界面
3. 实现从鱼篓子中选择和获取物品的功能
4.`command.php` 文件中添加对 `choose_fish` 命令的处理
## 3. 问题修复
### 3.1 钓鱼地点判断问题
**问题**:钓鱼功能只能在特定地点使用,但判断逻辑使用了地点名称字符串,而不是地点ID,导致可能出现判断错误。
**解决方案**
- 修改钓鱼地点判断逻辑,使用地点ID($pls)而不是地点名称字符串
-`fishing.func.php` 文件中添加钓鱼地点ID列表,用于判断玩家是否在可钓鱼的地点
### 3.2 钓鱼与休息状态冲突问题
**问题**:当玩家在休息/治疗/治疗状态下点击钓鱼按钮时,会退出休息状态,而不是同时保持休息和钓鱼状态。
**解决方案**
- 修改 `rest.php` 文件中的钓鱼按钮处理逻辑,使其在进入钓鱼状态的同时保持休息状态
-`fishing.php` 文件中添加对休息状态的保持逻辑
### 3.3 鱼篓子使用问题
**问题**:鱼篓子功能存在多个问题,包括:
1. 物品名称显示为Unicode编码而不是实际的中文字符
2. 选择界面没有正确显示,只显示了字符串 "choose_fish"
3. 点击返回按钮没有反应,应该返回之前的步骤(背包界面)
4. 选择了物品并点击"取出选中物品"后,无法获得物品
**解决方案**
1. 修改 `fishing.func.php` 文件中的 `json_encode` 调用,添加 `JSON_UNESCAPED_UNICODE` 选项,确保中文字符能够正确存储和显示
2. 创建专门的模板文件 `fish_basket.htm`,用于显示鱼篓子界面
3. 修改返回按钮的 JavaScript 代码,正确设置 `mode` 变量
4. 完全重写 `item.nouveau_booster1.php` 文件,使其结构更加清晰,并修复物品选择和获取功能
## 4. 最终实现
### 4.1 文件结构
- `include/game/fishing.func.php`:钓鱼功能的核心逻辑
- `include/game/item.nouveau_booster1.php`:鱼篓子的使用逻辑
- `include/game/fishing.php`:处理钓鱼请求
- `templates/default/fishing.htm`:钓鱼界面模板
- `templates/default/fish_basket.htm`:鱼篓子界面模板
### 4.2 功能流程
1. **开始钓鱼**
- 玩家在特定地点(雪之镇、清水池、夏之镇、索拉利斯、永恒的世界)点击钓鱼按钮
- 系统检查玩家是否在可钓鱼的地点,如果是,则进入钓鱼状态
- 如果玩家装备了钓竿(名称中包含"钓竿"或"钓鱼竿"),钓鱼效率会提高
2. **钓鱼过程**
- 系统随机生成钓鱼结果,包括物品和属性提升
- 钓到的物品会自动存入鱼篓子中
- 属性提升会在日志中显示
3. **使用鱼篓子**
- 玩家使用鱼篓子,会看到一个专门的界面,显示里面所有物品的列表
- 玩家可以选择一个物品,然后点击"取出选中物品"按钮取出该物品
- 如果玩家没有选择物品就点击"取出选中物品"按钮,会提示选择一个物品
- 如果玩家不想取出任何物品,可以点击"返回"按钮返回到命令界面
- 如果鱼篓子中的物品被取完,鱼篓子会自动消失
### 4.3 配置参数
- **钓鱼地点**:雪之镇、清水池、夏之镇、索拉利斯、永恒的世界
- **钓鱼效率提升**:如果玩家装备了钓竿(名称中包含"钓竿"或"钓鱼竿"),钓鱼效率会提高
- **属性提升概率**:可以通过配置文件进行调整
- **属性提升幅度**:可以通过配置文件进行调整
## 5. 总结
钓鱼功能是一个复杂的系统,包括多个子功能和交互逻辑。通过本次实装和除错,我们成功实现了一个完整的钓鱼系统,包括基本钓鱼功能、属性提升功能和鱼篓子功能。在实装过程中,我们遇到了多个问题,包括钓鱼地点判断问题、钓鱼与休息状态冲突问题和鱼篓子使用问题,并成功解决了这些问题。
最终,我们得到了一个功能完善、交互友好的钓鱼系统,为游戏增添了新的玩法和乐趣。
# RevCombat System Analysis
The revcombat system is a sophisticated battle system in phpdts that handles combat encounters, battle preparation, attack calculation, and damage resolution. It's organized into three main namespaces:
## 1. Namespace Structure and Responsibilities
### revbattle Namespace
- **Purpose**: Handles encounter mechanics and battle initialization
- **Key Files**:
- `revbattle.calc.php`: Calculates encounter rates, dodge rates, and initiative rates
- `revbattle.func.php`: Manages enemy encounters, battle UI, and escape mechanics
### revcombat Namespace
- **Purpose**: Manages battle preparation and overall combat flow
- **Key Files**:
- `revcombat.func.php`: Core combat functions including preparation and execution
- `revcombat_extra.func.php`: Additional combat functions for special cases
- `revcombat.calc.php`: Calculates counter-attack rates, pursuit chances, etc.
### revattr Namespace
- **Purpose**: Handles attribute calculations and damage resolution
- **Key Files**:
- `revattr.func.php`: Core attribute and damage calculation functions
- `revattr.calc.php`: Specialized damage calculations and skill modifiers
- `revattr_extra.func.php`: Special NPC combat mechanics
## 2. Combat Flow
The combat system follows a detailed flow:
### Pre-Encounter Phase
1. When a player moves or searches, `\revbattle\calc_meetman_rate($data)` calculates encounter probability
2. If an encounter occurs, `\revbattle\calc_hide_rate($data,$edata)` determines if the enemy can dodge
3. If the enemy doesn't dodge, `\revbattle\calc_active_rate($data,$edata)` calculates initiative probability
4. Based on initiative:
- Player has initiative: `\revbattle\findenemy_rev($edata)` shows battle interface
- Enemy has initiative: `\revcombat\rev_combat_prepare($edata,$data,0)` starts combat preparation
### Battle Preparation Phase
1. `rev_combat_prepare()` initializes combat parameters:
- Records battle skill ID in `$pa['bskill']` if player used a skill
- Sets attacker/defender names in `$pa['nm']` and `$pd['nm']`
- Calls `get_attr_wepbase()` to initialize attack parameters for both sides:
- Determines defender's weapon type and passive skills
- Calculates weapon ranges and skill levels
- Determines attacker's weapon type and active/passive skills
### Combat Execution Phase
1. `rev_combat()` executes the combat sequence:
- Calls `combat_prepare_events()` for one-time battle events
- Calls `combat_prepare_logs()` to display encounter text
- Executes attacker's strike with `rev_attack()`
- Processes combat results with `rev_combat_result()`
- Checks for counter-attack possibility
- Updates global combat information
- Saves logs and finalizes battle results
### Attack Resolution Phase
1. `rev_attack()` calculates damage:
- Gets equipment and weapon attribute information
- Performs hit rate calculations
- If hit is successful:
- Calculates physical damage (base attack vs. defense)
- Calculates attribute damage (elemental effects)
- Applies final damage modifiers
- Processes experience, rage, and weapon durability
### Combat Result Phase
1. `rev_combat_result()` handles the aftermath:
- If defender's HP drops to zero:
- Processes kill/revival events
- Handles NPC second-phase transformations
- Records death method and last words
- If defender survives:
- Processes post-damage events (stun, etc.)
## 3. Damage Calculation System
The damage calculation is particularly complex:
### Physical Damage Calculation
1. Base attack calculation (`get_base_att`):
- Considers weapon effectiveness, player stats, and modifiers
- Applies weather, location, posture, and status modifiers
2. Base defense calculation (`get_base_def`):
- Considers armor effectiveness, player stats, and modifiers
- Applies similar environmental and status modifiers
3. Original damage calculation (`get_original_dmg_rev`):
- Formula: (base_attack / base_defense) * weapon_skill * skill_damage_factor
- Applies damage fluctuation based on weapon type
- Applies club skill modifiers
4. Damage multiplier calculation:
- Processes attacker's damage multipliers (critical hits, combo attacks)
- Processes defender's damage multipliers (armor penetration, special defenses)
### Attribute Damage Calculation
1. Determines applicable attribute damage types from weapons and equipment
2. For each attribute:
- Calculates base attribute damage
- Applies weapon affinity modifiers
- Checks for attribute defense or penetration
- Applies status effect modifiers
- Calculates final attribute damage
### Final Damage Resolution
1. Combines physical and attribute damage
2. Applies final damage multipliers from skills and effects
3. Applies fixed damage modifiers (additional damage, damage control)
4. Processes special cases (instant death, pure damage)
5. Applies the damage to the defender's HP
## 4. Special Combat Mechanics
The system includes numerous special mechanics:
1. **Counter-attack System**: Defenders can counter-attack based on range and probability
2. **Pursuit System**: Attackers can pursue fleeing enemies
3. **Cooperative Attack**: Players can team up against enemies
4. **Weapon Durability**: Weapons can be damaged or consumed during combat
5. **Status Effects**: Combat can inflict various status effects
6. **Armor Damage**: Attacks can damage defender's armor
7. **Special NPC Mechanics**: Certain NPCs have unique combat behaviors
## 5. Skill Integration
The combat system deeply integrates with the skill system:
1. **Battle Skills**: Active skills that can be used during combat
2. **Passive Skills**: Always-active skills that modify combat parameters
3. **Club Skills**: Skills based on player's club/organization
4. **Buff Skills**: Temporary enhancements that affect combat
Each skill can modify various aspects of combat, including:
- Hit rates and attack counts
- Damage calculations and multipliers
- Attribute damage effectiveness
- Defense capabilities
- Special effects (stun, instant kill, etc.)
The revcombat system represents a sophisticated battle engine with multiple layers of calculation and numerous special cases to handle different combat scenarios, making it both flexible and complex.
<?php
// 钓鱼物品抽选池
// 格式:'物品名称' => array('类型', '效果', '数量', '属性', '概率权重')
$fishing_items = array(
// 常见鱼类 - 高概率
'小鲫鱼' => array('HH', '1', '1', '', 100),
'鲤鱼' => array('HH', '2', '1', '', 80),
'黄鳝' => array('HH', '3', '1', '', 70),
'草鱼' => array('HH', '4', '1', '', 60),
'鲶鱼' => array('HH', '5', '1', '', 50),
// 中等稀有度鱼类 - 中等概率
'鲈鱼' => array('HH', '8', '1', '', 40),
'鲑鱼' => array('HH', '10', '1', '', 30),
'金枪鱼' => array('HH', '15', '1', '', 20),
'河豚' => array('HH', '20', '1', 'p', 15),
// 稀有鱼类 - 低概率
'大马哈鱼' => array('HH', '25', '1', '', 10),
'鲟鱼' => array('HH', '30', '1', '', 8),
'剑鱼' => array('HH', '40', '1', '', 5),
'彩虹鱼' => array('HH', '50', '1', 'z', 3),
// 非常稀有鱼类 - 极低概率
'金鱼' => array('HH', '100', '1', 'z', 2),
'龙鱼' => array('HH', '200', '1', 'Z', 1),
// 其他水生物 - 各种概率
'海藻' => array('HB', '10', '1', '', 50),
'水草' => array('HB', '15', '1', '', 40),
'贝壳' => array('HS', '5', '1', '', 30),
'珍珠' => array('HS', '50', '1', '', 5),
'海星' => array('HS', '20', '1', '', 20),
'螃蟹' => array('HB', '15', '1', '', 25),
'龙虾' => array('HB', '25', '1', '', 15),
// 垃圾物品 - 高概率
'破鞋' => array('XX', '0', '1', '', 60),
'塑料袋' => array('XX', '0', '1', '', 70),
'空罐头' => array('XX', '0', '1', '', 65),
'废轮胎' => array('XX', '0', '1', '', 40),
// 特殊物品 - 极低概率
'古代硬币' => array('MA', '100', '1', 'M', 2),
'生锈的钥匙' => array('Y', '1', '1', '', 3),
'神秘宝箱' => array('X', '1', '1', '', 1),
'幸运鱼饵' => array('X', '1', '1', 'f', 2),
// 钓竿类物品 - 极低概率
'简易钓竿' => array('DA', '15', '1', '', 3),
'高级钓竿' => array('DA', '25', '1', 'z', 2),
'传说中的钓鱼竿' => array('DA', '40', '1', 'Z', 1),
// 索拉利斯特有物品 - 只在索拉利斯可钓到
'外星鱼' => array('HB', '50', '1', 'Z', 2),
'奇异水晶' => array('MA', '100', '1', 'Z', 1),
'未知生物组织' => array('HH', '30', '1', 'z', 3),
'索拉利斯之泪' => array('HS', '80', '1', 'Z', 1),
// 永恒的世界特有物品 - 只在永恒的世界可钓到
'云朵鱼' => array('HB', '40', '1', 'Z', 2),
'天空宝石' => array('MA', '120', '1', 'Z', 1),
'彩虹水滴' => array('HS', '60', '1', 'z', 3),
'永恒之羽' => array('DA', '50', '1', 'Z', 1)
);
// 钓鱼地点配置
// 不同地点可以钓到不同的鱼(使用地点ID作为键)
$fishing_places = array(
// 3 - 雪之镇(靠海的北海道,可以钓鱼)
3 => array('小鲫鱼', '鲤鱼', '黄鳝', '鲶鱼', '鲈鱼', '鲑鱼', '大马哈鱼', '海藻', '水草', '贝壳', '海星', '破鞋', '塑料袋', '空罐头', '简易钓竿'),
// 7 - 清水池(是一个湖泊,可以钓鱼)
7 => array('小鲫鱼', '鲤鱼', '草鱼', '鲶鱼', '鲈鱼', '彩虹鱼', '金鱼', '水草', '贝壳', '破鞋', '塑料袋', '简易钓竿', '高级钓竿'),
// 12 - 夏之镇(设定中靠海,可以钓鱼)
12 => array('鲈鱼', '鲑鱼', '金枪鱼', '河豚', '大马哈鱼', '鲟鱼', '剑鱼', '海藻', '贝壳', '海星', '螃蟹', '龙虾', '珍珠', '塑料袋', '空罐头', '废轮胎', '神秘宝箱', '高级钓竿'),
// 4 - 索拉利斯(致敬了1961年的波兰科幻小说Solaris,可以钓上外星鱼和其他部件)
4 => array('外星鱼', '奇异水晶', '未知生物组织', '索拉利斯之泪', '海藻', '水草', '贝壳', '海星', '塑料袋', '空罐头', '高级钓竿'),
// 24 - 永恒的世界(设定中是一片云海,可以钓上奇幻风格的东西)
24 => array('云朵鱼', '天空宝石', '彩虹水滴', '永恒之羽', '彩虹鱼', '金鱼', '龙鱼', '传说中的钓鱼竿'),
// 默认地点(其他所有地点)
'default' => array('小鲫鱼', '鲤鱼', '黄鳝', '破鞋', '塑料袋', '空罐头')
);
// 钓鱼时间影响
// 不同时间段可能影响钓鱼概率
$fishing_time_bonus = array(
'morning' => array('小鲫鱼' => 1.2, '鲤鱼' => 1.1, '草鱼' => 1.2),
'noon' => array('鲶鱼' => 1.2, '鲈鱼' => 1.1),
'evening' => array('鲑鱼' => 1.3, '金枪鱼' => 1.2, '大马哈鱼' => 1.1),
'night' => array('彩虹鱼' => 1.5, '金鱼' => 1.3, '龙鱼' => 1.2, '神秘宝箱' => 1.5, '传说中的钓鱼竿' => 2.0, '外星鱼' => 1.8, '云朵鱼' => 1.8)
);
// 天气影响
// 不同天气可能影响钓鱼概率
$fishing_weather_bonus = array(
'晴朗' => array('小鲫鱼' => 1.2, '鲤鱼' => 1.1, '草鱼' => 1.2, '云朵鱼' => 1.5, '天空宝石' => 1.3),
'多云' => array('鲶鱼' => 1.2, '鲈鱼' => 1.1, '彩虹水滴' => 1.5),
'下雨' => array('鲑鱼' => 1.3, '金枪鱼' => 1.2, '大马哈鱼' => 1.1, '简易钓竿' => 1.5, '索拉利斯之泪' => 1.5),
'起雾' => array('彩虹鱼' => 1.5, '金鱼' => 1.3, '龙鱼' => 1.2, '神秘宝箱' => 1.5, '高级钓竿' => 1.5, '外星鱼' => 1.5, '奇异水晶' => 1.3)
);
?>
This diff is collapsed.
This diff is collapsed.
...@@ -80,9 +80,15 @@ function itemuse($itmn,&$data=NULL) { ...@@ -80,9 +80,15 @@ function itemuse($itmn,&$data=NULL) {
include_once GAME_ROOT.'./include/game/item.synthesis.php'; include_once GAME_ROOT.'./include/game/item.synthesis.php';
include_once GAME_ROOT.'./include/game/item.club_card.php'; include_once GAME_ROOT.'./include/game/item.club_card.php';
include_once GAME_ROOT.'./include/game/item.nachster_booster.php'; include_once GAME_ROOT.'./include/game/item.nachster_booster.php';
include_once GAME_ROOT.'./include/game/item.nouveau_booster1.php';
include_once GAME_ROOT.'./include/game/item.test.php'; include_once GAME_ROOT.'./include/game/item.test.php';
include_once GAME_ROOT.'./include/game/item.other.php'; include_once GAME_ROOT.'./include/game/item.other.php';
// Try to handle with nouveau booster1 items first
if(item_nouveau_booster1($itmn, $data)) {
return;
}
// Delegate to specific item type handlers based on item type code // Delegate to specific item type handlers based on item type code
if(strpos($itmk, 'W') === 0 || strpos($itmk, 'D') === 0 || strpos($itmk, 'A') === 0 || strpos($itmk, 'ss') === 0) { if(strpos($itmk, 'W') === 0 || strpos($itmk, 'D') === 0 || strpos($itmk, 'A') === 0 || strpos($itmk, 'ss') === 0) {
// Weapons and equipment // Weapons and equipment
...@@ -196,11 +202,11 @@ function itemuse($itmn,&$data=NULL) { ...@@ -196,11 +202,11 @@ function itemuse($itmn,&$data=NULL) {
$itm = $itmk = $itmsk = ''; $itm = $itmk = $itmsk = '';
$itme = $itms = 0; $itme = $itms = 0;
} }
// 检查成就 // 检查成就
include_once GAME_ROOT.'./include/game/achievement.func.php'; include_once GAME_ROOT.'./include/game/achievement.func.php';
check_item_achievement_rev($name,$i,$ie,$is,$ik,$isk); check_item_achievement_rev($name,$i,$ie,$is,$ik,$isk);
$mode = 'command'; $mode = 'command';
return; return;
} }
<?php
if(!defined('IN_GAME')) {
exit('Access Denied');
}
/**
* 处理nouveau版本中加入的特殊物品
* 包括鱼篓子等
*
* @param int $itmn 物品在物品栏中的位置
* @param array &$data 玩家数据
* @return bool 是否成功处理
*/
function item_nouveau_booster1($itmn, &$data) {
global $log, $mode, $cmd, $command;
extract($data, EXTR_REFS);
// 如果是选择鱼篓子中的物品
if ($command == 'choose_fish' && isset($clbpara['fish_basket'])) {
// 获取鱼篓子的位置和物品
$basket_position = $clbpara['fish_basket']['position'];
$basket_items = $clbpara['fish_basket']['items'];
// 获取选择的物品索引
$chosen_index = isset($_POST['choose']) ? intval($_POST['choose']) : -1;
if ($chosen_index < 0 || !isset($basket_items[$chosen_index])) {
$log .= '你没有选择任何物品,或者选择的物品不存在。<br>';
$mode = 'command';
$cmd = '';
return true;
}
// 获取选择的物品
$chosen_item = $basket_items[$chosen_index];
// 将物品放入玩家物品栏
global $itm0, $itmk0, $itme0, $itms0, $itmsk0, $itmpara0;
$itm0 = $chosen_item['itm'];
$itmk0 = $chosen_item['itmk'];
$itme0 = $chosen_item['itme'];
$itms0 = $chosen_item['itms'];
$itmsk0 = $chosen_item['itmsk'];
$itmpara0 = isset($chosen_item['itmpara']) ? $chosen_item['itmpara'] : '';
// 从鱼篓子中移除该物品
unset($basket_items[$chosen_index]);
// 重新索引数组
$basket_items = array_values($basket_items);
// 更新鱼篓子
if (empty($basket_items)) {
// 如果鱼篓子为空,移除它
$log .= '你从鱼篓子中取出了<span class="yellow">' . $itm0 . '</span>。<br>';
$log .= '鱼篓子已经空了,你将它丢弃了。<br>';
${'itm'.$basket_position} = '';
${'itmk'.$basket_position} = '';
${'itme'.$basket_position} = 0;
${'itms'.$basket_position} = 0;
${'itmsk'.$basket_position} = '';
${'itmpara'.$basket_position} = '';
} else {
// 更新鱼篓子的内容
${'itme'.$basket_position} = count($basket_items); // 更新容量
${'itms'.$basket_position} = count($basket_items); // 更新已使用空间
${'itmpara'.$basket_position} = json_encode($basket_items, JSON_UNESCAPED_UNICODE);
$log .= '你从鱼篓子中取出了<span class="yellow">' . $itm0 . '</span>。<br>';
$log .= '鱼篓子中还有 ' . count($basket_items) . ' 件物品。<br>';
}
// 清除临时数据
unset($clbpara['fish_basket']);
// 调用物品获取函数
include_once GAME_ROOT.'./include/game/itemmain.func.php';
itemget($data);
$mode = 'command';
$cmd = '';
return true;
}
// 如果是打开鱼篓子
$itm = ${'itm' . $itmn};
$itmk = ${'itmk' . $itmn};
$itmsk = ${'itmsk' . $itmn};
$itmpara = ${'itmpara' . $itmn};
if ($itm == '鱼篓子' && $itmk == 'Z' && $itmsk == 'Z') {
// 解析鱼篓子中的物品
$basket_items = json_decode($itmpara, true);
if (!$basket_items || empty($basket_items)) {
$log .= '这个鱼篓子是空的!<br>';
return true;
}
// 设置为特殊模式,显示鱼篓子界面
$mode = 'fish_basket';
$cmd = '';
// 保存鱼篓子的位置,以便后续处理
$clbpara['fish_basket'] = array(
'position' => $itmn,
'items' => $basket_items
);
// 返回 true,表示已经处理了鱼篓子
return true;
}
// 如果没有匹配的物品,返回 false
return false;
}
?>
<?php
if (! defined('IN_GAME')) {
exit('Access Denied');
}
/**
* 处理特殊物品箱
* 这些物品会提供各种随机效果
*
* @param int $itmn 物品在物品栏中的位置
* @param array &$data 玩家数据
*/
function item_special_box($itmn, &$data) {
global $log, $db, $tablepre, $now;
extract($data, EXTR_REFS);
$itm = & ${'itm' . $itmn};
$itmk = & ${'itmk' . $itmn};
$itme = & ${'itme' . $itmn};
$itms = & ${'itms' . $itmn};
$itmsk = & ${'itmsk' . $itmn};
if ($itm == '小叶子的妙妙箱') {
// A multiuse item that will provide various of items for you, mainly traps.
// However, there will be an increasing possibity that this item will self-explode.
// And when it does, there will also be a possibity that you'll lose HP and SP.
// Very low chance of insta-death.
//init itm0.
$itm0 = '';
$itmk0 = '';
$itme0 = 0;
$itms0 = 0;
$itmsk0 = '';
$itmpara = '';
//Par 低维生物's suggestion, the explode-rate will be stored in its $itmsk.
$log.="你下定决心,打开了这个可疑的<span class='yellow'>$itm</span>,开始翻找起来……<br>";
//Getting the item's current self-destruct rate.
$harukaBoxExplodeRate = intval($itmsk);
//Generate a random number based on the user's 1st Yume value.
$harukaBoxCheck = diceroll($clbpara['randver1']);
if ($harukaBoxCheck <= 17){
//Get random low-mid effect trap.
$log.="你从里面翻找出了看起来能作为<span class='yellow'>略微有趣的陷阱</span>的东西!<br>";
$itm0 = '略微有趣的玻璃珠';
$itmk0 = 'TN';
$itme0 = diceroll($clbpara['randver1']);
$itms0 = diceroll(5);
$itmsk0 = '';
}elseif ($harukaBoxCheck <= 23){
//Get random HB item.
$log.="你从里面翻找出了看起来能作为<span class='yellow'>有趣的补给</span>的东西!<br>";
$itm0 = '有趣的零食';
$itmk0 = 'HB';
$itme0 = diceroll($clbpara['randver1']) * diceroll(3);
$itms0 = diceroll(17);
$itmsk0 = 'z';
}elseif ($harukaBoxCheck <= 42){
// Get random mid effect true damage trap.
$log.="你从里面翻找出了看起来能作为<span class='yellow'>精心制作的陷阱</span>的东西!<br>";
$itm0 = '精心制作的玻璃珠阵';
$itmk0 = 'TNt';
$itme0 = diceroll($clbpara['randver2']);
$itms0 = diceroll(5);
$itmsk0 = '';
}elseif ($harukaBoxCheck <= 61){
// Get random high effect trap.
$log.="你从里面翻找出了看起来能作为<span class='yellow'>非常有趣的陷阱</span>的东西!<br>";
$itm0 = '非常有趣的玻璃珠';
$itmk0 = 'TN';
$itme0 = diceroll($clbpara['randver3']);
$itms0 = diceroll(5);
$itmsk0 = '';
}elseif ($harukaBoxCheck <= 80){
// Get random percent damage trap.
$log.="你从里面翻找出了看起来能作为<span class='yellow'>十分强力的陷阱</span>的东西!<br>";
$itm0 = '强而有力的玻璃珠';
$itmk0 = 'TN8';
$itme0 = 1;
$itms0 = diceroll(2);
$itmsk0 = 'x';
}elseif ($harukaBoxCheck <= 109){
// Get high true damage trap.
$log.="你从里面翻找出了看起来能作为<span class='yellow'>精心制作的可怕陷阱</span>的东西!<br>";
$itm0 = '精心制作的可怕玻璃珠阵';
$itmk0 = 'TNt';
$itme0 = diceroll($clbpara['randver3']);
$itms0 = diceroll(5);
$itmsk0 = '';
}else{
// Get Chaos Normal Trap.
$log.="你从里面翻找出了一些<span class='yellow'>不可名状</span>的东西!<br>它似乎可以当作陷阱使用……<br>";
$itm0 = '不可名状之物';
$itmk0 = 'TN';
$itme0 = diceroll(114514);
$itms0 = diceroll(69);
$itmsk0 = '';
}
//Troll the player if itms0 somehow rolled an 0. YSK: I encountered that 4 times in a row.
if ($itms0 == 0){
$log.="然而,<span class='yellow'>$itm0</span>却伴随着一阵少女银铃般的笑声,<br>在你的手上化作一阵青烟消失了!<br>靠!<br>";
$itm0 = '';
$itmk0 = '';
$itme0 = 0;
$itms0 = 0;
$itmsk0 = '';
//Refund some of explode rate.
//$harukaBoxCheck -= 30;
}
//Add to explode rate.
$harukaBoxExplodeRate += $harukaBoxCheck;
if ($harukaBoxExplodeRate < 667){
$log.="<span class='yellow'>妙妙箱不怀好意地颤抖了一下。</span>但最终什么都没发生!<br>";
//Write explode rate back to itmsk.
$itmsk = strval($harukaBoxExplodeRate);
}else{
//BOOM!!
$log.="<span class='yellow'>妙妙箱不怀好意地颤抖了一下。</span>然后华丽地在你的手上炸开了!<br>";
//Destroy this item.
$itm = $itmk = $itmsk = '';
$itme = $itms = 0;
//Also Destroy item0.
$itm0 = $itmk0 = $itmsk0 = '';
$itme0 = $itms0 = 0;
//Get damage.
$harukaBoxDamage = diceroll($clbpara['randver2']) * (diceroll(3) + 1);
//Calculate Damage.
if ($hp < $harukaBoxDamage){
$dflag = diceroll(1024);
if ($dflag > 1020){
//YOU WA SHOCK!!
include_once GAME_ROOT . './include/state.func.php';
$log .= '你在一片火焰中失去了知觉。<br>';
death ( 'event', '', 0, $itm );
}else{
$log .= "你受到了<span class='yellow'>巨大的</span>伤害!你感觉你整个人都要折在这里了!<br>";
$hp = 1;
$sp = 1;
}
}else{
$hp -= $harukaBoxDamage;
$sp -= $harukaBoxDamage;
if ($sp < 1){
$sp = 1;
}
$log .= "你受到了<span class='yellow'>$harukaBoxDamage</span>点伤害!<br>";
$inf .= 'a';
$log .= "你的双手也被炸得血肉模糊!真是不幸啊!<br>";
}
}
}
}
This diff is collapsed.
<form method="post" name="gamecmd" onsubmit="return false;">
<input type="hidden" id="mode" name="mode" value="command">
<input type="hidden" id="command" name="command" value="choose_fish">
<div class="subtitle">鱼篓子</div>
<div class="fish-basket-content">
你打开了鱼篓子,里面有以下物品:<br>
<!--{loop $clbpara['fish_basket']['items'] $index $item}-->
<input type='radio' name='choose' value='{$index}'>
<span class='yellow'>{$item['itm']}</span>
<!--{if !empty($item['itmsk'])}-->
<!--{loop $item['itmsk'] $attr}-->
<!--{if isset($itemspkinfo[$attr])}-->
{$itemspkinfo[$attr]}、
<!--{/if}-->
<!--{/loop}-->
<!--{/if}-->
- {$iteminfo[$item['itmk']]} {$item['itme']}<br>
<!--{/loop}-->
<br>
请选择一个物品取出:<br>
<input type="button" class="cmdbutton" value="取出选中物品" onclick="if(document.querySelector('input[name=choose]:checked')) { postCmd('gamecmd','command.php');this.disabled=true; } else { alert('请选择一个物品!'); }">
<input type="button" class="cmdbutton" value="返回" onclick="$('command').value='';$('mode').value='command';postCmd('gamecmd','command.php');this.disabled=true;">
</div>
</form>
你正在{$plsinfo[$pls]}钓鱼,同时{$restinfo[$state]}中...<br>
<span class="yellow">已钓到 {$fishing_count} 个物品</span><br>
<input type="hidden" id="mode" name="mode" value="fishing">
<input type="hidden" id="command" name="command" value="rest">
<input type="button" class="cmdbutton" id="zz" name="rest" value="[Z]继续钓鱼" onclick="postCmd('gamecmd','command.php');this.disabled=true;">
<input type="button" class="cmdbutton" id="x" name="back" value="[X]结束钓鱼" onclick="$('command').value='back';postCmd('gamecmd','command.php');this.disabled=true;">
...@@ -2,4 +2,7 @@ $restinfo[$state] 中。。。<br> ...@@ -2,4 +2,7 @@ $restinfo[$state] 中。。。<br>
<input type="hidden" id="mode" name="mode" value="rest"> <input type="hidden" id="mode" name="mode" value="rest">
<input type="hidden" id="command" name="command" value="rest"> <input type="hidden" id="command" name="command" value="rest">
<input type="button" class="cmdbutton" id="zz" name="rest" value="[Z]{$restinfo[$state]}" onclick="postCmd('gamecmd','command.php');this.disabled=true;"> <input type="button" class="cmdbutton" id="zz" name="rest" value="[Z]{$restinfo[$state]}" onclick="postCmd('gamecmd','command.php');this.disabled=true;">
<input type="button" class="cmdbutton" id="x" name="back" value="[X]返回" onclick="$('command').value='back';postCmd('gamecmd','command.php');this.disabled=true;"> <input type="button" class="cmdbutton" id="x" name="back" value="[X]返回" onclick="$('command').value='back';postCmd('gamecmd','command.php');this.disabled=true;">
\ No newline at end of file <!--{if in_array($pls, array(1, 2, 3, 4, 5, 6, 9))}-->
<input type="button" class="cmdbutton" id="f" name="fishing" value="[F]钓鱼" onclick="$('command').value='fishing';postCmd('gamecmd','command.php');this.disabled=true;">
<!--{/if}-->
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment