修改,特技战力加成通过时装表获得

This commit is contained in:
luying
2020-12-23 20:32:58 +08:00
parent 3732c536d2
commit 557ee27f43
9 changed files with 7353 additions and 802 deletions

View File

@@ -1,12 +1,12 @@
// 时装表
import { decodeArrayListStr, readJsonFile, parseNumberList } from '../util';
import { decodeArrayListStr, readJsonFile } from '../util';
import { FILENAME } from '../../consts';
export interface DicFashions {
// 时装id
readonly id: number;
// 增加的被动技能
readonly seid: Array<number>;
// 指向heroSkill表
readonly skillId: number;
// 全局加成
readonly globalAttr: Array<{id: number, number: number}>;
// 单体加成
@@ -20,7 +20,6 @@ let arr = JSON.parse(str);
export const dicFashions = new Map<number, DicFashions>();
arr.forEach(o => {
o.seid = parseNumberList(o.seid);
o.globalAttr = parseAttr(o.globalAttr);
o.actorAttr = parseAttr(o.actorAttr);
dicFashions.set(o.id, o);

View File

@@ -9,9 +9,9 @@ export interface DicHeroSkill {
// 技能名
readonly name: string;
// 星级解锁
readonly starSeidArr: Array<{star: number, value: number}>;
readonly starSeidArr: Array<{star: number, value: number, type: number}>;
// 觉醒解锁
readonly colorStarSeidArr: Array<{star: number, value: number}>;
readonly colorStarSeidArr: Array<{star: number, value: number, type: number}>;
}
@@ -26,15 +26,15 @@ arr.forEach(o => {
});
function parseSeid(str: string) {
let arr = new Array<{star: number, value: number}>();
let arr = new Array<{star: number, value: number, type: number}>();
if(!str) return arr;
let decodeArr = decodeArrayListStr(str);
for(let [star, value] of decodeArr) {
if(isNaN(parseInt(star)) || isNaN(parseInt(value))) {
for(let [star, value, type] of decodeArr) {
if(isNaN(parseInt(star)) || isNaN(parseInt(value)) || isNaN(parseInt(type))) {
continue;
}
arr.push({ star: parseInt(star), value: parseInt(value)});
arr.push({ star: parseInt(star), value: parseInt(value), type: parseInt(type)});
}
return arr;
}

View File

@@ -30,13 +30,13 @@ export function calPlayerCe(globalCeAttr: CeAttr, hero: HeroType, type: number,
if (type == HERO_SYSTEM_TYPE.INIT) {
reIncAttr = calHeroInitIncAttr(hero, addSeidList, removeSeidList); // args: 升的星盘
} else if (type == HERO_SYSTEM_TYPE.STAR) {
reIncAttr = calHeroStarIncAttr(hero, args, addSeidList); // args: 升的星盘
reIncAttr = calHeroStarIncAttr(hero, args, addSeidList, removeSeidList); // args: 升的星盘
} else if (type == HERO_SYSTEM_TYPE.TRAIN) {
reIncAttr = calHeroTrainIncAttr(hero);
} else if (type == HERO_SYSTEM_TYPE.STAGEUP) {
reIncAttr = calHeroJobStageUpIncAttr(hero, args, addSeidList, removeSeidList )
reIncAttr = calHeroJobStageUpIncAttr(hero, args, addSeidList, removeSeidList );
} else if (type == HERO_SYSTEM_TYPE.SKIN) {
reIncAttr = calHeroWearSkinIncAttr(hero, args);
reIncAttr = calHeroWearSkinIncAttr(hero, args, addSeidList, removeSeidList );
} else if (type == HERO_SYSTEM_TYPE.FAVOUR) {
reIncAttr = calHeroFavourUpIncAttr(hero, args);
} else if (type == HERO_SYSTEM_TYPE.CONNECT) {
@@ -86,6 +86,8 @@ export async function calPlayerCeAndSave(roleId: string, heros: Array<HeroType>,
if (type == HERO_SYSTEM_TYPE.INIT) {
reIncAttr = calRoleInitIncAttr(heros, role.globalCeAttr); // 全局变量增
} else if (type == HERO_SYSTEM_TYPE.ADD_SKIN) {
reIncAttr = calHeroAddSkin(args, role.globalCeAttr);
}
for (let attrName in reIncAttr) {
@@ -110,12 +112,16 @@ export async function calPlayerCeAndSave(roleId: string, heros: Array<HeroType>,
// 初始战力
export function calHeroInitIncAttr(hero: HeroType, addSeidList: Array<number>, removeSeidList: Array<number>) {
let res1 = calHeroStarIncAttr(hero, getAllAttrStage(), addSeidList);
let hero1 = combineHeroCeAttr(hero, res1)
calHeroJobStageUpIncAttr(hero1, [0], addSeidList, removeSeidList);
let res1 = calHeroStarIncAttr(hero, getAllAttrStage(), addSeidList, removeSeidList, true);
let hero1 = combineHeroCeAttr(hero, res1);
console.log(JSON.stringify(res1));
return res1
let curSkin = hero.skins.find(cur => cur.enable);
let res2 = calHeroWearSkinIncAttr(hero1, [curSkin?curSkin.id:0, 0], addSeidList, removeSeidList, true);
let hero2 = combineHeroCeAttr(hero, res2);
calHeroJobStageUpIncAttr(hero2, [0], addSeidList, removeSeidList);
return res2
}
export function calRoleInitIncAttr(heros: HeroType[], globalCeAttr: CeAttr) {
@@ -144,18 +150,28 @@ function combineHeroCeAttr(originalHero: HeroType, result: CeAttr) {
return hero;
}
export function calHeroStarIncAttr (hero: HeroType, args: Array<number>, addSeidList: Array<number>) {
let {star, starStage, quality, colorStar, colorStarStage, ceAttr} = hero;
/**
*
* @param hero HeroType 武将更新后的值
* @param args number[] 参数,表示需要更新多少个维
* @param addSeidList number[] 用于更新被动
* @param removeSeidList number[] 用于更新被动
* @param isInit boolean 是否是初次创建武将
*/
export function calHeroStarIncAttr (hero: HeroType, args: Array<number>, addSeidList: Array<number>, removeSeidList: Array<number>, isInit = false) {
let {star, starStage, quality, colorStar, colorStarStage, ceAttr, skins} = hero;
let originStar = star, originColorStar = colorStar;
let res: CeAttr = {};
const dicHero = gameData.hero.get(hero.hid);
const isWake = colorStar > 0; // 是否觉醒,只要激活了觉醒,彩星就会 > 1
if(isWake) {
if(colorStarStage == ABI_STAGE.START) colorStar = colorStar -1;
if(colorStarStage == ABI_STAGE.START) originColorStar = colorStar - 1;
} else {
if(starStage == ABI_STAGE.START) star = star -1;
if(starStage == ABI_STAGE.START) originStar = star - 1;
}
const dicStar = isWake? getHeroWakeByQuality(quality, colorStar): getHeroStarByQuality(quality, star); // 星级表
const dicStar = isWake? getHeroWakeByQuality(quality, originColorStar): getHeroStarByQuality(quality, originStar); // 星级表
for(let stage of args) {
@@ -174,26 +190,43 @@ export function calHeroStarIncAttr (hero: HeroType, args: Array<number>, addSeid
}
// 解锁技能
if(dicHero.skill){
let {starSeidArr, colorStarSeidArr} = gameData.heroSkill.get(dicHero.skill);
if(isWake) {
for(let {star, value} of starSeidArr){
if(hero.star == star){
addSeidList.push(value, 0);
}
}
} else {
for(let {star, value} of colorStarSeidArr){
if(hero.colorStar == star){
addSeidList.push(value, 0);
}
}
let curSkin = skins.find(cur => cur.enable);
let curSeidList = getSeidListOfFashion(curSkin.id, star, colorStar);
let preSeidList = getSeidListOfFashion(curSkin.id, isInit?0:originStar, isInit?0:originColorStar);
for(let [type, seid] of curSeidList) {
if(!preSeidList.has(type)) {
addSeidList.push(seid, 0);
}
}
for(let [type, seid] of preSeidList) {
console.log(type, seid)
if(!curSeidList.has(type)) {
removeSeidList.push(seid, 0);
}
}
return res;//属性增量可以是多个
}
function getSeidListOfFashion(fashionid: number, originStar: number, originColorStar: number) {
let seidList = new Map<number, number>(); // type => seid
if(!gameData.fashion.has(fashionid)) return seidList;
let { skillId } = gameData.fashion.get(fashionid);
let { starSeidArr, colorStarSeidArr } = gameData.heroSkill.get(skillId);
for(let {star, value, type} of starSeidArr) {
if(originStar >= star) {
seidList.set(type, value);
}
}
for(let {star, value, type} of colorStarSeidArr) {
if(originColorStar >= star) {
seidList.set(type, value);
}
}
return seidList
}
export function getAllAttrStage () {
let attrs = new Array<number>(); // 有升级的属性 1-hp 2-atk 3-def 4-mdef 5-agi 6-luk
for(let stage = ABI_STAGE.START + 1; stage <= ABI_STAGE.END; stage++) {
@@ -238,21 +271,41 @@ export function calHeroJobStageUpIncAttr(hero: HeroType, args: Array<number>, ad
}
//穿戴时装
export function calHeroWearSkinIncAttr(hero: HeroType, args: Array<number>) {
export function calHeroWearSkinIncAttr(hero: HeroType, args: Array<number>, addSeidList: Array<number>, removeSeidList: Array<number>, isInit = false) {
let res: CeAttr = {};
let addSkin = gameData.fashion.get(args[0]);
let delSkin = gameData.fashion.get(args[1]);
let attrName: string;
for (let attr of delSkin.actorAttr) {
attrName = getAtrrNameById(attr.id);
res[attrName] = {fixUp: hero.ceAttr[attrName].fixUp, base: hero.ceAttr[attrName].base, ratioUp: hero.ceAttr[attrName].ratioUp};
res[attrName].fixUp -= attr.number * HERO_CE_RATIO;
if(delSkin) {
for (let attr of delSkin.actorAttr) {
attrName = getAtrrNameById(attr.id);
res[attrName] = {fixUp: hero.ceAttr[attrName].fixUp, base: hero.ceAttr[attrName].base, ratioUp: hero.ceAttr[attrName].ratioUp};
res[attrName].fixUp -= attr.number * HERO_CE_RATIO;
}
}
for (let attr of addSkin.actorAttr) {
attrName = getAtrrNameById(attr.id);
res[attrName] = {fixUp: hero.ceAttr[attrName].fixUp, base: hero.ceAttr[attrName].base, ratioUp: hero.ceAttr[attrName].ratioUp};
res[attrName].fixUp += attr.number * HERO_CE_RATIO;
}
if(!isInit) { // 初始的时候这一段技能在calHeroStarIncAttr里计算了不用重复算
let { star, colorStar } = hero;
let curSeidList = getSeidListOfFashion(args[0], star, colorStar);
let preSeidList = getSeidListOfFashion(args[1], star, colorStar);
for(let [type, seid] of curSeidList) {
if(!preSeidList.has(type)) {
removeSeidList.push(seid, 0);
}
}
for(let [type, seid] of preSeidList) {
if(!curSeidList.has(type)) {
addSeidList.push(seid, 0);
}
}
}
return res;
}
@@ -436,6 +489,8 @@ function getFieldByStage(stage: number, jobid: number) {
// 添加技能增加的被动属性
function addSeidEffect(reIncAttr: CeAttr, heroCeAttr: CeAttr,addSeidList: Array<number>, removeSeidList: Array<number>) {
console.log('addSeidList', addSeidList)
console.log('removeSeidList', removeSeidList)
let otiginalSeidList = [
{list: addSeidList, multi: 1},
{list: removeSeidList, multi: -1}