Example #1
0
 public function get_we_swallow_lv_max($vocation_limit, $player_detail)
 {
     $wing_lvl = max($player_detail['wing_info'][$vocation_limit]['lvl'], 1);
     # 翅膀品阶
     $max_swallow_lv = 5 + ($wing_lvl - 1);
     $max_swallow_lv_config = Cache_Forge::getInstance()->get_max_we_swallow_lv();
     return min($max_swallow_lv, $max_swallow_lv_config);
 }
Example #2
0
 /**
  * 道具属性结构体
  * @param $data
  * @return array
  */
 public static function get_item_additions(&$data)
 {
     $attr_index = Cache_ItemKey::getInstance()->get_item_key();
     $role_index = Cache_RoleKey::getInstance()->get_item_key();
     //        echo "sub_type:".$data['sub_type']."<br>";
     $out = array();
     $arr_other = array();
     $fpower_calc = array();
     $fpower_base_calc = array();
     if ($data['type'] == 1 || $data['type'] == 6) {
         if (empty($data['player_prop_id'])) {
             //                $attrData = Cache_EquipBaseAttr::getInstance()->get_equip_base_attr($data['sub_type'],$data['quality'],$data['level'],$data['star_level']);
             $obj = new Game_Prop();
             $attrData = $obj->get_equip_attr($data);
             unset($obj);
             //                Com_Log::log($attrData,'cache_prop',1);
             $data['base_attr'] = $attrData['base_attr'];
             $data['addition_attr'] = $attrData['addition_attr'];
             $data['base_attr'] = $attrData['base_attr'];
             $data['level'] = $attrData['level'];
             $data['intensive_level'] = $attrData['intensive_level'];
             $data['intensive_desc'] = $attrData['intensive_desc'];
         }
         # ----------------------------------------------------------------
         # 星图加成信息
         # ----------------------------------------------------------------
         $star_map = array();
         $we_swallow_revise_info = array();
         if (!empty($data['star_map_desc'])) {
             if (is_string($data['star_map_desc'])) {
                 $data['star_map_desc'] = json_decode($data['star_map_desc'], true);
             }
             $star_map = self::parse_star_map($data['star_map_desc']);
         }
         # ----------------------------------------------------------------
         # 基础属性
         # ----------------------------------------------------------------
         if (!empty($data['base_attr'])) {
             if (is_string($data['base_attr'])) {
                 $data['base_attr'] = json_decode($data['base_attr'], true);
             }
             list($key, $val) = each($data['base_attr']);
             //基础属性 就一个
             # atk相关特殊处理,将atk与atk_max替换成atk_min,因为role_key只有atk_min
             if ($key == 'atk' || $key == 'atk_max') {
                 $key = 'atk_min';
             }
             $fpower_base_calc[$key] += $val;
             # ----------------------------------------------------------------
             # 强化属性加成
             # ----------------------------------------------------------------
             if (!empty($data['intensive_desc'])) {
                 if (is_string($data['intensive_desc'])) {
                     $data['intensive_desc'] = json_decode($data['intensive_desc'], true);
                 }
                 list($i_key, $i_val) = each($data['intensive_desc']);
                 //强化属性
                 if ($i_key == 'atk' || $i_key == 'atk_max') {
                     $i_key = 'atk_min';
                 }
                 if (isset($star_map['intensify'])) {
                     $i_val += ceil($i_val * ($star_map['intensify'] / 10000));
                     //星图加成
                 }
                 $fpower_calc[$i_key] += $i_val;
             }
             $fpower_calc[$key] += $val;
             $out[] = array(0 => intval($attr_index['equip_base_val']), 1 => array(0 => $role_index[$key], 1 => ceil($val), 2 => 0, 3 => $i_val));
         }
         # ----------------------------------------------------------------
         # 附加属性
         # ----------------------------------------------------------------
         if (!empty($data['addition_attr']) && is_array($data['addition_attr'])) {
             $out_additional = array();
             foreach ($data['addition_attr'] as $key => $val) {
                 # --------------------------------------------------------
                 # 翅膀装备吞噬属性加成
                 # --------------------------------------------------------
                 if (!empty($data['we_swallow_info']) && is_array($data['we_swallow_info']['swallow_attr'])) {
                     if (isset($data['we_swallow_info']['swallow_attr'][$key])) {
                         $add_val = $data['we_swallow_info']['swallow_attr'][$key];
                         if ($key == 'atk' || $key == 'atk_max') {
                             $key = 'atk_min';
                         }
                         $fpower_calc[$key] += $add_val;
                     }
                 }
                 # --------------------------------------------------------
                 # 星图加成
                 # --------------------------------------------------------
                 if (isset($star_map['additional'])) {
                     $val += $val * ($star_map['additional'] / 10000);
                 }
                 # atk相关特殊处理,将atk与atk_max替换成atk_min,因为role_key只有atk_min
                 if ($key == 'atk' || $key == 'atk_max') {
                     $key = 'atk_min';
                 }
                 $fpower_base_calc[$key] += $val;
                 if (in_array($key, Cache_AttrConfig::getInstance()->get_percent_key())) {
                     $show_type = 1;
                     //前端显示百分比
                 } else {
                     $show_type = 0;
                 }
                 $out_additional[] = array(0 => $role_index[$key], 1 => ceil($val), 2 => $show_type, 3 => ceil($add_val), 'sort_priority' => self::$_sort_priority[$key]);
                 $fpower_calc[$key] += $val;
             }
             # 排序
             Com_Array::multisort($out_additional, array('sort_priority' => 'asc'));
             unset($out_additional['sort_priority']);
             $out[] = array(0 => $attr_index['equip_additional'], 1 => $out_additional);
         }
         # ----------------------------------------------------------------
         # 洗练属性
         # ----------------------------------------------------------------
         if ($data['type'] == 1) {
             # 只有装备类才获取
             if (empty($data['refine_attr']) || empty($data['refine_info'])) {
                 # 为空显示默认洗练属性
                 if (!Com_Util::is_first_charge_item($data['prop_id'])) {
                     list($data['refine_attr'], $data['refine_info']) = TenYear::getInstance('Game_EquipRefine')->extend_refine($data['sub_type'], $data['level']);
                 }
             }
             if (!empty($data['refine_attr']) && is_array($data['refine_attr'])) {
                 $out_refine = array();
                 $attr_perfection_sum = 0;
                 $attr_progress_sum = 0;
                 foreach ($data['refine_attr'] as $attr_seq => $attr_info) {
                     # --------------------------------------------------------
                     # 注意,这两项的取值必须在key做转换之前,否则在key转换后可能导致取不到值
                     # --------------------------------------------------------
                     $attr_limit = $data['refine_info']['attr_info'][$attr_seq]['refine_attr_value'] + $data['refine_info']['attr_info'][$attr_seq]['attr_stint'];
                     $attr_ratio = $data['refine_info']['attr_info'][$attr_seq]['attr_ratio'];
                     $attr_progress = ceil($data['refine_info']['attr_info'][$attr_seq]['en_refine_attr_value'] / $data['refine_info']['attr_info'][$attr_seq]['attr_stint'] * 10000);
                     # atk相关特殊处理,将atk与atk_max替换成atk_min,因为role_key只有atk_min
                     if (!is_array($attr_info)) {
                         continue;
                     }
                     # TODO: 为了兼容旧的洗练数据,以后要清档上功能,可以除去这行
                     list($key, $val) = each($attr_info);
                     if ($key == 'atk' || $key == 'atk_max') {
                         $key = 'atk_min';
                     }
                     $fpower_base_calc[$key] += $val;
                     $fpower_calc[$key] += $val;
                     $out_refine[] = array(0 => $role_index[$key], 1 => ceil($val), 2 => 0, 3 => $attr_limit, 'sort_priority' => self::$_sort_priority[$key]);
                     $attr_perfection_sum += $attr_ratio;
                     $attr_progress_sum += $attr_progress;
                 }
                 # 排序
                 Com_Array::multisort($out_refine, array('sort_priority' => 'asc'));
                 unset($out_refine['sort_priority']);
                 $out[] = array(0 => $attr_index['equip_refine'], 1 => $out_refine);
                 $out[] = array(0 => $attr_index['equip_refine_perfection'], 1 => ceil($attr_perfection_sum / 5));
                 $out[] = array(0 => $attr_index['equip_en_refine_progress'], 1 => ceil($attr_progress_sum / $data['refine_info']['last_refine_type']));
             }
         }
         #策划要一个道具的基础属性战力
         $fpower_base = Formula_Fpower::calc_fpower($fpower_base_calc);
         $out[] = array(0 => intval($attr_index['raw_fpower']), 1 => $fpower_base);
         # ----------------------------------------------------------------
         # 强化等级
         # ----------------------------------------------------------------
         if (!empty($data['intensive_level'])) {
             $out[] = array(0 => $attr_index['intensive_level'], 1 => $data['intensive_level']);
         }
         # ----------------------------------------------------------------
         # 最大强化等级
         # ----------------------------------------------------------------
         if ($data['type'] == 1) {
             # 只有装备类才获取
             $intensify_lv_limit = TenYear::getInstance('Game_EquipIntensifier')->get_intensify_lv_limit_by_item_level($data['level']);
             $out[] = array(0 => $attr_index['intensify_max'], 1 => $intensify_lv_limit);
         }
         # ----------------------------------------------------------------
         # 强化属性
         # ----------------------------------------------------------------
         if (!empty($data['intensive_desc'])) {
             if (is_string($data['intensive_desc'])) {
                 $data['intensive_desc'] = json_decode($data['intensive_desc'], true);
             }
             $val = 0;
             list($key, $val) = each($data['intensive_desc']);
             //强化属性
             # atk相关特殊处理,将atk与atk_max替换成atk_min,因为role_key只有atk_min
             if ($key == 'atk' || $key == 'atk_max') {
                 $key = 'atk_min';
             }
             if (isset($star_map['intensify'])) {
                 $val += ceil($val * ($star_map['intensify'] / 10000));
                 //星图加成
             }
             $fpower_calc[$key] += $val;
             $out[] = array(0 => $attr_index['equip_strengthen_val'], 1 => $val);
         }
         # ----------------------------------------------------------------
         # 翅膀装备吞噬等级与经验
         # ----------------------------------------------------------------
         if ($data['type'] == 6) {
             # 只有翅膀装备类才获取
             if (!empty($data['we_swallow_info'])) {
                 $out[] = array(0 => $attr_index['wing_equip_swallow_lv'], 1 => $data['we_swallow_info']['swallow_lv']);
                 $out[] = array(0 => $attr_index['wing_equip_swallow_exp'], 1 => $data['we_swallow_info']['swallow_exp']);
             } else {
                 $out[] = array(0 => $attr_index['wing_equip_swallow_lv'], 1 => 0);
                 $out[] = array(0 => $attr_index['wing_equip_swallow_exp'], 1 => 0);
             }
         }
         # ----------------------------------------------------------------
         # 镶嵌宝石属性
         # ----------------------------------------------------------------
         $gem_item = array();
         $gem_configs = array();
         $hole_stint = TenYear::getInstance('Game_EquipInlayGems')->get_prop_inlay_gem_hole_stint($data);
         # 孔位上限
         for ($i = 1; $i <= $hole_stint; $i++) {
             //镶嵌部分
             if (!empty($data['inlay_gems'][$i])) {
                 $gem_id = $data['inlay_gems'][$i];
                 if (!isset($gem_configs[$gem_id])) {
                     $gem_configs[$gem_id] = Cache_Forge::getInstance()->get_inlay_gems_by_id($gem_id);
                 }
                 $attr = self::parse_gem_config_attr($gem_configs[$gem_id]);
                 $out_additional = array();
                 $gem_fpower = 0;
                 if (!empty($attr)) {
                     foreach ($attr as $key => $val) {
                         if ($key == 'atk' || $key == 'atk_max') {
                             $key = 'atk_min';
                         }
                         if (isset($star_map['gem'])) {
                             $val += ceil($val * ($star_map['gem'] / 10000));
                             //星图加成
                         }
                         /**
                                                     if(in_array($key,Cache_AttrConfig::getInstance()->get_percent_key())){
                                                         $show_type = 1; //前端显示百分比
                         
                                                     }
                                                     else{
                                                         $show_type = 0;
                                                     }
                         							**/
                         if (isset($role_index[$key])) {
                             $fpower_calc[$key] += $val;
                             $out_additional[] = array(0 => $role_index[$key], 1 => intval($val));
                         }
                     }
                     $gem_fpower += Formula_Fpower::calc_fpower($attr);
                 }
                 $gem_item[] = array(0 => $i, 1 => self::get_prop_struct($gem_configs[$gem_id]), 2 => $gem_fpower, 3 => $out_additional);
                 //0 sid  1 战力 2 属性
             } else {
                 $gem_item[] = array(0 => $i, 1 => array(), 2 => 0, 3 => array());
                 //0 sid  1 战力 2 属性
             }
         }
         $out[] = array(0 => $attr_index['gem'], 1 => $gem_item);
         //星图属性
         if (isset($data['star_map_id']) && $data['star_map_id'] > 0) {
             $star_attr = array();
             $star_map_config = Cache_Prop::getInstance()->get_prop_info($data['star_map_id']);
             $star_attr['star'] = self::get_prop_struct($star_map_config);
             $star_attr['power'] = 0;
             //战力计算
             $star_attr['property'] = array();
             $star_map_info = Cache_Forge::getInstance()->get_star_map_config_byid($data['star_map_id']);
             if ($star_map_info) {
                 foreach ($star_map_info as $k => $v) {
                     $a = array();
                     $a['addition_type'] = self::$_star_map_attr_enum[$v['data']];
                     #$a['addition_key'] = $v['data'];
                     $a['addition_val'] = $v['data_value'];
                     if (isset($attr_index[$k])) {
                         //                            if(!isset($attr_index[$k])){
                         //                                Com_Log::log($k,'addition',1);
                         //                            }
                         $a['condition_type'] = 0;
                         $a['condition_key'] = array('k' => $attr_index[$k], 'v' => $v['limit_value'], 'per' => 0);
                     } else {
                         if ($k == 'inlay_gems_lv') {
                             $a['condition_type'] = 1;
                         } elseif ($k == 'inlay_gems') {
                             $a['condition_type'] = 2;
                         } elseif ($k == 'activate') {
                             $a['condition_type'] = 3;
                         }
                         $a['condition_key'] = array('k' => 0, 'v' => $v['limit_value'], 'per' => 0);
                     }
                     $star_attr['property'][] = $a;
                 }
             }
             $out[] = array(0 => $attr_index['star'], 1 => $star_attr);
         }
         # ----------------------------------------------------------------
         # 吞噬属性:需要写死传回已配置的所有吞噬属性,即便当前道具尚未有激活任意项吞噬属性,也需要用初始值填充
         # ----------------------------------------------------------------
         list($allow_swallow_sub_type, $allow_swallow_id) = TenYear::getInstance('Game_EquipSwallow')->get_swallow_restriction_info($data['sub_type']);
         $distinct_swallow_list = Cache_Forge::getInstance()->get_distinct_swallow_list();
         foreach ($distinct_swallow_list as $swallow_info) {
             if (!empty($allow_swallow_id) && !in_array($swallow_info['swallow_id'], $allow_swallow_id)) {
                 continue;
             }
             $swallow[$swallow_info['swallow_id']] = array('swallow_id' => $swallow_info['swallow_id'], 'swallow_lv' => 0, 'swallow_exp' => 0);
         }
         if (!empty($data['swallow_info'])) {
             foreach ($data['swallow_info'] as $swallow_id => $swallow_info) {
                 $swallow[$swallow_id] = array('id' => $swallow_info['swallow_id'], 'lv' => $swallow_info['swallow_lv'], 'value' => $swallow_info['swallow_exp']);
             }
         }
         $out[] = array(0 => $attr_index['swallow'], 1 => $swallow);
         if (!empty($data['equip_view'])) {
             if (is_string($data['equip_view'])) {
                 $equip_view = $data['equip_view'];
             } else {
                 $equip_view = implode(':', $data['equip_view']);
             }
             if ($equip_view == '0:0:0:0' || $equip_view == '0:0:0') {
                 $equip_view = '';
             }
         }
         $out[] = array(0 => $attr_index['equip_view'], 1 => $equip_view);
         if (!empty($fpower_calc)) {
             //                Com_Log::log('============[start]===========','equip_fpower',1);
             //                Com_Log::log("prop_id:{$data['prop_id']}",'equip_fpower',1);
             //                Com_Log::log($fpower_calc,'equip_fpower',1);
             $data['fpower'] = Formula_Fpower::calc_fpower($fpower_calc);
             //                Com_Log::log("fpower:{$data['fpower']}",'equip_fpower',1);
             //                Com_Log::log('============[end]===========','equip_fpower',1);
         } else {
             $data['fpower'] = 0;
         }
     }
     foreach (self::$_out_base_keys as $key) {
         if ($key == 'bind_type') {
             #特殊处理下
             if (isset($attr_index[$key]) && isset($data['bind_flag'])) {
                 $out[] = array(0 => intval($attr_index[$key]), 1 => intval($data['bind_flag']));
             }
         } elseif ($key == 'star_level') {
             if ($data['star_level'] > 10) {
                 $data['star_level'] = $data['show_star'];
             }
             $out[] = array(0 => intval($attr_index[$key]), 1 => intval($data['star_level']));
         } else {
             if (isset($attr_index[$key]) && isset($data[$key]) && !empty($data[$key])) {
                 $out[] = array(0 => intval($attr_index[$key]), 1 => intval($data[$key]));
             }
         }
     }
     return $out;
 }
