完整遇敌/战斗流程：

遇敌前：
- move()或search()时，调用 \revbattle\calc_meetman_rate($data) 计算遇敌概率，将获取到的遇敌率传入discover()；
- 触发遇敌时，调用 \revbattle\calc_hide_rate($data,$edata) 计算敌人躲避概率；
- 敌人未躲避成功时，调用 \revbattle\calc_active_rate($data,$edata) 计算先攻概率；
- 先攻敌人：调用 \revbattle\findenemy_rev($edata) 转入先攻（可操作战斗界面）；
- 被敌人先攻：调用 \revcombat\rev_combat_prepare($edata,$data,0) 转入战斗准备流程；

先攻（可操作战斗界面） findenemy_rev() ：
- 调用 init_battle_title($pdata,$edata,$ismeet) 初始化战斗标题（左侧界面中间红字）；
- 调用 init_battle_log($pdata,$edata,$ismeet) 初始化发现敌人时显示的log；
- 调用 init_battle_rev($pdata,$edata,$ismeet) 将敌我双方数据格式化处理后传给界面显示；
- 遍历主视角技能组，初始化战斗技能；
	- 调用 get_skilltags($sk,'battle') 检查技能是否带有主动技标签；
	- 调用 check_skill_unlock($sk,$pdata) 检查技能是否满足解锁条件；
	- 调用 check_skill_cost($sk,$pdata) 检查技能是否满足消耗条件；
	
处理从界面传回的战斗指令（攻击、技能、逃跑） revbattle_prepare()：
- 执行动作前，主视角的 action 值为 'chase','pchase','dfight','cover' 中任一时，command 继承 action 值；
- 从这一流程开始，可以将任意参数直接保存在$data(主视角数据)或$edata(敌人视角数据)数组内，这些参数在战斗结束前不会丢失；
- 根据主视角的 action 与 bid 判断接下来的行动：
	- 'enemy', //遇敌时获得 代表遭遇了敌人 bid为敌人id
	- 'corpse', //遭遇尸体或击杀敌人获得 bid为尸体id；重载界面时，如果有此标记会显示发现尸体
	- 'pacorpse', //通过反击击杀敌人获得 bid为尸体idd；重载界面时，如果有此标记会显示发现尸体
	- 'focus', //通过视野功能再次遇敌时获得 bid为视野中的对象id
	- 'team', //发现队友时获得 bid为队友id
	- 'neut', //发现中立单位时获得 bid为中立单位id
	- 'chase', //追击NPC敌人时获得 bid为被追击单位id
	- 'pchase', //被NPC敌人追击时获得 bid为追击单位id
	- 'dfight', //与NPC敌人缠斗时获得 bid为缠斗对象id
	- 'cover', //通过协战夹击敌人时获得 bid为敌人id，协战者id保存在自己身上
	- 'pcover', //被敌人的协战者夹击时获得 bid为敌人协战者的id
	- 'back', //逃跑
	- 'changewep', //切换副武器
- 检查是否遇敌、敌人是否死亡、敌人是否处于当前地图；
- 调用 fetch_playerdata_by_pid($enemyid) 拉取敌人数据；
- command 为 'changewep' 时，调用 change_subwep() 切换副武器；
- command 为 'back' 时，调用 escape_from_enemy($data,$edata) 判断是否成功逃跑；
- command 为 'cover' 时，检查是否存在协战对象；
	- 协战对象的 pid 保存在主视角 clbpara['coveratk'] 内；
	- 调用 fetch_playerdata_by_pid($cid) 拉取协战对象数据；
	- 协战对象存在时，为协战对象添加标记 $cdata['is_coveratk'] = 1 ，以表示这是一次协战攻击；
- 根据 action 或 command 判断是否需要调用 calc_active_rate($data,$edata) 重新计算先攻概率；
- 根据先攻情况调用 \revcombat\rev_combat_prepare($data,$edata,1) 或 \revcombat\rev_combat_prepare($edata,$data,0) 转入战斗准备流程；

