Commit c8b3375b authored by Nemo Ma's avatar Nemo Ma Committed by GitHub

Merge pull request #48 from hikawiier/waaagh

rev combat phase 3.16
parents 3bcb080a 980fb95e
...@@ -595,26 +595,22 @@ if($hp > 0){ ...@@ -595,26 +595,22 @@ if($hp > 0){
$mode = 'command'; $mode = 'command';
} elseif ($mode == 'revskpts') { } elseif ($mode == 'revskpts') {
include_once GAME_ROOT.'./include/game/revclubskills.func.php'; include_once GAME_ROOT.'./include/game/revclubskills.func.php';
if(strpos($command,'upgskill_')!==false) $sk = substr($command,9);
if(isset($cskills[$sk]))
{ {
$sk = substr($command,9); if(strpos($command,'upgskill_')!==false)
if(isset(${$command.'_nums'}))
{ {
${$command.'_nums'} = (int)${$command.'_nums'}; # 升级技能
upgclbskills($sk,${$command.'_nums'}); $nums = isset(${$command.'_nums'}) ? (int)${$command.'_nums'} : 1;
} upgclbskills($sk,$nums);
else
{
upgclbskills($sk);
} }
} elseif(strpos($command,'actskill_')!==false)
elseif(strpos($command,'actskill_')!==false)
{
$sk = substr($command,9);
if(isset($cskills[$sk]) && !check_skill_unlock($sk,$pdata))
{ {
# 其他特殊技能按钮
include_once GAME_ROOT.'./include/game/revclubskills_extra.func.php'; include_once GAME_ROOT.'./include/game/revclubskills_extra.func.php';
if($sk == 'c1_veteran') skill_c1_veteran_act($c1_veteran_choice); if($sk == 'c1_veteran') skill_c1_veteran_act($c1_veteran_choice);
elseif($sk == 'c4_roar' || $sk == 'c4_sniper') skill_c4_unlock($sk);
} }
} }
$mode = 'command'; $mode = 'command';
......
...@@ -36,7 +36,7 @@ if($gamestate == 0) { ...@@ -36,7 +36,7 @@ if($gamestate == 0) {
} }
$pdata['clbpara'] = get_clbpara($pdata['clbpara']); $pdata['clbpara'] = get_clbpara($pdata['clbpara']);
extract($pdata); extract($pdata,EXTR_REFS);
init_playerdata(); init_playerdata();
init_profile(); init_profile();
...@@ -140,7 +140,7 @@ if($hp > 0 && !empty($clbpara['lasttimes'])) ...@@ -140,7 +140,7 @@ if($hp > 0 && !empty($clbpara['lasttimes']))
{ {
$pdata = current_player_save(); $pdata = current_player_save();
$pdata['clbpara'] = get_clbpara($pdata['clbpara']); $pdata['clbpara'] = get_clbpara($pdata['clbpara']);
extract($pdata); extract($pdata,EXTR_REFS);
init_playerdata(); init_playerdata();
init_profile(); init_profile();
} }
......
This diff is collapsed.
...@@ -1202,7 +1202,7 @@ function armor_hurt(&$pa,$which,$hurtvalue,$check_sk=0) ...@@ -1202,7 +1202,7 @@ function armor_hurt(&$pa,$which,$hurtvalue,$check_sk=0)
{ {
global $log,$nosta; global $log,$nosta;
if(!empty($pa[$which.'s'])) if(!empty($pa[$which.'s']) && !empty($hurtvalue))
{ {
//无限耐久的防具可以抵挡1次任意点损耗 //无限耐久的防具可以抵挡1次任意点损耗
if ($pa[$which.'s'] == $nosta) if ($pa[$which.'s'] == $nosta)
......
...@@ -50,6 +50,13 @@ ...@@ -50,6 +50,13 @@
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['skill_c4_sniper']))
{
//获取命中倍率加成
$sk_rn = get_skillvars('c4_sniper','rangegain');
$range += $sk_rn;
}
return $range; return $range;
} }
...@@ -119,7 +126,7 @@ ...@@ -119,7 +126,7 @@
function get_extra_ex_array(&$pa) function get_extra_ex_array(&$pa)
{ {
global $log; global $log;
# 百战技能特效 # 「百战」效果判定:
if(isset($pa['skill_c1_veteran'])) if(isset($pa['skill_c1_veteran']))
{ {
$sk_def = get_skillpara('c1_veteran','choice',$pa['clbpara']); $sk_def = get_skillpara('c1_veteran','choice',$pa['clbpara']);
...@@ -130,6 +137,12 @@ ...@@ -130,6 +137,12 @@
//$log .= "百战使{$pa['nm']}拥有了【{$itemspkinfo[$sk_def]}】属性!<br>"; //$log .= "百战使{$pa['nm']}拥有了【{$itemspkinfo[$sk_def]}】属性!<br>";
} }
} }
#「穿杨」效果判定:
if(isset($pa['skill_c4_sniper']) && in_array('r',$pa['ex_keys']))
{
$key = array_search('r',$pa['ex_keys']);
unset($pa['ex_keys'][$key]);
}
return; return;
} }
...@@ -277,7 +290,7 @@ ...@@ -277,7 +290,7 @@
//获取社团技能对基础命中率的修正 //获取社团技能对基础命中率的修正
$hitrate *= rev_get_clubskill_bonus_hitrate($pa['club'],$pa['skills'],$pa,$pd['club'],$pd['skills'],$pd); $hitrate *= rev_get_clubskill_bonus_hitrate($pa['club'],$pa['skills'],$pa,$pd['club'],$pd['skills'],$pd);
//获取社团技能对基础命中率的修正(新) //获取社团技能对基础命中率的修正(新)
$hitrate *= get_clbskill_hitrate($pa,$pd,$active,$hitrate); $hitrate = get_clbskill_hitrate($pa,$pd,$active,$hitrate);
//异常状态状态修正 //异常状态状态修正
foreach ($inf_htr_p as $inf_ky => $value) foreach ($inf_htr_p as $inf_ky => $value)
{ {
...@@ -299,15 +312,19 @@ ...@@ -299,15 +312,19 @@
//获取社团技能对连击命中率衰减系数的修正 //获取社团技能对连击命中率衰减系数的修正
$hitratebonus *= rev_get_clubskill_bonus_hitrate($pa['club'],$pa['skills'],$pa,$pd['club'],$pd['skills'],$pd); $hitratebonus *= rev_get_clubskill_bonus_hitrate($pa['club'],$pa['skills'],$pa,$pd['club'],$pd['skills'],$pd);
//获取社团技能对连击命中率衰减系数的修正(新) //获取社团技能对连击命中率衰减系数的修正(新)
$hitratebonus *= get_clbskill_r_hitrate($pa,$pd,$active,$hitratebonus); $hitratebonus = get_clbskill_r_hitrate($pa,$pd,$active,$hitratebonus);
//获取基础致伤率(防具耐久损伤率)系数 //获取基础致伤率(防具耐久损伤率)系数
$inf_r = $infobbs[$pa['wep_kind']]; $inf_r = $infobbs[$pa['wep_kind']];
//获取社团技能对致伤率(防具耐久损伤率)的修正 //获取社团技能对致伤率(防具耐久损伤率)的修正
$inf_r *= rev_get_clubskill_bonus_imfrate($pa['club'],$pa['skills'],$pa,$pd['club'],$pd['skills'],$pd); $inf_r *= rev_get_clubskill_bonus_imfrate($pa['club'],$pa['skills'],$pa,$pd['club'],$pd['skills'],$pd);
//获取社团技能对致伤率(防具耐久损伤率)的修正(新)
$inf_r = get_clbskill_infrate($pa,$pd,$active,$inf_r);
//获取基础致伤效果(每次致伤会损耗多少点防具耐久) //获取基础致伤效果(每次致伤会损耗多少点防具耐久)
$inf_points = rev_get_clubskill_bonus_imftime($pa['club'],$pa['skills'],$pa,$pd['club'],$pd['skills'],$pd); $inf_points = 1;
//$inf_points = rev_get_clubskill_bonus_imftime($pa['club'],$pa['skills'],$pa,$pd['club'],$pd['skills'],$pd);
//获取社团技能对基础致伤效果(每次致伤会损耗多少点防具耐久)的修正(新)
$inf_points = get_clbskill_inftimes($pa,$pd,$active,$inf_points);
//获取武器损耗类型 //获取武器损耗类型
$wep_imp = $wepimprate[$pa['wep_kind']]; $wep_imp = $wepimprate[$pa['wep_kind']];
//武器是损耗型而非消耗型 //武器是损耗型而非消耗型
...@@ -841,7 +858,36 @@ ...@@ -841,7 +858,36 @@
//输出log //输出log
$log .= $pa['skill_c1_crit_log']; $log .= $pa['skill_c1_crit_log'];
} }
#「瞄准」判定:
if(isset($pa['skill_c4_aiming']))
{
//获取瞄准倍率
$sk_p = get_skillvars('c4_aiming','phydmgr');
$p = 1 + ($sk_p / 100);
$dmg_p[]= $p;
//输出log
$log.="<span class='yellow'>「瞄准」使{$pa['nm']}造成的物理伤害提高了{$sk_p}%!</span><br>";
}
#「咆哮」判定:
if(isset($pa['skill_c4_roar']))
{
//获取倍率
$sk_p = get_skillvars('c4_roar','phydmgr');
$p = 1 + ($sk_p / 100);
$dmg_p[]= $p;
//输出log
$log.="<span class='yellow'>「咆哮」使{$pa['nm']}造成的物理伤害提高了{$sk_p}%!</span><br>";
}
#「穿杨」判定:
if(isset($pa['skill_c4_sniper']))
{
//获取倍率
$sk_p = get_skillvars('c4_sniper','phydmgr');
$p = 1 + ($sk_p / 100);
$dmg_p[]= $p;
//输出log
$log.="<span class='yellow'>「穿杨」使{$pa['nm']}造成的物理伤害提高了{$sk_p}%!</span><br>";
}
return $dmg_p; return $dmg_p;
} }
...@@ -923,6 +969,20 @@ ...@@ -923,6 +969,20 @@
$log .= "{$pa['nm']}的攻击无视了{$pd['nm']}的伤害减半效果!<br>"; $log .= "{$pa['nm']}的攻击无视了{$pd['nm']}的伤害减半效果!<br>";
} }
#「穿杨」效果判定:
if(isset($pa['skill_c4_sniper']) && !isset($pa['pierce_flag']) && !empty($pd['phy_def_flag']))
{
$dice = diceroll(99);
# 冴冴说这应该是odds……但是对不起,已经太迟了……^ ^;
$obbs = get_skillvars('c4_sniper','prfix');
if($dice < $obbs)
{
$pa['pierce_flag'] = 1;
$pd['phy_def_flag'] = 0;
$log .= "<span class=\"yellow\">{$pa['nm']}的攻击贯穿了{$pd['nm']}的防具!</span><br>";
}
}
return; return;
} }
...@@ -1004,6 +1064,48 @@ ...@@ -1004,6 +1064,48 @@
return $dmg_p; return $dmg_p;
} }
//预受伤事件:
//提取判断pd是否防具受损、受伤,但log在结尾统一输出
function get_hurt_prepare_events(&$pa,&$pd,$active)
{
global $infatt_rev;
# pa致伤次数>0时,计算pd防具受损或致伤情况
if($pa['inf_times']>0)
{
//获取可致伤部位
$inf_parts = $infatt_rev[$pa['wep_kind']];
$inf_att = Array();
for($i=0;$i<$pa['inf_times'];$i++)
{
//随机选择一个可致伤的部位
$aim = rand(0,count($inf_parts)-1);
$inf_aim = $inf_parts[$aim];
//对应部位致伤次数+1
$inf_att[$inf_aim] = isset($inf_att[$inf_aim]) ? $inf_att[$inf_aim]+1 : 1;
}
//记载防具受损、受伤情况
if(!empty($inf_att))
{
$pd['armor_hurt'] = Array('arb' => 0,'arh' => 0,'ara' => 0,'arf' => 0,);
foreach($inf_att as $ipt => $times)
{
$which = 'ar'.$ipt;
if(!isset(${'temp_'.$which.'s'})) ${'temp_'.$which.'s'} = $pd[$which.'s'];
if(${'temp_'.$which.'s'} > 0)
{
${'temp_'.$which.'s'} -= $times;
$pd['armor_hurt'][$which] += $times;
}
else
{
$pd['inf_hurt'][$ipt] = 1;
}
}
}
}
return;
}
//获取pa能造成的属性伤害队列 //获取pa能造成的属性伤害队列
function get_base_ex_att_array(&$pa,&$pd,$active) function get_base_ex_att_array(&$pa,&$pd,$active)
{ {
...@@ -1181,6 +1283,24 @@ ...@@ -1181,6 +1283,24 @@
return $total_ex_dmg; return $total_ex_dmg;
} }
//计算属性总伤害加成
function get_ex_dmg_p(&$pa,&$pd,$active)
{
global $log;
$ex_dmg_p = Array();
#「咆哮」判定:
if(isset($pa['skill_c4_roar']))
{
//获取倍率
$sk_p = get_skillvars('c4_roar','exdmgr');
$p = 1 + ($sk_p / 100);
$ex_dmg_p[]= $p;
//输出log
$log.="<span class='yellow'>「咆哮」使{$pa['nm']}造成的属性伤害提高了{$sk_p}%!</span><br>";
}
return $ex_dmg_p;
}
//计算最终伤害的系数变化 //计算最终伤害的系数变化
function get_final_dmg_p(&$pa,&$pd,$active) function get_final_dmg_p(&$pa,&$pd,$active)
{ {
...@@ -1191,11 +1311,13 @@ ...@@ -1191,11 +1311,13 @@
if(isset($pa['skill_c2_raiding'])) if(isset($pa['skill_c2_raiding']))
{ {
$sk_p = get_skillvars('c2_raiding','findmgr'); $sk_p = get_skillvars('c2_raiding','findmgr');
$p = 1+($sk_p / 100); if($sk_p)
$log.= "<span class='yellow'>「强袭」使{$pa['nm']}造成的最终伤害提高了{$sk_p}%!</span><br>"; {
$fin_dmg_p[] = $p; $p = 1+($sk_p / 100);
$log.= "<span class='yellow'>「强袭」使{$pa['nm']}造成的最终伤害提高了{$sk_p}%!</span><br>";
$fin_dmg_p[] = $p;
}
} }
# 「歼灭」效果判定: # 「歼灭」效果判定:
if(isset($pa['skill_buff_annihil'])) if(isset($pa['skill_buff_annihil']))
{ {
...@@ -1205,8 +1327,27 @@ ...@@ -1205,8 +1327,27 @@
if($sk_dice < $sk_obbs) if($sk_dice < $sk_obbs)
{ {
$sk_p = get_skillvars('buff_annihil','findmgr'); $sk_p = get_skillvars('buff_annihil','findmgr');
$p = $sk_p / 100; if($sk_p)
$log.= "<span class='red'>暴击!</span><span class='lime'>「歼灭」使{$pa['nm']}造成的最终伤害提高了{$sk_p}%!</span><br>"; {
$p = $sk_p / 100;
$log.= "<span class='red'>暴击!</span><span class='lime'>「歼灭」使{$pa['nm']}造成的最终伤害提高了{$sk_p}%!</span><br>";
$fin_dmg_p[] = $p;
}
}
}
#「破甲」效果判定:
if(isset($pa['skill_c4_break']) && !empty($pd['inf_hurt']))
{
$sk_lvl = get_skilllvl('c4_break',$pa);
//获取伤害加成
$sk_p = get_skillvars('c4_break','infdmgr',$sk_lvl);
//获取致伤处
$inf_p = count($pd['inf_hurt']);
$sk_p *= $inf_p;
if($sk_p)
{
$p = 1+($sk_p / 100);
$log.= "<span class='yellow'>「破甲」使{$pa['nm']}造成的最终伤害提高了{$sk_p}%!</span><br>";
$fin_dmg_p[] = $p; $fin_dmg_p[] = $p;
} }
} }
...@@ -1293,6 +1434,13 @@ ...@@ -1293,6 +1434,13 @@
} }
} }
# 「爆头」技能效果
if(isset($pa['skill_c4_headshot']) && $fin_dmg > $pd['hp']*0.85 && $fin_dmg < $pd['hp'])
{
$fin_dmg = $pd['hp'];
$log .= "<span class=\"yellow\">{$pa['nm']}的攻击直接将{$pd['nm']}爆头!</span><br>";
}
return $fin_dmg; return $fin_dmg;
} }
...@@ -1360,35 +1508,22 @@ ...@@ -1360,35 +1508,22 @@
attr_extra_19_azure($pa,$pd,$active); attr_extra_19_azure($pa,$pd,$active);
} }
# pa致伤次数>0时,计算pd防具受损或致伤情况 # pd存在防具受损况,在这里应用
if($pa['inf_times']>0) if(!empty($pd['armor_hurt']))
{ {
//获取可致伤部位 foreach($pd['armor_hurt'] as $which => $times) armor_hurt($pd,$which,$times);
$inf_parts = $infatt_rev[$pa['wep_kind']]; }
$inf_att = Array();
for($i=0;$i<$pa['inf_times'];$i++) # pd存在受伤情况,在这里应用
{ if(!empty($pd['inf_hurt']))
//随机选择一个可致伤的部位 {
$aim = rand(0,count($inf_parts)-1); foreach($pd['inf_hurt'] as $which => $times)
$inf_aim = $inf_parts[$aim];
//对应部位致伤次数+1
$inf_att[$inf_aim] = isset($inf_att[$inf_aim]) ? $inf_att[$inf_aim]+1 : 1;
}
//应用防具损伤/致伤效果
foreach($inf_att as $ipt => $times)
{ {
$which = 'ar'.$ipt; $flag = get_inf_rev($pd,$which);
if($pd[$which.'s'] > 0) if($flag) $log .= "{$pd['nm']}的<span class=\"red\">$infinfo[$which]</span>部受伤了!<br>";
{
armor_hurt($pd,$which,$times);
}
else
{
$flag = get_inf_rev($pd,$ipt);
if($flag) $log .= "{$pd['nm']}的<span class=\"red\">$infinfo[$ipt]</span>部受伤了!<br>";
}
} }
} }
return; return;
} }
...@@ -1565,7 +1700,7 @@ ...@@ -1565,7 +1700,7 @@
# 获取社团技能对反击率的修正 # 获取社团技能对反击率的修正
$counter *= rev_get_clubskill_bonus_counter($pd['club'],$pd['skills'],$pd,$pa['club'],$pa['skills'],$pa); $counter *= rev_get_clubskill_bonus_counter($pd['club'],$pd['skills'],$pd,$pa['club'],$pa['skills'],$pa);
# 获取社团技能对反击率的修正(新) # 获取社团技能对反击率的修正(新)
$counter *= get_clbskill_counterate($pa,$pd,$active,$counter); $counter = get_clbskill_counterate($pa,$pd,$active,$counter);
# 获取异常状态对反击率的影响 # 获取异常状态对反击率的影响
if(!empty($pd['inf'])) if(!empty($pd['inf']))
......
...@@ -106,6 +106,28 @@ ...@@ -106,6 +106,28 @@
$sk_r = 1 + (get_skillvars('c2_intuit','accgain',$sk_lvl) / 100); $sk_r = 1 + (get_skillvars('c2_intuit','accgain',$sk_lvl) / 100);
$hitrate *= $sk_r; $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['skill_c4_aiming']))
{
//获取命中倍率加成
$sk_r = 1 + (get_skillvars('c4_aiming','accgain') / 100);
$hitrate *= $sk_r;
}
#「穿杨」效果判定:
if(isset($pa['skill_c4_sniper']))
{
//获取命中倍率加成
$sk_r = 1 + (get_skillvars('c4_sniper','accgain') / 100);
$hitrate *= $sk_r;
}
return $hitrate; return $hitrate;
} }
...@@ -120,9 +142,52 @@ ...@@ -120,9 +142,52 @@
$sk_r = 1 + (get_skillvars('c2_intuit','rbgain',$sk_lvl) / 100); $sk_r = 1 + (get_skillvars('c2_intuit','rbgain',$sk_lvl) / 100);
$hitrate *= $sk_r; $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;
}
return $hitrate; 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['skill_c4_roar']))
{
//获取致伤效果加成
$sk_fix = get_skillvars('c4_roar','inftfix');
$inftimes += $sk_fix;
}
return $inftimes;
}
# 获取社团技能对伤害浮动的修正(新) # 获取社团技能对伤害浮动的修正(新)
function get_clbskill_fluc(&$pa,&$pd,$active) function get_clbskill_fluc(&$pa,&$pd,$active)
{ {
......
...@@ -114,6 +114,7 @@ ...@@ -114,6 +114,7 @@
$unlock = check_skill_unlock($sk,$sdata); $unlock = check_skill_unlock($sk,$sdata);
if($unlock) if($unlock)
{ {
if(get_skilltags($sk,'unlock_battle_hidden')) continue;
$sk_desc .= is_array($cskills[$sk]['lockdesc']) ? $cskills[$sk]['lockdesc'][$unlock] : $cskills[$sk]['lockdesc']; $sk_desc .= is_array($cskills[$sk]['lockdesc']) ? $cskills[$sk]['lockdesc'][$unlock] : $cskills[$sk]['lockdesc'];
} }
//再检查技能是否满足激活条件 //再检查技能是否满足激活条件
......
...@@ -152,30 +152,19 @@ ...@@ -152,30 +152,19 @@
# 遍历该技能关联属性 # 遍历该技能关联属性
foreach($cskill['status'] as $snm) foreach($cskill['status'] as $snm)
{ {
# $snm为数组时,代表关联的属性是技能参数 - $clbpara['skillpara']['技能名']['参数名'] # 格式化属性名
if(is_array($snm)) $snm_key = parse_skillrules($snm,'','clbpara');
{ global $$snm_key;
foreach($snm as $skey) # 如属性值为数组,则按照登记取值
{ $seffect = is_array($ceffect[$snm]) ? $ceffect[$snm][$now_clvl] : $ceffect[$snm];
$clbpara['skillpara'][$sk][$skey] += $ceffect[$skey]; # 格式化属性值
} $seffect = parse_skilloperator($seffect);
} $so = is_array($seffect) ? $seffect[0] : '';
else $svars = is_array($seffect) ? $seffect[1] : $seffect;
{ # 计算属性变化
global $$snm; eval("$$snm_key = $$snm_key $so $svars*$nums;");
# $ceffect为数组时,视为技能升级时会使多个属性增加不同值 # 替换升级后文本
if(is_array($ceffect)) $clog = str_replace("[:{$snm}:]",$svars*$nums,$clog);
{
$$snm += $ceffect[$snm]*$nums;
$clog = str_replace("[:effect:]".$snm,$ceffect[$snm]*$nums,$clog);
}
# 否则技能所影响的属性都增加相同值
else
{
$$snm += $ceffect*$nums;
$clog = str_replace("[:effect:]",$ceffect*$nums,$clog);
}
}
} }
} }
# 扣除技能点 # 扣除技能点
...@@ -331,6 +320,7 @@ ...@@ -331,6 +320,7 @@
$unlock = $cskills[$sk]['unlock']; $unlock = $cskills[$sk]['unlock'];
foreach($unlock as $key => $lock) foreach($unlock as $key => $lock)
{ {
# 特判:计算技能冷却时间
if($key == 'skillcooldown') if($key == 'skillcooldown')
{ {
$st = get_starttimes($sk,$data['clbpara']); $st = get_starttimes($sk,$data['clbpara']);
...@@ -344,31 +334,66 @@ ...@@ -344,31 +334,66 @@
} }
} }
} }
elseif(strpos($key,'+')!==false) # 正常计算
else
{ {
$arr_key = explode("+",$key); # 第一层:检查共有几个须置换条件
foreach($arr_key as $skey) $arr = strpos($key,'+')!==false ? explode("+",$key) : Array($key);
foreach($arr as $skey)
{ {
$lock = str_replace("[:".$skey.":]","\$data['".$skey."']",$lock); #第二层:格式化置换条件对应的置换内容
$skey_value = parse_skillrules($skey);
#第三层:置换对应内容
$lock = str_replace("[:{$skey}:]",$skey_value,$lock);
} }
if(!eval("return ($lock);")) return $key; if(!eval("return ($lock);")) return $key;
} }
elseif(strpos($key,'-')!==false)
{
$arr_key = explode("-",$key);
$lock = str_replace("[:".$arr_key[1].":]","\$data['clbpara']['{$arr_key[0]}']['{$sk}']['".$arr_key[1]."']",$lock);
if(!eval("return ($lock);")) return $key;
}
else
{
$lock = str_replace("[:".$key.":]","\$data['".$key."']",$lock);
if(!eval("return ($lock);")) return $key;
}
} }
} }
return 0; return 0;
} }
function parse_skillrules($key,$prefix="\$data",$prefix2="['clbpara']")
{
//传入值内有'-'号,代表是clbpara内的内容
if(strpos($key,'-')!==false)
{
$key = explode('-',$key);
$key_key = $key[0]; $key_value = $key[1];
//检查key_key内是否有“|”号
if(strpos($key_key,'|')!==false)
{
//key_key内有“|”号 代表置换内容的第二层键名另有指代
$key_key = explode('|',$key_key);
$key_a_key = $key_key[0]; $key_sec_key = $key_key[1];
$key = $prefix.$prefix2."['{$key_a_key}']['{$key_sec_key}']['{$key_value}']";
}
else
{
//key_key内没有“:”号 置换内容只停留在第一层
$key = $prefix.$prefix2."['{$key_key}']['{$key_value}']";
}
}
//传入值是标准字段,直接导出
else
{
if(empty($prefix)) return $key;
else $key = $prefix."['{$key}']";
}
return $key;
}
function parse_skilloperator($key)
{
//检查传入值内是否有分隔符
if(strpos($key,'::')!==false)
{
$key = explode('::',$key);
return $key;
}
return $key;
}
# 技能是否可激活,返回0时为可激活,否则返回对应的未满足条件 $sk:技能名;$data:角色数据 # 技能是否可激活,返回0时为可激活,否则返回对应的未满足条件 $sk:技能名;$data:角色数据
function check_skill_active($sk,$data) function check_skill_active($sk,$data)
{ {
...@@ -576,24 +601,19 @@ ...@@ -576,24 +601,19 @@
# 技能存在关联属性 # 技能存在关联属性
if(isset($cskill['status'])) if(isset($cskill['status']))
{ {
# 检查技能升级是否会直接影响属性: # 检查社团是否会直接影响属性:
$ceffect = !empty($data) && isset($cskill['effect'][$data['club']]) ? $cskill['effect'][$data['club']] : $cskill['effect'][0]; $ceffect = !empty($data) && isset($cskill['effect'][$data['club']]) ? $cskill['effect'][$data['club']] : $cskill['effect'][0];
# 遍历技能关联属性,替换介绍文本内的数值 # 遍历技能关联属性,替换介绍文本内的数值
foreach($cskill['status'] as $snm) foreach($cskill['status'] as $snm)
{ {
if(!is_array($snm)) # 如属性值为数组,则按照等级取值
{ $seffect = is_array($ceffect[$snm]) ? $ceffect[$snm][$now_clvl] : $ceffect[$snm];
# $ceffect为数组时,视为技能升级时会使多个属性增加不同值 # 格式化属性值
if(is_array($ceffect)) $seffect = parse_skilloperator($seffect);
{ $so = is_array($seffect) ? $seffect[0] : '';
$sk_desc = str_replace("[:effect:]".$snm,$ceffect[$snm],$sk_desc); $svars = is_array($seffect) ? $seffect[1] : $seffect;
} # 替换描述文本
# 否则技能所影响的属性都增加相同值 $sk_desc = str_replace("[:{$snm}:]",$svars,$sk_desc);
else
{
$sk_desc = str_replace("[:effect:]",$ceffect,$sk_desc);
}
}
} }
} }
return $sk_desc; return $sk_desc;
......
...@@ -11,21 +11,49 @@ ...@@ -11,21 +11,49 @@
# 「百战」技能判定 # 「百战」技能判定
function skill_c1_veteran_act($choice) function skill_c1_veteran_act($choice)
{ {
global $log,$cskills,$club,$clbpara,$itemspkinfo; global $log,$pdata,$cskills,$club,$clbpara,$itemspkinfo;
$c_arr = get_skillvars('c1_veteran','defkind'); if(!check_skill_unlock($sk,$pdata))
$cvar = &$clbpara['skillpara']['c1_veteran']['choice'];
if(empty($choice) || !in_array($choice,$c_arr))
{ {
$log .= "选定的防御属性不存在!<br>"; $c_arr = get_skillvars('c1_veteran','defkind');
$cvar = &$clbpara['skillpara']['c1_veteran']['choice'];
if(empty($choice) || !in_array($choice,$c_arr))
{
$log .= "选定的防御属性不存在!<br>";
return;
}
if($choice == $cvar)
{
$log .= "不能重复选择属性。<br>";
return;
}
$cvar = $choice;
$log .= "「百战」的防御属性变更为{$itemspkinfo[$choice]}。<br>";
}
else
{
$log .= "「百战」技能未解锁!<br>";
}
return;
}
# 「穿杨」与「咆哮」解锁
function skill_c4_unlock($csk)
{
global $log,$pdata,$cskills;
if(($csk != 'c4_roar' && $csk != 'c4_sniper') || !in_array($csk,$pdata['clbpara']['skill']))
{
$log .= "要解锁的技能{$csk}不存在。<br>";
return; return;
} }
if($choice == $cvar) if(!check_skill_unlock('c4_roar',$pdata) || !check_skill_unlock('c4_sniper',$pdata))
{ {
$log .= "不能重复选择属性。<br>"; $log .= "无法重复解锁。<br>";
return; return;
} }
$cvar = $choice; include_once GAME_ROOT.'./include/game/revclubskills.func.php';
$log .= "「百战」的防御属性变更为{$itemspkinfo[$choice]}。<br>"; set_skillpara($csk,'active',1,$pdata['clbpara']);
set_skillpara(get_skillvars($csk,'disableskill'),'disable',1,$pdata['clbpara']);
$log .= "<span class='yellow'>已解锁技能「{$cskills[$csk]['name']}」!</span><br>";
return; return;
} }
......
...@@ -592,6 +592,9 @@ ...@@ -592,6 +592,9 @@
$log.="<span class=\"red\">$damage</span>点伤害!<br>"; $log.="<span class=\"red\">$damage</span>点伤害!<br>";
//最终物理伤害 //最终物理伤害
$pdamage = $damage; $pdamage = $damage;
# 物理伤害计算结束后、加载预受伤事件……:
get_hurt_prepare_events($pa,$pd,$active);
# 属性伤害计算部分: # 属性伤害计算部分:
//获取攻击方(pa)能造成的属性伤害类型 //获取攻击方(pa)能造成的属性伤害类型
...@@ -603,34 +606,57 @@ ...@@ -603,34 +606,57 @@
deal_ex_damage_prepare_events($pa,$pd,$active); deal_ex_damage_prepare_events($pa,$pd,$active);
//获取攻击方(pa)能造成的属性伤害 //获取攻击方(pa)能造成的属性伤害
$ex_damage = get_original_ex_dmg($pa,$pd,$active); $ex_damage = get_original_ex_dmg($pa,$pd,$active);
//攻击方(pa)能造成了多次属性伤害的情况下,进行后续判断
//存在大于1种属性伤害,输出一段 A+B+C=D 样式的文本 if(is_array($ex_damage) || $ex_damage > 1)
$total_ex_damage = 0;
if(is_array($ex_damage))
{ {
if(count($ex_damage)>1) //获取攻击方(pa)能造成的属性伤害加成
$ex_damage_p = get_ex_dmg_p($pa,$pd,$active);
//存在大于1种属性伤害,输出一段 A+B+C=D 样式的文本,并将所有属性伤害保存在 $total_ex_damage 内
if(is_array($ex_damage))
{ {
$log .= "造成了"; $total_ex_damage = 0;
$elog = ''; if(count($ex_damage)>1)
foreach($ex_damage as $edmg) {
$elog = '';
foreach($ex_damage as $edmg)
{
$total_ex_damage += $edmg;
if(!empty($elog)) $elog .= "+".$edmg;
else $elog .= $edmg;
}
$elog = '造成了'.$elog;
}
else
{ {
$total_ex_damage += $edmg; $total_ex_damage = $ex_damage[0];
if(!empty($elog)) $elog .= "+".$edmg;
else $elog = $edmg;
} }
$log .= $elog."=<span class=\"red\">{$total_ex_damage}</span>点属性伤害!<br>"; //将 $total_ex_damage 存回 $ex_damage
$ex_damage = $total_ex_damage;
} }
else //存在对最终属性伤害的修正,输出一段 A×BxC=D 或 (A+B+C)×A×B=D 样式的文本
if(!empty($ex_damage_p))
{ {
$total_ex_damage = $ex_damage[0]; if(isset($elog))
{
$elog = str_replace("造成了","造成了(",$elog);
$elog = $elog.')';
}
else
{
$elog = "造成了{$ex_damage}";
}
foreach($ex_damage_p as $edmg_p)
{
$ex_damage *= $edmg_p;
$elog .= {$edmg_p}";
}
} }
$ex_damage = round($ex_damage);
//存在额外的属性伤害文本,输出
if(isset($elog)) $log .= $elog."=<span class=\"red\">{$ex_damage}</span>点属性伤害!<br>";
} }
else //并入最终伤害
{ $damage += $ex_damage;
$total_ex_damage = $ex_damage;
}
//最终属性伤害
$damage += $total_ex_damage;
} }
#最终伤害计算部分: #最终伤害计算部分:
...@@ -961,6 +987,15 @@ ...@@ -961,6 +987,15 @@
} }
} }
#「掠夺」判定:
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>";
}
return; return;
} }
......
<!-- 注意:大部分技能可以直接通过编辑配置文件完成 -->
<!-- 可能的、需要新建模板的情况:你的技能需要在面板内执行比较复杂的、单靠配置文件无法实现的操作 -->
<tr>
<td class="b1" width="40">
<span>{$cskills['c4_roar']['name']}</span>
</td>
<td>
<!--{eval $unlock_c4_roar_flag = check_skill_unlock('c4_roar',$pdata);}-->
<!--{if $unlock_c4_roar_flag}-->
<div style="position:relative; height:100%; width:100%;" onmouseover="skill_unacquired_mouseover.call(this,event)" onmouseout="skill_unacquired_mouseout.call(this,event)">
<div class="skill_unacquired">
<!--{/if}-->
<table class="skilltable">
<tr>
<td class="skilldesc_left b3">
<span class="skilldesc">
<!--{eval $c4_roar_desc = parse_skilldesc('c4_roar',$pdata);}-->
$c4_roar_desc
</span>
</td>
<td class="skilldesc_right b3">
<!--{if !empty($unlock_c4_roar_flag) && $unlock_c4_roar_flag == 'skillpara|c4_roar-active'}-->
<input type="button" style="width:47px;margin-right:25px;float:right;" value="解锁">
<!--{/if}-->
</td>
</tr>
</table>
<!--{if $unlock_c4_roar_flag}-->
</div>
<div class="skill_unacquired_hint">
<table class="skilltable">
<tr>
<td valign="center" align="center">
<span class="yellow">
<!--{eval $c4_roar_lockdesc = $cskills['c4_roar']['lockdesc'][$unlock_c4_roar_flag];}-->
$c4_roar_lockdesc
</span>
</td>
<!--{if !empty($unlock_c4_roar_flag) && $unlock_c4_roar_flag == 'skillpara|c4_roar-active'}-->
<td class="skilldesc_right">
<input type="button" style="width:47px;margin-right:25px;float:right;" value="解锁" onclick="$('mode').value='revskpts';$('command').value='actskill_c4_roar';postCmd('gamecmd','command.php');this.disabled=true;">
</td>
<!--{/if}-->
</tr>
</table>
</div>
</div>
<!--{/if}-->
</td>
</tr>
\ No newline at end of file
<!-- 注意:大部分技能可以直接通过编辑配置文件完成 -->
<!-- 可能的、需要新建模板的情况:你的技能需要在面板内执行比较复杂的、单靠配置文件无法实现的操作 -->
<tr>
<td class="b1" width="40">
<span>{$cskills['c4_sniper']['name']}</span>
</td>
<td>
<!--{eval $unlock_c4_sniper_flag = check_skill_unlock('c4_sniper',$pdata);}-->
<!--{if $unlock_c4_sniper_flag}-->
<div style="position:relative; height:100%; width:100%;" onmouseover="skill_unacquired_mouseover.call(this,event)" onmouseout="skill_unacquired_mouseout.call(this,event)">
<div class="skill_unacquired">
<!--{/if}-->
<table class="skilltable">
<tr>
<td class="skilldesc_left b3">
<span class="skilldesc">
<!--{eval $c4_sniper_desc = parse_skilldesc('c4_sniper',$pdata);}-->
$c4_sniper_desc
</span>
</td>
<td class="skilldesc_right b3">
<!--{if !empty($unlock_c4_sniper_flag) && $unlock_c4_sniper_flag == 'skillpara|c4_sniper-active'}-->
<input type="button" style="width:47px;margin-right:25px;float:right;" value="解锁">
<!--{/if}-->
</td>
</tr>
</table>
<!--{if $unlock_c4_sniper_flag}-->
</div>
<div class="skill_unacquired_hint">
<table class="skilltable">
<tr>
<td valign="center" align="center">
<span class="yellow">
<!--{eval $c4_sniper_lockdesc = $cskills['c4_sniper']['lockdesc'][$unlock_c4_sniper_flag];}-->
$c4_sniper_lockdesc
</span>
</td>
<!--{if !empty($unlock_c4_sniper_flag) && $unlock_c4_sniper_flag == 'skillpara|c4_sniper-active'}-->
<td class="skilldesc_right">
<input type="button" style="width:47px;margin-right:25px;float:right;" value="解锁" onclick="$('mode').value='revskpts';$('command').value='actskill_c4_sniper';postCmd('gamecmd','command.php');this.disabled=true;">
</td>
<!--{/if}-->
</tr>
</table>
</div>
</div>
<!--{/if}-->
</td>
</tr>
\ No newline at end of file
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
<!-- 可能的、需要新建模板的情况:你的技能需要在面板内执行比较复杂的、单靠配置文件无法实现的操作 --> <!-- 可能的、需要新建模板的情况:你的技能需要在面板内执行比较复杂的、单靠配置文件无法实现的操作 -->
<tr> <tr>
<td class="b1" width="40"> <td class="b1" width="40">
<span>技能名</span> <span>{$cskills['技能编号']['name']}</span>
</td> </td>
<td> <td>
<!-- ↓↓↓ 存在解锁条件的技能才需要有这一部分 ↓↓↓ --> <!-- ↓↓↓ 存在解锁条件的技能才需要有这一部分 ↓↓↓ -->
...@@ -16,11 +16,13 @@ ...@@ -16,11 +16,13 @@
<tr> <tr>
<td class="skilldesc_left b3"> <td class="skilldesc_left b3">
<span class="skilldesc"> <span class="skilldesc">
<span tooltip="关于标签的介绍" class="gold">【技能标签 没有不需要写】</span> <!-- 技能介绍,自己填任意内容或使用下面的方式 -->
技能介绍 <!--{eval $技能编号_desc = parse_skilldesc('技能编号',$pdata);}-->
$技能编号_desc
</span> </span>
</td> </td>
<td class="skilldesc_right b3"> <td class="skilldesc_right b3">
<!-- 技能按钮,没有可以不填 -->
<input type="number" name="技能编号_nums" style="width:40px" value="1"> <input type="number" name="技能编号_nums" style="width:40px" value="1">
<input type="button" onclick="$('mode').value='revskpts';$('command').value='技能编号';postCmd('gamecmd','command.php');this.disabled=true;" value="技能操作按钮名"> <input type="button" onclick="$('mode').value='revskpts';$('command').value='技能编号';postCmd('gamecmd','command.php');this.disabled=true;" value="技能操作按钮名">
</td> </td>
...@@ -33,7 +35,11 @@ ...@@ -33,7 +35,11 @@
<table class="skilltable"> <table class="skilltable">
<tr> <tr>
<td valign="center" align="center"> <td valign="center" align="center">
<span class="yellow">未满足解锁条件时显示的文本</span> <span class="yellow">
<!-- 未满足解锁条件时显示的文本,自己填或使用下面的方式 -->
<!--{eval $技能编号_lockdesc = $cskills['技能编号']['lockdesc'][$unlock_技能编号_flag];}-->
$技能编号_lockdesc
</span>
</td> </td>
</tr> </tr>
</table> </table>
......
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