Example #3
0
 /**
  * 获取装备的属性
  * @param $arrPropConfig
  * @return mixed
  */
 public function get_equip_attr($arrPropConfig)
 {
     if (($arrPropConfig['type'] == 1 or $arrPropConfig['type'] == 6) && !isset($arrPropConfig['base_attr'])) {
         if ($arrPropConfig['rechage'] == 1) {
             #首充
             $rechage_config = Cache_Rechage::getInstance()->get_rechage($arrPropConfig['prop_id']);
             if (empty($rechage_config)) {
                 $arrPropConfig['base_attr'] = array();
                 $arrPropConfig['addition_attr'] = array();
             } else {
                 if ($rechage_config['base_attribute']) {
                     $base = explode(":", $rechage_config['base_attribute']);
                     $arrPropConfig['base_attr'][$base[0]] = $base[1];
                 }
                 if ($rechage_config['add_attribute']) {
                     $addition = explode("|", $rechage_config['add_attribute']);
                     foreach ($addition as $attrs) {
                         $attr = explode(":", $attrs);
                         $arrPropConfig['addition_attr'][$attr[0]] = $attr[1];
                     }
                 }
                 if ($rechage_config['use_level']) {
                     $arrPropConfig['level'] = $rechage_config['use_level'];
                 }
                 if ($rechage_config['strengthen_level']) {
                     $arrPropConfig['intensive_level'] = $rechage_config['strengthen_level'];
                     $intensify_config = Cache_Forge::getInstance()->get_intensify_info($rechage_config['strengthen_level']);
                     $arrPropConfig['intensive_desc'] = Game_EquipIntensifier::get_latest_intensive_desc($arrPropConfig, $intensify_config);
                 }
             }
             return $arrPropConfig;
         } else {
             #$equip = Cache_EquipBaseAttr::getInstance()->get_equip_base_attr($arrPropConfig['sub_type'],$arrPropConfig['quality'],$arrPropConfig['level'],$arrPropConfig['star_level']);
             $equip = Cache_EquipBaseAttr::getInstance()->generate_prop_attr($arrPropConfig['type'], $arrPropConfig['sub_type'], $arrPropConfig['quality'], $arrPropConfig['level'], $arrPropConfig['vocation_limit'], $arrPropConfig['star_level']);
             if ($arrPropConfig['type'] == 6 && $arrPropConfig['sub_type'] == 7 && $arrPropConfig['attr_not_rand']) {
                 # 翅膀装备羽心类可能要求附加属性不随机
                 $stable_addition_attr = array();
                 # 获取翅膀装备信息
                 $item_info = Cache_PlayerWing::getInstance()->get_wing_equip_gift_info($arrPropConfig['prop_id']);
                 if (!empty($item_info)) {
                     $attr_key_hash = Struct_Prop::$_sort_priority;
                     # 使用这个哈希可以确保属性key的有效性及顺序性
                     foreach ($attr_key_hash as $attr_key => $val) {
                         if (!empty($item_info[$attr_key])) {
                             $stable_addition_attr[$attr_key] = $item_info[$attr_key];
                         }
                     }
                 }
                 if (!empty($stable_addition_attr)) {
                     $equip['addition_attr'] = $stable_addition_attr;
                 }
             }
             $arrPropConfig['star_level'] = $equip['star_level'];
             if (!empty($equip['base_attr'])) {
                 $arrPropConfig['base_attr'] = $equip['base_attr'];
             }
             if (!empty($equip['addition_attr'])) {
                 $arrPropConfig['addition_attr'] = $equip['addition_attr'];
             }
             if (!empty($equip['refine_attr'])) {
                 $arrPropConfig['refine_attr'] = $equip['refine_attr'];
             }
             if (!empty($equip['refine_info'])) {
                 $arrPropConfig['refine_info'] = $equip['refine_info'];
             }
             return $arrPropConfig;
         }
     } else {
         return $arrPropConfig;
     }
 }