战斗准备流程 rev_combat_prepare()：
- 根据传入的 $wep_kind 判断主视角（玩家）是否主动发动了战斗技，将战斗技id保存在 $pa['bskill'] 内；
- 根据传入的 $active 判断主视角与敌对视角称谓，保存在 $pa['nm'] 与 $pd['nm'] 内；
- 调用 get_attr_wepbase($pa,$pd,$active,$wep_kind) 初始化双方攻击相关参数，按下列次序依次判定：
	- 防守方防守方式 \revattr\get_wep_kind($pd) 保存在 $pd['wep_kind'] 内; 
		- 没有子弹的枪械 保存为 $pd['is_wpg']
	- 防守方被动技能参数 \revattr\get_attr_passive_skills($pd,$pa,$active);
		- 所有标签为 'passive','buff','inf' 且满足了解锁条件的被动技能都会自动激活 保存为 $pd['skill_技能ID'] 或 $pa['skill_技能ID']（下略）；
		- 标签为 'switch' 的被动技能仅在技能开启时激活 保存为 $pd['askill_技能ID'] ；
		- 如果技能触发时存在log，保存在 $pd['skilllog'] 内，进入打击流程后，在 $pa['bskilllog'] 与 $pa['bskilllog2'] 显示后显示；
	- 防守方武器射程 $pd['wep_range'] = \revattr\get_wep_range($pd);
	- 防守方攻击熟练度 $pd['wep_skill'] = \revattr\get_wep_skill($pd);
	- 防守方武器名 $pd['wep_name'] = $pd['wep'];
	- 进攻方攻击方式 \revattr\get_wep_kind($pa,$wep_kind,$pd['wep_range']); 
	- 进攻方主动技能参数 \revattr\get_attr_bskills($pa,$pd,$active);
		- NPC敌人会随机释放满足了条件的战斗技；
		- 主动技默认log保存在 $pa['bskilllog'] 内，在进入打击流程后显示；
		- 主动技额外log可以保存在 $pa['bskilllog2'] 内，会在 $pa['bskilllog'] 显示后显示；
	- 进攻方被动技能参数 \revattr\get_attr_passive_skills($pa,$pd,$active);
	- 进攻方武器射程 $pa['wep_range'] = \revattr\get_wep_range($pa);
	- 进攻方攻击熟练度 $pa['wep_skill'] = \revattr\get_wep_skill($pa);
	- 进攻方武器名 $pa['wep_name'] = $pa['wep'];
- 进入战斗流程；

战斗流程 rev_combat()：
- 打击开始前，调用 combat_prepare_events($pa,$pd,$active) 执行整场战斗只会触发一次的事件；
	- 返回值小于0时 跳转至 battle_finish_flag 跳过打击阶段；
- 调用 combat_prepare_logs 显示遇敌时会触发的文本；
- pa打击事件；
	- 调用 rev_attack($pa,$pd,$active) 转入 pa打击流程 将打击伤害保存在 $att_dmg 内；
	- 调用 rev_combat_result($pa,$pd,$active) 转入 pa打击结束流程 将结果保存在 $att_result 内；
		- 暴毙标识 $pa['ggflag'] 存在时，清空$pa生命，并调用 rev_combat_result($pd,$pa,$active)；
		- 打击伤害 $att_dmg 不为空时，扣除$pd对应生命，并调用 rev_combat_result($pa,$pd,$active)；
		- pa打击结果 $att_result 不为空时，调用 attack_check_can_loop($pa,$pd,$active) 检查是否要循环执行打击流程；
- pd反击事件：
	- pd生命不为空，且 $att_result 不为空时，调用 attack_check_can_counter($pa,$pd,$active) 检查是否转入反击流程；
		- 不能反击的原因保存在 $pd['cannot_counter'] 内；不能反击的log保存在 $pd['cannot_counter_log'] 内；
		- 判断是否因固定原因无法反击；
		- 调用 calc_counter_range($pa,$pd,$active) 判断是否因射程不足无法反击；
		- 调用 calc_counter_rate($pa,$pd,$active) 判断是否达到反击率；
	- 反击流程：重复pa打击事件流程；
		- 反击时，添加标记 $pd['is_counter'] = 1 ，以表示这是一次反击攻击；
