Commit 3ab780e0 authored by Nemo Ma's avatar Nemo Ma Committed by GitHub

Merge pull request #108 from hikawiier/waaagh

rev combat phase 4.x
parents f9b8e0d4 add89b9c
...@@ -403,8 +403,8 @@ if($hp > 0){ ...@@ -403,8 +403,8 @@ if($hp > 0){
$log.="<span class='red'>你身上没有背包,或是没有将背包装备上!<br>"; $log.="<span class='red'>你身上没有背包,或是没有将背包装备上!<br>";
} }
} elseif(strpos($command,'changewep') !==false) { } elseif(strpos($command,'changewep') !==false) {
include_once GAME_ROOT.'./include/game/revbattle.func.php'; include_once GAME_ROOT.'./include/game/itemmain.func.php';
change_wep_in_battle(); change_subwep();
$mode = 'command'; $mode = 'command';
} }
} elseif($mode == 'special') { } elseif($mode == 'special') {
...@@ -467,7 +467,7 @@ if($hp > 0){ ...@@ -467,7 +467,7 @@ if($hp > 0){
chase_flag: chase_flag:
include_once GAME_ROOT.'./include/game/revbattle.func.php'; include_once GAME_ROOT.'./include/game/revbattle.func.php';
if(!isset($message)) $message = ''; if(!isset($message)) $message = '';
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); rest($command);
......
...@@ -101,7 +101,7 @@ $trap_min_obbs = 1; ...@@ -101,7 +101,7 @@ $trap_min_obbs = 1;
//强制踩陷阱最大几率(百分比) //强制踩陷阱最大几率(百分比)
$trap_max_obbs = 40; $trap_max_obbs = 40;
//道具发现基础几率(百分比); //道具发现基础几率(百分比);
$item_obbs = 60; $item_obbs = 70;
//敌人发现基础几率(百分比) //敌人发现基础几率(百分比)
$enemy_obbs = 70; $enemy_obbs = 70;
//尸体发现几率(百分比) //尸体发现几率(百分比)
......
...@@ -120,8 +120,8 @@ function init_profile(){ ...@@ -120,8 +120,8 @@ function init_profile(){
} }
include_once GAME_ROOT.'./include/game/revattr.func.php'; include_once GAME_ROOT.'./include/game/revattr.func.php';
$atkinfo = get_base_att($pdata,$pdata,1,1); $atkinfo = \revattr\get_base_att($pdata,$pdata,1,1);
$definfo = get_base_def($pdata,$pdata,1,1); $definfo = \revattr\get_base_def($pdata,$pdata,1,1);
return; return;
} }
...@@ -645,10 +645,15 @@ function fetch_playerdata_by_name($n) ...@@ -645,10 +645,15 @@ function fetch_playerdata_by_name($n)
$result = $db->query("SELECT * FROM {$tablepre}players WHERE name = '$n' AND type = 0"); $result = $db->query("SELECT * FROM {$tablepre}players WHERE name = '$n' AND type = 0");
if(!$db->num_rows($result)) return NULL; if(!$db->num_rows($result)) return NULL;
$data = $db->fetch_array($result); $data = $db->fetch_array($result);
# 转码clbpara
if(!empty($data['clbpara'])) $data['clbpara'] = get_clbpara($data['clbpara']); if(!empty($data['clbpara'])) $data['clbpara'] = get_clbpara($data['clbpara']);
//套装效果刷新 # 判断时效性状态
if(!empty($data['clbpara']['lasttimes'])) check_skilllasttimes($data);
# 读取套装效果
include_once GAME_ROOT.'./include/game/itemmain.func.php'; include_once GAME_ROOT.'./include/game/itemmain.func.php';
reload_set_items($pdata); reload_set_items($pdata);
return $data; return $data;
} }
//通过pid抓取指定玩家/NPC数据 //通过pid抓取指定玩家/NPC数据
...@@ -658,10 +663,15 @@ function fetch_playerdata_by_pid($pid) ...@@ -658,10 +663,15 @@ function fetch_playerdata_by_pid($pid)
$result = $db->query("SELECT * FROM {$tablepre}players WHERE pid = '$pid'"); $result = $db->query("SELECT * FROM {$tablepre}players WHERE pid = '$pid'");
if(!$db->num_rows($result)) return NULL; if(!$db->num_rows($result)) return NULL;
$data = $db->fetch_array($result); $data = $db->fetch_array($result);
# 转码clbpara
if(!empty($data['clbpara'])) $data['clbpara'] = get_clbpara($data['clbpara']); if(!empty($data['clbpara'])) $data['clbpara'] = get_clbpara($data['clbpara']);
//套装效果刷新 # 判断时效性状态
if(!empty($data['clbpara']['lasttimes'])) check_skilllasttimes($data);
# 读取套装效果
include_once GAME_ROOT.'./include/game/itemmain.func.php'; include_once GAME_ROOT.'./include/game/itemmain.func.php';
reload_set_items($data); reload_set_items($pdata);
return $data; return $data;
} }
//用于将指定player数据存回数据库 //用于将指定player数据存回数据库
...@@ -689,7 +699,7 @@ function get_safe_plslist($mode=1) ...@@ -689,7 +699,7 @@ function get_safe_plslist($mode=1)
return $r; return $r;
} }
function w_save($id){ /*function w_save($id){
global $db,$tablepre,$w_name,$w_pass,$w_type,$w_endtime,$w_deathtime,$w_gd,$w_sNo,$w_icon,$w_club,$w_hp,$w_mhp,$w_sp,$w_msp,$w_att,$w_def,$w_pls,$w_lvl,$w_exp,$w_money,$w_bid,$w_inf,$w_rage,$w_pose,$w_tactic,$w_killnum,$w_state,$w_wp,$w_wk,$w_wg,$w_wc,$w_wd,$w_wf,$w_teamID,$w_teamPass,$w_wep,$w_wepk,$w_wepe,$w_weps,$w_arb,$w_arbk,$w_arbe,$w_arbs,$w_arh,$w_arhk,$w_arhe,$w_arhs,$w_ara,$w_arak,$w_arae,$w_aras,$w_arf,$w_arfk,$w_arfe,$w_arfs,$w_art,$w_artk,$w_arte,$w_arts,$w_itm0,$w_itmk0,$w_itme0,$w_itms0,$w_itm1,$w_itmk1,$w_itme1,$w_itms1,$w_itm2,$w_itmk2,$w_itme2,$w_itms2,$w_itm3,$w_itmk3,$w_itme3,$w_itms3,$w_itm4,$w_itmk4,$w_itme4,$w_itms4,$w_itm5,$w_itmk5,$w_itme5,$w_itms5,$w_itm6,$w_itmk6,$w_itme6,$w_itms6,$w_wepsk,$w_arbsk,$w_arhsk,$w_arask,$w_arfsk,$w_artsk,$w_itmsk0,$w_itmsk1,$w_itmsk2,$w_itmsk3,$w_itmsk4,$w_itmsk5,$w_itmsk6,$w_rp,$w_action,$w_achievement,$w_skillpoint; global $db,$tablepre,$w_name,$w_pass,$w_type,$w_endtime,$w_deathtime,$w_gd,$w_sNo,$w_icon,$w_club,$w_hp,$w_mhp,$w_sp,$w_msp,$w_att,$w_def,$w_pls,$w_lvl,$w_exp,$w_money,$w_bid,$w_inf,$w_rage,$w_pose,$w_tactic,$w_killnum,$w_state,$w_wp,$w_wk,$w_wg,$w_wc,$w_wd,$w_wf,$w_teamID,$w_teamPass,$w_wep,$w_wepk,$w_wepe,$w_weps,$w_arb,$w_arbk,$w_arbe,$w_arbs,$w_arh,$w_arhk,$w_arhe,$w_arhs,$w_ara,$w_arak,$w_arae,$w_aras,$w_arf,$w_arfk,$w_arfe,$w_arfs,$w_art,$w_artk,$w_arte,$w_arts,$w_itm0,$w_itmk0,$w_itme0,$w_itms0,$w_itm1,$w_itmk1,$w_itme1,$w_itms1,$w_itm2,$w_itmk2,$w_itme2,$w_itms2,$w_itm3,$w_itmk3,$w_itme3,$w_itms3,$w_itm4,$w_itmk4,$w_itme4,$w_itms4,$w_itm5,$w_itmk5,$w_itme5,$w_itms5,$w_itm6,$w_itmk6,$w_itme6,$w_itms6,$w_wepsk,$w_arbsk,$w_arhsk,$w_arask,$w_arfsk,$w_artsk,$w_itmsk0,$w_itmsk1,$w_itmsk2,$w_itmsk3,$w_itmsk4,$w_itmsk5,$w_itmsk6,$w_rp,$w_action,$w_achievement,$w_skillpoint;
$db->query("UPDATE {$tablepre}players SET name='$w_name',pass='$w_pass',type='$w_type',endtime='$w_endtime',deathtime='$w_deathtime',gd='$w_gd',sNo='$w_sNo',icon='$w_icon',club='$w_club',hp='$w_hp',mhp='$w_mhp',sp='$w_sp',msp='$w_msp',att='$w_att',def='$w_def',pls='$w_pls',lvl='$w_lvl',exp='$w_exp',money='$w_money',bid='$w_bid',inf='$w_inf',rage='$w_rage',pose='$w_pose',tactic='$w_tactic',state='$w_state',killnum='$w_killnum',action='$w_action',wp='$w_wp',wk='$w_wk',wg='$w_wg',wc='$w_wc',wd='$w_wd',wf='$w_wf',teamID='$w_teamID',teamPass='$w_teamPass',wep='$w_wep',wepk='$w_wepk',wepe='$w_wepe',weps='$w_weps',wepsk='$w_wepsk',arb='$w_arb',arbk='$w_arbk',arbe='$w_arbe',arbs='$w_arbs',arbsk='$w_arbsk',arh='$w_arh',arhk='$w_arhk',arhe='$w_arhe',arhs='$w_arhs',arhsk='$w_arhsk',ara='$w_ara',arak='$w_arak',arae='$w_arae',aras='$w_aras',arask='$w_arask',arf='$w_arf',arfk='$w_arfk',arfe='$w_arfe',arfs='$w_arfs',arfsk='$w_arfsk',art='$w_art',artk='$w_artk',arte='$w_arte',arts='$w_arts',artsk='$w_artsk',itm0='$w_itm0',itmk0='$w_itmk0',itme0='$w_itme0',itms0='$w_itms0',itmsk0='$w_itmsk0',itm1='$w_itm1',itmk1='$w_itmk1',itme1='$w_itme1',itms1='$w_itms1',itmsk1='$w_itmsk1',itm2='$w_itm2',itmk2='$w_itmk2',itme2='$w_itme2',itms2='$w_itms2',itmsk2='$w_itmsk2',itm3='$w_itm3',itmk3='$w_itmk3',itme3='$w_itme3',itms3='$w_itms3',itmsk3='$w_itmsk3',itm4='$w_itm4',itmk4='$w_itmk4',itme4='$w_itme4',itms4='$w_itms4',itmsk4='$w_itmsk4',itm5='$w_itm5',itmk5='$w_itmk5',itme5='$w_itme5',itms5='$w_itms5',itmsk5='$w_itmsk5',itm6='$w_itm6',itmk6='$w_itmk6',itme6='$w_itme6',itms6='$w_itms6',itmsk6='$w_itmsk6',rp='$w_rp',achievement='$w_achievement',skillpoint='$w_skillpoint' WHERE pid='$id'"); $db->query("UPDATE {$tablepre}players SET name='$w_name',pass='$w_pass',type='$w_type',endtime='$w_endtime',deathtime='$w_deathtime',gd='$w_gd',sNo='$w_sNo',icon='$w_icon',club='$w_club',hp='$w_hp',mhp='$w_mhp',sp='$w_sp',msp='$w_msp',att='$w_att',def='$w_def',pls='$w_pls',lvl='$w_lvl',exp='$w_exp',money='$w_money',bid='$w_bid',inf='$w_inf',rage='$w_rage',pose='$w_pose',tactic='$w_tactic',state='$w_state',killnum='$w_killnum',action='$w_action',wp='$w_wp',wk='$w_wk',wg='$w_wg',wc='$w_wc',wd='$w_wd',wf='$w_wf',teamID='$w_teamID',teamPass='$w_teamPass',wep='$w_wep',wepk='$w_wepk',wepe='$w_wepe',weps='$w_weps',wepsk='$w_wepsk',arb='$w_arb',arbk='$w_arbk',arbe='$w_arbe',arbs='$w_arbs',arbsk='$w_arbsk',arh='$w_arh',arhk='$w_arhk',arhe='$w_arhe',arhs='$w_arhs',arhsk='$w_arhsk',ara='$w_ara',arak='$w_arak',arae='$w_arae',aras='$w_aras',arask='$w_arask',arf='$w_arf',arfk='$w_arfk',arfe='$w_arfe',arfs='$w_arfs',arfsk='$w_arfsk',art='$w_art',artk='$w_artk',arte='$w_arte',arts='$w_arts',artsk='$w_artsk',itm0='$w_itm0',itmk0='$w_itmk0',itme0='$w_itme0',itms0='$w_itms0',itmsk0='$w_itmsk0',itm1='$w_itm1',itmk1='$w_itmk1',itme1='$w_itme1',itms1='$w_itms1',itmsk1='$w_itmsk1',itm2='$w_itm2',itmk2='$w_itmk2',itme2='$w_itme2',itms2='$w_itms2',itmsk2='$w_itmsk2',itm3='$w_itm3',itmk3='$w_itmk3',itme3='$w_itme3',itms3='$w_itms3',itmsk3='$w_itmsk3',itm4='$w_itm4',itmk4='$w_itmk4',itme4='$w_itme4',itms4='$w_itms4',itmsk4='$w_itmsk4',itm5='$w_itm5',itmk5='$w_itmk5',itme5='$w_itme5',itms5='$w_itms5',itmsk5='$w_itmsk5',itm6='$w_itm6',itmk6='$w_itmk6',itme6='$w_itme6',itms6='$w_itms6',itmsk6='$w_itmsk6',rp='$w_rp',achievement='$w_achievement',skillpoint='$w_skillpoint' WHERE pid='$id'");
...@@ -706,6 +716,41 @@ function w_save2(&$data){ ...@@ -706,6 +716,41 @@ function w_save2(&$data){
//$db->query("UPDATE {$tablepre}players SET name='$w_name',pass='$w_pass',type='$w_type',endtime='$w_endtime',gd='$w_gd',sNo='$w_sNo',icon='$w_icon',club='$w_club',hp='$w_hp',mhp='$w_mhp',sp='$w_sp',msp='$w_msp',att='$w_att',def='$w_def',pls='$w_pls',lvl='$w_lvl',exp='$w_exp',money='$w_money',bid='$w_bid',inf='$w_inf',rage='$w_rage',pose='$w_pose',tactic='$w_tactic',state='$w_state',killnum='$w_killnum',wp='$w_wp',wk='$w_wk',wg='$w_wg',wc='$w_wc',wd='$w_wd',wf='$w_wf',teamID='$w_teamID',teamPass='$w_teamPass',wep='$w_wep',wepk='$w_wepk',wepe='$w_wepe',weps='$w_weps',wepsk='$w_wepsk',arb='$w_arb',arbk='$w_arbk',arbe='$w_arbe',arbs='$w_arbs',arbsk='$w_arbsk',arh='$w_arh',arhk='$w_arhk',arhe='$w_arhe',arhs='$w_arhs',arhsk='$w_arhsk',ara='$w_ara',arak='$w_arak',arae='$w_arae',aras='$w_aras',arask='$w_arask',arf='$w_arf',arfk='$w_arfk',arfe='$w_arfe',arfs='$w_arfs',arfsk='$w_arfsk',art='$w_art',artk='$w_artk',arte='$w_arte',arts='$w_arts',artsk='$w_artsk',itm0='$w_itm0',itmk0='$w_itmk0',itme0='$w_itme0',itms0='$w_itms0',itmsk0='$w_itmsk0',itm1='$w_itm1',itmk1='$w_itmk1',itme1='$w_itme1',itms1='$w_itms1',itmsk1='$w_itmsk1',itm2='$w_itm2',itmk2='$w_itmk2',itme2='$w_itme2',itms2='$w_itms2',itmsk2='$w_itmsk2',itm3='$w_itm3',itmk3='$w_itmk3',itme3='$w_itme3',itms3='$w_itms3',itmsk3='$w_itmsk3',itm4='$w_itm4',itmk4='$w_itmk4',itme4='$w_itme4',itms4='$w_itms4',itmsk4='$w_itmsk4',itm5='$w_itm5',itmk5='$w_itmk5',itme5='$w_itme5',itms5='$w_itms5',itmsk5='$w_itmsk5',itm6='$w_itm6',itmk6='$w_itmk6',itme6='$w_itme6',itms6='$w_itms6',itmsk6='$w_itmsk6' WHERE pid='$w_pid'"); //$db->query("UPDATE {$tablepre}players SET name='$w_name',pass='$w_pass',type='$w_type',endtime='$w_endtime',gd='$w_gd',sNo='$w_sNo',icon='$w_icon',club='$w_club',hp='$w_hp',mhp='$w_mhp',sp='$w_sp',msp='$w_msp',att='$w_att',def='$w_def',pls='$w_pls',lvl='$w_lvl',exp='$w_exp',money='$w_money',bid='$w_bid',inf='$w_inf',rage='$w_rage',pose='$w_pose',tactic='$w_tactic',state='$w_state',killnum='$w_killnum',wp='$w_wp',wk='$w_wk',wg='$w_wg',wc='$w_wc',wd='$w_wd',wf='$w_wf',teamID='$w_teamID',teamPass='$w_teamPass',wep='$w_wep',wepk='$w_wepk',wepe='$w_wepe',weps='$w_weps',wepsk='$w_wepsk',arb='$w_arb',arbk='$w_arbk',arbe='$w_arbe',arbs='$w_arbs',arbsk='$w_arbsk',arh='$w_arh',arhk='$w_arhk',arhe='$w_arhe',arhs='$w_arhs',arhsk='$w_arhsk',ara='$w_ara',arak='$w_arak',arae='$w_arae',aras='$w_aras',arask='$w_arask',arf='$w_arf',arfk='$w_arfk',arfe='$w_arfe',arfs='$w_arfs',arfsk='$w_arfsk',art='$w_art',artk='$w_artk',arte='$w_arte',arts='$w_arts',artsk='$w_artsk',itm0='$w_itm0',itmk0='$w_itmk0',itme0='$w_itme0',itms0='$w_itms0',itmsk0='$w_itmsk0',itm1='$w_itm1',itmk1='$w_itmk1',itme1='$w_itme1',itms1='$w_itms1',itmsk1='$w_itmsk1',itm2='$w_itm2',itmk2='$w_itmk2',itme2='$w_itme2',itms2='$w_itms2',itmsk2='$w_itmsk2',itm3='$w_itm3',itmk3='$w_itmk3',itme3='$w_itme3',itms3='$w_itms3',itmsk3='$w_itmsk3',itm4='$w_itm4',itmk4='$w_itmk4',itme4='$w_itme4',itms4='$w_itms4',itmsk4='$w_itmsk4',itm5='$w_itm5',itmk5='$w_itmk5',itme5='$w_itme5',itms5='$w_itms5',itmsk5='$w_itmsk5',itm6='$w_itm6',itmk6='$w_itmk6',itme6='$w_itme6',itms6='$w_itms6',itmsk6='$w_itmsk6' WHERE pid='$w_pid'");
} }
return; return;
}*/
function addnoise($wp_kind, $wsk, $ntime, $npls, $nid1, $nid2, $nmode)
{
//在隐藏地图内不会传出声音信息
global $plsinfo;
if(!array_key_exists($npls,$plsinfo)) return;
if ((($wp_kind == 'G') && (strpos ( $wsk, 'S' ) === false)) || ($wp_kind == 'F')) {
global $noisetime, $noisepls, $noiseid, $noiseid2, $noisemode;
$noisetime = $ntime;
$noisepls = $npls;
$noiseid = $nid1;
$noiseid2 = $nid2;
$noisemode = $nmode;
save_combatinfo ();
} elseif (strpos ( $wsk, 'd' ) !== false){
global $noisetime, $noisepls, $noiseid, $noiseid2, $noisemode;
$noisetime = $ntime;
$noisepls = $npls;
$noiseid = $nid1;
$noiseid2 = $nid2;
$noisemode = 'D';
save_combatinfo ();
}
if (strlen($wp_kind)>=3){
global $noisetime, $noisepls, $noiseid, $noiseid2, $noisemode,$wep;
$noisetime = $ntime;
$noisepls = $npls;
$noiseid = $nid1;
$noiseid2 = $nid2;
$noisemode = $wp_kind;
save_combatinfo ();
}
return;
} }
//销毁尸体 //销毁尸体
...@@ -722,5 +767,186 @@ function destory_corpse(&$edata) ...@@ -722,5 +767,186 @@ function destory_corpse(&$edata)
return; return;
} }
# NPC自动换装
#说实话没有完全看懂,但是能跑就行
function npc_changewep_rev(&$pa,&$pd,$acitve)
{
global $now,$log;
global $rangeinfo,$ex_dmg_def;
if(!$pa['type'] || $pa['club'] != 98) return;
$dice = diceroll(99);
if($dice > 50)
{
$weplist = Array();
$wepklist = Array($pa['wepk']); $weplist2 = Array();
for($i=0;$i<=6;$i++)
{
if(!empty($pa['itms'.$i]) && !empty($pa['itme'.$i]) && strpos($pa['itmk'.$i],'W')===0)
{
$weplist[] = Array($i,$pa['itm'.$i],$pa['itmk'.$i],$pa['itme'.$i],$pa['itms'.$i],$pa['itmsk'.$i]);
$wepklist[] = $pa['itmk'.$i];
}
}
if(!empty($weplist))
{
$wepklist = array_unique($wepklist);
$temp_pd_ex_keys = array_merge(get_equip_ex_array($pd),get_wep_ex_array($pd));
$wepkAI = $wepskAI = true;
if(!empty($temp_pd_ex_keys))
{
if(count($wepklist)<=1) $wepkAI = false;
foreach($temp_pd_ex_keys as $ex)
{
if(in_array($ex,Array('A','B'))) $wepkAI = false;
if(in_array($ex,Array('a','b'))) $wepskAI = false;
}
}
if($wepkAI)
{
$wepk_temp = $pa['wepk'];
foreach($weplist as $val)
{
if($rangeinfo[substr($val[2],1,1)] >= $rangeinfo[substr($wepk_temp,1,1)] && !in_array(substr($val[2],1,1),$temp_pd_ex_keys))
{
$weplist2[] = $val;
}
}
if($weplist2)
{
$weplist = $weplist2;
}
}
if($wepskAI && $weplist)
{
$minus = array();
foreach($weplist as $val)
{
foreach($ex_dmg_def as $key => $val2){
if(strpos($val[5],$key)!==false && !in_array($val2,$temp_pd_ex_keys)){
$minus[] = $val;
}
}
}
if(count($minus) < count($weplist)){
$weplist = array_diff($weplist,$minus);
}
}
}
else
{
//没有获取到可换装列表,直接返回
return;
}
if(!empty($weplist))
{
$oldwep = $pa['wep'];
shuffle($weplist);
$chosen = $weplist[0];$c = $chosen[0];
# 刷新套装效果
reload_single_set_item($pa,'wep',$oldwep);
reload_single_set_item($pa,'wep',$chosen[1],1);
$pa['itm'.$c] = $pa['wep']; $pa['itmk'.$c] = $pa['wepk']; $pa['itmsk'.$c] = $pa['wepsk'];
$pa['itme'.$c] = $pa['wepe']; $pa['itms'.$c] = $pa['weps'];
$pa['wep'] = $chosen[1]; $pa['wepk'] = $chosen[2]; $pa['wepe'] = $chosen[3]; $pa['weps'] = $chosen[4]; $pa['wepsk'] = $chosen[5];
# 重载基础攻击信息
\revattr\get_wep_kind($pa);
$pa['wep_range'] = \revattr\get_wep_range($pa);
$pa['wep_skill'] = \revattr\get_wep_skill($pa);
$pa['wep_name'] = $pa['wep'];
$pa['change_wep_log'] = "<span class=\"yellow\">{$pa['nm']}</span>将手中的<span class=\"yellow\">{$oldwep}</span>卸下,装备了<span class=\"yellow\">{$pa['wep']}</span>!<br>";
}
}
return;
}
# NPC喊话
# pa指npc pd指另一视角
function npc_chat_rev(&$pa,&$pd,$mode='')
{
global $npcchat;
if(!empty($npcchat[$pa['type']][$pa['name']]))
{
$nchat = $npcchat[$pa['type']][$pa['name']];
$chatcolor = $nchat['color'];
$npcwords = !empty($chatcolor) ? "<span class = \"{$chatcolor}\">" : '<span>';
switch ($mode)
{
case 'attack' :
if (empty($pa['itmsk0']))
{
$npcwords .= "{$nchat[0]}";
$pa['itmsk0'] = 1;
}
elseif ($pa['hp'] > ($pa['mhp'] / 2))
{
$dice = rand ( 1, 2 );
$npcwords .= "{$nchat[$dice]}";
}
else
{
$dice = rand ( 3, 4 );
$npcwords .= "{$nchat[$dice]}";
}
break;
case 'defend' :
if (empty($pa['itmsk0']))
{
$npcwords .= "{$nchat[0]}";
$pa['itmsk0'] = 1;
}
elseif($pa['hp'] > ($pa['mhp'] / 2))
{
$dice = rand ( 5, 6 );
$npcwords .= "{$nchat[$dice]}";
}
else
{
$dice = rand ( 7, 8 );
$npcwords .= "{$nchat[$dice]}";
}
break;
case 'death' :
$npcwords .= "{$nchat[9]}";
break;
case 'escape' :
$npcwords .= "{$nchat[10]}";
break;
case 'cannot' :
$npcwords .= "{$nchat[11]}";
break;
case 'critical' :
$npcwords .= "{$nchat[12]}";
break;
case 'kill' :
$npcwords .= "{$pa['nm']}{$pd['nm']}说道:{$nchat[13]}";
break;
}
$npcwords .= '</span><br>';
return $npcwords;
}
elseif ($mode == 'death')
{
global $lwinfo;
if (is_array($lwinfo[$pa['type']]))
{
$lastword = $lwinfo[$pa['type']][$pa['name']];
}
else
{
$lastword = $lwinfo[$pa['type']];
}
$npcwords = "<span class=\"yellow\">“{$lastword}”</span><br>";
return $npcwords;
}
else
{
return;
}
}
?> ?>
...@@ -277,7 +277,7 @@ ...@@ -277,7 +277,7 @@
$ep_dice = rand(0,$total_addev); $ep_dice = rand(0,$total_addev);
if($ep_dice>70) if($ep_dice>70)
{ {
include_once GAME_ROOT.'./include/game/revcombat.func.php'; include_once GAME_ROOT.'./include/state.func.php';
rpup_rev($data,$ep_dice); rpup_rev($data,$ep_dice);
$log.="……但是这一切真的值得吗?<br>"; $log.="……但是这一切真的值得吗?<br>";
} }
...@@ -361,7 +361,7 @@ ...@@ -361,7 +361,7 @@
$ep_dice = rand(0,$total_addev); $ep_dice = rand(0,$total_addev);
if($ep_dice>0) if($ep_dice>0)
{ {
include_once GAME_ROOT.'./include/game/revcombat.func.php'; include_once GAME_ROOT.'./include/state.func.php';
rpup_rev($data,-$ep_dice); rpup_rev($data,-$ep_dice);
} }
$log.="<br>"; $log.="<br>";
......
...@@ -699,7 +699,7 @@ function event_rp_up($rpup) ...@@ -699,7 +699,7 @@ function event_rp_up($rpup)
} }
extract($data,EXTR_REFS); extract($data,EXTR_REFS);
include_once GAME_ROOT.'./include/game/revcombat.func.php'; include_once GAME_ROOT.'./include/state.func.php';
rpup_rev($data,$rpup); rpup_rev($data,$rpup);
/*if($club != 19 || $rpup <= 0){ /*if($club != 19 || $rpup <= 0){
......
...@@ -291,7 +291,7 @@ function itemuse($itmn,&$data=NULL) { ...@@ -291,7 +291,7 @@ function itemuse($itmn,&$data=NULL) {
logsave ( $itmsk, $now, $w_log ,'b'); logsave ( $itmsk, $now, $w_log ,'b');
} }
$edata['wep_name'] = $itm; $edata['wep_name'] = $itm;
include_once GAME_ROOT.'./include/game/revcombat.func.php'; include_once GAME_ROOT.'./include/state.func.php';
$last = pre_kill_events($edata,$pdata,0,'poison'); $last = pre_kill_events($edata,$pdata,0,'poison');
if($itmsk == $pdata['pid']) $last = 0; if($itmsk == $pdata['pid']) $last = 0;
final_kill_events($edata,$pdata,0,$last); final_kill_events($edata,$pdata,0,$last);
...@@ -331,10 +331,7 @@ function itemuse($itmn,&$data=NULL) { ...@@ -331,10 +331,7 @@ function itemuse($itmn,&$data=NULL) {
else{$exp++;$wd++;} else{$exp++;$wd++;}
if ($exp >= $upexp) { if ($exp >= $upexp) {
//include_once GAME_ROOT . './include/state.func.php'; include_once GAME_ROOT . './include/state.func.php';
//lvlup ( $exp, $upexp );
//lvlup ($lvl, $exp, 1);
include_once GAME_ROOT . './include/game/revcombat.func.php';
lvlup_rev($pdata,$pdata,1); lvlup_rev($pdata,$pdata,1);
} }
if ($itms != $nosta) { if ($itms != $nosta) {
...@@ -792,10 +789,7 @@ function itemuse($itmn,&$data=NULL) { ...@@ -792,10 +789,7 @@ function itemuse($itmn,&$data=NULL) {
if (strpos ( $itmk, 'ME' ) === 0) { if (strpos ( $itmk, 'ME' ) === 0) {
if ($exp >= $upexp) { if ($exp >= $upexp) {
//global $lvl; include_once GAME_ROOT . './include/state.func.php';
//include_once GAME_ROOT . './include/state.func.php';
//lvlup ( $lvl, $exp, 1 );
include_once GAME_ROOT . './include/game/revcombat.func.php';
lvlup_rev($pdata,$pdata,1); lvlup_rev($pdata,$pdata,1);
} }
} }
...@@ -1967,7 +1961,7 @@ function itemuse($itmn,&$data=NULL) { ...@@ -1967,7 +1961,7 @@ function itemuse($itmn,&$data=NULL) {
include_once GAME_ROOT.'./include/game/revcombat.func.php'; include_once GAME_ROOT.'./include/game/revcombat.func.php';
$pa = fetch_playerdata_by_pid(1); $pa = fetch_playerdata_by_pid(1);
$pd = fetch_playerdata_by_pid(2); $pd = fetch_playerdata_by_pid(2);
rev_combat_prepare($pa,$pd,1); \revcombat\rev_combat_prepare($pa,$pd,1);
} elseif ($itm == '事件BGM替换器'){ } elseif ($itm == '事件BGM替换器'){
// 这是一个触发事件BGM的案例,只要输入$clbpara['event_bgmbook'] = Array('事件曲集名'); 即可将当前曲集替换为特殊事件BGM // 这是一个触发事件BGM的案例,只要输入$clbpara['event_bgmbook'] = Array('事件曲集名'); 即可将当前曲集替换为特殊事件BGM
// 特殊事件曲集'event_bgmbook'的优先级高于地图曲集'pls_bgmbook',前者存在时后者不会生效 // 特殊事件曲集'event_bgmbook'的优先级高于地图曲集'pls_bgmbook',前者存在时后者不会生效
......
...@@ -429,7 +429,7 @@ function deathnote($sfn,$itmd=0,$dnname='',$dndeath='',$dngender='m',$dnicon=1) ...@@ -429,7 +429,7 @@ function deathnote($sfn,$itmd=0,$dnname='',$dndeath='',$dngender='m',$dnicon=1)
//kill('dn',$dnname,0,$edata['pid'],$dndeath); //kill('dn',$dnname,0,$edata['pid'],$dndeath);
//$killnum++; //$killnum++;
$pdata['wep_name'] = $dndeath; $pdata['wep_name'] = $dndeath;
include_once GAME_ROOT.'./include/game/revcombat.func.php'; include_once GAME_ROOT.'./include/state.func.php';
pre_kill_events($pdata,$edata,1,'dn'); pre_kill_events($pdata,$edata,1,'dn');
// 如果希望被DN后能够复活,可以在这里调用一次复活判定函数 // 如果希望被DN后能够复活,可以在这里调用一次复活判定函数
final_kill_events($pdata,$edata,1); final_kill_events($pdata,$edata,1);
......
...@@ -55,7 +55,7 @@ function calc_trap_escape_rate(&$pa,$playerflag=0,$selflag=0) ...@@ -55,7 +55,7 @@ function calc_trap_escape_rate(&$pa,$playerflag=0,$selflag=0)
if($selflag) $escrate *= 1.5; if($selflag) $escrate *= 1.5;
# 陷阱探测属性加成(锡安陷阱探测属性效果+10) # 陷阱探测属性加成(锡安陷阱探测属性效果+10)
include_once GAME_ROOT.'./include/game/revattr.func.php'; include_once GAME_ROOT.'./include/game/revattr.func.php';
if(empty($pa['ex_keys'])) $pa['ex_keys'] = array_merge(get_equip_ex_array($pa),get_wep_ex_array($pa)); if(empty($pa['ex_keys'])) $pa['ex_keys'] = array_merge(\revattr\get_equip_ex_array($pa),\revattr\get_wep_ex_array($pa));
if(!empty($pa['ex_keys']) && in_array('M',$pa['ex_keys'])) if(!empty($pa['ex_keys']) && in_array('M',$pa['ex_keys']))
{ {
$pa['minedetect'] = 1; $pa['minedetect'] = 1;
...@@ -83,7 +83,7 @@ function check_trap_def_event(&$pa,$damage,$playerflag=0,$selflag=0) ...@@ -83,7 +83,7 @@ function check_trap_def_event(&$pa,$damage,$playerflag=0,$selflag=0)
if($pa['itmk0'] == 'TOc') return $damage; if($pa['itmk0'] == 'TOc') return $damage;
# 检查是否有迎击属性 # 检查是否有迎击属性
include_once GAME_ROOT.'./include/game/revattr.func.php'; include_once GAME_ROOT.'./include/game/revattr.func.php';
if(empty($pa['ex_keys'])) $pa['ex_keys'] = array_merge(get_equip_ex_array($pa),get_wep_ex_array($pa)); if(empty($pa['ex_keys'])) $pa['ex_keys'] = array_merge(\revattr\get_equip_ex_array($pa),\revattr\get_wep_ex_array($pa));
# 计算迎击概率(锡安迎击率+20) # 计算迎击概率(锡安迎击率+20)
if(!empty($pa['ex_keys']) && in_array('m',$pa['ex_keys'])) if(!empty($pa['ex_keys']) && in_array('m',$pa['ex_keys']))
{ {
...@@ -220,7 +220,7 @@ function trap(&$data=NULL){ ...@@ -220,7 +220,7 @@ function trap(&$data=NULL){
# 踩雷rp结算 # 踩雷rp结算
$rp_up = -1 * $rp / 2; $rp_up = -1 * $rp / 2;
include_once GAME_ROOT.'./include/game/revcombat.func.php'; include_once GAME_ROOT.'./include/state.func.php';
if($rp_up) rpup_rev($data,$rp_up); if($rp_up) rpup_rev($data,$rp_up);
if($goodmancard) if($goodmancard)
...@@ -1304,7 +1304,7 @@ function getcorpse($item,&$data=NULL) ...@@ -1304,7 +1304,7 @@ function getcorpse($item,&$data=NULL)
$log.="你销毁了{$edata['name']}的尸体。<br>但这一切值得吗……?<br>"; $log.="你销毁了{$edata['name']}的尸体。<br>但这一切值得吗……?<br>";
# 销毁尸体rp结算 # 销毁尸体rp结算
$rp_up = diceroll($rpup_destory_corpse); $rp_up = diceroll($rpup_destory_corpse);
include_once GAME_ROOT.'./include/game/revcombat.func.php'; include_once GAME_ROOT.'./include/state.func.php';
rpup_rev($data,$rp_up); rpup_rev($data,$rp_up);
addnews($now,'cdestroy',$name,$edata['name']); addnews($now,'cdestroy',$name,$edata['name']);
...@@ -1406,6 +1406,58 @@ function getcorpse($item,&$data=NULL) ...@@ -1406,6 +1406,58 @@ function getcorpse($item,&$data=NULL)
return; return;
} }
# 切换副武器
function change_subwep($s=2,&$data=NULL)
{
global $log,$nosta;
if(!isset($data))
{
global $pdata;
$data = &$pdata;
}
extract($data,EXTR_REFS);
# 初始化主武器名
$eqp = 'wep';
# 初始化副武器名
$seqp = 'wep'.$s;
$seqpk = $seqp.'k';
$seqpe = $seqp.'e';
$seqps = $seqp.'s';
$seqpsk = $seqp.'sk';
# 保存副武器数据
$swep=${$seqp}; $swepk=${$seqpk};
$swepe=${$seqpe}; $sweps=${$seqps}; $swepsk=${$seqpsk};
# 主武器为空、副武器不为空的情况下,直接替换为副武器
if(($wepk == 'WN' || !$weps) && ($swepk != 'WN'))
{
${$eqp} = $swep; ${$seqp} = '拳头';
${$eqp.'k'} = $swepk; ${$seqpk} = 'WN';
${$eqp.'e'} = $swepe; ${$seqpe} = 0;
${$eqp.'s'} = $sweps; ${$seqps} = $nosta;
${$eqp.'sk'} = $swepsk; ${$seqpsk} = '';
$log.="你将{$wep}拿在了手上。<br>";
}
# 主武器不为空的情况下,副武器替换为主武器
elseif($wepk != 'WN')
{
${$seqp} = ${$eqp}; ${$eqp} = $swep;
${$seqpk} = ${$eqp.'k'}; ${$eqp.'k'} = $swepk;
${$seqpe} = ${$eqp.'e'}; ${$eqp.'e'} = $swepe;
${$seqps} = ${$eqp.'s'}; ${$eqp.'s'} = $sweps;
${$seqpsk} = ${$eqp.'sk'}; ${$eqp.'sk'} = $swepsk;
$log.="你将{$wep2}收了起来";
if($wepk != 'WN') $log .=",将{$wep}拿在了手上";
$log.="。<br>";
}
else
{
$log.="你没有装备副武器!去给自己找一个吧!<br>";
}
return;
}
# 初始化玩家/NPC数据时,重载套装效果 # 初始化玩家/NPC数据时,重载套装效果
function reload_set_items(&$pa) function reload_set_items(&$pa)
{ {
......
...@@ -46,7 +46,7 @@ function itemmix_rev($mlist, $itemselect=-1, &$data=NULL) ...@@ -46,7 +46,7 @@ function itemmix_rev($mlist, $itemselect=-1, &$data=NULL)
if($club == 19) if($club == 19)
{ {
$rpup = -30; $rpup = -30;
include_once GAME_ROOT.'./include/game/revcombat.func.php'; include_once GAME_ROOT.'./include/state.func.php';
rpup_rev($data,$rpup); rpup_rev($data,$rpup);
} }
} }
......
<?php
namespace revattr
{
if(!defined('IN_GAME')) {
exit('Access Denied');
}
# 获取社团技能对武器射程的修正
function get_clbskill_wep_range(&$pa,$range)
{
#「穿杨」效果判定:
if(isset($pa['bskill_c4_sniper']))
{
//获取射程加成
$sk_rn = get_skillvars('c4_sniper','rangegain');
$range += $sk_rn;
}
return $range;
}
# 获取社团技能对武器熟练度的修正
function get_clbskill_wep_skill(&$pa,$wep_skill)
{
# 「天威」技能判定
if(isset($pa['bskill_c6_godpow']))
{
$sk_fix = min($pa['rage']+($pa['lvl']/6),get_skillvars('c6_godpow','skmax'));
if(!empty($sk_fix))
{
$wep_skill += $sk_fix;
$pa['bskilllog2'] .='<span class="yellow">「天威」使'.$pa['nm'].'的熟练度暂时增加了'.ceil($sk_fix).'点!</span><br>';
}
}
return $wep_skill;
}
# 获取社团技能对基础命中率的修正(新)
function get_clbskill_hitrate(&$pa,&$pd,$active,$hitrate)
{
# 加成:
#「潜能」、「暗杀」必中效果判定:
if(isset($pa['bskill_c3_potential']) || isset($pa['skill_buff_assassin']))
{
//原来必中是这个意思……
return 10000;
}
#「直感」效果判定:
if(isset($pa['skill_c2_intuit']))
{
$sk_lvl = get_skilllvl('c2_intuit',$pa);
$sk_r = 1 + (get_skillvars('c2_intuit','accgain',$sk_lvl) / 100);
$hitrate *= $sk_r;
}
#「静息」效果判定:
if(isset($pa['skill_c4_stable']))
{
$sk_lvl = get_skilllvl('c4_stable',$pa);
$sk_r = 1 + (get_skillvars('c4_stable','accgain',$sk_lvl) / 100);
$hitrate *= $sk_r;
}
#「瞄准」效果判定:
if(isset($pa['bskill_c4_aiming']))
{
$sk_r = 1 + (get_skillvars('c4_aiming','accgain') / 100);
$hitrate *= $sk_r;
}
#「穿杨」效果判定:
if(isset($pa['bskill_c4_sniper']))
{
$sk_r = 1 + (get_skillvars('c4_sniper','accgain') / 100);
$hitrate *= $sk_r;
}
#「天运」效果判定:
if(isset($pa['skill_c6_godluck']))
{
$sk_r = get_skillpara('c6_godluck','accgain',$pa['clbpara']);
if(!empty($sk_r))
{
$sk_r = 1 + ($sk_r / 100);
$hitrate *= $sk_r;
}
}
#「洞察」效果判定:
if(isset($pa['skill_c10_insight']))
{
$sk_lvl = get_skilllvl('c10_insight',$pa);
$sk_r = 1 + (get_skillvars('c10_insight','accgain',$sk_lvl) / 100);
$hitrate *= $sk_r;
}
# 减益:
#「枭眼」效果判定:
if(isset($pd['skill_c3_hawkeye']))
{
$sk_r = 1 - (get_skillvars('c3_hawkeye','accloss') / 100);
$hitrate *= $sk_r;
}
#「灵力」效果判定:
if(isset($pd['skill_c9_spirit']))
{
$sk_lvl = get_skilllvl('c9_spirit',$pd);
$sk_r = 1 - (get_skillvars('c9_spirit','accloss',$sk_lvl) / 100);
$hitrate *= $sk_r;
}
#「天运」效果判定:
if(isset($pd['skill_c6_godluck']))
{
$sk_r = get_skillpara('c6_godluck','accloss',$pd['clbpara']);
if(!empty($sk_r))
{
$sk_r = 1 - ($sk_r / 100);
$hitrate *= $sk_r;
}
}
#「洞察」效果判定:
if(isset($pd['skill_c10_insight']))
{
$sk_lvl = get_skilllvl('c10_insight',$pd);
$sk_r = 1 - (get_skillvars('c10_insight','accloss',$sk_lvl) / 100);
$hitrate *= $sk_r;
}
return $hitrate;
}
# 获取社团技能对连击命中率的修正(新)
function get_clbskill_r_hitrate(&$pa,&$pd,$active,$hitrate)
{
# 加成:
#「潜能」效果判定:
if(isset($pa['bskill_c3_potential']))
{
//潜能激活时连击无衰减
return 1;
}
#「直感」效果判定:
if(isset($pa['skill_c2_intuit']))
{
$sk_lvl = get_skilllvl('c2_intuit',$pa);
//获取连击命中率加成
$sk_r = 1 + (get_skillvars('c2_intuit','rbgain',$sk_lvl) / 100);
$hitrate *= $sk_r;
}
#「静息」效果判定:
if(isset($pa['skill_c4_stable']))
{
$sk_lvl = get_skilllvl('c4_stable',$pa);
//获取连击命中率加成
$sk_r = 1 + (get_skillvars('c4_stable','rbgain',$sk_lvl) / 100);
$hitrate *= $sk_r;
}
#「天运」效果判定:
if(isset($pa['skill_c6_godluck']))
{
$sk_r = get_skillpara('c6_godluck','rbgain',$pa['clbpara']);
if(!empty($sk_r))
{
$sk_r = 1 + ($sk_r / 100);
$hitrate *= $sk_r;
}
}
# 减益:
#「枭眼」效果判定:
if(isset($pd['skill_c3_hawkeye']))
{
$sk_r = 1 - (get_skillvars('c3_hawkeye','rbloss') / 100);
$hitrate *= $sk_r;
}
#「灵力」效果判定:
if(isset($pd['skill_c9_spirit']))
{
$sk_lvl = get_skilllvl('c9_spirit',$pd);
$sk_r = 1 - (get_skillvars('c9_spirit','rbloss',$sk_lvl) / 100);
$hitrate *= $sk_r;
}
#「天运」效果判定:
if(isset($pd['skill_c6_godluck']))
{
$sk_r = get_skillpara('c6_godluck','rbloss',$pd['clbpara']);
if(!empty($sk_r))
{
$sk_r = 1 - ($sk_r / 100);
$hitrate *= $sk_r;
}
}
#「洞察」效果判定:
if(isset($pd['skill_c10_insight']))
{
$sk_lvl = get_skilllvl('c10_insight',$pd);
$sk_r = 1 - (get_skillvars('c10_insight','rbloss',$sk_lvl) / 100);
$hitrate *= $sk_r;
}
return $hitrate;
}
# 获取社团技能对致伤率(防具耐久损伤率)的修正(新)
function get_clbskill_infrate(&$pa,&$pd,$active,$infrate)
{
#「破甲」效果判定:
if(isset($pa['skill_c4_break']))
{
$sk_lvl = get_skilllvl('c4_break',$pa);
//获取致伤率加成
$sk_r = 1 + (get_skillvars('c4_break','infrgain',$sk_lvl) / 100);
$infrate *= $sk_r;
}
return $infrate;
}
# 获取社团技能对基础致伤效果(每次致伤会损耗多少点防具耐久)的修正(新)
function get_clbskill_inftimes(&$pa,&$pd,$active,$inftimes)
{
#「破甲」效果判定:
if(isset($pa['skill_c4_break']))
{
$sk_lvl = get_skilllvl('c4_break',$pa);
//获取致伤效果加成
$sk_fix = get_skillvars('c4_break','inftfix',$sk_lvl);
$inftimes += $sk_fix;
}
#「咆哮」效果判定:
if(isset($pa['bskill_c4_roar']))
{
//获取致伤效果加成
$sk_fix = get_skillvars('c4_roar','inftfix');
$inftimes += $sk_fix;
}
return $inftimes;
}
# 获取社团技能对伤害浮动的修正(新)
function get_clbskill_fluc(&$pa,&$pd,$active)
{
#「直感」效果判定:
if(isset($pa['skill_c2_intuit']))
{
$sk_lvl = get_skilllvl('c2_intuit',$pa);
//获取伤害浮动加成
$sk_fix = get_skillvars('c2_intuit','flucgain',$sk_lvl);
return $sk_fix;
}
return 0;
}
# 背水HP系数
function calc_enmity_losshpr(&$pa,&$pd)
{
$hpr = 1 - ($pa['hp']/$pa['mhp']);
$r = (1 + 2*$hpr) * $hpr;
return $r;
}
# 坚守HP系数
function calc_garrison_losshpr(&$pa,&$pd)
{
$hpr = 1 - ($pa['hp']/$pa['mhp']);
$r = -1 * pow($hpr,3) + 4 * $hpr;
return $r;
}
//计算单个属性伤害上限
function get_ex_base_dmg_max(&$pa,&$pd,$active,$ex,$ex_dmg)
{
global $ex_max_dmg;
# 「过载」效果判定:
if($ex == 'e' && isset($pa['skill_c7_overload'])) return $ex_dmg;
if($ex_max_dmg[$ex]>0 && $ex_dmg>$ex_max_dmg[$ex]) $ex_dmg = $ex_max_dmg[$ex];
return $ex_dmg;
}
//计算单个属性伤害系数变化
function get_ex_base_dmg_p(&$pa,&$pd,$active,$ex,$ex_dmg)
{
global $ex_good_wep,$ex_inf,$ex_inf_punish,$exdmginf,$exdmgname,$log;
# 「高能」效果判定:
if(isset($pa['bskill_c5_higheg']) && $ex == 'd')
{
$log.="<span class='yellow'>「高能」使{$pa['nm']}造成的爆炸伤害不受影响!</span><br>";
return $ex_dmg;
}
# 「死疗」效果判定(不会受其他技能加成):
if(isset($pd['skill_c8_deadheal']) && $ex == 'p')
{
$sk_p = get_skillvars('c8_deadheal','exdmgr');
$ex_dmg = min($pd['mhp']-$pd['hp'],ceil($ex_dmg*($sk_p/100)));
$pd['hp'] += $ex_dmg;
$log .= "<span class='purple'>{$pd['nm']}从毒雾中汲取养分,恢复了<span class='lime'>{$ex_dmg}</span>点生命!</span><br>";
return 0;
}
//计算社团技能对单个属性伤害的系数补正
$ex_dmg *= get_clbskill_ex_base_dmg_r($pa,$pd,$active,$ex);
//计算社团技能对单个属性伤害的补正
$ex_dmg += get_clbskill_ex_base_dmg_fix($pa,$pd,$active,$ex);
//计算已经进入的异常状态对属性攻击伤害的影响
if(isset($ex_inf[$ex]) && strpos($pd['inf'],$ex_inf[$ex])!==false && isset($ex_inf_punish[$ex]))
{
$ex_dmg *= $ex_inf_punish[$ex];
$pa['ex_dmgpsh_log'] .= "由于{$pd['nm']}已经{$exdmginf[$ex_inf[$ex]]}{$exdmgname[$ex]}的伤害";
$pa['ex_dmgpsh_log'] .= $ex_inf_punish[$ex]>1 ? "增加了!" : "减少了!";
}
//计算属性伤害是否被防御
if(!empty($pd['ex_def_flag']) && ($pd['ex_def_flag'] == 1 || (is_array($pd['ex_def_flag']) && in_array($ex,$pd['ex_def_flag']))))
{
$ex_dmg = round($ex_dmg*0.5);
$pa['ex_dmgdef_log'] = 1;
}
# 「催化」效果计数:
if(isset($pa['bskill_c8_catalyst']) && $ex == 'p')
{
$pa['bskill_c8_catalyst'] ++;
}
return $ex_dmg;
}
# 计算社团技能对单个属性基础伤害的系数补正
function get_clbskill_ex_base_dmg_r(&$pa,&$pd,$active,$key)
{
$ex_dmg_r = 1;
# 「附魔」效果判定:
if(isset($pa['bskill_c3_enchant']))
{
$exdmgarr = get_skillvars('c3_enchant','exdmgarr');
if(isset($exdmgarr[$key]) && !empty(get_skillpara('c3_enchant',$exdmgarr[$key],$pa['clbpara'])))
{
$ex_r = get_skillpara('c3_enchant',$exdmgarr[$key],$pa['clbpara']);
$ex_dmg_r += $ex_r/100;
//echo "【DEBUG】附魔使{$key}伤害提高了{$ex_r}%<br>";
}
}
return $ex_dmg_r;
}
# 获取社团技能对单个属性基础伤害的定值补正
function get_clbskill_ex_base_dmg_fix(&$pa,&$pd,$active,$key)
{
$ex_dmg_fix = 0;
# 「歼灭」效果判定:
if(isset($pa['skill_buff_annihil']))
{
global $ex_wep_dmg;
$sk_var = round($pa['att']/$ex_wep_dmg[$key]);
$ex_dmg_fix += $sk_var;
}
# 「磁暴」效果判定:
if(isset($pa['bskill_c7_electric']) && $key == 'e')
{
$sk_var = get_skillvars('c7_electric','exdmgfix');
$ex_damage_fix += $sk_var;
}
return $ex_dmg_fix;
}
}
?>
\ No newline at end of file
<?php <?php
namespace revattr
{
if(!defined('IN_GAME')) { if(!defined('IN_GAME')) {
exit('Access Denied'); exit('Access Denied');
} }
//include_once GAME_ROOT.'./include/game/dice.func.php';
include_once GAME_ROOT.'./include/game/clubskills.func.php';
//include_once GAME_ROOT.'./include/game/revclubskills.func.php';
include_once GAME_ROOT.'./include/game/itemmain.func.php'; include_once GAME_ROOT.'./include/game/itemmain.func.php';
include_once GAME_ROOT.'./include/game/revattr.calc.php';
include_once GAME_ROOT.'./include/game/revattr_extra.func.php'; include_once GAME_ROOT.'./include/game/revattr_extra.func.php';
//获取真实攻击类别 # 获取真实攻击类别
function get_wep_kind(&$pa,$wep_kind='',$pd_range=NULL) function get_wep_kind(&$pa,$wep_kind='',$pd_range=NULL)
{ {
global $nosta,$attinfo; global $nosta,$attinfo;
...@@ -76,28 +76,27 @@ ...@@ -76,28 +76,27 @@
return $pa['wep_kind']; //保险起见…… return $pa['wep_kind']; //保险起见……
} }
//获取武器射程 # 获取武器射程
function get_wep_range(&$pa) function get_wep_range(&$pa)
{ {
global $rangeinfo; global $rangeinfo;
if(empty($pa['wep_kind'])) get_wep_kind($pa); if(empty($pa['wep_kind'])) get_wep_kind($pa);
$range = isset($rangeinfo[$pa['wep_kind']]) ? $rangeinfo[$pa['wep_kind']] : NULL; $range = isset($rangeinfo[$pa['wep_kind']]) ? $rangeinfo[$pa['wep_kind']] : NULL;
#「穿杨」效果判定:
if(isset($pa['bskill_c4_sniper'])) # 获取社团技能对武器射程的修正
{ $range = get_clbskill_wep_range($pa,$range);
//获取射程加成
$sk_rn = get_skillvars('c4_sniper','rangegain');
$range += $sk_rn;
}
return $range; return $range;
} }
//获取武器对应熟练度 # 获取武器对应熟练度
function get_wep_skill(&$pa) function get_wep_skill(&$pa)
{ {
global $skillinfo,$log; global $skillinfo,$log;
if(empty($pa['wep_kind'])) get_wep_kind($pa); if(empty($pa['wep_kind'])) get_wep_kind($pa);
# 获取真实熟练度 保存在$pa['wep_skill']内
# 天赋异禀在计算熟练时附加25%别系熟练 # 天赋异禀在计算熟练时附加25%别系熟练
if ($pa['club'] == 10) if ($pa['club'] == 10)
...@@ -113,17 +112,156 @@ ...@@ -113,17 +112,156 @@
{ {
$wep_skill = $pa[$skillinfo[$pa['wep_kind']]]; $wep_skill = $pa[$skillinfo[$pa['wep_kind']]];
} }
# 「天威」技能判定
if(isset($pa['bskill_c6_godpow'])) # 获取社团技能对武器熟练度的修正
$wep_skill = get_clbskill_wep_skill($pa,$wep_skill);
return $wep_skill;
}
# 初始化进攻方(pa)的主动技能参数
function get_attr_bskills(&$pa,&$pd,$active)
{
global $log,$cskills,$now;
# 检查先攻者是否有要发动的主动技能:
# 1.玩家:须自主发动
# 2.NPC:如满足条件则随机发动
if($pa['type'] && !empty($pa['clbpara']['skill']))
{
# 先攻者是NPC时,打乱并遍历pa技能队列 寻找可用战斗技
if($pa['type'])
{ {
$sk_fix = min($pa['rage']+($pa['lvl']/6),get_skillvars('c6_godpow','skmax')); $npc_skill = $pa['clbpara']['skill'];
if(!empty($sk_fix)) shuffle($npc_skill);
foreach($npc_skill as $sk)
{ {
$wep_skill += $sk_fix; if(get_skilltags($sk,'battle') && !check_skill_unlock($sk,$pa) && !check_skill_cost($sk,$pa))
$pa['bskilllog2'] .='<span class="yellow">「天威」使'.$pa['nm'].'的熟练度暂时增加了'.ceil($sk_fix).'点!</span><br>'; {
$pa['bskill'] = $sk;
break;
} }
} }
return $wep_skill; }
}
if(!empty($pa['bskill']))
{
# 检查战斗技是否可用,可用则执行流程
if(!check_skill_unlock($pa['bskill'],$pa) && !check_skill_cost($pa['bskill'],$pa))
{
$bsk = $pa['bskill'];
$bsk_name = $cskills[$bsk]['name'];
# 扣除怒气
$bsk_cost = get_skillvars($bsk,'ragecost');
if($bsk_cost) $pa['rage'] -= $bsk_cost;
# 成功释放主动技,应用标记
$pa['bskill_'.$bsk] = 1;
$pa['bskilllog'] = "<span class=\"lime\">{$pa['nm']}{$pd['nm']}发动了技能「{$bsk_name}」!</span><br>";
# 限次技每次使用时次数+1
if(get_skilltags($bsk,'limit'))
{
set_skillpara($bsk,'active_t',get_skillpara($bsk,'active_t',$pa['clbpara'])+1,$pa['clbpara']);
}
# 重新判定双系武器的攻击方式
if(isset($cskills[$bsk]['wepk']) && !in_array($pa['wep_kind'],$cskills[$bsk]['wepk']))
{
get_wep_kind($pa,$cskills[$bsk]['wepk'][0]);
}
# 检查是否需要addnews
addnews($now,'bsk_'.$bsk,$pa['name'],$pd['name']);
# 检查是否需要进行logsave
if(!$pd['type'] && $pd['nm']!='你') $pd['logsave'] .= "<span class=\"yellow\">{$pa['name']}</span>对你发动了技能<span class=\"red\">「{$bsk_name}」</span>!";
elseif(!$pa['type'] && $pa['nm']!='你') $pa['logsave'] .= "你对<span class=\"yellow\">{$pd['name']}</span>发动了技能<span class=\"red\">「{$bsk_name}」</span>!";
}
else
{
# 主动技不满足使用条件或来源非法,直接注销标记
unset($pa['bskill']);
}
}
return;
}
# 初始化指定pa的被动技能参数,这里通常只判定技能是否生效,如生效,则提供一个标记
function get_attr_passive_skills(&$pa,&$pd,$active)
{
global $cskills,$log;
if(!empty($pa['clbpara']['skill']))
{
$pa['skilllog'] = '';
# 遍历pa技能队列 检查是否解锁
foreach($pa['clbpara']['skill'] as $sk)
{
# passive、buff、inf标签技能通用判定
# 对于解锁技能,如果有特殊触发条件,在这里加入判定,否则会默认给一个触发标记
if((get_skilltags($sk,'passive') || get_skilltags($sk,'buff') || get_skilltags($sk,'inf')) && !check_skill_unlock($sk,$pa))
{
# 「猛击」特殊判定
if($sk == 'c1_crit')
{
$sk_dice = diceroll(99);
# 「偷袭」或「闷棍」技能生效时,「猛击」必定触发;
$sk_obbs = isset($pa['bskill_c1_stalk'])||isset($pa['bskill_c1_bjack']) ? 100 : get_skillvars('c1_crit','rate');
# 成功触发时
if($sk_dice < $sk_obbs) $pa['skill_c1_crit'] = 1;
}
# 「枭眼」特殊判定:射程不小于对方时激活效果
elseif($sk == 'c3_hawkeye' && $pa['wep_range'] >= $pd['wep_range'])
{
$pa['skill_c3_hawkeye'] = 1;
}
# 「护盾」特殊判定:生命值不小于指定百分比时激活一个护盾
elseif($sk == 'c7_shield')
{
$sk_lvl = get_skilllvl('c7_shield',$pa);
$hpalert = get_skillvars('c7_shield','hpalert',$sk_lvl);
if($pa['hp'] <= $pa['mhp']*($hpalert/100))
{
getclubskill('buff_shield',$pa['clbpara']);
set_skillpara('buff_shield','svar',get_skillvars('c7_shield','svar',$sk_lvl),$data['clbpara']);
$pa['skill_buff_shield'] = 1;
//$pa['skilllog'] .= "<span class='lime'>感知到危险,闪烁着淡蓝幽光的护盾自动出现在{$pa['nm']}身旁!<br></span>";
$log .= "<span class='lime'>感知到危险,闪烁着淡蓝幽光的护盾自动出现在{$pa['nm']}身旁!<br></span>";
}
}
# 「暗杀」特殊判定:输出一段破隐log,并丢失buff技能
elseif($sk == 'buff_assassin')
{
$pa['skill_buff_assassin'] = 1;
$pa['skilllog'] .= "<span class='yellow'>{$pa['nm']}从阴影中现出身形,打了{$pd['nm']}一个措手不及!</span><br>";
lostclubskill('buff_assassin',$pa['clbpara']);
}
# 「洞察」特殊判定:熟练度高于对方时触发
elseif($sk == 'c10_insight' && $pa['wep_skill'] > $pd['wep_skill'])
{
$pa['skill_c10_insight'] = 1;
$pa['skilllog'] .= "<span class='yellow'>{$pa['nm']}凭借丰富的经验看穿了{$pd['nm']}的破绽!</span><br>";
}
# 「海虎」特殊判定:
elseif($sk == 'c12_swell')
{
$sk_var = get_skillvars('c12_swell','swellr') * calc_enmity_losshpr($pa,$pd);
$dice = diceroll(99);
if($dice < $sk_var)
{
$pa['skill_c12_swell'] = $pa['hp'] <= $pa['mhp']*0.3 ? 2 : 1;
}
}
# 其他非特判技能,默认给一个触发标记
else
{
$pa['skill_'.$sk] = 1;
//$pa['skill_'.$sk.'_log'] = "";
}
}
# switch标签技能通用判定:active为1时才算激活
if(get_skilltags($sk,'switch') && !empty(get_skillpara($sk,'active',$pa['clbpara'])) && !check_skill_unlock($sk,$pa))
{
$pa['askill_'.$sk] = 1;
}
}
}
return;
} }
//获取防具上的属性 //获取防具上的属性
...@@ -197,41 +335,6 @@ ...@@ -197,41 +335,6 @@
return; return;
} }
//在初始化战斗阶段触发的事件。即:无论是否反击都只会触发1次的事件。
function combat_prepare_events(&$pa,&$pd,$active)
{
# 社团技能初始化(主动型/战斗技)
attr_extra_active_skills($pa,$pd,$active);
//attr_extra_active_skills($pd,$pa,$active);
# 社团技能初始化(被动型)(最好不要在这个阶段输出log,把log和成功触发的标记保存进对应角色里,到实际结算效果时再显示。)
if(!empty($pa['clbpara']['skill'])) attr_extra_passive_skills($pa,$pd,$active);
if(!empty($pd['clbpara']['skill'])) attr_extra_passive_skills($pd,$pa,$active);
# 百命猫 初始化事件: 每次初始化战斗时都会提升等级与怒气
if (($pa['type'] == 89 && $pa['name']=='是TSEROF啦!') || ($pd['type'] == 89 && $pd['name']=='是TSEROF啦!'))
{
attr_extra_89_100lifecat($pa,$pd,$active);
}
# 笼中鸟 初始化事件:喂养成功会跳过战斗
if($pa['type'] == 89 && $pa['name'] =='笼中鸟')
{
$flag = attr_extra_89_cagedbird($pa,$pd,$active);
if($flag < 0) return $flag;
}
elseif($pd['type'] == 89 && $pd['name'] =='笼中鸟')
{
$flag = attr_extra_89_cagedbird($pd,$pa,$active);
if($flag < 0) return $flag;
}
# 检查成就503
if(!empty($pa['arbs']) && $pa['arb'] == '【智代专用熊装】') attr_ach53_check($pa,$pd,$active);
if(!empty($pd['arbs']) && $pd['arb'] == '【智代专用熊装】') attr_ach53_check($pd,$pa,$active);
return 1;
}
//攻击方(pa)在命中流程前触发的事件(直死、DOT结算、踩陷阱……) 返回值小于0:中止打击流程 //攻击方(pa)在命中流程前触发的事件(直死、DOT结算、踩陷阱……) 返回值小于0:中止打击流程
function hitrate_prepare_events(&$pa,&$pd,$active) function hitrate_prepare_events(&$pa,&$pd,$active)
{ {
...@@ -601,12 +704,6 @@ ...@@ -601,12 +704,6 @@
$pa['wepe_t'] = $pa['wepe'] * 2; $pa['wepe_t'] = $pa['wepe'] * 2;
} }
# 获取pa社团技能对攻击力的加成(旧)
/*if(!empty($pa['skills']))
{
rev_get_clubskill_bonus($pa['club'],$pa['skills'],$pa,$pd['club'],$pa['skills'],$pd,$att1,$def1);
$pa['att'] += $att1;
}*/
# 汇总:: # 汇总::
$base_att = $pa['att'] + $pa['wepe_t']; $base_att = $pa['att'] + $pa['wepe_t'];
...@@ -725,7 +822,7 @@ ...@@ -725,7 +822,7 @@
{ {
$tooltip = "<span tooltip=\" 基础防御值:{$base_def}+{$equip_def}"; $tooltip = "<span tooltip=\" 基础防御值:{$base_def}+{$equip_def}";
if(!empty($def1)) $tooltip .="+{$def1}"; if(!empty($def1)) $tooltip .="+{$def1}";
if(!empty($sk_def)) $tooltip .="\r技能加成:+{$sk_def}"; if(!empty($sk_def)) $tooltip .="+{$sk_def}(技能加成)";
$tooltip .= "\r"; $tooltip .= "\r";
} }
# 计算防御力修正 # 计算防御力修正
...@@ -767,13 +864,6 @@ ...@@ -767,13 +864,6 @@
} }
} }
# 计算社团技能对pd防御力的修正(旧)
/*$club_def_per = 100;
if(!empty($pd['club']) || !empty($pd['skills']))
{
rev_get_clubskill_bonus_p($pa['club'],$pa['skills'],$pa,$pd['club'],$pa['skills'],$pd,$attfac,$deffac);
$club_def_per *= $deffac;
}*/
# 计算社团技能对pd防御力的修正(新) # 计算社团技能对pd防御力的修正(新)
#「根性」技能加成 #「根性」技能加成
if(!check_skill_unlock('c12_garrison',$pd)) if(!check_skill_unlock('c12_garrison',$pd))
...@@ -853,6 +943,7 @@ ...@@ -853,6 +943,7 @@
$damage += $pa['wepe']; $damage += $pa['wepe'];
} }
} }
$pa['original_dmg'] += $damage;
return $damage; return $damage;
} }
...@@ -1013,15 +1104,13 @@ ...@@ -1013,15 +1104,13 @@
//检查抹消属性是否生效 //检查抹消属性是否生效
if($dice > $obbs) if($dice > $obbs)
{ {
$pd['phy_def_flag'] = 2;
#「脉冲」效果判定: #「脉冲」效果判定:
if(isset($pa['bskill_c7_emp']) || isset($pd['bskill_c7_emp'])) if(isset($pa['bskill_c7_emp']) || isset($pd['bskill_c7_emp']))
{ {
$log .= "<span class='yellow'>在电磁脉冲的干扰下,伤害抹消力场被无效化了!</span><br>"; $log .= "<span class='yellow'>在电磁脉冲的干扰下,伤害抹消力场被无效化了!</span><br>";
$pa['bskill_c7_emp'] = 2; $pa['bskill_c7_emp'] = 2;
} unset($pd['phy_def_flag']);
else
{
$pd['phy_def_flag'] = 2;
} }
} }
else else
...@@ -1369,15 +1458,13 @@ ...@@ -1369,15 +1458,13 @@
//检查抹消属性是否生效 //检查抹消属性是否生效
if($dice > $obbs) if($dice > $obbs)
{ {
$pd['ex_def_flag'] = 2;
#「脉冲」效果判定: #「脉冲」效果判定:
if(isset($pa['bskill_c7_emp']) || isset($pd['bskill_c7_emp'])) if(isset($pa['bskill_c7_emp']) || isset($pd['bskill_c7_emp']))
{ {
$log .= "<span class='yellow'>在电磁脉冲的干扰下,属性抹消力场被无效化了!</span><br>"; $log .= "<span class='yellow'>在电磁脉冲的干扰下,属性抹消力场被无效化了!</span><br>";
$pa['bskill_c7_emp'] = 2; $pa['bskill_c7_emp'] = 2;
} unset($pd['ex_def_flag'] );
else
{
$pd['ex_def_flag'] = 2;
} }
} }
else else
...@@ -1484,10 +1571,10 @@ ...@@ -1484,10 +1571,10 @@
$pa['ex_dmgpsh_log'] = '';$pa['ex_dmginf_log'] = ''; $pa['ex_dmgdef_log'] = ''; $pa['ex_dmgpsh_log'] = '';$pa['ex_dmginf_log'] = ''; $pa['ex_dmgdef_log'] = '';
//计算单个属性的基础属性伤害: 基础伤害 + 效果↔伤害系数修正 + 熟练↔伤害系数修正 //计算单个属性的基础属性伤害: 基础伤害 + 效果↔伤害系数修正 + 熟练↔伤害系数修正
$ex_dmg = $ex_base_dmg[$ex] + $pa['wepe']/$ex_wep_dmg[$ex] + $pa['wep_skill']/$ex_skill_dmg[$ex]; $ex_dmg = $ex_base_dmg[$ex] + $pa['wepe']/$ex_wep_dmg[$ex] + $pa['wep_skill']/$ex_skill_dmg[$ex];
//计算单个属性能造成的基础伤害上限
$ex_dmg = get_ex_base_dmg_max($pa,$pd,$active,$ex,$ex_dmg);
//计算得意武器类型对单个属性伤害的系数修正 //计算得意武器类型对单个属性伤害的系数修正
if(isset($ex_good_wep[$ex]) && $ex_good_wep[$ex] == $pa['wep_kind']) $ex_dmg *= 2; if(isset($ex_good_wep[$ex]) && $ex_good_wep[$ex] == $pa['wep_kind']) $ex_dmg *= 2;
//计算单个属性能造成的基础伤害上限
$ex_dmg = get_ex_base_dmg_max($pa,$pd,$active,$ex,$ex_dmg);
//计算属性伤害浮动 //计算属性伤害浮动
$ex_dmg = round($ex_dmg * rand(100-$ex_dmg_fluc[$ex],100+$ex_dmg_fluc[$ex])/100); $ex_dmg = round($ex_dmg * rand(100-$ex_dmg_fluc[$ex],100+$ex_dmg_fluc[$ex])/100);
//计算单个属性的属性伤害变化: //计算单个属性的属性伤害变化:
...@@ -1554,60 +1641,6 @@ ...@@ -1554,60 +1641,6 @@
return $total_ex_dmg; return $total_ex_dmg;
} }
//计算单个属性伤害上限
function get_ex_base_dmg_max(&$pa,&$pd,$active,$ex,$ex_dmg)
{
global $ex_max_dmg;
# 「过载」效果判定:
if($ex == 'e' && isset($pa['skill_c7_overload'])) return $ex_dmg;
if($ex_max_dmg[$ex]>0 && $ex_dmg>$ex_max_dmg[$ex]) $ex_dmg = $ex_max_dmg[$ex];
return $ex_dmg;
}
//计算单个属性伤害系数变化
function get_ex_base_dmg_p(&$pa,&$pd,$active,$ex,$ex_dmg)
{
global $ex_good_wep,$ex_inf,$ex_inf_punish,$exdmginf,$exdmgname,$log;
# 「高能」效果判定:
if(isset($pa['bskill_c5_higheg']) && $ex == 'd')
{
$log.="<span class='yellow'>「高能」使{$pa['nm']}造成的爆炸伤害不受影响!</span><br>";
return $ex_dmg;
}
# 「死疗」效果判定(不会受其他技能加成):
if(isset($pd['skill_c8_deadheal']) && $ex == 'p')
{
$sk_p = get_skillvars('c8_deadheal','exdmgr');
$ex_dmg = min($pd['mhp']-$pd['hp'],ceil($ex_dmg*($sk_p/100)));
$pd['hp'] += $ex_dmg;
$log .= "<span class='purple'>{$pd['nm']}从毒雾中汲取养分,恢复了<span class='lime'>{$ex_dmg}</span>点生命!</span><br>";
return 0;
}
//计算社团技能对单个属性伤害的系数补正
$ex_dmg *= get_clbskill_ex_base_dmg_r($pa,$pd,$active,$ex);
//计算社团技能对单个属性伤害的补正
$ex_dmg += get_clbskill_ex_base_dmg_fix($pa,$pd,$active,$ex);
//计算已经进入的异常状态对属性攻击伤害的影响
if(isset($ex_inf[$ex]) && strpos($pd['inf'],$ex_inf[$ex])!==false && isset($ex_inf_punish[$ex]))
{
$ex_dmg *= $ex_inf_punish[$ex];
$pa['ex_dmgpsh_log'] .= "由于{$pd['nm']}已经{$exdmginf[$ex_inf[$ex]]}{$exdmgname[$ex]}的伤害";
$pa['ex_dmgpsh_log'] .= $ex_inf_punish[$ex]>1 ? "增加了!" : "减少了!";
}
//计算属性伤害是否被防御
if(!empty($pd['ex_def_flag']) && ($pd['ex_def_flag'] == 1 || (is_array($pd['ex_def_flag']) && in_array($ex,$pd['ex_def_flag']))))
{
$ex_dmg = round($ex_dmg*0.5);
$pa['ex_dmgdef_log'] = 1;
}
# 「催化」效果计数:
if(isset($pa['bskill_c8_catalyst']) && $ex == 'p')
{
$pa['bskill_c8_catalyst'] ++;
}
return $ex_dmg;
}
//计算属性总伤害加成 //计算属性总伤害加成
function get_ex_dmg_p(&$pa,&$pd,$active) function get_ex_dmg_p(&$pa,&$pd,$active)
{ {
...@@ -2028,90 +2061,12 @@ ...@@ -2028,90 +2061,12 @@
} }
} }
# 「磁暴」效果判定
if(isset($pa['bskill_c7_electric']))
{
if(strpos($pd['inf'],'e')!==false)
{
$flag = get_skillinf_rev($pd,'inf_dizzy',get_skillvars('c7_electric','lasttimes'));
if($flag)
{
$log .= "<span class='yellow'>由于已经处于麻痹状态,狂暴的电流直接将{$pd['nm']}电晕了!</span><br>";
if(!$pd['type'] && $pd['nm']!='你') $pd['logsave'] .= "狂暴的电流直接将你电晕!<br>";
elseif(!$pa['type'] && $pa['nm']!='你') $pa['logsave'] .= "狂暴的电流直接将<span class=\"yellow\">{$pd['name']}</span>电晕!<br>";
}
}
else
{
$infr = get_skillvars('c7_electric','infr');
$dice = diceroll(99);
if($dice < $infr)
{
$flag = get_inf_rev($pd,'e');
$log .= "<span class='yellow'>「磁暴」使{$pd['nm']}{$exdmginf['e']}了!</span><br>";
}
else
{
$log .= "<span class='yellow'>{$pd['nm']}没有受到「磁暴」影响!</span><br>";
}
}
}
# 「脉冲」效果判定
if(isset($pa['bskill_c7_emp']) && $pa['bskill_c7_emp'] > 1)
{
if(strpos($pd['inf'],'e')!==false)
{
$flag = get_skillinf_rev($pd,'inf_dizzy',get_skillvars('c7_electric','lasttimes'));
if($flag)
{
$log .= "<span class='yellow'>由于已经处于麻痹状态,狂暴的能量脉冲直接把{$pd['nm']}冲晕了过去!</span><br>";
if(!$pd['type'] && $pd['nm']!='你') $pd['logsave'] .= "狂暴的能量脉冲把你冲晕了过去!<br>";
elseif(!$pa['type'] && $pa['nm']!='你') $pa['logsave'] .= "狂暴的能量脉冲把<span class=\"yellow\">{$pd['name']}</span>冲晕了过去!<br>";
}
}
else
{
$flag = get_inf_rev($pd,'e');
$log .= "<span class='yellow'>「脉冲」使{$pd['nm']}{$exdmginf['e']}了!</span><br>";
}
}
# 「渗透」效果判定
if(isset($pa['skill_c8_infilt']))
{
$sk_lvl = get_skilllvl('c8_infilt',$pa);
$infr = get_skillvars('c8_infilt','infr',$sk_lvl);
$dice = diceroll(99);
if($dice < $infr)
{
$flag = get_inf_rev($pd,'p');
include_once GAME_ROOT.'./include/game/itemmain.func.php';
check_item_edit_event($pa,$pd,'c8_infilt');
if($flag) $log .= "<span class='yellow'>「渗透」使{$pd['nm']}{$exdmginf['p']}了!</span><br>";
else $log .= "<span class='yellow'>{$pd['nm']}没有受到「渗透」影响……大概吧?</span><br>";
}
else
{
$log .= "<span class='yellow'>{$pd['nm']}没有受到「渗透」影响!</span><br>";
}
}
# 将pa造成的伤害记录在pd的成就里 # 将pa造成的伤害记录在pd的成就里
if(!$pd['type'] && $pa['final_damage'] >= 1000000) $pd['clbpara']['achvars']['takedmg'] = $pa['final_damage']; if(!$pd['type'] && $pa['final_damage'] >= 1000000) $pd['clbpara']['achvars']['takedmg'] = $pa['final_damage'];
return; return;
} }
# 战斗后结算rp事件
function get_killer_rp(&$pa,&$pd,$active)
{
# 杀人rp结算
$rpup = $pd['type'] ? 20 : max(80,$pd['rp']);
rpup_rev($pa,$rpup);
return;
}
//受到致伤或异常 //受到致伤或异常
function get_inf_rev(&$pa,$infnm,$type=0) function get_inf_rev(&$pa,$infnm,$type=0)
{ {
...@@ -2148,388 +2103,6 @@ ...@@ -2148,388 +2103,6 @@
return 0; return 0;
} }
//打击结束,已经应用扣血后的事件结算
function rev_combat_result_events(&$pa,&$pd,$active)
{
global $now,$log,$infinfo,$exdmginf,$plsinfo;
# 真蓝凝防守事件:
if($pd['type'] == 19 && $pd['name'] == '蓝凝')
{
attr_extra_19_azure($pa,$pd,$active);
}
# 「灭气」技能效果
if(isset($pa['skill_c1_burnsp']))
{
$pd['sp'] = max($pd['sp']-round($pa['final_damage']*2/3),1);
//$log .= "<span class='yellow'>「灭气」使{$pd['nm']}的体力降低了!</span><br>";
}
# 「猛击」眩晕效果
if(isset($pa['skill_c1_crit']))
{
$sk_lvl = get_skilllvl('c1_crit',$pa);
$sk_lst = get_skillvars('c1_crit','stuntime',$sk_lvl);
$flag = get_skillinf_rev($pd,'inf_dizzy',$sk_lst);
if($flag)
{
if(!$pd['type'] && $pd['nm']!='你') $pd['logsave'] .= "凶猛的一击直接将你打晕了过去!<br>";
elseif(!$pa['type'] && $pa['nm']!='你') $pa['logsave'] .= "你凶猛的一击直接将<span class=\"yellow\">{$pd['name']}</span>打晕了过去!<br>";
}
}
# 「冰心」效果判定
if (isset($pd['skill_c9_iceheart']) && !empty($pd['inf']))
{
$purify = get_skillvars('c9_iceheart','purify');
# 获取当前异常队列
$now_inf = str_split($pd['inf']);
# 计算最多可净化异常数
$purify = min($purify,count($now_inf));
for($p=0;$p<$purify;$p++)
{
$heal_inf = $now_inf[$p];
$flag = heal_inf_rev($pd,$heal_inf);
if($flag)
{
$log .= "<span class='yellow'>{$pd['nm']}敛神聚气,从{$exdmginf[$heal_inf]}中恢复了!</span><br>";
$pd['rage'] = max(255,$pd['rage']+get_skillvars('c9_iceheart','ragegain'));
}
}
}
# 「天佑」技能判定
if(isset($pd['skill_c6_godbless']) && empty($pd['skill_buff_godbless']) && !empty($pa['final_damage']))
{
$actmhp = get_skillvars('c6_godbless','actmhp');
if($pa['final_damage'] >= $pd['mhp']*($actmhp/100) && $pd['hp'] > 0)
{
getclubskill('buff_godbless',$pd['clbpara']);
$log .= "<span class=\"yellow\">{$pd['nm']}的技能「天佑」被触发,暂时进入了无敌状态!</span><br>";
}
}
# 「火花」技能判定:触发后不会再触发协战流程
if(isset($pa['askill_c20_sparkle']))
{
$sk = 'c20_sparkle';
$dice = diceroll(99);
$obbs = get_skillvars($sk,'tpr');
if($dice < $obbs)
{
$pa['askill_c20_sparkle'] = 2;
$plslist = get_safe_plslist();
$sp_pls = $plslist[array_rand($plslist)];
# 切换地图
$pd['pls'] = $sp_pls;
$pd['tp_by_sparkle'] = $sp_pls;
# NPC敌人扣血,玩家在被送到新地图后强制探索一次
if($pd['type'])
{
$pd['hp'] -= min($pd['hp']-1,rand(1,$sp_pls * 10));
}
else
{
$pd['action'] = 'tpmove';
$pd['logsave'] .= "<span class=\"grey\">{$pa['name']}点燃火花,将你传送到了{$plsinfo[$sp_pls]}!</span><br>";
}
$log .= "<span class=\"yellow\">你点燃火花,将{$pd['nm']}送到了{$plsinfo[$sp_pls]}!祝他好运吧……</span><br>";
addnews($now,'sparklemove',$pa['name'],$pd['name'],$plsinfo[$sp_pls]);
return;
}
}
# 「协战」判定
# 拥有佣兵的情况下,主动攻击敌人/成功反击敌人,且敌人仍存活时,判定是否有佣兵协战
if(!empty(get_skillpara('c11_merc','id',$pa['clbpara'])))
{
$sk = 'c11_merc';
$cancovers = get_skillpara($sk,'cancover',$pa['clbpara']);
shuffle($cancovers);
$dice = diceroll(99);
foreach($cancovers as $mkey => $mcan)
{
if($mcan)
{
$mcps = get_skillpara($sk,'coverp',$pa['clbpara'])[$mkey];
if($dice < $mcps)
{
# 触发协战,将协战者ID记录在coopatk_flag内
$pa['coveratk_flag'] = get_skillpara($sk,'id',$pa['clbpara'])[$mkey];
//echo "触发了协战!协战对象ID:{$pa['coveratk_flag']}<br>";
break;
}
}
}
}
# 「灵俑」协战判定
if(empty($pa['coveratk_flag']) && !empty($pa['clbpara']['zombieid']))
{
# 「灵俑」基础协战率:50
$cover_obbs = 50; $cover_dice = diceroll(99);
if($cover_dice < $cover_obbs)
{
$mate_list = $pa['clbpara']['mate']; shuffle($mate_list);
foreach($mate_list as $mid)
{
$mdata = fetch_playerdata_by_pid($mid);
# 跳过不在同一地图的灵俑
if($mdata['pls'] != $pd['pls'] || $mdata['hp'] < 1) continue;
# 触发协战
$pa['coveratk_flag'] = $mid;
break;
}
}
}
return;
}
// 获取pa在探索时的遇敌率(遇敌率越低道具发现率越高)
function calc_meetman_rate(&$pa)
{
global $gamestate,$pose_find_modifier,$pls_find_modifier,$weather_find_r;
# 基础遇敌率
$enemyrate = 40;
# 连斗阶段遇敌率+20
if($gamestate == 40){$enemyrate += 20;}
# 死斗阶段遇敌率+40
elseif($gamestate == 50){$enemyrate += 40;}
# 姿态对遇敌率的修正
if(!empty($pose_find_modifier[$pa['pose']])) $enemyrate += $pose_find_modifier[$pa['pose']];
# 天气对遇敌率的修正
if(!empty($weather_find_r['weather'])) $enemyrate += $weather_find_r['weather'];
# 地图场景对遇敌率的修正
if(!empty($pls_find_modifier[$pa['pls']])) $enemyrate += $pls_find_modifier[$pa['pls']];
# 社团技能修正(新)
# 「专注」效果判定
if(!empty($pa['clbpara']['skill']) && !check_skill_unlock('c5_focus',$pa))
{
# 探人模式遇敌率提升
if(get_skillpara('c5_focus','choice',$pa['clbpara']) == 1)
{
$sk_var = get_skillvars('c5_focus','meetgain');
$enemyrate += $sk_var;
}
# 探物模式遇敌率降低
elseif(get_skillpara('c5_focus','choice',$pa['clbpara']) == 2)
{
$sk_var = get_skillvars('c5_focus','itmgain');
$enemyrate -= $sk_var;
}
}
return $enemyrate;
}
// 获取pd面对pa时的躲避率
function get_hide_r_rev(&$pa,&$pd,$mode=0)
{
global $weather,$weather_hide_r,$pls_hide_modifier,$pose_hide_modifier,$tactic_hide_modifier;
# 获取基础躲避率
$hide_r = 0;
# 计算天气对躲避率的修正
$wth_r = $weather_hide_r[$weather] ?: 0 ;
# 计算地点对躲避率的修正
$pls_r = $pls_hide_modifier[$pd['pls']] ?: 0 ;
# 计算pd姿态对于躲避率的修正:
$pose_r = $pose_hide_modifier[$pd['pose']] ?: 0;
# 计算pd策略对于躲避率的修正:
$tac_r = $tactic_hide_modifier[$pd['tactic']] ?: 0;
# 基础汇总:
$hide_r += $wth_r + $pose_r + $tac_r;
include_once GAME_ROOT.'./include/game/clubskills.func.php';
# 计算社团技能对躲避率的系数修正(旧):
//$hide_r *= get_clubskill_bonus_hide($pd['club'],$pd['skills']);
# 计算社团技能对躲避率的定值修正:
$hide_r = get_clbskill_hide_rate_fix($pa,$pd,$hide_r);
//echo "hide_r = {$hide_r}<br>";
return $hide_r;
}
// 获取pa对pd的先制攻击概率
// $mode 0-标准战斗 1-鏖战 2-追击(追击&鏖战基础先制率不受天气姿态影响)
function get_active_r_rev(&$pa,&$pd,$mode=0)
{
global $log,$now,$active_obbs,$weather,$gamevars,$gamecfg,$chase_active_obbs;
include config('combatcfg',$gamecfg);
$pa['clbpara'] = get_clbpara($pa['clbpara']);
$pd['clbpara'] = get_clbpara($pd['clbpara']);
# 获取基础先攻率:
if(!$mode)
{
$active_r = $active_obbs;
# 计算天气对先攻率的修正:
$wth_ar = $weather_active_r[$weather] ?: 0;
# 光玉雨特殊效果判定:
if($weather == 18 && $gamevars['wth18pid'] == $pa['pid'])
{
# 计算雨势
$wthlastime = $now - $gamevars['wth18stime'];
# 雨势在前7分钟递增,后3分钟递减
$wthlastime = $wthlastime <= 420 ? $wthlastime : 600 - $wthlastime;
$wthpow = min(7,max(1,round($wthlastime / 60)));
# 效力加成
$wth_ar += diceroll($wthpow) + diceroll($wthpow);
}
# 计算pa姿态对于先攻率的修正:
$a_pose_ar = $pose_active_modifier[$pa['pose']] ?: 0;
# 计算pd姿态对于先攻率的修正:
$d_pose_ar = $pose_active_modifier[$pd['pose']] ?: 0;
# 基础汇总:
$active_r += $wth_ar + $a_pose_ar - $d_pose_ar;
}
else
{
$active_r = $chase_active_obbs;
# 计算追击状态下pa对pd的先攻加成。默认:战场距离*10%
if($mode == 2) $range_ar += get_battle_range($pa,$pd,1) * 10;
}
# 计算社团技能对于先攻率的系数修正(旧):
//$active_r *= get_clubskill_bonus_active($pa['club'],$pa['skills'],$pd['club'],$pd['skills']);
# 计算社团技能对于先攻率的定值修正(新):
$active_r = get_clbskill_active_rate_fix($pa,$pd,$active_r);
# 计算先攻率上下限:
$active_r = max(min($active_r,96),4);
# 计算pa身上的异常状态对先攻率的修正:(pd身上的异常状态不会影响pa的先制率,这个机制以后考虑改掉)
if(!empty($pa['inf']))
{
$inf_ar = 1;
foreach ($inf_active_p as $inf_ky => $value)
{
if(strpos($pa['inf'], $inf_ky)!==false){$inf_ar *= $value;}
}
$active_r *= $inf_ar;
}
# 计算pd身上的特殊异常(技能类)对先攻率的修正:
if(!empty($pd['clbpara']['skill']))
{
# 眩晕状态下必被先手
if(in_array('inf_dizzy',$pd['clbpara']['skill']))
{
$log.="{$pd['name']}正处于眩晕状态!<br>";
$active_r = 100;
}
}
//echo 'active = '.$active_r.' <br>';
return $active_r;
}
// 判断pd是否满足反击pa的基础条件(最高优先级)
function check_can_counter(&$pa,&$pd,$active)
{
# 被协战攻击无法反击
if(isset($pa['is_coveratk']))
{
$pd['cannot_counter_log'] = "{$pd['nm']}双拳难敌四手,逃跑了!";
return 0;
}
# 被偷袭无法反击
if(isset($pa['bskill_c1_stalk']))
{
$pd['cannot_counter_log'] = "{$pd['nm']}无法反击!";
return 0;
}
# 被留手了应不应该反击……?暂时定不会反击,但是会反击也很合理,人心险恶嘛!
if(isset($pa['askill_c19_dispel']) && $pa['askill_c19_dispel'] == 2)
{
$pd['cannot_counter_log'] = "被你放了一马的{$pd['nm']}一瘸一拐地逃开了。<br>希望你的决定是正确的……";
return 0;
}
# 被火花传送走了不能反击
if(isset($pd['tp_by_sparkle']))
{
$pd['cannot_counter_log'] = "{$pd['nm']}传送走了!<br>";
return 0;
}
# 处于眩晕状态时,无法反击
if(isset($pd['skill_inf_dizzy']))
{
$pd['cannot_counter_log'] = "{$pd['nm']}正处于眩晕状态,无法反击!";
return 0;
}
# 治疗姿态、躲避策略不能反击
if($pd['pose'] == 5 || $pd['tactic'] == 4)
{
$pd['cannot_counter_log'] = "{$pd['nm']}处于无法反击的状态!转身逃开了!";
return 0;
}
# 哨戒姿态不会反击,但是会生气……
if($pd['pose'] == 7)
{
$pd['cannot_counter_log'] = "{$pd['nm']}看起来非常生气!还是离他远点吧……";
return 0;
}
return 1;
}
// 判断pa是否处于pd的反击射程内(次优先级)
function check_in_counter_range(&$pa,&$pd,$active)
{
if(!empty($pa['wep_range']) && $pd['wep_range'] >= $pa['wep_range']) return 1;
# 鏖战状态下无视射程反击(爆系武器除外)
if((isset($pd['is_dfight']) || isset($pa['is_dfight'])) && !empty($pd['wep_range'])) return 1;
#「直感」触发后可以超射程反击:
if(isset($pd['skill_c2_intuit']))
{
$sk_dice = diceroll(99);
$sk_lvl = get_skilllvl('c2_intuit',$pd);
$sk_obbs = get_skillvars('c2_intuit','rangerate',$sk_lvl);
if($sk_dice < $sk_obbs)
{
return 1;
}
}
return 0;
}
// 获取pd成功对pa发起反击的概率
function get_counter_rev(&$pa,&$pd,$active)
{
global $counter_obbs,$inf_counter_p,$pose_counter_modifier,$tactic_counter_modifier;
# 获取攻击方式的基础反击率:
$counter = $counter_obbs[$pd['wep_kind']];
# 获取姿态、策略对反击率的修正:
$counter += $pose_counter_modifier[$pd['pose']];
$counter += $tactic_counter_modifier[$pd['tactic']];
# 计算双方射程差对反击率的影响:(高射程武器受低射程武器攻击时,反击率下降(双方射程差x10)%,最低不会低于8%)
if($pd['wep_range'] > $pa['wep_range'] && $counter > 8)
{
$counter = $counter - (($pd['wep_range'] - $pa['wep_range'])*10);
$counter = max(8,$counter);
}
# 鏖战状态下,将基础反击率修正为100
if(isset($pd['is_dfight']) || isset($pa['is_dfight'])) $counter = 100;
# 获取社团技能对反击率的修正(旧)
//$counter *= rev_get_clubskill_bonus_counter($pd['club'],$pd['skills'],$pd,$pa['club'],$pa['skills'],$pa);
# 获取社团技能对反击率的修正(新)
$counter = get_clbskill_counterate($pd,$pa,$active,$counter);
# 获取异常状态对反击率的影响
if(!empty($pd['inf']))
{
foreach ($inf_counter_p as $inf_ky => $value)
{
if(strpos($pd['inf'], $inf_ky)!==false) $counter *= $value;
}
}
//echo "{$pd['nm']}对{$pa['nm']}的反击率是{$counter}%<br>";
return $counter;
}
//计算战场距离:仅供追击/鏖战机制使用 //计算战场距离:仅供追击/鏖战机制使用
function get_battle_range(&$pa,&$pd,$active) function get_battle_range(&$pa,&$pd,$active)
{ {
...@@ -2584,27 +2157,5 @@ ...@@ -2584,27 +2157,5 @@
if(isset($pd['clbpara']['battle_turns'])) unset($pd['clbpara']['battle_turns']); if(isset($pd['clbpara']['battle_turns'])) unset($pd['clbpara']['battle_turns']);
return; return;
} }
}
//检查是否循环打击流程
function check_loop_rev_attack(&$pa,&$pd,$active)
{
global $log;
$loop = 0;
# 「双响」效果判定
if(isset($pa['bskill_c5_double']))
{
unset($pa['bskill_c5_double']);unset($pa['bskilllog']);
$log .= "<span class=\"yellow\">{$pa['nm']}引爆了预埋的另一组爆炸物!</span><br>";
$loop = 1;
}
# 「海虎」效果判定
if(isset($pa['skill_c12_swell']))
{
$pa['skill_c12_swell'] --;
if(empty($pa['skill_c12_swell'])) unset($pa['skill_c12_swell']);
$log .= "<span class=\"lime\">{$pa['nm']}以雷霆万钧之势再度袭向{$pd['nm']}!</span><br>";
$loop = 1;
}
return $loop;
}
?> ?>
\ No newline at end of file
<?php <?php
namespace revattr
{
if(!defined('IN_GAME')) { if(!defined('IN_GAME')) {
exit('Access Denied'); exit('Access Denied');
} }
//include_once GAME_ROOT.'./include/game/dice.func.php';
include_once GAME_ROOT.'./include/game/itemmain.func.php'; include_once GAME_ROOT.'./include/game/itemmain.func.php';
//include_once GAME_ROOT.'./include/game/revclubskills.func.php';
//revattr_extra.func.php: 记录NPC特殊战斗机制...玩家战斗技也先放这里了 嘻嘻 //revattr_extra.func.php: 记录NPC特殊战斗机制...
//Q:为什么要把每个NPC的特殊战斗机制都新建一个函数保存? //Q:为什么要把每个NPC的特殊战斗机制都新建一个函数保存?
//A:也不是每个都要这么干……这个做法主要用于存在大段log、多段判定的机制,分离出来一是方便定位这个NPC的相关机制在哪个阶段执行,二是确保原流程的可读性; //A:也不是每个都要这么干……这个做法主要用于存在大段log、多段判定的机制,分离出来一是方便定位这个NPC的相关机制在哪个阶段执行,二是确保原流程的可读性;
# 技能判定(主动型)
function attr_extra_active_skills(&$pa,&$pd,$active,$sk='')
{
global $log,$cskills,$now;
# 检查主动技合法性
if(isset($pa['bskill']))
{
if(!check_skill_unlock($pa['bskill'],$pa) && !check_skill_cost($pa['bskill'],$pa))
{
$bsk = $pa['bskill'];
$bsk_name = $cskills[$bsk]['name'];
# 扣除怒气
$bsk_cost = get_skillvars($bsk,'ragecost');
if($bsk_cost) $pa['rage'] -= $bsk_cost;
# 成功释放主动技,应用标记
$pa['bskill_'.$bsk] = 1;
$pa['bskilllog'] = "<span class=\"lime\">{$pa['nm']}{$pd['nm']}发动了技能「{$bsk_name}」!</span><br>";
# 限次技每次使用时次数+1
if(get_skilltags($bsk,'limit'))
{
set_skillpara($bsk,'active_t',get_skillpara($bsk,'active_t',$pa['clbpara'])+1,$pa['clbpara']);
}
# 重新判定双系武器的攻击方式
if(isset($cskills[$bsk]['wepk']) && !in_array($pa['wep_kind'],$cskills[$bsk]['wepk']))
{
get_wep_kind($pa,$cskills[$bsk]['wepk'][0]);
}
# 检查是否需要addnews
addnews($now,'bsk_'.$bsk,$pa['name'],$pd['name']);
# 检查是否需要进行logsave
if(!$pd['type'] && $pd['nm']!='你') $pd['logsave'] .= "<span class=\"yellow\">{$pa['name']}</span>对你发动了技能<span class=\"red\">「{$bsk_name}」</span>!";
elseif(!$pa['type'] && $pa['nm']!='你') $pa['logsave'] .= "你对<span class=\"yellow\">{$pd['name']}</span>发动了技能<span class=\"red\">「{$bsk_name}」</span>!";
}
else
{
# 主动技不满足使用条件或来源非法,直接注销标记
unset($pa['bskill']);
}
}
# NPC释放战斗技 暂时先重复写一遍,之后合并到一个函数里
if($pa['type'] && !empty($pa['clbpara']['skill']))
{
# 打乱并遍历pa技能队列 寻找可用战斗技
$npc_skill = $pa['clbpara']['skill'];
shuffle($npc_skill);
foreach($npc_skill as $sk)
{
if(get_skilltags($sk,'battle') && !check_skill_unlock($sk,$pa) && !check_skill_cost($sk,$pa))
{
$bsk = $sk;
$bsk_name = $cskills[$bsk]['name'];
# 扣除怒气
$bsk_cost = get_skillvars($bsk,'ragecost');
if($bsk_cost) $pa['rage'] -= $bsk_cost;
# 成功释放主动技,应用标记
$pa['bskill_'.$bsk] = 1;
$pa['bskilllog'] = "<span class=\"lime\">{$pa['nm']}{$pd['nm']}发动了技能「{$bsk_name}」!</span><br>";
# 限次技每次使用时次数+1
if(get_skilltags($bsk,'limit'))
{
set_skillpara($bsk,'active_t',get_skillpara($bsk,'active_t',$pa['clbpara'])+1,$pa['clbpara']);
}
# 检查是否需要addnews
addnews($now,'bsk_'.$bsk,$pa['name'],$pd['name']);
# 别让NPC放两个技能!
break;
}
}
}
return;
}
# 技能判定(被动型):这里通常只判定技能是否生效,如生效,提供一个标记
function attr_extra_passive_skills(&$pa,&$pd,$active,$sk='')
{
global $cskills,$log;
if(!empty($pa['clbpara']['skill']))
{
$pa['skilllog'] = '';
# 遍历pa技能队列 检查是否解锁
foreach($pa['clbpara']['skill'] as $sk)
{
# passive、buff、inf标签技能通用判定
# 对于解锁技能,如果有特殊触发条件,在这里加入判定,否则会默认给一个触发标记
if((get_skilltags($sk,'passive') || get_skilltags($sk,'buff') || get_skilltags($sk,'inf')) && !check_skill_unlock($sk,$pa))
{
# 「猛击」特殊判定
if($sk == 'c1_crit')
{
$sk_dice = diceroll(99);
# 「偷袭」或「闷棍」技能生效时,「猛击」必定触发;
$sk_obbs = isset($pa['bskill_c1_stalk'])||isset($pa['bskill_c1_bjack']) ? 100 : get_skillvars('c1_crit','rate');
# 成功触发时
if($sk_dice < $sk_obbs) $pa['skill_c1_crit'] = 1;
}
# 「枭眼」特殊判定:射程不小于对方时激活效果
elseif($sk == 'c3_hawkeye' && $pa['wep_range'] >= $pd['wep_range'])
{
$pa['skill_c3_hawkeye'] = 1;
}
# 「护盾」特殊判定:生命值不小于指定百分比时激活一个护盾
elseif($sk == 'c7_shield')
{
$sk_lvl = get_skilllvl('c7_shield',$pa);
$hpalert = get_skillvars('c7_shield','hpalert',$sk_lvl);
if($pa['hp'] <= $pa['mhp']*($hpalert/100))
{
getclubskill('buff_shield',$pa['clbpara']);
set_skillpara('buff_shield','svar',get_skillvars('c7_shield','svar',$sk_lvl),$data['clbpara']);
$pa['skill_buff_shield'] = 1;
//$pa['skilllog'] .= "<span class='lime'>感知到危险,闪烁着淡蓝幽光的护盾自动出现在{$pa['nm']}身旁!<br></span>";
$log .= "<span class='lime'>感知到危险,闪烁着淡蓝幽光的护盾自动出现在{$pa['nm']}身旁!<br></span>";
}
}
# 「暗杀」特殊判定:输出一段破隐log,并丢失buff技能
elseif($sk == 'buff_assassin')
{
$pa['skill_buff_assassin'] = 1;
$pa['skilllog'] .= "<span class='yellow'>{$pa['nm']}从阴影中现出身形,打了{$pd['nm']}一个措手不及!</span><br>";
lostclubskill('buff_assassin',$pa['clbpara']);
}
# 「洞察」特殊判定:熟练度高于对方时触发
elseif($sk == 'c10_insight' && $pa['wep_skill'] > $pd['wep_skill'])
{
$pa['skill_c10_insight'] = 1;
$pa['skilllog'] .= "<span class='yellow'>{$pa['nm']}凭借丰富的经验看穿了{$pd['nm']}的破绽!</span><br>";
}
# 「海虎」特殊判定:
elseif($sk == 'c12_swell')
{
$sk_var = get_skillvars('c12_swell','swellr') * calc_enmity_losshpr($pa,$pd);
$dice = diceroll(99);
if($dice < $sk_var)
{
$pa['skill_c12_swell'] = $pa['hp'] <= $pa['mhp']*0.3 ? 2 : 1;
}
}
# 其他非特判技能,默认给一个触发标记
else
{
$pa['skill_'.$sk] = 1;
//$pa['skill_'.$sk.'_log'] = "";
}
}
# switch标签技能通用判定
if(get_skilltags($sk,'switch') && !empty(get_skillpara($sk,'active',$pa['clbpara'])) && !check_skill_unlock($sk,$pa))
{
$pa['askill_'.$sk] = 1;
}
}
}
return;
}
# 获取社团技能对躲避率(pd是否躲避pa)的定值修正(新)
function get_clbskill_hide_rate_fix(&$pa,&$pd,$r)
{
# pd持有「潜行」时的效果判定:
if(!check_skill_unlock('c5_sneak',$pd))
{
$sk_lvl = get_skilllvl('c5_sneak',$pd);
$sk_r = get_skillvars('c5_sneak','hidegain',$sk_lvl);
$r += $sk_r;
}
# pd持有「天助」时的效果判定:
if(!check_skill_unlock('c6_godsend',$pd))
{
$sk_r = get_skilllvl('c6_godsend','hidegain',$pd['clbpara']);
if(!empty($sk_r)) $r += $sk_r;
}
# pd处于「暗杀」状态下的效果判定:
if(!check_skill_unlock('buff_assassin',$pd))
{
$sk_r = get_skillvars('buff_assassin','hidegain');
$r += $sk_r;
}
# pa持有「瞩目」时的效果判定:
if(!check_skill_unlock('c12_huge',$pa))
{
$sk_r = get_skillvars('c12_huge','hideloss');
$r -= $sk_r;
}
# pd持有「瞩目」时的效果判定:
if(!check_skill_unlock('c12_huge',$pd))
{
$sk_r = get_skillvars('c12_huge','hidegain');
$r -= $sk_r;
}
return $r;
}
# 获取社团技能对先攻率(pa是否先攻pd)的定值修正(新)
function get_clbskill_active_rate_fix(&$pa,&$pd,$r)
{
# pa持有「枭眼」时的效果判定:
if(!check_skill_unlock('c3_hawkeye',$pa))
{
//计算双方射程差
$pa['wep_range'] = get_wep_range($pa);
$pd['wep_range'] = get_wep_range($pd);
if($pa['wep_range'] >= $pd['wep_range'])
{
$sk_r = get_skillvars('c3_hawkeye','actgain');
$r += $sk_r;
}
}
# pd持有「枭眼」时的效果判定:
if(!check_skill_unlock('c3_hawkeye',$pd))
{
//计算双方射程差
$pa['wep_range'] = get_wep_range($pa);
$pd['wep_range'] = get_wep_range($pd);
if($pa['wep_range'] < $pd['wep_range'])
{
$sk_r = get_skillvars('c3_hawkeye','actgain');
$r -= $sk_r;
}
}
# pa持有「潜行」时的效果判定:(只在主动发现敌人时应用)
if(!check_skill_unlock('c5_sneak',$pa))
{
$sk_lvl = get_skilllvl('c5_sneak',$pa);
$sk_r = get_skillvars('c5_sneak','actgain',$sk_lvl);
$r += $sk_r;
}
# pa持有「天助」时的效果判定:(只在主动发现敌人时应用)
if(!check_skill_unlock('c6_godsend',$pa))
{
$sk_r = get_skillpara('c6_godsend','actgain',$pa['clbpara']);
if(!empty($sk_r)) $r += $sk_r;
}
# pa处于「暗杀」状态下的效果判定:
if(!check_skill_unlock('buff_assassin',$pa))
{
$sk_r = get_skillvars('buff_assassin','actgain');
$r += $sk_r;
}
# pa持有「洞察」时的效果判定:(只在主动发现敌人时应用)
if(!check_skill_unlock('c10_insight',$pa) && get_wep_skill($pa) > get_wep_skill($pd))
{
$sk_lvl = get_skilllvl('c10_insight',$pa);
$sk_r = get_skillvars('c10_insight','actgain',$sk_lvl);
$r += $sk_r;
}
return $r;
}
# 获取社团技能对基础反击率的修正(新)
function get_clbskill_counterate(&$pa,&$pd,$active,$counterate)
{
#「直感」效果判定:
if(isset($pa['skill_c2_intuit']))
{
$sk_lvl = get_skilllvl('c2_intuit',$pa);
//获取反击倍率加成
$sk_r = 1 + (get_skillvars('c2_intuit','countergain',$sk_lvl) / 100);
$counterate *= $sk_r;
}
#「臂力」效果判定:
if(isset($pa['skill_c3_pitchpow']))
{
$sk_lvl = get_skilllvl('c3_pitchpow',$pa);
//获取反击倍率加成
$sk_r = 1 + (get_skillvars('c3_pitchpow','countergain',$sk_lvl) / 100);
$counterate *= $sk_r;
}
#「天助」效果判定:
if(isset($pa['skill_c6_godsend']))
{
$sk_r = get_skillpara('c6_godsend','countergain',$pa['clbpara']);
if(!empty($sk_r))
{
$sk_r = 1 + ($sk_r / 100);
$counterate *= $sk_r;
}
}
return $counterate;
}
# 获取社团技能对基础命中率的修正(新)
function get_clbskill_hitrate(&$pa,&$pd,$active,$hitrate)
{
# 加成:
#「潜能」、「暗杀」必中效果判定:
if(isset($pa['bskill_c3_potential']) || isset($pa['skill_buff_assassin']))
{
//原来必中是这个意思……
return 10000;
}
#「直感」效果判定:
if(isset($pa['skill_c2_intuit']))
{
$sk_lvl = get_skilllvl('c2_intuit',$pa);
$sk_r = 1 + (get_skillvars('c2_intuit','accgain',$sk_lvl) / 100);
$hitrate *= $sk_r;
}
#「静息」效果判定:
if(isset($pa['skill_c4_stable']))
{
$sk_lvl = get_skilllvl('c4_stable',$pa);
$sk_r = 1 + (get_skillvars('c4_stable','accgain',$sk_lvl) / 100);
$hitrate *= $sk_r;
}
#「瞄准」效果判定:
if(isset($pa['bskill_c4_aiming']))
{
$sk_r = 1 + (get_skillvars('c4_aiming','accgain') / 100);
$hitrate *= $sk_r;
}
#「穿杨」效果判定:
if(isset($pa['bskill_c4_sniper']))
{
$sk_r = 1 + (get_skillvars('c4_sniper','accgain') / 100);
$hitrate *= $sk_r;
}
#「天运」效果判定:
if(isset($pa['skill_c6_godluck']))
{
$sk_r = get_skillpara('c6_godluck','accgain',$pa['clbpara']);
if(!empty($sk_r))
{
$sk_r = 1 + ($sk_r / 100);
$hitrate *= $sk_r;
}
}
#「洞察」效果判定:
if(isset($pa['skill_c10_insight']))
{
$sk_lvl = get_skilllvl('c10_insight',$pa);
$sk_r = 1 + (get_skillvars('c10_insight','accgain',$sk_lvl) / 100);
$hitrate *= $sk_r;
}
# 减益:
#「枭眼」效果判定:
if(isset($pd['skill_c3_hawkeye']))
{
$sk_r = 1 - (get_skillvars('c3_hawkeye','accloss') / 100);
$hitrate *= $sk_r;
}
#「灵力」效果判定:
if(isset($pd['skill_c9_spirit']))
{
$sk_lvl = get_skilllvl('c9_spirit',$pd);
$sk_r = 1 - (get_skillvars('c9_spirit','accloss',$sk_lvl) / 100);
$hitrate *= $sk_r;
}
#「天运」效果判定:
if(isset($pd['skill_c6_godluck']))
{
$sk_r = get_skillpara('c6_godluck','accloss',$pd['clbpara']);
if(!empty($sk_r))
{
$sk_r = 1 - ($sk_r / 100);
$hitrate *= $sk_r;
}
}
#「洞察」效果判定:
if(isset($pd['skill_c10_insight']))
{
$sk_lvl = get_skilllvl('c10_insight',$pd);
$sk_r = 1 - (get_skillvars('c10_insight','accloss',$sk_lvl) / 100);
$hitrate *= $sk_r;
}
return $hitrate;
}
# 获取社团技能对连击命中率的修正(新)
function get_clbskill_r_hitrate(&$pa,&$pd,$active,$hitrate)
{
# 加成:
#「潜能」效果判定:
if(isset($pa['bskill_c3_potential']))
{
//潜能激活时连击无衰减
return 1;
}
#「直感」效果判定:
if(isset($pa['skill_c2_intuit']))
{
$sk_lvl = get_skilllvl('c2_intuit',$pa);
//获取连击命中率加成
$sk_r = 1 + (get_skillvars('c2_intuit','rbgain',$sk_lvl) / 100);
$hitrate *= $sk_r;
}
#「静息」效果判定:
if(isset($pa['skill_c4_stable']))
{
$sk_lvl = get_skilllvl('c4_stable',$pa);
//获取连击命中率加成
$sk_r = 1 + (get_skillvars('c4_stable','rbgain',$sk_lvl) / 100);
$hitrate *= $sk_r;
}
#「天运」效果判定:
if(isset($pa['skill_c6_godluck']))
{
$sk_r = get_skillpara('c6_godluck','rbgain',$pa['clbpara']);
if(!empty($sk_r))
{
$sk_r = 1 + ($sk_r / 100);
$hitrate *= $sk_r;
}
}
# 减益:
#「枭眼」效果判定:
if(isset($pd['skill_c3_hawkeye']))
{
$sk_r = 1 - (get_skillvars('c3_hawkeye','rbloss') / 100);
$hitrate *= $sk_r;
}
#「灵力」效果判定:
if(isset($pd['skill_c9_spirit']))
{
$sk_lvl = get_skilllvl('c9_spirit',$pd);
$sk_r = 1 - (get_skillvars('c9_spirit','rbloss',$sk_lvl) / 100);
$hitrate *= $sk_r;
}
#「天运」效果判定:
if(isset($pd['skill_c6_godluck']))
{
$sk_r = get_skillpara('c6_godluck','rbloss',$pd['clbpara']);
if(!empty($sk_r))
{
$sk_r = 1 - ($sk_r / 100);
$hitrate *= $sk_r;
}
}
#「洞察」效果判定:
if(isset($pd['skill_c10_insight']))
{
$sk_lvl = get_skilllvl('c10_insight',$pd);
$sk_r = 1 - (get_skillvars('c10_insight','rbloss',$sk_lvl) / 100);
$hitrate *= $sk_r;
}
return $hitrate;
}
# 获取社团技能对致伤率(防具耐久损伤率)的修正(新)
function get_clbskill_infrate(&$pa,&$pd,$active,$infrate)
{
#「破甲」效果判定:
if(isset($pa['skill_c4_break']))
{
$sk_lvl = get_skilllvl('c4_break',$pa);
//获取致伤率加成
$sk_r = 1 + (get_skillvars('c4_break','infrgain',$sk_lvl) / 100);
$infrate *= $sk_r;
}
return $infrate;
}
# 获取社团技能对基础致伤效果(每次致伤会损耗多少点防具耐久)的修正(新)
function get_clbskill_inftimes(&$pa,&$pd,$active,$inftimes)
{
#「破甲」效果判定:
if(isset($pa['skill_c4_break']))
{
$sk_lvl = get_skilllvl('c4_break',$pa);
//获取致伤效果加成
$sk_fix = get_skillvars('c4_break','inftfix',$sk_lvl);
$inftimes += $sk_fix;
}
#「咆哮」效果判定:
if(isset($pa['bskill_c4_roar']))
{
//获取致伤效果加成
$sk_fix = get_skillvars('c4_roar','inftfix');
$inftimes += $sk_fix;
}
return $inftimes;
}
# 获取社团技能对伤害浮动的修正(新)
function get_clbskill_fluc(&$pa,&$pd,$active)
{
#「直感」效果判定:
if(isset($pa['skill_c2_intuit']))
{
$sk_lvl = get_skilllvl('c2_intuit',$pa);
//获取伤害浮动加成
$sk_fix = get_skillvars('c2_intuit','flucgain',$sk_lvl);
return $sk_fix;
}
return 0;
}
# 计算社团技能对单个属性基础伤害的系数补正
function get_clbskill_ex_base_dmg_r(&$pa,&$pd,$active,$key)
{
$ex_dmg_r = 1;
# 「附魔」效果判定:
if(isset($pa['bskill_c3_enchant']))
{
$exdmgarr = get_skillvars('c3_enchant','exdmgarr');
if(isset($exdmgarr[$key]) && !empty(get_skillpara('c3_enchant',$exdmgarr[$key],$pa['clbpara'])))
{
$ex_r = get_skillpara('c3_enchant',$exdmgarr[$key],$pa['clbpara']);
$ex_dmg_r += $ex_r/100;
//echo "【DEBUG】附魔使{$key}伤害提高了{$ex_r}%<br>";
}
}
return $ex_dmg_r;
}
# 获取社团技能对单个属性基础伤害的定值补正
function get_clbskill_ex_base_dmg_fix(&$pa,&$pd,$active,$key)
{
$ex_dmg_fix = 0;
# 「歼灭」效果判定:
if(isset($pa['skill_buff_annihil']))
{
global $ex_wep_dmg;
$sk_var = round($pa['att']/$ex_wep_dmg[$key]);
$ex_dmg_fix += $sk_var;
}
# 「磁暴」效果判定:
if(isset($pa['bskill_c7_electric']) && $key == 'e')
{
$sk_var = get_skillvars('c7_electric','exdmgfix');
$ex_damage_fix += $sk_var;
}
return $ex_dmg_fix;
}
# 背水HP系数
function calc_enmity_losshpr(&$pa,&$pd)
{
$hpr = 1 - ($pa['hp']/$pa['mhp']);
$r = (1 + 2*$hpr) * $hpr;
return $r;
}
# 坚守HP系数
function calc_garrison_losshpr(&$pa,&$pd)
{
$hpr = 1 - ($pa['hp']/$pa['mhp']);
$r = -1 * pow($hpr,3) + 4 * $hpr;
return $r;
}
# 真红暮特殊判定 # 真红暮特殊判定
function attr_extra_19_crimson(&$pa,&$pd,$active,$phase=0) function attr_extra_19_crimson(&$pa,&$pd,$active,$phase=0)
...@@ -1013,5 +472,5 @@ ...@@ -1013,5 +472,5 @@
} }
return; return;
} }
}
?> ?>
\ No newline at end of file
<?php
namespace revbattle
{
if(!defined('IN_GAME')) {
exit('Access Denied');
}
# 计算pa在探索/移动时会遭遇敌人的概率(遇敌率越低,道具发现率越高)
function calc_meetman_rate(&$pa)
{
global $gamestate,$pose_find_modifier,$pls_find_modifier,$weather_find_r;
# 基础遇敌率
$enemyrate = 40;
# 连斗阶段遇敌率+20
if($gamestate == 40){$enemyrate += 20;}
# 死斗阶段遇敌率+40
elseif($gamestate == 50){$enemyrate += 40;}
# 姿态对遇敌率的修正
if(!empty($pose_find_modifier[$pa['pose']])) $enemyrate += $pose_find_modifier[$pa['pose']];
# 天气对遇敌率的修正
if(!empty($weather_find_r['weather'])) $enemyrate += $weather_find_r['weather'];
# 地图场景对遇敌率的修正
if(!empty($pls_find_modifier[$pa['pls']])) $enemyrate += $pls_find_modifier[$pa['pls']];
# 社团技能对遇敌率的修正
$enemyrate = calc_clbskill_meetman_rate($pa,$enemyrate);
return $enemyrate;
}
# pa发现pd时,计算pd被pa发现的概率
function calc_hide_rate(&$pa,&$pd,$mode=0)
{
global $weather,$weather_hide_r,$pls_hide_modifier,$pose_hide_modifier,$tactic_hide_modifier;
# 获取基础躲避率
$hide_r = 0;
# 计算天气对躲避率的修正
$wth_r = $weather_hide_r[$weather] ?: 0 ;
# 计算地点对躲避率的修正
$pls_r = $pls_hide_modifier[$pd['pls']] ?: 0 ;
# 计算pd姿态对于躲避率的修正:
$pose_r = $pose_hide_modifier[$pd['pose']] ?: 0;
# 计算pd策略对于躲避率的修正:
$tac_r = $tactic_hide_modifier[$pd['tactic']] ?: 0;
# 基础汇总:
$hide_r += $wth_r + $pose_r + $tac_r;
# 社团技能对躲避率的修正
$hide_r = calc_clbskill_hide_rate($pa,$pd,$hide_r);
return $hide_r;
}
# pd没能躲避pa时,双方进入战斗;计算pa对pd作出先制攻击的概率;
# $mode 0-标准战斗 1-鏖战 2-追击(追击&鏖战基础先制率不受天气姿态影响)
function calc_active_rate(&$pa,&$pd,$mode=0)
{
global $log,$now,$weather,$gamevars,$gamecfg;
global $weather_active_r,$pose_active_modifier,$pose_active_modifier,$active_obbs,$chase_active_obbs;
# 获取基础先攻率:
if(!$mode)
{
$active_r = $active_obbs;
# 计算天气对先攻率的修正:
$wth_ar = $weather_active_r[$weather] ?: 0;
# 计算pa姿态对于先攻率的修正:
$a_pose_ar = $pose_active_modifier[$pa['pose']] ?: 0;
# 计算pd姿态对于先攻率的修正:
$d_pose_ar = $pose_active_modifier[$pd['pose']] ?: 0;
# 基础汇总:
$active_r += $wth_ar + $a_pose_ar - $d_pose_ar;
}
else
{
$active_r = $chase_active_obbs;
# 计算追击状态下pa对pd的先攻加成。默认:战场距离*10%
if($mode == 2) $range_ar += get_battle_range($pa,$pd,1) * 10;
}
# 社团技能对先攻率的修正
$active_r = calc_clbskill_active_rate($pa,$pd,$active_r);
# 社团技能对先攻率的修正(定值)
$active_r = calc_clbskill_active_rate_fix($pa,$pd,$active_r);
# 计算先攻率上下限:
$active_r = max(min($active_r,96),4);
return $active_r;
}
# 计算社团技能对pa遇敌率的修正
function calc_clbskill_meetman_rate(&$pa,$enemyrate)
{
# 社团技能修正(新)
# 「专注」效果判定
if(!empty($pa['clbpara']['skill']) && !check_skill_unlock('c5_focus',$pa))
{
# 探人模式遇敌率提升
if(get_skillpara('c5_focus','choice',$pa['clbpara']) == 1)
{
$sk_var = get_skillvars('c5_focus','meetgain');
$enemyrate += $sk_var;
}
# 探物模式遇敌率降低
elseif(get_skillpara('c5_focus','choice',$pa['clbpara']) == 2)
{
$sk_var = get_skillvars('c5_focus','itmgain');
$enemyrate -= $sk_var;
}
}
return $enemyrate;
}
# 计算社团技能对躲避率(pd是否躲避pa)的修正(加算)
function calc_clbskill_hide_rate(&$pa,&$pd,$r)
{
# pd持有「潜行」时的效果判定:
if(!check_skill_unlock('c5_sneak',$pd))
{
$sk_lvl = get_skilllvl('c5_sneak',$pd);
$sk_r = get_skillvars('c5_sneak','hidegain',$sk_lvl);
$r += $sk_r;
}
# pd持有「天助」时的效果判定:
if(!check_skill_unlock('c6_godsend',$pd))
{
$sk_r = get_skilllvl('c6_godsend','hidegain',$pd['clbpara']);
if(!empty($sk_r)) $r += $sk_r;
}
# pd处于「暗杀」状态下的效果判定:
if(!check_skill_unlock('buff_assassin',$pd))
{
$sk_r = get_skillvars('buff_assassin','hidegain');
$r += $sk_r;
}
# pa持有「瞩目」时的效果判定:
if(!check_skill_unlock('c12_huge',$pa))
{
$sk_r = get_skillvars('c12_huge','hideloss');
$r -= $sk_r;
}
# pd持有「瞩目」时的效果判定:
if(!check_skill_unlock('c12_huge',$pd))
{
$sk_r = get_skillvars('c12_huge','hidegain');
$r -= $sk_r;
}
return $r;
}
# 计算社团技能对先攻率(pa是否先攻pd)的修正
function calc_clbskill_active_rate(&$pa,&$pd,$r)
{
global $log,$weather,$gamevars,$inf_active_p;
# pa持有「枭眼」时的效果判定:
if(!check_skill_unlock('c3_hawkeye',$pa))
{
//计算双方射程差
$pa['wep_range'] = \revattr\get_wep_range($pa);
$pd['wep_range'] = \revattr\get_wep_range($pd);
if($pa['wep_range'] >= $pd['wep_range'])
{
$sk_r = get_skillvars('c3_hawkeye','actgain');
$r += $sk_r;
}
}
# pd持有「枭眼」时的效果判定:
if(!check_skill_unlock('c3_hawkeye',$pd))
{
//计算双方射程差
$pa['wep_range'] = \revattr\get_wep_range($pa);
$pd['wep_range'] = \revattr\get_wep_range($pd);
if($pa['wep_range'] < $pd['wep_range'])
{
$sk_r = get_skillvars('c3_hawkeye','actgain');
$r -= $sk_r;
}
}
# pa持有「潜行」时的效果判定:(只在主动发现敌人时应用)
if(!check_skill_unlock('c5_sneak',$pa))
{
$sk_lvl = get_skilllvl('c5_sneak',$pa);
$sk_r = get_skillvars('c5_sneak','actgain',$sk_lvl);
$r += $sk_r;
}
# pa持有「天助」时的效果判定:(只在主动发现敌人时应用)
if(!check_skill_unlock('c6_godsend',$pa))
{
$sk_r = get_skillpara('c6_godsend','actgain',$pa['clbpara']);
if(!empty($sk_r)) $r += $sk_r;
}
# pa处于「暗杀」状态下的效果判定:
if(!check_skill_unlock('buff_assassin',$pa))
{
$sk_r = get_skillvars('buff_assassin','actgain');
$r += $sk_r;
}
# pa持有「洞察」时的效果判定:(只在主动发现敌人时应用)
if(!check_skill_unlock('c10_insight',$pa) && get_wep_skill($pa) > get_wep_skill($pd))
{
$sk_lvl = get_skilllvl('c10_insight',$pa);
$sk_r = get_skillvars('c10_insight','actgain',$sk_lvl);
$r += $sk_r;
}
# 光玉雨特殊效果判定:
if($weather == 18 && $gamevars['wth18pid'] == $pa['pid'])
{
# 计算雨势
$wthlastime = $now - $gamevars['wth18stime'];
# 雨势在前7分钟递增,后3分钟递减
$wthlastime = $wthlastime <= 420 ? $wthlastime : 600 - $wthlastime;
$wthpow = min(7,max(1,round($wthlastime / 60)));
# 效力加成
$r += diceroll($wthpow) + diceroll($wthpow);
}
# pa存在异常状态时:
#(pd身上的异常状态不会影响pa的先制率,这个机制以后考虑改掉)
if(!empty($pa['inf']))
{
$inf_ar = 1;
foreach ($inf_active_p as $inf_ky => $value)
{
if(strpos($pa['inf'], $inf_ky)!==false){$inf_ar *= $value;}
}
$r *= $inf_ar;
}
return $r;
}
# 计算社团技能对先攻率(pa是否先攻pd)的修正(定值)
function calc_clbskill_active_rate_fix(&$pa,&$pd,$r)
{
global $log;
# pd处于「眩晕」状态下的效果判定:
if(!check_skill_unlock('inf_dizzy',$pd))
{
$log.="{$pd['name']}正处于眩晕状态!<br>";
$r = 100;
}
return $r;
}
}
?>
\ No newline at end of file
<?php <?php
namespace revbattle
{
if(!defined('IN_GAME')) { if(!defined('IN_GAME')) {
exit('Access Denied'); exit('Access Denied');
} }
// 处理从界面传回的战斗相关指令,在战斗开始前的最后一道准备工序 include_once GAME_ROOT.'./include/game/revbattle.calc.php';
include_once GAME_ROOT.'./include/game/revcombat.func.php';
# 处理从界面传回的战斗相关指令,包含以下两种情况:
# 1.主动遇敌先制发现敌人;
# 2.与敌人战斗结束、显示战斗报告后,点击确认按钮时身上存在额外action,跳转回此函数判断接下来该显示哪一页面;
function revbattle_prepare($command,$message=NULL,$data=NULL) function revbattle_prepare($command,$message=NULL,$data=NULL)
{ {
global $log,$mode,$plsinfo,$db,$tablepre,$action_list; global $log,$mode,$plsinfo,$db,$tablepre,$action_list;
...@@ -55,17 +63,13 @@ ...@@ -55,17 +63,13 @@
# 输入切换武器指令时,切换武器 # 输入切换武器指令时,切换武器
if ($command == 'changewep') if ($command == 'changewep')
{ {
change_wep_in_battle(); include_once GAME_ROOT . './include/game/itemmain.func.php';
change_subwep();
findenemy_rev($edata); findenemy_rev($edata);
return; return;
} }
# 准备进入标准战斗流程 # 准备进入标准战斗流程
include_once GAME_ROOT.'./include/game/revcombat.func.php'; include_once GAME_ROOT.'./include/game/revcombat.func.php';
# 敌人身上存在时效性状态时,检查时效性状态
if(!empty($edata['clbpara']['lasttimes']))
{
$edata = check_skilllasttimes($edata);
}
# 追击流程 # 追击流程
if ($command == 'chase' || $command == 'pchase' || $command == 'dfight') if ($command == 'chase' || $command == 'pchase' || $command == 'dfight')
{ {
...@@ -78,20 +82,20 @@ ...@@ -78,20 +82,20 @@
//$log .= "你逃跑了。"; //$log .= "你逃跑了。";
$flag = escape_from_enemy($data,$edata); $flag = escape_from_enemy($data,$edata);
if($flag) $mode = 'command'; if($flag) $mode = 'command';
else rev_combat_prepare($data,$edata,0); else \revcombat\rev_combat_prepare($data,$edata,0);
return; return;
} }
# 重新遭遇视野中的敌人 # 重新遭遇视野中的敌人
if ($command == 'focus') if ($command == 'focus')
{ {
// 迎战视野中的敌人先制率-40 // 迎战视野中的敌人先制率-40
$active_r = min(4,get_active_r_rev($data,$edata)-40); $active_r = min(4,calc_active_rate($data,$edata)-40);
$active_dice = diceroll(99); $active_dice = diceroll(99);
if($active_dice < $active_r){ if($active_dice < $active_r){
$action = 'enemy'; $bid = $edata['pid']; $action = 'enemy'; $bid = $edata['pid'];
findenemy_rev($edata); findenemy_rev($edata);
}else { }else {
rev_combat_prepare($edata,$data,0); \revcombat\rev_combat_prepare($edata,$data,0);
} }
return; return;
} }
...@@ -126,7 +130,7 @@ ...@@ -126,7 +130,7 @@
# 添加协战标记 # 添加协战标记
$cdata['is_coveratk'] = 1; $cdata['is_coveratk'] = 1;
# 去打人吧! # 去打人吧!
rev_combat_prepare($cdata,$edata,1); \revcombat\rev_combat_prepare($cdata,$edata,1);
return; return;
} }
# 指派佣兵攻击敌人 # 指派佣兵攻击敌人
...@@ -154,36 +158,38 @@ ...@@ -154,36 +158,38 @@
# 是否要检查先后手? # 是否要检查先后手?
if(isset($message) && $message == 'noactive') if(isset($message) && $message == 'noactive')
{ {
$active_r = get_active_r_rev($mdata,$edata); $message = '';
$active_r = calc_active_rate($mdata,$edata);
$active_dice = diceroll(99); $active_dice = diceroll(99);
if($active_dice < $active_r) if($active_dice < $active_r)
{ {
rev_combat_prepare($mdata,$edata,1); \revcombat\rev_combat_prepare($mdata,$edata,1);
} }
else else
{ {
$log .= "<span class='yellow'>但是敌人早已做好了准备!</span><br>"; $log .= "<span class='yellow'>但是敌人早已做好了准备!</span><br>";
rev_combat_prepare($edata,$mdata,0); \revcombat\rev_combat_prepare($edata,$mdata,0);
} }
} }
else else
{ {
rev_combat_prepare($mdata,$edata,1); \revcombat\rev_combat_prepare($mdata,$edata,1);
} }
} }
# 没有佣兵,你自己上吧! # 没有佣兵,你自己上吧!
else else
{ {
rev_combat_prepare($data,$edata,1); \revcombat\rev_combat_prepare($data,$edata,1);
} }
return; return;
} }
if(!empty($message)) $data['message'] = $message;
# 上述流程没有拦截,直接进入标准战斗流程……可能会有问题? # 上述流程没有拦截,直接进入标准战斗流程……可能会有问题?
rev_combat_prepare($data,$edata,1,$command); \revcombat\rev_combat_prepare($data,$edata,1,$command);
return; return;
} }
//发现敌人 # 主动发现敌人时,初始化战斗界面(包含初始化左侧页面与初始化右侧战斗按钮)
function findenemy_rev($edata) function findenemy_rev($edata)
{ {
global $db,$tablepre,$log,$mode,$main,$cmd,$battle_title,$attinfo,$skillinfo,$nosta,$cskills; global $db,$tablepre,$log,$mode,$main,$cmd,$battle_title,$attinfo,$skillinfo,$nosta,$cskills;
...@@ -275,7 +281,32 @@ ...@@ -275,7 +281,32 @@
return; return;
} }
//发现中立NPC $kind 0=中立单位 1=友军 # 战斗中逃跑
function escape_from_enemy(&$pa,&$pd)
{
global $fog,$action,$clbpara,$chase_escape_obbs,$log;
//include_once GAME_ROOT.'./include/game/dice.func.php';
# 在受追击/鏖战状态下逃跑有概率失败
if($action == 'pchase' || $action == 'dfight')
{
$escape_dice = diceroll(99);
if($escape_dice < $chase_escape_obbs)
{
$log .= "你尝试逃跑,但是敌人在你身后紧追不舍!<br>";
$pa['fail_escape'] = 1;
return 0;
}
}
$log .= "你逃跑了。<br>";
$action = ''; $bid = 0;
//逃跑后在视野里记录敌人
$nm = $fog ? '???' : $pd['name'];
check_add_searchmemory($pd['pid'],'enemy',$nm,$pa);
unset($clbpara['battle_turns']);
return 1;
}
# 主动发现中立单位时,初始化战斗界面(包含初始化左侧页面与初始化右侧信息栏)
function findneut(&$edata,$kind=0) function findneut(&$edata,$kind=0)
{ {
global $db,$tablepre,$pdata; global $db,$tablepre,$pdata;
...@@ -323,7 +354,7 @@ ...@@ -323,7 +354,7 @@
return; return;
} }
// 初始化战斗界面标题 # 初始化战斗界面标题
function init_battle_title($pa,$pd,$ismeet=0) function init_battle_title($pa,$pd,$ismeet=0)
{ {
if(strpos($pa['action'],'chase')!==false) if(strpos($pa['action'],'chase')!==false)
...@@ -342,7 +373,7 @@ ...@@ -342,7 +373,7 @@
return $title; return $title;
} }
// 初始化战斗界面log # 初始化战斗界面log
function init_battle_log($pa,$pd,$ismeet=0) function init_battle_log($pa,$pd,$ismeet=0)
{ {
global $fog; global $fog;
...@@ -375,77 +406,5 @@ ...@@ -375,77 +406,5 @@
} }
return $battle_log; return $battle_log;
} }
}
//战斗中逃跑
function escape_from_enemy(&$pa,&$pd)
{
global $fog,$action,$clbpara,$chase_escape_obbs,$log;
//include_once GAME_ROOT.'./include/game/dice.func.php';
# 在受追击/鏖战状态下逃跑有概率失败
if($action == 'pchase' || $action == 'dfight')
{
$escape_dice = diceroll(99);
if($escape_dice < $chase_escape_obbs)
{
$log .= "你尝试逃跑,但是敌人在你身后紧追不舍!<br>";
$pa['fail_escape'] = 1;
return 0;
}
}
$log .= "你逃跑了。<br>";
$action = ''; $bid = 0;
//逃跑后在视野里记录敌人
$nm = $fog ? '???' : $pd['name'];
check_add_searchmemory($pd['pid'],'enemy',$nm,$pa);
unset($clbpara['battle_turns']);
return 1;
}
//战斗中切换武器
function change_wep_in_battle($s=2)
{
global $log,$nosta;
global $wep,$wepk,$wepe,$weps,$wepsk;
global $wep2,$wep2k,$wep2e,$wep2s,$wep2sk;
# 初始化主武器名
$eqp = 'wep';
# 初始化副武器名
$seqp = 'wep'.$s;
$seqpk = $seqp.'k';
$seqpe = $seqp.'e';
$seqps = $seqp.'s';
$seqpsk = $seqp.'sk';
# 保存副武器数据
$swep=${$seqp}; $swepk=${$seqpk};
$swepe=${$seqpe}; $sweps=${$seqps}; $swepsk=${$seqpsk};
# 主武器为空、副武器不为空的情况下,直接替换为副武器
if(($wepk == 'WN' || !$weps) && ($swepk != 'WN'))
{
${$eqp} = $swep; ${$seqp} = '拳头';
${$eqp.'k'} = $swepk; ${$seqpk} = 'WN';
${$eqp.'e'} = $swepe; ${$seqpe} = 0;
${$eqp.'s'} = $sweps; ${$seqps} = $nosta;
${$eqp.'sk'} = $swepsk; ${$seqpsk} = '';
$log.="你将{$wep}拿在了手上。<br>";
}
# 主武器不为空的情况下,副武器替换为主武器
elseif($wepk != 'WN')
{
${$seqp} = ${$eqp}; ${$eqp} = $swep;
${$seqpk} = ${$eqp.'k'}; ${$eqp.'k'} = $swepk;
${$seqpe} = ${$eqp.'e'}; ${$eqp.'e'} = $swepe;
${$seqps} = ${$eqp.'s'}; ${$eqp.'s'} = $sweps;
${$seqpsk} = ${$eqp.'sk'}; ${$eqp.'sk'} = $swepsk;
$log.="你将{$wep2}收了起来";
if($wepk != 'WN') $log .=",将{$wep}拿在了手上";
$log.="。<br>";
}
else
{
$log.="你没有装备副武器!去给自己找一个吧!<br>";
}
return;
}
?> ?>
\ No newline at end of file
...@@ -172,7 +172,6 @@ ...@@ -172,7 +172,6 @@
$gamevars['wth18pid'] = $pid; $gamevars['wth18pid'] = $pid;
save_gameinfo(); save_gameinfo();
addnews($now, 'wthchange', $name, $weather, '自己积攒的善德'); addnews($now, 'wthchange', $name, $weather, '自己积攒的善德');
include_once GAME_ROOT.'./include/game/revcombat.func.php';
$sn = 'song'; $sn = 'song';
addnoise($sn,'__',$now,$pls,0,0,$sn); addnoise($sn,'__',$now,$pls,0,0,$sn);
$clbpara['event_bgmbook'] = Array('wth18'); $clbpara['event_bgmbook'] = Array('wth18');
...@@ -633,7 +632,7 @@ ...@@ -633,7 +632,7 @@
# 出生啊! # 出生啊!
$max_rp_dice = $pdata['itme0']+$pdata['itms0'] > 300 ? $pdata['itme0']+$pdata['itms0'] : 300; $max_rp_dice = $pdata['itme0']+$pdata['itms0'] > 300 ? $pdata['itme0']+$pdata['itms0'] : 300;
$rp_dice = rand(300,$max_rp_dice); $rp_dice = rand(300,$max_rp_dice);
include_once GAME_ROOT.'./include/game/revcombat.func.php'; include_once GAME_ROOT.'./include/state.func.php';
rpup_rev($pdata,$rp_dice); rpup_rev($pdata,$rp_dice);
# 做成棍了就没有尸体了 # 做成棍了就没有尸体了
destory_corpse($edata); destory_corpse($edata);
......
<?php <?php
namespace revcombat
{
if(!defined('IN_GAME')) { if(!defined('IN_GAME')) {
exit('Access Denied'); exit('Access Denied');
} }
# 发现率、躲避率、先制率、反击率计算方法 # 计算pa是否在pd的反击射程内
function calc_counter_range(&$pa,&$pd,$active)
{
if(!empty($pa['wep_range']) && $pd['wep_range'] >= $pa['wep_range']) return 1;
# 鏖战状态下无视射程反击(爆系武器除外)
if((isset($pd['is_dfight']) || isset($pa['is_dfight'])) && !empty($pd['wep_range'])) return 1;
#「直感」触发后可以超射程反击:
if(isset($pd['skill_c2_intuit']))
{
$sk_dice = diceroll(99);
$sk_lvl = get_skilllvl('c2_intuit',$pd);
$sk_obbs = get_skillvars('c2_intuit','rangerate',$sk_lvl);
if($sk_dice < $sk_obbs)
{
return 1;
}
}
return 0;
}
# 计算pd成功对pa发起反击的概率
function calc_counter_rate(&$pa,&$pd,$active)
{
global $counter_obbs,$inf_counter_p,$pose_counter_modifier,$tactic_counter_modifier;
# 获取攻击方式的基础反击率:
$counter = $counter_obbs[$pd['wep_kind']];
# 获取姿态、策略对反击率的修正:
$counter += $pose_counter_modifier[$pd['pose']];
$counter += $tactic_counter_modifier[$pd['tactic']];
# 计算双方射程差对反击率的影响:(高射程武器受低射程武器攻击时,反击率下降(双方射程差x10)%,最低不会低于8%)
if($pd['wep_range'] > $pa['wep_range'] && $counter > 8)
{
$counter = $counter - (($pd['wep_range'] - $pa['wep_range'])*10);
$counter = max(8,$counter);
}
# 鏖战状态下,将基础反击率修正为100
if(isset($pd['is_dfight']) || isset($pa['is_dfight'])) $counter = 100;
# 计算社团技能对反击率的修正
$counter = calc_clbskill_counter_rate($pd,$pa,$active,$counter);
//echo "{$pd['nm']}对{$pa['nm']}的反击率是{$counter}%<br>";
return $counter;
}
# 计算社团技能对基础反击率的修正
# 这里传入的第一个参数分别是实际上的pd和pa,所以下面的判定主体都是pa
function calc_clbskill_counter_rate(&$pa,&$pd,$active,$counterate)
{
#「直感」效果判定:
if(isset($pa['skill_c2_intuit']))
{
$sk_lvl = get_skilllvl('c2_intuit',$pa);
//获取反击倍率加成
$sk_r = 1 + (get_skillvars('c2_intuit','countergain',$sk_lvl) / 100);
$counterate *= $sk_r;
}
#「臂力」效果判定:
if(isset($pa['skill_c3_pitchpow']))
{
$sk_lvl = get_skilllvl('c3_pitchpow',$pa);
//获取反击倍率加成
$sk_r = 1 + (get_skillvars('c3_pitchpow','countergain',$sk_lvl) / 100);
$counterate *= $sk_r;
}
#「天助」效果判定:
if(isset($pa['skill_c6_godsend']))
{
$sk_r = get_skillpara('c6_godsend','countergain',$pa['clbpara']);
if(!empty($sk_r))
{
$sk_r = 1 + ($sk_r / 100);
$counterate *= $sk_r;
}
}
# 异常状态对反击率的影响
if(!empty($pa['inf']))
{
foreach ($inf_counter_p as $inf_ky => $value)
{
if(strpos($pa['inf'], $inf_ky)!==false) $counterate *= $value;
}
}
return $counterate;
}
// 判断追击/鏖战/协战机制下双方的先制顺序、并注册对应状态 // 判断追击/鏖战/协战机制下双方的先制顺序、并注册对应状态
// *追击先制率补正:原始先制率+(战场距离x10)% // *追击先制率补正:原始先制率+(战场距离x10)%
...@@ -21,7 +113,7 @@ ...@@ -21,7 +113,7 @@
# 添加鏖战状态 # 添加鏖战状态
$pa['is_dfight'] = $pd['is_dfight'] = 1; $pa['is_dfight'] = $pd['is_dfight'] = 1;
# 获取鏖战状态下pa对pd的先制率 # 获取鏖战状态下pa对pd的先制率
$active_r = get_active_r_rev($pa,$pd,1); $active_r = calc_active_rate($pa,$pd,1);
# 如果pa身上存在逃跑失败的标记,则pa先制率降低50……这是偷懒行为,未来的你记得改掉 # 如果pa身上存在逃跑失败的标记,则pa先制率降低50……这是偷懒行为,未来的你记得改掉
if(isset($pa['fail_escape'])) $active_r -= 50; if(isset($pa['fail_escape'])) $active_r -= 50;
# 判断是否先制 # 判断是否先制
...@@ -33,7 +125,7 @@ ...@@ -33,7 +125,7 @@
# 添加追击状态 # 添加追击状态
$pa['is_chase'] = 1; $pd['is_pchase'] = 1; $pa['is_chase'] = 1; $pd['is_pchase'] = 1;
# 获取追击状态下pa对pd的先制率 # 获取追击状态下pa对pd的先制率
$active_r = get_active_r_rev($pa,$pd,2); $active_r = calc_active_rate($pa,$pd,2);
# 如果pd身上存在逃跑失败的标记,则pa先制率提升50 # 如果pd身上存在逃跑失败的标记,则pa先制率提升50
if(isset($pd['fail_escape'])) $active_r += 50; if(isset($pd['fail_escape'])) $active_r += 50;
# 判断是否先制 # 判断是否先制
...@@ -102,4 +194,6 @@ ...@@ -102,4 +194,6 @@
} }
return; return;
} }
}
?> ?>
\ No newline at end of file
<?php <?php
namespace revcombat
{
if(!defined('IN_GAME')) { if(!defined('IN_GAME')) {
exit('Access Denied'); exit('Access Denied');
} }
//include_once GAME_ROOT.'./include/game/dice.func.php';
include_once GAME_ROOT.'./include/game/attr.func.php';
//include_once GAME_ROOT.'./include/game/combat.func.php';
include_once GAME_ROOT.'./include/game/titles.func.php'; include_once GAME_ROOT.'./include/game/titles.func.php';
include_once GAME_ROOT.'./include/state.func.php';
include_once GAME_ROOT.'./include/game/revcombat_extra.func.php';
include_once GAME_ROOT.'./include/game/revcombat.calc.php'; include_once GAME_ROOT.'./include/game/revcombat.calc.php';
include_once GAME_ROOT.'./include/game/revattr.func.php'; include_once GAME_ROOT.'./include/game/revattr.func.php';
include_once GAME_ROOT.'./include/game/revattr.calc.php';
include_once GAME_ROOT.'./include/game/revattr_extra.func.php';
# 战斗准备流程: # 战斗准备流程:
# pa、pd分别代表先制发现者与被先制发现者; # pa、pd分别代表先制发现者与被先制发现者;
# active用于判断当前的主视角(玩家、战斗界面下方那一栏)对应pa还是pd; # active用于判断当前的主视角(玩家、战斗界面下方那一栏)对应pa还是pd;
# actvie=1代表主视角是pa,否则主视角是pd; # actvie=1代表主视角是pa,否则主视角是pd;
function rev_combat_prepare($pa,$pd,$active,$wep_kind='',$log_print=1) function rev_combat_prepare(&$pa,&$pd,$active,$wep_kind='',$log_print=1)
{ {
global $db,$tablepre,$log,$mode,$main,$cmd,$battle_title; global $db,$tablepre,$log,$mode,$main,$cmd,$battle_title;
...@@ -37,7 +40,7 @@ ...@@ -37,7 +40,7 @@
$main = 'battle_rev'; $main = 'battle_rev';
} }
# 如果传入了主动技参数,在这里登记 # 如果传入了主动技参数,在这里登记,并注销掉攻击类别
if(strpos($wep_kind,'bskill_') === 0) if(strpos($wep_kind,'bskill_') === 0)
{ {
$bskill = substr($wep_kind,7); $bskill = substr($wep_kind,7);
...@@ -45,46 +48,19 @@ ...@@ -45,46 +48,19 @@
$wep_kind = ''; $wep_kind = '';
} }
# 初始化双方的真实攻击方式wep_kind,传入了攻击方式/主动技的情况下,在这里判断传入参数的合法性。 # 登记称谓:之后的流程里已经用不到active了(大概)
get_wep_kind($pd); $pa['nm'] = (!$pa['type'] && $active) ? '你' : $pa['name'];
$pd['wep_range'] = get_wep_range($pd); $pd['nm'] = (!$pd['type'] && !$active && $pa['nm']!=='你') ? '你' : $pd['name'];
$pd['wep_skill'] = get_wep_skill($pd);
$pd['wep_name'] = $pd['wep']; # 初始化双方的攻击相关参数:
get_wep_kind($pa,$wep_kind,$pd['wep_range']); # 依以下次序判定:
$pa['wep_range'] = get_wep_range($pa); # 1.防守方防守方式、武器射程、攻击熟练度、武器名;
$pa['wep_skill'] = get_wep_skill($pa); # 2.进攻方攻击方式、进攻方主动技能参数、武器射程、攻击熟练度、武器名;
$pa['wep_name'] = $pa['wep']; get_attr_wepbase($pa,$pd,$active,$wep_kind);
# 传入pa为玩家、pd为NPC,且存在鏖战/追击标志时,判断战斗流程类型(标准/追击/鏖战/协战)
if(!$pa['type'] && $pd['type'] && (strpos($pa['action'],'dfight')!==false || strpos($pa['action'],'chase')!==false))
{
# 玩家正在追击NPC,或两人进入鏖战状态,判定先攻
if(strpos($pa['action'],'chase')===0 || strpos($pa['action'],'dfight')!==false)
{
# 传入参数,第一位为pa(玩家),第二位为pd(NPC),传出active
$active = check_revcombat_status($pa,$pd,$active);
if($active)
rev_combat($pa,$pd,$active,$log_print);
else
rev_combat($pd,$pa,$active,$log_print);
}
# NPC正在追击玩家,判定NPC是否为先攻
else
{
# 传入参数,第一位为pd(NPC),第二位为pa(玩家),传出1-active
$active = check_revcombat_status($pd,$pa,$active);
if($active)
rev_combat($pd,$pa,1-$active,$log_print);
else
rev_combat($pa,$pd,1-$active,$log_print);
}
}
# 进入标准战斗流程 # 进入标准战斗流程
else
{
rev_combat($pa,$pd,$active,$log_print); rev_combat($pa,$pd,$active,$log_print);
} }
}
# 战斗流程: # 战斗流程:
# 注意:无论任何情况,都不要在rev_combat()执行完之前插入return!如果想要跳过战斗阶段,请使用goto battle_finish_flag; # 注意:无论任何情况,都不要在rev_combat()执行完之前插入return!如果想要跳过战斗阶段,请使用goto battle_finish_flag;
...@@ -98,76 +74,20 @@ ...@@ -98,76 +74,20 @@
# 登记非功能性地点信息时合并隐藏地点 # 登记非功能性地点信息时合并隐藏地点
foreach($hplsinfo as $hgroup=>$hpls) $plsinfo += $hpls; foreach($hplsinfo as $hgroup=>$hpls) $plsinfo += $hpls;
# 登记称谓:之后的流程里已经用不到active了(大概) # 正式进入rev_combat战斗状态后,在判定伤害、反击流程前的事件执行阶段;
$pa['nm'] = (!$pa['type'] && $active) ? '你' : $pa['name']; # 即无论是否反击都只会触发1次的事件,返回值小于0时会直接中断战斗;
$pd['nm'] = (!$pd['type'] && !$active && $pa['nm']!=='你') ? '你' : $pd['name'];
# 在初始化战斗阶段触发的事件。即:无论是否反击都只会触发1次的事件。如果返回值小于0,则中断战斗。
$cp_flag = combat_prepare_events($pa,$pd,$active); $cp_flag = combat_prepare_events($pa,$pd,$active);
if($cp_flag < 0) goto battle_finish_flag; if($cp_flag < 0) goto battle_finish_flag;
# 遇敌log # 正式进入rev_combat战斗状态后,在判定伤害、反击流程前的遇敌log
if($active) combat_prepare_logs($pa,$pd,$active);
{
if(!$pa['type'] && isset($pa['message']))
{
$log.="<span class=\"lime\">{$pa['nm']}大喊着:{$pa['message']}!向<span class=\"red\">{$pd['nm']}</span>发起了攻击!</span><br>";
if (!$pd['type'])
{
$w_log = "<span class=\"lime\">{$pa['name']}对你大喊:{$pa['message']}</span><br>";
logsave ($pd['pid'],$now,$w_log,'c');
}
}
else
{
if(isset($pa['is_chase']))
{
$log .= "{$pa['nm']}再度向<span class=\"red\">{$pd['nm']}</span>发起攻击!<br>";
}
elseif(isset($pa['is_dfight']))
{
$log .= "{$pa['nm']}抓住机会抢先向<span class=\"red\">{$pd['nm']}</span>发起攻击!<br>";
}
elseif(isset($pa['is_coveratk']))
{
$log .= "<span class='yellow'>正当你们打的难解难分之际,{$pa['nm']}抓住机会,向<span class=\"red\">{$pd['nm']}</span>发起突袭!</span><br>";
}
else
{
$log .= "{$pa['nm']}向<span class=\"red\">{$pd['nm']}</span>发起攻击!<br>";
}
}
}
else
{
if(isset($pa['is_chase']))
{
$log .= "<span class=\"red\">{$pa['nm']}</span>再度向{$pd['nm']}袭来!<br>";
}
elseif(isset($pa['is_dfight']))
{
$log .= "但是<span class=\"red\">{$pa['nm']}</span>抢先对{$pd['nm']}发起攻击!<br>";
}
else
{
$log .= "<span class=\"red\">{$pa['nm']}</span>突然向{$pd['nm']}袭来!<br>";
}
}
# 战斗发起者是NPC时
if($pa['type'])
{
$log .= npc_chat_rev ($pa,$pd,'attack');
//换装判定
npc_changewep_rev($pa,$pd,$active);
}
# 打击流程 # 打击流程
# 这里的第一个参数指的是进攻方(造成伤害的一方);第二个参数指的是防守方(承受伤害的一方)。active已经没用了。 # 这里的第一个参数指的是进攻方(造成伤害的一方);第二个参数指的是防守方(承受伤害的一方)。active已经没用了。
# 传参的时候只用考虑参数位置,不用管pa、pd具体是谁。 # 传参的时候只用考虑参数位置,不用管pa、pd具体是谁。
att_loop_flag: att_loop_flag:
$att_dmg = rev_attack($pa,$pd,$active); $att_dmg = rev_attack($pa,$pd,$active);
$att_result = 1;
# 存在暴毙标识:进攻方(pa)在进攻过程中未造成伤害就暴毙,可能是因为触发了武器直死。 # 存在暴毙标识:进攻方(pa)在进攻过程中未造成伤害就暴毙,可能是因为触发了武器直死。
if(isset($pa['gg_flag'])) if(isset($pa['gg_flag']))
{ {
...@@ -177,7 +97,7 @@ ...@@ -177,7 +97,7 @@
$att_result = rev_combat_result($pd,$pa,$active); $att_result = rev_combat_result($pd,$pa,$active);
} }
# 没有暴毙,结算打击伤害 # 没有暴毙,结算打击伤害
elseif(isset($att_dmg)) elseif(!empty($att_dmg))
{ {
//扣血 //扣血
$pd['hp'] = max(0,$pd['hp']-$att_dmg); $pd['hp'] = max(0,$pd['hp']-$att_dmg);
...@@ -186,53 +106,43 @@ ...@@ -186,53 +106,43 @@
} }
# 检查是否循环打击流程:一些特殊技能可能需要此效果 # 检查是否循环打击流程:一些特殊技能可能需要此效果
if($att_result) if(!empty($att_result))
{ {
$att_loop = check_loop_rev_attack($pa,$pd,$active); $att_loop = attack_check_can_loop($pa,$pd,$active);
if($att_loop) goto att_loop_flag; if($att_loop) goto att_loop_flag;
} }
# 反击流程判断:$att_result>0,且敌人非治疗姿态或重视躲藏才会触发反击。 TODO:为反击条件新建一个函数 # pa打击流程结束后,如pd仍存活,且战斗未终止,检查是否进入反击流程
if ($pd['hp']>0 && $att_result>0 && check_can_counter($pa,$pd,$active)) if ($pd['hp']>0 && !empty($att_result))
{
# 反击者是NPC时,进行换装判断
if($pd['type']) npc_changewep_rev($pd,$pa,$active);
if (check_in_counter_range($pa,$pd,$active))
{ {
# 计算反击率 $counter_flag = attack_check_can_counter($pa,$pd,$active);
$counter = get_counter_rev($pa,$pd,$active); if($counter_flag)
# 掷骰
$counter_dice = diceroll(99);
if ($counter_dice < $counter)
{ {
$log .= "<span class=\"red\">{$pd['nm']}的反击!</span><br>"; $log .= "<span class=\"red\">{$pd['nm']}的反击!</span><br>";
if($pd['type']) $log .= npc_chat_rev ($pd,$pa, 'defend' ); # NPC反击前事件
# 反击打击实行 if($pd['type'])
# 因为这时候进攻方(造成伤害)的一方是pd,所以向第一个位置传入pd,向第二个位置(防守方)传入pa。
$pd['is_counter'] = 1; //给pd一个反击标记,代表这是反击造成的伤害
$def_dmg = rev_attack($pd,$pa,1);
}
else
{ {
$pd['cannot_counter'] = 1; npc_changewep_rev($pd,$pa,$active);
$log .= npc_chat_rev ($pd,$pa, 'escape' ); $log .= npc_chat_rev ($pd,$pa, 'defend' );
$log .= "<span class=\"red\">{$pd['nm']}没能抓住机会反击,逃跑了!</span><br>";
} }
# 登记反击标记,表示这次打击属于反击攻击
$pd['is_counter'] = 1;
# 执行反击打击
# 因为这时候进攻方(造成伤害)的一方是pd,所以向第一个位置传入pd,向第二个位置(防守方)传入pa
$def_dmg = rev_attack($pd,$pa,1);
} }
# 不满足射程
else else
{ {
$pd['cannot_counter'] = 1; # 不能反击的原因会在attack_check_can_counter()流程中,被登记在$pd['cannot_counter']内
$log .= npc_chat_rev($pd,$pa, 'cannot' ); if($pd['type'])
$log .= "<span class=\"red\">{$pd['nm']}攻击范围不足,不能反击,逃跑了!</span><br>"; {
if(!empty($pd['cannot_counter'])) $log .= npc_chat_rev ($pd,$pa,$pd['cannot_counter']);
else $pd['cannot_counter'] = 1;
} }
# 输出一段描述不能反击的原因的log
$pd['cannot_counter_log'] = !empty($pd['cannot_counter_log']) ? $pd['cannot_counter_log'] : "<span class=\"red\">{$pd['nm']}转身逃开了!</span><br>";
$log .= "<span class=\"red\">".$pd['cannot_counter_log']."</span><br>";
} }
# 不满足基础反击条件
elseif($pd['hp']>0 && $att_result>0)
{
$pd['cannot_counter'] = 1;
if(isset($pd['cannot_counter_log'])) $log .= "<span class=\"red\">".$pd['cannot_counter_log']."</span><br>";
else $log .= "<span class=\"red\">{$pd['nm']}转身逃开了!</span><br>";
} }
# 存在暴毙标识:反击方(pd)在反击过程中未造成伤害就暴毙,可能是因为触发了武器直死。 # 存在暴毙标识:反击方(pd)在反击过程中未造成伤害就暴毙,可能是因为触发了武器直死。
...@@ -243,7 +153,7 @@ ...@@ -243,7 +153,7 @@
$def_result = rev_combat_result($pa,$pd,$active); $def_result = rev_combat_result($pa,$pd,$active);
} }
# 没有暴毙,结算反击伤害 # 没有暴毙,结算反击伤害
elseif(isset($def_dmg)) elseif(!empty($def_dmg))
{ {
//扣血 //扣血
$pa['hp'] = max(0,$pa['hp']-$def_dmg); $pa['hp'] = max(0,$pa['hp']-$def_dmg);
...@@ -421,18 +331,20 @@ ...@@ -421,18 +331,20 @@
# 获取属性 # 获取属性
$pa['ex_equip_keys'] = $pa['ex_wep_keys'] = Array(); $pa['ex_equip_keys'] = $pa['ex_wep_keys'] = Array();
$pa['ex_equip_keys'] = get_equip_ex_array($pa); //获取pa防具上的所有属性 $pa['ex_equip_keys'] = \revattr\get_equip_ex_array($pa); //获取pa防具上的所有属性
$pa['ex_wep_keys'] = get_wep_ex_array($pa); //获取pa武器、饰品上的所有属性 $pa['ex_wep_keys'] = \revattr\get_wep_ex_array($pa); //获取pa武器、饰品上的所有属性
$pd['ex_equip_keys'] = $pd['ex_wep_keys'] = Array(); $pd['ex_equip_keys'] = $pd['ex_wep_keys'] = Array();
$pd['ex_equip_keys'] = get_equip_ex_array($pd);//获取pd防具上的所有属性 $pd['ex_equip_keys'] = \revattr\get_equip_ex_array($pd);//获取pd防具上的所有属性
$pd['ex_wep_keys'] = get_wep_ex_array($pd);//获取pd武器、饰品上的所有属性 $pd['ex_wep_keys'] = \revattr\get_wep_ex_array($pd);//获取pd武器、饰品上的所有属性
# 技能抽取判定 # 技能抽取判定
if(in_array('+',array_merge($pa['ex_wep_keys'],$pa['ex_equip_keys'])) || in_array('+',array_merge($pd['ex_wep_keys'],$pd['ex_equip_keys']))) if(in_array('+',array_merge($pa['ex_wep_keys'],$pa['ex_equip_keys'])) || in_array('+',array_merge($pd['ex_wep_keys'],$pd['ex_equip_keys'])))
{ {
$log .= "<span class=\"yellow\">技能抽取使双方的武器熟练度在战斗中大幅下降!</span><br>"; $log .= "<span class=\"yellow\">技能抽取使双方的武器熟练度在战斗中大幅下降!</span><br>";
$pa['skdr_flag'] = $pd['skdr_flag'] = 1; $pa['skdr_flag'] = $pd['skdr_flag'] = 1;
# 应用技抽效果
if(!empty($pa['skdr_flag']) || !empty($pd['skdr_flag'])) $pa['wep_skill']=sqrt($pa['wep_skill']);
} }
# 灵魂抽取判定 # 灵魂抽取判定
if(in_array('*',array_merge($pa['ex_wep_keys'],$pa['ex_equip_keys'])) || in_array('*',array_merge($pd['ex_wep_keys'],$pd['ex_equip_keys']))) if(in_array('*',array_merge($pa['ex_wep_keys'],$pa['ex_equip_keys'])) || in_array('*',array_merge($pd['ex_wep_keys'],$pd['ex_equip_keys'])))
...@@ -454,7 +366,8 @@ ...@@ -454,7 +366,8 @@
$pd['ex_keys'] = array_merge($pd['ex_wep_keys'],$pd['ex_equip_keys']); unset($pd['ex_wep_keys']); unset($pd['ex_equip_keys']); $pd['ex_keys'] = array_merge($pd['ex_wep_keys'],$pd['ex_equip_keys']); unset($pd['ex_wep_keys']); unset($pd['ex_equip_keys']);
# 检查是否存在额外属性(可能来源于技能) # 检查是否存在额外属性(可能来源于技能)
get_extra_ex_array($pa); get_extra_ex_array($pd); \revattr\get_extra_ex_array($pa);
\revattr\get_extra_ex_array($pd);
# 在计算命中流程开始前判定的事件,分两种:(以后看情况要不要分成两个函数) # 在计算命中流程开始前判定的事件,分两种:(以后看情况要不要分成两个函数)
# 第一种:进攻方(pa)在进攻前因为某种缘故受到伤害、甚至暴毙(直死、DOT结算等) 。判断是否继续进攻流程; # 第一种:进攻方(pa)在进攻前因为某种缘故受到伤害、甚至暴毙(直死、DOT结算等) 。判断是否继续进攻流程;
...@@ -462,36 +375,26 @@ ...@@ -462,36 +375,26 @@
# 第二种:pa对pd的装备、武器产生影响的特殊攻击(临摹装置、一些特殊的直接伤害等)。 # 第二种:pa对pd的装备、武器产生影响的特殊攻击(临摹装置、一些特殊的直接伤害等)。
# 如果这个阶段让pa或pd的武器发生了改变,记得使用get_wep_kind()刷新真实攻击方式。对武器和装备的破坏请使用weapon_loss()与armor_hurt()函数,以使装备在被破坏后从ex_keys中剔除对应的属性。 # 如果这个阶段让pa或pd的武器发生了改变,记得使用get_wep_kind()刷新真实攻击方式。对武器和装备的破坏请使用weapon_loss()与armor_hurt()函数,以使装备在被破坏后从ex_keys中剔除对应的属性。
# 返回值小于0时中止流程,否则继续。 # 返回值小于0时中止流程,否则继续。
$flag = hitrate_prepare_events($pa,$pd,$active); $flag = \revattr\hitrate_prepare_events($pa,$pd,$active);
if($flag < 0) return $flag; if($flag < 0) return $flag;
# 获取pa真实熟练度 保存在$pa['wep_skill']内
$pa['wep_skill'] = get_wep_skill($pa);
# 应用技抽效果
if(isset($pa['skdr_flag']) || isset($pd['skdr_flag']))
{
$pa['wep_skill']=sqrt($pa['wep_skill']);
}
# 计算武器基础命中率 保存在$pa['hitrate']内 # 计算武器基础命中率 保存在$pa['hitrate']内
$pa['hitrate'] = get_hitrate_rev($pa,$pd,$active); $pa['hitrate'] = \revattr\get_hitrate_rev($pa,$pd,$active);
# 计算命中次数 保存在$pa['hitrate_times']内 # 计算命中次数 保存在$pa['hitrate_times']内
get_hit_time_rev($pa,$pd,$active); \revattr\get_hit_time_rev($pa,$pd,$active);
# 在执行伤害计算前登记武器名 防止武器被消耗掉后不能正常登记击杀信息
$pa['wep_name'] = $pa['wep'];
$log .= "{$pa['nm']}使用{$pa['wep']}<span class=\"yellow\">{$attinfo[$pa['wep_kind']]}</span>{$pd['nm']}!<br>"; $log .= "{$pa['nm']}使用{$pa['wep']}<span class=\"yellow\">{$attinfo[$pa['wep_kind']]}</span>{$pd['nm']}!<br>";
# 战斗技文本 # 战斗技文本
if(isset($pa['bskilllog'])) $log.= $pa['bskilllog']; if(!empty($pa['bskilllog'])) $log.= $pa['bskilllog'];
if(isset($pa['bskilllog2'])) $log.= $pa['bskilllog2']; if(!empty($pa['bskilllog2'])) $log.= $pa['bskilllog2'];
if(!empty($pa['skilllog'])) $log.= $pa['skilllog']; if(!empty($pa['skilllog'])) $log.= $pa['skilllog'];
# 命中次数大于0时 执行伤害判断 # 命中次数大于0时 执行伤害判断
if ($pa['hitrate_times'] > 0) if ($pa['hitrate_times'] > 0)
{ {
//检查是否存在造成不受其他因素影响的固定伤害(例:混沌伤害、直死) //检查是否存在造成不受其他因素影响的固定伤害(例:混沌伤害、直死)
$fix_dmg = get_fix_damage($pa,$pd,$active); $fix_dmg = \revattr\get_fix_damage($pa,$pd,$active);
if(isset($fix_dmg)) if(isset($fix_dmg))
{ {
$damage = $fix_dmg; $damage = $fix_dmg;
...@@ -503,19 +406,19 @@ ...@@ -503,19 +406,19 @@
{ {
# 物理伤害计算部分: # 物理伤害计算部分:
//获取攻击方(pa)的基础攻击力与修正 //获取攻击方(pa)的基础攻击力与修正
$pa['base_att'] = get_base_att($pa,$pd,$active); $pa['base_att'] = \revattr\get_base_att($pa,$pd,$active);
//获取防守方(pd)的基础防御与修正 //获取防守方(pd)的基础防御与修正
$pd['base_def'] = get_base_def($pa,$pd,$active); $pd['base_def'] = \revattr\get_base_def($pa,$pd,$active);
//获取攻击方(pa)的原始伤害 //获取攻击方(pa)的原始伤害
$damage = get_original_dmg_rev ($pa,$pd,$active); $damage = \revattr\get_original_dmg_rev ($pa,$pd,$active);
//获取攻击方(pa)在原始伤害基础上附加的固定伤害(重枪、灵武固伤) //获取攻击方(pa)在原始伤害基础上附加的固定伤害(重枪、灵武固伤)
$damage += get_original_fix_dmg_rev($pa,$pd,$active); $damage += \revattr\get_original_fix_dmg_rev($pa,$pd,$active);
//获取攻击方(pa)对伤害倍率施加的变化(连击、必杀、灵力武器发挥了x%的威力) 返回的是一个数组 每个值是一个单独的系数 //获取攻击方(pa)对伤害倍率施加的变化(连击、必杀、灵力武器发挥了x%的威力) 返回的是一个数组 每个值是一个单独的系数
$damage_p = get_damage_p_rev ($pa,$pd,$active); $damage_p = \revattr\get_damage_p_rev ($pa,$pd,$active);
//获取攻击方(pa)在造成伤害前触发的事件(检查pd身上是否有防御属性,pa是否触发了贯穿、冲击) //获取攻击方(pa)在造成伤害前触发的事件(检查pd身上是否有防御属性,pa是否触发了贯穿、冲击)
deal_damage_prepare_events($pa,$pd,$active); \revattr\deal_damage_prepare_events($pa,$pd,$active);
//获取防守方(pd)对伤害倍率施加的变化(防御属性、持有重枪受伤增加、热恋、同志) 系数保存在同一个数组里,分开2个函数只是为了调整log顺序 //获取防守方(pd)对伤害倍率施加的变化(防御属性、持有重枪受伤增加、热恋、同志) 系数保存在同一个数组里,分开2个函数只是为了调整log顺序
$damage_p = array_merge($damage_p,get_damage_def_p_rev($pa,$pd,$active)); $damage_p = array_merge($damage_p,\revattr\get_damage_def_p_rev($pa,$pd,$active));
//计算物理伤害: //计算物理伤害:
$log.="造成了"; $log.="造成了";
//存在伤害系数队列 //存在伤害系数队列
...@@ -545,23 +448,23 @@ ...@@ -545,23 +448,23 @@
$pa['phy_damage'] = $pdamage; $pa['phy_damage'] = $pdamage;
# 物理伤害计算结束后、加载预受伤事件……: # 物理伤害计算结束后、加载预受伤事件……:
get_hurt_prepare_events($pa,$pd,$active); \revattr\get_hurt_prepare_events($pa,$pd,$active);
# 属性伤害计算部分: # 属性伤害计算部分:
//获取攻击方(pa)能造成的属性伤害类型 //获取攻击方(pa)能造成的属性伤害类型
$pa['ex_attack_keys'] = get_base_ex_att_array($pa,$pd,$active); $pa['ex_attack_keys'] = \revattr\get_base_ex_att_array($pa,$pd,$active);
//攻击方(pa)存在属性伤害: //攻击方(pa)存在属性伤害:
if(!empty($pa['ex_attack_keys'])) if(!empty($pa['ex_attack_keys']))
{ {
//获取攻击方(pa)在造成属性伤害前触发的事件(检查pd身上是否有防御属性,pa是否触发了属穿) //获取攻击方(pa)在造成属性伤害前触发的事件(检查pd身上是否有防御属性,pa是否触发了属穿)
deal_ex_damage_prepare_events($pa,$pd,$active); \revattr\deal_ex_damage_prepare_events($pa,$pd,$active);
//获取攻击方(pa)能造成的属性伤害 //获取攻击方(pa)能造成的属性伤害
$ex_damage = get_original_ex_dmg($pa,$pd,$active); $ex_damage = \revattr\get_original_ex_dmg($pa,$pd,$active);
//攻击方(pa)能造成了多次属性伤害的情况下,进行后续判断 //攻击方(pa)能造成了多次属性伤害的情况下,进行后续判断
if(is_array($ex_damage) || $ex_damage > 1) if(is_array($ex_damage) || $ex_damage > 1)
{ {
//获取攻击方(pa)能造成的属性伤害加成 //获取攻击方(pa)能造成的属性伤害加成
$ex_damage_p = get_ex_dmg_p($pa,$pd,$active); $ex_damage_p = \revattr\get_ex_dmg_p($pa,$pd,$active);
//存在大于1种属性伤害,输出一段 A+B+C=D 样式的文本,并将所有属性伤害保存在 $total_ex_damage 内 //存在大于1种属性伤害,输出一段 A+B+C=D 样式的文本,并将所有属性伤害保存在 $total_ex_damage 内
if(is_array($ex_damage)) if(is_array($ex_damage))
{ {
...@@ -613,7 +516,7 @@ ...@@ -613,7 +516,7 @@
#最终伤害计算部分: #最终伤害计算部分:
//获取最终伤害的系数变化(晶莹、书中虫减伤) //获取最终伤害的系数变化(晶莹、书中虫减伤)
$fin_damage_p = get_final_dmg_p($pa,$pd,$active); $fin_damage_p = \revattr\get_final_dmg_p($pa,$pd,$active);
//最终伤害存在系数队列的情况下,输出一段 AxBxC=D 格式的文本,但是如果最终伤害发生了定值变化,则不会使用这一段文本。 //最终伤害存在系数队列的情况下,输出一段 AxBxC=D 格式的文本,但是如果最终伤害发生了定值变化,则不会使用这一段文本。
if(!empty($fin_damage_p)) if(!empty($fin_damage_p))
{ {
...@@ -625,7 +528,7 @@ ...@@ -625,7 +528,7 @@
} }
} }
//获取最终伤害的定值变化(伤害制御、剔透) //获取最终伤害的定值变化(伤害制御、剔透)
$fin_damage_fix = get_final_dmg_fix($pa,$pd,$active,$damage); $fin_damage_fix = \revattr\get_final_dmg_fix($pa,$pd,$active,$damage);
if($fin_damage_fix != $damage) if($fin_damage_fix != $damage)
{ {
$o_damage = $damage; $o_damage = $damage;
...@@ -646,9 +549,9 @@ ...@@ -646,9 +549,9 @@
//将伤害发送至进行状况 //将伤害发送至进行状况
checkdmg ($pa['name'],$pd['name'],$damage); checkdmg ($pa['name'],$pd['name'],$damage);
//攻击方(pa)造成伤害后的事件(计算反噬伤害) //攻击方(pa)造成伤害后的事件(计算反噬伤害)
attack_finish_events($pa,$pd,$active); \revattr\attack_finish_events($pa,$pd,$active);
//防守方(pd)受到伤害后的事件(防具耐久下降、受伤) //防守方(pd)受到伤害后的事件(防具耐久下降、受伤)
get_hurt_events($pa,$pd,$active); \revattr\get_hurt_events($pa,$pd,$active);
} }
else else
{ {
...@@ -732,711 +635,13 @@ ...@@ -732,711 +635,13 @@
else else
{ {
# 执行扣血后的战斗结算阶段事件 # 执行扣血后的战斗结算阶段事件
rev_combat_result_events($pa,$pd,$active); attack_result_events($pa,$pd,$active);
} }
return 1; return 1;
} }
# 执行不需要考虑复活问题的击杀事件: function checkdmg($p1, $p2, $d)
# 再重复一遍:这里的第一个参数指的是杀人者(敌对方)视角,第二个参数指的是死者(受到伤害者)视角。
function pre_kill_events(&$pa,&$pd,$active,$death)
{
global $log, $now, $db, $gtablepre, $tablepre, $typeinfo, $lwinfo;
// 登记死法
// 传入了数字编号死法
if (is_numeric($death)) {
$pd['state'] = $death;
// 否则按照指定武器类型判断
} elseif ($death == 'N') {
$pd['state'] = 20;
} elseif ($death == 'P') {
$pd['state'] = 21;
} elseif ($death == 'K') {
$pd['state'] = 22;
} elseif ($death == 'G') {
$pd['state'] = 23;
} elseif ($death == 'J') {
$pd['state'] = 23;
} elseif ($death == 'C') {
$pd['state'] = 24;
} elseif ($death == 'D') {
$pd['state'] = 25;
} elseif ($death == 'F') {
$pd['state'] = 29;
} elseif ($death == 'poison') {
$pd['state'] = 26;
} elseif ($death == 'trap') {
$pd['state'] = 27;
} elseif ($death == 'dn') {
$pd['state'] = 28;
} else {
$pd['state'] = 10;
}
//初始化死者信息
$dtype = $pd['type']; $dname = $pd['name']; $dpls = $pd['pls'];
$lwname = $typeinfo [$dtype] . ' ' . $dname;
//初始化NPC遗言
if($dtype)
{
$lastword = is_array($lwinfo[$dtype]) ? $lwinfo[$dtype][$dname] : $lwinfo[$dtype];
}
//初始化玩家遗言
else
{
$result = $db->query ( "SELECT lastword FROM {$gtablepre}users WHERE username ='$dname'");
$lastword = $db->result ( $result, 0 );
}
//向聊天框发送遗言
$db->query ( "INSERT INTO {$tablepre}chat (type,`time`,send,recv,msg) VALUES ('3','$now','$lwname','$dpls','$lastword')" );
//发送news
$kname = $pa['type'] ? $pa['name'] : get_title_desc($pa['nick']).' '.$pa['name'];
//$dname = $pd['type'] ? $pd['name'] : get_title_desc($pd['nick']).' '.$pd['name'];
addnews ($now,'death'.$pd['state'],$dname,$dtype,$kname,$pa['wep_name'],$lastword );
return $lastword;
}
# 执行复活事件:
# 重要的事情要说三次:这里的第一个参数指的是杀人者(敌对方)视角,第二个参数指的是死者(受到伤害者)视角。
function revive_process(&$pa,&$pd,$active)
{
global $log,$weather,$now,$gamevars;
include_once GAME_ROOT.'./include/game/clubslct.func.php';
if(empty($pa['nm'])) $pa['nm'] = $active && !$pa['type'] ? '你' : $pa['name'];
if(empty($pd['nm'])) $pd['nm'] = !$active && !$pd['type'] ? '你' : $pd['name'];
$revival_flag = 0;
$dname = $pd['type'] ? $pd['name'] : get_title_desc($pd['nick']).' '.$pd['name'];
#光玉雨天气下,提供者有概率复活
if (!$revival_flag && $weather == 18 && $gamevars['wth18pid'] == $pd['pid'])
{
# 计算雨势
$wthlastime = $now - $gamevars['wth18stime'];
# 雨势在前7分钟递增,后3分钟递减
$wthlastime = $wthlastime <= 420 ? $wthlastime : 600 - $wthlastime;
$wthpow = min(7,max(1,round($wthlastime / 60)));
# 复活概率:基础10% + 效力x2 最高24%
$wth18_obbs = 10 + diceroll($wthpow) + diceroll($wthpow);
$wth18_dice = diceroll(99);
if($wth18_dice < $wth18_obbs)
{
#奥罗拉复活效果
$revival_flag = 18; //保存复活标记为通过光玉雨复活
addnews($now,'wth18_revival',$dname);
$pd['hp'] += min($pd['mhp'],max($wth18_obbs,1));
$pd['sp'] += min($pd['msp'],max($wth18_obbs,1));
$pd['state'] = 0;
$log.= "<span class=\"lime\">但是,飞舞着的光玉们钻进了{$pd['nm']}的身体,让{$pd['nm']}重新站了起来!</span><br>";;
return $revival_flag;
}
}
#极光天气下,玩家有10%概率、NPC有1%概率无条件复活
if (!$revival_flag && $weather == 17)
{
$aurora_rate = $pd['type'] ? 1 : 10; //玩家10%概率复活
$aurora_dice = diceroll(99);
if($aurora_dice<=$aurora_rate)
{
#奥罗拉复活效果
$revival_flag = 17; //保存复活标记为通过奥罗拉复活
addnews($now,'aurora_revival',$dname);
$pd['hp'] += min($pd['mhp'],max($aurora_dice,1));
$pd['sp'] += min($pd['msp'],max($aurora_dice,1));
$pd['state'] = 0;
$log.= "<span class=\"lime\">但是,空气中弥漫着的奥罗拉让{$pd['nm']}重新站了起来!</span><br>";;
return $revival_flag;
}
}
# 「涅槃」复活:
if (!$revival_flag && isset($pd['skill_c19_nirvana']))
{
# 「涅槃」复活效果:
$revival_flag = 'nirvan'; //保存复活标记为通过技能复活
addnews($now,'revival',$dname);
# 添加「涅槃」激活次数
set_skillpara('c19_nirvana','active_t',get_skillpara('c19_nirvana','active_t',$pd['clbpara'])+1,$pd['clbpara']);
$pd['state'] = 0;
$pd['hp'] = 1; $pd['sp'] = 1;
# 将多出的rp转化为生命和防御力
if($pd['rp'])
{
$tot_rp = abs(round($pd['rp']/2));
if($tot_rp)
{
$pd['mhp'] += $tot_rp; $pd['def'] += $tot_rp;
}
$pd['rp'] = 0;
}
$log .= '<span class="lime">但是,'.$pd['nm'].'涅槃重生了!</span><br>';
return $revival_flag;
}
return $revival_flag;
}
# 执行死透了后的事件:
function final_kill_events(&$pa,&$pd,$active,$last=0)
{
global $log,$now,$alivenum,$deathnum,$db,$gtablepre,$tablepre;
if(empty($pa['nm'])) $pa['nm'] = $active && !$pa['type'] ? '你' : $pa['name'];
if(empty($pd['nm'])) $pd['nm'] = !$active && !$pd['type'] ? '你' : $pd['name'];
$pd['hp'] = 0; $pd['bid'] = $pa['pid']; $pd['action'] = '';
$pd['endtime'] = $pd['deathtime'] = $now;
# 初始化遗言
if (!$pd['type'])
{
//死者是玩家,增加击杀数并保存系统状况。
$pa['killnum'] ++;
$alivenum --;
if(!empty($last)) $log .= "<span class='evergreen'>你用尽最后的力气喊道:“".$last."”</span><br>";
}
else
{
//死者是NPC,加载NPC遗言
if(!empty($last)) $log .= npc_chat_rev ($pd,$pa, 'death' );
}
$deathnum ++;
# 初始化killmsg
if(!$pa['type'])
{
global $db,$tablepre;
$pname = $pa['name'];
$result = $db->query("SELECT killmsg FROM {$gtablepre}users WHERE username = '$pname'");
$killmsg = $db->result($result,0);
if(!empty($killmsg)) $log .= "<span class=\"evergreen\">{$pa['nm']}{$pd['nm']}说:“{$killmsg}”</span><br>";
}
else
{
$log .= npc_chat_rev ($pa,$pd,'kill');
}
# 杀人rp结算
get_killer_rp($pa,$pd,$active);
# 执行死亡事件(灵魂绑定等)
check_death_events($pa,$pd,$active);
# 检查成就 大补丁:击杀者是玩家时才会检查成就
if(!$pa['type'])
{
include_once GAME_ROOT.'./include/game/achievement.func.php';
check_battle_achievement_rev($pa,$pd);
}
# 保存游戏进行状态
include_once GAME_ROOT.'./include/system.func.php';
save_gameinfo();
return;
}
# 特殊死亡事件(灵魂绑定等)
function check_death_events(&$pa,&$pd,$active)
{
global $db,$tablepre,$log,$now,$nosta;
# 静流下线事件:
if($pd['type'] == 15)
{
//静流AI
global $gamevars;
$gamevars['sanmadead'] = 1;
save_gameinfo();
}
# 保存击杀女主的记录
if($pd['type'] == 14)
{
$pa['clbpara']['achvars']['kill_n14'] += 1;
# 不一定是一击秒杀……但是先这样吧^ ^;
if($pd['name'] == '守卫者 静流' && $pa['final_damage'] >= $pd['mhp']) $pa['clbpara']['achvars']['ach505'] = 1;
}
# 保存击杀种火或小兵的记录
if(empty($pa['clbpara']['achvars']['kill_minion']) && ($pd['type'] == 90 || $pd['type'] == 91 || $pd['type'] == 92)) $pa['clbpara']['achvars']['kill_minion'] = 1;
# 成就504,保存在RF高校用过的武器记录
if($pa['pls'] == 2) $pa['clbpara']['achvars']['ach504'][$pa['wep_kind']] = 1;
# 快递被劫事件:
if(isset($pd['clbpara']['post']))
{
$log.="<span class='sienna'>某样东西从{$pd['name']}身上掉了出来……</span><br>";
//获取快递信息
$iid = $pd['clbpara']['postid'];
//获取金主信息
$sponsorid = $pd['clbpara']['sponsor'];
$result = $db->query("SELECT * FROM {$tablepre}gambling WHERE uid = '$sponsorid'");
$sordata = $db->fetch_array($result);
//发一条news 表示快递被劫走了
addnews($now,'gpost_failed',$sordata['uname'],$pd['itm'.$iid]);
//消除快递相关参数
unset($pd['clbpara']['post']);unset($pd['clbpara']['postid']);unset($pd['clbpara']['sponsor']);
//解除快递锁
$db->query("UPDATE {$tablepre}gambling SET bnid=0 WHERE uid='$sponsorid'");
}
# 灵魂绑定事件:
foreach(Array('wep','arb','arh','ara','arf','art') as $equip)
{
// ……我为什么不把这个装备名数组放进resources里……用了一万遍了
if(!empty($pd[$equip.'s']) && strpos($pd[$equip.'sk'],'v')!==false)
{
$log .= "伴随着{$pd['nm']}的死亡,<span class=\"yellow\">{$pd[$equip]}</span>也化作灰烬消散了。<br>";
$pd[$equip] = $pd[$equip.'k'] = $pd[$equip.'sk'] = '';
$pd[$equip.'e'] = $pd[$equip.'s'] = 0;
if($equip == 'wep')
{
$pd[$equip] = '拳头'; $pd[$equip.'k'] = 'WN'; $pd[$equip.'sk'] = '';
$pd[$equip.'e'] = 0; $pd[$equip.'s'] = $nosta;
}
elseif($equip == 'arb')
{
$pd[$equip] = '内衣'; $pd[$equip.'k'] = 'DN'; $pd[$equip.'sk'] = '';
$pd[$equip.'e'] = 0; $pd[$equip.'s'] = $nosta;
}
}
}
for($i=0;$i<=6;$i++)
{
if(!empty($pd['itms'.$i]) && strpos($pd['itmsk'.$i],'v')!==false)
{ {
$log .= "伴随着{$pd['nm']}的死亡,<span class=\"yellow\">{$pd['itm'.$i]}</span>也化作灰烬消散了。<br>";
$pd['itm'.$i] = $pd['itmk'.$i] = $pd['itmsk'.$i] = '';
$pd['itme'.$i] = $pd['itms'.$i] = 0;
}
}
#「掠夺」判定:
if(isset($pa['skill_c4_loot']))
{
//获取抢钱率
$sk_p = get_skillvars('c4_loot','goldr');
$lootgold = $pa['lvl'] * $sk_p;
$log.="<span class='yellow'>「掠夺」使{$pa['nm']}获得了{$lootgold}元!</span><br>";
}
# 「天威」技能判定
if(isset($pa['bskill_c6_godpow']) && $pa['final_damage'] <= $pd['mhp'] * get_skillvars('c6_godpow','mhpr'))
{
$rageback = get_skillvars('c6_godpow','rageback');
if(!empty($rageback))
{
$pa['rage'] = max(255,$pa['rage']+$rageback);
$log .= '<span class="yellow">「天威」使'.$pa['nm'].'的怒气回复了'.$rageback.'点!</span><br>';
}
}
# 「浴血」技能判定
if(isset($pa['skill_c12_bloody']))
{
if($pa['hp'] <= $pa['mhp']*0.3) $sk_lvl = 2;
elseif($pa['hp'] <= $pa['mhp']*0.5) $sk_lvl = 1;
else $sk_lvl = 0;
$sk_att_vars = get_skillvars('c12_bloody','attgain',$sk_lvl);
$sk_def_vars = get_skillvars('c12_bloody','defgain',$sk_lvl);
$pa['att'] += $sk_att_vars; $pa['def'] += $sk_def_vars;
$log .= '<span class="yellow">「浴血」使'.$pa['nm'].'的攻击增加了'.$sk_att_vars.'点,防御增加了'.$sk_def_vars.'点!</span><br>';
}
# 佣兵死亡时,自动解除与雇主的雇佣关系
if(isset($pd['clbpara']['oid']))
{
$odata = fetch_playerdata_by_pid($pd['clbpara']['oid']);
include_once GAME_ROOT.'./include/game/revclubskills_extra.func.php';
$log .= "<span clas='red'>由于战死,";
skill_merc_fire('c11_merc',$pd['clbpara']['mkey'],$pd,1);
}
# 灵俑死亡时,从创造者的灵俑队列中删除
if(isset($pd['clbpara']['zombieoid']))
{
$odata = fetch_playerdata_by_pid($pd['clbpara']['zombieoid']);
$mkey = array_search($pd['pid'],$odata['clbpara']['mate']);
unset($odata['clbpara']['mate'][$mkey]);
$zkey = array_search($pd['pid'],$odata['clbpara']['zombieid']);
unset($odata['clbpara']['zombieid'][$zkey]);
player_save($odata);
$w_log = "<span class=\"grey\">你的灵俑{$pd['name']}归于尘土了……</span><br>";
logsave($odata['pid'],$now,$w_log,'c');
}
return;
}
# 战斗怒气结算
function rgup_rev(&$pa,&$pd,$active)
{
# 攻击命中的情况下,计算pa(攻击方)因攻击行为获得的怒气
if($pa['hitrate_times'] > 0)
{
# pa(攻击方)拥有重击辅助属性,每次攻击额外获得1~2点怒气
if(!empty($pa['ex_keys']) && in_array('c',$pa['ex_keys']))
{
$pa_rgup = rand(1,2);
$pa['rage'] = min(255,$pa['rage']+$pa_rgup);
# 成功发动战斗技时,额外返还10%怒气
if(isset($pa['bskill']) && isset($pa['bskill_'.$pa['bskill']]))
{
$bsk = $pa['bskill'];
$bsk_cost = get_skillvars($bsk,'ragecost');
if($bsk_cost)
{
$pa['rage'] += round($bsk_cost*0.1);
# 必杀技能额外返还15点怒气
if($bsk == 'c9_lb') $pa['rage'] += get_skillvars('c9_lb','rageback');
}
}
}
}
# 无论攻击是否命中,计算pd(防守方)因挨打获得的怒气
$rgup = round(($pa['lvl'] - $pd['lvl'])/3);
# 单次获得怒气上限:15
$rgup = min(15,max(1,$rgup));
# 「灭气」技能效果
if(isset($pd['skill_c1_burnsp'])) $rgup += rand(1,2);
$pd['rage'] = min(255,$pd['rage']+$rgup);
return;
}
# rp结算
function rpup_rev(&$pa,$rpup)
{
# 「转业」效果判定
if(!check_skill_unlock('c19_reincarn',$pa))
{
$sk = 'c19_reincarn';
$sk_lvl = get_skilllvl($sk,$pa);
if($rpup > 0)
{
$sk_var = get_skillvars($sk,'rpgain',$sk_lvl);
$rpup = round($rpup*(1-($sk_var/100)));
}
else
{
$sk_var = get_skillvars($sk,'rploss',$sk_lvl);
$rpup = round($rpup*(1+($sk_var/100)));
}
}
$pa['rp'] += $rpup;
}
# 战斗经验结算
function expup_rev(&$pa,&$pd,$active)
{
global $log,$baseexp;
# 攻击命中的情况下,计算获得经验
if($pa['hitrate_times'] > 0)
{
$expup = round ( ($pd['lvl'] - $pa['lvl']) / 3 );
$expup = $expup > 0 ? $expup : 1;
}
# 攻击未命中,也许有其他渠道获得经验
else
{
#「反思」技能效果
if(isset($pa['skill_c5_review'])) $expup = 1;
}
if(isset($pa['bskill_c10_decons']) && $pa['final_damage'] > $pd['hp'])
{
$sk_up = ceil($pd['lvl'] - ($pa['lvl']*0.15));
$log.='<span class="yellow">「解构」使'.$pa['nm'].'获得了额外'.$sk_up.'点经验!</span><br>';
$expup += $sk_up;
}
if(!empty($expup)) $pa['exp'] += $expup;
//$log .= "$isplayer 的经验值增加 $expup 点<br>";
//升到下级所需的exp 直接在这里套公式计算 不用global了
$pa['upexp'] = round(($pa['lvl']*$baseexp)+(($pa['lvl']+1)*$baseexp));
if ($pa['exp'] >= $pa['upexp'])
{
lvlup_rev ($pa,$pd,$active);
}
return;
}
# 战斗等级提升
function lvlup_rev (&$pa,&$pd,$active)
{
global $log,$baseexp,$upexp;
if(empty($pa['nm'])) $pa['nm'] = $active ? '你' : $pa['name'];
$up_exp_temp = round ( (2 * $pa['lvl'] + 1) * $baseexp );
if ($pa['exp'] >= $up_exp_temp && $pa['lvl'] < 255)
{
$sklanginfo = Array ('wp' => '殴熟', 'wk' => '斩熟', 'wg' => '射熟', 'wc' => '投熟', 'wd' => '爆熟', 'wf' => '灵熟', 'all' => '全系熟练度' );
$sknlist = Array (1 => 'wp', 2 => 'wk', 3 => 'wc', 4 => 'wg', 5 => 'wd', 9 => 'wf', 12 => 'all' );
$skname = isset($sknlist[$pa['club']]) ? $sknlist[$pa['club']] : 0;
//升级判断
$lvup = 1 + floor (($pa['exp'] - $up_exp_temp)/$baseexp/2);
$lvup = $lvup > 255 - $pa['lvl'] ? 255 - $pa['lvl'] : $lvup;
$lvuphp = $lvupatt = $lvupdef = $lvupskill = $lvupsp = $lvupspref = 0;
//升级数值计算
for($i = 0; $i < $lvup; $i += 1)
{
if ($pa['club'] == 12) {
$lvuphp += rand ( 14, 18 );
} else {
$lvuphp += rand ( 8, 10 );
}
$lvupsp += rand( 4,6);
if ($pa['club'] == 12) {
$lvupatt += rand ( 4, 6 );
$lvupdef += rand ( 5, 8 );
} else {
$lvupatt += rand ( 2, 4 );
$lvupdef += rand ( 3, 5 );
}
if ($skname == 'all') {
$lvupskill += rand ( 2, 4 );
}elseif ($skname == 'wf') {
$lvupskill += rand ( 3, 5 );
}elseif ($skname == 'wd') {
$lvupskill += rand ( 6, 8 );
}elseif($skname){
$lvupskill += rand ( 4, 6 );
}
$lvupspref += round($pa['msp'] * 0.1);
}
//应用升级
$pa['lvl'] += $lvup;
$up_exp_temp = round ( (2 * $pa['lvl'] + 1) * $baseexp );
if ($pa['lvl'] >= 255) {
$pa['lvl'] = 255;
$pa['exp'] = $up_exp_temp;
}
$pa['upexp'] = $up_exp_temp;
$pa['hp'] += $lvuphp;
$pa['mhp'] += $lvuphp;
$pa['sp'] += $lvupsp;
$pa['msp'] += $lvupsp;
$pa['att'] += $lvupatt;
$pa['def'] += $lvupdef;
$pa['skillpoint'] += $lvup;
if(!empty($skname))
{
if ($skname == 'all') {
$pa['wp'] += $lvupskill;
$pa['wk'] += $lvupskill;
$pa['wg'] += $lvupskill;
$pa['wc'] += $lvupskill;
$pa['wd'] += $lvupskill;
$pa['wf'] += $lvupskill;
} elseif ($skname) {
$pa[$skname] += $lvupskill;
}
}
$pa['sp'] = min($lvupspref+$pa['sp'],$pa['msp']);
if ($skname) {
$sklog = ",{$sklanginfo[$skname]}+{$lvupskill}";
}
$lvlup_log = "<span class=\"yellow\">{$pa['nm']}升了{$lvup}级!生命上限+{$lvuphp},体力上限+{$lvupsp},攻击+{$lvupatt},防御+{$lvupdef}";
if(isset($sklog)) $lvlup_log .= $sklog;
$lvlup_log .= ",体力恢复了{$lvupspref},获得了{$lvup}点技能点!</span><br>";
if(!$pa['type'])
{
if($pa['nm'] == '你') $log.= $lvlup_log;
else $pa['lvlup_log'] = $lvlup_log;
}
} elseif ($pa['lvl'] >= 255) {
$pa['lvl'] = 255;
$pa['exp'] = $up_exp_temp;
}
$upexp = round(($pa['lvl']*$baseexp)+(($pa['lvl']+1)*$baseexp));
return;
}
# NPC自动换装
#说实话没有完全看懂,但是能跑就行
function npc_changewep_rev(&$pa,&$pd,$acitve)
{
global $now,$log;
global $rangeinfo,$ex_dmg_def;
if(!$pa['type'] || $pa['club'] != 98) return;
$dice = diceroll(99);
if($dice > 50)
{
$weplist = Array();
$wepklist = Array($pa['wepk']); $weplist2 = Array();
for($i=0;$i<=6;$i++)
{
if(!empty($pa['itms'.$i]) && !empty($pa['itme'.$i]) && strpos($pa['itmk'.$i],'W')===0)
{
$weplist[] = Array($i,$pa['itm'.$i],$pa['itmk'.$i],$pa['itme'.$i],$pa['itms'.$i],$pa['itmsk'.$i]);
$wepklist[] = $pa['itmk'.$i];
}
}
if(!empty($weplist))
{
$wepklist = array_unique($wepklist);
$temp_pd_ex_keys = array_merge(get_equip_ex_array($pd),get_wep_ex_array($pd));
$wepkAI = $wepskAI = true;
if(!empty($temp_pd_ex_keys))
{
if(count($wepklist)<=1) $wepkAI = false;
foreach($temp_pd_ex_keys as $ex)
{
if(in_array($ex,Array('A','B'))) $wepkAI = false;
if(in_array($ex,Array('a','b'))) $wepskAI = false;
}
}
if($wepkAI)
{
$wepk_temp = $pa['wepk'];
foreach($weplist as $val)
{
if($rangeinfo[substr($val[2],1,1)] >= $rangeinfo[substr($wepk_temp,1,1)] && !in_array(substr($val[2],1,1),$temp_pd_ex_keys))
{
$weplist2[] = $val;
}
}
if($weplist2)
{
$weplist = $weplist2;
}
}
if($wepskAI && $weplist)
{
$minus = array();
foreach($weplist as $val)
{
foreach($ex_dmg_def as $key => $val2){
if(strpos($val[5],$key)!==false && !in_array($val2,$temp_pd_ex_keys)){
$minus[] = $val;
}
}
}
if(count($minus) < count($weplist)){
$weplist = array_diff($weplist,$minus);
}
}
}
else
{
//没有获取到可换装列表,直接返回
return;
}
if(!empty($weplist))
{
$oldwep = $pa['wep'];
shuffle($weplist);
$chosen = $weplist[0];$c = $chosen[0];
//var_dump($chosen);
//刷新套装效果
include_once GAME_ROOT.'./include/game/itemmain.func.php';
reload_single_set_item($pa,'wep',$oldwep);
reload_single_set_item($pa,'wep',$chosen[1],1);
$pa['itm'.$c] = $pa['wep']; $pa['itmk'.$c] = $pa['wepk']; $pa['itmsk'.$c] = $pa['wepsk'];
$pa['itme'.$c] = $pa['wepe']; $pa['itms'.$c] = $pa['weps'];
$pa['wep'] = $chosen[1]; $pa['wepk'] = $chosen[2]; $pa['wepe'] = $chosen[3]; $pa['weps'] = $chosen[4]; $pa['wepsk'] = $chosen[5];
get_wep_kind($pa);
$pa['wep_range'] = get_wep_range($pa);
$pa['wep_skill'] = get_wep_skill($pa);
$pa['change_wep_log'] = "<span class=\"yellow\">{$pa['nm']}</span>将手中的<span class=\"yellow\">{$oldwep}</span>卸下,装备了<span class=\"yellow\">{$pa['wep']}</span>!<br>";
}
}
return;
}
# NPC喊话
# pa指npc pd指另一视角
function npc_chat_rev(&$pa,&$pd,$mode='')
{
global $npcchat;
if(!empty($npcchat[$pa['type']][$pa['name']]))
{
$nchat = $npcchat[$pa['type']][$pa['name']];
$chatcolor = $nchat['color'];
$npcwords = !empty($chatcolor) ? "<span class = \"{$chatcolor}\">" : '<span>';
switch ($mode)
{
case 'attack' :
if (empty($pa['itmsk0']))
{
$npcwords .= "{$nchat[0]}";
$pa['itmsk0'] = 1;
}
elseif ($pa['hp'] > ($pa['mhp'] / 2))
{
$dice = rand ( 1, 2 );
$npcwords .= "{$nchat[$dice]}";
}
else
{
$dice = rand ( 3, 4 );
$npcwords .= "{$nchat[$dice]}";
}
break;
case 'defend' :
if (empty($pa['itmsk0']))
{
$npcwords .= "{$nchat[0]}";
$pa['itmsk0'] = 1;
}
elseif($pa['hp'] > ($pa['mhp'] / 2))
{
$dice = rand ( 5, 6 );
$npcwords .= "{$nchat[$dice]}";
}
else
{
$dice = rand ( 7, 8 );
$npcwords .= "{$nchat[$dice]}";
}
break;
case 'death' :
$npcwords .= "{$nchat[9]}";
break;
case 'escape' :
$npcwords .= "{$nchat[10]}";
break;
case 'cannot' :
$npcwords .= "{$nchat[11]}";
break;
case 'critical' :
$npcwords .= "{$nchat[12]}";
break;
case 'kill' :
$npcwords .= "{$pa['nm']}{$pd['nm']}说道:{$nchat[13]}";
break;
}
$npcwords .= '</span><br>';
return $npcwords;
}
elseif ($mode == 'death')
{
global $lwinfo;
if (is_array($lwinfo[$pa['type']]))
{
$lastword = $lwinfo[$pa['type']][$pa['name']];
}
else
{
$lastword = $lwinfo[$pa['type']];
}
$npcwords = "<span class=\"yellow\">“{$lastword}”</span><br>";
return $npcwords;
}
else
{
return;
}
}
function checkdmg($p1, $p2, $d) {
if ($d < 0) { if ($d < 0) {
$words = "{$p1}{$p2}回复了<span class=\"lime\">".abs($d)."</span>点生命……这是咋回事呢?"; $words = "{$p1}{$p2}回复了<span class=\"lime\">".abs($d)."</span>点生命……这是咋回事呢?";
} elseif (($d >= 100) && ($d < 150)) { } elseif (($d >= 100) && ($d < 150)) {
...@@ -1477,41 +682,5 @@ ...@@ -1477,41 +682,5 @@
} }
return; return;
} }
}
function addnoise($wp_kind, $wsk, $ntime, $npls, $nid1, $nid2, $nmode) {
//在隐藏地图内不会传出声音信息
global $plsinfo;
if(!array_key_exists($npls,$plsinfo)) return;
if ((($wp_kind == 'G') && (strpos ( $wsk, 'S' ) === false)) || ($wp_kind == 'F')) {
global $noisetime, $noisepls, $noiseid, $noiseid2, $noisemode;
$noisetime = $ntime;
$noisepls = $npls;
$noiseid = $nid1;
$noiseid2 = $nid2;
$noisemode = $nmode;
save_combatinfo ();
} elseif (strpos ( $wsk, 'd' ) !== false){
global $noisetime, $noisepls, $noiseid, $noiseid2, $noisemode;
$noisetime = $ntime;
$noisepls = $npls;
$noiseid = $nid1;
$noiseid2 = $nid2;
$noisemode = 'D';
save_combatinfo ();
}
if (strlen($wp_kind)>=3){
global $noisetime, $noisepls, $noiseid, $noiseid2, $noisemode,$wep;
$noisetime = $ntime;
$noisepls = $npls;
$noiseid = $nid1;
$noiseid2 = $nid2;
$noisemode = $wp_kind;
save_combatinfo ();
}
return;
}
?> ?>
\ No newline at end of file
完整遇敌/战斗流程:
遇敌前:
- move()或search()时,调用 \revbattle\calc_meetman_rate($data) 计算遇敌概率,将获取到的遇敌率传入discover();
- 触发遇敌时,调用 \revbattle\calc_hide_rate($data,$edata) 计算敌人躲避概率;
- 敌人未躲避成功时,调用 \revbattle\calc_active_rate($data,$edata) 计算先攻概率;
- 先攻敌人:调用 \revbattle\findenemy_rev($edata) 转入先攻(可操作战斗界面);
- 被敌人先攻:调用 \revcombat\rev_combat_prepare($edata,$data,0) 转入战斗准备流程;
先攻(可操作战斗界面) findenemy_rev() :
- 调用 init_battle_title($pdata,$edata,$ismeet) 初始化战斗标题(左侧界面中间红字);
- 调用 init_battle_log($pdata,$edata,$ismeet) 初始化发现敌人时显示的log;
- 调用 init_battle_rev($pdata,$edata,$ismeet) 将敌我双方数据格式化处理后传给界面显示;
- 遍历主视角技能组,初始化战斗技能;
- 调用 get_skilltags($sk,'battle') 检查技能是否带有主动技标签;
- 调用 check_skill_unlock($sk,$pdata) 检查技能是否满足解锁条件;
- 调用 check_skill_cost($sk,$pdata) 检查技能是否满足消耗条件;
处理从界面传回的战斗指令(攻击、技能、逃跑) revbattle_prepare():
- 执行动作前,主视角的 action 值为 'chase','pchase','dfight','cover' 中任一时,command 继承 action 值;
- 从这一流程开始,可以将任意参数直接保存在$data(主视角数据)或$edata(敌人视角数据)数组内,这些参数在战斗结束前不会丢失;
- 根据主视角的 action 与 bid 判断接下来的行动:
- 'enemy', //遇敌时获得 代表遭遇了敌人 bid为敌人id
- 'corpse', //遭遇尸体或击杀敌人获得 bid为尸体id;重载界面时,如果有此标记会显示发现尸体
- 'pacorpse', //通过反击击杀敌人获得 bid为尸体idd;重载界面时,如果有此标记会显示发现尸体
- 'focus', //通过视野功能再次遇敌时获得 bid为视野中的对象id
- 'team', //发现队友时获得 bid为队友id
- 'neut', //发现中立单位时获得 bid为中立单位id
- 'chase', //追击NPC敌人时获得 bid为被追击单位id
- 'pchase', //被NPC敌人追击时获得 bid为追击单位id
- 'dfight', //与NPC敌人缠斗时获得 bid为缠斗对象id
- 'cover', //通过协战夹击敌人时获得 bid为敌人id,协战者id保存在自己身上
- 'pcover', //被敌人的协战者夹击时获得 bid为敌人协战者的id
- 'back', //逃跑
- 'changewep', //切换副武器
- 检查是否遇敌、敌人是否死亡、敌人是否处于当前地图;
- 调用 fetch_playerdata_by_pid($enemyid) 拉取敌人数据;
- command 为 'changewep' 时,调用 change_subwep() 切换副武器;
- command 为 'back' 时,调用 escape_from_enemy($data,$edata) 判断是否成功逃跑;
- command 为 'cover' 时,检查是否存在协战对象;
- 协战对象的 pid 保存在主视角 clbpara['coveratk'] 内;
- 调用 fetch_playerdata_by_pid($cid) 拉取协战对象数据;
- 协战对象存在时,为协战对象添加标记 $cdata['is_coveratk'] = 1 ,以表示这是一次协战攻击;
- 根据 action 或 command 判断是否需要调用 calc_active_rate($data,$edata) 重新计算先攻概率;
- 根据先攻情况调用 \revcombat\rev_combat_prepare($data,$edata,1) 或 \revcombat\rev_combat_prepare($edata,$data,0) 转入战斗准备流程;
战斗准备流程 rev_combat_prepare():
- 根据传入的 $wep_kind 判断主视角(玩家)是否主动发动了战斗技,将战斗技id保存在 $pa['bskill'] 内;
- 根据传入的 $active 判断主视角与敌对视角称谓,保存在 $pa['nm'] 与 $pd['nm'] 内;
- 调用 get_attr_wepbase($pa,$pd,$active,$wep_kind) 初始化双方攻击相关参数,按下列次序依次判定:
- 防守方防守方式 \revattr\get_wep_kind($pd) 保存在 $pd['wep_kind'] 内;
- 没有子弹的枪械 保存为 $pd['is_wpg']
- 防守方被动技能参数 \revattr\get_attr_passive_skills($pd,$pa,$active);
- 所有标签为 'passive','buff','inf' 且满足了解锁条件的被动技能都会自动激活 保存为 $pd['skill_技能ID'] 或 $pa['skill_技能ID'](下略);
- 标签为 'switch' 的被动技能仅在技能开启时激活 保存为 $pd['askill_技能ID'] ;
- 如果技能触发时存在log,保存在 $pd['skilllog'] 内,进入打击流程后,在 $pa['bskilllog'] 与 $pa['bskilllog2'] 显示后显示;
- 防守方武器射程 $pd['wep_range'] = \revattr\get_wep_range($pd);
- 防守方攻击熟练度 $pd['wep_skill'] = \revattr\get_wep_skill($pd);
- 防守方武器名 $pd['wep_name'] = $pd['wep'];
- 进攻方攻击方式 \revattr\get_wep_kind($pa,$wep_kind,$pd['wep_range']);
- 进攻方主动技能参数 \revattr\get_attr_bskills($pa,$pd,$active);
- NPC敌人会随机释放满足了条件的战斗技;
- 主动技默认log保存在 $pa['bskilllog'] 内,在进入打击流程后显示;
- 主动技额外log可以保存在 $pa['bskilllog2'] 内,会在 $pa['bskilllog'] 显示后显示;
- 进攻方被动技能参数 \revattr\get_attr_passive_skills($pa,$pd,$active);
- 进攻方武器射程 $pa['wep_range'] = \revattr\get_wep_range($pa);
- 进攻方攻击熟练度 $pa['wep_skill'] = \revattr\get_wep_skill($pa);
- 进攻方武器名 $pa['wep_name'] = $pa['wep'];
- 进入战斗流程;
战斗流程 rev_combat():
- 打击开始前,调用 combat_prepare_events($pa,$pd,$active) 执行整场战斗只会触发一次的事件;
- 返回值小于0时 跳转至 battle_finish_flag 跳过打击阶段;
- 调用 combat_prepare_logs 显示遇敌时会触发的文本;
- pa打击事件;
- 调用 rev_attack($pa,$pd,$active) 转入 pa打击流程 将打击伤害保存在 $att_dmg 内;
- 调用 rev_combat_result($pa,$pd,$active) 转入 pa打击结束流程 将结果保存在 $att_result 内;
- 暴毙标识 $pa['ggflag'] 存在时,清空$pa生命,并调用 rev_combat_result($pd,$pa,$active);
- 打击伤害 $att_dmg 不为空时,扣除$pd对应生命,并调用 rev_combat_result($pa,$pd,$active);
- pa打击结果 $att_result 不为空时,调用 attack_check_can_loop($pa,$pd,$active) 检查是否要循环执行打击流程;
- pd反击事件:
- pd生命不为空,且 $att_result 不为空时,调用 attack_check_can_counter($pa,$pd,$active) 检查是否转入反击流程;
- 不能反击的原因保存在 $pd['cannot_counter'] 内;不能反击的log保存在 $pd['cannot_counter_log'] 内;
- 判断是否因固定原因无法反击;
- 调用 calc_counter_range($pa,$pd,$active) 判断是否因射程不足无法反击;
- 调用 calc_counter_rate($pa,$pd,$active) 判断是否达到反击率;
- 反击流程:重复pa打击事件流程;
- 反击时,添加标记 $pd['is_counter'] = 1 ,以表示这是一次反击攻击;
- 更新全局战斗情报阶段,调用 save_combatinfo() 保存当前最高伤害者等信息;
- logsave阶段;
- 在打击流程中触发的需logsave的文本,可以保存在 $pa['logsave'] 或 $pd['logsave'] 内,在此时一并输出,顺序为:
- 手持 *** 的 *** 向你袭击;
- $pa['logsave'];
- 你升级了;
- 你受到其 *** 点攻击,对其作出 *** 点反击;
- 战斗收尾阶段(battle_finish_flag),根据战斗结果更新 action ;
- pd死于战斗,$pa['action'] = 'corpse'; pa死于战斗,$pd['action'] = 'pacorpse';
- 协战标记 ['coveratk_flag'] 存在时,['action'] = 'cover'; ['clbpara']['coveratk'] = ['coveratk_flag'];
- pa或pd均不是当前玩家时,将 action 临时保存在 $saction 内, 将 bid 临时保存在 $sid 内;
- 调用 init_battle_rev($pa,$pd,1) 或 init_battle_rev($pd,$pa,1) 刷新界面;
- 调用 player_save($pa) player_save($pd) 将双方数据保存回数据库;
- pa或pd均不是当前玩家时,说明此次战斗流程没有玩家参与,引入$pdata作为玩家数据;否则调用 fetch_playerdata_by_name() 重新从数据库中读取回玩家数据;
- 存在临时动作 $saction 与 $sid 时 将其保存回玩家 action 与 bid 内;
- 显示战斗结果;
打击流程 rev_attack():
- 调用 \revattr\get_equip_ex_array($pa)与($pd) 获取防具上属性信息,分别保存在 $pa['ex_equip_keys'] 与 $pd['ex_equip_keys'] 内(pa/pd下略);
- 调用 \revattr\get_get_wep_ex_array() 获取武器上属性信息,保存在 ['ex_wep_keys'] 内;
- 进行三抽判定,分别保存为 (技抽)['skdr_flag'] (魂抽)['sldr_flag'] (精抽)['mdr_flag'];
- 合并武器、防具属性信息,保存在 ['ex_keys'] 内;
- 调用 \revattr\get_extra_ex_array() 获取不受三抽影响的额外属性信息,一并保存在 ['ex_keys'] 内;
- 调用 \revattr\hitrate_prepare_events($pa,$pd,$active) 执行命中前事件;
- 返回值小于0时,直接中断打击流程;
- 调用 \revattr\get_hitrate_rev($pa,$pd,$active) 获取 pa基础命中率 保存在 $pa['hitrate'] 内;
- 调用 \revattr\get_hit_time_rev($pa,$pd,$active) 获取 pa命中次数、武器损耗次数、致伤次数;
- 实际命中次数保存在 $pa['hitrate_times'] 内;
- 理论最大命中次数保存在 $pa['hitrate_max_times'] 内;
- 武器损耗次数保存在 $pa['wep_imp_times'] 内;
- 致伤(敌人防具损伤)次数保存在 $pa['inf_times'] 内;
- 输出打击前log、$pa['bskilllog']、$pa['bskilllog2']、$pa['skilllog'];
- 总命中次数大于0时:
- 调用 \revattr\get_fix_damage($pa,$pd,$active) 检查是否存在不受任何系数变化影响的固定伤害(直死、混沌伤害等);
- 固定伤害结果不为NULL时,将固定伤害保存在 $pa['final_damage'] 内,并结束伤害计算;
- 固定伤害不存在时,正常计算伤害:
- 物理伤害计算阶段:
- 调用 \revattr\get_base_att($pa,$pd,$active) 获取 pa基础攻击力 保存在 $pa['base_att'] 内;
- 武器实际效果(空手、没子弹的枪)保存在 $pa['wepe_t'] 内;
- 调用 \revattr\get_base_def($pa,$pd,$active) 获取 pd基础防御力 保存在 $pd['base_def'] 内;
- 调用 \revattr\get_original_dmg_rev($pa,$pd,$active) 计算原始伤害 保存在 $pa['original_dmg'] 内;
- 调用 \revattr\get_original_fix_dmg_rev($pa,$pd,$active) 计算在原始伤害基础上附加的固定伤害(重枪、灵武固伤);
- 调用 \revattr\get_damage_p_rev ($pa,$pd,$active) 计算伤害倍率的变化(连击、必杀、灵武系数) 返回的是一个数组 ;
- 调用 \revattr\deal_damage_prepare_events($pa,$pd,$active) 执行攻击方(pa)在造成伤害前触发的事件 (检查pd身上是否有防御属性,pa是否触发了贯穿、冲击);
- 触发冲击时,$pa['charge_flag'] = 1;
- 触发伤害抹消时,$pd['phy_def_flag'] = 2;
- 触发全系防御时,$pd['phy_def_flag'] = 1;
- 触发单系防御时,$pd['phy_def_flag'] = $def_kind[$pa['wep_kind']];
- 触发贯穿时,$pa['pierce_flag'] = 1; $pd['phy_def_flag'] = 0;
- 调用 \revattr\get_damage_def_p_rev($pa,$pd,$active) 根据防守方的技能、属性计算伤害倍率的变化,返回结果与之前的伤害倍率数组合并;
- 以(AxBxC=D)的格式队列输出物理伤害,并将总物理伤害保存在 $pa['phy_damage'] 内;
- 预受伤阶段,调用 \revattr\get_hurt_prepare_events($pa,$pd,$active) 提前计算 pd是否受伤、防具是否破损,但不会真正应用受伤效果;
- 受伤情况保存在 $pd['inf_hurt'][受伤部位] 内;
- 防具受损情况保存在 $pd['armor_hurt'][防具部位] 内;
- 属性伤害计算阶段:
- 调用 \revattr\get_base_ex_att_array($pa,$pd,$active) 获取攻击方能造成的属性伤害队列 保存在 $pa['ex_attack_keys'] 内;
- 调用 \revattr\deal_ex_damage_prepare_events($pa,$pd,$active) 获取攻击方在造成属性伤害前触发的事件(检查pd身上是否有防御属性,pa是否触发了属穿)
- 触发属性抹消时,$pd['ex_def_flag'] = 2;
- 触发属性防御时,$pd['ex_def_flag'] = 1;
- 触发破格时,$pa['ex_pierce_flag'] = 1; $pd['ex_def_flag'] = 0;
- 调用 \revattr\get_original_ex_dmg($pa,$pd,$active) 获取原始属性伤害队列;
- 属性伤害被抹消或护盾抵消时,只返回单个数值;否则遍历能造成属性伤害的队列,并返回一个记录有每个属性造成了多少伤害的数组;
- 计算单个属性基础伤害,保存在 $ex_dmg 内;
- 计算得意武器对属性基础伤害的修正;
- 调用 get_ex_base_dmg_max($pa,$pd,$active,$ex,$ex_dmg) 计算单个属性的基础伤害上限;
- 计算属性基础伤害浮动;
- 调用 get_ex_base_dmg_p($pa,$pd,$active,$ex,$ex_dmg) 计算单个属性伤害的系数变化;
- 已经处于**异常状态时,**属性伤害** 的log 保存在 $pa['ex_dmgpsh_log'] 内;
- 属性伤害被**防御了 的log 保存在 $pa['ex_dmgdef_log'] 内;
- 成功施加了**异常 的log 保存在 $pa['ex_dmginf_log'] 内;
- 将单个属性伤害 $ex_dmg 加入总队列 $total_ex_dmg[] 内;
- 调用 \revattr\get_ex_dmg_p($pa,$pd,$active) 获取对总属性伤害的倍率修正;
- 以(AxBxC=D)的格式队列输出属性伤害,将最终造成的属性伤害保存在 $pa['ex_damage'] 内;
- 最终伤害计算阶段:
- 调用 \revattr\get_final_dmg_p($pa,$pd,$active) 计算最终伤害的系数变化;
- 调用 \revattr\get_final_dmg_fix($pa,$pd,$active,$damage) 计算最终伤害的定值变化(附加伤害、伤害制御、纯粹伤害、秒杀等);
- 如果最终伤害不存在定值变化,则输出一段 AxBxC=D 格式的文本;
- 如果最终伤害存在定值变化,输出一段 实际伤害(原始伤害) 格式的文本;
- 将造成的最终伤害保存在 $pa['final_damage'] 内;
- 调用 checkdmg($pa['name'],$pd['name'],$damage) 将伤害发送至进行状况;
- 调用 \revattr\attack_finish_events($pa,$pd,$active) 应用pa造成伤害后触发的事件(计算反噬伤害);
- 调用 \revattr\get_hurt_events($pa,$pd,$active) 应用pd受伤事件(受伤、防具受损);
- 调用 expup_rev($pa,$pd,$active) 结算战斗经验;
- 升级时,将升级文本保存在 $pa['lvlup_log'] 内,在logsave时一并输出;
- 调用 rgup_rev($pa,$pd,$active) 结算战斗怒气;
- 调用 weapon_loss($pa,$pa['wep_imp_times']) 结算武器损耗;
- 调用 addnoise($pa['wep_kind'],$pa['wepsk'],$now,$pa['pls'],$pa['pid'],$pd['pid'],$pa['wep_kind'] ) 保存声音信息;
- 为pa增加对应熟练度;
- 返回造成的最终伤害;
打击结束流程 rev_combat_result():
- pd生命值低于0时,结算击杀/复活事件;
- 结算NPC二阶段变身事件;
- 存在暴毙标记 ['gg_flag'] 时 将死亡方式 $death_flag 登记为 $pd['gg_flag'];
- 否则将将死亡方式 $death_flag 登记为 $pa['wep_kind'];
- 调用 pre_kill_events($pa,$pd,$active,$death_flag) 执行不需要考虑复活问题的预击杀事件;
- 登记死者遗言;
- 向进行状况及聊天框发送信息;
- 调用 revive_process($pa,$pd,$active) 判断是否复活;
- 调用 final_kill_events($pa,$pd,$active,$lastword) 执行没有复活的情况下的后续击杀事件;
- 增加击杀数,降低幸存数;
- 调用 \revattr\get_killer_rp($pa,$pd,$active) 结算rp变化;
- 调用 check_death_events($pa,$pd,$active) 执行pd死亡后事件(灵魂绑定等);
- 计数相关成就;
- pd生命值不低于0,结算对应事件;
- 调用 attack_result_events($pa,$pd,$active) 执行pd扣血后会触发的事件(眩晕等);
- 返回1时,代表可以继续战斗;返回0代表中止战斗流程;
====================
namespace revbattle:
- revbattle.calc.php:
- 计算敌人发现率、躲避率、先制率;
- revbattle.func.php:
- findenemy_rev() 主动遇敌、发现敌人、发现队友、发现中立单位的界面显示;
- revbattle_prepare() 遇敌后,处理从界面传回的指令,或根据action判断接下来的行动;
- escape_from_enemy() 逃跑;
- 界面显示相关;
namespace revcombat:
- revcombat.func.php:
- rev_combat_prepare();
- rev_combat();
- rev_attack();
- rev_combat_result();
- npc_changewep_rev(); npc_chat_rev();
- revcombat_extra.func.php:
- get_attr_wepbase() 初始化双方的攻击相关参数(攻击方式、主动技能参数、被动技能参数、武器射程、攻击熟练度、武器名)
- combat_prepare_events();
- combat_prepare_logs();
- attack_result_events();
- attack_check_can_counter();
- revcombat.calc.php:
- 计算反击射程、反击率;
- 计算追击、鏖战概率;
namespace revattr:
- revattr.func.php:
- 打击流程内调用函数;
- revattr.calc.php:
- 打击流程内,单独伤害计算流程内调用函数(社团技能修正、独立计算用函数);
- revattr_extrac.func.php:
- 特殊NPC战斗机制相关函数;
<?php
namespace revcombat
{
if(!defined('IN_GAME')) {
exit('Access Denied');
}
include_once GAME_ROOT.'./include/game/itemmain.func.php';
include_once GAME_ROOT.'./include/game/revcombat.calc.php';
include_once GAME_ROOT.'./include/game/revattr.func.php';
include_once GAME_ROOT.'./include/game/revattr.calc.php';
include_once GAME_ROOT.'./include/game/revattr_extra.func.php';
# 初始化双方的攻击相关参数:
# 依以下次序判定:
# 1.防守方防守方式、防守方被动技能参数、武器射程、攻击熟练度、武器名;
# 2.进攻方攻击方式、进攻方主动技能参数、进攻方被动技能参数、武器射程、攻击熟练度、武器名;
function get_attr_wepbase(&$pa,&$pd,$active,$wep_kind='')
{
# 初始化pd相关攻击参数
\revattr\get_wep_kind($pd);
\revattr\get_attr_passive_skills($pd,$pa,$active);
$pd['wep_range'] = \revattr\get_wep_range($pd);
$pd['wep_skill'] = \revattr\get_wep_skill($pd);
$pd['wep_name'] = $pd['wep'];
# 初始化pa相关攻击参数
\revattr\get_wep_kind($pa,$wep_kind,$pd['wep_range']);
\revattr\get_attr_bskills($pa,$pd,$active);
\revattr\get_attr_passive_skills($pa,$pd,$active);
$pa['wep_range'] = \revattr\get_wep_range($pa);
$pa['wep_skill'] = \revattr\get_wep_skill($pa);
$pa['wep_name'] = $pa['wep'];
}
# 正式进入rev_combat战斗状态后,在判定伤害、反击流程前的事件执行阶段;
# 即无论是否反击都只会触发1次的事件,返回值小于0时会直接中断战斗;
function combat_prepare_events(&$pa,&$pd,$active)
{
# 百命猫 初始化事件: 每次初始化战斗时都会提升等级与怒气
if (($pa['type'] == 89 && $pa['name']=='是TSEROF啦!') || ($pd['type'] == 89 && $pd['name']=='是TSEROF啦!'))
{
\revattr\attr_extra_89_100lifecat($pa,$pd,$active);
}
# 笼中鸟 初始化事件:喂养成功会跳过战斗
if($pa['type'] == 89 && $pa['name'] =='笼中鸟')
{
$flag = \revattr\attr_extra_89_cagedbird($pa,$pd,$active);
if($flag < 0) return $flag;
}
elseif($pd['type'] == 89 && $pd['name'] =='笼中鸟')
{
$flag = \revattr\attr_extra_89_cagedbird($pd,$pa,$active);
if($flag < 0) return $flag;
}
# NPC换装判定:
if($pa['type']) npc_changewep_rev($pa,$pd,$active);
# 检查成就503
if(!empty($pa['arbs']) && $pa['arb'] == '【智代专用熊装】') \revattr\attr_ach53_check($pa,$pd,$active);
if(!empty($pd['arbs']) && $pd['arb'] == '【智代专用熊装】') \revattr\attr_ach53_check($pd,$pa,$active);
return 1;
}
# 进入rev_combat战斗状态后,在判定伤害、反击流程前的喊话事件
function combat_prepare_logs(&$pa,&$pd,$active)
{
global $log;
if(!empty($pa['message']))
{
$log.="<span class=\"lime\">{$pa['nm']}{$pd['nm']}喊道:「{$pa['message']}」!</span><br>";
if (!$pd['type'])
{
$w_log = "<span class=\"lime\">{$pa['name']}对你大喊:「{$pa['message']}」!</span><br>";
logsave ($pd['pid'],$now,$w_log,'c');
}
}
if($active)
{
if(isset($pa['is_chase']))
{
$log .= "{$pa['nm']}再度向<span class=\"red\">{$pd['nm']}</span>发起攻击!<br>";
}
elseif(isset($pa['is_dfight']))
{
$log .= "{$pa['nm']}抓住机会抢先向<span class=\"red\">{$pd['nm']}</span>发起攻击!<br>";
}
elseif(isset($pa['is_coveratk']))
{
$log .= "<span class='yellow'>正当你们打的难解难分之际,{$pa['nm']}抓住机会,向<span class=\"red\">{$pd['nm']}</span>发起突袭!</span><br>";
}
else
{
$log .= "{$pa['nm']}向<span class=\"red\">{$pd['nm']}</span>发起攻击!<br>";
}
}
else
{
if(isset($pa['is_chase']))
{
$log .= "<span class=\"red\">{$pa['nm']}</span>再度向{$pd['nm']}袭来!<br>";
}
elseif(isset($pa['is_dfight']))
{
$log .= "但是<span class=\"red\">{$pa['nm']}</span>抢先对{$pd['nm']}发起攻击!<br>";
}
elseif(isset($pa['is_coveratk']))
{
$log .= "<span class='yellow'>正当你们打的难解难分之际,{$pa['nm']}抓住机会,向<span class=\"red\">{$pd['nm']}</span>发起突袭!</span><br>";
}
else
{
$log .= "<span class=\"red\">{$pa['nm']}</span>突然向{$pd['nm']}袭来!<br>";
}
}
# NPC喊话判定
if($pa['type']) $log .= npc_chat_rev ($pa,$pd,'attack');
return;
}
# 单次打击结束后(即执行完rev_attack(),执行rev_combat_result()过程中检测到敌人未死亡时)需要判定的事件
function attack_result_events(&$pa,&$pd,$active)
{
global $now,$log,$infinfo,$exdmginf,$plsinfo;
# 真蓝凝防守事件:
if($pd['type'] == 19 && $pd['name'] == '蓝凝')
{
attr_extra_19_azure($pa,$pd,$active);
}
# 「灭气」技能效果
if(isset($pa['skill_c1_burnsp']))
{
$pd['sp'] = max($pd['sp']-round($pa['final_damage']*2/3),1);
//$log .= "<span class='yellow'>「灭气」使{$pd['nm']}的体力降低了!</span><br>";
}
# 「猛击」眩晕效果
if(isset($pa['skill_c1_crit']))
{
$sk_lvl = get_skilllvl('c1_crit',$pa);
$sk_lst = get_skillvars('c1_crit','stuntime',$sk_lvl);
$flag = get_skillinf_rev($pd,'inf_dizzy',$sk_lst);
if($flag)
{
if(!$pd['type'] && $pd['nm']!='你') $pd['logsave'] .= "凶猛的一击直接将你打晕了过去!<br>";
elseif(!$pa['type'] && $pa['nm']!='你') $pa['logsave'] .= "你凶猛的一击直接将<span class=\"yellow\">{$pd['name']}</span>打晕了过去!<br>";
}
}
# 「磁暴」效果判定
if(isset($pa['bskill_c7_electric']))
{
if(strpos($pd['inf'],'e')!==false)
{
$flag = get_skillinf_rev($pd,'inf_dizzy',get_skillvars('c7_electric','lasttimes'));
if($flag)
{
$log .= "<span class='yellow'>由于已经处于麻痹状态,狂暴的电流直接将{$pd['nm']}电晕了!</span><br>";
if(!$pd['type'] && $pd['nm']!='你') $pd['logsave'] .= "狂暴的电流直接将你电晕!<br>";
elseif(!$pa['type'] && $pa['nm']!='你') $pa['logsave'] .= "狂暴的电流直接将<span class=\"yellow\">{$pd['name']}</span>电晕!<br>";
}
}
else
{
$infr = get_skillvars('c7_electric','infr');
$dice = diceroll(99);
if($dice < $infr)
{
$flag = get_inf_rev($pd,'e');
$log .= "<span class='yellow'>「磁暴」使{$pd['nm']}{$exdmginf['e']}了!</span><br>";
}
else
{
$log .= "<span class='yellow'>{$pd['nm']}没有受到「磁暴」影响!</span><br>";
}
}
}
# 「脉冲」效果判定
if(isset($pa['bskill_c7_emp']) && $pa['bskill_c7_emp'] > 1)
{
if(strpos($pd['inf'],'e')!==false)
{
$flag = get_skillinf_rev($pd,'inf_dizzy',get_skillvars('c7_electric','lasttimes'));
if($flag)
{
$log .= "<span class='yellow'>由于已经处于麻痹状态,狂暴的能量脉冲直接把{$pd['nm']}冲晕了过去!</span><br>";
if(!$pd['type'] && $pd['nm']!='你') $pd['logsave'] .= "狂暴的能量脉冲把你冲晕了过去!<br>";
elseif(!$pa['type'] && $pa['nm']!='你') $pa['logsave'] .= "狂暴的能量脉冲把<span class=\"yellow\">{$pd['name']}</span>冲晕了过去!<br>";
}
}
else
{
$flag = get_inf_rev($pd,'e');
$log .= "<span class='yellow'>「脉冲」使{$pd['nm']}{$exdmginf['e']}了!</span><br>";
}
}
# 「渗透」效果判定
if(isset($pa['skill_c8_infilt']))
{
$sk_lvl = get_skilllvl('c8_infilt',$pa);
$infr = get_skillvars('c8_infilt','infr',$sk_lvl);
$dice = diceroll(99);
if($dice < $infr)
{
$flag = get_inf_rev($pd,'p');
include_once GAME_ROOT.'./include/game/itemmain.func.php';
check_item_edit_event($pa,$pd,'c8_infilt');
if($flag) $log .= "<span class='yellow'>「渗透」使{$pd['nm']}{$exdmginf['p']}了!</span><br>";
else $log .= "<span class='yellow'>{$pd['nm']}没有受到「渗透」影响……大概吧?</span><br>";
}
else
{
$log .= "<span class='yellow'>{$pd['nm']}没有受到「渗透」影响!</span><br>";
}
}
# 「冰心」效果判定
if (isset($pd['skill_c9_iceheart']) && !empty($pd['inf']))
{
$purify = get_skillvars('c9_iceheart','purify');
# 获取当前异常队列
$now_inf = str_split($pd['inf']);
# 计算最多可净化异常数
$purify = min($purify,count($now_inf));
for($p=0;$p<$purify;$p++)
{
$heal_inf = $now_inf[$p];
$flag = heal_inf_rev($pd,$heal_inf);
if($flag)
{
$log .= "<span class='yellow'>{$pd['nm']}敛神聚气,从{$exdmginf[$heal_inf]}中恢复了!</span><br>";
$pd['rage'] = max(255,$pd['rage']+get_skillvars('c9_iceheart','ragegain'));
}
}
}
# 「天佑」技能判定
if(isset($pd['skill_c6_godbless']) && empty($pd['skill_buff_godbless']) && !empty($pa['final_damage']))
{
$actmhp = get_skillvars('c6_godbless','actmhp');
if($pa['final_damage'] >= $pd['mhp']*($actmhp/100) && $pd['hp'] > 0)
{
getclubskill('buff_godbless',$pd['clbpara']);
$log .= "<span class=\"yellow\">{$pd['nm']}的技能「天佑」被触发,暂时进入了无敌状态!</span><br>";
}
}
# 「火花」技能判定:触发后不会再触发协战流程
if(isset($pa['askill_c20_sparkle']))
{
$sk = 'c20_sparkle';
$dice = diceroll(99);
$obbs = get_skillvars($sk,'tpr');
if($dice < $obbs)
{
$pa['askill_c20_sparkle'] = 2;
$plslist = get_safe_plslist();
$sp_pls = $plslist[array_rand($plslist)];
# 切换地图
$pd['pls'] = $sp_pls;
$pd['tp_by_sparkle'] = $sp_pls;
# NPC敌人扣血,玩家在被送到新地图后强制探索一次
if($pd['type'])
{
$pd['hp'] -= min($pd['hp']-1,rand(1,$sp_pls * 10));
}
else
{
$pd['action'] = 'tpmove';
$pd['logsave'] .= "<span class=\"grey\">{$pa['name']}点燃火花,将你传送到了{$plsinfo[$sp_pls]}!</span><br>";
}
$log .= "<span class=\"yellow\">你点燃火花,将{$pd['nm']}送到了{$plsinfo[$sp_pls]}!祝他好运吧……</span><br>";
addnews($now,'sparklemove',$pa['name'],$pd['name'],$plsinfo[$sp_pls]);
return;
}
}
# 「协战」判定
# 拥有佣兵的情况下,主动攻击敌人/成功反击敌人,且敌人仍存活时,判定是否有佣兵协战
if(!empty(get_skillpara('c11_merc','id',$pa['clbpara'])))
{
$sk = 'c11_merc';
$cancovers = get_skillpara($sk,'cancover',$pa['clbpara']);
shuffle($cancovers);
$dice = diceroll(99);
foreach($cancovers as $mkey => $mcan)
{
if($mcan)
{
$mcps = get_skillpara($sk,'coverp',$pa['clbpara'])[$mkey];
if($dice < $mcps)
{
# 触发协战,将协战者ID记录在coopatk_flag内
$pa['coveratk_flag'] = get_skillpara($sk,'id',$pa['clbpara'])[$mkey];
//echo "触发了协战!协战对象ID:{$pa['coveratk_flag']}<br>";
break;
}
}
}
}
# 「灵俑」协战判定
if(empty($pa['coveratk_flag']) && !empty($pa['clbpara']['zombieid']))
{
# 「灵俑」基础协战率:50
$cover_obbs = 50; $cover_dice = diceroll(99);
if($cover_dice < $cover_obbs)
{
$mate_list = $pa['clbpara']['mate']; shuffle($mate_list);
foreach($mate_list as $mid)
{
$mdata = fetch_playerdata_by_pid($mid);
# 跳过不在同一地图的灵俑
if($mdata['pls'] != $pd['pls'] || $mdata['hp'] < 1) continue;
# 触发协战
$pa['coveratk_flag'] = $mid;
break;
}
}
}
return;
}
# 单次打击结束后,检查是否需要循环打击流程,返回值不为0则循环
function attack_check_can_loop(&$pa,&$pd,$active)
{
global $log;
$loop = 0;
# 「双响」效果判定
if(isset($pa['bskill_c5_double']))
{
unset($pa['bskill_c5_double']);unset($pa['bskilllog']);
$log .= "<span class=\"yellow\">{$pa['nm']}引爆了预埋的另一组爆炸物!</span><br>";
$loop = 1;
}
# 「海虎」效果判定
if(isset($pa['skill_c12_swell']))
{
$pa['skill_c12_swell'] --;
if(empty($pa['skill_c12_swell'])) unset($pa['skill_c12_swell']);
$log .= "<span class=\"lime\">{$pa['nm']}以雷霆万钧之势再度袭向{$pd['nm']}!</span><br>";
$loop = 1;
}
return $loop;
}
# 执行完rev_attack() rev_combat_result()后 检查防守方(pd)是否能进行反击
function attack_check_can_counter(&$pa,&$pd,$active)
{
# 被协战攻击无法反击
if(isset($pa['is_coveratk']))
{
$pd['cannot_counter_log'] = "{$pd['nm']}双拳难敌四手,逃跑了!";
return 0;
}
# 被偷袭无法反击
if(isset($pa['bskill_c1_stalk']))
{
$pd['cannot_counter_log'] = "{$pd['nm']}无法反击!";
return 0;
}
# 被留手了应不应该反击……?暂时定不会反击,但是会反击也很合理,人心险恶嘛!
if(isset($pa['askill_c19_dispel']) && $pa['askill_c19_dispel'] == 2)
{
$pd['cannot_counter_log'] = "被你放了一马的{$pd['nm']}一瘸一拐地逃开了。<br>希望你的决定是正确的……";
return 0;
}
# 被火花传送走了不能反击
if(isset($pd['tp_by_sparkle']))
{
$pd['cannot_counter_log'] = "{$pd['nm']}传送走了!<br>";
return 0;
}
# 处于眩晕状态时,无法反击
if(isset($pd['skill_inf_dizzy']))
{
$pd['cannot_counter_log'] = "{$pd['nm']}正处于眩晕状态,无法反击!";
return 0;
}
# 治疗姿态、躲避策略不能反击
if($pd['pose'] == 5 || $pd['tactic'] == 4)
{
$pd['cannot_counter_log'] = "{$pd['nm']}处于无法反击的状态!转身逃开了!";
return 0;
}
# 哨戒姿态不会反击,但是会生气……
if($pd['pose'] == 7)
{
$pd['cannot_counter_log'] = "{$pd['nm']}看起来非常生气!还是离他远点吧……";
return 0;
}
# 检查是否在pa是否在pd的反击射程内
$range_flag = calc_counter_range($pa,$pd,$active);
# pd的射程不足,无法反击
if(!$range_flag)
{
$pd['cannot_counter'] = 'cannot';
$pd['cannot_counter_log'] = "<span class=\"red\">{$pd['nm']}攻击范围不足,不能反击,逃跑了!</span><br>";
return 0;
}
# pd的射程足够反击,计算反击率
else
{
# 计算反击率
$counter = calc_counter_rate($pa,$pd,$active);
# 掷骰
$counter_dice = diceroll(99);
if ($counter_dice < $counter)
{
return 1;
}
else
{
$pd['cannot_counter'] = 'escape';
$pd['cannot_counter_log'] = "<span class=\"red\">{$pd['nm']}没能抓住机会反击,逃跑了!</span><br>";
return 0;
}
}
return 1;
}
}
?>
\ No newline at end of file
...@@ -4,6 +4,12 @@ if(!defined('IN_GAME')) { ...@@ -4,6 +4,12 @@ if(!defined('IN_GAME')) {
exit('Access Denied'); exit('Access Denied');
} }
include_once GAME_ROOT.'./include/state.func.php';
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';
function check_can_move($pls,$pgroup,$moveto) function check_can_move($pls,$pgroup,$moveto)
{ {
global $log,$plsinfo,$hplsinfo,$arealist,$areanum,$hack; global $log,$plsinfo,$hplsinfo,$arealist,$areanum,$hack;
...@@ -133,7 +139,6 @@ function move($moveto = 99,&$data=NULL) { ...@@ -133,7 +139,6 @@ function move($moveto = 99,&$data=NULL) {
$hp -= $damage; $hp -= $damage;
$log .= "被<span class=\"blue\">冰雹</span>击中,生命减少了<span class=\"red\">$damage</span>点!<br>"; $log .= "被<span class=\"blue\">冰雹</span>击中,生命减少了<span class=\"red\">$damage</span>点!<br>";
if($hp <= 0 ) { if($hp <= 0 ) {
include_once GAME_ROOT.'./include/state.func.php';
death('hsmove','',0,'',$data); death('hsmove','',0,'',$data);
return; return;
// } else { // } else {
...@@ -211,8 +216,7 @@ function move($moveto = 99,&$data=NULL) { ...@@ -211,8 +216,7 @@ function move($moveto = 99,&$data=NULL) {
# 移动到指定地点,结算移动探索事件 # 移动到指定地点,结算移动探索事件
move_search_events($data,'move'); move_search_events($data,'move');
include_once GAME_ROOT.'./include/game/revattr.func.php'; $enemyrate = \revbattle\calc_meetman_rate($data);
$enemyrate = calc_meetman_rate($data);
//echo "enemyrate = {$enemyrate}%"; //echo "enemyrate = {$enemyrate}%";
discover($enemyrate,$data); discover($enemyrate,$data);
return; return;
...@@ -287,7 +291,6 @@ function search(&$data=NULL){ ...@@ -287,7 +291,6 @@ function search(&$data=NULL){
$hp -= $damage; $hp -= $damage;
$log .= "被<span class=\"blue\">冰雹</span>击中,生命减少了<span class=\"red\">$damage</span>点!<br>"; $log .= "被<span class=\"blue\">冰雹</span>击中,生命减少了<span class=\"red\">$damage</span>点!<br>";
if($hp <= 0 ) { if($hp <= 0 ) {
include_once GAME_ROOT.'./include/state.func.php';
death('hsmove','',0,'',$data); death('hsmove','',0,'',$data);
return; return;
// } else { // } else {
...@@ -360,14 +363,14 @@ function search(&$data=NULL){ ...@@ -360,14 +363,14 @@ function search(&$data=NULL){
# 探索指定地点,结算探索事件 # 探索指定地点,结算探索事件
move_search_events($data,'search'); move_search_events($data,'search');
include_once GAME_ROOT.'./include/game/revattr.func.php'; $enemyrate = \revbattle\calc_meetman_rate($data);
$enemyrate = calc_meetman_rate($data);
//echo "enemyrate = {$enemyrate}%"; //echo "enemyrate = {$enemyrate}%";
discover($enemyrate,$data); discover($enemyrate,$data);
return; return;
} }
# 探索或移动行为会触发的事件
function move_search_events(&$data,$act) function move_search_events(&$data,$act)
{ {
global $log,$inf_move_hp,$inf_move_sp,$infwords,$weather,$gamevars,$now,$elements_info; global $log,$inf_move_hp,$inf_move_sp,$infwords,$weather,$gamevars,$now,$elements_info;
...@@ -402,7 +405,6 @@ function move_search_events(&$data,$act) ...@@ -402,7 +405,6 @@ function move_search_events(&$data,$act)
if($damage > 0) $log .= "{$infwords[$inf_ky]}减少了<span class=\"red\">$damage</span>点生命!<br>"; if($damage > 0) $log .= "{$infwords[$inf_ky]}减少了<span class=\"red\">$damage</span>点生命!<br>";
elseif($damage < 0) $log .= "{$infwords[$inf_ky]}恢复了<span class=\"lime\">".abs($damage)."</span>点生命!<br>"; elseif($damage < 0) $log .= "{$infwords[$inf_ky]}恢复了<span class=\"lime\">".abs($damage)."</span>点生命!<br>";
if($hp <= 0 ){ if($hp <= 0 ){
include_once GAME_ROOT.'./include/state.func.php';
death($inf_ky.'move','',0,'',$data); death($inf_ky.'move','',0,'',$data);
return; return;
} }
...@@ -587,7 +589,6 @@ function discover($schmode = 0,&$data=NULL) ...@@ -587,7 +589,6 @@ function discover($schmode = 0,&$data=NULL)
//看地图上有没有陷阱 //看地图上有没有陷阱
if($trpnum) if($trpnum)
{ {
include_once GAME_ROOT.'./include/game/itemmain.func.php';
$fstrp = $db->fetch_array($trapresult); $fstrp = $db->fetch_array($trapresult);
//奇迹雷 //奇迹雷
$xtrpflag = $fstrp['itmk'] == 'TOc' ? true : false; $xtrpflag = $fstrp['itmk'] == 'TOc' ? true : false;
...@@ -615,7 +616,6 @@ function discover($schmode = 0,&$data=NULL) ...@@ -615,7 +616,6 @@ function discover($schmode = 0,&$data=NULL)
} }
} }
} }
include_once GAME_ROOT.'./include/game/attr.func.php';
$mode_dice = rand(0,99); $mode_dice = rand(0,99);
if($mode_dice < $schmode) if($mode_dice < $schmode)
{ {
...@@ -636,12 +636,12 @@ function discover($schmode = 0,&$data=NULL) ...@@ -636,12 +636,12 @@ function discover($schmode = 0,&$data=NULL)
//移除了重复调用discover()的设定,尝试用一种正常一点的办法确保敌人/尸体发现率符合基础设定值,不然现在的尸体确实太难摸了。 //移除了重复调用discover()的设定,尝试用一种正常一点的办法确保敌人/尸体发现率符合基础设定值,不然现在的尸体确实太难摸了。
//现在触发遇敌事件只会返回三种结果:1、发现尸体;2、发现敌人、3、敌人隐藏起来;所以实际的尸体发现率=$enemyrate*$corpse_obbs //现在触发遇敌事件只会返回三种结果:1、发现尸体;2、发现敌人、3、敌人隐藏起来;所以实际的尸体发现率=$enemyrate*$corpse_obbs
$meetman_flag = 0; $meetman_flag = 0;
include_once GAME_ROOT.'./include/game/revattr.func.php';
foreach($enemyarray as $enum) foreach($enemyarray as $enum)
{ {
$db->data_seek($result, $enum); $db->data_seek($result, $enum);
$edata = $db->fetch_array($result); $edata = $db->fetch_array($result);
$edata['clbpara'] = get_clbpara($edata['clbpara']); # 使用fetch_playerdata_by_pid重新获取敌人数据,以应用各种在载入玩家数据时进行的判定
$edata = fetch_playerdata_by_pid($edata['pid']);
if(!$edata['type'] || $gamestate < 50) if(!$edata['type'] || $gamestate < 50)
{ {
if($edata['hp'] <= 0) if($edata['hp'] <= 0)
...@@ -677,11 +677,11 @@ function discover($schmode = 0,&$data=NULL) ...@@ -677,11 +677,11 @@ function discover($schmode = 0,&$data=NULL)
if(!empty($edata['clbpara']['mate']) && in_array($pid,$edata['clbpara']['mate'])) continue; if(!empty($edata['clbpara']['mate']) && in_array($pid,$edata['clbpara']['mate'])) continue;
# 灵子状态只能遭遇同为灵子状态的对象,非灵子状态对象无法发现灵子状态下的对象……但是尸体就没有这种考量了 # 灵子状态只能遭遇同为灵子状态的对象,非灵子状态对象无法发现灵子状态下的对象……但是尸体就没有这种考量了
if(($edata['pose'] == 8 || $data['pose'] == 8) && $data['pose'] != $edata['pose']) continue; if(($edata['pose'] == 8 || $data['pose'] == 8) && $data['pose'] != $edata['pose']) continue;
# 「量心」技能效果判定: # 「量心」技能效果判定(不会遭遇HP为1的敌人)
if(!check_skill_unlock('c19_dispel',$data) && !empty(get_skillpara('c19_dispel','active',$clbpara)) && $edata['hp'] <= 1) continue; if(!check_skill_unlock('c19_dispel',$data) && !empty(get_skillpara('c19_dispel','active',$clbpara)) && $edata['hp'] == 1) continue;
# 计算活人发现率 # 计算活人发现率
$hide_r = get_hide_r_rev($data,$edata); $hide_r = \revbattle\calc_hide_rate($data,$edata);
$enemy_dice = diceroll(99); $enemy_dice = diceroll(99);
# 把find_r杀了,现在技能都是用躲避率去判断的了,躲避率为负就等于发现率增幅了 # 把find_r杀了,现在技能都是用躲避率去判断的了,躲避率为负就等于发现率增幅了
$meetman_flag = $enemy_dice < ($enemy_obbs - $hide_r) ? 1 : -1; $meetman_flag = $enemy_dice < ($enemy_obbs - $hide_r) ? 1 : -1;
...@@ -699,7 +699,6 @@ function discover($schmode = 0,&$data=NULL) ...@@ -699,7 +699,6 @@ function discover($schmode = 0,&$data=NULL)
{ {
$bid = $edata['pid']; $bid = $edata['pid'];
$action = 'team'; $action = 'team';
include_once GAME_ROOT.'./include/game/battle.func.php';
findteam($edata); findteam($edata);
return; return;
} }
...@@ -708,7 +707,6 @@ function discover($schmode = 0,&$data=NULL) ...@@ -708,7 +707,6 @@ function discover($schmode = 0,&$data=NULL)
{ {
$bid = $edata['pid']; $bid = $edata['pid'];
$action = 'neut'; $action = 'neut';
include_once GAME_ROOT.'./include/game/revbattle.func.php';
findneut($edata,1); findneut($edata,1);
return; return;
} }
...@@ -716,12 +714,8 @@ function discover($schmode = 0,&$data=NULL) ...@@ -716,12 +714,8 @@ function discover($schmode = 0,&$data=NULL)
else else
{ {
battle_flag: battle_flag:
include_once GAME_ROOT.'./include/game/revbattle.func.php';
include_once GAME_ROOT.'./include/game/revcombat.func.php';
//刷新敌人时效性状态
if(!empty($edata['clbpara']['lasttimes'])) $edata = check_skilllasttimes($edata);
//计算先攻概率 //计算先攻概率
$active_r = get_active_r_rev($data,$edata); $active_r = \revbattle\calc_active_rate($data,$edata);
$bid = $edata['pid']; $bid = $edata['pid'];
$active_dice = diceroll(99); $active_dice = diceroll(99);
//先制 //先制
...@@ -731,12 +725,12 @@ function discover($schmode = 0,&$data=NULL) ...@@ -731,12 +725,12 @@ function discover($schmode = 0,&$data=NULL)
if($data['pass'] != 'bot') if($data['pass'] != 'bot')
{ {
findenemy_rev($edata); \revbattle\findenemy_rev($edata);
} }
else else
{ {
echo "进入战斗!<br>"; echo "进入战斗!<br>";
rev_combat_prepare($data,$edata,1,'',0); \revcombat\rev_combat_prepare($data,$edata,1,'',0);
} }
return; return;
} }
...@@ -746,11 +740,11 @@ function discover($schmode = 0,&$data=NULL) ...@@ -746,11 +740,11 @@ function discover($schmode = 0,&$data=NULL)
if($data['pass'] != 'bot') if($data['pass'] != 'bot')
{ {
rev_combat_prepare($edata,$data,0); \revcombat\rev_combat_prepare($edata,$data,0);
} }
else else
{ {
rev_combat_prepare($edata,$data,0,'',0); \revcombat\rev_combat_prepare($edata,$data,0,'',0);
} }
return; return;
} }
...@@ -775,10 +769,12 @@ function discover($schmode = 0,&$data=NULL) ...@@ -775,10 +769,12 @@ function discover($schmode = 0,&$data=NULL)
} }
$mode = 'command'; $mode = 'command';
return; return;
} else { }
else
{
//echo "进入道具判定<br>"; //echo "进入道具判定<br>";
$find_r = get_find_r($weather,$pls,$pose,$tactic,$club,$inf); //$find_r = get_find_r($weather,$pls,$pose,$tactic,$club,$inf);
$find_obbs = $item_obbs + $find_r; $find_obbs = $item_obbs;
$item_dice = rand(0,99); $item_dice = rand(0,99);
if($item_dice < $find_obbs) if($item_dice < $find_obbs)
{ {
...@@ -838,7 +834,6 @@ function focus_item(&$data=NULL,$id=NULL) ...@@ -838,7 +834,6 @@ function focus_item(&$data=NULL,$id=NULL)
$db->query("DELETE FROM {$tablepre}mapitem WHERE iid='$iid'"); $db->query("DELETE FROM {$tablepre}mapitem WHERE iid='$iid'");
if($itms0) if($itms0)
{ {
include_once GAME_ROOT.'./include/game/itemmain.func.php';
if($data['pass'] == 'bot') if($data['pass'] == 'bot')
{ {
itemget($data); itemget($data);
......
<?php <?php
if (! defined ( 'IN_GAME' )) { if (! defined ( 'IN_GAME' )) {
exit ( 'Access Denied' ); exit ( 'Access Denied' );
} }
function death($death, $kname = '', $ktype = 0, $annex = '',&$data=NULL)
{
//global $name, $state, $deathtime, $type, $lvl, $bid, $hp, $mhp, $wp, $wk, $wg, $wc, $wd, $wf, $sp, $msp, $club, $pls , $nick;
# 没有目标击杀,自然死亡时的事件(可能也不是那么“自然”……)
function death($death, $kname = '', $ktype = 0, $annex = '',&$data=NULL)
{
global $now, $db, $tablepre, $gtablepre, $alivenum, $deathnum, $killmsginfo, $typeinfo, $weather; global $now, $db, $tablepre, $gtablepre, $alivenum, $deathnum, $killmsginfo, $typeinfo, $weather;
if(!isset($data)) if(!isset($data))
...@@ -19,9 +18,8 @@ function death($death, $kname = '', $ktype = 0, $annex = '',&$data=NULL) ...@@ -19,9 +18,8 @@ function death($death, $kname = '', $ktype = 0, $annex = '',&$data=NULL)
$bid = 0; $action = ''; $bid = 0; $action = '';
if (! $death) { if (!$death) return;
return;
}
$hp = 0; $hp = 0;
if ($death == 'N') { if ($death == 'N') {
$state = 20; $state = 20;
...@@ -108,71 +106,539 @@ function death($death, $kname = '', $ktype = 0, $annex = '',&$data=NULL) ...@@ -108,71 +106,539 @@ function death($death, $kname = '', $ktype = 0, $annex = '',&$data=NULL)
addnews ( $now, 'death' . $state, $name, $type, $knname, $annex, $lastword ); addnews ( $now, 'death' . $state, $name, $type, $knname, $annex, $lastword );
//$alivenum = $db->result($db->query("SELECT COUNT(*) FROM {$tablepre}players WHERE hp>0 AND type=0"), 0); //$alivenum = $db->result($db->query("SELECT COUNT(*) FROM {$tablepre}players WHERE hp>0 AND type=0"), 0);
$revival_flag = false; save_gameinfo ();
if (!$revival_flag && $type==0 && $club==99 && ($death=="N" || $death=="P" || $death=="K" || $death=="G" || $death=="C" || $death=="D" || $death=="F" || $death=="J" || $death=="trap")) return $killmsg;
}
# 执行不需要考虑复活问题的击杀事件:
# 再重复一遍:这里的第一个参数指的是杀人者(敌对方)视角,第二个参数指的是死者(受到伤害者)视角。
function pre_kill_events(&$pa,&$pd,$active,$death)
{ {
addnews($now,'revival',$name); //玩家春哥附体称号的处理 global $log, $now, $db, $gtablepre, $tablepre, $typeinfo, $lwinfo;
$hp=$mhp; $sp=$msp;
$club=17; $state=0; // 登记死法
$alivenum++; // 传入了数字编号死法
if (is_numeric($death)) {
$pd['state'] = $death;
// 否则按照指定武器类型判断
} elseif ($death == 'N') {
$pd['state'] = 20;
} elseif ($death == 'P') {
$pd['state'] = 21;
} elseif ($death == 'K') {
$pd['state'] = 22;
} elseif ($death == 'G') {
$pd['state'] = 23;
} elseif ($death == 'J') {
$pd['state'] = 23;
} elseif ($death == 'C') {
$pd['state'] = 24;
} elseif ($death == 'D') {
$pd['state'] = 25;
} elseif ($death == 'F') {
$pd['state'] = 29;
} elseif ($death == 'poison') {
$pd['state'] = 26;
} elseif ($death == 'trap') {
$pd['state'] = 27;
} elseif ($death == 'dn') {
$pd['state'] = 28;
} else {
$pd['state'] = 10;
}
//初始化死者信息
$dtype = $pd['type']; $dname = $pd['name']; $dpls = $pd['pls'];
$lwname = $typeinfo [$dtype] . ' ' . $dname;
//初始化NPC遗言
if($dtype)
{
$lastword = is_array($lwinfo[$dtype]) ? $lwinfo[$dtype][$dname] : $lwinfo[$dtype];
}
//初始化玩家遗言
else
{
$result = $db->query ( "SELECT lastword FROM {$gtablepre}users WHERE username ='$dname'");
$lastword = $db->result ( $result, 0 );
}
//向聊天框发送遗言
$db->query ( "INSERT INTO {$tablepre}chat (type,`time`,send,recv,msg) VALUES ('3','$now','$lwname','$dpls','$lastword')" );
//发送news
$kname = $pa['type'] ? $pa['name'] : get_title_desc($pa['nick']).' '.$pa['name'];
//$dname = $pd['type'] ? $pd['name'] : get_title_desc($pd['nick']).' '.$pd['name'];
addnews ($now,'death'.$pd['state'],$dname,$dtype,$kname,$pa['wep_name'],$lastword );
return $lastword;
} }
if(!$revival_flag) # 执行复活事件:
# 重要的事情要说三次:这里的第一个参数指的是杀人者(敌对方)视角,第二个参数指的是死者(受到伤害者)视角。
function revive_process(&$pa,&$pd,$active)
{ {
//死亡时灵魂绑定的道具也会消失 嗨呀 死了没复活才会消失 global $log,$weather,$now,$gamevars;
global $wep,$arb,$arh,$ara,$arf,$art,$itm1,$itm2,$itm3,$itm4,$itm5,$itm6; include_once GAME_ROOT.'./include/game/clubslct.func.php';
global $weps,$arbs,$arhs,$aras,$arfs,$arts,$itms1,$itms2,$itms3,$itms4,$itms5,$itms6;
global $wepe,$arbe,$arhe,$arae,$arfe,$arte,$itme1,$itme2,$itme3,$itme4,$itme5,$itme6; if(empty($pa['nm'])) $pa['nm'] = $active && !$pa['type'] ? '你' : $pa['name'];
global $wepk,$arbk,$arhk,$arak,$arfk,$artk,$itmk1,$itmk2,$itmk3,$itmk4,$itmk5,$itmk6; if(empty($pd['nm'])) $pd['nm'] = !$active && !$pd['type'] ? '你' : $pd['name'];
global $wepsk,$arbsk,$arhsk,$arask,$arfsk,$artsk,$itmsk1,$itmsk2,$itmsk3,$itmsk4,$itmsk5,$itmsk6;
global $log; $revival_flag = 0;
for($i = 1;$i <= 6;$i++){
if(strpos(${'itmsk'.$i},'v')!==false){ $dname = $pd['type'] ? $pd['name'] : get_title_desc($pd['nick']).' '.$pd['name'];
$log .= "伴随着你的死亡,<span class=\"yellow\">${'itm'.$i}</span>也化作灰烬消散了。<br>";
${'itm'.$i} = ${'itmk'.$i} = ${'itmsk'.$i} = ''; #光玉雨天气下,提供者有概率复活
${'itme'.$i} = ${'itms'.$i} = 0; if (!$revival_flag && $weather == 18 && $gamevars['wth18pid'] == $pd['pid'])
//return; {
} # 计算雨势
if(strpos($wepsk,'v')!==false){ $wthlastime = $now - $gamevars['wth18stime'];
$log .= "伴随着你的死亡,<span class=\"yellow\">{$wep}</span>也化作灰烬消散了。<br>"; # 雨势在前7分钟递增,后3分钟递减
$wep='拳头';$wepk ='WN';$wepsk =''; $wthlastime = $wthlastime <= 420 ? $wthlastime : 600 - $wthlastime;
$weps='∞';$wepe = 0; $wthpow = min(7,max(1,round($wthlastime / 60)));
} # 复活概率:基础10% + 效力x2 最高24%
if(strpos($arbsk,'v')!==false){ $wth18_obbs = 10 + diceroll($wthpow) + diceroll($wthpow);
$log .= "伴随着你的死亡,<span class=\"yellow\">{$arb}</span>也化作灰烬消散了。<br>"; $wth18_dice = diceroll(99);
$arb='内衣';$arbk ='DN';$arbsk =''; if($wth18_dice < $wth18_obbs)
$arbs='∞';$arbe = 0; {
} #奥罗拉复活效果
if(strpos($arhsk,'v')!==false){ $revival_flag = 18; //保存复活标记为通过光玉雨复活
$log .= "伴随着你的死亡,<span class=\"yellow\">{$arh}</span>也化作灰烬消散了。<br>"; addnews($now,'wth18_revival',$dname);
$arh=$arhk=$arhsk =''; $pd['hp'] += min($pd['mhp'],max($wth18_obbs,1));
$arhs=$arhe = 0; $pd['sp'] += min($pd['msp'],max($wth18_obbs,1));
} $pd['state'] = 0;
if(strpos($arask,'v')!==false){ $log.= "<span class=\"lime\">但是,飞舞着的光玉们钻进了{$pd['nm']}的身体,让{$pd['nm']}重新站了起来!</span><br>";;
$log .= "伴随着你的死亡,<span class=\"yellow\">{$ara}</span>也化作灰烬消散了。<br>"; return $revival_flag;
$ara=$arak=$arask =''; }
$aras=$arae = 0; }
}
if(strpos($arfsk,'v')!==false){ #极光天气下,玩家有10%概率、NPC有1%概率无条件复活
$log .= "伴随着你的死亡,<span class=\"yellow\">{$arf}</span>也化作灰烬消散了。<br>"; if (!$revival_flag && $weather == 17)
$arf=$arfk=$arfsk =''; {
$arfs=$arfe = 0; $aurora_rate = $pd['type'] ? 1 : 10; //玩家10%概率复活
} $aurora_dice = diceroll(99);
if(strpos($artsk,'v')!==false){ if($aurora_dice<=$aurora_rate)
$log .= "伴随着你的死亡,<span class=\"yellow\">{$art}</span>也化作灰烬消散了。<br>"; {
$art=$artk=$artsk =''; #奥罗拉复活效果
$arts=$arte = 0; $revival_flag = 17; //保存复活标记为通过奥罗拉复活
addnews($now,'aurora_revival',$dname);
$pd['hp'] += min($pd['mhp'],max($aurora_dice,1));
$pd['sp'] += min($pd['msp'],max($aurora_dice,1));
$pd['state'] = 0;
$log.= "<span class=\"lime\">但是,空气中弥漫着的奥罗拉让{$pd['nm']}重新站了起来!</span><br>";;
return $revival_flag;
}
}
# 「涅槃」复活:
if (!$revival_flag && isset($pd['skill_c19_nirvana']))
{
# 「涅槃」复活效果:
$revival_flag = 'nirvan'; //保存复活标记为通过技能复活
addnews($now,'revival',$dname);
# 添加「涅槃」激活次数
set_skillpara('c19_nirvana','active_t',get_skillpara('c19_nirvana','active_t',$pd['clbpara'])+1,$pd['clbpara']);
$pd['state'] = 0;
$pd['hp'] = 1; $pd['sp'] = 1;
# 将多出的rp转化为生命和防御力
if($pd['rp'])
{
$tot_rp = abs(round($pd['rp']/2));
if($tot_rp)
{
$pd['mhp'] += $tot_rp; $pd['def'] += $tot_rp;
}
$pd['rp'] = 0;
}
$log .= '<span class="lime">但是,'.$pd['nm'].'涅槃重生了!</span><br>';
return $revival_flag;
} }
return $revival_flag;
} }
# 执行死透了后的事件:
function final_kill_events(&$pa,&$pd,$active,$last=0)
{
global $log,$now,$alivenum,$deathnum,$db,$gtablepre,$tablepre;
if(empty($pa['nm'])) $pa['nm'] = $active && !$pa['type'] ? '你' : $pa['name'];
if(empty($pd['nm'])) $pd['nm'] = !$active && !$pd['type'] ? '你' : $pd['name'];
$pd['hp'] = 0; $pd['bid'] = $pa['pid']; $pd['action'] = '';
$pd['endtime'] = $pd['deathtime'] = $now;
# 初始化遗言
if (!$pd['type'])
{
//死者是玩家,增加击杀数并保存系统状况。
$pa['killnum'] ++;
$alivenum --; $alivenum --;
if(!empty($last)) $log .= "<span class='evergreen'>你用尽最后的力气喊道:“".$last."”</span><br>";
}
else
{
//死者是NPC,加载NPC遗言
if(!empty($last)) $log .= npc_chat_rev ($pd,$pa, 'death' );
}
$deathnum ++; $deathnum ++;
# 初始化killmsg
if(!$pa['type'])
{
global $db,$tablepre;
$pname = $pa['name'];
$result = $db->query("SELECT killmsg FROM {$gtablepre}users WHERE username = '$pname'");
$killmsg = $db->result($result,0);
if(!empty($killmsg)) $log .= "<span class=\"evergreen\">{$pa['nm']}{$pd['nm']}说:“{$killmsg}”</span><br>";
}
else
{
$log .= npc_chat_rev ($pa,$pd,'kill');
}
# 杀人rp结算
get_killer_rp($pa,$pd,$active);
# 执行死亡事件(灵魂绑定等)
check_death_events($pa,$pd,$active);
# 检查成就 大补丁:击杀者是玩家时才会检查成就
if(!$pa['type'])
{
include_once GAME_ROOT.'./include/game/achievement.func.php';
check_battle_achievement_rev($pa,$pd);
}
# 保存游戏进行状态
include_once GAME_ROOT.'./include/system.func.php';
save_gameinfo();
return;
}
# 特殊死亡事件(灵魂绑定等)
function check_death_events(&$pa,&$pd,$active)
{
global $db,$tablepre,$log,$now,$nosta;
# 静流下线事件:
if($pd['type'] == 15)
{
//静流AI
global $gamevars;
$gamevars['sanmadead'] = 1;
save_gameinfo();
}
# 保存击杀女主的记录
if($pd['type'] == 14)
{
$pa['clbpara']['achvars']['kill_n14'] += 1;
# 不一定是一击秒杀……但是先这样吧^ ^;
if($pd['name'] == '守卫者 静流' && $pa['final_damage'] >= $pd['mhp']) $pa['clbpara']['achvars']['ach505'] = 1;
}
# 保存击杀种火或小兵的记录
if(empty($pa['clbpara']['achvars']['kill_minion']) && ($pd['type'] == 90 || $pd['type'] == 91 || $pd['type'] == 92)) $pa['clbpara']['achvars']['kill_minion'] = 1;
# 成就504,保存在RF高校用过的武器记录
if($pa['pls'] == 2) $pa['clbpara']['achvars']['ach504'][$pa['wep_kind']] = 1;
# 快递被劫事件:
if(isset($pd['clbpara']['post']))
{
$log.="<span class='sienna'>某样东西从{$pd['name']}身上掉了出来……</span><br>";
//获取快递信息
$iid = $pd['clbpara']['postid'];
//获取金主信息
$sponsorid = $pd['clbpara']['sponsor'];
$result = $db->query("SELECT * FROM {$tablepre}gambling WHERE uid = '$sponsorid'");
$sordata = $db->fetch_array($result);
//发一条news 表示快递被劫走了
addnews($now,'gpost_failed',$sordata['uname'],$pd['itm'.$iid]);
//消除快递相关参数
unset($pd['clbpara']['post']);unset($pd['clbpara']['postid']);unset($pd['clbpara']['sponsor']);
//解除快递锁
$db->query("UPDATE {$tablepre}gambling SET bnid=0 WHERE uid='$sponsorid'");
}
# 灵魂绑定事件:
foreach(Array('wep','arb','arh','ara','arf','art') as $equip)
{
// ……我为什么不把这个装备名数组放进resources里……用了一万遍了
if(!empty($pd[$equip.'s']) && strpos($pd[$equip.'sk'],'v')!==false)
{
$log .= "伴随着{$pd['nm']}的死亡,<span class=\"yellow\">{$pd[$equip]}</span>也化作灰烬消散了。<br>";
$pd[$equip] = $pd[$equip.'k'] = $pd[$equip.'sk'] = '';
$pd[$equip.'e'] = $pd[$equip.'s'] = 0;
if($equip == 'wep')
{
$pd[$equip] = '拳头'; $pd[$equip.'k'] = 'WN'; $pd[$equip.'sk'] = '';
$pd[$equip.'e'] = 0; $pd[$equip.'s'] = $nosta;
}
elseif($equip == 'arb')
{
$pd[$equip] = '内衣'; $pd[$equip.'k'] = 'DN'; $pd[$equip.'sk'] = '';
$pd[$equip.'e'] = 0; $pd[$equip.'s'] = $nosta;
}
}
}
for($i=0;$i<=6;$i++)
{
if(!empty($pd['itms'.$i]) && strpos($pd['itmsk'.$i],'v')!==false)
{
$log .= "伴随着{$pd['nm']}的死亡,<span class=\"yellow\">{$pd['itm'.$i]}</span>也化作灰烬消散了。<br>";
$pd['itm'.$i] = $pd['itmk'.$i] = $pd['itmsk'.$i] = '';
$pd['itme'.$i] = $pd['itms'.$i] = 0;
}
} }
save_gameinfo ();
return $killmsg;
}
#「掠夺」判定:
if(isset($pa['skill_c4_loot']))
{
//获取抢钱率
$sk_p = get_skillvars('c4_loot','goldr');
$lootgold = $pa['lvl'] * $sk_p;
$log.="<span class='yellow'>「掠夺」使{$pa['nm']}获得了{$lootgold}元!</span><br>";
}
function kill($death, $dname, $dtype = 0, $dpid = 0, $annex = '', &$revival_flag=0) { # 「天威」技能判定
if(isset($pa['bskill_c6_godpow']) && $pa['final_damage'] <= $pd['mhp'] * get_skillvars('c6_godpow','mhpr'))
{
$rageback = get_skillvars('c6_godpow','rageback');
if(!empty($rageback))
{
$pa['rage'] = max(255,$pa['rage']+$rageback);
$log .= '<span class="yellow">「天威」使'.$pa['nm'].'的怒气回复了'.$rageback.'点!</span><br>';
}
}
# 「浴血」技能判定
if(isset($pa['skill_c12_bloody']))
{
if($pa['hp'] <= $pa['mhp']*0.3) $sk_lvl = 2;
elseif($pa['hp'] <= $pa['mhp']*0.5) $sk_lvl = 1;
else $sk_lvl = 0;
$sk_att_vars = get_skillvars('c12_bloody','attgain',$sk_lvl);
$sk_def_vars = get_skillvars('c12_bloody','defgain',$sk_lvl);
$pa['att'] += $sk_att_vars; $pa['def'] += $sk_def_vars;
$log .= '<span class="yellow">「浴血」使'.$pa['nm'].'的攻击增加了'.$sk_att_vars.'点,防御增加了'.$sk_def_vars.'点!</span><br>';
}
# 佣兵死亡时,自动解除与雇主的雇佣关系
if(isset($pd['clbpara']['oid']))
{
$odata = fetch_playerdata_by_pid($pd['clbpara']['oid']);
include_once GAME_ROOT.'./include/game/revclubskills_extra.func.php';
$log .= "<span clas='red'>由于战死,";
skill_merc_fire('c11_merc',$pd['clbpara']['mkey'],$pd,1);
}
# 灵俑死亡时,从创造者的灵俑队列中删除
if(isset($pd['clbpara']['zombieoid']))
{
$odata = fetch_playerdata_by_pid($pd['clbpara']['zombieoid']);
$mkey = array_search($pd['pid'],$odata['clbpara']['mate']);
unset($odata['clbpara']['mate'][$mkey]);
$zkey = array_search($pd['pid'],$odata['clbpara']['zombieid']);
unset($odata['clbpara']['zombieid'][$zkey]);
player_save($odata);
$w_log = "<span class=\"grey\">你的灵俑{$pd['name']}归于尘土了……</span><br>";
logsave($odata['pid'],$now,$w_log,'c');
}
return;
}
# 怒气上涨事件
function rgup_rev(&$pa,&$pd,$active)
{
# 攻击命中的情况下,计算pa(攻击方)因攻击行为获得的怒气
if($pa['hitrate_times'] > 0)
{
# pa(攻击方)拥有重击辅助属性,每次攻击额外获得1~2点怒气
if(!empty($pa['ex_keys']) && in_array('c',$pa['ex_keys']))
{
$pa_rgup = rand(1,2);
$pa['rage'] = min(255,$pa['rage']+$pa_rgup);
# 成功发动战斗技时,额外返还10%怒气
if(isset($pa['bskill']) && isset($pa['bskill_'.$pa['bskill']]))
{
$bsk = $pa['bskill'];
$bsk_cost = get_skillvars($bsk,'ragecost');
if($bsk_cost)
{
$pa['rage'] += round($bsk_cost*0.1);
# 必杀技能额外返还15点怒气
if($bsk == 'c9_lb') $pa['rage'] += get_skillvars('c9_lb','rageback');
}
}
}
}
# 无论攻击是否命中,计算pd(防守方)因挨打获得的怒气
$rgup = round(($pa['lvl'] - $pd['lvl'])/3);
# 单次获得怒气上限:15
$rgup = min(15,max(1,$rgup));
# 「灭气」技能效果
if(isset($pd['skill_c1_burnsp'])) $rgup += rand(1,2);
$pd['rage'] = min(255,$pd['rage']+$rgup);
return;
}
# 战斗后结算rp事件
function get_killer_rp(&$pa,&$pd,$active)
{
# 杀人rp结算
$rpup = $pd['type'] ? 20 : max(80,$pd['rp']);
rpup_rev($pa,$rpup);
return;
}
# rp上涨事件
function rpup_rev(&$pa,$rpup)
{
# 「转业」效果判定
if(!check_skill_unlock('c19_reincarn',$pa))
{
$sk = 'c19_reincarn';
$sk_lvl = get_skilllvl($sk,$pa);
if($rpup > 0)
{
$sk_var = get_skillvars($sk,'rpgain',$sk_lvl);
$rpup = round($rpup*(1-($sk_var/100)));
}
else
{
$sk_var = get_skillvars($sk,'rploss',$sk_lvl);
$rpup = round($rpup*(1+($sk_var/100)));
}
}
$pa['rp'] += $rpup;
}
# 经验上涨事件
function expup_rev(&$pa,&$pd,$active)
{
global $log,$baseexp;
# 攻击命中的情况下,计算获得经验
if($pa['hitrate_times'] > 0)
{
$expup = round ( ($pd['lvl'] - $pa['lvl']) / 3 );
$expup = $expup > 0 ? $expup : 1;
}
# 攻击未命中,也许有其他渠道获得经验
else
{
#「反思」技能效果
if(isset($pa['skill_c5_review'])) $expup = 1;
}
if(isset($pa['bskill_c10_decons']) && $pa['final_damage'] > $pd['hp'])
{
$sk_up = ceil($pd['lvl'] - ($pa['lvl']*0.15));
$log.='<span class="yellow">「解构」使'.$pa['nm'].'获得了额外'.$sk_up.'点经验!</span><br>';
$expup += $sk_up;
}
if(!empty($expup)) $pa['exp'] += $expup;
//$log .= "$isplayer 的经验值增加 $expup 点<br>";
//升到下级所需的exp 直接在这里套公式计算 不用global了
$pa['upexp'] = round(($pa['lvl']*$baseexp)+(($pa['lvl']+1)*$baseexp));
if ($pa['exp'] >= $pa['upexp'])
{
lvlup_rev ($pa,$pd,$active);
}
return;
}
# 等级提升事件
function lvlup_rev(&$pa,&$pd,$active)
{
global $log,$baseexp,$upexp;
if(empty($pa['nm'])) $pa['nm'] = $active ? '你' : $pa['name'];
$up_exp_temp = round ( (2 * $pa['lvl'] + 1) * $baseexp );
if ($pa['exp'] >= $up_exp_temp && $pa['lvl'] < 255)
{
$sklanginfo = Array ('wp' => '殴熟', 'wk' => '斩熟', 'wg' => '射熟', 'wc' => '投熟', 'wd' => '爆熟', 'wf' => '灵熟', 'all' => '全系熟练度' );
$sknlist = Array (1 => 'wp', 2 => 'wk', 3 => 'wc', 4 => 'wg', 5 => 'wd', 9 => 'wf', 12 => 'all' );
$skname = isset($sknlist[$pa['club']]) ? $sknlist[$pa['club']] : 0;
//升级判断
$lvup = 1 + floor (($pa['exp'] - $up_exp_temp)/$baseexp/2);
$lvup = $lvup > 255 - $pa['lvl'] ? 255 - $pa['lvl'] : $lvup;
$lvuphp = $lvupatt = $lvupdef = $lvupskill = $lvupsp = $lvupspref = 0;
//升级数值计算
for($i = 0; $i < $lvup; $i += 1)
{
if ($pa['club'] == 12) {
$lvuphp += rand ( 14, 18 );
} else {
$lvuphp += rand ( 8, 10 );
}
$lvupsp += rand( 4,6);
if ($pa['club'] == 12) {
$lvupatt += rand ( 4, 6 );
$lvupdef += rand ( 5, 8 );
} else {
$lvupatt += rand ( 2, 4 );
$lvupdef += rand ( 3, 5 );
}
if ($skname == 'all') {
$lvupskill += rand ( 2, 4 );
}elseif ($skname == 'wf') {
$lvupskill += rand ( 3, 5 );
}elseif ($skname == 'wd') {
$lvupskill += rand ( 6, 8 );
}elseif($skname){
$lvupskill += rand ( 4, 6 );
}
$lvupspref += round($pa['msp'] * 0.1);
}
//应用升级
$pa['lvl'] += $lvup;
$up_exp_temp = round ( (2 * $pa['lvl'] + 1) * $baseexp );
if ($pa['lvl'] >= 255) {
$pa['lvl'] = 255;
$pa['exp'] = $up_exp_temp;
}
$pa['upexp'] = $up_exp_temp;
$pa['hp'] += $lvuphp;
$pa['mhp'] += $lvuphp;
$pa['sp'] += $lvupsp;
$pa['msp'] += $lvupsp;
$pa['att'] += $lvupatt;
$pa['def'] += $lvupdef;
$pa['skillpoint'] += $lvup;
if(!empty($skname))
{
if ($skname == 'all') {
$pa['wp'] += $lvupskill;
$pa['wk'] += $lvupskill;
$pa['wg'] += $lvupskill;
$pa['wc'] += $lvupskill;
$pa['wd'] += $lvupskill;
$pa['wf'] += $lvupskill;
} elseif ($skname) {
$pa[$skname] += $lvupskill;
}
}
$pa['sp'] = min($lvupspref+$pa['sp'],$pa['msp']);
if ($skname) {
$sklog = ",{$sklanginfo[$skname]}+{$lvupskill}";
}
$lvlup_log = "<span class=\"yellow\">{$pa['nm']}升了{$lvup}级!生命上限+{$lvuphp},体力上限+{$lvupsp},攻击+{$lvupatt},防御+{$lvupdef}";
if(isset($sklog)) $lvlup_log .= $sklog;
$lvlup_log .= ",体力恢复了{$lvupspref},获得了{$lvup}点技能点!</span><br>";
if(!$pa['type'])
{
if($pa['nm'] == '你') $log.= $lvlup_log;
else $pa['lvlup_log'] = $lvlup_log;
}
} elseif ($pa['lvl'] >= 255) {
$pa['lvl'] = 255;
$pa['exp'] = $up_exp_temp;
}
$upexp = round(($pa['lvl']*$baseexp)+(($pa['lvl']+1)*$baseexp));
return;
}
/*
function kill($death, $dname, $dtype = 0, $dpid = 0, $annex = '', &$revival_flag=0) {
global $now, $db, $tablepre, $gtablepre; global $now, $db, $tablepre, $gtablepre;
global $alivenum, $deathnum, $name, $w_state, $type, $pid, $typeinfo, $pls, $lwinfo, $w_achievement; global $alivenum, $deathnum, $name, $w_state, $type, $pid, $typeinfo, $pls, $lwinfo, $w_achievement;
global $weather; global $weather;
...@@ -262,7 +728,7 @@ function kill($death, $dname, $dtype = 0, $dpid = 0, $annex = '', &$revival_flag ...@@ -262,7 +728,7 @@ function kill($death, $dname, $dtype = 0, $dpid = 0, $annex = '', &$revival_flag
/*$db->query ( "UPDATE {$tablepre}players SET hp=mhp WHERE pid=$dpid" ); /*$db->query ( "UPDATE {$tablepre}players SET hp=mhp WHERE pid=$dpid" );
$db->query ( "UPDATE {$tablepre}players SET sp=msp WHERE pid=$dpid" ); $db->query ( "UPDATE {$tablepre}players SET sp=msp WHERE pid=$dpid" );
$db->query ( "UPDATE {$tablepre}players SET club=17 WHERE pid=$dpid" ); $db->query ( "UPDATE {$tablepre}players SET club=17 WHERE pid=$dpid" );
$db->query ( "UPDATE {$tablepre}players SET state=0 WHERE pid=$dpid" );*/ $db->query ( "UPDATE {$tablepre}players SET state=0 WHERE pid=$dpid" );
$alivenum++; $alivenum++;
$revivaled = 99; $revivaled = 99;
} }
...@@ -280,9 +746,9 @@ function kill($death, $dname, $dtype = 0, $dpid = 0, $annex = '', &$revival_flag ...@@ -280,9 +746,9 @@ function kill($death, $dname, $dtype = 0, $dpid = 0, $annex = '', &$revival_flag
player_save($res); player_save($res);
save_gameinfo(); save_gameinfo();
return $killmsg; return $killmsg;
} }
function lvlup(&$lvl, &$exp, $isplayer = 1) { function lvlup(&$lvl, &$exp, $isplayer = 1) {
global $baseexp; global $baseexp;
$up_exp_temp = round ( (2 * $lvl + 1) * $baseexp ); $up_exp_temp = round ( (2 * $lvl + 1) * $baseexp );
if ($exp >= $up_exp_temp && $lvl < 255) { if ($exp >= $up_exp_temp && $lvl < 255) {
...@@ -370,12 +836,12 @@ function lvlup(&$lvl, &$exp, $isplayer = 1) { ...@@ -370,12 +836,12 @@ function lvlup(&$lvl, &$exp, $isplayer = 1) {
$exp = $up_exp_temp; $exp = $up_exp_temp;
} }
return; return;
} }*/
//玩家被攻击时的生命恢复未实现 //玩家被攻击时的生命恢复未实现
function calculate_rest_upsp($rtime,&$pa) function calculate_rest_upsp($rtime,&$pa)
{ {
global $sleep_time,$db,$tablepre,$log; global $sleep_time,$db,$tablepre,$log;
# 治疗姿态下恢复速率变为3倍 # 治疗姿态下恢复速率变为3倍
if($pa['pose'] == 5) $rtime *= 3; if($pa['pose'] == 5) $rtime *= 3;
...@@ -392,9 +858,9 @@ function calculate_rest_upsp($rtime,&$pa) ...@@ -392,9 +858,9 @@ function calculate_rest_upsp($rtime,&$pa)
} }
} }
return $upsp; return $upsp;
} }
function calculate_rest_uphp($rtime,&$pa) function calculate_rest_uphp($rtime,&$pa)
{ {
global $heal_time,$db,$tablepre,$log; global $heal_time,$db,$tablepre,$log;
# 治疗姿态下恢复速率变为3倍 # 治疗姿态下恢复速率变为3倍
if($pa['pose'] == 5) $rtime *= 3; if($pa['pose'] == 5) $rtime *= 3;
...@@ -414,10 +880,10 @@ function calculate_rest_uphp($rtime,&$pa) ...@@ -414,10 +880,10 @@ function calculate_rest_uphp($rtime,&$pa)
} }
} }
return $uphp; return $uphp;
} }
//静养获得怒气 //静养获得怒气
function calculate_rest_rageup($rtime,&$pa) function calculate_rest_rageup($rtime,&$pa)
{ {
global $rage_time; global $rage_time;
$max_rage = 255; $max_rage = 255;
$rageup = round ($max_rage * $rtime / $rage_time / 100 ); $rageup = round ($max_rage * $rtime / $rage_time / 100 );
...@@ -425,8 +891,8 @@ function calculate_rest_rageup($rtime,&$pa) ...@@ -425,8 +891,8 @@ function calculate_rest_rageup($rtime,&$pa)
$rageup = round ( $rageup / 2 ); $rageup = round ( $rageup / 2 );
} }
return $rageup; return $rageup;
} }
function rest($command,&$data=NULL) { function rest($command,&$data=NULL) {
//global $now, $log, $mode, $cmd, $state, $endtime, $hp, $mhp, $sp, $msp, $sleep_time, $heal_time, $restinfo, $pose, $inf,$club,$exdmginf; //global $now, $log, $mode, $cmd, $state, $endtime, $hp, $mhp, $sp, $msp, $sleep_time, $heal_time, $restinfo, $pose, $inf,$club,$exdmginf;
global $now,$log,$mode,$cmd,$sleep_time,$heal_time,$restinfo,$exdmginf; global $now,$log,$mode,$cmd,$sleep_time,$heal_time,$restinfo,$exdmginf;
global $pdata; global $pdata;
...@@ -510,6 +976,6 @@ function rest($command,&$data=NULL) { ...@@ -510,6 +976,6 @@ function rest($command,&$data=NULL) {
$mode = 'command'; $mode = 'command';
} }
return; return;
} }
?> ?>
...@@ -131,9 +131,9 @@ if($mode == 'enter') { ...@@ -131,9 +131,9 @@ if($mode == 'enter') {
$itm[3] = '★Monster Energy★'; $itm[3] = '★Monster Energy★';
} }
$itmk[3] = 'HB'; $itme[3] = 70; $itms[3] = 15; $itmk[3] = 'HB'; $itme[3] = 70; $itms[3] = 15;
//$itm[5] = 'GRAND OPENING 「开门大吉」'; $itmk[5] = 'p000'; $itme[5] = 1; $itms[5] = 1; $itm[5] = 'GRAND OPENING 「开门大吉」'; $itmk[5] = 'p000'; $itme[5] = 1; $itms[5] = 1;
$dice = rand(0,1); $dice = $dice ? 11 : 19; $dice_name = $clubinfo[$dice]; /*$dice = rand(0,1); $dice = $dice ? 11 : 19; $dice_name = $clubinfo[$dice];
$itm[5] = '「'.$dice_name.' 社团卡」'; $itmk[5] = 'ZB'; $itme[5] = $dice; $itms[5] = 1; $itm[5] = '「'.$dice_name.' 社团卡」'; $itmk[5] = 'ZB'; $itme[5] = $dice; $itms[5] = 1;*/
if ($wingames <=1){ if ($wingames <=1){
$itm[6] = '银白盒子'; $itmk[6] = 'ps'; $itme[6] = 1; $itms[6] = 1; $itmsk[6] = ''; $itm[6] = '银白盒子'; $itmk[6] = 'ps'; $itme[6] = 1; $itms[6] = 1; $itmsk[6] = '';
......
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