Example #4
0
 private function get_inherit_consume_info($item_level, $cost_prop_flag)
 {
     $forge_common_info = Cache_Forge::getInstance()->get_forge_common_info($item_level, 1);
     if ($cost_prop_flag) {
         return $forge_common_info['inherit_cost'];
     }
     $cost_currency_string_list = array();
     # 消耗的货币
     if (!empty($forge_common_info['inherit_cost'])) {
         $cost_entry_array = explode("|", $forge_common_info['inherit_cost']);
         # 消耗项数组
         foreach ($cost_entry_array as $cost_entry) {
             list($cost_type, $cost_num) = explode(":", $cost_entry);
             $cost_key = Cache_Currency::getInstance()->get_key($cost_type);
             if ($cost_key != 'prop') {
                 $cost_currency_string_list[] = $cost_entry;
             }
         }
     }
     return implode("|", $cost_currency_string_list);
 }
Example #5
0
 /**
  * 重新计算下装备下属性 在穿脱 强化身上的装备
  * @param $player_id
  * @return mixed
  */
 public function equip_attr($player_id)
 {
     $get_field = Protocol_Player::get_player_attr_detail_key();
     $get_field[] = 'skill_starmap_info';
     $get_field[] = 'skill_info';
     $get_field[] = 'skill_rune_info';
     $get_field[] = 'dower_info';
     $get_field[] = 'fashion_fit';
     $get_field[] = 'player_settings';
     $player_detail = $this->get_data('PlayerDetail')->get_player_detail($player_id, $get_field);
     # 需要将星图对技能的加成信息初始化为空后,再重新计算身上装备的星图对技能的加成信息,否则,skill_starmap_info只增不减
     # 即每次重新计算身上装备的属性时,都重新计算skill_starmap_info
     $player_detail['skill_starmap_info'] = array();
     $equip_lists = $this->get_game('Prop')->get_player_equip($player_id);
     $arr_equip_attr = array();
     $equip_skill = array();
     $equip_swallow = array();
     if (!empty($equip_lists)) {
         $equip_suit_quality = array();
         $equip_suit_strength = array();
         $equip_suit_star = array();
         $equip_suit_inlay = 0;
         $equip_level = array();
         foreach ($equip_lists as $equip) {
             if ($equip['grid'] < 10) {
                 $equip_level[$equip['level']] += 1;
                 $equip_suit_quality[$equip['quality']] += 1;
                 if ($equip['intensive_level']) {
                     $equip_suit_strength[$equip['intensive_level']] += 1;
                 }
                 $equip_suit_star[$equip['star_level']] += 1;
             }
             if (is_string($equip['base_attr'])) {
                 $base_attr = json_decode($equip['base_attr'], true);
             } else {
                 $base_attr = $equip['base_attr'];
             }
             $star_map = array();
             if (!empty($equip['star_map_desc'])) {
                 if (is_string($equip['star_map_desc'])) {
                     $equip['star_map_desc'] = json_decode($equip['star_map_desc'], true);
                 }
                 $star_map = Struct_Prop::parse_star_map($equip['star_map_desc']);
                 # 星图觉醒技能信息更新到player_detail表的skill_starmap_info中
                 if (!empty($equip['career_type']) && !empty($star_map['skill'])) {
                     foreach ($star_map['skill'] as $career_type => $skill_info) {
                         if ($equip['career_type'] != $career_type) {
                             continue;
                         }
                         $player_detail['skill_starmap_info'][$skill_info['skill_id']] += $skill_info['skill_level'];
                     }
                 }
             }
             # 吞噬属性
             if (!empty($equip['swallow_info']) && is_array($equip['swallow_info'])) {
                 foreach ($equip['swallow_info'] as $swallow_id => $swallow_info) {
                     $swallow_config = Cache_Forge::getInstance()->get_swallow_config($swallow_id, $swallow_info['swallow_lv']);
                     $equip_swallow[$swallow_id] += intval($swallow_config['swallow_param']);
                 }
             }
             if (!empty($base_attr)) {
                 //计算基础属性
                 foreach ($base_attr as $key => $val) {
                     $val += $val * (intval($star_map['equip_attr']) / 100);
                     //星图加成
                     if ($key == 'atk' || $key == 'atk_max' || $key == 'atk_min') {
                         $arr_equip_attr['atk_min'] += $val;
                     } else {
                         $arr_equip_attr[$key] += $val;
                     }
                 }
             }
             if (intval($equip['addition_attr']) > 0) {
                 foreach ($equip['addition_attr'] as $key => $val) {
                     if (isset($star_map['additional'])) {
                         $val += ceil($val * ($star_map['additional'] / 10000));
                         //星图加成
                     }
                     if ($key == 'atk' || $key == 'atk_max' || $key == 'atk_min') {
                         $arr_equip_attr['atk_min'] += $val;
                     } else {
                         $arr_equip_attr[$key] += $val;
                     }
                 }
             }
             # ------------------------------------------------------------
             # 洗练属性处理
             # ------------------------------------------------------------
             if (!empty($equip['refine_attr'])) {
                 foreach ($equip['refine_attr'] as $attr_seq => $attr_info) {
                     if (!is_array($attr_info)) {
                         continue;
                     }
                     # TODO: 为了兼容旧的洗练数据,以后要清档上功能,可以除去这行
                     list($key, $val) = each($attr_info);
                     # atk相关特殊处理,将atk与atk_max替换成atk_min,因为role_key只有atk_min
                     if ($key == 'atk' || $key == 'atk_max') {
                         $key = 'atk_min';
                     }
                     $arr_equip_attr[$key] += $val;
                 }
             }
             if (is_string($equip['intensive_desc'])) {
                 $intensive_desc = json_decode($equip['intensive_desc'], true);
             } else {
                 $intensive_desc = $equip['intensive_desc'];
             }
             if (!empty($intensive_desc)) {
                 foreach ($intensive_desc as $key => $val) {
                     $val += $val * (intval($star_map['intensify']) / 10000);
                     //星图加成
                     if ($key == 'atk' || $key == 'atk_min' || $key == 'atk_max') {
                         $arr_equip_attr['atk_min'] += $val;
                     } else {
                         $arr_equip_attr[$key] += $val;
                     }
                 }
             }
             $gem_configs = array();
             if (is_string($equip['inlay_gems'])) {
                 $inlay_gems = json_decode($equip['intensive_desc'], true);
             } else {
                 $inlay_gems = $equip['inlay_gems'];
             }
             if (!empty($inlay_gems)) {
                 foreach ($inlay_gems as $gem_id) {
                     if (!isset($gem_configs[$gem_id])) {
                         $gem_configs[$gem_id] = Cache_Forge::getInstance()->get_inlay_gems_by_id($gem_id);
                     }
                     if ($equip['grid'] < 10) {
                         $equip_suit_inlay += $gem_configs[$gem_id]['lv'];
                     }
                     $attr = Struct_Prop::parse_gem_config_attr($gem_configs[$gem_id]);
                     if (!empty($attr)) {
                         foreach ($attr as $key => $val) {
                             if ($key == 'atk' || $key == 'atk_min' || $key == 'atk_max') {
                                 $arr_equip_attr['atk_min'] += $val;
                             } else {
                                 $arr_equip_attr[$key] += $val;
                             }
                         }
                     }
                 }
             }
         }
         //套装加成
         $item_flags = Cache_ItemFlag::getInstance()->get_item_flag_info(1);
         $level_count = count($equip_level);
         if (!empty($item_flags)) {
             $flags_addition = array();
             foreach ($item_flags as $flag) {
                 if ($flag['type'] == 'quality') {
                     $conditions = explode("|", $flag['condition']);
                     $fnum = explode(":", $flag['flag']);
                     $add_flag = 0;
                     foreach ($conditions as $c) {
                         $condition = explode(":", $c);
                         if ($condition[0] == 'quality' && $this->get_conditions_num($equip_suit_quality, $condition[1]) >= $fnum[1]) {
                             $add_flag += 1;
                         }
                         if ($condition[0] == 'level' && $this->get_conditions_num($equip_level, $condition[1]) >= $fnum[1]) {
                             $add_flag += 1;
                         }
                         if ($condition[0] == 'star' && $this->get_conditions_num($equip_suit_star, $condition[1]) >= $fnum[1]) {
                             $add_flag += 1;
                         }
                     }
                     if (count($conditions) == $add_flag) {
                         $flag_attr = json_decode($flag['attr'], true);
                         $flags_addition['quality'] = $flag_attr;
                         # 改同一类型覆盖了
                         //                            Com_Log::write('equip_flags.'.$player_id,"quality_flag_attr:".var_export($flag_attr,true));
                         //                            foreach($flag_attr as $key=>$val){
                         //                                $arr_equip_attr[$key] += $val['val'];
                         //                            }
                     }
                 } elseif ($flag['type'] == 'strength') {
                     $conditions = explode("|", $flag['condition']);
                     $fnum = explode(":", $flag['flag']);
                     $add_flag = 0;
                     foreach ($conditions as $c) {
                         $condition = explode(":", $c);
                         if ($condition[0] == 'intensive_level' && $this->get_conditions_num($equip_suit_strength, $condition[1]) >= $fnum[1]) {
                             $add_flag += 1;
                         }
                     }
                     if (count($conditions) == $add_flag) {
                         $flag_attr = json_decode($flag['attr'], true);
                         $flags_addition['strength'] = $flag_attr;
                         //                            Com_Log::write('equip_flags.'.$player_id,"strength_flag_attr:".var_export($flag_attr,true));
                         //                            foreach($flag_attr as $key=>$val){
                         //                                $arr_equip_attr[$key] += $val['val'];
                         //                            }
                     }
                 } elseif ($flag['type'] == 'inlay') {
                     $fnum = explode(":", $flag['flag']);
                     if ($equip_suit_inlay >= $fnum[1]) {
                         $flag_attr = json_decode($flag['attr'], true);
                         $flags_addition['inlay'] = $flag_attr;
                         //                            Com_Log::write('equip_flags.'.$player_id,"inlay_flag_attr:".var_export($flag_attr,true));
                         //                            foreach($flag_attr as $key=>$val){
                         //                                $arr_equip_attr[$key] += $val['val'];
                         //                            }
                     }
                 }
             }
         }
         if (!empty($flags_addition)) {
             foreach ($flags_addition as $flag_attr) {
                 foreach ($flag_attr as $key => $val) {
                     $arr_equip_attr[$key] += $val['val'];
                 }
             }
         }
     }
     $equip_model = array();
     for ($i = 0; $i < 10; $i++) {
         if (isset($equip_lists[$i])) {
             if (!empty($equip_lists[$i]['equip_view'])) {
                 if (is_string($equip_lists[$i]['equip_view'])) {
                     $equip_model[$i] = $equip_lists[$i]['equip_view'];
                 } else {
                     $equip_model[$i] = implode(':', $equip_lists[$i]['equip_view']);
                     //先这样 不想清理数据了  下次清理完数据改了
                 }
                 if ($equip_model[$i] == '0:0:0:0' || $equip_model[$i] == '0:0:0') {
                     $equip_model[$i] = '';
                 }
             } else {
                 $equip_model[$i] = '';
             }
         }
     }
     $player_detail['equip_attr'] = $arr_equip_attr;
     $player_detail['skill_starmap_info'] = $player_detail['skill_starmap_info'];
     $result = $this->get_data('PlayerDetail')->update_player_detail($player_id, array('equip_attr' => $arr_equip_attr, 'skill_starmap_info' => $player_detail['skill_starmap_info']));
     if ($result) {
         $player_info = $this->get_data('Player')->get_player_info($player_id, array('career_type', 'level'));
         //同步人物属性
         $arr_part_update['attr'] = '';
         $arr_part_update['player_data'] = array('player_detail' => $player_detail, 'player' => array('career_type' => $player_info['career_type'], 'level' => $player_info['level']));
         $arr_part_update['equip_skill'] = $equip_skill;
         $arr_part_update['equip_model'] = $equip_model;
         $arr_part_update['equip_swallow'] = $equip_swallow;
         $arr_part_update['skill_infos'] = '';
         Protocol_Player::p2c_part_update($player_id, $arr_part_update);
     }
     return $result;
 }