- 更新全局战斗情报阶段，调用 save_combatinfo() 保存当前最高伤害者等信息;
- logsave阶段；
	- 在打击流程中触发的需logsave的文本，可以保存在 $pa['logsave'] 或 $pd['logsave'] 内，在此时一并输出，顺序为：
		- 手持 *** 的 *** 向你袭击；
		- $pa['logsave']；
		- 你升级了；
		- 你受到其 *** 点攻击，对其作出 *** 点反击；
- 战斗收尾阶段(battle_finish_flag)，根据战斗结果更新 action ；
	- pd死于战斗，$pa['action'] = 'corpse'; pa死于战斗，$pd['action'] = 'pacorpse';
	- 协战标记 ['coveratk_flag'] 存在时，['action'] = 'cover'; ['clbpara']['coveratk'] = ['coveratk_flag'];
	- pa或pd均不是当前玩家时，将 action 临时保存在 $saction 内， 将 bid 临时保存在 $sid 内；
- 调用 init_battle_rev($pa,$pd,1) 或 init_battle_rev($pd,$pa,1) 刷新界面；
- 调用 player_save($pa) player_save($pd) 将双方数据保存回数据库；
- pa或pd均不是当前玩家时，说明此次战斗流程没有玩家参与，引入$pdata作为玩家数据；否则调用 fetch_playerdata_by_name() 重新从数据库中读取回玩家数据；
- 存在临时动作 $saction 与 $sid 时 将其保存回玩家 action 与 bid 内；
- 显示战斗结果；
	
打击流程 rev_attack()：
- 调用 \revattr\get_equip_ex_array($pa)与($pd) 获取防具上属性信息，分别保存在 $pa['ex_equip_keys'] 与 $pd['ex_equip_keys'] 内（pa/pd下略）；
- 调用 \revattr\get_get_wep_ex_array() 获取武器上属性信息，保存在 ['ex_wep_keys'] 内；
- 进行三抽判定，分别保存为 (技抽)['skdr_flag'] (魂抽)['sldr_flag'] (精抽)['mdr_flag']；
- 合并武器、防具属性信息，保存在 ['ex_keys'] 内；
- 调用 \revattr\get_extra_ex_array() 获取不受三抽影响的额外属性信息，一并保存在 ['ex_keys'] 内；
- 调用 \revattr\hitrate_prepare_events($pa,$pd,$active) 执行命中前事件；
	- 返回值小于0时，直接中断打击流程；
- 调用 \revattr\get_hitrate_rev($pa,$pd,$active) 获取 pa基础命中率 保存在 $pa['hitrate'] 内；
- 调用 \revattr\get_hit_time_rev($pa,$pd,$active) 获取 pa命中次数、武器损耗次数、致伤次数；
	- 实际命中次数保存在 $pa['hitrate_times'] 内；
	- 理论最大命中次数保存在 $pa['hitrate_max_times'] 内；
	- 武器损耗次数保存在 $pa['wep_imp_times'] 内；
	- 致伤（敌人防具损伤）次数保存在 $pa['inf_times'] 内；
