Commit add89b9c authored by hisuinohoshi's avatar hisuinohoshi

rev combat phase 4.x

开发相关:
- 为战斗流程添加了说明文档(大概吧);
- 没有使用命名空间;
parent 214f51b8
......@@ -403,8 +403,8 @@ if($hp > 0){
$log.="<span class='red'>你身上没有背包,或是没有将背包装备上!<br>";
}
} elseif(strpos($command,'changewep') !==false) {
include_once GAME_ROOT.'./include/game/revbattle.func.php';
change_wep_in_battle();
include_once GAME_ROOT.'./include/game/itemmain.func.php';
change_subwep();
$mode = 'command';
}
} elseif($mode == 'special') {
......@@ -467,7 +467,7 @@ if($hp > 0){
chase_flag:
include_once GAME_ROOT.'./include/game/revbattle.func.php';
if(!isset($message)) $message = '';
revbattle_prepare($command,$message);
\revbattle\revbattle_prepare($command,$message);
} elseif($mode == 'rest') {
include_once GAME_ROOT.'./include/state.func.php';
rest($command);
......
......@@ -101,7 +101,7 @@ $trap_min_obbs = 1;
//强制踩陷阱最大几率(百分比)
$trap_max_obbs = 40;
//道具发现基础几率(百分比);
$item_obbs = 60;
$item_obbs = 70;
//敌人发现基础几率(百分比)
$enemy_obbs = 70;
//尸体发现几率(百分比)
......
This diff is collapsed.
......@@ -277,7 +277,7 @@
$ep_dice = rand(0,$total_addev);
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);
$log.="……但是这一切真的值得吗?<br>";
}
......@@ -361,7 +361,7 @@
$ep_dice = rand(0,$total_addev);
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);
}
$log.="<br>";
......
......@@ -699,7 +699,7 @@ function event_rp_up($rpup)
}
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);
/*if($club != 19 || $rpup <= 0){
......
......@@ -291,7 +291,7 @@ function itemuse($itmn,&$data=NULL) {
logsave ( $itmsk, $now, $w_log ,'b');
}
$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');
if($itmsk == $pdata['pid']) $last = 0;
final_kill_events($edata,$pdata,0,$last);
......@@ -331,10 +331,7 @@ function itemuse($itmn,&$data=NULL) {
else{$exp++;$wd++;}
if ($exp >= $upexp) {
//include_once GAME_ROOT . './include/state.func.php';
//lvlup ( $exp, $upexp );
//lvlup ($lvl, $exp, 1);
include_once GAME_ROOT . './include/game/revcombat.func.php';
include_once GAME_ROOT . './include/state.func.php';
lvlup_rev($pdata,$pdata,1);
}
if ($itms != $nosta) {
......@@ -792,10 +789,7 @@ function itemuse($itmn,&$data=NULL) {
if (strpos ( $itmk, 'ME' ) === 0) {
if ($exp >= $upexp) {
//global $lvl;
//include_once GAME_ROOT . './include/state.func.php';
//lvlup ( $lvl, $exp, 1 );
include_once GAME_ROOT . './include/game/revcombat.func.php';
include_once GAME_ROOT . './include/state.func.php';
lvlup_rev($pdata,$pdata,1);
}
}
......@@ -1967,7 +1961,7 @@ function itemuse($itmn,&$data=NULL) {
include_once GAME_ROOT.'./include/game/revcombat.func.php';
$pa = fetch_playerdata_by_pid(1);
$pd = fetch_playerdata_by_pid(2);
rev_combat_prepare($pa,$pd,1);
\revcombat\rev_combat_prepare($pa,$pd,1);
} elseif ($itm == '事件BGM替换器'){
// 这是一个触发事件BGM的案例,只要输入$clbpara['event_bgmbook'] = Array('事件曲集名'); 即可将当前曲集替换为特殊事件BGM
// 特殊事件曲集'event_bgmbook'的优先级高于地图曲集'pls_bgmbook',前者存在时后者不会生效
......
......@@ -429,7 +429,7 @@ function deathnote($sfn,$itmd=0,$dnname='',$dndeath='',$dngender='m',$dnicon=1)
//kill('dn',$dnname,0,$edata['pid'],$dndeath);
//$killnum++;
$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');
// 如果希望被DN后能够复活,可以在这里调用一次复活判定函数
final_kill_events($pdata,$edata,1);
......
......@@ -55,7 +55,7 @@ function calc_trap_escape_rate(&$pa,$playerflag=0,$selflag=0)
if($selflag) $escrate *= 1.5;
# 陷阱探测属性加成(锡安陷阱探测属性效果+10)
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']))
{
$pa['minedetect'] = 1;
......@@ -83,7 +83,7 @@ function check_trap_def_event(&$pa,$damage,$playerflag=0,$selflag=0)
if($pa['itmk0'] == 'TOc') return $damage;
# 检查是否有迎击属性
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)
if(!empty($pa['ex_keys']) && in_array('m',$pa['ex_keys']))
{
......@@ -220,7 +220,7 @@ function trap(&$data=NULL){
# 踩雷rp结算
$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($goodmancard)
......@@ -1304,7 +1304,7 @@ function getcorpse($item,&$data=NULL)
$log.="你销毁了{$edata['name']}的尸体。<br>但这一切值得吗……?<br>";
# 销毁尸体rp结算
$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);
addnews($now,'cdestroy',$name,$edata['name']);
......@@ -1406,6 +1406,58 @@ function getcorpse($item,&$data=NULL)
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数据时,重载套装效果
function reload_set_items(&$pa)
{
......
......@@ -46,7 +46,7 @@ function itemmix_rev($mlist, $itemselect=-1, &$data=NULL)
if($club == 19)
{
$rpup = -30;
include_once GAME_ROOT.'./include/game/revcombat.func.php';
include_once GAME_ROOT.'./include/state.func.php';
rpup_rev($data,$rpup);
}
}
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
<?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
namespace revbattle
{
if(!defined('IN_GAME')) {
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)
{
global $log,$mode,$plsinfo,$db,$tablepre,$action_list;
......@@ -55,17 +63,13 @@
# 输入切换武器指令时,切换武器
if ($command == 'changewep')
{
change_wep_in_battle();
include_once GAME_ROOT . './include/game/itemmain.func.php';
change_subwep();
findenemy_rev($edata);
return;
}
# 准备进入标准战斗流程
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')
{
......@@ -78,20 +82,20 @@
//$log .= "你逃跑了。";
$flag = escape_from_enemy($data,$edata);
if($flag) $mode = 'command';
else rev_combat_prepare($data,$edata,0);
else \revcombat\rev_combat_prepare($data,$edata,0);
return;
}
# 重新遭遇视野中的敌人
if ($command == 'focus')
{
// 迎战视野中的敌人先制率-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);
if($active_dice < $active_r){
$action = 'enemy'; $bid = $edata['pid'];
findenemy_rev($edata);
}else {
rev_combat_prepare($edata,$data,0);
\revcombat\rev_combat_prepare($edata,$data,0);
}
return;
}
......@@ -126,7 +130,7 @@
# 添加协战标记
$cdata['is_coveratk'] = 1;
# 去打人吧!
rev_combat_prepare($cdata,$edata,1);
\revcombat\rev_combat_prepare($cdata,$edata,1);
return;
}
# 指派佣兵攻击敌人
......@@ -154,36 +158,38 @@
# 是否要检查先后手?
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);
if($active_dice < $active_r)
{
rev_combat_prepare($mdata,$edata,1);
\revcombat\rev_combat_prepare($mdata,$edata,1);
}
else
{
$log .= "<span class='yellow'>但是敌人早已做好了准备!</span><br>";
rev_combat_prepare($edata,$mdata,0);
\revcombat\rev_combat_prepare($edata,$mdata,0);
}
}
else
{
rev_combat_prepare($mdata,$edata,1);
\revcombat\rev_combat_prepare($mdata,$edata,1);
}
}
# 没有佣兵,你自己上吧!
else
{
rev_combat_prepare($data,$edata,1);
\revcombat\rev_combat_prepare($data,$edata,1);
}
return;
}
if(!empty($message)) $data['message'] = $message;
# 上述流程没有拦截,直接进入标准战斗流程……可能会有问题?
rev_combat_prepare($data,$edata,1,$command);
\revcombat\rev_combat_prepare($data,$edata,1,$command);
return;
}
//发现敌人
# 主动发现敌人时,初始化战斗界面(包含初始化左侧页面与初始化右侧战斗按钮)
function findenemy_rev($edata)
{
global $db,$tablepre,$log,$mode,$main,$cmd,$battle_title,$attinfo,$skillinfo,$nosta,$cskills;
......@@ -275,7 +281,32 @@
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)
{
global $db,$tablepre,$pdata;
......@@ -323,7 +354,7 @@
return;
}
// 初始化战斗界面标题
# 初始化战斗界面标题
function init_battle_title($pa,$pd,$ismeet=0)
{
if(strpos($pa['action'],'chase')!==false)
......@@ -342,7 +373,7 @@
return $title;
}
// 初始化战斗界面log
# 初始化战斗界面log
function init_battle_log($pa,$pd,$ismeet=0)
{
global $fog;
......@@ -375,77 +406,5 @@
}
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 @@
$gamevars['wth18pid'] = $pid;
save_gameinfo();
addnews($now, 'wthchange', $name, $weather, '自己积攒的善德');
include_once GAME_ROOT.'./include/game/revcombat.func.php';
$sn = 'song';
addnoise($sn,'__',$now,$pls,0,0,$sn);
$clbpara['event_bgmbook'] = Array('wth18');
......@@ -633,7 +632,7 @@
# 出生啊!
$max_rp_dice = $pdata['itme0']+$pdata['itms0'] > 300 ? $pdata['itme0']+$pdata['itms0'] : 300;
$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);
# 做成棍了就没有尸体了
destory_corpse($edata);
......
<?php
namespace revcombat
{
if(!defined('IN_GAME')) {
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)%
......@@ -21,7 +113,7 @@
# 添加鏖战状态
$pa['is_dfight'] = $pd['is_dfight'] = 1;
# 获取鏖战状态下pa对pd的先制率
$active_r = get_active_r_rev($pa,$pd,1);
$active_r = calc_active_rate($pa,$pd,1);
# 如果pa身上存在逃跑失败的标记,则pa先制率降低50……这是偷懒行为,未来的你记得改掉
if(isset($pa['fail_escape'])) $active_r -= 50;
# 判断是否先制
......@@ -33,7 +125,7 @@
# 添加追击状态
$pa['is_chase'] = 1; $pd['is_pchase'] = 1;
# 获取追击状态下pa对pd的先制率
$active_r = get_active_r_rev($pa,$pd,2);
$active_r = calc_active_rate($pa,$pd,2);
# 如果pd身上存在逃跑失败的标记,则pa先制率提升50
if(isset($pd['fail_escape'])) $active_r += 50;
# 判断是否先制
......@@ -102,4 +194,6 @@
}
return;
}
}
?>
\ No newline at end of file
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
......@@ -4,6 +4,12 @@ if(!defined('IN_GAME')) {
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)
{
global $log,$plsinfo,$hplsinfo,$arealist,$areanum,$hack;
......@@ -133,7 +139,6 @@ function move($moveto = 99,&$data=NULL) {
$hp -= $damage;
$log .= "被<span class=\"blue\">冰雹</span>击中,生命减少了<span class=\"red\">$damage</span>点!<br>";
if($hp <= 0 ) {
include_once GAME_ROOT.'./include/state.func.php';
death('hsmove','',0,'',$data);
return;
// } else {
......@@ -211,8 +216,7 @@ function move($moveto = 99,&$data=NULL) {
# 移动到指定地点,结算移动探索事件
move_search_events($data,'move');
include_once GAME_ROOT.'./include/game/revattr.func.php';
$enemyrate = calc_meetman_rate($data);
$enemyrate = \revbattle\calc_meetman_rate($data);
//echo "enemyrate = {$enemyrate}%";
discover($enemyrate,$data);
return;
......@@ -287,7 +291,6 @@ function search(&$data=NULL){
$hp -= $damage;
$log .= "被<span class=\"blue\">冰雹</span>击中,生命减少了<span class=\"red\">$damage</span>点!<br>";
if($hp <= 0 ) {
include_once GAME_ROOT.'./include/state.func.php';
death('hsmove','',0,'',$data);
return;
// } else {
......@@ -360,14 +363,14 @@ function search(&$data=NULL){
# 探索指定地点,结算探索事件
move_search_events($data,'search');
include_once GAME_ROOT.'./include/game/revattr.func.php';
$enemyrate = calc_meetman_rate($data);
$enemyrate = \revbattle\calc_meetman_rate($data);
//echo "enemyrate = {$enemyrate}%";
discover($enemyrate,$data);
return;
}
# 探索或移动行为会触发的事件
function move_search_events(&$data,$act)
{
global $log,$inf_move_hp,$inf_move_sp,$infwords,$weather,$gamevars,$now,$elements_info;
......@@ -402,7 +405,6 @@ function move_search_events(&$data,$act)
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>";
if($hp <= 0 ){
include_once GAME_ROOT.'./include/state.func.php';
death($inf_ky.'move','',0,'',$data);
return;
}
......@@ -587,7 +589,6 @@ function discover($schmode = 0,&$data=NULL)
//看地图上有没有陷阱
if($trpnum)
{
include_once GAME_ROOT.'./include/game/itemmain.func.php';
$fstrp = $db->fetch_array($trapresult);
//奇迹雷
$xtrpflag = $fstrp['itmk'] == 'TOc' ? true : false;
......@@ -615,7 +616,6 @@ function discover($schmode = 0,&$data=NULL)
}
}
}
include_once GAME_ROOT.'./include/game/attr.func.php';
$mode_dice = rand(0,99);
if($mode_dice < $schmode)
{
......@@ -636,12 +636,12 @@ function discover($schmode = 0,&$data=NULL)
//移除了重复调用discover()的设定,尝试用一种正常一点的办法确保敌人/尸体发现率符合基础设定值,不然现在的尸体确实太难摸了。
//现在触发遇敌事件只会返回三种结果:1、发现尸体;2、发现敌人、3、敌人隐藏起来;所以实际的尸体发现率=$enemyrate*$corpse_obbs
$meetman_flag = 0;
include_once GAME_ROOT.'./include/game/revattr.func.php';
foreach($enemyarray as $enum)
{
$db->data_seek($result, $enum);
$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['hp'] <= 0)
......@@ -677,11 +677,11 @@ function discover($schmode = 0,&$data=NULL)
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(!check_skill_unlock('c19_dispel',$data) && !empty(get_skillpara('c19_dispel','active',$clbpara)) && $edata['hp'] <= 1) continue;
# 「量心」技能效果判定(不会遭遇HP为1的敌人)
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);
# 把find_r杀了,现在技能都是用躲避率去判断的了,躲避率为负就等于发现率增幅了
$meetman_flag = $enemy_dice < ($enemy_obbs - $hide_r) ? 1 : -1;
......@@ -699,7 +699,6 @@ function discover($schmode = 0,&$data=NULL)
{
$bid = $edata['pid'];
$action = 'team';
include_once GAME_ROOT.'./include/game/battle.func.php';
findteam($edata);
return;
}
......@@ -708,7 +707,6 @@ function discover($schmode = 0,&$data=NULL)
{
$bid = $edata['pid'];
$action = 'neut';
include_once GAME_ROOT.'./include/game/revbattle.func.php';
findneut($edata,1);
return;
}
......@@ -716,12 +714,8 @@ function discover($schmode = 0,&$data=NULL)
else
{
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'];
$active_dice = diceroll(99);
//先制
......@@ -731,12 +725,12 @@ function discover($schmode = 0,&$data=NULL)
if($data['pass'] != 'bot')
{
findenemy_rev($edata);
\revbattle\findenemy_rev($edata);
}
else
{
echo "进入战斗!<br>";
rev_combat_prepare($data,$edata,1,'',0);
\revcombat\rev_combat_prepare($data,$edata,1,'',0);
}
return;
}
......@@ -746,11 +740,11 @@ function discover($schmode = 0,&$data=NULL)
if($data['pass'] != 'bot')
{
rev_combat_prepare($edata,$data,0);
\revcombat\rev_combat_prepare($edata,$data,0);
}
else
{
rev_combat_prepare($edata,$data,0,'',0);
\revcombat\rev_combat_prepare($edata,$data,0,'',0);
}
return;
}
......@@ -775,10 +769,12 @@ function discover($schmode = 0,&$data=NULL)
}
$mode = 'command';
return;
} else {
}
else
{
//echo "进入道具判定<br>";
$find_r = get_find_r($weather,$pls,$pose,$tactic,$club,$inf);
$find_obbs = $item_obbs + $find_r;
//$find_r = get_find_r($weather,$pls,$pose,$tactic,$club,$inf);
$find_obbs = $item_obbs;
$item_dice = rand(0,99);
if($item_dice < $find_obbs)
{
......@@ -838,7 +834,6 @@ function focus_item(&$data=NULL,$id=NULL)
$db->query("DELETE FROM {$tablepre}mapitem WHERE iid='$iid'");
if($itms0)
{
include_once GAME_ROOT.'./include/game/itemmain.func.php';
if($data['pass'] == 'bot')
{
itemget($data);
......
This diff is collapsed.
......@@ -131,9 +131,9 @@ if($mode == 'enter') {
$itm[3] = '★Monster Energy★';
}
$itmk[3] = 'HB'; $itme[3] = 70; $itms[3] = 15;
//$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];
$itm[5] = '「'.$dice_name.' 社团卡」'; $itmk[5] = 'ZB'; $itme[5] = $dice; $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];
$itm[5] = '「'.$dice_name.' 社团卡」'; $itmk[5] = 'ZB'; $itme[5] = $dice; $itms[5] = 1;*/
if ($wingames <=1){
$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