Example #6
0
 public function get_swallow_restriction_info($item_sub_type)
 {
     $allow_swallow_sub_type = array();
     $allow_swallow_id = array();
     if (empty($item_sub_type)) {
         return array($allow_swallow_sub_type, $allow_swallow_id);
     }
     $swallow_restriction = Cache_Forge::getInstance()->get_swallow_restriction($item_sub_type);
     if (!empty($swallow_restriction['allow_swallow_sub_type'])) {
         $allow_swallow_sub_type = explode(":", $swallow_restriction['allow_swallow_sub_type']);
     }
     $swallow_id_list = Cache_Forge::getInstance()->get_swallow_id_by_sub_type($allow_swallow_sub_type);
     if (!empty($swallow_id_list)) {
         foreach ($swallow_id_list as $record) {
             $allow_swallow_id[] = $record['swallow_id'];
         }
     }
     return array($allow_swallow_sub_type, $allow_swallow_id);
 }
Example #7
0
 /**
  * @Purpose:
  * 获取传承后的翅膀装备
  * @Param &$inherit_equipment 传承装备
  * @Param &$be_inherit_equipment 继承装备
  */
 private function get_inherit_wing_equip(&$inherit_equipment, &$be_inherit_equipment)
 {
     $is_inherit = $this->is_inherit($inherit_equipment, $be_inherit_equipment);
     if ($is_inherit !== true) {
         $this->throw_error($is_inherit);
     }
     if ($inherit_equipment['intensive_level'] <= $be_inherit_equipment['intensive_level'] && $inherit_equipment['we_swallow_info']['swallow_exp'] <= $be_inherit_equipment['we_swallow_info']['swallow_exp']) {
         $this->throw_error('80506');
         #没有可传承的属性
     }
     #强化传承
     if ($inherit_equipment['intensive_level'] > $be_inherit_equipment['intensive_level']) {
         #继承装备强化属性计算
         $be_inherit_equipment['intensive_level'] = $inherit_equipment['intensive_level'];
         $be_inherit_equipment['intensive_lose_times'] = 0;
         $update_field[$be_inherit_equipment['player_prop_id']]['intensive_level'] = $be_inherit_equipment['intensive_level'];
         $update_field[$be_inherit_equipment['player_prop_id']]['intensive_lose_times'] = $be_inherit_equipment['intensive_lose_times'];
         $intensify_table = Cache_WingEquipment::getInstance()->get_wing_equip_intensify_info(array('level' => $be_inherit_equipment['intensive_level']));
         if (empty($intensify_table)) {
             $this->throw_error('10109');
             #配置表读取错误
         }
         $be_inherit_equipment['intensive_desc'] = $this->get_latest_intensive_desc($be_inherit_equipment, $intensify_table);
         $update_field[$be_inherit_equipment['player_prop_id']]['intensive_desc'] = $be_inherit_equipment['intensive_desc'];
         #传承装备强化属性还原
         $inherit_equipment['intensive_level'] = 0;
         $inherit_equipment['intensive_desc'] = array();
         $inherit_equipment['intensive_lose_times'] = 0;
         $update_field[$inherit_equipment['player_prop_id']]['intensive_level'] = $inherit_equipment['intensive_level'];
         $update_field[$inherit_equipment['player_prop_id']]['intensive_desc'] = $inherit_equipment['intensive_desc'];
         $update_field[$inherit_equipment['player_prop_id']]['intensive_lose_times'] = $inherit_equipment['intensive_lose_times'];
     }
     #吞噬传承
     if ($inherit_equipment['we_swallow_info']['swallow_exp'] > $be_inherit_equipment['we_swallow_info']['swallow_exp']) {
         $be_inherit_equipment['we_swallow_info']['swallow_lv'] = $inherit_equipment['we_swallow_info']['swallow_lv'];
         $be_inherit_equipment['we_swallow_info']['swallow_exp'] = $inherit_equipment['we_swallow_info']['swallow_exp'];
         # 根据吞噬等级,计算吞噬加成附加属性
         $we_swallow_revise_info = Cache_Forge::getInstance()->get_we_swallow_config_by_lv($be_inherit_equipment['we_swallow_info']['swallow_lv']);
         if (empty($we_swallow_revise_info)) {
             $this->throw_error('80047');
             # 未找到翅膀装备吞噬配置信息
         }
         foreach ($be_inherit_equipment['addition_attr'] as $attr_key => $attr_val) {
             $attr_val = ceil($attr_val * $we_swallow_revise_info['attr_revise_ratio'] / 10000) + $we_swallow_revise_info[$attr_key];
             $be_inherit_equipment['we_swallow_info']['swallow_attr'][$attr_key] = $attr_val;
         }
         $update_field[$be_inherit_equipment['player_prop_id']]['we_swallow_info']['swallow_lv'] = $be_inherit_equipment['we_swallow_info']['swallow_lv'];
         $update_field[$be_inherit_equipment['player_prop_id']]['we_swallow_info']['swallow_exp'] = $be_inherit_equipment['we_swallow_info']['swallow_exp'];
         $update_field[$be_inherit_equipment['player_prop_id']]['we_swallow_info']['swallow_attr'] = $be_inherit_equipment['we_swallow_info']['swallow_attr'];
         $inherit_equipment['we_swallow_info']['swallow_lv'] = 0;
         $inherit_equipment['we_swallow_info']['swallow_exp'] = 0;
         $inherit_equipment['we_swallow_info']['swallow_attr'] = array();
         $update_field[$inherit_equipment['player_prop_id']]['we_swallow_info']['swallow_lv'] = $inherit_equipment['we_swallow_info']['swallow_lv'];
         $update_field[$inherit_equipment['player_prop_id']]['we_swallow_info']['swallow_exp'] = $inherit_equipment['we_swallow_info']['swallow_exp'];
         $update_field[$inherit_equipment['player_prop_id']]['we_swallow_info']['swallow_attr'] = $inherit_equipment['we_swallow_info']['swallow_attr'];
     }
     return $update_field;
 }