- 输出打击前log、$pa['bskilllog']、$pa['bskilllog2']、$pa['skilllog']；
- 总命中次数大于0时：
	- 调用 \revattr\get_fix_damage($pa,$pd,$active) 检查是否存在不受任何系数变化影响的固定伤害（直死、混沌伤害等）；
		- 固定伤害结果不为NULL时，将固定伤害保存在 $pa['final_damage'] 内，并结束伤害计算；
	- 固定伤害不存在时，正常计算伤害：
	
		- 物理伤害计算阶段：
			- 调用 \revattr\get_base_att($pa,$pd,$active) 获取 pa基础攻击力 保存在 $pa['base_att'] 内；
				- 武器实际效果（空手、没子弹的枪）保存在 $pa['wepe_t'] 内；
			- 调用 \revattr\get_base_def($pa,$pd,$active) 获取 pd基础防御力 保存在 $pd['base_def'] 内；
			- 调用 \revattr\get_original_dmg_rev($pa,$pd,$active) 计算原始伤害 保存在 $pa['original_dmg'] 内；
			- 调用 \revattr\get_original_fix_dmg_rev($pa,$pd,$active) 计算在原始伤害基础上附加的固定伤害（重枪、灵武固伤）；
			- 调用 \revattr\get_damage_p_rev ($pa,$pd,$active) 计算伤害倍率的变化（连击、必杀、灵武系数） 返回的是一个数组 ；
			- 调用 \revattr\deal_damage_prepare_events($pa,$pd,$active) 执行攻击方(pa)在造成伤害前触发的事件 （检查pd身上是否有防御属性，pa是否触发了贯穿、冲击）；
				- 触发冲击时，$pa['charge_flag'] = 1；
				- 触发伤害抹消时，$pd['phy_def_flag'] =  2;
				- 触发全系防御时，$pd['phy_def_flag'] =  1;
				- 触发单系防御时，$pd['phy_def_flag'] = $def_kind[$pa['wep_kind']];
				- 触发贯穿时，$pa['pierce_flag'] = 1; $pd['phy_def_flag'] = 0;
			- 调用 \revattr\get_damage_def_p_rev($pa,$pd,$active) 根据防守方的技能、属性计算伤害倍率的变化，返回结果与之前的伤害倍率数组合并；
			- 以(AxBxC=D)的格式队列输出物理伤害，并将总物理伤害保存在 $pa['phy_damage'] 内；
			
		- 预受伤阶段，调用 \revattr\get_hurt_prepare_events($pa,$pd,$active) 提前计算 pd是否受伤、防具是否破损，但不会真正应用受伤效果；
			- 受伤情况保存在 $pd['inf_hurt'][受伤部位] 内；
			- 防具受损情况保存在 $pd['armor_hurt'][防具部位] 内；
			
		- 属性伤害计算阶段：
			- 调用 \revattr\get_base_ex_att_array($pa,$pd,$active) 获取攻击方能造成的属性伤害队列 保存在 $pa['ex_attack_keys'] 内；
			- 调用 \revattr\deal_ex_damage_prepare_events($pa,$pd,$active) 获取攻击方在造成属性伤害前触发的事件（检查pd身上是否有防御属性，pa是否触发了属穿）
				- 触发属性抹消时，$pd['ex_def_flag'] =  2;
				- 触发属性防御时，$pd['ex_def_flag'] =  1;
				- 触发破格时，$pa['ex_pierce_flag'] = 1; $pd['ex_def_flag'] = 0;
			- 调用 \revattr\get_original_ex_dmg($pa,$pd,$active) 获取原始属性伤害队列；
				- 属性伤害被抹消或护盾抵消时，只返回单个数值；否则遍历能造成属性伤害的队列，并返回一个记录有每个属性造成了多少伤害的数组；
				- 计算单个属性基础伤害，保存在 $ex_dmg 内；
				- 计算得意武器对属性基础伤害的修正；
				- 调用 get_ex_base_dmg_max($pa,$pd,$active,$ex,$ex_dmg) 计算单个属性的基础伤害上限；
				- 计算属性基础伤害浮动；
				- 调用 get_ex_base_dmg_p($pa,$pd,$active,$ex,$ex_dmg) 计算单个属性伤害的系数变化；
					- 已经处于**异常状态时，**属性伤害** 的log 保存在 $pa['ex_dmgpsh_log'] 内；
					- 属性伤害被**防御了 的log 保存在 $pa['ex_dmgdef_log'] 内；
					- 成功施加了**异常 的log 保存在 $pa['ex_dmginf_log'] 内；
				- 将单个属性伤害 $ex_dmg 加入总队列 $total_ex_dmg[] 内；
			- 调用 \revattr\get_ex_dmg_p($pa,$pd,$active) 获取对总属性伤害的倍率修正；
			- 以(AxBxC=D)的格式队列输出属性伤害，将最终造成的属性伤害保存在 $pa['ex_damage'] 内；
			
		- 最终伤害计算阶段：
			- 调用 \revattr\get_final_dmg_p($pa,$pd,$active) 计算最终伤害的系数变化；
			- 调用 \revattr\get_final_dmg_fix($pa,$pd,$active,$damage) 计算最终伤害的定值变化（附加伤害、伤害制御、纯粹伤害、秒杀等）；
			- 如果最终伤害不存在定值变化，则输出一段 AxBxC=D 格式的文本；
			- 如果最终伤害存在定值变化，输出一段 实际伤害(原始伤害) 格式的文本；
			- 将造成的最终伤害保存在 $pa['final_damage'] 内；
			
		- 调用 checkdmg($pa['name'],$pd['name'],$damage) 将伤害发送至进行状况；
		- 调用 \revattr\attack_finish_events($pa,$pd,$active) 应用pa造成伤害后触发的事件（计算反噬伤害）；
		- 调用 \revattr\get_hurt_events($pa,$pd,$active) 应用pd受伤事件（受伤、防具受损）；
		
