Commit b43c145b authored by hisuinohoshi's avatar hisuinohoshi

rev combat phase 2

parent 20fcfc0f
...@@ -1106,30 +1106,30 @@ function getcorpse($item){ ...@@ -1106,30 +1106,30 @@ function getcorpse($item){
return; return;
} }
//武器损耗&消耗计算: //武器损耗&消耗计算:force_imp 强制扣除武器效果
function weapon_loss(&$pa) function weapon_loss(&$pa,$force_imp=0)
{ {
global $log,$wepimprate; global $log,$wepimprate,$nosta;
if(isset($pa['wep_imp_times']) && $pa['wep_imp_times']>0) if(isset($pa['wep_imp_times']) && $pa['wep_imp_times']>0 && $pa['wep_kind'] != 'N')
{ {
$wep_loss_flag = 0; $wep_loss_flag = 0;
//获取武器损耗类型 //获取武器损耗类型
$wep_imp = $wepimprate[$pa['wep_kind']]; $wep_imp = $wepimprate[$pa['wep_kind']];
//损耗型武器 //损耗型武器
if($wep_imp > 0) if($wep_imp > 0 || $force_imp)
{ {
if($pa['weps'] == $nosta) if($pa['weps'] == $nosta || $force_imp)
{ {
$pa['wepe'] -= $pa['wep_imp_times']; $pa['wepe'] = max(0,$pa['wepe']-$pa['wep_imp_times']);
$log.= "{$pa['nm']}{$pa['wep']}的攻击力下降了{$pa['wep_imp_times']}。<br>"; $log.= "{$pa['nm']}{$pa['wep']}的攻击力下降了{$pa['wep_imp_times']}。<br>";
} }
else else
{ {
$pa['weps'] -= $pa['wep_imp_times']; $pa['weps'] = max(0,$pa['weps']-$pa['wep_imp_times']);
$log.= "{$pa['nm']}{$pa['wep']}的耐久度下降了{$pa['wep_imp_times']}。<br>"; $log.= "{$pa['nm']}{$pa['wep']}的耐久度下降了{$pa['wep_imp_times']}。<br>";
} }
if($pa['weps']<=0 || $pa['wepe']<=0) if(empty($pa['weps']) || empty($pa['wepe']))
{ {
$log .= "{$pa['nm']}的<span class=\"red\">{$pa['wep']}</span>使用过度,已经损坏,无法再装备了!<br>"; $log .= "{$pa['nm']}的<span class=\"red\">{$pa['wep']}</span>使用过度,已经损坏,无法再装备了!<br>";
$wep_loss_flag = 1; $wep_loss_flag = 1;
...@@ -1140,11 +1140,11 @@ function weapon_loss(&$pa) ...@@ -1140,11 +1140,11 @@ function weapon_loss(&$pa)
{ {
if($pa['weps'] != $nosta) if($pa['weps'] != $nosta)
{ {
$pa['weps'] -= $pa['wep_imp_times']; $pa['weps'] = max(0,$pa['weps']-$pa['wep_imp_times']);
if($pa['wep_kind'] == 'C' || $pa['wep_kind'] == 'D' || $pa['wep_kind'] == 'F') if($pa['wep_kind'] == 'C' || $pa['wep_kind'] == 'D' || $pa['wep_kind'] == 'F')
{ {
$log .= "{$pa['nm']}用掉了{$pa['wep_imp_times']}{$pa['wep']}。<br>"; $log .= "{$pa['nm']}用掉了{$pa['wep_imp_times']}{$pa['wep']}。<br>";
if($pa['weps']<=0) if(empty($pa['weps']))
{ {
$log .= "{$pa['nm']}的<span class=\"red\">{$pa['wep']}</span>用光了!<br>"; $log .= "{$pa['nm']}的<span class=\"red\">{$pa['wep']}</span>用光了!<br>";
$wep_loss_flag = 1; $wep_loss_flag = 1;
...@@ -1153,10 +1153,10 @@ function weapon_loss(&$pa) ...@@ -1153,10 +1153,10 @@ function weapon_loss(&$pa)
elseif($pa['wep_kind'] == 'G' || $pa['wep_kind'] == 'J') elseif($pa['wep_kind'] == 'G' || $pa['wep_kind'] == 'J')
{ {
$log .= "{$pa['nm']}{$pa['wep']}的弹药数减少了{$pa['wep_imp_times']}。<br>"; $log .= "{$pa['nm']}{$pa['wep']}的弹药数减少了{$pa['wep_imp_times']}。<br>";
if($pa['weps']<=0) if(empty($pa['weps']))
{ {
$log .= "{$pa['nm']}的<span class=\"red\">{$pa['wep']}</span>弹药用光了!<br>"; $log .= "{$pa['nm']}的<span class=\"red\">{$pa['wep']}</span>弹药用光了!<br>";
$wep_loss_flag = 1; $pa['weps'] = $nosta;
} }
} }
} }
...@@ -1165,7 +1165,9 @@ function weapon_loss(&$pa) ...@@ -1165,7 +1165,9 @@ function weapon_loss(&$pa)
{ {
$pa['wep'] = '拳头'; $pa['wep_kind'] = 'N'; $pa['wepk'] = 'WN'; $pa['wep'] = '拳头'; $pa['wep_kind'] = 'N'; $pa['wepk'] = 'WN';
$pa['wepe'] = 0; $pa['weps'] = $nosta; $pa['wepsk'] = ''; $pa['wepe'] = 0; $pa['weps'] = $nosta; $pa['wepsk'] = '';
return -1;
} }
unset($pa['wep_imp_times']);
} }
return; return;
} }
...@@ -1200,9 +1202,10 @@ function armor_hurt(&$pa,$which,$hurtvalue,$hurtkind=0) ...@@ -1200,9 +1202,10 @@ function armor_hurt(&$pa,$which,$hurtvalue,$hurtkind=0)
$pa[$which] = $pa[$which.'k'] = $pa[$which.'sk'] = ''; $pa[$which] = $pa[$which.'k'] = $pa[$which.'sk'] = '';
$pa[$which.'e'] = $pa[$which.'s'] = 0; $pa[$which.'e'] = $pa[$which.'s'] = 0;
} }
return -1;
} }
} }
return; return 0;
} }
......
...@@ -7,6 +7,30 @@ ...@@ -7,6 +7,30 @@
include_once GAME_ROOT.'./include/game/dice.func.php'; include_once GAME_ROOT.'./include/game/dice.func.php';
include_once GAME_ROOT.'./include/game/clubskills.func.php'; include_once GAME_ROOT.'./include/game/clubskills.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_extra.func.php';
//获取真实攻击类别
function get_wep_kind(&$pa,$wep_kind='')
{
if(!empty($wep_kind))
{
$pa['wep_kind'] = strpos($pa['wepk'],$wep_kind)===false ? substr ($pa['wepk'], 1, 1 ) : $wep_kind;
}
else
{
$w1 = substr ($pa['wepk'], 1, 1 );
$w2 = substr ($pa['wepk'], 2, 1 );
if ((($w1 == 'G')||($w1=='J')) && ($pa['weps'] == $nosta))
{
$pa['wep_kind']= $w2 ? $w2 : 'P';
}
else
{
$pa['wep_kind'] = $w1;
}
}
return;
}
//获取防具上的属性 //获取防具上的属性
//如果你想设计一个在战斗中能临时获得属性的机制,请在这两个函数执行完毕后,把属性加入返回的结果内。除非你希望技能的机制优先级高于三抽的判定。 //如果你想设计一个在战斗中能临时获得属性的机制,请在这两个函数执行完毕后,把属性加入返回的结果内。除非你希望技能的机制优先级高于三抽的判定。
...@@ -53,6 +77,109 @@ ...@@ -53,6 +77,109 @@
return $skarr; return $skarr;
} }
//在初始化战斗阶段触发的事件。即:无论是否反击都只会触发1次的事件。
function combat_prepare_events(&$pa,&$pd,$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($pd['type'] == 89 && $pd['name'] =='笼中鸟')
{
$flag = attr_extra_89_cagedbird($pd,$pa,$active);
}
if($flag < 0) return $flag;
return 1;
}
//攻击方(pa)在开始伤害计算流程前触发的事件(直死、临摹装置、DOT结算、踩陷阱……) 返回1-继续打击流程 返回0-中止打击流程
function hitrate_prepare_events(&$pa,&$pd,$active)
{
global $log;
# 玩家直死反噬:
if(in_array('X',$pa['ex_keys']) && !$pa['type'])
{
$xdice = diceroll(99);
if($xdice <= 14)
{
$log .= "<span class=\"red\">{$pa['nm']}手中的武器忽然失去了控制,喀吧一声就斩断了什么。那似乎是{$pa['nm']}的死线……</span><br>";
$pa['gg_flag'] = 1; $pa['hp'] = 0;
}
return 0;
}
# 真红暮进攻事件:
if($pa['type'] == 19 && $pa['name'] == '红暮')
{
attr_extra_19_crimson($pa,$pd,$active,'attack');
}
# 电子狐进攻事件:
if($pa['type'] == 89 && $pa['name'] == '电掣部长 米娜')
{
attr_extra_89_efox($pa,$pd,$active);
}
# 走地羊进攻事件:
if($pa['type'] == 89 && $pa['name'] == '坚韧之子·拉姆')
{
attr_extra_89_walksheep($pa,$pd,$active);
}
# 临摹装置:
if($pa['wep'] == "临摹装置")
{
$log .= "<span class=\"yellow\">{$pa['nm']}尝试使用临摹装置来复制{$pd['nm']}的武器!</span><br>";
$dice1 = diceroll(20);
if($dice1 > 1)
{
$dice2 = diceroll(20);
if(($pd['wepe'] > 17777) && ($dice2 <= 4)){ //对手武器过于强力则 1/4 可能失败!
$log .= "<span class=\"red\">因为{$pd['nm']}的武器过于给力,临摹装置在{$pa['nm']}手上爆炸了!</span><br>";
if($dice2 <= 2){
//大失败!
$log .= "<span class=\"red\">{$pa['nm']}眼前一黑,感觉小命要交代在这里了!</span><br>";
$pa['hp'] = 1;
}else{
$log .= "<span class=\"red\">{$pa['nm']}受到了巨大的伤害!</span><br>";
$pa['hp'] = round($pa['hp'] * 0.3);
}
}elseif(($pd['wepe'] > 999999) && ($dice2 >= 4)){
$log .= "<span class=\"red\">因为{$pd['nm']}的武器过于给力,临摹装置在{$pa['nm']}手上爆炸了!</span><br>";
if($dice2 <= 4){
//大失败!
$log .= "<span class=\"red\">{$pa['nm']}眼前一黑,感觉小命要交代在这里了!</span><br>";
$pa['hp'] = 1;
}else{
$log .= "<span class=\"red\">{$pa['nm']}受到了特别巨大的伤害!</span><br>";
$pa['hp'] = round($pa['hp'] * 0.1);
}
}else{
$log .= "<span class=\"yellow\">{$pa['nm']}成功地复制了对手的武器!</span><br>";
$log .= "<span class=\"yellow\">临摹装置化作了<span class=\"red\">{$pd['wep']}</span>!</span><br><br>";
$pa['wep'] = $pd['wep']; $pa['wepk'] = $pd['wepk']; $pa['wepsk'] = $pd['wepsk'];
$pa['wepe'] = $pd['wepe']; $pa['weps'] = $pd['weps'];
get_wep_kind($pa);
}
}
else
{
$log .= "<span class=\"red\">但是似乎失败了!</span><br>";
}
}
return 1;
}
//获取基础命中率与修正 //获取基础命中率与修正
function get_hitrate_rev(&$pa,&$pd,$active) function get_hitrate_rev(&$pa,&$pd,$active)
{ {
...@@ -154,20 +281,89 @@ ...@@ -154,20 +281,89 @@
return; return;
} }
//获取不受其他条件影响的固定伤害(混沌伤害) //获取不受其他条件影响的固定伤害变化(混沌伤害)
function get_fix_damage(&$pa,&$pd,$active) function get_fix_damage(&$pa,&$pd,$active)
{ {
//混沌伤害 global $log;
# 黑熊吃香蕉事件:
if($pa['type'] && in_array('X',$pa['ex_keys']))
{
if ($pa['wep'] == '燕返262') $log.="<img src=\"img/other/262.png\"><br>";
$damage = 999983;
$pd['gg_flag'] = 1;
$log .= "造成<span class=\"red\">$damage</span>点伤害!<br>";
return $damage;
}
# 真红暮防御事件:
if($pd['type'] == 19 && $pd['name'] == '红暮')
{
$p = attr_extra_19_crimson($pa,$pd,$active,'defend');
if(isset($p)) return $p;
}
# 数据护盾:这个有意思
if($pd['artk'] == "AA")
{
if($pd['type'])
{
if($pd['arte'] < 100)
{
$pd['arte'] = min(100,$pd['arte']+$pd['arts']);
$log .= "<span class=\"red\">{$pd['nm']}身上的数据护盾投射出了防护罩,轻松挡下了你的攻击!</span><br>";
return 0;
}
}
else
{
if($pd['arte'] > 1)
{
$pd['arte'] = max(1,$pd['arte']-$pd['arts']);
$log .= "<span class=\"red\">{$pd['nm']}身上的数据护盾投射出了防护罩,轻松挡下了你的攻击!</span><br>";
return 0;
}
}
$log .= "<span class=\"red\">{$pd['nm']}身上的数据护盾失效了!</span><br>";
}
# 迷你蜂进攻事件:
if ($pa['type'] == 89 && $pa['name'] == '诚心使魔·阿摩尔')
{
$damage = attr_extra_89_minibee($pa,$pd,$active);
return $damage;
}
# 魔法蜂针:
if($pa['wep'] == "魔法蜂针")
{
$log .= "<span class=\"red\">{$pa['nm']}使用魔法蜂针攻击{$pd['nm']}!</span><br>";
$damage = $pd['def']>65000 ? 1 : 350;
if($damage > 1) $log .= "<span class=\"lime\">蜂针命中了{$pd['nm']},对其造成了350点真实伤害!</span><br>";
else $log .= "<span class=\"lime\">然而{$pd['nm']}的防御力实在太高,你根本无法对其造成有效伤害!</span><br>";
if(strpos($pd['inf'],'p')===false)
{
$pd['inf'] .= 'p';
$log .= "<span class=\"lime\">蜂针还让{$pd['nm']}中毒了!</span><br>";
}
return $damage;
}
# 混沌伤害:
if(in_array('R',$pa['ex_keys'])) if(in_array('R',$pa['ex_keys']))
{ {
$maxdmg = $pd['mhp'] > $pa['wepe'] ? $pa['wepe'] : $pd['mhp']; $maxdmg = $pd['mhp'] > $pa['wepe'] ? $pa['wepe'] : $pd['mhp'];
$damage = rand(1,$maxdmg); $damage = rand(1,$maxdmg);
global $log; global $log;
$log .= "武器随机造成了<span class=\"red\">$damage</span>点伤害!<br>"; $log .= "武器随机造成了<span class=\"red\">$damage</span>点伤害!<br>";
}
return $damage; return $damage;
} }
return NULL;
}
//获取pa的攻击力 //获取pa的攻击力
function get_base_att(&$pa,&$pd,$active) function get_base_att(&$pa,&$pd,$active)
{ {
...@@ -195,10 +391,10 @@ ...@@ -195,10 +391,10 @@
rev_get_clubskill_bonus($pa['club'],$pa['skills'],$pa,$pd['club'],$pa['skills'],$pd,$att1,$def1); rev_get_clubskill_bonus($pa['club'],$pa['skills'],$pa,$pd['club'],$pa['skills'],$pd,$att1,$def1);
//pa攻击力: //pa攻击力:
$base_att = $pa['att'] + $pa['wepe_t'] + $att1; $base_att = $pa['att'] + $pa['wepe_t'] + $att1;
echo "【DEBUG】{$pa['name']}的base_att是{$base_att},"; //echo "【DEBUG】{$pa['name']}的base_att是{$base_att},";
//计算攻击力修正 //计算攻击力修正
$base_att = get_base_att_modifier($pa,$pd,$active,$base_att); $base_att = get_base_att_modifier($pa,$pd,$active,$base_att);
echo "修正后是{$base_att}。<br>"; //echo "修正后是{$base_att}。<br>";
return $base_att; return $base_att;
} }
...@@ -252,10 +448,10 @@ ...@@ -252,10 +448,10 @@
rev_get_clubskill_bonus($pa['club'],$pa['skills'],$pa,$pd['club'],$pa['skills'],$pd,$att1,$def1); rev_get_clubskill_bonus($pa['club'],$pa['skills'],$pa,$pd['club'],$pa['skills'],$pd,$att1,$def1);
//pd防御力: //pd防御力:
$total_def = $base_def+$equip_def+$def1; $total_def = $base_def+$equip_def+$def1;
echo "【DEBUG】{$pd['name']}的total_def是{$total_def},"; //echo "【DEBUG】{$pd['name']}的total_def是{$total_def},";
//计算防御力修正 //计算防御力修正
$total_def = get_base_def_modifier($pa,$pd,$active,$total_def); $total_def = get_base_def_modifier($pa,$pd,$active,$total_def);
echo "修正后是{$total_def}。<br>"; //echo "修正后是{$total_def}。<br>";
return $total_def; return $total_def;
} }
...@@ -300,6 +496,8 @@ ...@@ -300,6 +496,8 @@
//计算伤害浮动: //计算伤害浮动:
$dmg_factor = (100 + rand ( - $dfluc, $dfluc )) / 100; $dmg_factor = (100 + rand ( - $dfluc, $dfluc )) / 100;
$damage = round ( $damage * $dmg_factor * rand ( 4, 10 ) / 10 ); $damage = round ( $damage * $dmg_factor * rand ( 4, 10 ) / 10 );
//把计算得到的原始伤害保存在$pa['original_dmg']里
$pa['original_dmg'] = $damage;
return $damage; return $damage;
} }
...@@ -338,6 +536,13 @@ ...@@ -338,6 +536,13 @@
//在输出成log时会显示为:总计造成了100x0.5x1.2...=111点伤害 的形式 //在输出成log时会显示为:总计造成了100x0.5x1.2...=111点伤害 的形式
$dmg_p = Array(); $dmg_p = Array();
# 书中虫防守事件:
if($pd['type'] == 89)
{
$p = attr_extra_89_bookworm($pa,$pd,$active);
if($p>0) $dmg_p[]= $p;
}
# 重击判定: # 重击判定:
//获取触发重击需要的最小怒气值 //获取触发重击需要的最小怒气值
if(in_array('c',$pa['ex_keys'])) if(in_array('c',$pa['ex_keys']))
...@@ -370,8 +575,9 @@ ...@@ -370,8 +575,9 @@
$dmg_p[]= $p; $dmg_p[]= $p;
//输出log //输出log
$log .= npc_chat ($pa['type'],$pa['nm'],'critical'); $log .= npc_chat ($pa['type'],$pa['nm'],'critical');
if ($pa['club'] == 9) $log .= "消耗<span class=\"yellow\">$rg_m</span>点怒气,<span class=\"red\">发动必杀技!</span><br>"; $log .= "{$pa['nm']}消耗<span class=\"yellow\">{$rage_min_cost}</span>点怒气,";
else $log .= "<span class=\"red\">使出重击!</span><br>"; if ($pa['club'] == 9) $log .= "<span class=\"red\">发动必杀技!</span>";
else $log .= "<span class=\"red\">使出重击!</span>";
} }
} }
...@@ -733,12 +939,16 @@ ...@@ -733,12 +939,16 @@
$fin_dmg_p = 1; $fin_dmg_p = 1;
# 晶莹判定: # 晶莹判定:
if($pa['club'] == 19 || $pd['club'] == 19)
{
$p = rev_get_clubskill_bonus_dmg_rate($pa['club'],$pa['skills'],$pa,$pd['club'],$pd['skills'],$pd); $p = rev_get_clubskill_bonus_dmg_rate($pa['club'],$pa['skills'],$pa,$pd['club'],$pd['skills'],$pd);
if($p != 100) if($p != 100)
{ {
$log.="<span class=\"yellow\">在「晶莹」的作用下,{$pa['nm']}造成的最终伤害变化至".$p."%!</span><br>"; $log.="<span class=\"yellow\">在「晶莹」的作用下,{$pa['nm']}造成的最终伤害变化至".$p."%!</span><br>";
$fin_dmg_p[] = round($p/100); $fin_dmg_p[] = round($p/100);
} }
}
return $fin_dmg_p; return $fin_dmg_p;
} }
...@@ -764,12 +974,15 @@ ...@@ -764,12 +974,15 @@
} }
#剔透判定: #剔透判定:
if($pa['club'] == 19)
{
$rp_dmg = rev_get_clubskill_bonus_dmg_val($pa['club'],$pa['skills'],$pa,$pd); $rp_dmg = rev_get_clubskill_bonus_dmg_val($pa['club'],$pa['skills'],$pa,$pd);
if($rp_dmg > 0) if($rp_dmg > 0)
{ {
$fin_dmg += $rp_dmg; $fin_dmg += $rp_dmg;
$log .= "<span class=\"yellow\">在「剔透」的作用下,敌人受到了<span class=\"red\">$rp_dmg</span>点额外伤害。</span><br>"; $log .= "<span class=\"yellow\">在「剔透」的作用下,敌人受到了<span class=\"red\">$rp_dmg</span>点额外伤害。</span><br>";
} }
}
return $fin_dmg; return $fin_dmg;
} }
...@@ -792,9 +1005,12 @@ ...@@ -792,9 +1005,12 @@
if (in_array('H',$pa['ex_keys'])) { if (in_array('H',$pa['ex_keys'])) {
$hp_d = floor ( $hp_d / 10 ); $hp_d = floor ( $hp_d / 10 );
} }
if($hp_d > 0)
{
$log .= "惨无人道的攻击对{$pa['nm']}自身造成了<span class=\"red\">$hp_d</span>点<span class=\"red\">反噬伤害!</span><br>"; $log .= "惨无人道的攻击对{$pa['nm']}自身造成了<span class=\"red\">$hp_d</span>点<span class=\"red\">反噬伤害!</span><br>";
$pa['hp'] -= $hp_d; $pa['hp'] -= $hp_d;
} }
}
return; return;
} }
...@@ -803,6 +1019,12 @@ ...@@ -803,6 +1019,12 @@
{ {
global $log,$infatt_rev,$infinfo; global $log,$infatt_rev,$infinfo;
# 真蓝凝防守事件:
if($pd['type'] == 19 && $pd['name'] == '蓝凝')
{
attr_extra_19_azure($pa,$pd,$active);
}
# pa致伤次数>0时,计算pd防具受损或致伤情况 # pa致伤次数>0时,计算pd防具受损或致伤情况
if($pa['inf_times']>0) if($pa['inf_times']>0)
{ {
...@@ -827,15 +1049,45 @@ ...@@ -827,15 +1049,45 @@
} }
else else
{ {
if(strpos($pd['inf'],$inf_att) === false) $flag = get_inf_rev($pd,$inf_att);
{ if($flag) $log .= "{$pd['nm']}的<span class=\"red\">$infinfo[$inf_att]</span>部受伤了!<br>";
$pd['inf'] .= $inf_att; }
$pd['combat_inf'] .= $inf_att;
$log .= "{$pd['nm']}的<span class=\"red\">$infinfo[$inf_att]</span>部受伤了!<br>";
} }
} }
return;
}
//战斗后结算rp事件
function get_killer_rp(&$pa,&$pd,$active)
{
//杀人rp结算
$rpup = $pd['type'] ? 20 : max(80,$pd['rp']);
//晶莹剔透修正
if($pa['club'] == 19)
{
$rpdec = 30;
$rpdec += get_clubskill_rp_dec($pa['club'],$pa['skills']);
$pa['rp'] += round($rpup*(100-$rpdec)/100);
} }
else
{
$pa['rp'] += $rpup;
} }
return; return;
} }
//受到致伤或异常
function get_inf_rev(&$pa,$infnm,$type=0)
{
global $log;
if(strpos($pa['inf'],$infnm) === false)
{
$pa['inf'] .= $infnm;
$pa['combat_inf'] .= $infnm;
return 1;
}
return 0;
}
?> ?>
\ No newline at end of file
<?php
if(!defined('IN_GAME')) {
exit('Access Denied');
}
include_once GAME_ROOT.'./include/game/dice.func.php';
include_once GAME_ROOT.'./include/game/itemmain.func.php';
//revattr_extra.func.php: 记录NPC特殊战斗机制
//Q:为什么要把每个NPC的特殊战斗机制都新建一个函数保存?
//A:也不是每个都要这么干……这个做法主要用于存在大段log、多段判定的机制,分离出来一是方便定位这个NPC的相关机制在哪个阶段执行,二是确保原流程的可读性;
# 真红暮特殊判定
function attr_extra_19_crimson(&$pa,&$pd,$active,$phase=0)
{
global $log;
# 真红暮作为防御方时的事件
if($pd['type'] == 19 && $pd['name'] == '红暮' && $pa['wep_kind'] != $pd['wep_kind'] && $phase == 'defend')
{
$log .= "<span class=\"red\">红暮身上的武器投射出了防护罩,轻松挡下了{$pa['nm']}的攻击!</span><br>";
return 0;
}
# 真红暮作为进攻方时的事件:
if($pa['type'] == 19 && $pa['name'] == '红暮' && $phase == 'attack')
{
$log .= "<span class=\"yellow\">“那么说好了,不留手咯~”<br>红暮吐气扬声,向你袭来!</span><br>";
if($pa['wep'] != '喷气式红杀重铁剑')
{
$event_dice=rand(1,6);
$log .= "<span class=\"neonred\">只见红暮手上的巨大铁剑带着一条火光向你飞去。</span><br>";
if($event_dice == 1)
{
get_inf_rev($pd,'w');
get_inf_rev($pd,'u');
$log .= "<span class=\"yellow\">你被赤红热风扫过,顿感头晕目眩,而且身上也起了火!</span><br>";
}
else
{
$log .= "<span class=\"lime\">不过你灵活地躲开了赤红热风!</span><br>";
}
}
if($pa['wep'] != '绯红记忆')
{
$event_dice=rand(1,8);
$log .= "<span class=\"neonred\">只见从红暮身边飞出来了一个红色的光球!</span><br>";
if($event_dice==1)
{
$damage = min($pd['hp']-1,round($pd['mhp']*0.5)); //罪不至死
$pd['hp'] -= $damage;
//$log .= "<span class=\"yellow\">“虽说我不是什么超能力者,但是最高级的科技也和超能力无异了!”红暮大笑。</span><br>";
$log .= "<span class=\"yellow\">红色的光球直击你的心脏!</span><br>";
$log .= "这一发绯红锥心弹对你造成<span class=\"red\">$damage</span>点伤害!你感觉你半条命都没咯~<br>";
}
else
{
$log .= "<span class=\"lime\">你大呼不妙,连忙侧身躲过了这发绯红锥心弹!</span><br>";
}
}
if($pa['wep'] != '血色强袭')
{
$event_dice=rand(1,4);
$log .= "<span class=\"neonred\">红暮从背后抽出一把重炮,向你扣下了扳机!</span><br>";
if($event_dice==1)
{
$wdamage=rand(5,40);
$pd['wep_imp_times'] = $wdamage;
weapon_loss($pd,1);
get_inf_rev($pd,'a');
$log .= "<span class=\"yellow\">这一发强袭追踪弹结实地打到了你手持武器的手上,你痛的龇牙咧嘴,武器也受到了损伤!</span><br>";
}
else
{
$log .= "<span class=\"lime\">你身形一矮,躲过了这发强袭追踪弹。</span><br>";
}
}
if($pa['wep'] != '狮虎丝带')
{
$event_dice=rand(1,4);
//$log .= "<span class=\"yellow\">红暮打了一个响指,从背后飞出来两条丝带!<br>“虽然这种玩意蓝凝应该用的更顺手吧……”</span><br>";
$log .= "<span class=\"neonred\">红暮打了一个响指,从背后飞出来两条丝带!”</span><br>";
if($event_dice==1)
{
$pd['sp'] = max(0,$pd['sp']-250);
$log .= "<span class=\"yellow\">丝带将你缠绕,吸收了你的体力!</span><br>";
}
else
{
$log .= "<span class=\"lime\">你赶快腾跃躲避,两条丝带擦身而过!</span><br>";
}
}
if($pa['wep'] != '落樱巨锤')
{
$event_dice=rand(1,6);
//$log .= "<span class=\"yellow\">红暮高高一跃,跳到空中!<br>“询问淑女的体重固然很不礼貌,但我自然不是什么淑女!”</span><br>";
$log .= "<span class=\"neonred\">红暮高高一跃,跳到空中!</span><br>";
if($event_dice==1)
{
$pd['hp']-=1107;
$log .= "<span class=\"yellow\">巨大的机甲一下便将你碾压!造成了<span class=\"red\">1107</span>点伤害!</span><br>";
}
else
{
$log .= "<span class=\"lime\">你在地上进行了一次翻滚,躲开了从天而降的机甲!</span><br>";
}
}
if($pa['wep'] != '八八连流星浮游炮')
{
$event_dice=rand(1,6);
//$log .= "<span class=\"yellow\">从红暮的机甲中发射出了大量的火箭弹!<br>“知道吗,量变终究会引起质变!”</span><br>";
$log .= "<span class=\"neonred\">从红暮的机甲中发射出了大量的火箭弹!</span><br>";
if($event_dice==1)
{
$log .= "<span class=\"yellow\">虽然火箭弹的精度颇低,但是大量的火箭弹还是对你的防具造成了可观的伤害!</span><br>";
$adamage=rand(5,40);
foreach(Array('arb','arh','ara','arf') as $ar)
{
if(!empty(${$ar.'s'})) armor_hurt($pd,$ar,$adamage);
}
}
else
{
$log .= "<span class=\"lime\">然而飞弹的精度太低,你并没有被它们打中。</span><br>";
}
}
//血量小于0的情况下 返回值1
if($pd['hp'] < 0) return 1;
}
return NULL;
}
# 真蓝凝特殊判定
function attr_extra_19_azure(&$pa,&$pd,$active,$phase=0)
{
global $db,$tablepre,$log;
if($pd['type'] == 19 && $pd['name'] == '蓝凝')
{
$id = $pd['pid'];
$dice = diceroll(100);
$ttr="♪臻蓝之愿♪";
$ttr2="♫钴蓝之灵♫";
$ttr3="❀矢车菊的回忆❀";
//$rp=18;
//不要起这种会和玩家数据混淆的变量名啊喂!
$rpls = $pa['pls'];
if ($dice<5) $rpls=rand(1,33);
$le=diceroll(200)+$pa['mhp']-100;
if ($le>1001) $le=1001;
$db->query("INSERT INTO {$tablepre}maptrap (itm, itmk, itme, itms, itmsk, pls) VALUES ('$ttr', 'TO', '$le', '1', '$id', '$rpls')");
$le=rand(1,200)+$pa['final_damage']-100;
if ($le>2000) $le=2000;
$db->query("INSERT INTO {$tablepre}maptrap (itm, itmk, itme, itms, itmsk, pls) VALUES ('$ttr2', 'TO', '$le', '1', '$id', '$rpls')");
$le=rand(1,$pa['hp']);
$db->query("INSERT INTO {$tablepre}maptrap (itm, itmk, itme, itms, itmsk, pls) VALUES ('$ttr3', 'TO', '$le', '1', '$id', '$rpls')");
$log .= "从蓝凝的身边飞出了数个光球,散布在了战场上!<br>";
}
return;
}
# 电子狐特殊判定
function attr_extra_89_efox(&$pa,&$pd,$active,$phase=0)
{
global $log;
# 进攻方(pa)为米娜
if ($pa['type'] == 89 && $pa['name'] == '电掣部长 米娜')
{
$log .= "<span class=\"yellow\">米娜的双眼突然闪耀了起来!</span><br>
<span class=\"neonblue\">“侦测到敌意实体,开始扫描~”</span><br>";
$dice = diceroll(1024);
//$log .= "<span class=\"yellow\">【DEBUG】骰子检定结果:<span class=\"red\">$dice</span>/1024。</span><br>";
if($dice<=126)//8%
{
$log .= "<span class=\"yellow\">“似乎米娜具现化了你的武器!”</span><br>
<span class=\"neonblue\">“你的<span class=\"red\">{$pd['wep']}</span>,我就收下了!”</span><br>";
$pa['wep'] = $pd['wep']; $pa['wepk'] = $pd['wepk']; $pa['wepsk'] = $pd['wepsk'];
$pa['wepe'] = $pd['wepe']; $pa['weps'] = $pd['weps'];
get_wep_kind($pa);
}
elseif($dice<=635)
{
$dice2 = rand(1,5);
$log .= "<span class=\"yellow\">“似乎米娜扫描了你的武器!”</span><br>
<span class=\"neonblue\">“你的<span class=\"red\">{$pd['wep']}</span>,已扫描入<span class=\"red\">$dice2</span>号位。”<br>
“我会妥善保管的~”</span><br>";
$pa['itm'.$dice2] = $pd['wep']; $pa['itmk'.$dice2] = $pd['wepk']; $pa['itmsk'.$dice2] = $pd['wepsk'];
$pa['itme'.$dice2] = $pd['wepe']; $pa['itms'.$dice2] = $pd['weps'];
}
elseif($dice>=1024) // 1/1024 几率直接抢夺玩家全部背包
{
$log .= "<span class=\"yellow\">哎呀,骰子检定结果是大·失·败!</span><br>";
$log .= "<span class=\"yellow\">“米娜将你的全身扫描了个遍!”</span><br>
<span class=\"neonblue\">“我判定你身上的东西放到我身上可能更好一点~”<br>
“我会妥善保管的~”</span><br>";
for($i=1;$i<=6;$i++)
{
if(!empty($pd['itms'.$i]))
{
//复制
$pa['itm'.$i] = $pd['itm'.$i]; $pa['itmk'.$i] = $pd['itmk'.$i]; $pa['itmsk'.$i] = $pd['itmsk'.$i];
$pa['itme'.$i] = $pd['itme'.$i]; $pa['itms'.$i] = $pd['itms'.$i];
//哎哟喂啊,真是倒霉,但这就是人生啊。
$pd['itm'.$i] = $pd['itmk'.$i] = $pd['itmsk'.$i] = '';
$pd['itme'.$i] = $pd['itms'.$i] = 0;
}
}
}
else
{
$log .= "<span class=\"yellow\">不过似乎什么都没发生!</span><br>
<span class=\"neonblue\">“扫描失败了么……”</span><br>";
}
}
}
# 书中虫特殊判定
function attr_extra_89_bookworm(&$pa,&$pd,$active,$phase=0)
{
global $log;
$rp_up = 0; $dmg_p = -1;
# 防守方(pd)为白神
if($pd['type'] == 89)
{
if($pd['name'] == '高中生·白神')
{
$log .= "<span class=\"yellow\">“你真的愿意对这个手无寸铁的高中女生下手么?”</span><br>";
$dice = diceroll(444);
if($dice<=200){
$log .= "<span class=\"neonblue\">“你感觉到了罪恶感。”</span><br>";
}else{
$log .= "<span class=\"neonblue\">“你不该这么做的。”</span><br>";
}
$rp_up = $pa['rp'] + $dice;
if ($pa['original_dmg'] > 400)
{
$log .= "<span class=\"yellow\">白神从裙底抽出了她的名为WIN MAX 2的微型电脑!<br>“哪能这样被你干打?”</span><br>";
$log .= "<span class=\"yellow\">白神的高超黑客技术大幅度降低了你造成的伤害!</span><br>";
$dmg_p = 0.005;
}
}
if ($pd['name'] == '白神·讨价还价')
{
$dice = diceroll(1777);
$log .= "<span class=\"yellow\">“对面似乎真的没有敌意,你还是决定要下手么?”</span><br>";
if($dice<=200){
$log .= "<span class=\"neonblue\">“你感觉到了罪恶感。”</span><br>";
}elseif($dice<=400){
$log .= "<span class=\"neonblue\">“你不该这么做的。”</span><br>";
}else{
$log .= "<span class=\"neonblue\">“罪恶感爬上了你的脊梁!”</span><br>";
}
$rp_up = $pa['rp'] + $dice;
if ($pa['original_dmg'] > 400)
{
$log .= "<span class=\"yellow\">白神从裙底抽出了她的名为DECK的微型电脑!<br>“哪能这样被你干打?”</span><br>";
$log .= "<span class=\"yellow\">白神的高超黑客技术大幅度降低了你造成的伤害!</span><br>";
$dmg_p = 0.005;
}
}
if ($pd['name'] == '白神·接受')
{
global $rp;
$dice = rand(1777,4888);
$log .= "<span class=\"yellow\">“你对一位毫无反抗能力,并且已经表示无敌意的女高中生横下死手。”</span><br>";
$log .= "<span class=\"neonblue\">“希望你的良心还能得以安生。”</span><br>";
//$log .= "<span class=\"neonblue\">“【DEBUG】你的rp上升了<span class=\"red\">$dice</span>点。”</span><br>";
$rp_up = $pa['rp'] + $dice;
}
//结算rp上升事件
if($rp_up > 0) $pa['rp'] = $pa['rp'] + $rp_up;
//返回一个伤害系数
}
return $dmg_p;
}
# 百命猫特殊判定
function attr_extra_89_100lifecat(&$pa,&$pd,$active,$phase=0)
{
if ($pa['type'] == 89 && $pa['name']=='是TSEROF啦!')
{
if($pa['lvl'] < 255) $pa['lvl']++;
if($pa['rage'] < 255) $pa['rage']++;
}
if ($pd['type'] == 89 && $pd['name']=='是TSEROF啦!')
{
if($pd['lvl'] < 255) $pd['lvl']++;
if($pd['rage'] < 255) $pd['rage']++;
}
return;
}
# 笼中鸟特殊判定
function attr_extra_89_cagedbird(&$pa,&$pd,$active,$phase=0)
{
global $log;
if($pa['type'] == 89 && $pa['name'] =='笼中鸟')
{
if($pa['statusa'] < 3)
{
$continue_flag = 0;
//70%几率吸收玩家HP值成为自己的HP和SP值,SP值上升到一定程度时变身,变身后各种数值直接膨胀。三段变身。
$log .= "<span class=\"yellow\">“笼中鸟含情脉脉地看着你!”</span><br>";
$dice=diceroll(20);
//$log .= "<span class=\"yellow\">【DEBUG】骰子检定结果:<span class=\"red\">$dice</span>。</span><br>";
if($dice>=14)
{
$log .= "<span class=\"yellow\">“你感觉你的生命被她汲取,但同时更有一种奇怪的暖洋洋的舒畅感。”</span><br>";
//继续投d20,1~10吸收30%,11~19吸收65%,大失败直接吸到1。
$dice2=rand(1,20);
//$log .= "<span class=\"yellow\">【DEBUG】骰子2检定结果:<span class=\"red\">$dice2</span>。</span><br>";
if($dice2<=10){
$log .= "<span class=\"yellow\">“你稍微稳了稳身形,似乎问题不是很严重。”</span><br>";
$gain = $pd['hp'] * 0.3;
}elseif($dice2<=19){
$log .= "<span class=\"yellow\">“你觉得头晕目眩。”</span><br>";
$gain = $pd['hp'] * 0.65;
}elseif($dice2>=20){
$log .= "<span class=\"yellow\">哎呀,骰子检定结果是大·失·败!</span><br>";
//哎哟喂啊,真是倒霉,但这就是人生啊。
$log .= "<span class=\"yellow\">“你整个人都倒了下去,不过想到你的生命力将要打开她的镣铐,这让你充满了决心。”</span><br>";
$gain = $pd['hp'] - 1;
$pd['def'] = $pd['def'] + ($gain * 0.25);
}
$pa['hp'] = $pa['hp'] + ($gain * 30);
$pa['mhp']= $pa['mhp'] + ($gain * 30);
$pa['msp'] = $pa['msp'] + ($gain * 30);
$pd['hp'] = round($pd['hp'] - $gain);
$pd['rp'] = round($pd['rp'] - $gain);
$continue_flag = 1;
}
else
{
$log .= "<span class=\"yellow\">“不过什么也没有发生!”</span><br>";
}
}
//处理直接变身 在$pa['statusa']加了个限定条件 不然无限变身了
if($pa['msp']> 5003 && $pa['statusa'] == 0){
$log .= "<span class=\"yellow\">“笼中鸟的枷锁被打破了一些。”</span><br>";
$pa['statusa'] = 1;
$pa['mhp'] = $pa['mhp'] * 5; $pa['hp'] = $pa['hp'] * 5; $pa['wf'] = $pa['wf'] * 5; $pa['att'] = $pa['att'] * 5; $pa['def'] = $pa['def'] * 5;
}elseif($pa['msp'] > 13377 && $pa['statusa'] == 1){
$log .= "<span class=\"yellow\">“笼中鸟的枷锁被打破了一些。”</span><br>";
$pa['statusa'] = 2;
$pa['mhp'] = $pa['mhp'] * 10; $pa['hp'] = $pa['hp'] * 10; $pa['wf'] = $pa['wf'] * 10; $pa['att'] = $pa['att'] * 10; $pa['def'] = $pa['def'] * 10;
}elseif($pa['msp'] > 33777 && $pa['statusa'] == 2){
$log .= "<span class=\"yellow\">“笼中鸟的枷锁被完全打破了!”</span><br>";
$pa['statusa'] = 3;
$pa['mhp'] = $pa['mhp'] * 30; $pa['hp'] = $pa['hp'] * 30; $pa['wf'] = $pa['wf'] * 30; $pa['att'] = $pa['att'] * 30; $pa['def'] = $pa['def'] * 30;
$pa['name'] = $pa['nm'] = "完全解放的鸟儿";
}
//成功喂养笼中鸟会跳过战斗
if($continue_flag) return -1;
}
return 0;
}
#走地羊特殊判定
function attr_extra_89_walksheep(&$pa,&$pd,$active,$phase=0)
{
global $log;
if($pa['type'] == 89 && $pa['name'] == '坚韧之子·拉姆')
{
$event_dice=diceroll(99);
if($event_dice >=30)
{
$log .= "<span class=\"neonblue\">“我这双拳头……很强……很厉害……咚咚打你……”</span><br>";
$damage=rand(5,40);
if(!empty($pd['weps']))
{
$log .= "攻击使得<span class=\"red\">{$pd['wep']}</span>的耐久度下降了<span class=\"red\">$damage</span>点!<br>";
$pd['wep_imp_times'] = $damage;
$loss_flag = weapon_loss($pd,1);
if($loss_flag < 0)
{
$pa['money'] = $pa['money'] + ($damage * 120);
}
}
foreach(Array('arb','arh','ara','arf') as $ar)
{
if(!empty(${$ar.'s'}))
{
$loss_flag = armor_hurt($pd,$ar,$damage);
if($loss_flag < 0)
{
$pa['money'] = $pa['money'] + ($damage * 60);
}
}
}
$w_money = $w_money + ($damage * 30);
get_inf_rev($pd,'a');
get_inf_rev($pd,'f');
$log .= "致伤攻击使你的<span class=\"red\">腕部</span>和<span class=\"red\">足部</span>受伤了!<br>";
}
}
return;
}
# 迷你蜂特殊判定
function attr_extra_89_minibee(&$pa,&$pd,$active,$phase=0)
{
global $log;
if ($pa['type'] == 89 && $pa['name'] == '诚心使魔·阿摩尔') // 迷你蜂
{
$log .= "<span class=\"neonblue\">“这只小蜜蜂勇敢地朝你袭来!”</span><br>";
$dice = diceroll(4);
if($dice == 0){
$log .= "<span class=\"yellow\">魔法蜂针朝你刺来!造成了<span class=\"red\">250</span>点伤害!并且使你<span class=\"red\">麻痹</span>了!</span><br>";
$dmg = 250;
get_inf_rev($pd,'e');
}elseif($dice == 1){
$log .= "<span class=\"yellow\">幻惑花粉朝你扑来!造成了<span class=\"red\">250</span>点伤害!并且使你<span class=\"red\">混乱</span>了!</span><br>";
$dmg = 250;
get_inf_rev($pd,'w');
}elseif($dice == 2){
$log .= "<span class=\"yellow\">凶猛翼击朝你袭来!造成了<span class=\"red\">250</span>点伤害!并且使你<span class=\"red\">炎上</span>了!</span><br>";
$dmg = 250;
get_inf_rev($pd,'u');
}elseif($dice == 3){
$log .= "<span class=\"yellow\">剧毒蜂针朝你刺来!造成了<span class=\"red\">250</span>点伤害!并且使你<span class=\"red\">中毒</span>了!</span><br>";
$dmg = 250;
get_inf_rev($pd,'p');
}else{
$log .= "<span class=\"yellow\">体当冲刺朝你袭来!造成了<span class=\"red\">550</span>点伤害!<br>";
$dmg = 250;
if($hp < 0) $hp=0;
}
return $dmg;
}
}
?>
\ No newline at end of file
...@@ -3,9 +3,10 @@ ...@@ -3,9 +3,10 @@
if(!defined('IN_GAME')) { if(!defined('IN_GAME')) {
exit('Access Denied'); exit('Access Denied');
} }
include_once GAME_ROOT.'./include/game/clubskills.func.php'; include_once GAME_ROOT.'./include/game/dice.func.php';
include_once GAME_ROOT.'./include/game/combat.func.php';
include_once GAME_ROOT.'./include/game/attr.func.php'; include_once GAME_ROOT.'./include/game/attr.func.php';
include_once GAME_ROOT.'./include/game/revattr.func.php';
include_once GAME_ROOT.'./include/game/combat.func.php';
//战斗准备流程:根据active为交战双方分配视角,初始化界面 //战斗准备流程:根据active为交战双方分配视角,初始化界面
function rev_combat_prepare($pa,$pd,$active,$wep_kind='',$msg='',$log_print=1) function rev_combat_prepare($pa,$pd,$active,$wep_kind='',$msg='',$log_print=1)
...@@ -54,30 +55,15 @@ ...@@ -54,30 +55,15 @@
//登记非功能性地点信息时合并隐藏地点 //登记非功能性地点信息时合并隐藏地点
foreach($hplsinfo as $hgroup=>$hpls) $plsinfo += $hpls; foreach($hplsinfo as $hgroup=>$hpls) $plsinfo += $hpls;
//传入了攻击方式/主动技的情况下,在这里判断传入参数的合法性
if (!$wep_kind)
{
$w1 = substr ($pa['wepk'], 1, 1 );
$w2 = substr ($pa['wepk'], 2, 1 );
if ((($w1 == 'G')||($w1=='J')) && ($pa['weps'] == $nosta))
{
$wep_kind = $w2 ? $w2 : $w1; //这里不判断枪没子弹的情况 传进下个流程后再同一批判断
}
else
{
$wep_kind = $w1;
}
}
elseif(strpos($pa['wepk'],$wep_kind)===false)
{
$wep_kind = substr ($pa['wepk'], 1, 1 );
}
$pa['wep_kind'] = $wep_kind;
//登记称谓 //登记称谓
$pa['nm'] = (!$pa['type'] && $active) ? '你' : $pa['name']; $pa['nm'] = (!$pa['type'] && $active) ? '你' : $pa['name'];
$pd['nm'] = (!$pd['type'] && !$active && $pa['nm']!=='你') ? '你' : $pd['name']; $pd['nm'] = (!$pd['type'] && !$active && $pa['nm']!=='你') ? '你' : $pd['name'];
//在初始化战斗阶段触发的事件。即:无论是否反击都只会触发1次的事件。
//如果返回值小于0,则中断战斗。
$cp_flag = combat_prepare_events($pa,$pd,$active);
if($cp_flag < 0) goto battle_finish_flag;
if($active) if($active)
{ {
if(!$pa['type'] && $pa['message']) if(!$pa['type'] && $pa['message'])
...@@ -102,18 +88,25 @@ ...@@ -102,18 +88,25 @@
//战斗发起者是NPC时进行的判断 //战斗发起者是NPC时进行的判断
if($pa['type']) if($pa['type'])
{ {
//$log .= npc_chat ($pa['type'],$pa['name'],'attack'); $log .= npc_chat ($pa['type'],$pa['name'],'attack');
//npc_changewep(); TODO //换装判定
npc_changewep();
} }
//传入了攻击方式/主动技的情况下,在这里判断传入参数的合法性,并初始化$pa['wep_kind']
get_wep_kind($pa,$wep_kind);
get_wep_kind($pd);
//打击流程 //打击流程
$att_dmg = rev_attack($pa,$pd,$active); $att_dmg = rev_attack($pa,$pd,$active);
//暴毙流程 //暴毙流程
if($pa['ggflag']) if($pa['gg_flag'])
{ {
unset($pa['ggflag']); //登记暴毙死法
return; //执行复活判定:
//$revival_flag = revive_process($pa,$pd,$active);
//if(!$revival_flag) goto battle_finish_flag;
} }
//打击效果结算 //打击效果结算
...@@ -121,21 +114,14 @@ ...@@ -121,21 +114,14 @@
{ {
//扣血 //扣血
$pd['hp'] = max(0,$pd['hp']-$att_dmg); $pd['hp'] = max(0,$pd['hp']-$att_dmg);
//判断是否触发击杀或复活 //判断是否触发击杀或复活:1-继续战斗;0-中止战斗
$att_result = rev_combat_result($pa,$pd,$active); $att_result = rev_combat_result($pa,$pd,$active);
} }
//判断是否进入反击流程 把!$att_result去掉可以实现复活后反击 很酷吧! //判断是否进入反击流程 把!$att_result去掉可以实现复活后反击 很酷吧!
if (($pd['hp'] > 0) && ($pd['pose'] != 5) && ($pd['tactic'] != 4) && !$att_result) if (($pd['hp'] > 0) && ($pd['pose'] != 5) && ($pd['tactic'] != 4) && $att_result>0)
{ {
global $rangeinfo; global $rangeinfo;
$w_w1 = substr ($pd['wepk'], 1, 1 );
$w_w2 = substr ($pd['wepk'], 2, 1 );
if ((($w_w1 == 'G')||($w_w1=='J')) && ($pd['weps'] == $nosta)) {
$pd['wep_kind'] = $w_w2 ? $w_w2 : 'P';
} else {
$pd['wep_kind'] = $w_w1;
}
//echo "【DEBUG】{$pd['name']}的攻击方式是{$pd['wep_kind']}<br>"; //echo "【DEBUG】{$pd['name']}的攻击方式是{$pd['wep_kind']}<br>";
$d_wep_temp = $pd['wep']; $d_wep_temp = $pd['wep'];
...@@ -163,9 +149,9 @@ ...@@ -163,9 +149,9 @@
$log .= "<span class=\"red\">{$pd['nm']}攻击范围不足,不能反击,逃跑了!</span><br>"; $log .= "<span class=\"red\">{$pd['nm']}攻击范围不足,不能反击,逃跑了!</span><br>";
} }
} }
elseif($pd['hp']>0 && !$att_result) elseif($pd['hp']>0 && $att_result>0)
{ {
$log .= "<span class=\"red\">{$pd['nm']}逃跑了!</span><br>"; $log .= "<span class=\"red\">{$pd['nm']}没有反击,转身逃开了!</span><br>";
} }
//反击效果结算 //反击效果结算
...@@ -190,6 +176,13 @@ ...@@ -190,6 +176,13 @@
save_combatinfo (); save_combatinfo ();
} }
//logsave
if (!$pd['type'])
{
}
battle_finish_flag:
//如果战斗中出现了死人 更新action标记 //如果战斗中出现了死人 更新action标记
if ($active) if ($active)
{ {
...@@ -270,7 +263,9 @@ ...@@ -270,7 +263,9 @@
global $now,$nosta,$log,$infobbs,$infinfo,$attinfo,$skillinfo,$wepimprate,$specialrate; global $now,$nosta,$log,$infobbs,$infinfo,$attinfo,$skillinfo,$wepimprate,$specialrate;
global $db,$tablepre; global $db,$tablepre;
include_once GAME_ROOT . './include/game/revattr.func.php'; # 在打击流程开始前判定的事件(直死、临摹装置、DOT结算、踩陷阱……) 返回1-继续打击流程 返回0-中止打击流程
$gg_flag = hitrate_prepare_events($pa,$pd,$active);
if(!$gg_flag) return 0;
//枪托修正:你怎么老搞特殊化 //枪托修正:你怎么老搞特殊化
if (($pa['wep_kind'] == 'G'||$pa['wep_kind']=='J') && ($pa['weps'] == $nosta)) if (($pa['wep_kind'] == 'G'||$pa['wep_kind']=='J') && ($pa['weps'] == $nosta))
...@@ -345,7 +340,7 @@ ...@@ -345,7 +340,7 @@
{ {
//检查是否存在造成不受其他因素影响的固定伤害(例:混沌伤害、直死) //检查是否存在造成不受其他因素影响的固定伤害(例:混沌伤害、直死)
$fix_dmg = get_fix_damage($pa,$pd,$active); $fix_dmg = get_fix_damage($pa,$pd,$active);
if($fix_damage) if(isset($fix_dmg))
{ {
$damage = $fix_dmg; $damage = $fix_dmg;
} }
...@@ -476,85 +471,93 @@ ...@@ -476,85 +471,93 @@
return $damage; return $damage;
} }
//战斗结算流程: //战斗结算流程:返回1=继续战斗;返回0=中止战斗;
function rev_combat_result(&$pa,&$pd,$active) function rev_combat_result(&$pa,&$pd,$active)
{ {
global $log; global $log;
# 防守方血量低于0时 结算击杀/复活事件
if($pd['hp']<= 0) if($pd['hp']<= 0)
{ {
//复活判定 # NPC二阶段处理:
if($pd['club'] == 99) if($pd['club'] == 99 && $pd['type'])
{ {
//NPC进化 $log .= npc_chat ($pd['type'],$pd['name'], 'death' );
if ($pd['type'])
{
$log .= npc_chat ($pd['type'],$pd['nm'], 'death' );
include_once GAME_ROOT . './include/system.func.php'; include_once GAME_ROOT . './include/system.func.php';
$npcdata = evonpc ($pd['type'],$pd['nm']); $npcdata = evonpc ($pd['type'],$pd['name']);
$log .= '<span class="yellow">'.$pd['nm'].'却没死去,反而爆发出真正的实力!</span><br>'; $log .= '<span class="yellow">'.$pd['name'].'却没死去,反而爆发出真正的实力!</span><br>';
if($npcdata){ if($npcdata)
{
addnews($now , 'evonpc',$pd['name'], $npcdata['name'], $pa['name']); addnews($now , 'evonpc',$pd['name'], $npcdata['name'], $pa['name']);
foreach($npcdata as $key => $val) foreach($npcdata as $key => $val)
{ {
$pd[$key] = $val; $pd[$key] = $val;
} }
return 0;
} }
} }
//决死结界复活 # 击杀、复活判定检查
else else
{ {
$killmsg = rev_kill($pa,$pd,$pa['wep_kind'],$pa['wep']); $log .= "<span class=\"red\">{$pd['nm']}{$pa['nm']}杀死了!</span><br>";
$log .= '<span class="yellow">由于及时按了BOMB键,'.$pd['nm'].'原地满血复活了!</span><br>'; //执行不需要考虑复活问题的击杀事件:
$lastword = pre_kill_events($pa,$pd,$active,$pa['wep_kind']);
//执行复活判定:
$revival_flag = revive_process($pa,$pd,$active);
//没有复活的情况下,执行完后续击杀事件:
if(!$revival_flag)
{
global $alivenum,$deathnum;
$pd['hp'] = 0;
//初始化遗言
if (!$pd['type'])
{
//死者是玩家,增加击杀数并保存系统状况。
$pa['killnum'] ++;
$alivenum --;
} }
return 1; else
{
//死者是NPC,加载NPC遗言
$lastword = npc_chat ($pd['type'],$pd['name'], 'death' );
} }
elseif($pd['hp'] <= 0) $deathnum ++;
if(!empty($lastword)) $log.= "<span class='yellow'>“".$lastword."”</span><br>";
//初始化killmsg
if(!$pa['type'])
{ {
$pd['hp'] = 0; global $db,$tablepre;
if (!$pd['type']) $pa['killnum'] ++; $pname = $pa['name'];
$killmsg = rev_kill($pa,$pd,$active,$pa['wep_kind']); $result = $db->query("SELECT killmsg FROM {$tablepre}users WHERE username = '$pname'");
$log .= npc_chat ($pd['type'],$pd['name'], 'death' ); $killmsg = $db->result($result,0);
}
$log .= "<span class=\"red\">{$pd['nm']}{$pa['nm']}杀死了!</span><br>"; else
{
$killmsg = npc_chat ($pa['type'],$pa['name'],'kill');
}
if($killmsg) $log .= "<span class=\"yellow\">{$pa['nm']}{$pd['nm']}说:“{$killmsg}”</span><br>"; if($killmsg) $log .= "<span class=\"yellow\">{$pa['nm']}{$pd['nm']}说:“{$killmsg}”</span><br>";
//杀人rp结算 //杀人rp结算
if(!$pd['type']) get_killer_rp($pa,$pd,$active);
{ //保存游戏进行状态
if($pd['rp'] < 80){ include_once GAME_ROOT.'./include/system.func.php';
$rpup = 80; save_gameinfo();
}else{$rpup = $pd['rp'];}
} }
else{$rpup = 20;} else
//晶莹剔透修正
if($pa['club'] == 19)
{ {
$rpdec = 30; //如果希望复活后能继续战斗,在这里加入判定条件
$rpdec += get_clubskill_rp_dec($pa['club'],$pa['skills']); //例:if($revival_flag == 99) return 1;
$pa['rp'] += round($rpup*(100-$rpdec)/100);
} }
else{ return 0;
$pa['rp'] += $rpup;
}
return 1;
} }
} }
return 0; return 1;
} }
function rev_kill(&$pa,&$pd,$active,$death)
{
global $log, $now, $db, $tablepre, $alivenum, $deathnum, $typeinfo, $lwinfo;
$log.="rev_kill阶段:pa是{$pa['name']},pd是{$pd['name']},active是{$active}<br>";
//登记玩家狠话 //执行不需要考虑复活问题的击杀事件:
$killmsg = ''; function pre_kill_events(&$pa,&$pd,$active,$death)
if(!$pa['type'])
{ {
$pname = $pa['name']; global $log, $now, $db, $tablepre, $typeinfo, $lwinfo;
$result = $db->query("SELECT killmsg FROM {$tablepre}users WHERE username = '$pname'");
$killmsg = $db->result($result,0);
}
//登记死法 //登记死法
if ($death == 'N') { if ($death == 'N') {
...@@ -578,50 +581,69 @@ ...@@ -578,50 +581,69 @@
} else { } else {
$pd['state'] = 10; $pd['state'] = 10;
} }
//初始化死者信息
//死者是玩家 更新幸存者数
if (!$pd['type']) $alivenum --;
$deathnum ++;
//发遗言
$dtype = $pd['type']; $dname = $pd['name']; $dpls = $pd['pls']; $dtype = $pd['type']; $dname = $pd['name']; $dpls = $pd['pls'];
if($dtype == 15)
{ //静流AI
global $gamevars;
$gamevars['sanmadead'] = 1;
save_gameinfo();
}
//死者是?
$lwname = $typeinfo [$dtype] . ' ' . $dname; $lwname = $typeinfo [$dtype] . ' ' . $dname;
//遗言是?
//初始化NPC遗言
if($dtype) if($dtype)
{ {
$lastword = is_array($lwinfo[$dtype]) ? $lwinfo[$dtype][$dname] : $lwinfo[$dtype]; $lastword = is_array($lwinfo[$dtype]) ? $lwinfo[$dtype][$dname] : $lwinfo[$dtype];
} }
//初始化玩家遗言
else else
{ {
$result = $db->query ( "SELECT lastword FROM {$tablepre}users WHERE username ='$dname'"); $result = $db->query ( "SELECT lastword FROM {$tablepre}users WHERE username ='$dname'");
$lastword = $db->result ( $result, 0 ); $lastword = $db->result ( $result, 0 );
} }
//向聊天框发送遗言
$db->query ( "INSERT INTO {$tablepre}chat (type,`time`,send,recv,msg) VALUES ('3','$now','$lwname','$dpls','$lastword')" ); $db->query ( "INSERT INTO {$tablepre}chat (type,`time`,send,recv,msg) VALUES ('3','$now','$lwname','$dpls','$lastword')" );
//发news //发news
$kname = $pa['type'] ? $pa['name'] : $pa['nick'].' '.$pa['name']; $kname = $pa['type'] ? $pa['name'] : $pa['nick'].' '.$pa['name'];
addnews ($now,'death'.$pd['state'],$pd['name'],$pd['type'],$pa['name'],$pa['wep_name'],$lastword ); addnews ($now,'death'.$pd['state'],$pd['name'],$pd['type'],$pa['name'],$pa['wep_name'],$lastword );
//玩家决死结界复活判定 return $lastword;
$revivaled = false; }
if (!$pd['type'] && $pd['club']==99 && ($death=="N" || $death=="P" || $death=="K" || $death=="G" || $death=="C" ||$death=="D" || $death=="F" || $death=="J" || $death=="trap"))
//执行复活事件:
function revive_process(&$pa,&$pd,$active)
{ {
addnews($now,'revival',$pd['name']); global $log,$weather;
$pd['hp'] = $pd['mhp'];
$pd['sp'] = $pd['msp']; $revival_flag = 0;
$pd['club'] = 17;
#极光天气下,玩家有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',$pd['name']);
$pd['hp'] += min($pd['mhp'],max($aurora_dice,1));
$pd['sp'] += min($pd['msp'],max($aurora_dice,1));
$pd['state'] = 0; $pd['state'] = 0;
$alivenum++; $log.= "<span class=\"lime\">但是,空气中弥漫着的奥罗拉让{$pd['nm']}重新站了起来!</span><br>";;
return $revival_flag;
} }
save_gameinfo(); }
return $killmsg;
#决死结界复活:
if (!$revival_flag && $pd['club']==99 && !$pd['type'])
{
#决死结界复活效果:
$revival_flag = 99; //保存复活标记为通过奥罗拉复活
addnews($now,'revival',$pd['name']); //玩家春哥附体称号的处理
$pd['hp'] = $pd['mhp']; $pd['sp'] = $pd['msp'];
$pd['state'] = 0; $pd['club'] = 17;
$log .= '<span class="yellow">但是,由于及时按下BOMB键,'.$pd['nm'].'原地满血复活了!</span><br>';
return $revival_flag;
}
return $revival_flag;
} }
?> ?>
\ No newline at end of file
...@@ -609,7 +609,7 @@ function discover($schmode = 0) { ...@@ -609,7 +609,7 @@ function discover($schmode = 0) {
if($active_dice < $active_r) if($active_dice < $active_r)
{ {
$action = 'enemy'.$edata['pid']; $action = 'enemy'.$edata['pid'];
//include_once GAME_ROOT.'./include/game/battle.func.php'; include_once GAME_ROOT.'./include/game/battle.func.php';
//findenemy($edata); //findenemy($edata);
include_once GAME_ROOT.'./include/game/revbattle.func.php'; include_once GAME_ROOT.'./include/game/revbattle.func.php';
findenemy_rev($edata); findenemy_rev($edata);
...@@ -625,7 +625,7 @@ function discover($schmode = 0) { ...@@ -625,7 +625,7 @@ function discover($schmode = 0) {
echo "passive_w_type={$edata['type']}\n"; echo "passive_w_type={$edata['type']}\n";
echo "passive_w_sNo={$edata['sNo']}\n"; echo "passive_w_sNo={$edata['sNo']}\n";
} }
//include_once GAME_ROOT.'./include/game/combat.func.php'; include_once GAME_ROOT.'./include/game/combat.func.php';
//combat(0); //combat(0);
include_once GAME_ROOT.'./include/game/revcombat.func.php'; include_once GAME_ROOT.'./include/game/revcombat.func.php';
rev_combat_prepare($edata,NULL,0); rev_combat_prepare($edata,NULL,0);
......
...@@ -110,7 +110,7 @@ function nparse_news($start = 0, $range = 0 ){//$type = '') { ...@@ -110,7 +110,7 @@ function nparse_news($start = 0, $range = 0 ){//$type = '') {
} elseif($news == 'death18') { } elseif($news == 'death18') {
$newsinfo .= "<li>{$hour}{$min}{$sec}秒,<span class=\"yellow\">$a</span>因<span class=\"red\">烧伤发作</span>死亡"; $newsinfo .= "<li>{$hour}{$min}{$sec}秒,<span class=\"yellow\">$a</span>因<span class=\"red\">烧伤发作</span>死亡";
} elseif($news == 'death20') { } elseif($news == 'death20') {
$newsinfo .= "<li>{$hour}{$min}{$sec}秒,<span class=\"yellow\">$a</span>被<span class=\"yellow\">$c</span><span class=\"red\">$nowep</span>击飞"; $newsinfo .= "<li>{$hour}{$min}{$sec}秒,<span class=\"yellow\">$a</span>被<span class=\"yellow\">$c</span><span class=\"red\">$nowep</span>击飞";
} elseif($news == 'death21') { } elseif($news == 'death21') {
$newsinfo .= "<li>{$hour}{$min}{$sec}秒,<span class=\"yellow\">$a</span>被<span class=\"yellow\">$c</span>使用{$d}殴打致死"; $newsinfo .= "<li>{$hour}{$min}{$sec}秒,<span class=\"yellow\">$a</span>被<span class=\"yellow\">$c</span>使用{$d}殴打致死";
} elseif($news == 'death22') { } elseif($news == 'death22') {
......
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