Example #8
0
 private function filter_unvalid_starmap($player_prop_info, $player_star_map)
 {
     foreach ($player_star_map as $key => $val) {
         $starmap_config = Cache_Forge::getInstance()->get_starmap_info($val['prop_id']);
         if (!empty($starmap_config[0]['require_career_type'])) {
             $require_career_type = explode(":", $starmap_config[0]['require_career_type']);
             if (!in_array($player_prop_info['career_type'], $require_career_type)) {
                 unset($player_star_map[$key]);
             }
         }
         if (!empty($starmap_config[0]['require_sub_type'])) {
             $require_sub_type = explode(":", $starmap_config[0]['require_sub_type']);
             if (!in_array($player_prop_info['sub_type'], $require_sub_type)) {
                 unset($player_star_map[$key]);
             }
         }
         if (!empty($starmap_config[0]['require_equip_level'])) {
             if ($player_prop_info['level'] < $starmap_config[0]['require_equip_level']) {
                 unset($player_star_map[$key]);
             }
         }
     }
     return $player_star_map;
 }
Example #9
0
 private function filter_unvalid_gems($player_prop_info, $gems)
 {
     foreach ($gems as $key => $val) {
         $gems_config = Cache_Forge::getInstance()->get_inlay_gems_by_id($val['prop_id']);
         if (!empty($gems_config['require_sub_type'])) {
             $require_sub_type = explode(":", $gems_config['require_sub_type']);
             if (!in_array($player_prop_info['sub_type'], $require_sub_type)) {
                 unset($gems[$key]);
             }
         }
     }
     return $gems;
 }
