gamecloud
Version:
game logic server over cloud
349 lines (314 loc) • 10.8 kB
JavaScript
let facade = require('../../Facade')
let {PotentialType, em_Effect_Comm} = facade.const
let PetClientItem = require('./PetClientItem')
let LargeNumberCalculator = facade.Util.LargeNumberCalculator
let EffectManager = facade.Util.EffectManager
let EffectObject = facade.Util.EffectObject
/**
* 天赋对象,复用于法宝、图腾、PVE宠物、PVP宠物。
* Class PotentialInfo
* @package App\Logic\Potential
* @property {LargeNumberCalculator} power
*/
class PotentialItem
{
/**
* 构造函数
* @param {*} $_type 天赋类型
* @param {baseMgr} $parent 容器对象
*/
constructor($_type, $parent) {
this.parent = $parent;
this.type = !!$_type ? $_type : PotentialType.Equ;
/**
* 记录升级所需花费
* @var LargeNumberCalculator
*/
this.money = new LargeNumberCalculator(0, 0);
this.power = new LargeNumberCalculator(0, 0);
/**
* 编号,和PotentialConfig中的ID一一对应
* @var int
*/
this.id = 0;
/**
* 等级 为0时表示未激活,必须先执行激活操作后变为1
* @var int
*/
this.level = 0;
/**
* 强化等级
* @var int
*/
this.enLevel = 0;
/**
* 进阶阶数
* @var int
*/
this.adLevel = 0;
/**
* 当前圣光值
*/
this.point = 0;
/**
* 效果管理器
*/
this.eMgr = null;
}
/**
* @return int
*/
getEnLevel() {
return this.enLevel;
}
/**
* @param int $enLevel
*/
setEnLevel($enLevel) {
this.enLevel = parseInt($enLevel);
if(!!this.eMgr){
this.eMgr.SetEffectChanged();
}
}
/**
* @return int
*/
getAdLevel() {
return this.adLevel;
}
/**
* @param int $adLevel
*/
setAdLevel($adLevel)
{
this.adLevel = parseInt($adLevel);
if(!!this.eMgr){
this.eMgr.SetEffectChanged();
}
}
/**
* @return {LargeNumberCalculator}
*/
getMoney()
{
return this.money;
}
/**
* @param {LargeNumberCalculator} $money
*/
setMoney($money) {
this.money = $money;
}
/**
* @return int
*/
getLevel() {
return this.level;
}
/**
* @param int $level
*/
setLevel($level)
{
this.level = parseInt($level);
if(!!this.eMgr){
this.eMgr.SetEffectChanged(); //效果发生了改变
}
}
getCardLevel(){
return Math.max(1, this.level);
}
/**
* 当前圣光值
* @return int
*/
getPoint() {
return this.point;
}
/**
* 加点(圣光)
* @param int $point
*/
setPoint($point) {
this.point = parseInt($point);
if(!!this.eMgr){
this.eMgr.SetEffectChanged();
}
}
/**
* 计算战力
* @return {LargeNumberCalculator}
*/
getPower() {
//em_Effect_selfPower在内部已经计算完毕,外部不能重复计算
switch(this.type){
case PotentialType.Equ: //法宝的PVE Attack
this.power = this._getEquPower(this.level);
break;
case PotentialType.CPet: //PVE伙伴的点击攻击力
this.power = (this.parent.parent.core.potentialConfig.getPowerFormula(this.id))(this.level)
.CalcFinallyValue(this.effect(), [em_Effect_Comm.selfPower]);
break;
default:
break;
}
return this.power;
}
/**
* @return {LargeNumberCalculator}
*/
_getEquPower($_level) {
let $power = (this.parent.parent.core.potentialConfig.getEquPowerFormula(this.id))($_level)
.CalcFinallyValue(this.effect(), [em_Effect_Comm.selfPower]) //对自身攻击力的加成
._mul_(1 + 331 * this.point) ;//圣光基础加持,包括基础量331和圣光数量;图腾对圣光的增强放在外围计算
return $power;
}
/**
* 下一个级别的攻击力
* @param {Number} $pm 下一個級別的增幅
* @return {LargeNumberCalculator}
*/
getNextPower($pm) {
if(!$pm){
$pm = 1;
}
switch(this.type){
case PotentialType.Equ: //Equip PVE Attack
return this._getEquPower(parseInt(this.level) + $pm);
default:
return this.power;
}
}
/**
* 转化为能和客户端适配的数据结构
* @param {Number} 下一个等级跨度,默认为1,用于计算"下个等级"战力属性
* @return {PetClientItem}
*
*/
ToClient($pm)
{
if(!$pm){
$pm = 1;
}
let $item = new PetClientItem();
$item.i = this.id;
$item.l = this.getLevel();
$item.p = this.getPoint();
$item.ad = this.adLevel;
$item.en = this.enLevel;
$item.b = this.getPower();
$item.bn = this.getNextPower($pm);
$item.m = this.getMoney();
return $item;
}
//region 效果管理接口
/**
* 针对缘分武将的效果管理器
* @param int $id
* @return {EffectManager}
*
* @todo 尚未实现
*/
effectRelated($id)
{
return new EffectManager();
}
/**
* 通用的效果管理器
*
* @param int $nl 临时计算新的等级
* @return {EffectManager}
*
* @note selfPower做了特殊处理:采用Multi并且连乘的计算模式,例如叠加两个3倍效果则变为 3*3=9 倍,而其他效果为 3+3=6 倍
*/
effect($nl = 0){
if(!this.eMgr || this.eMgr.GetEffectChanged() || $nl > 0){
let $te = new EffectManager();
let $calcLevel = ($nl == 0 ? this.level : $nl);
//重新计算效果
switch(this.type){
case PotentialType.Equ:
{
let $list = this.parent.parent.core.potentialConfig.getList();
for(let $value of $list[this.id]['effects']){
if($calcLevel < $value['level']){
break;
}
let $it = $te.makeItem($value['effect']);
if($it.type == em_Effect_Comm.selfPower){
$te.MultiItem($it);
}
else{
$te.AddItem($it);
}
}
//添加默认效果:逢25和1000倍数额外加成:
let $an = (($calcLevel - 175) / 25) | 0;
if($an >= 1){
let {base, power} = LargeNumberCalculator.Power(4, $an);
$te.MultiItem(new EffectObject(em_Effect_Comm.selfPower, base, 0, power));
}
let $bn = ($calcLevel / 1000) | 0;
if($bn >= 1){
let {base, power} = LargeNumberCalculator.Power(10, $bn);
$te.MultiItem(new EffectObject(em_Effect_Comm.selfPower, base, 0, power));
}
break;
}
case PotentialType.CPet:
let $list = this.parent.parent.core.potentialConfig.getFellowList();
for(let $value of $list[this.id]['effects']){ //统计因等级提升已经解锁的、增加攻击力的技能
if($calcLevel < $value['level']){
break;
}
let $it = $te.makeItem($value['effect']);
if($it.type == em_Effect_Comm.selfPower) {
$te.MultiItem($it);
}
else{
$te.AddItem($it);
}
}
//添加默认技能:逢25和1000倍数额外加成
let $an = (($calcLevel - 175) / 25) | 0;
if($an >= 1){
let {base, power} = LargeNumberCalculator.Power(4, $an);
$te.MultiItem(new EffectObject(em_Effect_Comm.selfPower,base,0,power));
}
let $bn = ($calcLevel / 1000) | 0;
if($bn >= 1){
let {base, power} = LargeNumberCalculator.Power(10, $bn);
$te.MultiItem(new EffectObject(em_Effect_Comm.selfPower, base, 0, power));
}
//额外的技能, 配置信息位于 pCPetList.effect 字段
$list[this.id]['effect'].split(';').map(effect=>{
if(!!effect){
let vs = effect.split(',');
if(!!vs && vs.length == 3){
$te.AddItem(new EffectObject(parseInt(vs[0]), parseFloat(vs[1]) + parseFloat(vs[2])*this.getLevel()));
}
}
});
break;
case PotentialType.Pet:
{
let $list = this.parent.parent.core.potentialConfig.getPetList();
let $params = $list[this.id]['effect'].split(',');
$te.AddItem(new EffectObject(parseInt($params[0]), parseFloat($params[1]) + parseFloat($params[2])*this.getLevel()));
break;
}
case PotentialType.Totem:
{
let $list = this.parent.parent.core.potentialConfig.getTotemList();
let $params = $list[this.id]['effect'].split(',');
$te.AddItem(new EffectObject(parseInt($params[0]), parseFloat($params[1]) + parseFloat($params[2])*this.getLevel()));
break;
}
}
this.eMgr = $te;
}
return this.eMgr;
}
//endregion
}
exports = module.exports = PotentialItem;