- 调用 expup_rev($pa,$pd,$active) 结算战斗经验；
	- 升级时，将升级文本保存在 $pa['lvlup_log'] 内，在logsave时一并输出；
- 调用 rgup_rev($pa,$pd,$active) 结算战斗怒气；
- 调用 weapon_loss($pa,$pa['wep_imp_times']) 结算武器损耗；
- 调用 addnoise($pa['wep_kind'],$pa['wepsk'],$now,$pa['pls'],$pa['pid'],$pd['pid'],$pa['wep_kind'] ) 保存声音信息；
- 为pa增加对应熟练度；
- 返回造成的最终伤害；

打击结束流程 rev_combat_result()：
- pd生命值低于0时，结算击杀/复活事件；
	- 结算NPC二阶段变身事件；
	- 存在暴毙标记 ['gg_flag'] 时 将死亡方式 $death_flag 登记为 $pd['gg_flag'];
	- 否则将将死亡方式 $death_flag 登记为 $pa['wep_kind'];
	- 调用 pre_kill_events($pa,$pd,$active,$death_flag) 执行不需要考虑复活问题的预击杀事件；
		- 登记死者遗言；
		- 向进行状况及聊天框发送信息；
	- 调用 revive_process($pa,$pd,$active) 判断是否复活；
	- 调用 final_kill_events($pa,$pd,$active,$lastword) 执行没有复活的情况下的后续击杀事件；
		- 增加击杀数，降低幸存数；
		- 调用 \revattr\get_killer_rp($pa,$pd,$active) 结算rp变化；
		- 调用 check_death_events($pa,$pd,$active) 执行pd死亡后事件（灵魂绑定等）；
		- 计数相关成就；
- pd生命值不低于0，结算对应事件；
	- 调用 attack_result_events($pa,$pd,$active) 执行pd扣血后会触发的事件（眩晕等）；
- 返回1时，代表可以继续战斗；返回0代表中止战斗流程；

====================

namespace revbattle:
- revbattle.calc.php：
	- 计算敌人发现率、躲避率、先制率；
- revbattle.func.php：
	- findenemy_rev() 主动遇敌、发现敌人、发现队友、发现中立单位的界面显示；
	- revbattle_prepare() 遇敌后，处理从界面传回的指令，或根据action判断接下来的行动；
	- escape_from_enemy() 逃跑；
	- 界面显示相关；

namespace revcombat:
- revcombat.func.php：
	- rev_combat_prepare();
	- rev_combat();
	- rev_attack();
	- rev_combat_result();
- revcombat_extra.func.php:
	- get_attr_wepbase() 初始化双方的攻击相关参数（攻击方式、主动技能参数、被动技能参数、武器射程、攻击熟练度、武器名）
	- combat_prepare_events();
	- combat_prepare_logs();
	- attack_result_events();
	- attack_check_can_counter();
- revcombat.calc.php:
	- 计算反击射程、反击率；
	- 计算追击、鏖战概率；

namespace revattr:
- revattr.func.php:
	- 打击流程内调用函数；
- revattr.calc.php:
	- 打击流程内，单独伤害计算流程内调用函数（社团技能修正、独立计算用函数）；
- revattr_extrac.func.php:
	- 特殊NPC战斗机制相关函数；



