@@ -7,12 +7,13 @@ import { HERO_SYSTEM_TYPE, ABI_TYPE } from '../consts';
import { deepCopy } from './util' ;
import { HeroModel , HeroType } from '../db/Hero' ;
import { RoleModel } from '../db/Role' ;
import { CeAttrData , CeAttr } from '../db/generalField' ;
import { CeAttrData , CeAttr , CeAttrNumber } from '../db/generalField' ;
import { getAttrNameByJobStage , getAttrCeRatio , getAtrrNameById , ABI_TYPE_TO_STAGE , ABI_STAGE , SEID_TYPE , HERO_ATTR } from '../consts' ;
import { gameData , getJobByGradeAndClass , getHeroWakeByQuality , getHeroStarByQuality , getFriendShipById } from './data' ;
import { Attributes } from './interface' ;
import { DicSe } from './dictionary/DicSe' ;
import { EquipType } from '../db/Equip' ;
import { DicRandomEffectPool } from './dictionary/DicRandomEffectPool' ;
const HERO_CE_RATIO = 100 ;
const _ = require ( 'underscore' ) ;
@@ -38,10 +39,15 @@ export function calPlayerCe(hero: HeroType, type: number, args: Array<number>) {
} else if ( type == HERO_SYSTEM_TYPE . CONNECT ) {
reIncAttr = calHeroConectIncAttr ( hero , args ) ;
} else if ( type == HERO_SYSTEM_TYPE . EQUIP ) {
reIncAttr = calEquipPutOnOffIncAttr ( hero , args , addSeidList , removeSeidList ) ;
} else if ( type == HERO_SYSTEM_TYPE . EQUIP_BASE ) {
reIncAttr = calHeroEquipIncAttr ( hero ) ;
} else if ( type == HERO_SYSTEM_TYPE . RESTRENGTHEN ) {
reIncAttr = calRestrengthenIncAttr ( hero , args . shift ( ) , args , addSeidList , removeSeidList ) ;
}
addSeidEffect ( reIncAttr , addSeidList , removeSeidList ) ; // 处理加值
addSeidEffect ( reIncAttr , hero . ceAttr , addSeidList , removeSeidList ) ; // 处理加值
console . log ( JSON . stringify ( reIncAttr ) )
if ( ! hero . ceAttr ) hero . ceAttr = new CeAttr ( ) ;
for ( let attrName in reIncAttr ) {
let originalAttrData : CeAttrData = hero . ceAttr [ attrName ] || new CeAttrData ( ) ;
@@ -112,13 +118,13 @@ export function calHeroStarIncAttr (hero: HeroType, args: Array<number>, addSeid
if ( isWake ) {
for ( let { star , value } of starSeidArr ) {
if ( hero . star == star ) {
addSeidList . push ( value ) ;
addSeidList . push ( value , 0 );
}
}
} else {
for ( let { star , value } of colorStarSeidArr ) {
if ( hero . colorStar == star ) {
addSeidList . push ( value ) ;
addSeidList . push ( value , 0 );
}
}
}
@@ -149,22 +155,27 @@ export function calHeroTrainIncAttr(hero: HeroType) {
}
return res ;
}
//进阶
export function calHeroJobStageUpIncAttr ( hero : HeroType , args : Array < number > , addSeidList : Array < number > , removeSeidList : Array < number > ) {
export function calHeroJobStageUpIncAttr ( hero : HeroType , args : Array < number > , addSeidList : Array < number > , removeSeidList : Array < number > ) {
let res : CeAttr = { } ;
let lastJob = gameData . job . get ( args [ 0 ] ) ;
let currentJob = gameData . job . get ( hero . job ) ;
addSeidList . concat ( deepCopy ( currentJob . seid ) ) ;
for ( let seid of currentJob . seid ) {
let index = _ . findIndex ( lastJob . seid , seid ) ;
if ( index < 0 ) {
addSeidList . push ( seid , 0 ) ;
}
}
for ( let seid of lastJob . seid ) {
let index = _ . findIndex ( currentJob . seid , seid ) ;
if ( index > 0 ) {
add SeidList. splice ( index , 1 ) ;
} else {
removeSeidList . push ( seid ) ;
if ( index < 0 ) {
remove SeidList. push ( seid , 0 ) ;
}
}
}
return res ;
}
//穿戴时装
export function calWaerHeroSkinIncAttr ( hero : HeroType , args : Array < number > ) {
let res : CeAttr = { } ;
@@ -229,9 +240,52 @@ export function calHeroFavourUpIncAttr(hero: HeroType, args: Array<number>) {
return res ;
}
// 穿脱, removeSeidList原来身上穿着的所有装备的seid, 包括套装的
export function calEquipPutOnOffIncAttr ( hero : HeroType , args : Array < number > , addSeidList : Array < number > , removeSeidList : Array < number > ) {
// 计算身上所有装备的战力值(特技相关以外)
let res = calHeroEquipIncAttr ( hero ) ;
// 计算被动技能
let { ePlace } = hero ;
let suits = new Map < number , number > ( ) ;
for ( let { equip } of ePlace ) {
if ( equip ) {
let e = < EquipType > equip ;
for ( let { seid , rand } of e . randSe ) {
addSeidList . push ( seid , rand ) ;
}
if ( e . suitId > 0 ) {
if ( suits . has ( e . suitId ) ) {
suits . set ( e . suitId , 1 ) ;
} else {
suits . set ( e . suitId , suits . get ( e . suitId ) + 1 ) ;
}
}
}
}
suits . forEach ( ( suitId , count ) = > {
let { effect } = gameData . suit . get ( suitId ) ;
for ( let e of effect ) {
if ( count >= e . count ) {
addSeidList . push ( e . seid , 0 ) ;
}
}
} ) ;
for ( let arg of args ) { removeSeidList . push ( arg ) }
return res
}
// 装备,装备栏升级,装备精炼等涉及到值的
export function calHeroEquipIncAttr ( hero : HeroType ) {
let res : CeAttr = { } ;
let { ePlace } = hero ;
let { ePlace } = hero ;
let attrResult = new CeAttrNumber ( ) ;
for ( let { equip , lv , refineLv } of ePlace ) {
if ( equip ) {
@@ -271,22 +325,41 @@ export function calHeroEquipIncAttr(hero: HeroType) {
// console.log('jewel', valueJewel);
let attr = ( value1 + lv * valueup ) * ( HERO_CE_RATIO + valueRefine ) + valueJewel * HERO_CE_RATIO ;
let originalCe = hero . ceAttr [ attrName ] . equipUp || 0 ;
if ( attr != originalCe ) {
console . log ( '装备战力:' , attr , originalCe ) ;
res [ attrName ] = { fixUp : hero.ceAttr [ attrName ] . fixUp , base : hero.ceAttr [ attrName ] . base , ratioUp : hero.ceAttr [ attrName ] . ratioUp , equipUp : originalCe } ;
console . log ( attr , originalCe )
res [ attrName ] . equipUp += attr * HERO_CE_RATIO - originalCe ;
}
attrResult [ attrName ] += attr ;
}
}
}
for ( let attrName in attrResult ) {
let originalCe = hero . ceAttr [ attrName ] . equipUp || 0 ;
console . log ( '装备战力:' , attrName , attrResult [ attrName ] * HERO_CE_RATIO , originalCe ) ;
res [ attrName ] = { fixUp : hero.ceAttr [ attrName ] . fixUp , base : hero.ceAttr [ attrName ] . base , ratioUp : hero.ceAttr [ attrName ] . ratioUp , equipUp : originalCe } ;
res [ attrName ] . equipUp += attrResult [ attrName ] * HERO_CE_RATIO - originalCe ;
}
return res ;
}
// 洗炼
export function calRestrengthenIncAttr ( hero : HeroType , ePaceId : number , args : Array < number > , addSeidList : Array < number > , removeSeidList : Array < number > ) {
let res : CeAttr = { } ;
let { ePlace } = hero ;
let curPlace = ePlace . find ( cur = > cur . id == ePaceId ) ;
if ( curPlace && curPlace . equip ) {
let e = < EquipType > curPlace . equip ;
for ( let { seid , rand } of e . randSe ) {
addSeidList . push ( seid , rand ) ;
}
}
for ( let arg of args ) { removeSeidList . push ( arg ) }
return res
}
// 根据存在升星表等的stage字段的id对应17维id
function getFieldByStage ( stage : number , jobid : number ) {
let targetAttrId = ABI_TYPE_TO_STAGE . get ( stage ) ;
@@ -300,7 +373,7 @@ function getFieldByStage(stage: number, jobid: number) {
// 添加技能增加的被动属性
function addSeidEffect ( reIncAttr : CeAttr , addSeidList : Array < number > , removeSeidList : Array < number > ) {
function addSeidEffect ( reIncAttr : CeAttr , heroCeAttr : CeAttr , addSeidList : Array < number > , removeSeidList : Array < number > ) {
let otiginalSeidList = [
{ list : addSeidList , multi : 1 } ,
@@ -308,41 +381,55 @@ function addSeidEffect(reIncAttr: CeAttr, addSeidList: Array<number>, removeSeid
] ;
for ( let { list , multi } of otiginalSeidList ) {
let effectList = new Array < DicSe > ( ) ; // any: dic_zyz_se表内容
for ( let seid of list ) {
let dicSeid = gameData . se . get ( seid ) ;
for ( let ii = 0 ; ii < list . length ; ii += 2 ) {
let seid = list [ ii ] ;
let rand = list [ ii + 1 ] || 0 ;
let dicSeid : DicSe | DicRandomEffectPool = gameData . se . get ( seid ) ;
if ( ! dicSeid ) dicSeid = gameData . randomEffectPool . get ( seid ) ;
if ( dicSeid && dicSeid . id > 0 ) {
addSeid ( effectList , dicSeid . id , dicSeid . gainValueArr )
addSeid ( effectList , dicSeid . id , rand , dicSeid . gainValueArr )
}
}
for ( let { type , gainValueArr : [ ability , value ] } of effectList ) {
let attrName = getAtrrNameById ( ability ) ;
if ( ! attrName ) continue
if ( type == SEID_TYPE . TYPE101 ) { // 加值
if ( ! reIncAttr [ HERO_ATTR [ ability ] ] ) {
reIncAttr [ HERO_ATTR [ ability ] ] = new CeAttrData ( ) ;
if ( ! reIncAttr [ attrName ] ) {
reIncAttr [ attrName ] = deepCopy ( heroCeAttr [ attrName ] ) ;
}
reIncAttr [ HERO_ATTR [ ability ] ] . fixUp += value * multi * HERO_CE_RATIO ;
reIncAttr [ attrName ] . fixUp += value * multi * HERO_CE_RATIO ;
delete reIncAttr [ attrName ] . _id ;
} else if ( type == SEID_TYPE . TYPE102 ) { // 加百分比
if ( ! reIncAttr [ HERO_ATTR [ ability ] ] ) {
reIncAttr [ HERO_ATTR [ ability ] ] = new CeAttrData ( ) ;
if ( ! reIncAttr [ attrName ] ) {
reIncAttr [ attrName ] = deepCopy ( heroCeAttr [ attrName ] ) ;
}
reIncAttr [ HERO_ATTR [ ability ] ] . ratioUp += value * multi ;
reIncAttr [ attrName ] . ratioUp += value * multi ;
delete reIncAttr [ attrName ] . _id ;
}
}
}
}
// 获取dic_zyz_se内容
function addSeid ( effectList : Array < any > , seidId :number , seidValue = new Array < number > ( ) ) {
function addSeid ( effectList : Array < any > , seidId :number , rand : number , seidValue = new Array < number > ( ) ) {
// console.log('addSeidEffect', seidId, seidValue)
let curSeid = gameData . se . get ( seidId ) ;
let curSeid : DicSe | DicRandomEffectPool = gameData . se . get ( seidId ) ;
if ( ! curSeid ) curSeid = gameData . randomEffectPool . get ( seidId ) ;
if ( ! curSeid ) { console . log ( "seidId not found:" + seidId ) ; return ; }
if ( ! seidValue ) seidValue = curSeid . gainValueArr ;
if ( curSeid . type === 999) {
if ( curSeid . type === SEID_TYPE . TYPE 999) {
for ( let i = 0 ; i < seidValue . length ; i ++ ) {
addSeid ( effectList , seidValue [ i ] ) ;
addSeid ( effectList , seidValue [ i ] , rand );
}
return ;
}
effectList . push ( curSeid ) ;
let seid : DicSe | DicRandomEffectPool = deepCopy ( curSeid ) ;
if ( curSeid . index > 0 ) {
seid . gainValueArr [ curSeid . index - 1 ] = rand ;
}
effectList . push ( seid ) ;
}