/// 英雄属性 /// class EHeroProperties extends Enum { /// /// 生命值 /// const HP = 0; /// /// 能量值 /// const NENGLIANGZHI = 1; /// /// 物理攻击 /// const WULIGONGJI = 2; /// /// 防御护甲 /// const FANGYUHUJIA = 3; /// /// 敏捷 /// const GONGJISUDU = 4; /// /// 暴击 /// const CRICITAL = 5; /// /// 法术强度 /// const FASHUQIANGDU = 6; /// /// 魔法抗性 /// const MOFAKANGXING = 7; } /** * 玩家的英雄的实体数据 */ class Ins_UserHero extends Object_ext { /** * 唯一的英雄ID * @var string */ public $uid; /** * 英雄的模板ID * @var string */ public $typeId; /** * 英雄的当前等级 * @var int */ public $level; /** * 英雄当前等阶 * @var string */ public $grade; /** * 英雄的收集的当前等级满级的累计经验值 * @var int */ public $maxXp; /** * 英雄的当前总经验值 * @var int */ public $xp; /** * 当前等阶 默认是0.----这个应该是废弃了 * 0= 绿 1=蓝 2= 红 3= 紫 4= 橙 5 * @var int * @deprecated since version 0 */ public $strengthLevel; /** * 当前星级 默认是0星 * @var int * @deprecated since version 0 */ public $curStar; /** * 当前神血的 血脉等级 默认是0 * @var int * @deprecated since version 0 */ public $curBloodId; /** * 当前卡牌的锁定状态 * true = 锁定 * @var bool * @deprecated since version 0 */ public $isLocked; /** * 技能数据 * @var object * @deprecated since version 0 */ public $skills; /** * 子技能列表(已解锁子技能id) * @var dic */ public $subSkills; /** * 装备 * @var object */ public $equip; /** * 言灵 * @var {} */ public $yanling; /** * 当前主线的好感度进度 * @var object * @deprecated since version 0 */ public $curMainFavor; /** * 所有的已经拥有的好感度进度 * @var array * @deprecated since version 0 */ public $favors; /** * * 构造函数 */ public function __construct($arg = null) { if (null != $arg) { parent::__construct($arg); } else { $this->level = 1; $this->xp = 0; $this->maxXp = 0; $this->strengthLevel = 0; $this->curBloodId = 0; $this->curStar = 0; $this->isLocked = false; $this->curMainFavor = 'E'; $this->favors = ArrayInit(); $this->favors[] = 'E'; $this->grade = "D"; //-----------初始化技能的默认数据 $temp = ObjectInit(); $temp->normalSkill = JsonUtil::decode('{"level":1}'); $temp->manuSkill1 = JsonUtil::decode('{"level":1}'); $temp->manuSkill2 = JsonUtil::decode('{"level":1}'); $temp->manuSkill3 = JsonUtil::decode('{"level":1}'); $temp->passiveSkill = JsonUtil::decode('{"level":1}'); $temp->captainSkill = JsonUtil::decode('{"level":1}'); $this->skills = $temp; $this->subSkills = ObjectInit(); //----初始化装备的默认数据 $this->equip = ObjectInit(); $tempEq = ObjectInit(); $tempEq->weapon = JsonUtil::decode('{"itemuid":0}'); $tempEq->armor = JsonUtil::decode('{"itemuid":0}'); $tempEq->ring = JsonUtil::decode('{"itemuid":0}'); $this->equip = $tempEq; // ------初始化言灵的默认数据 $this->yanling = JsonUtil::decode('{"1":{"itemuid":0},"2":{"itemuid":0},"3":{"itemuid":0}}'); } } /** * 判断技能是否可升级 * @param type $mainSkillId * @param type $subSkillId Description * @return type */ public function IsSkillUpdateAble($mainSkillId, $subSkillId) { $sarr = array("D" => 1, "C" => 2, "B" => 3, "A" => 4, "S" => 5); $isOk = false; if (CommUtil::isPropertyExists($this->subSkills, $mainSkillId)) { if (CommUtil::isPropertyExists($this->subSkills->$mainSkillId, $subSkillId)) { $sm = GameConfig::subSkill_getItem($subSkillId); switch ($sm->upgradeConditionType) { case 1: // 角色等级 $isOk = $this->level >= int($sm->upgradeParameter); break; case 2: // 角色品阶 $cur = (array_key_exists($this->grade, $sarr) ? $sarr[$this->grade] : 0); $require = (array_key_exists($sm->upgradeParameter, $sarr) ? $sarr[$sm->upgradeParameter] : 0); $isOk = $cur >= $require; break; default: break; } } } return $isOk; } /** * 判断技能是否可解锁 * @param type $mainSkillId * @param type $subSkillId Description * @return type */ public function IsSkillUnlockAble($mainSkillId, $subSkillId) { $sarr = array("D" => 1, "C" => 2, "B" => 3, "A" => 4, "S" => 5); $isOk = false; if (CommUtil::isPropertyExists($this->subSkills, $mainSkillId)) { if (CommUtil::isPropertyExists($this->subSkills->$mainSkillId, $subSkillId)) { $sm = GameConfig::subSkill_getItem($subSkillId); switch ($sm->unlockConditionType) { case 1: // 角色等级 $isOk = $this->level >= int($sm->unlockParameter); break; case 2: // 角色品阶 $cur = (array_key_exists($this->grade, $sarr) ? $sarr[$this->grade] : 0); $require = (array_key_exists($sm->unlockParameter, $sarr) ? $sarr[$sm->unlockParameter] : 0); $isOk = $cur >= $require; break; default: break; } } } return $isOk; } /** * 是否可继续升级(指挥官等级限制 + 全局限制) * @return bool */ public function HeroCanLevelUp() { $maxLevel = glc()->Hero_Upgrade_BasicMaxLevel; # 全局设置限制了当前英雄的最高等级 $playerLimit = GameConfig::playerlevel_getItem(ctx()->base()->level)->hero_max_level; return $this->level < min($maxLevel, $playerLimit); } /** * 获取该角色战斗力数值 * 生命值+物理攻击*4+魔法强度*4+护甲*5+魔抗*5 * @param Data_UserGame $user * @return type */ public function GetPower($user) { return (int) ($this->getHpForBattle($user) * 1.0 // + $this->getNengLiangZhiJiForBattle($user) * 0 // + $this->getWuLiGongJiForBattle($user) * 4 // + $this->getFaShuQiangDuForBattle($user) * 4 // + $this->getFangYuHuJiaForBattle($user) * 5 // + $this->getMoFaKangXingForBattle($user) * 5 // ); } // // /** * 获得角色装备的 物品提供的属性加成 * @param type $attribute * @param Data_UserGame $user * @return type */ public function getEquipExtraProperty($attribute, $user) { $result = 0; $equipUID = $this->equip->weapon->itemuid; if (CommUtil::isPropertyExists($user->store->equipment, $equipUID)) { $equip = $user->store->equipment->$equipUID; $itemId = my_null_default($equip->typeId, 0); $wp = GameConfig::item_weapon_getItem($itemId); my_Assert(null != $wp, ErrCode::err_const_no); switch ($attribute) { case EHeroProperties::WULIGONGJI: $result += $wp->phyAtk; break; case EHeroProperties :: FASHUQIANGDU: $result += $wp->fashuqiangdu; break; case EHeroProperties :: CRICITAL: $result += $wp->crit; break; } } return $result; } /** * 获得角色装备的言灵提供的属性加成 * @param type $attribute * @param Data_UserGame $user * @return type */ public function getYanlingExtraProperty($attribute, $user) { $result = 0; foreach ($this->yanling as $item) { $itemUID = $item->itemuid; if ($itemUID > 0) { $itemId = $user->store->yanling->$itemUID->typeId; $mo = GameConfig::item_yanling_getItem($itemId); my_Assert(null != $mo, ErrCode::err_const_no); # 言灵常量找不到 switch ($attribute) { case EHeroProperties ::HP: $result += $mo->hp; break; case EHeroProperties :: WULIGONGJI: $result += $mo->phyAtk; break; case EHeroProperties :: FASHUQIANGDU: $result += $mo->fashuqiangdu; break; case EHeroProperties :: CRICITAL: $result += $mo->crit; break; case EHeroProperties ::FANGYUHUJIA: $result += $mo->phyDef; break; case EHeroProperties ::MOFAKANGXING: $result += $mo->mofakangxing; break; default: break; } } } return $result; } /** * 获得 角色某个等级 等阶 状态下的属性值 * @param type $modelId moID * @param type $attType * @param type $level 等级 * @param type $gradeLevel 品阶(SABCD) * @return type */ public function getHeroProperty($modelId, $attType, $level, $gradeLevel) { $result = 0; # 结果 $gradeF = 0; # 品阶加成 /* 角色成长公式 生命=初始生命+生命成长*(角色等级-1))+武器加成+言灵加成 言能=初始言能+言能成长*(角色等级-1)) 物攻=初始物攻+物攻成长*(角色等级-1))+武器加成+言灵加成 护甲=初始护甲+护甲成长*(角色等级-1))+武器加成+言灵加成 言攻=初始言攻+言攻成长*(角色等级-1))+武器加成+言灵加成 言抗=初始言抗+言抗成长*(角色等级-1))+武器加成+言灵加成 暴击=初始暴击+暴击成长*(角色等级-1))+武器加成+言灵加成 暴击率=暴击/(75+角色等级*5) */ // 武器成长 和 言灵成长都是直接数值, 所以放到外面再做加法也可以. Ps. 放外面了 $heroMo = GameConfig::hero_getItem($modelId); my_Assert($heroMo != null, ErrCode::hero_const_no_err); # 找不到英雄模板数据 $gradeLevelMo = GameConfig::heroextra_level_getItem($heroMo->heroId, $gradeLevel); # 等阶加成配置 my_Assert(null != $gradeLevelMo, ErrCode::err_const_no); # 找不到常量 // ////第一步, 根据玩家的等阶,来找出,对应的等阶,的各个属性成长的曲线类型,也就是说0阶的时候, 各个属性的成长系数是SABCD的哪搞一个。 ////然后 根据 SABCD的类型以及 想查找的属性, 找出对应的 这个属性的成长系数 // // switch ($attType) { # 属性类型 case EHeroProperties::HP: $gradeF = $gradeLevelMo->hp; break; case EHeroProperties :: MOFAKANGXING: $gradeF = $gradeLevelMo->mofakangxing; break; case EHeroProperties ::FASHUQIANGDU: $gradeF = $gradeLevelMo->fashuqiangdu; break; case EHeroProperties ::WULIGONGJI: $gradeF = $gradeLevelMo->wuligongji; break; case EHeroProperties ::FANGYUHUJIA: $gradeF = $gradeLevelMo->fangyuhujia; break; case EHeroProperties :: NENGLIANGZHI: $gradeF = $gradeLevelMo->nengliangzhi; break; case EHeroProperties :: GONGJISUDU: $gradeF = $gradeLevelMo->gongjisudu; break; case EHeroProperties ::CRICITAL: $gradeF = 0; break; } // // // // switch ($attType) { case EHeroProperties :: HP: $result += $heroMo->hp + $gradeF * ($level - 1); break; case EHeroProperties ::NENGLIANGZHI: $result += $heroMo->nengliangzhi + $gradeF * ($level - 1); break; case EHeroProperties ::WULIGONGJI: $result += $heroMo->wuligongji + $gradeF * ($level - 1); break; case EHeroProperties ::FANGYUHUJIA: $result += $heroMo->fangyuhujia + $gradeF * ($level - 1); break; case EHeroProperties :: FASHUQIANGDU: $result += $heroMo->fashuqiangdu + $gradeF * ($level - 1); break; case EHeroProperties :: MOFAKANGXING: $result += $heroMo->mofakangxing + $gradeF * ($level - 1); break; case EHeroProperties :: GONGJISUDU: $result += $heroMo->gongjisudu + $gradeF * ($level - 1); break; case EHeroProperties :: CRICITAL: $result += $heroMo->baoji / (75 + $level * 5); break; } // // return $result; } // /** * 基础(等级+品阶) 血量 * @return type */ function getHp() { return $this->getHeroProperty($this->typeId, EHeroProperties ::HP, $this->level, $this->grade); } /** * 基础(等级+品阶)能量值 * @return type */ function getNengLiangZhi() { return $this->getHeroProperty($this->typeId, EHeroProperties ::NENGLIANGZHI, $this->level, $this->grade); } /** * 基础(等级+品阶)物理攻击 * @return type */ function getWuLiGongJi() { return $this->getHeroProperty($this->typeId, EHeroProperties ::WULIGONGJI, $this->level, $this->grade); } /** * 基础(等级+品阶)法术强度 * @return type */ function getFaShuQiangDu() { return $this->getHeroProperty($this->typeId, EHeroProperties ::FASHUQIANGDU, $this->level, $this->grade); } /** * 基础(等级+品阶)防御护甲 * @return type */ function getFangYuHuJia() { return $this->getHeroProperty($this->typeId, EHeroProperties ::FANGYUHUJIA, $this->level, $this->grade); } /** * 基础(等级+品阶)魔法抗性 * @return type */ function getMoFaKangXing() { return $this->getHeroProperty($this->typeId, EHeroProperties ::MOFAKANGXING, $this->level, $this->grade); } // // /** * 战场血量 = 基础血量 + 武器和言灵加成 * @param Data_UserGame $user * @return type */ public function getHpForBattle($user) { return (int) ($this->getHp() // 英雄数据 + $this->getEquipExtraProperty(EHeroProperties ::HP, $user) // 武器加成 + $this->getYanlingExtraProperty(EHeroProperties :: HP, $user) // 言灵加成 ); } /** * 战场能量值 = 基础能量值 + 武器和言灵加成 * @param Data_UserGame $user * @return type */ public function getNengLiangZhiJiForBattle($user) { return (int) ($this->getNengLiangZhi() // 英雄本身 + $this->getEquipExtraProperty(EHeroProperties :: NENGLIANGZHI, $user) // + 武器加成 + $this->getYanlingExtraProperty(EHeroProperties::NENGLIANGZHI, $user) // + 言灵加成 ); } /** * @param Data_UserGame $user * @return type */ public function getWuLiGongJiForBattle($user) { return (int) ($this->getWuLiGongJi() // 英雄数据 + $this->getEquipExtraProperty(EHeroProperties ::WULIGONGJI, $user) // 武器加成 + $this->getYanlingExtraProperty(EHeroProperties :: WULIGONGJI, $user) // 言灵加成 ); } /** * @param Data_UserGame $user * @return type */ function getFaShuQiangDuForBattle($user) { return (int) ($this->getFaShuQiangDu() // 英雄数据 + $this->getEquipExtraProperty(EHeroProperties ::FASHUQIANGDU, $user) // 武器加成 + $this->getYanlingExtraProperty(EHeroProperties :: FASHUQIANGDU, $user) // 言灵加成 ); } /** * @param Data_UserGame $user * @return type */ function getFangYuHuJiaForBattle($user) { return (int) ($this->getFangYuHuJia() // 英雄数据 + $this->getEquipExtraProperty(EHeroProperties ::FANGYUHUJIA, $user) // 武器加成 + $this->getYanlingExtraProperty(EHeroProperties :: FANGYUHUJIA, $user) // 言灵加成 ); } /** * @param Data_UserGame $user * @return type */ function getMoFaKangXingForBattle($user) { return (int) ($this->getMoFaKangXing() // 英雄数据 + $this->getEquipExtraProperty(EHeroProperties ::MOFAKANGXING, $user) // 武器加成 + $this->getYanlingExtraProperty(EHeroProperties :: MOFAKANGXING, $user) // 言灵加成 ); } // // // }