Example #10
0
 public function get_intensify_lv_limit_by_item_level($item_level, $is_throw_error = 0)
 {
     $forge_common_info = Cache_Forge::getInstance()->get_forge_common_info($item_level);
     if ($is_throw_error && empty($forge_common_info)) {
         $this->throw_error('80319');
         # 找不到锻造通用配置信息
     }
     $intensify_lv_limit = empty($forge_common_info['intensify_lv_limit']) ? 0 : $forge_common_info['intensify_lv_limit'];
     $real_intensify_lv_limit = min($intensify_lv_limit, $this->max_intensify_lv);
     return $real_intensify_lv_limit;
 }
Example #11
0
 private function _forward_compatibility_for_wing_equip_swallow_info(&$prop_detail, $player_detail = null)
 {
     if (empty($prop_detail) || !is_array($prop_detail)) {
         return;
     }
     if ($prop_detail['type'] == 6 && !empty($prop_detail['we_swallow_info']) && intval($prop_detail['refine_version']) < 13) {
         if (empty($player_detail)) {
             $player_detail = $this->get_data('PlayerDetail')->get_player_detail($prop_detail['player_id'], array('wing_info'));
         }
         $swallow_lv_max = $this->get_game('WingEquipSwallow')->get_we_swallow_lv_max($prop_detail['vocation_limit'], $player_detail);
         # 根据吞噬属性的exp,刷新吞噬属性的lv
         $swallow_config = Cache_Forge::getInstance()->get_we_swallow_config_by_exp($prop_detail['we_swallow_info']['swallow_exp']);
         if (!empty($swallow_config)) {
             $prop_detail['we_swallow_info']['swallow_lv'] = min($swallow_config['swallow_lv'], $swallow_lv_max);
         }
         # 根据吞噬等级,修正经验并计算吞噬加成附加属性
         $we_swallow_revise_info = Cache_Forge::getInstance()->get_we_swallow_config_by_lv($prop_detail['we_swallow_info']['swallow_lv']);
         if (!empty($we_swallow_revise_info)) {
             if ($prop_detail['we_swallow_info']['swallow_exp'] > $we_swallow_revise_info['swallow_exp'] - 1) {
                 $prop_detail['we_swallow_info']['swallow_exp'] = $we_swallow_revise_info['swallow_exp'] - 1;
             }
             foreach ($prop_detail['addition_attr'] as $attr_key => $attr_val) {
                 $attr_val = ceil($attr_val * $we_swallow_revise_info['attr_revise_ratio'] / 10000) + $we_swallow_revise_info[$attr_key];
                 $prop_detail['we_swallow_info']['swallow_attr'][$attr_key] = $attr_val;
             }
         }
     }
 }