Merge branch 'feature/hero' of gitlab.trgame.cn:zyztech/zyz_server

Conflicts:
	shared/consts/consts.ts
	shared/db/Role.ts
	web-server/app/service/Auth.ts
This commit is contained in:
luying
2020-12-14 11:17:02 +08:00
57 changed files with 18170 additions and 10511 deletions

View File

@@ -655,7 +655,7 @@ export class ComBattleHandler {
// 战斗胜利队长扣减藏宝图 // 战斗胜利队长扣减藏宝图
if (result && teamStatus.capId != 'robot') { if (result && teamStatus.capId != 'robot') {
let res = await ItemModel.decreaseItems(teamStatus.capId, [{id: teamStatus.blueprtId, count: 1}]); let res = await ItemModel.decreaseItems(teamStatus.capId, [{id: teamStatus.blueprtId, count: 1}]);
if (!res) return resResult(STATUS.COM_BATTLE_BLUEPRT_NOT_ENOUGH); if (res.hasError) return resResult(STATUS.COM_BATTLE_BLUEPRT_NOT_ENOUGH);
} }
channel.pushMessage('onTeamComplete', {teamCode, result}); channel.pushMessage('onTeamComplete', {teamCode, result});
this.teamMap.delete(teamCode); this.teamMap.delete(teamCode);
@@ -819,7 +819,7 @@ export class ComBattleHandler {
}); });
// 消耗藏宝图和寻宝币 // 消耗藏宝图和寻宝币
const rec = await ItemModel.decreaseItems(roleId, original); const rec = await ItemModel.decreaseItems(roleId, original);
if(!rec) { if(rec.hasError) {
return resResult(STATUS.BATTLE_CONSUMES_NOT_ENOUGH); return resResult(STATUS.BATTLE_CONSUMES_NOT_ENOUGH);
} }

View File

@@ -1,7 +1,6 @@
import {Application, BackendSession} from 'pinus'; import {Application, BackendSession} from 'pinus';
import { HeroModel } from '../../../db/Hero'; import { HeroModel } from '../../../db/Hero';
import Actor from '../../../pubUtils/actor'; import Actor from '../../../pubUtils/actor';
import { updateCe } from '../../../pubUtils/util';
export default function(app: Application) { export default function(app: Application) {
return new ChatHandler(app); return new ChatHandler(app);
@@ -11,14 +10,6 @@ export class ChatHandler {
constructor(private app: Application) { constructor(private app: Application) {
} }
async test(msg: {}, session: BackendSession) {
let roleId = session.get('roleId')
let hero = await HeroModel.find().limit(1000);
for(let h of hero) {
await updateCe(h.roleId, h);
}
return 'success'
}
/** /**
* Send messages to users * Send messages to users
* *

View File

@@ -0,0 +1,435 @@
import {Application, BackendSession, createTcpMailBox, ChannelService} from 'pinus';
import { handleCost } from '../../../services/rewardService';
import { calPlayerCeAndSave, getAllAttrStage } from '../../../services/playerCeService';
import { resResult, getItems, decodeStr } from '../../../pubUtils/util';
import { STATUS } from '../../../consts/statusCode';
import {HeroModel} from '../../../db/Hero';
import {CURRENCY_BY_TYPE, CURRENCY_TYPE, ITID, CONSUME_TYPE, HERO_GROW_MAX, HERO_SYSTEM_TYPE} from '../../../consts/consts';
import {getJobInfoById, getMaxGradeByjobClass, getHidAndLevelByShipId, getHeroInfoById, getGoodById, getHeroExpByLv, getGamedata, getJobByGradeAndClass, getFriendShipById, getFriendShipLevels, getFashionsById, getHeroLvByExp} from '../../../pubUtils/gamedata';
import { ABI_STAGE } from '../../../consts/abilityConst';
import { RoleModel } from '../../../db/Role';
const _ = require('underscore');
export default function(app: Application) {
return new HeroHandler(app);
}
export class HeroHandler {
constructor(private app: Application) {
}
private channelService: ChannelService = this.app.get('channelService');
public async test(msg: { id: number, count: number}, session: BackendSession) {
let roleId: string = session.get('roleId');
let roleName: string = session.get('roleName');
let sid: string = session.get('sid');
let {id, count} = msg;
let result = await handleCost(roleId, sid, [{id, count}] );
if(!result) {
return resResult(STATUS.BATTLE_CONSUMES_NOT_ENOUGH);
}
return resResult(STATUS.SUCCESS);
}
// 武将碎片合成
public async compose(msg: { hid: number}, session: BackendSession) {
let roleId: string = session.get('roleId');
let roleName: string = session.get('roleName');
let sid: string = session.get('sid');
let serverId: number = session.get('serverId');
let {hid} = msg;
// 检查是否存在武将
let hasHero = await HeroModel.findByHidAndRole(hid, roleId);
if(hasHero) return resResult(STATUS.ROLE_HERO_EXISTS);
// 根据dic_hero 获得 1. 碎片id 2. 碎片数量 3. 初始武将星级 4. 初始品质
let dicHero = getHeroInfoById(hid);
if(!dicHero) return resResult(STATUS.ROLE_INFO_NOT_FOUND);
let {pieceId, quality, initialStars: star, pieceCount, jobid: job, name: hName} = dicHero;
// 碎片数量是否足够
let costResult = await handleCost(roleId, sid, [{id: pieceId, count: pieceCount}]);
if(!costResult) return resResult(STATUS.ROLE_MATERIAL_NOT_ENOUGH);
// createHero
let curHero = await HeroModel.createHero({
roleId, serverId, roleName, hid, hName, star, quality, job
}, false);
await calPlayerCeAndSave(sid, roleId, [curHero], HERO_SYSTEM_TYPE.STAR, getAllAttrStage());
return resResult(STATUS.SUCCESS, {curHero});
}
// 武将升级
public async lvUp(msg: { hid: number, type: number, material: Array<{id: number, count: number}>}, session: BackendSession) {
let roleId: string = session.get('roleId');
let sid: string = session.get('sid');
let { hid, type, material } = msg;
let addLv = 0;
if(type == 1) {
addLv = 1;
} else if(type == 5) {
addLv = 5;
} else {
return resResult(STATUS.ROLE_HERO_LV_TYPE_ERROR);
}
// 计算得材料可转换的经验
let allExp = 0;
for(let {id, count} of material) {
let dicGoods = getGoodById(id);
if(!dicGoods) return resResult(STATUS.ROLE_INFO_NOT_FOUND);
let dicItid = ITID.get(dicGoods.itid);
if(!dicItid || dicItid.type != CONSUME_TYPE.EXP) {
return resResult(STATUS.ROLE_METERIAL_ERROR);
}
allExp += count * dicGoods.value;
}
// 计算武将可以升的级数
let hero = await HeroModel.findByHidAndRole(hid, roleId, false);
if(!hero) return resResult(STATUS.ROLE_HERO_NOT_EXISTS);
let {lv: playerLv} = await RoleModel.findByRoleId(roleId);
let {lv: oldLv, exp: oldExp} = hero;
if(oldLv + addLv > playerLv ) return resResult(STATUS.ROLE_HERO_LV_OVER);
oldExp += allExp;
let newExp = oldExp + allExp; // 加上经验书可以达到的经验
let newLv = getHeroLvByExp(newExp);
if(newLv < oldLv + addLv) {
return resResult(STATUS.ROLE_EXP_NOT_ENOUGH);
}
let costResult = await handleCost(roleId, sid, material);
if(!costResult) return resResult(STATUS.ROLE_MATERIAL_NOT_ENOUGH);
hero.lv = playerLv > newLv?newLv: playerLv;
hero.exp = newExp;
let heros = await calPlayerCeAndSave(sid, roleId, [hero], HERO_SYSTEM_TYPE.STAR, getAllAttrStage());
const curHero = {
hid, lv : heros[0].lv, exp : heros[0].exp
}
return resResult(STATUS.SUCCESS, { curHero });
}
// 武将升星
public async starUp(msg: { hid: number, star: number, starStage: number}, session: BackendSession) {
let roleId: string = session.get('roleId');
let sid: string = session.get('sid');
let {hid, star, starStage} = msg;
// 根据dic_hero 获得 1. 碎片id 2. 碎片数量 3. 初始武将星级 4. 初始品质
let dicHero = getHeroInfoById(hid);
if(!dicHero) return resResult(STATUS.ROLE_INFO_NOT_FOUND);
let {pieceId} = dicHero;
let hero = await HeroModel.findByHidAndRole(hid, roleId, false);
if(!hero) return resResult(STATUS.ROLE_HERO_NOT_EXISTS);
let {star: oldStar, starStage: oldStarStage, quality} = hero;
if(oldStar != star || oldStarStage != starStage) {
return resResult(STATUS.WRONG_PARMS);
}
if(oldStar == HERO_GROW_MAX.STAR) {
return resResult(STATUS.ROLE_STAR_REACH_MAX);
}
// 根据dic_zyz_hero_star 计算需要花的碎片并检查碎片数量
const dicHeroStar = getGamedata('dic_zyz_hero_star');
const curDicHeroStar = dicHeroStar.find(cur => cur.quality == quality && cur.star && oldStar);
if(!curDicHeroStar) return resResult(STATUS.ROLE_INFO_NOT_FOUND);
let costResult = await handleCost(roleId, sid, [{id: pieceId, count: curDicHeroStar.advanceUpFragmentNum}]);
if(!costResult) return resResult(STATUS.ROLE_MATERIAL_NOT_ENOUGH);
let isUpStar = oldStarStage + 1 == ABI_STAGE.END;
hero.star = isUpStar? oldStar + 1: oldStar;
hero.starStage = isUpStar? ABI_STAGE.START: oldStarStage + 1;
let heros = await calPlayerCeAndSave(sid, roleId, [hero], HERO_SYSTEM_TYPE.STAR, [isUpStar? ABI_STAGE.END: hero.starStage]);
const curHero = {
hid,
star : heros[0].star,
starStage : heros[0].starStage,
colorStar: heros[0].colorStar,
colorStarStage: heros[0].colorStarStage
}
return resResult(STATUS.SUCCESS, {isUpStar, curHero});
}
// 武将升品
public async qualityUp(msg: { hid: number, quality: number }, session: BackendSession) {
let roleId: string = session.get('roleId');
let sid: string = session.get('sid');
let {hid, quality} = msg;
let dicHero = getHeroInfoById(hid);
if(!dicHero) return resResult(STATUS.ROLE_INFO_NOT_FOUND);
// 根据dic_hero 获得 碎片id
let {pieceId} = dicHero;
let hero = await HeroModel.findByHidAndRole(hid, roleId, false);
if(!hero) return resResult(STATUS.ROLE_HERO_NOT_EXISTS);
let {quality: oldQuality, star} = hero;
if(quality != oldQuality) {
return resResult(STATUS.WRONG_PARMS);
}
if(oldQuality == HERO_GROW_MAX.QUALITY) {
return resResult(STATUS.ROLE_QUALITY_REACH_MAX);
}
if(star != HERO_GROW_MAX.STAR ) {
return resResult(STATUS.ROLE_STAR_NOT_ENOUGH);
}
// 根据dic_zyz_hero_quality_up 获得需要的材料
let dicHeroQualityUp = getGamedata('dic_zyz_hero_quality_up');
const curDicHeroQualityUp = dicHeroQualityUp.find(cur => cur.quality == quality);
if(!curDicHeroQualityUp) return resResult(STATUS.ROLE_INFO_NOT_FOUND);
let {fragmentNum} = curDicHeroQualityUp;
let costResult = await handleCost(roleId, sid, [{id: pieceId, count: fragmentNum}]);
if(!costResult) return resResult(STATUS.ROLE_MATERIAL_NOT_ENOUGH);
hero.quality ++;
let heros = await calPlayerCeAndSave(sid, roleId, [hero], HERO_SYSTEM_TYPE.STAR, getAllAttrStage());
const curHero = {
hid,
quality : heros[0].quality
}
return resResult(STATUS.SUCCESS, {curHero});
}
// 武将觉醒
public async wakeUp(msg: { hid: number, colorStar: number, colorStarStage: number}, session: BackendSession) {
let roleId: string = session.get('roleId');
let sid: string = session.get('sid');
let {hid, colorStar, colorStarStage} = msg;
// 根据dic_hero 获得 1. 碎片id 2. 碎片数量 3. 初始武将星级 4. 初始品质
let dicHero = getHeroInfoById(hid);
if(!dicHero) return resResult(STATUS.ROLE_INFO_NOT_FOUND);
let {pieceId} = dicHero;
let hero = await HeroModel.findByHidAndRole(hid, roleId, false);
if(!hero) return resResult(STATUS.ROLE_HERO_NOT_EXISTS);
let {colorStar: oldColorStar, colorStarStage: oldColorStarStage, star, quality} = hero;
if(colorStar != oldColorStar || colorStarStage != oldColorStarStage) {
return resResult(STATUS.WRONG_PARMS);
}
if(star != HERO_GROW_MAX.STAR) {
return resResult(STATUS.ROLE_WAKE_STAR_NOT_ENOUGH);
}
if(quality != HERO_GROW_MAX.QUALITY) {
return resResult(STATUS.ROLE_QUALITY_NOT_ENOUGH);
}
// 根据dic_zyz_hero_wake 计算需要花的碎片并检查碎片数量
const dicHeroStar = getGamedata('dic_zyz_hero_wake');
const curDicHeroStar = dicHeroStar.find(cur => cur.quality == quality && cur.star == oldColorStar);
if(!curDicHeroStar) return resResult(STATUS.ROLE_INFO_NOT_FOUND);
let {fragmentNum, consume} = curDicHeroStar;
let consumeArr = decodeStr('cost', consume);
// console.log(JSON.stringify([{id: pieceId, count: fragmentNum}, ...consumeArr]))
let costResult = await handleCost(roleId, sid, [{id: pieceId, count: fragmentNum}, ...consumeArr]);
if(!costResult) return resResult(STATUS.ROLE_MATERIAL_NOT_ENOUGH);
let isUpStar = oldColorStar == 0|| oldColorStarStage + 1 == ABI_STAGE.END;
hero.colorStar = isUpStar? oldColorStar + 1: oldColorStar;
hero.colorStarStage = isUpStar? ABI_STAGE.START: oldColorStarStage + 1;
let args = new Array<number>();
if(oldColorStarStage + 1 == ABI_STAGE.END) {
args = getAllAttrStage();
} else {
args.push(isUpStar? ABI_STAGE.END: hero.colorStarStage)
}
let heros = await calPlayerCeAndSave(sid, roleId, [hero], HERO_SYSTEM_TYPE.STAR, args);
const curHero = {
hid,
star : heros[0].star,
starStage : heros[0].starStage,
colorStar: heros[0].colorStar,
colorStarStage: heros[0].colorStarStage
}
return resResult(STATUS.SUCCESS, {isUpStar, curHero});
}
//训练
async heroJobTrain (msg: {hid:number}, session: BackendSession) {
let roleId: string = session.get('roleId');
let sid: string = session.get('sid');
let { hid } = msg;
let hero = await HeroModel.findByHidAndRole(hid, roleId, false);
if (!hero)
return resResult(STATUS.HERO_NOT_FIND);
let heroJob = getJobInfoById(hero.job);
let nextHeroJob = getJobByGradeAndClass(heroJob.job_class, heroJob.grade + 1);
if (nextHeroJob.unlockLevel > hero.lv)
return resResult(STATUS.NOT_REACH_UNLOCK_LEVEL);
if (hero.jobStage >= 6)
return resResult(STATUS.HERO_JOB_STAGE_REACH_MAX_STAGE);
if (hero.job >= getMaxGradeByjobClass(heroJob.job_class))
return resResult(STATUS.HERO_JOB_REACH_MAX_STAGE);
let cousumeGoods = getItems(heroJob.trainingConsume);
let result = await handleCost(roleId, sid, cousumeGoods);
if(!result) {
return resResult(STATUS.BATTLE_CONSUMES_NOT_ENOUGH);
}
hero.jobStage = hero.jobStage ++;
//重算战力并下发
let heros = await calPlayerCeAndSave(sid, roleId, [hero]);
return resResult(STATUS.SUCCESS, { hid : heros[0].hid, job : heros[0].job, jobStage : heros[0].jobStage});
}
//进阶
async heroJobStageUp(msg: {hid:number}, session: BackendSession) {
let roleId: string = session.get('roleId');
let sid: string = session.get('sid');
let { hid } = msg;
let hero = await HeroModel.findByHidAndRole(hid, roleId, false);
if (!hero)
return resResult(STATUS.HERO_NOT_FIND);
let heroJob = getJobInfoById(hero.job);
let nextHeroJob = getJobByGradeAndClass(heroJob.job_class, heroJob.grade + 1);
if (nextHeroJob.unlockLevel > hero.lv)
return resResult(STATUS.NOT_REACH_UNLOCK_LEVEL);
if (hero.job >= getMaxGradeByjobClass(heroJob.job_class))
return resResult(STATUS.HERO_JOB_REACH_MAX_STAGE);
let cousumeGoods = getItems(heroJob.upGradeConsume);
let result = await handleCost(roleId, sid, cousumeGoods);
if(!result) {
return resResult(STATUS.BATTLE_CONSUMES_NOT_ENOUGH);
}
hero.job = nextHeroJob.jobid;
hero.jobStage = 0;
//重算战力并下发
let heros = await calPlayerCeAndSave(sid, roleId, [hero]);
return resResult(STATUS.SUCCESS, { hid : heros[0].hid, job : heros[0].job, jobStage : heros[0].jobStage});
}
//激活羁绊
async heroConectionActivate(msg: {shipId: number}, session: BackendSession) {
let roleId: string = session.get('roleId');
let sid: string = session.get('sid');
let { shipId } = msg;
let shipHidAndLevel = getHidAndLevelByShipId(shipId);
if (!shipHidAndLevel)
return resResult(STATUS.HERO_CONECTION_IS_NOT_EXIT);
let hero = await HeroModel.findByHidAndRole(shipHidAndLevel.actorId, roleId, false);
if (!hero)
return resResult(STATUS.HERO_NOT_FIND);
let flag = true;
let level = 1;
for (let conection of hero.conections) {
if (conection.shipId == shipId ) {
if (conection.level >= shipHidAndLevel.level) {
return resResult(STATUS.HERO_CONECTION_IS_MAX_LEVEL);
} else {
flag = false;
conection.level++;
level = conection.level;
}
}
}
if (!!flag) {
hero.conections.push({shipId,level});
}
let friendShip = getFriendShipById(shipId, level);
if (hero.star < friendShip.level)
return resResult(STATUS.NOT_REACH_UNLOCK_LEVEL);
let hids = friendShip.hids;
for (let hid of hids) {
if (hid == shipHidAndLevel.actorId)
continue;
let member = await HeroModel.findByHidAndRole(hid, roleId, false);
if (!member)
return resResult(STATUS.ROLE_SHORT_HERO_CONECTION);
if (member.star < friendShip.level)
return resResult(STATUS.NOT_REACH_UNLOCK_LEVEL);
}
let result = await handleCost(roleId, sid, [{id: CURRENCY_BY_TYPE.get(CURRENCY_TYPE.COIN), count:5000}]);
if(!result) {
return resResult(STATUS.BATTLE_CONSUMES_NOT_ENOUGH);
}
//重算战力并下发
let heros = await calPlayerCeAndSave(sid, roleId, [hero]);
return resResult(STATUS.SUCCESS, { hid : heros[0].hid, conections : heros[0].conections});
}
//赠送(包括一键赠送)
async heroGiveFavor(msg: {hid:number, items:Array<{id : number,count : number}>}, session: BackendSession) {
let roleId: string = session.get('roleId');
let sid: string = session.get('sid');
let { hid, items } = msg;
let hero = await HeroModel.findByHidAndRole(hid, roleId, false);
if (!hero)
return resResult(STATUS.HERO_NOT_FIND);
let friendShipLevels = getFriendShipLevels();
if (friendShipLevels[friendShipLevels.length - 1].level <= hero.favourLv)
return resResult(STATUS.HERO_FAVOUR_LEVEL_REACH_MAXT);
//计算消耗物品转化的经验
let exp:number = 0;
for (let item of items) {
let itemInfo = getGoodById(item.id);
if (itemInfo.itid == CONSUME_TYPE.FAVOUR) {
exp += itemInfo.value;
} else {
return resResult(STATUS.WRONG_PARMS);
}
}
hero.favour += exp;
for (let friendShipLevel of friendShipLevels) {
if (friendShipLevel.level < hero.favourLv)
continue;
if (friendShipLevel.exp > hero.favour)
break;
hero.favour -= friendShipLevel.exp;
hero.favourLv++;
}
let result = await handleCost(roleId, sid, items);
if(!result) {
return resResult(STATUS.BATTLE_CONSUMES_NOT_ENOUGH);
}
//重算战力并下发
let heros = await calPlayerCeAndSave(sid, roleId, [hero]);
return resResult(STATUS.SUCCESS, { hid : heros[0].hid, favour : heros[0].favour, favourLv : heros[0].favourLv});
}
//穿带时装
async heroWearSkin(msg: {id:number}, session: BackendSession) {
let roleId: string = session.get('roleId');
let sid: string = session.get('sid');
let { id } = msg;
let skinInfo = getFashionsById(id);
if (!skinInfo)
return resResult(STATUS.HERO_SKIN_NOT_FIND);
let hero = await HeroModel.findByHidAndRole(skinInfo.actorId, roleId, false);
if (!hero)
return resResult(STATUS.HERO_NOT_FIND);
let result = false;
for (let skin of hero.skins) {
if (skin.id == id) {
skin.enable = true;
result = true;
} else {
skin.enable = false;
}
}
if (!result) {
return resResult(STATUS.HERO_SKIN_NOT_FIND);
}
await calPlayerCeAndSave(sid, roleId, [hero]);
return resResult(STATUS.SUCCESS, { hid : hero.hid, skins : hero.skins});
}
}

View File

@@ -30,17 +30,16 @@ export class RoleHandler {
} }
async initHeros(roleId: string, roleName: string) { async initHeros(roleId: string, roleName: string) {
const seqId = await CounterModel.getNewCounter(COUNTER.HID);
let ce = calculateCE({hid: 1, lv: 1});
const heroInfo = { const heroInfo = {
roleId, roleId,
roleName, roleName,
hid: 1, hid: 1,
hName: '曹操', hName: '曹操',
seqId, quality: 1,
job: 1,
star: 0, star: 0,
ce serverId: 1
} }
await HeroModel.createHero(heroInfo); await HeroModel.createHero(heroInfo);
} }

View File

@@ -204,8 +204,8 @@ async function checkCond(roleId: string, heroes, type: number, param: number, cn
switch (type) { switch (type) {
case 1: case 1:
for(let seqId of heroes) { for(let seqId of heroes) {
const {star, fire} = await HeroModel.findBySeqIdAndRole(seqId, roleId); const {star, colorStar} = await HeroModel.findBySeqIdAndRole(seqId, roleId);
if (star + fire >= param) { if (star + colorStar >= param) {
heroCnt++; heroCnt++;
} }
} }

View File

@@ -5,7 +5,8 @@ import { PvpDefenseModel } from '../db/PvpDefense';
import { getWarJsons, getGamedata, getExpeditionById } from '../pubUtils/gamedata'; import { getWarJsons, getGamedata, getExpeditionById } from '../pubUtils/gamedata';
import { decodeStr, resResult, setLocalHours, shouldRefresh } from '../pubUtils/util'; import { decodeStr, resResult, setLocalHours, shouldRefresh } from '../pubUtils/util';
import { WAR_JSON_ATTRIBUTE_TYPE, EXPEDITION_CONST } from '../consts/consts'; import { EXPEDITION_CONST } from '../consts/consts';
import { getAtrrNameById} from '../consts/abilityConst';
import Actor from '../pubUtils/actor'; import Actor from '../pubUtils/actor';
import { ExpeditionWarRecordModel } from '../db/ExpeditionWarRecord'; import { ExpeditionWarRecordModel } from '../db/ExpeditionWarRecord';
@@ -143,7 +144,7 @@ export function decodeWarJsonAttribute(attribute: string) {
let obj = {hp: 0, atk: 0, matk: 0, def: 0, mdef: 0, speed: 0, agi: 0, luk: 0, hit: 0, cri: 0, flee: 0, antCri: 0, damageIncrease: 0, damageDecrease: 0, defIngnore: 0, bloodSuck: 0} let obj = {hp: 0, atk: 0, matk: 0, def: 0, mdef: 0, speed: 0, agi: 0, luk: 0, hit: 0, cri: 0, flee: 0, antCri: 0, damageIncrease: 0, damageDecrease: 0, defIngnore: 0, bloodSuck: 0}
for(let {id, value} of arr) { for(let {id, value} of arr) {
let field = WAR_JSON_ATTRIBUTE_TYPE[id]; let field = getAtrrNameById(id);
if(field) { if(field) {
obj[field] = value; obj[field] = value;
} }

View File

@@ -0,0 +1,219 @@
/**
* 体力系统
*/
import { HERO_SYSTEM_TYPE } from '../consts/consts';
import { pinus } from 'pinus';
import { STATUS } from '../consts/statusCode';
import { resResult } from '../pubUtils/util';
import Hero from '../db/Hero';
import { RoleModel } from '../db/Role';
import { CeAttrData, CeAttr } from '../db/BaseModel';
import { getJobInfoById, getJobByGradeAndClass, getHeroInfoById, getHeroStar, getHeroWake, getFiendShipLevel, getFriendShipById, getHeroSkillById, getSeidById } from '../pubUtils/gamedata';
import { getAttrNameByJobStage, getAttrCeRatio, getAtrrNameById, ABI_TYPE_TO_STAGE, ABI_STAGE, SEID_TYPE, HERO_ATTR} from '../consts/abilityConst';
const HERO_CE_RATIO = 100;
//战力计算TODO
export function calPlayerCe(hero: any, type: number, args: Array<number>) {
let incCe = 0;
let incArr = {};
let reIncAttr = {}; // {"hp": {"base": number, "fixUp": number, "ratioUp": number}}
let addSeidList = new Array<number>();
let removeSeidList = new Array<number>();
if (type == HERO_SYSTEM_TYPE.STAR) {
reIncAttr = calHeroStarIncAttr(hero, args, addSeidList, removeSeidList); // args: 升的星盘
} else if (type == HERO_SYSTEM_TYPE.TRAIN) {
reIncAttr = calHeroTrainIncAttr(hero);
}
addSeidEffect(reIncAttr, addSeidList, removeSeidList); // 处理加值
if(!hero.ceAttr) hero.ceAttr = new CeAttr();
for (let attrName in reIncAttr) {
let originalAttrData: CeAttrData = hero.ceAttr[attrName]||new CeAttrData();
let oldCe = originalAttrData.fixUp * HERO_CE_RATIO + originalAttrData.base *(HERO_CE_RATIO + originalAttrData.ratioUp)
if(!hero.ceAttr[attrName]) hero.ceAttr[attrName] = new CeAttrData();
for (let attrKey in reIncAttr[attrName]) {
hero.ceAttr[attrName][attrKey] = parseInt(reIncAttr[attrName][attrKey]);
}
incArr[attrName] = reIncAttr[attrName].fixUp * HERO_CE_RATIO + reIncAttr[attrName].base *(HERO_CE_RATIO + reIncAttr[attrName].ratioUp) - oldCe; //计算属性
incCe += incArr[attrName] * getAttrCeRatio(attrName);
}
hero.ce += incCe;
return incCe;
}
//修改并下发战力
export async function calPlayerCeAndSave(sid: string, roleId: string, heros: Array<any>, type?: number, args?: Array<number>) {
let incPlayerCe = 0;
let pushHeros = [];
for (let hero of heros) {
let incHeroCe = calPlayerCe(hero, type, args);
incPlayerCe += incHeroCe;
await hero.save();
pushHeros.push({
hid: hero.hid,
ce: hero.ce,
incHeroCe : incHeroCe,
});
}
let role = await RoleModel.findByRoleId(roleId);
role.ce += incPlayerCe;
await RoleModel.updateRoleInfo(roleId, role);
//下发战力
let uids = [{ uid: roleId, sid }];
pinus.app.get('channelService').pushMessageByUids('onPlayerCeUpdate', resResult(STATUS.SUCCESS, { ce: role.ce, heros: pushHeros, topFiveCe: 0 }), uids);
return heros;
}
export function calHeroStarIncAttr (hero: Hero, args: Array<number>, addSeidList: Array<number>, removeSeidList: Array<number>) {
let {star, starStage, quality, colorStar, colorStarStage, ceAttr} = hero;
let res = {};
const dicHero = getHeroInfoById(hero.hid);
const isWake = colorStar > 0; // 是否觉醒,只要激活了觉醒,彩星就会 > 1
if(isWake) {
if(colorStarStage == ABI_STAGE.START) colorStar = colorStar -1;
} else {
if(starStage == ABI_STAGE.START) star = star -1;
}
const dicStar = isWake? getHeroWake(quality, colorStar): getHeroStar(quality, star); // 星级表
for(let stage of args) {
let targetAttrId = getFieldByStage(stage, hero.job); // 转换为17维的属性id
let heroAttr = dicHero.baseAbilityArr[targetAttrId]; // 武将表hp等
let heroUpAttr = dicHero.baseAbilityUpArr[targetAttrId]; // 武将表hp_up等
let starUp = dicStar.ceAttr.get(stage);
let newBase = heroAttr + hero.lv * (heroUpAttr + starUp);
let field = getAtrrNameById(targetAttrId);
let ceAttrData: CeAttrData = ceAttr[field]||new CeAttrData(); // 存表中的属性下的basefixupratioup
let {ratioUp = 0, fixUp = 0} = ceAttrData;
res[field] = { base: newBase, ratioUp, fixUp}; // base变动增量为△base * ratio + 0
}
// 解锁技能
if(dicHero.skill){
let {starSeidArr, colorStarSeidArr} = getHeroSkillById(dicHero.skill);
if(isWake) {
for(let {star, value} of starSeidArr){
if(hero.star == star){
addSeidList.push(value);
}
}
} else {
for(let {star, value} of colorStarSeidArr){
if(hero.colorStar == star){
addSeidList.push(value);
}
}
}
}
return res;//属性增量可以是多个
}
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++) {
attrs.push(stage)
};
return attrs;
}
export function calHeroTrainIncAttr(hero: any) {
let res = {};
let attrName: string = getAttrNameByJobStage(hero.jobStage);
res[attrName] = {fixUp: hero.CeAttr[attrName].fixUp, base: hero.CeAttr[attrName].base, ratioUp: hero.CeAttr[attrName].ratioUp};
let currentJob = getJobInfoById(hero.job);
if (currentJob.grade > 1) {
let jobGradeAndClass = getJobByGradeAndClass(currentJob.job_class, currentJob.grade - 1);
let lastJob = getJobInfoById(jobGradeAndClass.jobid);
res[attrName].fixUp += (currentJob[attrName] - lastJob[attrName]) * HERO_CE_RATIO;
} else {
res[attrName].fixUp += currentJob[attrName] * HERO_CE_RATIO;
}
return res;
}
export function calHeroJobStageUpIncAttr(hero: any) {
let res = {};
return res;
}
export function calWaerHeroSkinIncAttr(hero: any) {
let res = {};
let friendShipLevel = getFiendShipLevel(hero.favourLv);
hero.conections.forEach(element => {
let reFriendShip = getFriendShipById(element.shipId, element.level);
if (reFriendShip)
getAtrrNameById(reFriendShip);
});
if (hero.favourLv > 1) {
} else {
}
return res;
}
// 根据存在升星表等的stage字段的id对应17维id
function getFieldByStage(stage: number, jobid: number) {
let targetAttrId = ABI_TYPE_TO_STAGE.get(stage);
if(typeof targetAttrId === 'number') {
return targetAttrId
} else {
const dicJob = getJobInfoById(jobid);
return targetAttrId(dicJob.type);
}
}
// 添加技能增加的被动属性
function addSeidEffect(reIncAttr: CeAttr, addSeidList: Array<number>, removeSeidList: Array<number>) {
let otiginalSeidList = [
{list: addSeidList, multi: 1},
{list: removeSeidList, multi: -1}
];
for(let {list, multi} of otiginalSeidList) {
let effectList = new Array<any>(); // any: dic_zyz_se表内容
for(let seid of list) {
let dicSeid = getSeidById(seid);
if(dicSeid && dicSeid.id > 0){
addSeid(effectList, dicSeid.id, dicSeid.gainValueArr)
}
}
for(let {type, gainValueArr: [ability, value]} of effectList) {
if(!reIncAttr[HERO_ATTR[ability]]) {
reIncAttr[HERO_ATTR[ability]] = new CeAttrData();
}
if(type == SEID_TYPE.TYPE101) { // 加值
reIncAttr[HERO_ATTR[ability]].ratioUp += value * multi;
} else if (type == SEID_TYPE.TYPE102) { // 加百分比
reIncAttr[HERO_ATTR[ability]].fixUp += value * multi;
}
}
}
}
// 获取dic_zyz_se内容
function addSeid(effectList: Array<any>, seidId:number, seidValue = new Array<number>()){
// console.log('addSeidEffect', seidId, seidValue)
let curSeid = getSeidById(seidId);
if(!curSeid) {console.log("seidId not found:"+seidId);return;}
if(!seidValue) seidValue = curSeid.gainValueArr;
if(curSeid.type === 999){
for(let i = 0;i < seidValue.length;i++){
addSeid(effectList, seidValue[i]);
}
return;
}
effectList.push(curSeid);
}

View File

@@ -1,11 +1,13 @@
import { GOOD_TYPE, ITID, CURRENCY, CURRENCY_TYPE, COUNTER } from './../consts/consts'; import { GOOD_TYPE, ITID, CURRENCY, CURRENCY_TYPE, COUNTER } from './../consts/consts';
import { EquipModel } from './../db/Equip'; import { EquipModel } from './../db/Equip';
import { CounterModel } from './../db/Counter'; import { CounterModel } from './../db/Counter';
import { decodeStr } from '../pubUtils/util'; import { decodeStr, resResult } from '../pubUtils/util';
import { getGoodById } from '../pubUtils/gamedata'; import { getGoodById } from '../pubUtils/gamedata';
import { RoleModel } from '../db/Role'; import { RoleModel } from '../db/Role';
import { setAp } from './actionPointService'; import { setAp } from './actionPointService';
import { ItemModel } from '../db/Item'; import { ItemModel } from '../db/Item';
import { STATUS } from '../consts/statusCode';
import { pinus } from 'pinus';
export async function handleFixedReward(roleId: string, roleName: string, rewardStr: string, multi: number) { export async function handleFixedReward(roleId: string, roleName: string, rewardStr: string, multi: number) {
let reward = decodeStr('fixReward', rewardStr); let reward = decodeStr('fixReward', rewardStr);
@@ -120,3 +122,57 @@ async function rewardCurrency (roleId: string, dicGood: any, data: {id:number,cn
}); });
return goods; return goods;
} }
export async function handleCost(roleId: string, sid: string, goods: Array<{id: number, count: number}>) {
// 检查道具数量
let role, costGold = 0, costCoin = 0, items = new Array<{id: number, count: number}>(), ids = new Array<number>() ;
for(let {id, count} of goods) {
let goodInfo = getGoodById(id);
if(goodInfo.goodType == GOOD_TYPE.CONSUMES|| goodInfo.goodType == GOOD_TYPE.SCRIPT) { // 消耗品
let {isCurrency} = ITID.get(goodInfo.itid);
if(isCurrency) { // 货币
if(!role) role = await RoleModel.findByRoleId(roleId);
let dicCurrency = CURRENCY.get(id);
if(dicCurrency.type == CURRENCY_TYPE.GOLD) { // 处理元宝
if(role.gold < count + costGold) return false;
costGold += count;
} else if(dicCurrency.type == CURRENCY_TYPE.COIN) { // 处理铜币
if(role.coin < count + costCoin) return false;
costCoin += count;
}
} else {
let findItem = items.find(cur => cur.id == id);
if(findItem) {
findItem.count += count;
} else {
items.push({id, count}); ids.push(id);
}
}
}
}
for(let {id, count} of items) {
let item = await ItemModel.findbyRoleAndGidAndCount(roleId, id, count);
if(!item) return false
}
// 推送参数
let gold = 0, coin = 0, resultGoods = [];
if(costGold > 0) {
role = await RoleModel.costGold(roleId, costGold);
if(role) gold = role.gold;
}
if(costCoin > 0) {
role = await RoleModel.costCoin(roleId, costCoin);
if(role) coin = role.coin;
}
if(items.length > 0) {
let {hasError, result} = await ItemModel.decreaseItems(roleId, items);
if(hasError) return;
resultGoods = result;
}
let uids = [{uid: roleId, sid}];
pinus.app.get('channelService').pushMessageByUids('onItemUpdate', resResult(STATUS.SUCCESS, {goods: resultGoods, gold, coin} ), uids);
return true
}

View File

@@ -5,7 +5,7 @@ module.exports = {
'id': 'connector-server-1', 'id': 'connector-server-1',
'host': '127.0.0.1', 'host': '127.0.0.1',
'port': 4050, 'port': 4050,
'clientHost': 'zyz_web.trgame.cn', 'clientHost': 'zyzdev.trgame.cn',
'clientPort': 3050, 'clientPort': 3050,
'frontend': true, 'frontend': true,
'args': '--inspect=10001' 'args': '--inspect=10001'
@@ -29,7 +29,7 @@ module.exports = {
{ {
'id': 'gate-server-1', 'id': 'gate-server-1',
'host': '127.0.0.1', 'host': '127.0.0.1',
'clientHost': 'zyz_web.trgame.cn', 'clientHost': 'zyzdev.trgame.cn',
'clientPort': 3014, 'clientPort': 3014,
'frontend': true, 'frontend': true,
'args': '--inspect=10003' 'args': '--inspect=10003'
@@ -37,7 +37,7 @@ module.exports = {
{ {
'id': 'gate-server-2', 'id': 'gate-server-2',
'host': '127.0.0.1', 'host': '127.0.0.1',
'clientHost': 'zyz_web.trgame.cn', 'clientHost': 'zyzdev.trgame.cn',
'clientPort': 3015, 'clientPort': 3015,
'frontend': true, 'frontend': true,
'args': '--inspect=10008' 'args': '--inspect=10008'
@@ -46,9 +46,9 @@ module.exports = {
}, },
'production': { 'production': {
'connector': [ 'connector': [
{'id': 'connector-server-1', 'port': 4050, 'clientHost': 'zyz_web.trgame.cn', 'host': '127.0.0.1', 'clientPort': 3050, 'frontend': true}, {'id': 'connector-server-1', 'port': 4050, 'clientHost': 'zyzdev.trgame.cn', 'host': '127.0.0.1', 'clientPort': 3050, 'frontend': true},
{'id': 'connector-server-2', 'port': 4051, 'clientHost': 'zyz_web.trgame.cn', 'host': '127.0.0.1', 'clientPort': 3051, 'frontend': true}, {'id': 'connector-server-2', 'port': 4051, 'clientHost': 'zyzdev.trgame.cn', 'host': '127.0.0.1', 'clientPort': 3051, 'frontend': true},
{'id': 'connector-server-3', 'port': 4052, 'clientHost': 'zyz_web.trgame.cn', 'host': '127.0.0.1', 'clientPort': 3052, 'frontend': true} {'id': 'connector-server-3', 'port': 4052, 'clientHost': 'zyzdev.trgame.cn', 'host': '127.0.0.1', 'clientPort': 3052, 'frontend': true}
], ],
'chat': [ 'chat': [
{'id': 'chat-server-1', 'host': '127.0.0.1', 'port': 6050}, {'id': 'chat-server-1', 'host': '127.0.0.1', 'port': 6050},
@@ -62,11 +62,11 @@ module.exports = {
{'id': 'battle-server-1', 'host': '127.0.0.1', 'port': 6054} {'id': 'battle-server-1', 'host': '127.0.0.1', 'port': 6054}
], ],
'gate': [ 'gate': [
{'id': 'gate-server-1', 'host': '127.0.0.1', 'clientHost': 'zyz_web.trgame.cn', 'clientPort': 3014, 'frontend': true}, {'id': 'gate-server-1', 'host': '127.0.0.1', 'clientHost': 'zyzdev.trgame.cn', 'clientPort': 3014, 'frontend': true},
{ {
'id': 'gate-server-2', 'id': 'gate-server-2',
'host': '127.0.0.1', 'host': '127.0.0.1',
'clientHost': 'zyz_web.trgame.cn', 'clientHost': 'zyzdev.trgame.cn',
'clientPort': 3015, 'clientPort': 3015,
'frontend': true 'frontend': true
} }

View File

@@ -194,17 +194,12 @@ export default class GMUsers extends Service {
for(let hid of hids) { for(let hid of hids) {
let hero = await HeroModel.findByHidAndRole(hid, roleId); let hero = await HeroModel.findByHidAndRole(hid, roleId);
if(hero) continue; if(hero) continue;
const seqId = await CounterModel.getNewCounter(COUNTER.HID)||-1;
let dicHero = ctx.service.utils.getHeroById(hid); let dicHero = ctx.service.utils.getHeroById(hid);
if(!dicHero) continue; if(!dicHero) continue;
let {quality, initialStars: star, jobid: job, name: hName} = dicHero;
const heroInfo = { const heroInfo = {
roleId, roleId, roleName: role.roleName, hid, hName, star, quality, job, serverId: role.serverId,
roleName: role.roleName, lv: hlv
hid: hid,
hName: dicHero.name,
seqId,
lv: hlv,
star: dicHero.quality
} }
heroInfos.push(heroInfo); heroInfos.push(heroInfo);
} }

View File

@@ -1,15 +1,18 @@
#!/bin/sh #!/bin/sh
if [ $# != 1 ] ; then if [ $# != 1 ] ; then
echo "需要1个参数" echo "需要1个参数"
echo "pro: 同步代码到 pro 服务器上,作为正式服使用" echo "stable: 同步代码到 stable 服务器上,作为正式服使用"
echo "alpha: 同步代码到 alpha 服务器上,作为测试服供服务开发使用"
echo "dev: 同步代码到 dev 服务器上,作为测试服供服务开发使用" echo "dev: 同步代码到 dev 服务器上,作为测试服供服务开发使用"
exit 1; exit 1;
fi fi
if [ ${1} == 'pro' ] ; then if [ ${1} == 'stable' ] ; then
destUrl="root@zyz:/root/zyz/" destUrl="root@zyz:/root/zyz/"
elif [ ${1} == 'alpha' ] ; then
destUrl="root@zyzalpha:/root/zyz/"
elif [ ${1} == 'dev' ] ; then elif [ ${1} == 'dev' ] ; then
destUrl="root@zyztest:/root/zyz/" destUrl="root@zyzdev:/root/zyz/"
else else
echo "需要一个参数指明服务器" echo "需要一个参数指明服务器"
exit 1; exit 1;

View File

@@ -4,6 +4,9 @@
* 属性 id * 属性 id
*/ */
import { JOB_TYPE } from "./consts";
export enum ABI_TYPE{ export enum ABI_TYPE{
/**生命 */ /**生命 */
ABI_HP = 1, ABI_HP = 1,
@@ -42,13 +45,93 @@ export enum ABI_TYPE{
ABI_AP = 17, ABI_AP = 17,
ABI_MAX, ABI_MAX,
} }
export enum SEID_TYPE{ export enum SEID_TYPE {
/**属性固定值加成(数值) */ /**属性固定值加成(数值) */
TYPE101 = 101, TYPE101 = 101,
/**属性固定值加成(百分比) */ /**属性固定值加成(百分比) */
TYPE102 = 102, TYPE102 = 102,
} }
export enum ABI_STAGE {
START = 0,
HP = 1,
ATK = 2,
DEF = 3,
MDEF = 4,
AGI = 5,
LUK = 6,
END = 6
}
export const ATTR = {}
//武将训练等级
export const HEROTARIN = {
1: "hp",
2: "atk",
3: "def",
4: "mdef",
5: "agi",
6: "luk"
};
//战力系数
export const CE_RATIO = {
"hp" : 1,
"atk" : 2,
"matk": 2,
"def": 2,
"mdef": 2,
"agi": 2,
"luk": 0,
"hit": 0,
"cri": 0,
"flee": 0,
"antCri": 0,
"damageIncrease": 0,
"damageDecrease": 0,
"defIngnore": 0,
"bloodSuck": 0,
};
export const HERO_ATTR = {
1: "hp", // 生命
2: "atk", // 物攻
3: "matk", // 策攻
4: "def", // 物防
5: "mdef", // 测防
6: "agi", // 敏捷
7: "luk", // 幸运
8: "speed", // 移动
9: "hit", // 命中等级
10: "cri", // 暴击等级
11: "flee", // 格挡等级
12: "antCri", // 抗暴等级
13: "damageIncrease", // 伤害加深等级
14: "damageDecrease", // 伤害减免等级
15: "defIngnore", // 忽视防御等级
16: "bloodSuck", // 吸血等级
17: "ap" // 怒气
};
export const ABI_TYPE_TO_STAGE = new Map<number, number | ((jobType: number) => number)>([
[ABI_STAGE.HP, ABI_TYPE.ABI_HP],
[ABI_STAGE.ATK, (jobType:number) => { return jobType == JOB_TYPE.PHYSIC?ABI_TYPE.ABI_ATK: ABI_TYPE.ABI_MATK}],
[ABI_STAGE.DEF, ABI_TYPE.ABI_DEF],
[ABI_STAGE.MDEF, ABI_TYPE.ABI_MDEF],
[ABI_STAGE.AGI, ABI_TYPE.ABI_AGI],
[ABI_STAGE.LUK, ABI_TYPE.ABI_LUK]
]);
export function getAtrrNameById(attrId: number) {
return HERO_ATTR[attrId];
};
export function getAttrCeRatio(attr: string) {
return CE_RATIO[attr];
};
export function getAttrNameByJobStage(jobStage: number) {
return HEROTARIN[jobStage];
};

View File

@@ -21,6 +21,11 @@ export const ACTION_POIN = {
MAX: 100000, MAX: 100000,
PER: 6 * 60 * 1000 PER: 6 * 60 * 1000
}; };
//武将养成系统分类
export const HERO_SYSTEM_TYPE = {
STAR: 1,
TRAIN: 5,
};
export const BATTLE_REWARD_TYPE = { export const BATTLE_REWARD_TYPE = {
FIX_REWARD: 1, FIX_REWARD: 1,
@@ -46,7 +51,9 @@ export const CONSUME_TYPE = {
CONSUME: 1, // 消耗品 CONSUME: 1, // 消耗品
SOUL: 2, // 将魂 SOUL: 2, // 将魂
BLUEPRT: 3, // 藏宝图 BLUEPRT: 3, // 藏宝图
POINT: 4 // 远征币等 POINT: 4, // 远征币等
EXP: 5, // 经验书
FAVOUR: 6 // 好感度道具
}; };
const itid_array = [ const itid_array = [
@@ -72,6 +79,8 @@ const itid_array = [
{ id: 20, name: '布鞋', goodType: GOOD_TYPE.EQUIP }, { id: 20, name: '布鞋', goodType: GOOD_TYPE.EQUIP },
{ id: 21, name: '饰品', goodType: GOOD_TYPE.EQUIP }, { id: 21, name: '饰品', goodType: GOOD_TYPE.EQUIP },
{ id: 22, name: '消耗类物品(图纸类)', goodType: GOOD_TYPE.CONSUMES, type: CONSUME_TYPE.CONSUME }, { id: 22, name: '消耗类物品(图纸类)', goodType: GOOD_TYPE.CONSUMES, type: CONSUME_TYPE.CONSUME },
{ id: 35, name: '消耗类物品(经验书)', goodType: GOOD_TYPE.CONSUMES, type: CONSUME_TYPE.EXP },
{ id: 36, name: '消耗类物品(好感道具)', goodType: GOOD_TYPE.CONSUMES, type: CONSUME_TYPE.FAVOUR },
{ id: 23, name: '消耗类物品(材料类)', goodType: GOOD_TYPE.CONSUMES, type: CONSUME_TYPE.CONSUME }, { id: 23, name: '消耗类物品(材料类)', goodType: GOOD_TYPE.CONSUMES, type: CONSUME_TYPE.CONSUME },
{ id: 24, name: '消耗类物品(宝箱类)', goodType: GOOD_TYPE.CONSUMES, type: CONSUME_TYPE.CONSUME }, { id: 24, name: '消耗类物品(宝箱类)', goodType: GOOD_TYPE.CONSUMES, type: CONSUME_TYPE.CONSUME },
{ id: 26, name: '武将碎片', goodType: GOOD_TYPE.CONSUMES, type: CONSUME_TYPE.SOUL }, { id: 26, name: '武将碎片', goodType: GOOD_TYPE.CONSUMES, type: CONSUME_TYPE.SOUL },
@@ -217,29 +226,9 @@ export const EXPEDITION_CONST = {
RESET_CNT: 1 // 可以免费重置的次数 RESET_CNT: 1 // 可以免费重置的次数
} }
export const WAR_JSON_ATTRIBUTE_TYPE = {
"1": "hp", // 生命
"2": "atk", // 物攻
"3": "matk", // 策攻
"4": "def", // 物防
"5": "mdef", // 测防
"6": "agi", // 敏捷
"7": "luk", // 幸运
"8": "speed", // 移动
"9": "hit", // 命中等级
"10": "cri", // 暴击等级
"11": "flee", // 格挡等级
"12": "antCri", // 抗暴等级
"13": "damageIncrease", // 伤害加深等级
"14": "damageDecrease", // 伤害减免等级
"15": "defIngnore", // 忽视防御等级
"16": "bloodSuck", // 吸血等级
"17": "ap" // 怒气
};
export const EVENT_QUIZ_NUM = 3; export const EVENT_QUIZ_NUM = 3;
export const DEFAULT_HEROES = [ 312, 314, 311, 309, 315]; export const DEFAULT_HEROES = [ 12, 14, 11, 9, 15];
export const DEFAULT_ITEMS = [ export const DEFAULT_ITEMS = [
{id: 33106, count: 200}, {id: 33106, count: 200},
{id: 33107, count: 200}, {id: 33107, count: 200},
@@ -333,3 +322,16 @@ export const FRIEND_DROP_TYPE = {
export const FRIEND_DROP_MAX = { export const FRIEND_DROP_MAX = {
COM_BTL: 150 COM_BTL: 150
} }
// 武将上限
export const HERO_GROW_MAX = {
STAR: 6,
COLORSTAR: 6,
QUALITY: 3
}
export const JOB_TYPE = {
PHYSIC: 1,
MAGIC: 2
}

View File

@@ -111,7 +111,37 @@ export const STATUS = {
// 秘境 20700 - 20799 // 秘境 20700 - 20799
DUNGEON_REFRESH_TIMES_LACK: { code: 20701, simStr: '购买次数不足' }, DUNGEON_REFRESH_TIMES_LACK: { code: 20701, simStr: '购买次数不足' },
DUNGEON_TIMES_LACK: { code: 20701, simStr: '挑战次数不足' }, DUNGEON_TIMES_LACK: { code: 20701, simStr: '挑战次数不足' },
// 养成相关状态 30000 - 39999
// 通用 30000 - 30099
ROLE_INFO_NOT_FOUND: { code: 30000, simStr: '数据表未找到' },
ROLE_MATERIAL_NOT_ENOUGH: { code: 30001, simStr: '材料数量不足' },
// 武将养成通用 30100 - 30199
// 武将合成,升级,升星,升品相关 30200 - 30299
ROLE_HERO_EXISTS: {code: 30200, simStr: '已存在武将不可合成' },
ROLE_METERIAL_ERROR: {code: 30201, simStr: '材料错误' },
ROLE_HERO_NOT_EXISTS: {code: 30202, simStr: '未找到该武将' },
ROLE_HERO_LV_OVER: {code: 30203, simStr: '武将等级不可超过主公等级' },
ROLE_HERO_LV_TYPE_ERROR: {code: 30204, simStr: '只可选择升1级或升5级' },
ROLE_EXP_NOT_ENOUGH: {code: 30205, simStr: '材料经验不足' },
ROLE_STAR_STAGE_NOT_ENOUGH: {code: 30206, simStr: '请先点亮前面的星盘' },
ROLE_STAR_REACH_MAX: {code: 30207, simStr: '已升满星,请先觉醒' },
ROLE_STAR_NOT_ENOUGH: {code: 30208, simStr: '未升满星,不可升品' },
ROLE_QUALITY_REACH_MAX: {code: 30209, simStr: '品质已升满' },
ROLE_WAKE_STAR_NOT_ENOUGH: {code: 30210, simStr: '未升满星,不可觉醒' },
ROLE_QUALITY_NOT_ENOUGH: {code: 30211, simStr: '品质未升满,不可觉醒' },
// 武将训练,好感度,羁绊,时装相关 30300 - 30399
HERO_NOT_FIND: {code: 30300, simStr: '武将不存在' },
HERO_JOB_REACH_MAX_STAGE: {code: 30300, simStr: '武将已达到最大的职业阶级'},
HERO_JOB_STAGE_REACH_MAX_STAGE: {code: 30301, simStr: '武将已训练到最大阶段'},
NOT_REACH_UNLOCK_LEVEL: {code: 30302, simStr: '未达到解锁等级'},
HERO_SKIN_NOT_FIND: {code: 30303, simStr: '时装不存在'},
HERO_SKIN_IS_EXIST: {code: 30304, simStr: '时装已存在'},
HERO_CONECTION_IS_MAX_LEVEL: {code: 30306, simStr: '羁绊已达到最大等级'},
HERO_CONECTION_IS_NOT_EXIT: {code: 30307, simStr: '羁绊不存在'},
ROLE_SHORT_HERO_CONECTION:{code: 30308, simStr: '未拥有羁绊武将'},
HERO_FAVOUR_LEVEL_REACH_MAXT:{code: 30308, simStr: '武将好感等级以达到最大'},
// 社交相关状态 40000 - 49999 // 社交相关状态 40000 - 49999
// 运营模块相关状态 50000 - 59999 // 运营模块相关状态 50000 - 59999
// GM后台相关状态 60000 - 69999 // GM后台相关状态 60000 - 69999
@@ -129,4 +159,5 @@ export const STATUS = {
GM_PVP_DEFENSE_NOT_FOUND: { code: 60012, simStr: '该玩家未保存防守阵' }, GM_PVP_DEFENSE_NOT_FOUND: { code: 60012, simStr: '该玩家未保存防守阵' },
GM_PVP_DEFENSE_HERO_NOT_FOUND: { code: 60013, simStr: '该守阵没有该武将' }, GM_PVP_DEFENSE_HERO_NOT_FOUND: { code: 60013, simStr: '该守阵没有该武将' },
GM_JSON_FORMAT_ERR: { code: 60005, simStr: 'json格式错误' } GM_JSON_FORMAT_ERR: { code: 60005, simStr: 'json格式错误' }
} }

View File

@@ -23,3 +23,45 @@ export default class BaseModel extends TimeStamps {
@prop() @prop()
updatedAt: Date updatedAt: Date
} }
export class CeAttrData {
@prop({ required: true })
base?: number = 0;
@prop({ required: true })
ratioUp: number = 0;
@prop({ required: true })
fixUp: number = 0;
}
export class CeAttr {
@prop({ required: false })
hp?: CeAttrData;
@prop({ required: false })
atk?: CeAttrData;
@prop({ required: false })
matk?: CeAttrData;
@prop({ required: false })
def?: CeAttrData;
@prop({ required: false })
mdef?: CeAttrData;
@prop({ required: false })
agi?: CeAttrData;
@prop({ required: false })
luk?: CeAttrData;
@prop({ required: false })
hit?: CeAttrData;
@prop({ required: false })
cri?: CeAttrData;
@prop({ required: false })
flee?: CeAttrData;
@prop({ required: false })
antCri?: CeAttrData;
@prop({ required: false })
damageIncrease?: CeAttrData;
@prop({ required: false })
damageDecrease?: CeAttrData;
@prop({ required: false })
defIngnore?: CeAttrData;
@prop({ required: false })
bloodSuck?: CeAttrData;
}

View File

@@ -1,7 +1,19 @@
import BaseModel from './BaseModel'; import BaseModel from './BaseModel';
import { index, getModelForClass, prop } from '@typegoose/typegoose'; import { index, getModelForClass, prop } from '@typegoose/typegoose';
class RandSe {
@prop({ required: true })
seType: number; // 属性类型
@prop({ required: true })
value: number; // 属性数值
}
class Holes {
@prop({ required: true })
id: number; // 宝石 id待定也可能是 type + lv
@prop({ required: true })
lv: number; // 宝石等级
}
@index({ roleId: 1, hid: 1, id: 1 }) @index({ roleId: 1, hid: 1, id: 1 })
@index({ seqId: 1 }) @index({ seqId: 1 })
export default class Equip extends BaseModel { export default class Equip extends BaseModel {
@@ -27,21 +39,15 @@ export default class Equip extends BaseModel {
quality: number; // 品质 quality: number; // 品质
@prop({ required: true, default: 1 }) @prop({ required: true, default: 1 })
lv: number; // 强化等级 lv: number; // 强化等级
@prop({ required: false, default: [] }) @prop({ required: false, type: RandSe, default: [] })
randSe: [{ // 强化随机属性 randSe: RandSe[]; // 强化随机属性
seType: number; // 属性类型
value: number; // 属性数值
}];
@prop({ required: true, default: 0 }) @prop({ required: true, default: 0 })
randRange: number; // 物攻策攻数值浮动上下限变化率,浮点数 randRange: number; // 物攻策攻数值浮动上下限变化率,浮点数
@prop({ required: true, default: 0 }) @prop({ required: true, default: 0 })
initHoleCnt: number; // 初始珠宝孔位个数 initHoleCnt: number; // 初始珠宝孔位个数
@prop({ required: true, default: [] }) @prop({ required: true, type: Holes, default: [] })
holes: [{ holes: Holes[];
id: number; // 宝石 id待定也可能是 type + lv
lv: number; // 宝石等级
}];
public static async findbyRole(roleId: string, lean = true) { public static async findbyRole(roleId: string, lean = true) {
const equips = await EquipModel.find({ roleId }).lean(lean); const equips = await EquipModel.find({ roleId }).lean(lean);

View File

@@ -1,134 +1,179 @@
import BaseModel from './BaseModel'; import BaseModel, { CeAttr } from './BaseModel';
import { index, getModelForClass, prop, Ref, mongoose } from '@typegoose/typegoose'; import { index, getModelForClass, prop, Ref, mongoose } from '@typegoose/typegoose';
import Equip from './Equip'; import Equip from './Equip';
import { updateCe } from '../pubUtils/util'; import { CounterModel } from './Counter';
import { COUNTER } from '../consts/consts';
/** /**
* 英雄表 * 英雄表
*/ */
class Connect {
@prop({ required: true })
shipId: number;
@prop({ required: true })
level: number;
}
class Skin {
@prop({ required: true })
id: number;
@prop({ required: true })
enable: boolean;
}
interface heroUpdate {
exp?: number;
lv?: number;
ce?: number;
star?: number;
starStage?: number;
colorStar?: number;
colorStarStage?: number;
quality?: number;
job?:number;
jobStage?:number;
favour?:number;
favourLv?:number;
skins?: Skin[];
conections?: Connect[];
_id?:number;
}
@index({ roleId: 1, hid: 1 }) @index({ roleId: 1, hid: 1 })
@index({ roleId: 1, seqId: 1 }) @index({ roleId: 1, seqId: 1 })
export default class Hero extends BaseModel { export default class Hero extends BaseModel {
@prop({ required: true }) @prop({ required: true })
roleId: string; // 角色 id roleId: string; // 角色 id
@prop({ required: true }) @prop({ required: true })
roleName: string; // 角色名称 roleName: string; // 角色名称
@prop({ required: true }) @prop({ required: true })
serverId: number; // 区服 id serverId: number; // 区服 id
@prop({ required: true }) @prop({ required: true })
hid: number; // 武将 id hid: number; // 武将 id
@prop({ required: true }) @prop({ required: true })
hName: string; // 武将名 hName: string; // 武将名
@prop({ required: true }) @prop({ required: true })
seqId: number; // 武将表自增 id seqId: number; // 武将表自增 id
@prop({ required: true, default: 0 }) @prop({ required: true, default: 0 })
exp: number; // 经验值 exp: number; // 经验值
@prop({ required: true, default: 1 }) @prop({ required: true, default: 1 })
lv: number; // 武将等级 lv: number; // 武将等级
@prop({ required: true, default: 0 }) @prop({ required: true, default: 0 })
ce: number; // 武将战力 ce: number; // 武将战力
@prop({ required: true, default: 0 }) @prop({ required: true, default: 0 })
historyCe: number; // 武将历史最高战力 historyCe: number; // 武将历史最高战力
@prop({required: true, default: new CeAttr() })
ceAttr: CeAttr; // 影响战力的属性
@prop({ required: true, default: 0 }) @prop({ required: true, default: 1 })
star: number; // 星级 star: number; // 星级
@prop({ required: true, default: 0 }) @prop({ required: true, default: 0 })
fire: number; // 觉醒的火在满星了之后会继续进行觉醒显示类似6星1火 starStage: number; // 星级六维阶段
@prop({ required: true, default: 1 }) @prop({ required: true, default: 0 })
rank: number; // 阶数 colorStar: number; // 觉醒, 彩星
@prop({ required: true, default: 0 }) @prop({ required: true, default: 0 })
favour: number; // 好感度 colorStarStage: number; // 觉醒六维阶段
@prop({ required: true, default: 1 })
favourLv: number; // 好感等级
@prop({ required: true, default: [] })
conections: [{ // 羁绊
id: number; // 羁绊编号
name: string; // 羁绊名称
valid: boolean; // 是否开启
}];
@prop({ required: true, default: [] })
skins: [{ // 皮肤
id: number; // id
enable: boolean; // 是否装备
}]
@prop({ ref: Equip, type: mongoose.Schema.Types.ObjectId }) @prop({ required: true, default: 0 })
equips: Ref<Equip>[]; // 武将装备引用数组 quality: number; // 品质
public static async findByRole(roleId: string, lean = true) { @prop({ required: true, default: 0 })
const heros = await HeroModel.find({ roleId }).populate('equips').lean(lean); job: number; // 职业
return heros || []; @prop({ required: true, default: 0 })
} jobStage: number; // 职阶
public static async findBySeqIdRange(seqIds: Array<number>, roleId: string, lean = true) { @prop({ required: true, default: 0 })
const hero = await HeroModel.find({ seqId: {$in: seqIds}, roleId }).lean(lean); favour: number; // 好感度
return hero; @prop({ required: true, default: 1 })
} favourLv: number; // 好感等级
public static async findBySeqIdAndRole(seqId: number, roleId: string, lean = true) { @prop({ required: true, type:Connect, default: [] })
const hero = await HeroModel.findOne({ seqId, roleId }).lean(lean); conections: Connect[]; // 羁绊
return hero; @prop({ required: true, default: [] })
} skins: Skin[]; // 皮肤
public static async findByHidAndRole(hid: number, roleId: string, lean = true) {
const hero = await HeroModel.findOne({ hid, roleId }).lean(lean);
return hero;
}
public static async addEquip(roleId: string, hid: number, equipId: string, lean = true) { @prop({ ref: Equip, type: mongoose.Schema.Types.ObjectId })
const hero = await HeroModel.findOneAndUpdate({ roleId, hid }, {$push: {equips: equipId}}, {new: true}).lean(lean); equips: Ref<Equip>[]; // 武将装备引用数组
if (hero) {
await Equip.putOn(hero.hid, equipId); public static async findByRole(roleId: string, lean = true) {
await updateCe(roleId, hero ) const heros = await HeroModel.find({ roleId }).populate('equips').lean(lean);
return heros || [];
} }
return hero;
}
public static async createHero(heroInfo: {roleId: string, roleName: string, hid: number, star: number, hName: string, seqId: number, lv?:number, ce: number}, lean = true) { public static async findBySeqIdRange(seqIds: Array<number>, roleId: string, lean = true) {
const doc = new HeroModel(); const hero = await HeroModel.find({ seqId: {$in: seqIds}, roleId }).lean(lean);
const update = Object.assign(doc.toJSON(), heroInfo); return hero;
delete update._id; }
const hero = await HeroModel.findOneAndUpdate({roleId: heroInfo.roleId, hid: heroInfo.hid}, update, {upsert: true, new: true}).lean(lean); public static async findBySeqIdAndRole(seqId: number, roleId: string, lean = true) {
await updateCe(heroInfo.roleId, hero); const hero = await HeroModel.findOne({ seqId, roleId }).lean(lean);
return hero; return hero;
} }
public static async findByHidAndRole(hid: number, roleId: string, lean = true) {
const hero = await HeroModel.findOne({ hid, roleId }).lean(lean);
return hero;
}
public static async sumTopHeroCe(roleId: string, num: number) { public static async addEquip(roleId: string, hid: number, equipId: string, lean = true) {
let ce = await HeroModel.aggregate([ const hero = await HeroModel.findOneAndUpdate({ roleId, hid }, {$push: {equips: equipId}}, {new: true}).lean(lean);
{ $match : { roleId } }, if (hero) {
{ $sort: {historyCe: -1} }, await Equip.putOn(hero.hid, equipId);
{ $limit: num }, }
{ $group: { _id: null, historyCe: { $sum: '$historyCe' } } } return hero;
]); }
return ce.length > 0?ce[0].historyCe:0;
}
public static async sumHeroCe(roleId: string) { public static async createHero(heroInfo: {roleId: string, serverId: number, roleName: string, hid: number, hName: string, star: number, quality: number, job: number, lv?: number }, lean = true) {
let ce = await HeroModel.aggregate([ const doc = new HeroModel();
{ $match : { roleId } }, const seqId = await CounterModel.getNewCounter(COUNTER.HID)||-1;
{ $group: { _id: null, ce: { $sum: '$ce' } } } const update = Object.assign(doc.toJSON(), heroInfo, {seqId});
]); delete update._id;
return ce.length > 0?ce[0].ce:0; const hero = await HeroModel.findOneAndUpdate({roleId: heroInfo.roleId, hid: heroInfo.hid}, update, {upsert: true, new: true}).select('hid hName lv exp star starStage colorStar colorStarStage quality job jobStage conections favour favourLv skins equips ce ceAttr').lean(lean);
} return hero;
}
public static async getTopHero(roleId: string, num: number, lean = true) { public static async sumTopHeroCe(roleId: string, num: number) {
const heroes = await HeroModel.find({roleId}).limit(num).sort({ce: -1}).lean(lean); let ce = await HeroModel.aggregate([
return heroes; { $match : { roleId } },
} { $sort: {historyCe: -1} },
{ $limit: num },
{ $group: { _id: null, historyCe: { $sum: '$historyCe' } } }
]);
return ce.length > 0?ce[0].historyCe:0;
}
public static async updateCe(roleId: string, hid: number, ce: number, oldCe: number, historyCe: number, lean = true) { public static async sumHeroCe(roleId: string) {
let distance = ce - oldCe; let ce = await HeroModel.aggregate([
let historyDistance = ce > historyCe ?ce - historyCe: 0; { $match : { roleId } },
let result = await HeroModel.findOneAndUpdate({roleId, hid}, {$inc:{ce: distance, historyCe: historyDistance}}).lean(lean); { $group: { _id: null, ce: { $sum: '$ce' } } }
return result||{}; ]);
} return ce.length > 0?ce[0].ce:0;
}
public static async deleteAccount(roleId: string, lean = true) { public static async getTopHero(roleId: string, num: number, lean = true) {
let result = await HeroModel.deleteMany({roleId}).lean(lean); const heroes = await HeroModel.find({roleId}).limit(num).sort({ce: -1}).lean(lean);
return result||{}; return heroes;
} }
public static async updateCe(roleId: string, hid: number, ce: number, oldCe: number, historyCe: number, lean = true) {
let distance = ce - oldCe;
let historyDistance = ce > historyCe ?ce - historyCe: 0;
let result = await HeroModel.findOneAndUpdate({roleId, hid}, {$inc:{ce: distance, historyCe: historyDistance}}).lean(lean);
return result||{};
}
public static async deleteAccount(roleId: string, lean = true) {
let result = await HeroModel.deleteMany({roleId}).lean(lean);
return result||{};
}
public static async updateHeroInfo(roleId: string, hid:number, heroUpdate:heroUpdate, lean = true) {
delete heroUpdate._id;
let result = await HeroModel.findOneAndUpdate({roleId, hid}, {$set:heroUpdate}).lean(lean);
return result||{};
}
} }
export const HeroModel = getModelForClass(Hero); export const HeroModel = getModelForClass(Hero);

View File

@@ -49,10 +49,11 @@ export default class Item extends BaseModel {
} }
public static async decreaseItems(roleId: string, items: Array<{id: number, count: number}>, lean = true) { public static async decreaseItems(roleId: string, items: Array<{id: number, count: number}>, lean = true) {
let updateItems = new Array<{id: number, count: number}>(), hasError: boolean = false; let updateItems = new Array<{id: number, count: number}>(), hasError: boolean = false, result = new Array();
for(let {id, count} of items) { for(let {id, count} of items) {
const rec = await ItemModel.findOneAndUpdate({roleId, id, count: {$gte: count} },{ $inc: { count: -1 * count }}, {new: true}).lean(lean); const rec = await ItemModel.findOneAndUpdate({roleId, id, count: {$gte: count} },{ $inc: { count: -1 * count }}, {new: true}).lean(lean);
if(rec) { if(rec) {
result.push(rec);
updateItems.push({id, count}); updateItems.push({id, count});
} else { } else {
hasError = true; break; hasError = true; break;
@@ -62,9 +63,9 @@ export default class Item extends BaseModel {
for(let {id, count} of updateItems) { for(let {id, count} of updateItems) {
await ItemModel.findOneAndUpdate({roleId, id },{ $inc: { count }}, {new: true}).lean(lean); await ItemModel.findOneAndUpdate({roleId, id },{ $inc: { count }}, {new: true}).lean(lean);
} }
return false return {hasError: true}
} else { } else {
return true return {hasError: false, result}
} }
} }

View File

@@ -1,10 +1,13 @@
import { HANG_UP_CONSTS } from './../consts/consts'; import { HANG_UP_CONSTS } from './../consts/consts';
import BaseModel from './BaseModel'; import BaseModel, { CeAttr } from './BaseModel';
import { index, getModelForClass, prop } from '@typegoose/typegoose'; import { index, getModelForClass, prop } from '@typegoose/typegoose';
import User from './User'; import User from './User';
import { shouldRefresh } from '../pubUtils/util'; import { shouldRefresh } from '../pubUtils/util';
import { HeroModel } from './Hero'; import { HeroModel } from './Hero';
interface roleUpdate {
ce?: number;
_id?:number;
}
class TopHero { class TopHero {
@prop({ required: true }) @prop({ required: true })
hid: number; // 武将id hid: number; // 武将id
@@ -19,6 +22,23 @@ class DungeonHero {
@prop({ required: true, type: Number, default:[] }) @prop({ required: true, type: Number, default:[] })
heroes: Array<number>; // 武将id heroes: Array<number>; // 武将id
} }
class PayRecord {
@prop({ required: true })
id: string; // 购买项 product id
@prop({ required: true })
cnt: number; // 购买次数
}
class WarStar {
@prop({ required: true })
id: number; // 关卡 id
@prop({ required: true })
warType: number; // 关卡类型
@prop({ required: true })
star: number; // 星级
}
/** /**
* 角色字段接口 * 角色字段接口
*/ */
@@ -28,353 +48,343 @@ class DungeonHero {
// @index({ userInfo.uid: 1, serverId: 1 }) // @index({ userInfo.uid: 1, serverId: 1 })
export default class Role extends BaseModel { export default class Role extends BaseModel {
@prop({ required: true }) @prop({ required: true })
userInfo: User; userInfo: User;
@prop({ required: true }) @prop({ required: true })
seqId: number; seqId: number;
@prop({ required: true }) @prop({ required: true })
roleId: string; // 角色 id生成编码 roleId: string; // 角色 id生成编码
@prop({ required: true }) @prop({ required: true })
roleName: string; // 角色名 roleName: string; // 角色名
@prop({ required: true }) @prop({ required: true })
serverType: string; // 服务器类型 serverType: string; // 服务器类型
@prop({ required: true }) @prop({ required: true })
serverId: number; // 区服 id serverId: number; // 区服 id
@prop({ required: true, default: false }) @prop({ required: true, default: false })
blocked: boolean; // 是否屏蔽 blocked: boolean; // 是否屏蔽
@prop({ required: true }) @prop({ required: true })
code: string; // 邀请码 code: string; // 邀请码
@prop({ required: true, default: 19 }) @prop({ required: true, default: 19 })
headHid: number; // 头像所用武将 Id默认赵云 headHid: number; // 头像所用武将 Id默认赵云
@prop({ required: true, default: 19 }) @prop({ required: true, default: 19 })
sHid: number; // 形象所用武将 Id默认赵云 sHid: number; // 形象所用武将 Id默认赵云
@prop({ required: true, default: 0 }) @prop({ required: true, default: 0 })
exp: number; // 经验值 exp: number; // 经验值
@prop({ required: true, default: 1 }) @prop({ required: true, default: 1 })
lv: number; // 主公等级 lv: number; // 主公等级
@prop({ required: true, default: 0 }) @prop({ required: true, default: 0 })
ce: number; // 总战力 ce: number; // 总战力
@prop({ required: true, default: 0 }) @prop({ required: true, default: new CeAttr() })
topFiveCe: number; // 最强5人战力 globalCeAttr: CeAttr; // 战力
@prop({ required: true, type: TopHero, default: [] }) @prop({ required: true, default: 0 })
topFive: Array<TopHero>; // 总战力 topFiveCe: number; // 最强5人战力
@prop({ required: true, default: 100 }) @prop({ required: true, type: TopHero, default: [] })
tili: number; // 体力值 topFive: Array<TopHero>; // 总战力
@prop({ required: true, default: 100 })
tili: number; // 体力值
@prop({ required: true, default: 0 }) @prop({ required: true, default: 0 })
vLv: number; // VIP 等级 vLv: number; // VIP 等级
@prop({ required: true, default: 100 }) @prop({ required: true, default: 100 })
gold: number; // 总金币 gold: number; // 总金币
@prop({ required: true, default: 0 }) @prop({ required: true, default: 0 })
paidGold: number; // 支付所得金币 paidGold: number; // 支付所得金币
@prop({ required: true, default: 100 }) @prop({ required: true, default: 100 })
giftGold: number; // 赠送所得金币 giftGold: number; // 赠送所得金币
@prop({ required: true, default: 0 }) @prop({ required: true, default: 0 })
totalPay: number; // 总支付金额 totalPay: number; // 总支付金额
@prop({ required: true, default: 0 }) @prop({ required: true, default: 0 })
totalBuy: number; // 总金币购买 totalBuy: number; // 总金币购买
@prop({ required: true, default: 0 }) @prop({ required: true, default: 0 })
totalCost: number; // 金币总花费 totalCost: number; // 金币总花费
@prop({ required: true, default: [] }) @prop({ required: true, default: [] })
payRecord: [{ // 支付记录 payRecord: PayRecord[]; // 支付记录
id: string; // 购买项 product id
cnt: number; // 购买次数
}];
@prop({ required: true, default: 0 }) @prop({ required: true, default: 0 })
coin: number; // 总铜钱 coin: number; // 总铜钱
@prop({ required: true, default: 0 }) @prop({ required: true, default: 0 })
frdCnt: number; // 情谊点 frdCnt: number; // 情谊点
@prop({ required: true, default: [] }) @prop({ required: true, type: WarStar, default: [] })
souls: [{ // 将魂 warStar: WarStar[]; // 关卡星级
id: number; // 武将 id
count: number; // 数量
}];
@prop({ required: true, default: [] })
pieces: [{ // 装备碎片
id: number; // 装备 id
count: number; // 数量
}];
@prop({ required: true, default: [] })
jewels: [{ // 珠宝
id: number; // 待定,也可能是 type + lv
count: number; // 数量
}];
@prop({ required: true, default: [] }) @prop({ required: true, default: 1 })
warStar: [{ // 关卡星级 loginCnt: number; // 登录次数
id: number; // 关卡 id @prop({ required: true })
warType: number; // 关卡类型 createTime: Date; // 创建时间
star: number; // 星级 @prop({ required: true })
}]; loginTime: Date; // 更新 / 登录时间
@prop({ required: true, default: 1 }) @prop({ required: true, type: Number, default: [] })
loginCnt: number; // 登录次数 funcs: Array<number>; // 开启了的功能
@prop({ required: true })
createTime: Date; // 创建时间
@prop({ required: true })
loginTime: Date; // 更新 / 登录时间
@prop({ required: true, type: Number, default: [] }) // 天梯相关
funcs: Array<number>; // 开启了的功能 @prop({ required: true, default: 1 })
towerLv: number; // 天梯当前层数
@prop({ required: true, default: new Date() })
towerUpTime: Date; // 天梯爬到这一层的时间
// 天梯相关 @prop({ required: true, default: HANG_UP_CONSTS.MAX_SPD_UP_CNT})
@prop({ required: true, default: 1 }) hangUpSpdUpCnt: number; // 挂机加速次数
towerLv: number; // 天梯当前层数 @prop({ required: true, default: new Date()})
@prop({ required: true, default: new Date() }) lastSpdUpTime: Date; // 最后一次挂机加速时间
towerUpTime: Date; // 天梯爬到这一层的时间
@prop({ required: true, default: HANG_UP_CONSTS.MAX_SPD_UP_CNT}) @prop({ required: true, default: 0})
hangUpSpdUpCnt: number; // 挂机加速次数 towerTaskCnt: number; // 刷新派遣任务的次数向上累加每天8个
@prop({ required: true, default: new Date()}) @prop({ required: false})
lastSpdUpTime: Date; // 最后一次挂机加速时间 towerTaskRefTime: Date; // 刷新派遣任务的时间
@prop({ required: true, default: 0})
towerTaskReCnt: number; // 刷新派遣任务刷新次数
@prop({ required: true, default: 0}) // 奇遇事件相关
towerTaskCnt: number; // 刷新派遣任务的次数向上累加每天8个 @prop({ required: true, default: 0 })
@prop({ required: false}) eventStatus: number; // 奇遇开启状态, 0-未开启 1-开启了第一场事件 2-完全开启
towerTaskRefTime: Date; // 刷新派遣任务的时间
@prop({ required: true, default: 0})
towerTaskReCnt: number; // 刷新派遣任务刷新次数
// 奇遇事件相关 // 远征相关
@prop({ required: true, default: 0 }) @prop({ required: true, default: 0 })
eventStatus: number; // 奇遇开启状态, 0-未开启 1-开启了第一场事件 2-完全开启 expeditionPoint: number; // 远征点数
@prop({ required: true, default: 0 })
expeditionResetCnt: number; // 远征重置次数
@prop({ required: true, default: new Date() })
expeditionResetRefTime: Date; // 远征重置次数刷新时间
// 远征相关 // 秘境相关
@prop({ required: true, default: 0 }) @prop({ required: true, default: 0 })
expeditionPoint: number; // 远征点 dungeonCnt: number; // 秘境挑战次
@prop({ required: true, default: 0 }) @prop({ required: true, default: 0 })
expeditionResetCnt: number; // 远征重置次数 dungeonBuyCnt: number; // 秘境购买次数
@prop({ required: true, default: new Date() }) @prop({ required: true, default: new Date() })
expeditionResetRefTime: Date; // 远征重置次数刷新时间 dungeonRefTime: Date; // 秘境刷新时间
@prop({ required: true, type: DungeonHero, default: [] })
dungeonHeroes: Array<DungeonHero>; // 秘境首通使用的武将
// 秘境相关 public static async findByUid(uid: number, serverId: number, lean = true) {
@prop({ required: true, default: 0 }) const role = await RoleModel.findOne({ 'userInfo.uid': uid, serverId }).lean(lean);
dungeonCnt: number; // 秘境挑战次数 return role;
@prop({ required: true, default: 0 })
dungeonBuyCnt: number; // 秘境购买次数
@prop({ required: true, default: new Date() })
dungeonRefTime: Date; // 秘境刷新时间
@prop({ required: true, type: DungeonHero, default: [] })
dungeonHeroes: Array<DungeonHero>; // 秘境首通使用的武将
public static async findByUid(uid: number, serverId: number, lean = true) {
const role = await RoleModel.findOne({ 'userInfo.uid': uid, serverId }).lean(lean);
return role;
}
public static async findByRoleId(roleId: string, lean = true) {
const role = await RoleModel.findOne({ roleId }).lean(lean);
return role;
}
public static async createRole(uid: number, serverId: number, roleInfo: {roleId: string; roleName: string; seqId: number; code: string, lv?:number, exp?:number}, lean = true) {
const user = await User.findUserByUid(uid);
if (!user) return null;
const doc = new RoleModel();
const update = Object.assign(doc.toJSON(), roleInfo, { userInfo: user, serverType: user.serverType, serverId });
const role = await RoleModel.findOneAndUpdate({ 'userInfo.uid': uid, serverId }, update, { upsert: true, new: true }).lean(lean);
return role;
}
public static async findRoleByField(field: string, value?: Array<number|string>, lean = true) {
let searchObj = {};
if(field != 'all') {
searchObj[field] = {
$in: value
};
} }
//.select('uid tel username')
const user = await RoleModel.find(searchObj).lean(lean);
return user;
}
public static async findByRoleId(roleId: string, lean = true) {
public static async setEventStatus(roleId: string, eventStatus: number, lean = true) { const role = await RoleModel.findOne({ roleId }).lean(lean);
await RoleModel.findOneAndUpdate({ roleId }, { eventStatus }, {new: true}).lean(lean); return role;
}
public static async towerLvUp(roleId: string, lean = true) {
let role = await RoleModel.findOneAndUpdate({roleId}, {$inc: {towerLv: 1}, towerUpTime: new Date()}, {new: true}).lean(lean);
return role;
}
public static async hangUpSpdUp(roleId: string, cnt: number, curTime: Date, lean = true) {
if (cnt < 0) return null;
const result = await RoleModel.findOne({roleId}).lean(lean);
const lastSpdUpTime = result?.lastSpdUpTime;
let role = null;
if (!lastSpdUpTime || (shouldRefresh(lastSpdUpTime, curTime, HANG_UP_CONSTS.REFRESH_TIME, 1) && cnt <= HANG_UP_CONSTS.MAX_SPD_UP_CNT)) {
role = await RoleModel.findOneAndUpdate({roleId}, {hangUpSpdUpCnt: HANG_UP_CONSTS.MAX_SPD_UP_CNT - cnt, lastSpdUpTime: curTime}, {new: true}).lean(lean);
} else {
role = await RoleModel.findOneAndUpdate({roleId, hangUpSpdUpCnt: {$gte: cnt}}, {$inc: {hangUpSpdUpCnt: -cnt}, lastSpdUpTime: curTime}, {new: true}).lean(lean);
} }
return role;
}
public static async increaseExpeditionPoint(roleId: string, point: number, lean = true) { public static async createRole(uid: number, serverId: number, roleInfo: {roleId: string; roleName: string; seqId: number; code: string}, lean = true) {
let role = await RoleModel.findOneAndUpdate({roleId}, {$inc: { expeditionPoint: point }}, {new: true}).lean(lean); const user = await User.findUserByUid(uid);
return role; if (!user) return null;
} const doc = new RoleModel();
const update = Object.assign(doc.toJSON(), roleInfo, { userInfo: user, serverType: user.serverType, serverId });
public static async levelup(roleId: string, lv: number, exp: number, lean = true) { const role = await RoleModel.findOneAndUpdate({ 'userInfo.uid': uid, serverId }, update, { upsert: true, new: true }).lean(lean);
let role = await RoleModel.findOneAndUpdate({roleId}, {$set: { exp, lv }}, {new: true}).lean(lean); return role;
return role;
}
public static async deleteAccount(roleId: string, lean = true) {
let result = await RoleModel.deleteMany({roleId}).lean(lean);
return result||{};
}
public static async addCoin(roleId: string, cnt: number, lean = true) {
let result = await RoleModel.findOneAndUpdate({roleId}, { $inc: {coin: cnt} }, { "new": true, "upsert": true}).lean(lean);
return result;
}
public static async addGoldFree(roleId: string, cnt: number, lean = true) {
let result = await RoleModel.findOneAndUpdate({roleId}, { $inc: { gold: cnt, giftGold: cnt } }, { "new": true, "upsert": true}).lean(lean);
return result;
}
public static async costGold(roleId: string, cnt: number, lean = true) {
let result = await RoleModel.findOneAndUpdate({roleId, gold: {$gte: cnt}}, { $inc: { gold: -cnt, totalCost: cnt } }, { "new": true}).lean(lean);
return result;
}
public static async pushWarStar(roleId: string, battleId: number, warType: number, star: number, lean = true) {
let result = await RoleModel.findOneAndUpdate({roleId}, { $addToSet: { warStar: {id: battleId, warType, star }} }, { "new": true, "upsert": true}).lean(lean);
return result;
}
public static async updateWarStar(roleId: string, battleId: number, star: number, lean = true) {
let result = await RoleModel.findOneAndUpdate(
{roleId, 'warStar.id': battleId},
{ $set: { 'warStar.$.star': star } },
{ "new": true, "upsert": true}
).lean(lean);
return result;
}
// 重置派遣次数
public static async resetTowerCnt(roleId: string, curTime: Date, lean = true) {
const role = await RoleModel.findOneAndUpdate({roleId}, {towerTaskCnt: 0, towerTaskRefTime: curTime, towerTaskReCnt: 0}, {new: true}).lean(lean);
return role;
}
// 刷新派遣任务次数增长
public static async increaseTowerCnt(roleId: string, num: number, lean = true) {
const role = await RoleModel.findOneAndUpdate({roleId}, {$inc: {towerTaskCnt: num}}, {new: true}).lean(lean);
return role;
}
// 派遣任务增加刷新次数
public static async increaseTowerRefCnt(roleId: string, num: number, lean = true) {
const role = await RoleModel.findOneAndUpdate({roleId}, {$inc: {towerTaskReCnt: num}}, {new: true}).lean(lean);
return role;
}
// 刷新远征重置次数
public static async increaseExpeditionResetCnt(roleId: string, needRefresh: boolean, curTime: Date, lean = true) {
let role = null;
if (needRefresh) {
role = await RoleModel.findOneAndUpdate({roleId}, {expeditionResetCnt: 1, expeditionResetRefTime: curTime}, {new: true}).lean(lean);
} else {
role = await RoleModel.findOneAndUpdate({roleId}, {$inc: {expeditionResetCnt: 1}}, {new: true}).lean(lean);
} }
return role;
}
public static async findRoleByField(field: string, value?: Array<number|string>, lean = true) {
// 购买次数 let searchObj = {};
public static async buyCnt(roleId: string, needRefresh: boolean, inc: number, curTime: Date, lean = true) { console.log('&*&*&*&*&') if(field != 'all') {
searchObj[field] = {
let role = null; $in: value
if (needRefresh) { };
role = await RoleModel.findOneAndUpdate({roleId}, {dungeonCnt: 0, dungeonRefTime: curTime, dungeonBuyCnt: inc}, {new: true}).lean(lean);
} else {
role = await RoleModel.findOneAndUpdate({roleId}, {$inc: {dungeonBuyCnt: inc}}, {new: true}).lean(lean);
}
return role;
}
// 增加次数
public static async increaseDungeonCnt(roleId: string, needRefresh: boolean, inc: number, curTime: Date, lean = true) {
let role = null;
if (needRefresh) {
role = await RoleModel.findOneAndUpdate({roleId}, {dungeonCnt: inc, dungeonRefTime: curTime, dungeonBuyCnt: 0}, {new: true}).lean(lean);
} else {
role = await RoleModel.findOneAndUpdate({roleId}, {$inc: {dungeonCnt: inc}}, {new: true}).lean(lean);
}
return role;
}
// 获取排行榜
public static async getRank(type: string, serverId: number, fields: Array<string>, page = 1, limit = 100, lean = true) {
let sortBy = {};
if(type == 'tower') {
sortBy['towerLv'] = -1;
sortBy['towerUpTime'] = 1;
}
const ranks = await RoleModel.find({serverId}).select(fields.join(' ')).sort(sortBy).limit(limit).skip((page - 1) * limit).lean(lean);
return ranks;
}
public static async updateSumCe(roleId: string, hid: number, ce: number, oldCe: number, lean = true) {
let role = await RoleModel.findByRoleId(roleId);
let topFive = role?.topFive||new Array();
let distance = ce - oldCe;
topFive.sort((a, b) => {return b.ce - a.ce}); // 0-5最大-最小
let index = topFive.findIndex(cur => cur.hid == hid);
if(index == -1) { // 不在最强列表
if(topFive.length < 5) { // 不满5人
topFive.push({hid, ce});
} else if(topFive.length == 5){
if(ce > topFive[topFive.length - 1].ce) { // 跻身最强5人
topFive.pop();
topFive.push({hid, ce});
} }
} else { //.select('uid tel username')
topFive.splice(5, topFive.length - 5); const user = await RoleModel.find(searchObj).lean(lean);
} return user;
} else { // 原来就是最强5人
if(ce < topFive[topFive.length - 1].ce) { // 滑出最强
let heroes = await HeroModel.getTopHero(roleId, 5);
topFive = heroes.map(cur => {return {hid: cur.hid, ce: cur.ce}});
} else {
topFive[index].ce = ce;
}
} }
let topFiveCe = topFive.reduce((pre, cur) => {
return pre + cur.ce
}, 0);
await RoleModel.findOneAndUpdate({roleId}, { topFive, topFiveCe, $inc: {ce: distance} }).lean(lean);
}
// 保存秘境首通队伍 public static async setEventStatus(roleId: string, eventStatus: number, lean = true) {
public static async saveDungeonHero(roleId: string, battleId: number, heroes: Array<number>, isSuccess: boolean) { await RoleModel.findOneAndUpdate({ roleId }, { eventStatus }, {new: true}).lean(lean);
if(isSuccess) {
const role = await Role.findByRoleId(roleId);
let dungeonHeroes = role && role.dungeonHeroes;
let hasHero = dungeonHeroes&&dungeonHeroes.find(cur => cur.battleId == battleId);
if(!dungeonHeroes || !hasHero) {
await RoleModel.findOneAndUpdate({roleId}, {$push:{dungeonHeroes: {battleId, heroes}}})
}
} }
}
// 保存开启功能 public static async towerLvUp(roleId: string, lean = true) {
public static async pushFuncs(roleId: string, funcs: Array<number>, lean = true) { let role = await RoleModel.findOneAndUpdate({roleId}, {$inc: {towerLv: 1}, towerUpTime: new Date()}, {new: true}).lean(lean);
const recs = await RoleModel.findOneAndUpdate({roleId}, {$push: {funcs: {$each: funcs}}}, {new: true}).lean(lean); return role;
return recs }
}
public static async hangUpSpdUp(roleId: string, cnt: number, curTime: Date, lean = true) {
if (cnt < 0) return null;
const result = await RoleModel.findOne({roleId}).lean(lean);
const lastSpdUpTime = result?.lastSpdUpTime;
let role = null;
if (!lastSpdUpTime || (shouldRefresh(lastSpdUpTime, curTime, HANG_UP_CONSTS.REFRESH_TIME, 1) && cnt <= HANG_UP_CONSTS.MAX_SPD_UP_CNT)) {
role = await RoleModel.findOneAndUpdate({roleId}, {hangUpSpdUpCnt: HANG_UP_CONSTS.MAX_SPD_UP_CNT - cnt, lastSpdUpTime: curTime}, {new: true}).lean(lean);
} else {
role = await RoleModel.findOneAndUpdate({roleId, hangUpSpdUpCnt: {$gte: cnt}}, {$inc: {hangUpSpdUpCnt: -cnt}, lastSpdUpTime: curTime}, {new: true}).lean(lean);
}
return role;
}
public static async increaseExpeditionPoint(roleId: string, point: number, lean = true) {
let role = await RoleModel.findOneAndUpdate({roleId}, {$inc: { expeditionPoint: point }}, {new: true}).lean(lean);
return role;
}
public static async levelup(roleId: string, lv: number, exp: number, lean = true) {
let role = await RoleModel.findOneAndUpdate({roleId}, {$set: { exp, lv }}, {new: true}).lean(lean);
return role;
}
public static async deleteAccount(roleId: string, lean = true) {
let result = await RoleModel.deleteMany({roleId}).lean(lean);
return result||{};
}
public static async addCoin(roleId: string, cnt: number, lean = true) {
let result = await RoleModel.findOneAndUpdate({roleId}, { $inc: {coin: cnt} }, { "new": true, "upsert": true}).lean(lean);
return result;
}
public static async addGoldFree(roleId: string, cnt: number, lean = true) {
let result = await RoleModel.findOneAndUpdate({roleId}, { $inc: { gold: cnt, giftGold: cnt } }, { "new": true, "upsert": true}).lean(lean);
return result;
}
public static async costCoin(roleId: string, cnt: number, lean = true) {
let result = await RoleModel.findOneAndUpdate({roleId, coin: {$gte: cnt}}, { $inc: { coin: -cnt } }, { "new": true}).lean(lean);
return result;
}
public static async costGold(roleId: string, cnt: number, lean = true) {
let result = await RoleModel.findOneAndUpdate({roleId, gold: {$gte: cnt}}, { $inc: { gold: -cnt, totalCost: cnt } }, { "new": true}).lean(lean);
return result;
}
public static async pushWarStar(roleId: string, battleId: number, warType: number, star: number, lean = true) {
let result = await RoleModel.findOneAndUpdate({roleId}, { $addToSet: { warStar: {id: battleId, warType, star }} }, { "new": true, "upsert": true}).lean(lean);
return result;
}
public static async updateWarStar(roleId: string, battleId: number, star: number, lean = true) {
let result = await RoleModel.findOneAndUpdate(
{roleId, 'warStar.id': battleId},
{ $set: { 'warStar.$.star': star } },
{ "new": true, "upsert": true}
).lean(lean);
return result;
}
// 重置派遣次数
public static async resetTowerCnt(roleId: string, curTime: Date, lean = true) {
const role = await RoleModel.findOneAndUpdate({roleId}, {towerTaskCnt: 0, towerTaskRefTime: curTime, towerTaskReCnt: 0}, {new: true}).lean(lean);
return role;
}
// 刷新派遣任务次数增长
public static async increaseTowerCnt(roleId: string, num: number, lean = true) {
const role = await RoleModel.findOneAndUpdate({roleId}, {$inc: {towerTaskCnt: num}}, {new: true}).lean(lean);
return role;
}
// 派遣任务增加刷新次数
public static async increaseTowerRefCnt(roleId: string, num: number, lean = true) {
const role = await RoleModel.findOneAndUpdate({roleId}, {$inc: {towerTaskReCnt: num}}, {new: true}).lean(lean);
return role;
}
// 刷新远征重置次数
public static async increaseExpeditionResetCnt(roleId: string, needRefresh: boolean, curTime: Date, lean = true) {
let role = null;
if (needRefresh) {
role = await RoleModel.findOneAndUpdate({roleId}, {expeditionResetCnt: 1, expeditionResetRefTime: curTime}, {new: true}).lean(lean);
} else {
role = await RoleModel.findOneAndUpdate({roleId}, {$inc: {expeditionResetCnt: 1}}, {new: true}).lean(lean);
}
return role;
}
// 购买次数
public static async buyCnt(roleId: string, needRefresh: boolean, inc: number, curTime: Date, lean = true) { console.log('&*&*&*&*&')
let role = null;
if (needRefresh) {
role = await RoleModel.findOneAndUpdate({roleId}, {dungeonCnt: 0, dungeonRefTime: curTime, dungeonBuyCnt: inc}, {new: true}).lean(lean);
} else {
role = await RoleModel.findOneAndUpdate({roleId}, {$inc: {dungeonBuyCnt: inc}}, {new: true}).lean(lean);
}
return role;
}
// 增加次数
public static async increaseDungeonCnt(roleId: string, needRefresh: boolean, inc: number, curTime: Date, lean = true) {
let role = null;
if (needRefresh) {
role = await RoleModel.findOneAndUpdate({roleId}, {dungeonCnt: inc, dungeonRefTime: curTime, dungeonBuyCnt: 0}, {new: true}).lean(lean);
} else {
role = await RoleModel.findOneAndUpdate({roleId}, {$inc: {dungeonCnt: inc}}, {new: true}).lean(lean);
}
return role;
}
// 获取排行榜
public static async getRank(type: string, serverId: number, fields: Array<string>, page = 1, limit = 100, lean = true) {
let sortBy = {};
if(type == 'tower') {
sortBy['towerLv'] = -1;
sortBy['towerUpTime'] = 1;
}
const ranks = await RoleModel.find({serverId}).select(fields.join(' ')).sort(sortBy).limit(limit).skip((page - 1) * limit).lean(lean);
return ranks;
}
public static async updateSumCe(roleId: string, hid: number, ce: number, oldCe: number, lean = true) {
let role = await RoleModel.findByRoleId(roleId);
let topFive = role?.topFive||new Array();
let distance = ce - oldCe;
topFive.sort((a, b) => {return b.ce - a.ce}); // 0-5最大-最小
let index = topFive.findIndex(cur => cur.hid == hid);
if(index == -1) { // 不在最强列表
if(topFive.length < 5) { // 不满5人
topFive.push({hid, ce});
} else if(topFive.length == 5){
if(ce > topFive[topFive.length - 1].ce) { // 跻身最强5人
topFive.pop();
topFive.push({hid, ce});
}
} else {
topFive.splice(5, topFive.length - 5);
}
} else { // 原来就是最强5人
if(ce < topFive[topFive.length - 1].ce) { // 滑出最强
let heroes = await HeroModel.getTopHero(roleId, 5);
topFive = heroes.map(cur => {return {hid: cur.hid, ce: cur.ce}});
} else {
topFive[index].ce = ce;
}
}
let topFiveCe = topFive.reduce((pre, cur) => {
return pre + cur.ce
}, 0);
await RoleModel.findOneAndUpdate({roleId}, { topFive, topFiveCe, $inc: {ce: distance} }).lean(lean);
}
// 保存秘境首通队伍
public static async saveDungeonHero(roleId: string, battleId: number, heroes: Array<number>, isSuccess: boolean) {
if(isSuccess) {
const role = await Role.findByRoleId(roleId);
let dungeonHeroes = role && role.dungeonHeroes;
let hasHero = dungeonHeroes&&dungeonHeroes.find(cur => cur.battleId == battleId);
if(!dungeonHeroes || !hasHero) {
await RoleModel.findOneAndUpdate({roleId}, {$push:{dungeonHeroes: {battleId, heroes}}})
}
}
}
// 保存开启功能
public static async pushFuncs(roleId: string, funcs: Array<number>, lean = true) {
const recs = await RoleModel.findOneAndUpdate({roleId}, {$push: {funcs: {$each: funcs}}}, {new: true}).lean(lean);
return recs
}
public static async updateRoleInfo(roleId: string, roleUpdate:roleUpdate, lean = true) {
delete roleUpdate._id;
let result = await HeroModel.findOneAndUpdate({roleId}, {$set:roleUpdate}).lean(lean);
return result||{};
}
} }
export const RoleModel = getModelForClass(Role); export const RoleModel = getModelForClass(Role);

View File

@@ -1,13 +1,13 @@
import { getHeroInfoById, getStarRatio, getHeroSkillById, getSeidById, getOlySeidByType, getGoodById } from "./gamedata"; import { getHeroInfoById, getStarRatio, /*getHeroSkillById,*/ getSeidById, getOlySeidByType, getGoodById } from "./gamedata";
import { ABI_TYPE, SEID_TYPE } from "../consts/abilityConst"; import { getAtrrNameById, ABI_TYPE, SEID_TYPE } from "../consts/abilityConst";
import { WAR_JSON_ATTRIBUTE_TYPE, EXPRESSION } from '../consts/consts'; import { EXPRESSION } from '../consts/consts';
export default class Actor { export default class Actor {
private hid: number = 0; private hid: number = 0;
private lv: number = 0; private lv: number = 0;
private oldCe: number = 0; private oldCe: number = 0;
private star: number = 0; private star: number = 0;
private fire: number = 0; private colorStar: number = 0;
private equips: Array<any> = []; private equips: Array<any> = [];
private conections: Array<{id: number;name: string;valid: boolean;}> = []; private conections: Array<{id: number;name: string;valid: boolean;}> = [];
/**被动技能 */ /**被动技能 */
@@ -19,9 +19,9 @@ export default class Actor {
this.lv = hero.lv; this.lv = hero.lv;
this.oldCe = hero.ce; this.oldCe = hero.ce;
this.star = hero.star; this.star = hero.star;
this.fire = hero.fire; this.colorStar = hero.colorStar;
this.equips = hero.equips; this.equips = hero.equips;
console.log(this.hid, this.lv, this.oldCe, this.star, this.fire, this.conections); console.log(this.hid, this.lv, this.oldCe, this.star, this.colorStar, this.conections);
this.updateActorEffect(); this.updateActorEffect();
} }
@@ -47,21 +47,21 @@ export default class Actor {
/**更新武将的被动技能 */ /**更新武将的被动技能 */
updateSkillInfo(){ updateSkillInfo(){
let dicHero = getHeroInfoById(this.hid); // let dicHero = getHeroInfoById(this.hid);
// console.log('updateSkillInfo', dicHero.skill, getHeroSkillById(dicHero.skill)) // console.log('updateSkillInfo', dicHero.skill, getHeroSkillById(dicHero.skill))
//被动技能 //被动技能
if(dicHero.skill){ // if(dicHero.skill){
let {seidLvUpArr} = getHeroSkillById(dicHero.skill); // let {seidLvUpArr} = getHeroSkillById(dicHero.skill);
for(let ii = 0;ii < seidLvUpArr.length;ii+=2){ // for(let ii = 0;ii < seidLvUpArr.length;ii+=2){
if(this.lv >= seidLvUpArr[ii + 1]){ // if(this.lv >= seidLvUpArr[ii + 1]){
let dicSeid = getSeidById(seidLvUpArr[ii]); // let dicSeid = getSeidById(seidLvUpArr[ii]);
// console.log('updateSkillInfo*', seidLvUpArr[ii], dicSeid) // // console.log('updateSkillInfo*', seidLvUpArr[ii], dicSeid)
if(dicSeid){ // if(dicSeid){
this.seidList[Math.floor(ii/2)] = dicSeid; // this.seidList[Math.floor(ii/2)] = dicSeid;
} // }
} // }
} // }
} // }
} }
addSeidEffect(seidId:number, seidValue?:Array<number>){ addSeidEffect(seidId:number, seidValue?:Array<number>){
@@ -260,7 +260,7 @@ export default class Actor {
let json = {hp: 0, atk: 0, matk: 0, def: 0, mdef: 0, agi: 0, speed: 0, luk: 0, hit: 0, cri: 0, flee: 0, antCri: 0, damageIncrease: 0, damageDecrease: 0, defIngnore: 0, bloodSuck: 0}; let json = {hp: 0, atk: 0, matk: 0, def: 0, mdef: 0, agi: 0, speed: 0, luk: 0, hit: 0, cri: 0, flee: 0, antCri: 0, damageIncrease: 0, damageDecrease: 0, defIngnore: 0, bloodSuck: 0};
for(let i = ABI_TYPE.ABI_HP;i < ABI_TYPE.ABI_MAX;i++){ for(let i = ABI_TYPE.ABI_HP;i < ABI_TYPE.ABI_MAX;i++){
let field = WAR_JSON_ATTRIBUTE_TYPE[i]; let field = getAtrrNameById(i);
json[field] = this.getRealAbility(i); json[field] = this.getRealAbility(i);
} }
return json return json

View File

@@ -1,6 +1,6 @@
import fs = require('fs'); import fs = require('fs');
import path = require('path'); import path = require('path');
import { ABI_TYPE } from '../consts/abilityConst'; import { ABI_TYPE, ABI_STAGE } from '../consts/abilityConst';
import { decodeIdCntArrayStr, getRandEelm } from './util'; import { decodeIdCntArrayStr, getRandEelm } from './util';
import { IT_TYPE } from '../consts/consts'; import { IT_TYPE } from '../consts/consts';
@@ -11,7 +11,10 @@ const towerInfos = new Map<number, any>();
const towerTaskInfos = new Map<number, any>(); const towerTaskInfos = new Map<number, any>();
const heroInfos = new Map<number, any>(); const heroInfos = new Map<number, any>();
const jobInfos = new Map<number, any>(); const jobInfos = new Map<number, any>();
const jobClassMaxGrades = new Map<number, {grade:number, jobid:number}>();
const jobClassAndgrades = new Map<string, {jobid:number, unlockLevel:number}>();
const levelInfos = new Map<number, {sum: number, cur: number}>(); const levelInfos = new Map<number, {sum: number, cur: number}>();
const heroLevelInfo = new Map<number, number>();
const starRatioInfo = new Map<number, number>(); const starRatioInfo = new Map<number, number>();
const heroSkillInfo = new Map<number, any>() const heroSkillInfo = new Map<number, any>()
const seidInfo = new Map<number, any>(); const seidInfo = new Map<number, any>();
@@ -24,6 +27,28 @@ const blueprtToWar = new Map<number, number>();
const goodInfo = new Map<number, any>(); const goodInfo = new Map<number, any>();
const blueprt = new Map<number, Array<number>>(); const blueprt = new Map<number, Array<number>>();
const blueprtCompose = new Map<number, any>(); const blueprtCompose = new Map<number, any>();
const fiendShips = new Map<string, any>();
const fashions = new Map<number, any>();
const fiendShipHidAandIds = new Map<number, {actorId: number, level:number}>();
const fiendShipLevelMaps = new Map<number, any>();
interface dicStar {
id: number;
quality: number;
star: number;
advanceUpFragmentNum: number;
ceAttr: Map<number, number>
}
const heroStarList = new Map<string, dicStar>();
interface dicWake {
id: number;
quality: number;
star: number;
fragmentNum: number;
consume: string;
ceAttr: Map<number, number>
}
const heroWakeList = new Map<string, dicWake>();
function parseWarData() { function parseWarData() {
let result = null; let result = null;
@@ -96,6 +121,11 @@ function parseJobData() {
jobsData.forEach(elem => { jobsData.forEach(elem => {
if (elem && elem.jobid) { if (elem && elem.jobid) {
jobInfos.set(elem.jobid, elem); jobInfos.set(elem.jobid, elem);
let jobClass = jobClassMaxGrades.get(elem.job_class);
if (!!jobClass && jobClass.grade < elem.grade) {
jobClassMaxGrades.set(elem.job_class, {grade: elem.grade,jobid: elem.jobid});
}
jobClassAndgrades.set(elem.job_class+'_'+elem.grade,{unlockLevel:elem.unlockLevel, jobid:elem.jobid});
} }
}); });
} }
@@ -113,6 +143,18 @@ function parseLevelInfo() {
}); });
} }
function parseHeroLevelInfo() {
const jobFile = 'dic_zyz_charexp';
const levelData = gamedata['jsons'][jobFile] || [];
let exp = 0;
levelData.forEach(elem => {
if (elem && elem.level) {
exp += elem.exp;
heroLevelInfo.set(elem.level, exp);
}
});
}
function parseStarRatio() { function parseStarRatio() {
const file = 'dic_star_ratio'; const file = 'dic_star_ratio';
const data = gamedata['jsons'][file] || []; const data = gamedata['jsons'][file] || [];
@@ -128,21 +170,23 @@ function parseHeroSkill() {
const data = gamedata['jsons'][file] || []; const data = gamedata['jsons'][file] || [];
data.forEach(elem => { data.forEach(elem => {
if (elem && elem.skillid) { if (elem && elem.skillid) {
const seidLvUpArr = new Array<number>(); let starSeidArr = new Array<{star: number, value: number}>();
let skillArr = (elem.seid as string).split('&'); let colorStarSeidArr = new Array<{star: number, value: number}>();
let lvUpArr = (elem.selv_up as string).split('&');
for(let i = 0;i < skillArr.length;i++){ (elem.starSeid as string).split('|').forEach(cur => {
if(skillArr[i]==="") continue; if(cur) {
seidLvUpArr.push(parseInt(skillArr[i])); let a = cur.split('&');
if(lvUpArr[i]){ starSeidArr.push({star: parseInt(a[0]), value: parseInt(a[1])});
seidLvUpArr.push(parseInt(lvUpArr[i]));
} }
else{ });
seidLvUpArr.push(1000); (elem.colorStarSeid as string).split('|').forEach(cur => {
if(cur) {
let a = cur.split('&');
colorStarSeidArr.push({star: parseInt(a[0]), value: parseInt(a[1])});
} }
} });
heroSkillInfo.set(elem.skillid, {seidLvUpArr});
heroSkillInfo.set(elem.skillid, {starSeidArr, colorStarSeidArr});
} }
}); });
} }
@@ -220,6 +264,50 @@ function parseBlueprtCompose() {
}); });
} }
function parseFashions() {
const file = 'dic_zyz_fashions';
const data = gamedata['jsons'][file] || [];
data.forEach(elem => {
if (elem && elem.id) {
fashions.set(elem.id, elem);
}
});
}
function parseFiendShips() {
const file = 'dic_zyz_friend_ship';
const data = gamedata['jsons'][file] || [];
data.forEach(elem => {
if (elem && elem.id) {
let hids = elem.memberId.split('&');
elem.hids = hids;
delete elem.memberId;
fiendShips.set(elem.shipId + '_' + elem.level, elem);
let fiendShipHidAandId = fiendShipHidAandIds.get(elem.shipId);
if (!fiendShipHidAandId || fiendShipHidAandId.level < elem.level)
fiendShipHidAandIds.set(elem.shipId, {actorId: elem.actorId, level: elem.level});
}
});
}
function parseFiendShipLevels() {
const file = 'dic_zyz_friend_ship_level';
const data = gamedata['jsons'][file] || [];
data.sort(function(a, b) {
return a.level - b.level;
});
}
function parseFiendShipLevelMaps() {
const file = 'dic_zyz_friend_ship_level';
const data = gamedata['jsons'][file] || [];
data.forEach(elem => {
if (elem && elem.id) {
fiendShipLevelMaps.set(elem.level, elem);
}
});
}
function initData (folder: string) { function initData (folder: string) {
if(!gamedata.hasOwnProperty(folder)) { if(!gamedata.hasOwnProperty(folder)) {
gamedata[folder] = {}; gamedata[folder] = {};
@@ -233,7 +321,7 @@ function initData (folder: string) {
var name = file.split('.')[0]; var name = file.split('.')[0];
try { try {
gamedata[folder][name] = JSON.parse( gamedata[folder][name] = JSON.parse(
fs.readFileSync(path.resolve(__dirname, "../resource/" + folder + "/" + file)).toString() fs.readFileSync(path.resolve(__dirname, "../resource/" + folder + "/" + file)).toString('utf8').replace(/^\uFEFF/, '')
); );
} catch(e) { } catch(e) {
console.error(e); console.error(e);
@@ -244,6 +332,43 @@ function initData (folder: string) {
}); });
} }
function parseHeroStar() {
const file = 'dic_zyz_hero_star';
const data = gamedata['jsons'][file] || [];
data.forEach(elem => {
if (elem.id) {
let ceAttr = new Map<number, number>();
ceAttr.set(ABI_STAGE.HP, elem.hp_up);
ceAttr.set(ABI_STAGE.ATK, elem.atk_up);
ceAttr.set(ABI_STAGE.DEF, elem.def_up);
ceAttr.set(ABI_STAGE.MDEF, elem.mdef_up);
ceAttr.set(ABI_STAGE.AGI, elem.agi_up);
ceAttr.set(ABI_STAGE.LUK, elem.luk_up);
heroStarList.set(`${elem.quality}_${elem.star}`,{ceAttr, ...elem});
}
});
}
function parseHeroWake() {
const file = 'dic_zyz_hero_wake';
const data = gamedata['jsons'][file] || [];
data.forEach(elem => {
if (elem.id) {
let ceAttr = new Map<number, number>();
ceAttr.set(ABI_STAGE.HP, elem.hp_up);
ceAttr.set(ABI_STAGE.ATK, elem.atk_up);
ceAttr.set(ABI_STAGE.DEF, elem.def_up);
ceAttr.set(ABI_STAGE.MDEF, elem.mdef_up);
ceAttr.set(ABI_STAGE.AGI, elem.agi_up);
ceAttr.set(ABI_STAGE.LUK, elem.luk_up);
heroWakeList.set(`${elem.quality}_${elem.star}`,{ceAttr, ...elem});
}
});
}
function parseData() { function parseData() {
parseWarData(); parseWarData();
parseTowerData(); parseTowerData();
@@ -251,6 +376,7 @@ function parseData() {
parseHeroData(); parseHeroData();
parseJobData(); parseJobData();
parseLevelInfo(); parseLevelInfo();
parseHeroLevelInfo();
parseStarRatio(); parseStarRatio();
parseHeroSkill(); parseHeroSkill();
parseSeidList(); parseSeidList();
@@ -259,6 +385,12 @@ function parseData() {
parseComBtlData(); parseComBtlData();
parseGood(); parseGood();
parseBlueprtCompose(); parseBlueprtCompose();
parseFashions();
parseFiendShips();
parseFiendShipLevels();
parseFiendShipLevelMaps();
parseHeroStar();
parseHeroWake();
} }
initData('jsons'); // 加载一般json initData('jsons'); // 加载一般json
@@ -312,6 +444,11 @@ export function getJobInfoById(jid: number) {
return jobInfo; return jobInfo;
} }
export function getMaxGradeByjobClass(jobClass: number) {
const job = jobClassMaxGrades.get(jobClass);
return job?.jobid;
}
export function getLvByExp(exp: number) { export function getLvByExp(exp: number) {
let curLv = 0; let curLv = 0;
let entries = levelInfos.entries(); let entries = levelInfos.entries();
@@ -327,6 +464,21 @@ export function getExpByLv(lv: number) {
return levelInfos.get(lv); return levelInfos.get(lv);
} }
export function getHeroLvByExp(exp: number) {
let curLv = 0;
let entries = heroLevelInfo.entries();
for (let [lv, sum] of entries) {
curLv = lv;
if(exp < sum) break;
}
return curLv;
}
export function getHeroExpByLv(lv: number) {
return heroLevelInfo.get(lv);
}
export function getStarRatio(star: number) { export function getStarRatio(star: number) {
return starRatioInfo.get(star); return starRatioInfo.get(star);
} }
@@ -412,3 +564,36 @@ export function hasExpeditionById(id: number) {
export function getBlueprtComposeByQuality(quality: number) { export function getBlueprtComposeByQuality(quality: number) {
return blueprtCompose.get(quality); return blueprtCompose.get(quality);
} }
export function getFashionsById(id:number) {
return fashions.get(id);
}
export function getFriendShipById(shipId: number, level: number) {
return fiendShips.get(shipId +'_' + level);
}
export function getHidAndLevelByShipId(shipId: number) {
return fiendShipHidAandIds.get(shipId);
}
export function getFriendShipLevels() {
const file = 'dic_zyz_friend_ship_level';
return gamedata['jsons'][file] || [];
}
export function getJobByGradeAndClass(jobClass: number, grade: number) {
return jobClassAndgrades.get(jobClass +'_' + grade);
}
export function getHeroStar(quality: number, star: number) {
return heroStarList.get(`${quality}_${star}`);
}
export function getHeroWake(quality: number, star: number) {
return heroWakeList.get(`${quality}_${star}`);
}
export function getFiendShipLevel(level: number) {
return fiendShipLevelMaps.get(level);
}

View File

@@ -104,6 +104,12 @@ const moment = require('moment');
result = { id: parseInt(id), weight: parseInt(weight) }; result = { id: parseInt(id), weight: parseInt(weight) };
break; break;
} }
case 'cost': {
let [id, count] = arr;
if(isNaN(id) || isNaN(count)) throw new Error('data table format wrong');
result = { id: parseInt(id), count: parseInt(count)};
break;
}
} }
return result; return result;
}; };
@@ -392,3 +398,16 @@ export function ratioReward(rewardStr: string, ratio: number): string {
} }
return res.substring(0, res.length - 1); return res.substring(0, res.length - 1);
} }
export function getItems(str:string) {
let arr = new Array<{id: number, count: number}>();
let strArr = str.split('|');
for (let item of strArr) {
var itemArr = item.split('&');
arr.push({
id : parseInt(itemArr[0]),
count : parseInt(itemArr[1])
});
}
return arr;
}

View File

@@ -1,9 +1,9 @@
[ [
{ {
"IsTestService":true, "IsTestService":true,
"OpenIosAliPay":false, "OpenIosAliPay":false,
"GuideSwitch":true, "GuideSwitch":true,
"GENERAL_EQUIPMENT_DEFAULT_LEVEL":7, "GENERAL_EQUIPMENT_DEFAULT_LEVEL":7,
"ServiceSign":"guanfu" "ServiceSign":"guanfu"
} }
] ]

View File

@@ -6,7 +6,7 @@
}, },
{ {
"min": 40, "min": 40,
"max": 69, "max": 59,
"possibility": "1&70|2&30" "possibility": "1&70|2&30"
}, },
{ {

File diff suppressed because it is too large Load Diff

View File

@@ -1,658 +0,0 @@
[
{
"jobid": 1,
"name": "短剑步兵",
"grade": 1,
"training": 20,
"job_class": 1,
"type": 1,
"imgid": 2,
"spe": 4,
"atkid": 2,
"move": 1,
"music": 1,
"seid": "0&",
"effect": "eff_503",
"info": "步兵系1级。擅长防御的步兵部队。适合守卫城。虽然优于远距离攻击部队但却劣于骑兵部队。"
},
{
"jobid": 2,
"name": "长剑步兵",
"grade": 2,
"training": 40,
"job_class": 1,
"type": 1,
"imgid": 2,
"spe": 4,
"atkid": 2,
"move": 1,
"music": 1,
"seid": "0&",
"effect": "eff_503",
"info": "步兵系2级。擅长防御的步兵部队。比起上一阶段防御增强有着很强的守卫能力。"
},
{
"jobid": 3,
"name": "强剑步兵",
"grade": 3,
"training": 60,
"job_class": 1,
"type": 1,
"imgid": 3,
"spe": 5,
"atkid": 2,
"move": 1,
"music": 1,
"seid": "0&",
"effect": "eff_503",
"info": "步兵系3级。擅长防御的步兵部队。比起上一阶段移动力增强能更妥善运用。"
},
{
"jobid": 4,
"name": "近卫兵",
"grade": 4,
"training": 80,
"job_class": 1,
"type": 1,
"imgid": 3,
"spe": 5,
"atkid": 2,
"move": 1,
"music": 1,
"seid": "0&",
"effect": "eff_502",
"info": "步兵系4级。擅长防御的步兵部队。比起上一阶段对间接攻击的防御增强防御能力更强。"
},
{
"jobid": 5,
"name": "御林军",
"grade": 5,
"training": 99,
"job_class": 1,
"type": 1,
"imgid": 4,
"spe": 5,
"atkid": 2,
"move": 1,
"music": 1,
"seid": "0&",
"effect": "eff_501",
"info": "步兵系5级。擅长防御的步兵部队。比起上一阶段攻击力增强许多可全方位活用攻击与防御。"
},
{
"jobid": 6,
"name": "短枪兵",
"grade": 1,
"training": 20,
"job_class": 2,
"type": 1,
"imgid": 5,
"spe": 4,
"atkid": 1,
"move": 1,
"music": 1,
"seid": "0&",
"effect": "eff_500",
"info": "枪兵系1级。擅长攻击的步兵部队。在城内与森林较有优势。与步兵系类似但是在与骑兵部队战斗时较有优势。"
},
{
"jobid": 7,
"name": "长枪兵",
"grade": 2,
"training": 40,
"job_class": 2,
"type": 1,
"imgid": 5,
"spe": 4,
"atkid": 6,
"move": 1,
"music": 1,
"seid": "0&",
"effect": "eff_504",
"info": "枪兵系2级。擅长攻击的步兵部队。比起上一阶段攻击范围增加可让敌人的反击无效。"
},
{
"jobid": 8,
"name": "强枪兵",
"grade": 3,
"training": 60,
"job_class": 2,
"type": 1,
"imgid": 6,
"spe": 5,
"atkid": 6,
"move": 1,
"music": 1,
"seid": "0&",
"effect": "eff_500",
"info": "枪兵系3级。擅长攻击的步兵部队。比起上一阶段移动力增强可快速追击敌人。"
},
{
"jobid": 9,
"name": "斩马队",
"grade": 4,
"training": 80,
"job_class": 2,
"type": 1,
"imgid": 6,
"spe": 5,
"atkid": 6,
"move": 1,
"music": 1,
"seid": "0&",
"effect": "eff_500",
"info": "枪兵系4级。擅长攻击的步兵部队。比起上一阶段对于骑兵的伤害加强可以迅速的消灭骑兵部队。"
},
{
"jobid": 10,
"name": "白耳兵",
"grade": 5,
"training": 99,
"job_class": 2,
"type": 1,
"imgid": 7,
"spe": 5,
"atkid": 6,
"move": 1,
"music": 1,
"seid": "0&",
"effect": "eff_505",
"info": "枪兵系5级。擅长攻击的步兵部队。比起上一阶段攻击力增强许多是消灭骑兵的杀手。"
},
{
"jobid": 11,
"name": "短枪骑兵",
"grade": 1,
"training": 20,
"job_class": 3,
"type": 1,
"imgid": 14,
"spe": 6,
"atkid": 1,
"move": 2,
"music": 2,
"seid": "0&",
"effect": "eff_500",
"info": "轻骑兵系1级。移动力优秀的骑兵部队。不擅长艰险的地形对步兵部队的攻击较强但对远距离攻击部队较弱。"
},
{
"jobid": 12,
"name": "长枪骑兵",
"grade": 2,
"training": 40,
"job_class": 3,
"type": 1,
"imgid": 14,
"spe": 6,
"atkid": 1,
"move": 2,
"music": 2,
"seid": "0&",
"effect": "eff_500",
"info": "轻骑兵系2级。移动力优秀的骑兵部队。比起上一阶段攻击力增强更有威胁性。"
},
{
"jobid": 13,
"name": "强枪骑兵",
"grade": 3,
"training": 60,
"job_class": 3,
"type": 1,
"imgid": 15,
"spe": 7,
"atkid": 6,
"move": 2,
"music": 2,
"seid": "0&",
"effect": "eff_500",
"info": "轻骑兵系3级。移动力优秀的骑兵部队。比起上一阶段攻击范围与移动力增强活用性与运用性较好。"
},
{
"jobid": 14,
"name": "禁卫队",
"grade": 4,
"training": 80,
"job_class": 3,
"type": 1,
"imgid": 15,
"spe": 7,
"atkid": 6,
"move": 2,
"music": 2,
"seid": "0&",
"effect": "eff_500",
"info": "轻骑兵系4级。移动力优秀的骑兵部队。比起上一阶段强化了攻击力平原战的主力。"
},
{
"jobid": 15,
"name": "疾风骑",
"grade": 5,
"training": 99,
"job_class": 3,
"type": 1,
"imgid": 16,
"spe": 7,
"atkid": 6,
"move": 2,
"music": 2,
"seid": "0&",
"effect": "eff_500",
"info": "轻骑兵系5级。移动力优秀的骑兵部队。比起上一阶段战斗力进一步强化是可以依赖的主力部队。"
},
{
"jobid": 16,
"name": "短弓兵",
"grade": 1,
"training": 20,
"job_class": 4,
"type": 1,
"imgid": 8,
"spe": 4,
"atkid": 3,
"move": 1,
"music": 1,
"seid": "0&",
"effect": "eff_505",
"info": "弓兵系1级。命中率高的远距离攻击部队。以远距离攻击为特征虽然优于骑兵部队但却劣于步兵。"
},
{
"jobid": 17,
"name": "长弓兵",
"grade": 2,
"training": 40,
"job_class": 4,
"type": 1,
"imgid": 8,
"spe": 4,
"atkid": 4,
"move": 1,
"music": 1,
"seid": "0&",
"effect": "eff_500",
"info": "弓兵系2级。命中率高的远距离攻击部队。比起上一阶段增强了爆发力拥有更高的命中率。"
},
{
"jobid": 18,
"name": "强弓兵",
"grade": 3,
"training": 60,
"job_class": 4,
"type": 1,
"imgid": 9,
"spe": 5,
"atkid": 5,
"move": 1,
"music": 1,
"seid": "0&",
"effect": "eff_504",
"info": "弓兵系3级。命中率高的远距离攻击部队。比起上一阶段增加了攻击范围移动力也增强因此也可在艰险的地形使用。"
},
{
"jobid": 19,
"name": "远射队",
"grade": 4,
"training": 80,
"job_class": 4,
"type": 1,
"imgid": 9,
"spe": 5,
"atkid": 5,
"move": 1,
"music": 1,
"seid": "0&",
"effect": "eff_505",
"info": "弓兵系4级。命中率高的远距离攻击部队。比起上一阶段加强了物理攻击可给予敌人大伤害。"
},
{
"jobid": 20,
"name": "弓将",
"grade": 5,
"training": 99,
"job_class": 4,
"type": 1,
"imgid": 10,
"spe": 6,
"atkid": 5,
"move": 1,
"music": 1,
"seid": "0&",
"effect": "eff_505",
"info": "弓兵系5级。命中率高的远距离攻击部队。比起上一阶段加强了物理攻击。可趁敌人接近前击杀。"
},
{
"jobid": 21,
"name": "武斗家",
"grade": 1,
"training": 20,
"job_class": 5,
"type": 1,
"imgid": 22,
"spe": 5,
"atkid": 1,
"move": 1,
"music": 1,
"seid": "0&",
"effect": "eff_500",
"info": "武斗家系1级。爆发力强的特殊部队也能使用妨害系的策略。虽然比起步兵部队防御力较弱但是敏捷性与攻击力较高。"
},
{
"jobid": 22,
"name": "力士",
"grade": 2,
"training": 40,
"job_class": 5,
"type": 1,
"imgid": 22,
"spe": 5,
"atkid": 2,
"move": 1,
"music": 1,
"seid": "0&",
"effect": "eff_500",
"info": "武斗家系2级。爆发力强的特殊部队比起上一阶段提升了物理攻击的防御率是近身肉搏的高手。"
},
{
"jobid": 23,
"name": "斗士",
"grade": 3,
"training": 60,
"job_class": 5,
"type": 1,
"imgid": 23,
"spe": 6,
"atkid": 2,
"move": 1,
"music": 1,
"seid": "0&",
"effect": "eff_500",
"info": "武斗家系3级。爆发力强的特殊部队比起上一阶段移动力增强适合当战斗的前锋。"
},
{
"jobid": 24,
"name": "拳士",
"grade": 4,
"training": 80,
"job_class": 5,
"type": 1,
"imgid": 23,
"spe": 6,
"atkid": 2,
"move": 1,
"music": 1,
"seid": "0&",
"effect": "eff_500",
"info": "武斗家系4级。爆发力强的特殊部队比起上一阶段全防御率进一步提升是我军的中坚力量。"
},
{
"jobid": 25,
"name": "拳圣",
"grade": 5,
"training": 99,
"job_class": 5,
"type": 1,
"imgid": 24,
"spe": 6,
"atkid": 2,
"move": 1,
"music": 1,
"seid": "0&",
"effect": "eff_500",
"info": "武斗家系5级。爆发力强的特殊部队。比起上一阶段妨害系策略变强战斗时可站在前锋或在后方支援。"
},
{
"jobid": 26,
"name": "策士",
"grade": 1,
"training": 20,
"job_class": 6,
"type": 2,
"imgid": 39,
"spe": 4,
"atkid": 1,
"move": 1,
"music": 1,
"seid": "0&",
"effect": "eff_500",
"info": "策士系1级。使用攻击策略的文官部队。火系、水系、地系等策略是其专长。"
},
{
"jobid": 27,
"name": "参谋",
"grade": 2,
"training": 40,
"job_class": 6,
"type": 2,
"imgid": 39,
"spe": 4,
"atkid": 1,
"move": 1,
"music": 1,
"seid": "0&",
"effect": "eff_500",
"info": "策士系2级。使用攻击策略的文官部队。比起上一阶段火系策略较强变得更强悍。对精神力较差的敌人来说是个恐怖的对象。"
},
{
"jobid": 28,
"name": "军师",
"grade": 3,
"training": 60,
"job_class": 6,
"type": 2,
"imgid": 40,
"spe": 5,
"atkid": 1,
"move": 1,
"music": 1,
"seid": "0&",
"effect": "eff_500",
"info": "策士系3级。使用攻击策略的文官部队。比起上一阶段移动力增强可快速支援策略。"
},
{
"jobid": 29,
"name": "大军师",
"grade": 4,
"training": 80,
"job_class": 6,
"type": 2,
"imgid": 40,
"spe": 5,
"atkid": 1,
"move": 1,
"music": 1,
"seid": "0&",
"effect": "eff_500",
"info": "策士系4级。使用攻击策略的文官部队。比起上一阶段精神力增强用策略给予敌人致命的打击。"
},
{
"jobid": 30,
"name": "智囊",
"grade": 5,
"training": 99,
"job_class": 6,
"type": 2,
"imgid": 41,
"spe": 5,
"atkid": 1,
"move": 1,
"music": 1,
"seid": "0&",
"effect": "eff_500",
"info": "策士系5级。使用攻击策略的文官部队。比起上一阶段精神力变得更强。达到极限的策略破坏力实际上非常惊人是个令人恐惧的部队。"
},
{
"jobid": 31,
"name": "道士",
"grade": 1,
"training": 20,
"job_class": 7,
"type": 2,
"imgid": 45,
"spe": 4,
"atkid": 1,
"move": 1,
"music": 1,
"seid": "0&",
"effect": "eff_500",
"info": "道士系1级。使用妨害策略的文官部队。不受气候或地形影响可以使用各种策略。"
},
{
"jobid": 32,
"name": "才士",
"grade": 2,
"training": 40,
"job_class": 7,
"type": 2,
"imgid": 45,
"spe": 4,
"atkid": 1,
"move": 1,
"music": 1,
"seid": "0&",
"effect": "eff_500",
"info": "道士系2级。使用妨害策略的文官部队。比起上一阶段妨害系策略增强可使用更多的策略妨害敌人。"
},
{
"jobid": 33,
"name": "幻术师",
"grade": 3,
"training": 60,
"job_class": 7,
"type": 2,
"imgid": 46,
"spe": 5,
"atkid": 1,
"move": 1,
"music": 1,
"seid": "0&",
"effect": "eff_500",
"info": "道士系3级。使用妨害策略的文官部队。比起上一阶段HP增强生存能力得以提高。"
},
{
"jobid": 34,
"name": "妖术师",
"grade": 4,
"training": 80,
"job_class": 7,
"type": 2,
"imgid": 46,
"spe": 5,
"atkid": 1,
"move": 1,
"music": 1,
"seid": "0&",
"effect": "eff_500",
"info": "道士系4级。使用妨害策略的文官部队。比起上一阶段士气增强策略的暴击几率得到提高。"
},
{
"jobid": 35,
"name": "祭司长",
"grade": 5,
"training": 99,
"job_class": 7,
"type": 2,
"imgid": 47,
"spe": 5,
"atkid": 1,
"move": 1,
"music": 1,
"seid": "0&",
"effect": "eff_500",
"info": "道士系5级。使用妨害策略的文官部队。比起上一阶段获得拥有特殊力量的策略在战场上给敌人制造各种各样的困难。"
},
{
"jobid": 36,
"name": "风水师",
"grade": 1,
"training": 20,
"job_class": 8,
"type": 2,
"imgid": 42,
"spe": 4,
"atkid": 1,
"move": 1,
"music": 1,
"seid": "0&",
"effect": "eff_500",
"info": "风水师系1级。使用回复策略的文官部队。后方支援部队在大战中能大放异彩。"
},
{
"jobid": 37,
"name": "方术士",
"grade": 2,
"training": 40,
"job_class": 8,
"type": 2,
"imgid": 42,
"spe": 5,
"atkid": 1,
"move": 1,
"music": 1,
"seid": "0&",
"effect": "eff_500",
"info": "风水师系2级。使用回复策略的文官部队。比起上一阶段移动力增强可快速提供后方支援。"
},
{
"jobid": 38,
"name": "仙术士",
"grade": 3,
"training": 60,
"job_class": 8,
"type": 2,
"imgid": 43,
"spe": 6,
"atkid": 1,
"move": 1,
"music": 1,
"seid": "0&",
"effect": "eff_500",
"info": "风水师系3级。使用回复策略的文官部队。比起上一阶段对间接伤害的防御增强可快速提供后方支援。"
},
{
"jobid": 39,
"name": "咒术士",
"grade": 4,
"training": 80,
"job_class": 8,
"type": 2,
"imgid": 43,
"spe": 6,
"atkid": 1,
"move": 1,
"music": 1,
"seid": "0&",
"effect": "eff_500",
"info": "风水师系4级。使用回复策略的文官部队。比起上一阶段MP增加可提供更多的支援给我军。"
},
{
"jobid": 40,
"name": "名医",
"grade": 5,
"training": 99,
"job_class": 8,
"type": 2,
"imgid": 44,
"spe": 6,
"atkid": 1,
"move": 1,
"music": 1,
"seid": "0&",
"effect": "eff_500",
"info": "风水师系5级。使用回复策略的文官部队。比起上一阶段学会更多治疗的策略是我军赖以生存的保障力量。"
},
{
"jobid": 41,
"name": "野兽",
"grade": 1,
"training": 99,
"job_class": 9,
"type": 1,
"imgid": 44,
"spe": 6,
"atkid": 1,
"move": 1,
"music": 1,
"seid": "0&",
"effect": "eff_500",
"info": "野兽。"
}
]

File diff suppressed because it is too large Load Diff

View File

@@ -3022,5 +3022,95 @@
"c_type": 106, "c_type": 106,
"data": "10&", "data": "10&",
"describe": "10回合内获得胜利" "describe": "10回合内获得胜利"
},
{
"warid": 3001,
"c_type": 302,
"data": "99&",
"describe": "取得胜利"
},
{
"warid": 3001,
"c_type": 102,
"data": "0&",
"describe": "我军全员生存"
},
{
"warid": 3001,
"c_type": 108,
"data": "1&",
"describe": "友军死亡不超过1"
},
{
"warid": 5001,
"c_type": 302,
"data": "99&",
"describe": "取得胜利"
},
{
"warid": 5001,
"c_type": 102,
"data": "0&",
"describe": "我军全员生存"
},
{
"warid": 5001,
"c_type": 106,
"data": "10&",
"describe": "10回合内获得胜利"
},
{
"warid": 5002,
"c_type": 302,
"data": "99&",
"describe": "取得胜利"
},
{
"warid": 5002,
"c_type": 102,
"data": "0&",
"describe": "我军全员生存"
},
{
"warid": 5002,
"c_type": 106,
"data": "10&",
"describe": "10回合内获得胜利"
},
{
"warid": 5501,
"c_type": 302,
"data": "99&",
"describe": "取得胜利"
},
{
"warid": 5501,
"c_type": 102,
"data": "0&",
"describe": "我军全员生存"
},
{
"warid": 5501,
"c_type": 106,
"data": "10&",
"describe": "10回合内获得胜利"
},
{
"warid": 5502,
"c_type": 302,
"data": "99&",
"describe": "取得胜利"
},
{
"warid": 5502,
"c_type": 102,
"data": "0&",
"describe": "我军全员生存"
},
{
"warid": 5502,
"c_type": 106,
"data": "10&",
"describe": "10回合内获得胜利"
} }
] ]

View File

@@ -0,0 +1,26 @@
[
{
"type": 1,
"name": "商店",
"icon": 2,
"description": "去商店买呀"
},
{
"type": 2,
"name": "关卡",
"icon": 3,
"description": "去关卡扫荡"
},
{
"type": 3,
"name": "招募",
"icon": 4,
"description": "招募获得"
},
{
"type": 4,
"name": "活动",
"icon": 5,
"description": "去活动页面"
}
]

View File

@@ -1,43 +1,74 @@
[{ [
"atkid": 1, {
"name": "近战普通攻击", "atkid": 1,
"cname": "攻击近距8格", "name": "近战普通攻击",
"isFullScene": false, "cname": "攻击近距8格",
"toSelf": false, "isFullScene": false,
"json": "[{\"x\":-1,\"y\":0},{\"x\":1,\"y\":0},{\"x\":0,\"y\":-1},{\"x\":0,\"y\":1},{\"x\":-1,\"y\":-1},{\"x\":1,\"y\":-1},{\"x\":-1,\"y\":1},{\"x\":1,\"y\":1}]" "toSelf": false,
}, { "json": "[{\"x\":-1,\"y\":0},{\"x\":1,\"y\":0},{\"x\":0,\"y\":-1},{\"x\":0,\"y\":1},{\"x\":-1,\"y\":-1},{\"x\":1,\"y\":-1},{\"x\":-1,\"y\":1},{\"x\":1,\"y\":1}]"
"atkid": 2, },
"name": "远程普通攻击", {
"cname": "攻击近中距12格", "atkid": 2,
"isFullScene": false, "name": "布衣远程普通攻击",
"toSelf": false, "cname": "攻击近中距12格",
"json": "[{\"x\":-1,\"y\":0},{\"x\":1,\"y\":0},{\"x\":0,\"y\":-1},{\"x\":0,\"y\":1},{\"x\":-1,\"y\":-1},{\"x\":1,\"y\":-1},{\"x\":-1,\"y\":1},{\"x\":1,\"y\":1},{\"x\":-2,\"y\":0},{\"x\":2,\"y\":0},{\"x\":0,\"y\":-2},{\"x\":0,\"y\":2}]" "isFullScene": false,
}, { "toSelf": false,
"atkid": 3, "json": "[{\"x\":-1,\"y\":0},{\"x\":1,\"y\":0},{\"x\":0,\"y\":-1},{\"x\":0,\"y\":1},{\"x\":-1,\"y\":-1},{\"x\":1,\"y\":-1},{\"x\":-1,\"y\":1},{\"x\":1,\"y\":1},{\"x\":-2,\"y\":0},{\"x\":2,\"y\":0},{\"x\":0,\"y\":-2},{\"x\":0,\"y\":2}]"
"name": "四格攻击", },
"cname": "攻击近距4格", {
"isFullScene": false, "atkid": 3,
"toSelf": false, "name": "骑兵攻击",
"json": "[{\"x\":-1,\"y\":0},{\"x\":1,\"y\":0},{\"x\":0,\"y\":-1},{\"x\":0,\"y\":1}]" "cname": "攻击近距4格",
}, { "isFullScene": false,
"atkid": 4, "toSelf": false,
"name": "广域攻击", "json": "[{\"x\":-1,\"y\":0},{\"x\":1,\"y\":0},{\"x\":0,\"y\":-1},{\"x\":0,\"y\":1}]"
"cname": "攻击近中距24格", },
"isFullScene": false, {
"toSelf": false, "atkid": 4,
"json": "[{\"x\":-1,\"y\":0},{\"x\":1,\"y\":0},{\"x\":0,\"y\":-1},{\"x\":0,\"y\":1},{\"x\":-1,\"y\":-1},{\"x\":1,\"y\":-1},{\"x\":-1,\"y\":1},{\"x\":1,\"y\":1},{\"x\":-2,\"y\":0},{\"x\":2,\"y\":0},{\"x\":0,\"y\":-2},{\"x\":0,\"y\":2},\n{\"x\":-2,\"y\":-1},{\"x\":2,\"y\":-1},{\"x\":-2,\"y\":1},{\"x\":2,\"y\":1},{\"x\":-1,\"y\":-2},{\"x\":1,\"y\":-2},{\"x\":-1,\"y\":2},{\"x\":1,\"y\":2},{\"x\":-3,\"y\":0},{\"x\":3,\"y\":0},{\"x\":0,\"y\":-3},{\"x\":0,\"y\":3}]" "name": "广域攻击",
}, { "cname": "攻击近中距24格",
"atkid": 5, "isFullScene": false,
"name": "对自己释放", "toSelf": false,
"cname": "以自身为中心", "json": "[{\"x\":-1,\"y\":0},{\"x\":1,\"y\":0},{\"x\":0,\"y\":-1},{\"x\":0,\"y\":1},{\"x\":-1,\"y\":-1},{\"x\":1,\"y\":-1},{\"x\":-1,\"y\":1},{\"x\":1,\"y\":1},{\"x\":-2,\"y\":0},{\"x\":2,\"y\":0},{\"x\":0,\"y\":-2},{\"x\":0,\"y\":2},\r\n{\"x\":-2,\"y\":-1},{\"x\":2,\"y\":-1},{\"x\":-2,\"y\":1},{\"x\":2,\"y\":1},{\"x\":-1,\"y\":-2},{\"x\":1,\"y\":-2},{\"x\":-1,\"y\":2},{\"x\":1,\"y\":2},{\"x\":-3,\"y\":0},{\"x\":3,\"y\":0},{\"x\":0,\"y\":-3},{\"x\":0,\"y\":3}]"
"isFullScene": false, },
"toSelf": false, {
"json": "[{\"x\":995,\"y\":995}]" "atkid": 5,
}, { "name": "对自己释放",
"atkid": 6, "cname": "以自身为中心",
"name": "9格Boss普通攻击", "isFullScene": false,
"cname": "攻击近距离16格", "toSelf": true,
"isFullScene": false, "json": "[{\"x\":0,\"y\":0}]"
"toSelf": false, },
"json": "[{\"x\":-1,\"y\":-1},{\"x\":-1,\"y\":0},{\"x\":-1,\"y\":-1},{\"x\":-1,\"y\":-2},{\"x\":-1,\"y\":-3},{\"x\":0,\"y\":1},{\"x\":0,\"y\":-3},{\"x\":1,\"y\":1},{\"x\":1,\"y\":-3},{\"x\":2,\"y\":1},{\"x\":2,\"y\":-3},{\"x\":3,\"y\":1},{\"x\":3,\"y\":0},{\"x\":3,\"y\":-1},{\"x\":3,\"y\":-2},{\"x\":3,\"y\":-3}]" {
}] "atkid": 6,
"name": "9格Boss普通攻击",
"cname": "攻击近距离16格",
"isFullScene": false,
"toSelf": false,
"json": "[{\"x\":-1,\"y\":-1},{\"x\":-1,\"y\":0},{\"x\":-1,\"y\":-1},{\"x\":-1,\"y\":-2},{\"x\":-1,\"y\":-3},{\"x\":0,\"y\":1},{\"x\":0,\"y\":-3},{\"x\":1,\"y\":1},{\"x\":1,\"y\":-3},{\"x\":2,\"y\":1},{\"x\":2,\"y\":-3},{\"x\":3,\"y\":1},{\"x\":3,\"y\":0},{\"x\":3,\"y\":-1},{\"x\":3,\"y\":-2},{\"x\":3,\"y\":-3}]"
},
{
"atkid": 7,
"name": "弓兵攻击",
"cname": "攻击中距8格",
"isFullScene": false,
"toSelf": false,
"json": "[{\"x\":-1,\"y\":-1},{\"x\":1,\"y\":-1},{\"x\":-1,\"y\":1},{\"x\":1,\"y\":1},{\"x\":-2,\"y\":0},{\"x\":2,\"y\":0},{\"x\":0,\"y\":-2},{\"x\":0,\"y\":2}]"
},
{
"atkid": 8,
"name": "进阶弓兵攻击",
"cname": "攻击中距20格",
"isFullScene": false,
"toSelf": false,
"json": "[{\"x\":-1,\"y\":-1},{\"x\":1,\"y\":-1},{\"x\":-1,\"y\":1},{\"x\":1,\"y\":1},{\"x\":-2,\"y\":0},{\"x\":2,\"y\":0},{\"x\":0,\"y\":-2},{\"x\":0,\"y\":2},\r\n{\"x\":-2,\"y\":-1},{\"x\":2,\"y\":-1},{\"x\":-2,\"y\":1},{\"x\":2,\"y\":1},{\"x\":-1,\"y\":-2},{\"x\":1,\"y\":-2},{\"x\":-1,\"y\":2},{\"x\":1,\"y\":2},{\"x\":-3,\"y\":0},{\"x\":3,\"y\":0},{\"x\":0,\"y\":-3},{\"x\":0,\"y\":3}]"
},
{
"atkid": 9,
"name": "不会攻击",
"cname": "攻击距离0格",
"isFullScene": false,
"toSelf": false,
"json": "[{\"x\":0,\"y\":0}]"
}
]

View File

@@ -1 +1,402 @@
[{"level":1,"exp":1000},{"level":2,"exp":4000},{"level":3,"exp":9000},{"level":4,"exp":16000},{"level":5,"exp":25000},{"level":6,"exp":36000},{"level":7,"exp":49000},{"level":8,"exp":64000},{"level":9,"exp":81000},{"level":10,"exp":100000},{"level":11,"exp":121000},{"level":12,"exp":144000},{"level":13,"exp":169000},{"level":14,"exp":196000},{"level":15,"exp":225000},{"level":16,"exp":256000},{"level":17,"exp":289000},{"level":18,"exp":324000},{"level":19,"exp":361000},{"level":20,"exp":400000},{"level":21,"exp":441000},{"level":22,"exp":484000},{"level":23,"exp":529000},{"level":24,"exp":576000},{"level":25,"exp":625000},{"level":26,"exp":676000},{"level":27,"exp":729000},{"level":28,"exp":784000},{"level":29,"exp":841000},{"level":30,"exp":900000},{"level":31,"exp":961000},{"level":32,"exp":1024000},{"level":33,"exp":1089000},{"level":34,"exp":1156000},{"level":35,"exp":1225000},{"level":36,"exp":1296000},{"level":37,"exp":1369000},{"level":38,"exp":1444000},{"level":39,"exp":1521000},{"level":40,"exp":1600000},{"level":41,"exp":1681000},{"level":42,"exp":1764000},{"level":43,"exp":1849000},{"level":44,"exp":1936000},{"level":45,"exp":2025000},{"level":46,"exp":2116000},{"level":47,"exp":2209000},{"level":48,"exp":2304000},{"level":49,"exp":2401000},{"level":50,"exp":2500000},{"level":51,"exp":2601000},{"level":52,"exp":2704000},{"level":53,"exp":2809000},{"level":54,"exp":2916000},{"level":55,"exp":3025000},{"level":56,"exp":3136000},{"level":57,"exp":3249000},{"level":58,"exp":3364000},{"level":59,"exp":3481000},{"level":60,"exp":3600000},{"level":61,"exp":3721000},{"level":62,"exp":3844000},{"level":63,"exp":3969000},{"level":64,"exp":4096000},{"level":65,"exp":4225000},{"level":66,"exp":4356000},{"level":67,"exp":4489000},{"level":68,"exp":4624000},{"level":69,"exp":4761000},{"level":70,"exp":4900000},{"level":71,"exp":5041000},{"level":72,"exp":5184000},{"level":73,"exp":5329000},{"level":74,"exp":5476000},{"level":75,"exp":5625000},{"level":76,"exp":5776000},{"level":77,"exp":5929000},{"level":78,"exp":6084000},{"level":79,"exp":6241000},{"level":80,"exp":6400000},{"level":81,"exp":6561000},{"level":82,"exp":6724000},{"level":83,"exp":6889000},{"level":84,"exp":7056000},{"level":85,"exp":7225000},{"level":86,"exp":7396000},{"level":87,"exp":7569000},{"level":88,"exp":7744000},{"level":89,"exp":7921000},{"level":90,"exp":8100000},{"level":91,"exp":8281000},{"level":92,"exp":8464000},{"level":93,"exp":8649000},{"level":94,"exp":8836000},{"level":95,"exp":9025000},{"level":96,"exp":9216000},{"level":97,"exp":9409000},{"level":98,"exp":9604000},{"level":99,"exp":9801000},{"level":100,"exp":10000000}] [
{
"level": 1,
"exp": 1000
},
{
"level": 2,
"exp": 4000
},
{
"level": 3,
"exp": 9000
},
{
"level": 4,
"exp": 16000
},
{
"level": 5,
"exp": 25000
},
{
"level": 6,
"exp": 36000
},
{
"level": 7,
"exp": 49000
},
{
"level": 8,
"exp": 64000
},
{
"level": 9,
"exp": 81000
},
{
"level": 10,
"exp": 100000
},
{
"level": 11,
"exp": 121000
},
{
"level": 12,
"exp": 144000
},
{
"level": 13,
"exp": 169000
},
{
"level": 14,
"exp": 196000
},
{
"level": 15,
"exp": 225000
},
{
"level": 16,
"exp": 256000
},
{
"level": 17,
"exp": 289000
},
{
"level": 18,
"exp": 324000
},
{
"level": 19,
"exp": 361000
},
{
"level": 20,
"exp": 400000
},
{
"level": 21,
"exp": 441000
},
{
"level": 22,
"exp": 484000
},
{
"level": 23,
"exp": 529000
},
{
"level": 24,
"exp": 576000
},
{
"level": 25,
"exp": 625000
},
{
"level": 26,
"exp": 676000
},
{
"level": 27,
"exp": 729000
},
{
"level": 28,
"exp": 784000
},
{
"level": 29,
"exp": 841000
},
{
"level": 30,
"exp": 900000
},
{
"level": 31,
"exp": 961000
},
{
"level": 32,
"exp": 1024000
},
{
"level": 33,
"exp": 1089000
},
{
"level": 34,
"exp": 1156000
},
{
"level": 35,
"exp": 1225000
},
{
"level": 36,
"exp": 1296000
},
{
"level": 37,
"exp": 1369000
},
{
"level": 38,
"exp": 1444000
},
{
"level": 39,
"exp": 1521000
},
{
"level": 40,
"exp": 1600000
},
{
"level": 41,
"exp": 1681000
},
{
"level": 42,
"exp": 1764000
},
{
"level": 43,
"exp": 1849000
},
{
"level": 44,
"exp": 1936000
},
{
"level": 45,
"exp": 2025000
},
{
"level": 46,
"exp": 2116000
},
{
"level": 47,
"exp": 2209000
},
{
"level": 48,
"exp": 2304000
},
{
"level": 49,
"exp": 2401000
},
{
"level": 50,
"exp": 2500000
},
{
"level": 51,
"exp": 2601000
},
{
"level": 52,
"exp": 2704000
},
{
"level": 53,
"exp": 2809000
},
{
"level": 54,
"exp": 2916000
},
{
"level": 55,
"exp": 3025000
},
{
"level": 56,
"exp": 3136000
},
{
"level": 57,
"exp": 3249000
},
{
"level": 58,
"exp": 3364000
},
{
"level": 59,
"exp": 3481000
},
{
"level": 60,
"exp": 3600000
},
{
"level": 61,
"exp": 3721000
},
{
"level": 62,
"exp": 3844000
},
{
"level": 63,
"exp": 3969000
},
{
"level": 64,
"exp": 4096000
},
{
"level": 65,
"exp": 4225000
},
{
"level": 66,
"exp": 4356000
},
{
"level": 67,
"exp": 4489000
},
{
"level": 68,
"exp": 4624000
},
{
"level": 69,
"exp": 4761000
},
{
"level": 70,
"exp": 4900000
},
{
"level": 71,
"exp": 5041000
},
{
"level": 72,
"exp": 5184000
},
{
"level": 73,
"exp": 5329000
},
{
"level": 74,
"exp": 5476000
},
{
"level": 75,
"exp": 5625000
},
{
"level": 76,
"exp": 5776000
},
{
"level": 77,
"exp": 5929000
},
{
"level": 78,
"exp": 6084000
},
{
"level": 79,
"exp": 6241000
},
{
"level": 80,
"exp": 6400000
},
{
"level": 81,
"exp": 6561000
},
{
"level": 82,
"exp": 6724000
},
{
"level": 83,
"exp": 6889000
},
{
"level": 84,
"exp": 7056000
},
{
"level": 85,
"exp": 7225000
},
{
"level": 86,
"exp": 7396000
},
{
"level": 87,
"exp": 7569000
},
{
"level": 88,
"exp": 7744000
},
{
"level": 89,
"exp": 7921000
},
{
"level": 90,
"exp": 8100000
},
{
"level": 91,
"exp": 8281000
},
{
"level": 92,
"exp": 8464000
},
{
"level": 93,
"exp": 8649000
},
{
"level": 94,
"exp": 8836000
},
{
"level": 95,
"exp": 9025000
},
{
"level": 96,
"exp": 9216000
},
{
"level": 97,
"exp": 9409000
},
{
"level": 98,
"exp": 9604000
},
{
"level": 99,
"exp": 9801000
},
{
"level": 100,
"exp": 10000000
}
]

View File

@@ -5,7 +5,7 @@
"timesPerDay": 200, "timesPerDay": 200,
"timesCanBuy": 200, "timesCanBuy": 200,
"difficultLvl": "3001&3002&3003&3004&3005&3006&3007&3008&3009", "difficultLvl": "3001&3002&3003&3004&3005&3006&3007&3008&3009",
"description": "内有不同难度,可获得大量铜钱" "description": "护送马车到达安全地点,可获得大量铜钱奖励"
}, },
{ {
"dailyType": 2, "dailyType": 2,
@@ -13,7 +13,7 @@
"timesPerDay": 200, "timesPerDay": 200,
"timesCanBuy": 200, "timesCanBuy": 200,
"difficultLvl": "3010&3011&3012&3013&3014", "difficultLvl": "3010&3011&3012&3013&3014",
"description": "内有不同难度,可获得大量武将经验书" "description": "暂未开放,内有不同难度,可获得大量武将经验书"
}, },
{ {
"dailyType": 3, "dailyType": 3,
@@ -21,14 +21,14 @@
"timesPerDay": 200, "timesPerDay": 200,
"timesCanBuy": 200, "timesCanBuy": 200,
"difficultLvl": "3020&3021&3022&3023&3024", "difficultLvl": "3020&3021&3022&3023&3024",
"description": "内有不同难度,可获得大量装备材料" "description": "暂未开放,内有不同难度,可获得大量装备强化材料"
}, },
{ {
"dailyType": 4, "dailyType": 4,
"name": "测试测试", "name": "测试测试",
"timesPerDay": 200, "timesPerDay": 200,
"timesCanBuy": 200, "timesCanBuy": 200,
"difficultLvl": "3020&3021&3022&3023&3024", "difficultLvl": "3031&3032&3033&3034",
"description": "内有不同难度,测试用" "description": "暂未开放,内有不同难度,可获得大量装备精练材料"
} }
] ]

View File

@@ -1,21 +1,58 @@
[{ [
"mpid": 1, {
"name": "单体伤害", "mpid": 1,
"cname": "攻击单个目标", "name": "单体伤害",
"json": "[{\"x\":0,\"y\":0}]" "cname": "攻击单个目标",
}, { "json": "[{\"x\":0,\"y\":0}]",
"mpid": 2, "penetration": "&"
"name": "近身伤害", },
"cname": "攻击最多8个目标", {
"json": "[{\"x\":-1,\"y\":0},{\"x\":1,\"y\":0},{\"x\":0,\"y\":-1},{\"x\":0,\"y\":1},{\"x\":-1,\"y\":-1},{\"x\":1,\"y\":-1},{\"x\":-1,\"y\":1},{\"x\":1,\"y\":1}]" "mpid": 2,
}, { "name": "近身伤害",
"mpid": 3, "cname": "攻击最多8个目标",
"name": "远程伤害", "json": "[{\"x\":-1,\"y\":0},{\"x\":1,\"y\":0},{\"x\":0,\"y\":-1},{\"x\":0,\"y\":1},{\"x\":-1,\"y\":-1},{\"x\":1,\"y\":-1},{\"x\":-1,\"y\":1},{\"x\":1,\"y\":1}]",
"cname": "攻击近中距12格", "penetration": "&"
"json": "[{\"x\":-1,\"y\":0},{\"x\":1,\"y\":0},{\"x\":0,\"y\":-1},{\"x\":0,\"y\":1},{\"x\":-1,\"y\":-1},{\"x\":1,\"y\":-1},{\"x\":-1,\"y\":1},{\"x\":1,\"y\":1},{\"x\":-2,\"y\":0},{\"x\":2,\"y\":0},{\"x\":0,\"y\":-2},{\"x\":0,\"y\":2}]" },
}, { {
"mpid": 4, "mpid": 3,
"name": "广域伤害", "name": "远程伤害",
"cname": "攻击近中远距24格", "cname": "攻击近中距12格",
"json": "[{\"x\":-1,\"y\":0},{\"x\":1,\"y\":0},{\"x\":0,\"y\":0},{\"x\":0,\"y\":-1},{\"x\":0,\"y\":1},{\"x\":-1,\"y\":-1},{\"x\":1,\"y\":-1},{\"x\":-1,\"y\":1},{\"x\":1,\"y\":1},{\"x\":-2,\"y\":0},{\"x\":2,\"y\":0},{\"x\":0,\"y\":-2},{\"x\":0,\"y\":2},\n{\"x\":-2,\"y\":-1},{\"x\":2,\"y\":-1},{\"x\":-2,\"y\":1},{\"x\":2,\"y\":1},{\"x\":-1,\"y\":-2},{\"x\":1,\"y\":-2},{\"x\":-1,\"y\":2},{\"x\":1,\"y\":2},{\"x\":-3,\"y\":0},{\"x\":3,\"y\":0},{\"x\":0,\"y\":-3},{\"x\":0,\"y\":3}]" "json": "[{\"x\":-1,\"y\":0},{\"x\":1,\"y\":0},{\"x\":0,\"y\":-1},{\"x\":0,\"y\":1},{\"x\":-1,\"y\":-1},{\"x\":1,\"y\":-1},{\"x\":-1,\"y\":1},{\"x\":1,\"y\":1},{\"x\":-2,\"y\":0},{\"x\":2,\"y\":0},{\"x\":0,\"y\":-2},{\"x\":0,\"y\":2}]",
}] "penetration": "&"
},
{
"mpid": 4,
"name": "广域伤害",
"cname": "攻击近中远距24格",
"json": "[{\"x\":-1,\"y\":0},{\"x\":1,\"y\":0},{\"x\":0,\"y\":-1},{\"x\":0,\"y\":1},{\"x\":-1,\"y\":-1},{\"x\":1,\"y\":-1},{\"x\":-1,\"y\":1},{\"x\":1,\"y\":1},{\"x\":-2,\"y\":0},{\"x\":2,\"y\":0},{\"x\":0,\"y\":-2},{\"x\":0,\"y\":2},\n{\"x\":-2,\"y\":-1},{\"x\":2,\"y\":-1},{\"x\":-2,\"y\":1},{\"x\":2,\"y\":1},{\"x\":-1,\"y\":-2},{\"x\":1,\"y\":-2},{\"x\":-1,\"y\":2},{\"x\":1,\"y\":2},{\"x\":-3,\"y\":0},{\"x\":3,\"y\":0},{\"x\":0,\"y\":-3},{\"x\":0,\"y\":3}]",
"penetration": "&"
},
{
"mpid": 5,
"name": "近身伤害 全",
"cname": "攻击9格范围",
"json": "[{\"x\":-1,\"y\":0},{\"x\":0,\"y\":0},{\"x\":1,\"y\":0},{\"x\":0,\"y\":-1},{\"x\":0,\"y\":1},{\"x\":-1,\"y\":-1},{\"x\":1,\"y\":-1},{\"x\":-1,\"y\":1},{\"x\":1,\"y\":1}]",
"penetration": "&"
},
{
"mpid": 6,
"name": "远程伤害 全",
"cname": "攻击近中距13格",
"json": "[{\"x\":-1,\"y\":0},{\"x\":0,\"y\":0},{\"x\":1,\"y\":0},{\"x\":0,\"y\":-1},{\"x\":0,\"y\":1},{\"x\":-1,\"y\":-1},{\"x\":1,\"y\":-1},{\"x\":-1,\"y\":1},{\"x\":1,\"y\":1},{\"x\":-2,\"y\":0},{\"x\":2,\"y\":0},{\"x\":0,\"y\":-2},{\"x\":0,\"y\":2}]",
"penetration": "&"
},
{
"mpid": 7,
"name": "广域伤害 全",
"cname": "攻击近中远距25格",
"json": "[{\"x\":-1,\"y\":0},{\"x\":1,\"y\":0},{\"x\":0,\"y\":0},{\"x\":0,\"y\":-1},{\"x\":0,\"y\":1},{\"x\":-1,\"y\":-1},{\"x\":1,\"y\":-1},{\"x\":-1,\"y\":1},{\"x\":1,\"y\":1},{\"x\":-2,\"y\":0},{\"x\":2,\"y\":0},{\"x\":0,\"y\":-2},{\"x\":0,\"y\":2},\n{\"x\":-2,\"y\":-1},{\"x\":2,\"y\":-1},{\"x\":-2,\"y\":1},{\"x\":2,\"y\":1},{\"x\":-1,\"y\":-2},{\"x\":1,\"y\":-2},{\"x\":-1,\"y\":2},{\"x\":1,\"y\":2},{\"x\":-3,\"y\":0},{\"x\":3,\"y\":0},{\"x\":0,\"y\":-3},{\"x\":0,\"y\":3}]",
"penetration": "&"
},
{
"mpid": 8,
"name": "横扫",
"cname": "面前三格",
"json": "[{\"x\":0,\"y\":0}]",
"penetration": "1&1"
}
]

View File

@@ -0,0 +1,292 @@
[
{
"id": 1,
"rSpine": "LH_jiaxu",
"sSpine": "jiaxu",
"skill": "1&12|2&13",
"seid": "344&456&234",
"globalAttr": "1&2000|2&500",
"actorAttr": "3&200|4&100",
"actorId": 1
},
{
"id": 2,
"rSpine": "LH_jiaxu",
"sSpine": "jiaxu",
"skill": "1&12|2&13",
"seid": "344&456&235",
"globalAttr": "1&2000|2&501",
"actorAttr": "3&200|4&101",
"actorId": 1
},
{
"id": 3,
"rSpine": "LH_jiaxu",
"sSpine": "jiaxu",
"skill": "1&12|2&13",
"seid": "344&456&236",
"globalAttr": "1&2000|2&502",
"actorAttr": "3&200|4&102",
"actorId": 1
},
{
"id": 4,
"rSpine": "LH_jiaxu",
"sSpine": "jiaxu",
"skill": "1&12|2&13",
"seid": "344&456&237",
"globalAttr": "1&2000|2&503",
"actorAttr": "3&200|4&103",
"actorId": 1
},
{
"id": 5,
"rSpine": "LH_jiaxu",
"sSpine": "jiaxu",
"skill": "1&12|2&13",
"seid": "344&456&238",
"globalAttr": "1&2000|2&504",
"actorAttr": "3&200|4&104",
"actorId": 2
},
{
"id": 6,
"rSpine": "LH_jiaxu",
"sSpine": "jiaxu",
"skill": "1&12|2&13",
"seid": "344&456&239",
"globalAttr": "1&2000|2&505",
"actorAttr": "3&200|4&105",
"actorId": 3
},
{
"id": 7,
"rSpine": "LH_jiaxu",
"sSpine": "jiaxu",
"skill": "1&12|2&13",
"seid": "344&456&240",
"globalAttr": "1&2000|2&506",
"actorAttr": "3&200|4&106",
"actorId": 4
},
{
"id": 8,
"rSpine": "LH_jiaxu",
"sSpine": "jiaxu",
"skill": "1&12|2&13",
"seid": "344&456&241",
"globalAttr": "1&2000|2&507",
"actorAttr": "3&200|4&107",
"actorId": 5
},
{
"id": 9,
"rSpine": "LH_jiaxu",
"sSpine": "jiaxu",
"skill": "1&12|2&13",
"seid": "344&456&242",
"globalAttr": "1&2000|2&508",
"actorAttr": "3&200|4&108",
"actorId": 6
},
{
"id": 10,
"rSpine": "LH_jiaxu",
"sSpine": "jiaxu",
"skill": "1&12|2&13",
"seid": "344&456&243",
"globalAttr": "1&2000|2&509",
"actorAttr": "3&200|4&109",
"actorId": 7
},
{
"id": 11,
"rSpine": "LH_jiaxu",
"sSpine": "jiaxu",
"skill": "1&12|2&13",
"seid": "344&456&244",
"globalAttr": "1&2000|2&510",
"actorAttr": "3&200|4&110",
"actorId": 8
},
{
"id": 12,
"rSpine": "LH_jiaxu",
"sSpine": "jiaxu",
"skill": "1&12|2&13",
"seid": "344&456&245",
"globalAttr": "1&2000|2&511",
"actorAttr": "3&200|4&111",
"actorId": 9
},
{
"id": 13,
"rSpine": "LH_jiaxu",
"sSpine": "jiaxu",
"skill": "1&12|2&13",
"seid": "344&456&246",
"globalAttr": "1&2000|2&512",
"actorAttr": "3&200|4&112",
"actorId": 10
},
{
"id": 14,
"rSpine": "LH_jiaxu",
"sSpine": "jiaxu",
"skill": "1&12|2&13",
"seid": "344&456&247",
"globalAttr": "1&2000|2&513",
"actorAttr": "3&200|4&113",
"actorId": 11
},
{
"id": 15,
"rSpine": "LH_jiaxu",
"sSpine": "jiaxu",
"skill": "1&12|2&13",
"seid": "344&456&248",
"globalAttr": "1&2000|2&514",
"actorAttr": "3&200|4&114",
"actorId": 12
},
{
"id": 16,
"rSpine": "LH_jiaxu",
"sSpine": "jiaxu",
"skill": "1&12|2&13",
"seid": "344&456&249",
"globalAttr": "1&2000|2&515",
"actorAttr": "3&200|4&115",
"actorId": 13
},
{
"id": 17,
"rSpine": "LH_jiaxu",
"sSpine": "jiaxu",
"skill": "1&12|2&13",
"seid": "344&456&250",
"globalAttr": "1&2000|2&516",
"actorAttr": "3&200|4&116",
"actorId": 14
},
{
"id": 18,
"rSpine": "LH_jiaxu",
"sSpine": "jiaxu",
"skill": "1&12|2&13",
"seid": "344&456&251",
"globalAttr": "1&2000|2&517",
"actorAttr": "3&200|4&117",
"actorId": 15
},
{
"id": 19,
"rSpine": "LH_jiaxu",
"sSpine": "jiaxu",
"skill": "1&12|2&13",
"seid": "344&456&252",
"globalAttr": "1&2000|2&518",
"actorAttr": "3&200|4&118",
"actorId": 16
},
{
"id": 20,
"rSpine": "LH_jiaxu",
"sSpine": "jiaxu",
"skill": "1&12|2&13",
"seid": "344&456&253",
"globalAttr": "1&2000|2&519",
"actorAttr": "3&200|4&119",
"actorId": 17
},
{
"id": 21,
"rSpine": "LH_jiaxu",
"sSpine": "jiaxu",
"skill": "1&12|2&13",
"seid": "344&456&254",
"globalAttr": "1&2000|2&520",
"actorAttr": "3&200|4&120",
"actorId": 18
},
{
"id": 22,
"rSpine": "LH_jiaxu",
"sSpine": "jiaxu",
"skill": "1&12|2&13",
"seid": "344&456&255",
"globalAttr": "1&2000|2&521",
"actorAttr": "3&200|4&121",
"actorId": 19
},
{
"id": 23,
"rSpine": "LH_jiaxu",
"sSpine": "jiaxu",
"skill": "1&12|2&13",
"seid": "344&456&256",
"globalAttr": "1&2000|2&522",
"actorAttr": "3&200|4&122",
"actorId": 20
},
{
"id": 24,
"rSpine": "LH_jiaxu",
"sSpine": "jiaxu",
"skill": "1&12|2&13",
"seid": "344&456&257",
"globalAttr": "1&2000|2&523",
"actorAttr": "3&200|4&123",
"actorId": 21
},
{
"id": 25,
"rSpine": "LH_jiaxu",
"sSpine": "jiaxu",
"skill": "1&12|2&13",
"seid": "344&456&258",
"globalAttr": "1&2000|2&524",
"actorAttr": "3&200|4&124",
"actorId": 22
},
{
"id": 26,
"rSpine": "LH_jiaxu",
"sSpine": "jiaxu",
"skill": "1&12|2&13",
"seid": "344&456&259",
"globalAttr": "1&2000|2&525",
"actorAttr": "3&200|4&125",
"actorId": 23
},
{
"id": 27,
"rSpine": "LH_jiaxu",
"sSpine": "jiaxu",
"skill": "1&12|2&13",
"seid": "344&456&260",
"globalAttr": "1&2000|2&526",
"actorAttr": "3&200|4&126",
"actorId": 24
},
{
"id": 28,
"rSpine": "LH_jiaxu",
"sSpine": "jiaxu",
"skill": "1&12|2&13",
"seid": "344&456&261",
"globalAttr": "1&2000|2&527",
"actorAttr": "3&200|4&127",
"actorId": 25
},
{
"id": 29,
"rSpine": "LH_jiaxu",
"sSpine": "jiaxu",
"skill": "1&12|2&13",
"seid": "344&456&262",
"globalAttr": "1&2000|2&528",
"actorAttr": "3&200|4&128",
"actorId": 26
}
]

View File

@@ -0,0 +1,290 @@
[
{
"id": 1,
"shipId": 10001,
"actorId": 1,
"name": "魏武之强",
"level": 1,
"memberId": "2&3&4&5",
"attribute": "1&200|2&300",
"costCoin": 5000,
"__EMPTY": 0,
"__EMPTY_1": 0,
"__EMPTY_2": 0,
"__EMPTY_3": 0,
"__EMPTY_4": 0,
"__EMPTY_5": 0
},
{
"id": 2,
"shipId": 10001,
"actorId": 1,
"name": "魏武之强",
"level": 2,
"memberId": "2&3&4&5",
"attribute": "1&300|2&400",
"costCoin": 5000,
"__EMPTY": 0,
"__EMPTY_1": 0,
"__EMPTY_2": 0,
"__EMPTY_3": 0,
"__EMPTY_4": 0,
"__EMPTY_5": 0
},
{
"id": 3,
"shipId": 10001,
"actorId": 1,
"name": "魏武之强",
"level": 3,
"memberId": "2&3&4&5",
"attribute": "1&400|2&500",
"costCoin": 5000,
"__EMPTY": 0,
"__EMPTY_1": 0,
"__EMPTY_2": 0,
"__EMPTY_3": 0,
"__EMPTY_4": 0,
"__EMPTY_5": 0
},
{
"id": 4,
"shipId": 10001,
"actorId": 1,
"name": "魏武之强",
"level": 4,
"memberId": "2&3&4&5",
"attribute": "1&600|2&700",
"costCoin": 5000,
"__EMPTY": 0,
"__EMPTY_1": 0,
"__EMPTY_2": 0,
"__EMPTY_3": 0,
"__EMPTY_4": 0,
"__EMPTY_5": 0
},
{
"id": 5,
"shipId": 10001,
"actorId": 1,
"name": "魏武之强",
"level": 5,
"memberId": "2&3&4&5",
"attribute": "1&800|2&900",
"costCoin": 5000,
"__EMPTY": 0,
"__EMPTY_1": 0,
"__EMPTY_2": 0,
"__EMPTY_3": 0,
"__EMPTY_4": 0,
"__EMPTY_5": 0
},
{
"id": 6,
"shipId": 10001,
"actorId": 1,
"name": "魏武之强",
"level": 6,
"memberId": "2&3&4&5",
"attribute": "1&1000|2&1000",
"costCoin": 5000,
"__EMPTY": 0,
"__EMPTY_1": 0,
"__EMPTY_2": 0,
"__EMPTY_3": 0,
"__EMPTY_4": 0,
"__EMPTY_5": 0
},
{
"id": 7,
"shipId": 10002,
"actorId": 1,
"name": "家族之力",
"level": 1,
"memberId": "6&7",
"attribute": "1&200|2&300",
"costCoin": 5000,
"__EMPTY": 0,
"__EMPTY_1": 0,
"__EMPTY_2": 0,
"__EMPTY_3": 0,
"__EMPTY_4": 0,
"__EMPTY_5": 0
},
{
"id": 8,
"shipId": 10002,
"actorId": 1,
"name": "家族之力",
"level": 2,
"memberId": "6&7",
"attribute": "1&300|2&400",
"costCoin": 5000,
"__EMPTY": 0,
"__EMPTY_1": 0,
"__EMPTY_2": 0,
"__EMPTY_3": 0,
"__EMPTY_4": 0,
"__EMPTY_5": 0
},
{
"id": 9,
"shipId": 10002,
"actorId": 1,
"name": "家族之力",
"level": 3,
"memberId": "6&7",
"attribute": "1&400|2&500",
"costCoin": 5000,
"__EMPTY": 0,
"__EMPTY_1": 0,
"__EMPTY_2": 0,
"__EMPTY_3": 0,
"__EMPTY_4": 0,
"__EMPTY_5": 0
},
{
"id": 10,
"shipId": 10002,
"actorId": 1,
"name": "家族之力",
"level": 4,
"memberId": "6&7",
"attribute": "1&600|2&700",
"costCoin": 5000,
"__EMPTY": 0,
"__EMPTY_1": 0,
"__EMPTY_2": 0,
"__EMPTY_3": 0,
"__EMPTY_4": 0,
"__EMPTY_5": 0
},
{
"id": 11,
"shipId": 10002,
"actorId": 1,
"name": "家族之力",
"level": 5,
"memberId": "6&7",
"attribute": "1&800|2&900",
"costCoin": 5000,
"__EMPTY": 0,
"__EMPTY_1": 0,
"__EMPTY_2": 0,
"__EMPTY_3": 0,
"__EMPTY_4": 0,
"__EMPTY_5": 0
},
{
"id": 12,
"shipId": 10002,
"actorId": 1,
"name": "家族之力",
"level": 6,
"memberId": "6&7",
"attribute": "1&1000|2&1000",
"costCoin": 5000,
"__EMPTY": 0,
"__EMPTY_1": 0,
"__EMPTY_2": 0,
"__EMPTY_3": 0,
"__EMPTY_4": 0,
"__EMPTY_5": 0
},
{
"id": 13,
"shipId": 10003,
"actorId": 1,
"name": "曹氏双雄",
"level": 1,
"memberId": "8&",
"attribute": "1&200|2&300",
"costCoin": 5000,
"__EMPTY": 0,
"__EMPTY_1": 0,
"__EMPTY_2": 0,
"__EMPTY_3": 0,
"__EMPTY_4": 0,
"__EMPTY_5": 0
},
{
"id": 14,
"shipId": 10003,
"actorId": 1,
"name": "曹氏双雄",
"level": 2,
"memberId": "8&",
"attribute": "1&300|2&400",
"costCoin": 5000,
"__EMPTY": 0,
"__EMPTY_1": 0,
"__EMPTY_2": 0,
"__EMPTY_3": 0,
"__EMPTY_4": 0,
"__EMPTY_5": 0
},
{
"id": 15,
"shipId": 10003,
"actorId": 1,
"name": "曹氏双雄",
"level": 3,
"memberId": "8&",
"attribute": "1&400|2&500",
"costCoin": 5000,
"__EMPTY": 0,
"__EMPTY_1": 0,
"__EMPTY_2": 0,
"__EMPTY_3": 0,
"__EMPTY_4": 0,
"__EMPTY_5": 0
},
{
"id": 16,
"shipId": 10003,
"actorId": 1,
"name": "曹氏双雄",
"level": 4,
"memberId": "8&",
"attribute": "1&600|2&700",
"costCoin": 5000,
"__EMPTY": 0,
"__EMPTY_1": 0,
"__EMPTY_2": 0,
"__EMPTY_3": 0,
"__EMPTY_4": 0,
"__EMPTY_5": 0
},
{
"id": 17,
"shipId": 10003,
"actorId": 1,
"name": "曹氏双雄",
"level": 5,
"memberId": "8&",
"attribute": "1&800|2&900",
"costCoin": 5000,
"__EMPTY": 0,
"__EMPTY_1": 0,
"__EMPTY_2": 0,
"__EMPTY_3": 0,
"__EMPTY_4": 0,
"__EMPTY_5": 0
},
{
"id": 18,
"shipId": 10003,
"actorId": 1,
"name": "曹氏双雄",
"level": 6,
"memberId": "8&",
"attribute": "1&1000|2&1000",
"costCoin": 5000,
"__EMPTY": 0,
"__EMPTY_1": 0,
"__EMPTY_2": 0,
"__EMPTY_3": 0,
"__EMPTY_4": 0,
"__EMPTY_5": 0
}
]

View File

@@ -0,0 +1,52 @@
[
{
"level": 1,
"exp": 100,
"add": 5
},
{
"level": 2,
"exp": 200,
"add": 10
},
{
"level": 3,
"exp": 300,
"add": 15
},
{
"level": 4,
"exp": 400,
"add": 20
},
{
"level": 5,
"exp": 500,
"add": 25
},
{
"level": 6,
"exp": 600,
"add": 30
},
{
"level": 7,
"exp": 700,
"add": 35
},
{
"level": 8,
"exp": 800,
"add": 40
},
{
"level": 9,
"exp": 900,
"add": 45
},
{
"level": 10,
"exp": 1000,
"add": 50
}
]

View File

@@ -0,0 +1,338 @@
[
{
"id ": 1,
"actorId": 1,
"name": "曹操",
"weight": 1
},
{
"id ": 2,
"actorId": 2,
"name": "夏侯惇",
"weight": 1
},
{
"id ": 3,
"actorId": 3,
"name": "张辽",
"weight": 1
},
{
"id ": 4,
"actorId": 4,
"name": "夏侯渊",
"weight": 1
},
{
"id ": 5,
"actorId": 5,
"name": "郭嘉",
"weight": 1
},
{
"id ": 6,
"actorId": 6,
"name": "司马懿",
"weight": 1
},
{
"id ": 7,
"actorId": 7,
"name": "典韦",
"weight": 1
},
{
"id ": 8,
"actorId": 8,
"name": "庞德",
"weight": 1
},
{
"id ": 9,
"actorId": 9,
"name": "邓艾",
"weight": 1
},
{
"id ": 10,
"actorId": 10,
"name": "徐晃",
"weight": 1
},
{
"id ": 11,
"actorId": 11,
"name": "曹仁",
"weight": 1
},
{
"id ": 12,
"actorId": 12,
"name": "李典",
"weight": 1
},
{
"id ": 13,
"actorId": 13,
"name": "蔡琰",
"weight": 1
},
{
"id ": 14,
"actorId": 14,
"name": "贾诩",
"weight": 1
},
{
"id ": 15,
"actorId": 15,
"name": "许褚",
"weight": 1
},
{
"id ": 16,
"actorId": 16,
"name": "乐进",
"weight": 1
},
{
"id ": 17,
"actorId": 17,
"name": "张飞",
"weight": 1
},
{
"id ": 18,
"actorId": 18,
"name": "关羽",
"weight": 1
},
{
"id ": 19,
"actorId": 19,
"name": "赵云",
"weight": 1
},
{
"id ": 20,
"actorId": 20,
"name": "刘备",
"weight": 1
},
{
"id ": 21,
"actorId": 21,
"name": "黄忠",
"weight": 1
},
{
"id ": 22,
"actorId": 22,
"name": "诸葛亮",
"weight": 1
},
{
"id ": 23,
"actorId": 23,
"name": "庞统",
"weight": 1
},
{
"id ": 24,
"actorId": 24,
"name": "魏延",
"weight": 1
},
{
"id ": 25,
"actorId": 25,
"name": "陈到",
"weight": 1
},
{
"id ": 26,
"actorId": 26,
"name": "关银屏",
"weight": 1
},
{
"id ": 27,
"actorId": 27,
"name": "马云禄",
"weight": 1
},
{
"id ": 28,
"actorId": 28,
"name": "马良",
"weight": 1
},
{
"id ": 29,
"actorId": 29,
"name": "黄月英",
"weight": 1
},
{
"id ": 30,
"actorId": 30,
"name": "王平",
"weight": 1
},
{
"id ": 31,
"actorId": 31,
"name": "孙乾",
"weight": 1
},
{
"id ": 32,
"actorId": 32,
"name": "周泰",
"weight": 1
},
{
"id ": 33,
"actorId": 33,
"name": "孙策",
"weight": 1
},
{
"id ": 34,
"actorId": 34,
"name": "周瑜",
"weight": 1
},
{
"id ": 35,
"actorId": 35,
"name": "太史慈",
"weight": 1
},
{
"id ": 36,
"actorId": 36,
"name": "孙权",
"weight": 1
},
{
"id ": 37,
"actorId": 37,
"name": "甘宁",
"weight": 1
},
{
"id ": 38,
"actorId": 38,
"name": "孙尚香",
"weight": 1
},
{
"id ": 39,
"actorId": 39,
"name": "陆逊",
"weight": 1
},
{
"id ": 40,
"actorId": 40,
"name": "小乔",
"weight": 1
},
{
"id ": 41,
"actorId": 41,
"name": "大乔",
"weight": 1
},
{
"id ": 42,
"actorId": 42,
"name": "步练师",
"weight": 1
},
{
"id ": 43,
"actorId": 43,
"name": "左慈",
"weight": 1
},
{
"id ": 44,
"actorId": 44,
"name": "吕布",
"weight": 1
},
{
"id ": 45,
"actorId": 45,
"name": "张任",
"weight": 1
},
{
"id ": 46,
"actorId": 46,
"name": "华佗",
"weight": 1
},
{
"id ": 47,
"actorId": 47,
"name": "张角",
"weight": 1
},
{
"id ": 48,
"actorId": 48,
"name": "南华",
"weight": 1
},
{
"id ": 49,
"actorId": 49,
"name": "高顺",
"weight": 1
},
{
"id ": 50,
"actorId": 50,
"name": "麹义",
"weight": 1
},
{
"id ": 51,
"actorId": 51,
"name": "李儒",
"weight": 1
},
{
"id ": 52,
"actorId": 52,
"name": "庞舞",
"weight": 1
},
{
"id ": 53,
"actorId": 53,
"name": "夏侯轻衣",
"weight": 1
},
{
"id ": 54,
"actorId": 54,
"name": "文丑",
"weight": 1
},
{
"id ": 55,
"actorId": 55,
"name": "颜良",
"weight": 1
},
{
"id ": 56,
"actorId": 56,
"name": "貂蝉",
"weight": 1
}
]

File diff suppressed because it is too large Load Diff

View File

@@ -23,7 +23,7 @@
"heroInUI": "1&1008|1&1045", "heroInUI": "1&1008|1&1045",
"detailUIBg": "1000_1", "detailUIBg": "1000_1",
"recommendedPower": 10009, "recommendedPower": 10009,
"previousGk": 106, "previousGk": 125,
"relatedEliteGk": 9001, "relatedEliteGk": 9001,
"movePoint": 31 "movePoint": 31
}, },
@@ -51,7 +51,7 @@
"heroInUI": "1&1008|1&1046", "heroInUI": "1&1008|1&1046",
"detailUIBg": "1000_2", "detailUIBg": "1000_2",
"recommendedPower": 10010, "recommendedPower": 10010,
"previousGk": 107, "previousGk": 1001,
"relatedEliteGk": 9002, "relatedEliteGk": 9002,
"movePoint": 32 "movePoint": 32
}, },
@@ -79,7 +79,7 @@
"heroInUI": "1&1008|1&1047", "heroInUI": "1&1008|1&1047",
"detailUIBg": "1000_3", "detailUIBg": "1000_3",
"recommendedPower": 10011, "recommendedPower": 10011,
"previousGk": 108, "previousGk": 1002,
"relatedEliteGk": 9003, "relatedEliteGk": 9003,
"movePoint": 33 "movePoint": 33
} }

View File

@@ -288,7 +288,7 @@
"conditionReward": "16004&1&0|31002&50&0|31002&100&1", "conditionReward": "16004&1&0|31002&50&0|31002&100&1",
"RandomReward": "17002&2&1", "RandomReward": "17002&2&1",
"warType": 1, "warType": 1,
"gk_name": "第一章&阴兵借道", "gk_name": "第一章&不明乱军",
"kingExp": 100, "kingExp": 100,
"lvLimted": 1, "lvLimted": 1,
"turnLimted": 20, "turnLimted": 20,
@@ -316,7 +316,7 @@
"conditionReward": "16004&1&0|31002&50&0|31002&100&1", "conditionReward": "16004&1&0|31002&50&0|31002&100&1",
"RandomReward": "17002&2&1", "RandomReward": "17002&2&1",
"warType": 1, "warType": 1,
"gk_name": "第一章&拦路军", "gk_name": "第一章&拦路军",
"kingExp": 100, "kingExp": 100,
"lvLimted": 1, "lvLimted": 1,
"turnLimted": 20, "turnLimted": 20,
@@ -372,7 +372,7 @@
"conditionReward": "16004&1&0|31002&50&0|31002&100&1", "conditionReward": "16004&1&0|31002&50&0|31002&100&1",
"RandomReward": "17002&2&1", "RandomReward": "17002&2&1",
"warType": 1, "warType": 1,
"gk_name": "第一章&拦路军", "gk_name": "第一章&拦路军",
"kingExp": 100, "kingExp": 100,
"lvLimted": 1, "lvLimted": 1,
"turnLimted": 20, "turnLimted": 20,
@@ -400,7 +400,7 @@
"conditionReward": "16004&1&0|31002&50&0|31002&100&1", "conditionReward": "16004&1&0|31002&50&0|31002&100&1",
"RandomReward": "17002&2&1", "RandomReward": "17002&2&1",
"warType": 1, "warType": 1,
"gk_name": "第一章&拦路军", "gk_name": "第一章&拦路军",
"kingExp": 100, "kingExp": 100,
"lvLimted": 1, "lvLimted": 1,
"turnLimted": 20, "turnLimted": 20,
@@ -428,7 +428,7 @@
"conditionReward": "16004&1&0|31002&50&0|31002&100&1", "conditionReward": "16004&1&0|31002&50&0|31002&100&1",
"RandomReward": "17002&2&1", "RandomReward": "17002&2&1",
"warType": 1, "warType": 1,
"gk_name": "第一章&拦路军", "gk_name": "第一章&拦路军",
"kingExp": 100, "kingExp": 100,
"lvLimted": 1, "lvLimted": 1,
"turnLimted": 20, "turnLimted": 20,

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,12 @@
[
{
"id": 1,
"quality": 1,
"fragmentNum": 200
},
{
"id": 2,
"quality": 2,
"fragmentNum": 300
}
]

View File

@@ -0,0 +1,182 @@
[
{
"id": 1,
"quality": 1,
"star": 1,
"advanceUpFragmentNum": 5,
"hp_up": 1,
"atk_up": 2,
"def_up": 3,
"mdef_up": 4,
"agi_up": 5,
"luk_up": 6
},
{
"id": 2,
"quality": 1,
"star": 2,
"advanceUpFragmentNum": 10,
"hp_up": 2,
"atk_up": 3,
"def_up": 4,
"mdef_up": 5,
"agi_up": 6,
"luk_up": 7
},
{
"id": 3,
"quality": 1,
"star": 3,
"advanceUpFragmentNum": 10,
"hp_up": 3,
"atk_up": 4,
"def_up": 5,
"mdef_up": 6,
"agi_up": 7,
"luk_up": 8
},
{
"id": 4,
"quality": 1,
"star": 4,
"advanceUpFragmentNum": 10,
"hp_up": 4,
"atk_up": 5,
"def_up": 6,
"mdef_up": 7,
"agi_up": 8,
"luk_up": 9
},
{
"id": 5,
"quality": 1,
"star": 5,
"advanceUpFragmentNum": 20,
"hp_up": 5,
"atk_up": 6,
"def_up": 7,
"mdef_up": 8,
"agi_up": 9,
"luk_up": 10
},
{
"id": 6,
"quality": 2,
"star": 1,
"advanceUpFragmentNum": 10,
"hp_up": 7,
"atk_up": 8,
"def_up": 9,
"mdef_up": 10,
"agi_up": 11,
"luk_up": 12
},
{
"id": 7,
"quality": 2,
"star": 2,
"advanceUpFragmentNum": 20,
"hp_up": 8,
"atk_up": 9,
"def_up": 10,
"mdef_up": 11,
"agi_up": 12,
"luk_up": 13
},
{
"id": 8,
"quality": 2,
"star": 3,
"advanceUpFragmentNum": 20,
"hp_up": 9,
"atk_up": 10,
"def_up": 11,
"mdef_up": 12,
"agi_up": 13,
"luk_up": 14
},
{
"id": 9,
"quality": 2,
"star": 4,
"advanceUpFragmentNum": 20,
"hp_up": 10,
"atk_up": 11,
"def_up": 12,
"mdef_up": 13,
"agi_up": 14,
"luk_up": 15
},
{
"id": 10,
"quality": 2,
"star": 5,
"advanceUpFragmentNum": 30,
"hp_up": 11,
"atk_up": 12,
"def_up": 13,
"mdef_up": 14,
"agi_up": 15,
"luk_up": 16
},
{
"id": 11,
"quality": 3,
"star": 1,
"advanceUpFragmentNum": 20,
"hp_up": 13,
"atk_up": 14,
"def_up": 15,
"mdef_up": 16,
"agi_up": 17,
"luk_up": 18
},
{
"id": 12,
"quality": 3,
"star": 2,
"advanceUpFragmentNum": 40,
"hp_up": 14,
"atk_up": 15,
"def_up": 16,
"mdef_up": 17,
"agi_up": 18,
"luk_up": 19
},
{
"id": 13,
"quality": 3,
"star": 3,
"advanceUpFragmentNum": 40,
"hp_up": 15,
"atk_up": 16,
"def_up": 17,
"mdef_up": 18,
"agi_up": 19,
"luk_up": 20
},
{
"id": 14,
"quality": 3,
"star": 4,
"advanceUpFragmentNum": 40,
"hp_up": 16,
"atk_up": 17,
"def_up": 18,
"mdef_up": 19,
"agi_up": 20,
"luk_up": 21
},
{
"id": 15,
"quality": 3,
"star": 5,
"advanceUpFragmentNum": 50,
"hp_up": 17,
"atk_up": 18,
"def_up": 19,
"mdef_up": 20,
"agi_up": 21,
"luk_up": 22
}
]

View File

@@ -0,0 +1,398 @@
[
{
"id": 1,
"quality": 1,
"star": 0,
"fragmentNum": 240,
"consume": "17001&3",
"hp_up": 21,
"atk_up": 22,
"def_up": 23,
"mdef_up": 24,
"agi_up": 25,
"luk_up": 26,
"__EMPTY": 0,
"__EMPTY_1": 0,
"__EMPTY_2": 0,
"__EMPTY_3": 0,
"__EMPTY_4": 0,
"__EMPTY_5": 0,
"__EMPTY_6": 0,
"__EMPTY_7": 0,
"__EMPTY_8": 0
},
{
"id": 2,
"quality": 1,
"star": 1,
"fragmentNum": 20,
"consume": "17001&1",
"hp_up": 22,
"atk_up": 23,
"def_up": 24,
"mdef_up": 25,
"agi_up": 26,
"luk_up": 27,
"__EMPTY": 0,
"__EMPTY_1": 0,
"__EMPTY_2": 0,
"__EMPTY_3": 0,
"__EMPTY_4": 0,
"__EMPTY_5": 0,
"__EMPTY_6": 0,
"__EMPTY_7": 0,
"__EMPTY_8": 0
},
{
"id": 3,
"quality": 1,
"star": 2,
"fragmentNum": 20,
"consume": "17001&1",
"hp_up": 23,
"atk_up": 24,
"def_up": 25,
"mdef_up": 26,
"agi_up": 27,
"luk_up": 28,
"__EMPTY": 0,
"__EMPTY_1": 0,
"__EMPTY_2": 0,
"__EMPTY_3": 0,
"__EMPTY_4": 0,
"__EMPTY_5": 0,
"__EMPTY_6": 0,
"__EMPTY_7": 0,
"__EMPTY_8": 0
},
{
"id": 4,
"quality": 1,
"star": 3,
"fragmentNum": 20,
"consume": "17001&1",
"hp_up": 24,
"atk_up": 25,
"def_up": 26,
"mdef_up": 27,
"agi_up": 28,
"luk_up": 29,
"__EMPTY": 0,
"__EMPTY_1": 0,
"__EMPTY_2": 0,
"__EMPTY_3": 0,
"__EMPTY_4": 0,
"__EMPTY_5": 0,
"__EMPTY_6": 0,
"__EMPTY_7": 0,
"__EMPTY_8": 0
},
{
"id": 5,
"quality": 1,
"star": 4,
"fragmentNum": 30,
"consume": "17001&3",
"hp_up": 25,
"atk_up": 26,
"def_up": 27,
"mdef_up": 28,
"agi_up": 29,
"luk_up": 30,
"__EMPTY": 0,
"__EMPTY_1": 0,
"__EMPTY_2": 0,
"__EMPTY_3": 0,
"__EMPTY_4": 0,
"__EMPTY_5": 0,
"__EMPTY_6": 0,
"__EMPTY_7": 0,
"__EMPTY_8": 0
},
{
"id": 6,
"quality": 1,
"star": 5,
"fragmentNum": 30,
"consume": "17001&3",
"hp_up": 26,
"atk_up": 27,
"def_up": 28,
"mdef_up": 29,
"agi_up": 30,
"luk_up": 31,
"__EMPTY": 0,
"__EMPTY_1": 0,
"__EMPTY_2": 0,
"__EMPTY_3": 0,
"__EMPTY_4": 0,
"__EMPTY_5": 0,
"__EMPTY_6": 0,
"__EMPTY_7": 0,
"__EMPTY_8": 0
},
{
"id": 7,
"quality": 2,
"star": 0,
"fragmentNum": 200,
"consume": "17001&3",
"hp_up": 28,
"atk_up": 29,
"def_up": 30,
"mdef_up": 31,
"agi_up": 32,
"luk_up": 33,
"__EMPTY": 0,
"__EMPTY_1": 0,
"__EMPTY_2": 0,
"__EMPTY_3": 0,
"__EMPTY_4": 0,
"__EMPTY_5": 0,
"__EMPTY_6": 0,
"__EMPTY_7": 0,
"__EMPTY_8": 0
},
{
"id": 8,
"quality": 2,
"star": 1,
"fragmentNum": 15,
"consume": "17001&1",
"hp_up": 29,
"atk_up": 30,
"def_up": 31,
"mdef_up": 32,
"agi_up": 33,
"luk_up": 34,
"__EMPTY": 0,
"__EMPTY_1": 0,
"__EMPTY_2": 0,
"__EMPTY_3": 0,
"__EMPTY_4": 0,
"__EMPTY_5": 0,
"__EMPTY_6": 0,
"__EMPTY_7": 0,
"__EMPTY_8": 0
},
{
"id": 9,
"quality": 2,
"star": 2,
"fragmentNum": 15,
"consume": "17001&1",
"hp_up": 30,
"atk_up": 31,
"def_up": 32,
"mdef_up": 33,
"agi_up": 34,
"luk_up": 35,
"__EMPTY": 0,
"__EMPTY_1": 0,
"__EMPTY_2": 0,
"__EMPTY_3": 0,
"__EMPTY_4": 0,
"__EMPTY_5": 0,
"__EMPTY_6": 0,
"__EMPTY_7": 0,
"__EMPTY_8": 0
},
{
"id": 10,
"quality": 2,
"star": 3,
"fragmentNum": 15,
"consume": "17001&1",
"hp_up": 31,
"atk_up": 32,
"def_up": 33,
"mdef_up": 34,
"agi_up": 35,
"luk_up": 36,
"__EMPTY": 0,
"__EMPTY_1": 0,
"__EMPTY_2": 0,
"__EMPTY_3": 0,
"__EMPTY_4": 0,
"__EMPTY_5": 0,
"__EMPTY_6": 0,
"__EMPTY_7": 0,
"__EMPTY_8": 0
},
{
"id": 11,
"quality": 2,
"star": 4,
"fragmentNum": 25,
"consume": "17001&3",
"hp_up": 32,
"atk_up": 33,
"def_up": 34,
"mdef_up": 35,
"agi_up": 36,
"luk_up": 37,
"__EMPTY": 0,
"__EMPTY_1": 0,
"__EMPTY_2": 0,
"__EMPTY_3": 0,
"__EMPTY_4": 0,
"__EMPTY_5": 0,
"__EMPTY_6": 0,
"__EMPTY_7": 0,
"__EMPTY_8": 0
},
{
"id": 12,
"quality": 2,
"star": 5,
"fragmentNum": 25,
"consume": "17001&3",
"hp_up": 33,
"atk_up": 34,
"def_up": 35,
"mdef_up": 36,
"agi_up": 37,
"luk_up": 38,
"__EMPTY": 0,
"__EMPTY_1": 0,
"__EMPTY_2": 0,
"__EMPTY_3": 0,
"__EMPTY_4": 0,
"__EMPTY_5": 0,
"__EMPTY_6": 0,
"__EMPTY_7": 0,
"__EMPTY_8": 0
},
{
"id": 13,
"quality": 3,
"star": 0,
"fragmentNum": 180,
"consume": "17001&3",
"hp_up": 35,
"atk_up": 36,
"def_up": 37,
"mdef_up": 38,
"agi_up": 39,
"luk_up": 40,
"__EMPTY": 0,
"__EMPTY_1": 0,
"__EMPTY_2": 0,
"__EMPTY_3": 0,
"__EMPTY_4": 0,
"__EMPTY_5": 0,
"__EMPTY_6": 0,
"__EMPTY_7": 0,
"__EMPTY_8": 0
},
{
"id": 14,
"quality": 3,
"star": 1,
"fragmentNum": 15,
"consume": "17001&1",
"hp_up": 36,
"atk_up": 37,
"def_up": 38,
"mdef_up": 39,
"agi_up": 40,
"luk_up": 41,
"__EMPTY": 0,
"__EMPTY_1": 0,
"__EMPTY_2": 0,
"__EMPTY_3": 0,
"__EMPTY_4": 0,
"__EMPTY_5": 0,
"__EMPTY_6": 0,
"__EMPTY_7": 0,
"__EMPTY_8": 0
},
{
"id": 15,
"quality": 3,
"star": 2,
"fragmentNum": 15,
"consume": "17001&1",
"hp_up": 37,
"atk_up": 38,
"def_up": 39,
"mdef_up": 40,
"agi_up": 41,
"luk_up": 42,
"__EMPTY": 0,
"__EMPTY_1": 0,
"__EMPTY_2": 0,
"__EMPTY_3": 0,
"__EMPTY_4": 0,
"__EMPTY_5": 0,
"__EMPTY_6": 0,
"__EMPTY_7": 0,
"__EMPTY_8": 0
},
{
"id": 16,
"quality": 3,
"star": 3,
"fragmentNum": 15,
"consume": "17001&1",
"hp_up": 38,
"atk_up": 39,
"def_up": 40,
"mdef_up": 41,
"agi_up": 42,
"luk_up": 43,
"__EMPTY": 0,
"__EMPTY_1": 0,
"__EMPTY_2": 0,
"__EMPTY_3": 0,
"__EMPTY_4": 0,
"__EMPTY_5": 0,
"__EMPTY_6": 0,
"__EMPTY_7": 0,
"__EMPTY_8": 0
},
{
"id": 17,
"quality": 3,
"star": 4,
"fragmentNum": 20,
"consume": "17001&3",
"hp_up": 39,
"atk_up": 40,
"def_up": 41,
"mdef_up": 42,
"agi_up": 43,
"luk_up": 44,
"__EMPTY": 0,
"__EMPTY_1": 0,
"__EMPTY_2": 0,
"__EMPTY_3": 0,
"__EMPTY_4": 0,
"__EMPTY_5": 0,
"__EMPTY_6": 0,
"__EMPTY_7": 0,
"__EMPTY_8": 0
},
{
"id": 18,
"quality": 3,
"star": 5,
"fragmentNum": 20,
"consume": "17001&3",
"hp_up": 40,
"atk_up": 41,
"def_up": 42,
"mdef_up": 43,
"agi_up": 44,
"luk_up": 45,
"__EMPTY": 0,
"__EMPTY_1": 0,
"__EMPTY_2": 0,
"__EMPTY_3": 0,
"__EMPTY_4": 0,
"__EMPTY_5": 0,
"__EMPTY_6": 0,
"__EMPTY_7": 0,
"__EMPTY_8": 0
}
]

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -322,5 +322,41 @@
"32": 255, "32": 255,
"33": 2, "33": 2,
"id": 9 "id": 9
},
{
"1": 1,
"2": 1,
"3": 2,
"4": 2,
"5": 3,
"6": 255,
"7": 2,
"8": 2,
"9": 1,
"10": 2,
"11": 1,
"12": 2,
"13": 255,
"14": 2,
"15": 255,
"16": 255,
"17": 1,
"18": 255,
"19": 1,
"20": 1,
"21": 2,
"22": 2,
"23": 2,
"24": 3,
"25": 2,
"26": 255,
"27": 255,
"28": 255,
"29": 1,
"30": 255,
"31": 1,
"32": 255,
"33": 3,
"id": 10
} }
] ]

View File

@@ -1 +1,402 @@
[{"level":1,"exp":100},{"level":2,"exp":400},{"level":3,"exp":900},{"level":4,"exp":1600},{"level":5,"exp":2500},{"level":6,"exp":3600},{"level":7,"exp":4900},{"level":8,"exp":6400},{"level":9,"exp":8100},{"level":10,"exp":10000},{"level":11,"exp":12100},{"level":12,"exp":14400},{"level":13,"exp":16900},{"level":14,"exp":19600},{"level":15,"exp":22500},{"level":16,"exp":25600},{"level":17,"exp":28900},{"level":18,"exp":32400},{"level":19,"exp":36100},{"level":20,"exp":40000},{"level":21,"exp":44100},{"level":22,"exp":48400},{"level":23,"exp":52900},{"level":24,"exp":57600},{"level":25,"exp":62500},{"level":26,"exp":67600},{"level":27,"exp":72900},{"level":28,"exp":78400},{"level":29,"exp":84100},{"level":30,"exp":90000},{"level":31,"exp":96100},{"level":32,"exp":102400},{"level":33,"exp":108900},{"level":34,"exp":115600},{"level":35,"exp":122500},{"level":36,"exp":129600},{"level":37,"exp":136900},{"level":38,"exp":144400},{"level":39,"exp":152100},{"level":40,"exp":160000},{"level":41,"exp":168100},{"level":42,"exp":176400},{"level":43,"exp":184900},{"level":44,"exp":193600},{"level":45,"exp":202500},{"level":46,"exp":211600},{"level":47,"exp":220900},{"level":48,"exp":230400},{"level":49,"exp":240100},{"level":50,"exp":250000},{"level":51,"exp":260100},{"level":52,"exp":270400},{"level":53,"exp":280900},{"level":54,"exp":291600},{"level":55,"exp":302500},{"level":56,"exp":313600},{"level":57,"exp":324900},{"level":58,"exp":336400},{"level":59,"exp":348100},{"level":60,"exp":360000},{"level":61,"exp":372100},{"level":62,"exp":384400},{"level":63,"exp":396900},{"level":64,"exp":409600},{"level":65,"exp":422500},{"level":66,"exp":435600},{"level":67,"exp":448900},{"level":68,"exp":462400},{"level":69,"exp":476100},{"level":70,"exp":490000},{"level":71,"exp":504100},{"level":72,"exp":518400},{"level":73,"exp":532900},{"level":74,"exp":547600},{"level":75,"exp":562500},{"level":76,"exp":577600},{"level":77,"exp":592900},{"level":78,"exp":608400},{"level":79,"exp":624100},{"level":80,"exp":640000},{"level":81,"exp":656100},{"level":82,"exp":672400},{"level":83,"exp":688900},{"level":84,"exp":705600},{"level":85,"exp":722500},{"level":86,"exp":739600},{"level":87,"exp":756900},{"level":88,"exp":774400},{"level":89,"exp":792100},{"level":90,"exp":810000},{"level":91,"exp":828100},{"level":92,"exp":846400},{"level":93,"exp":864900},{"level":94,"exp":883600},{"level":95,"exp":902500},{"level":96,"exp":921600},{"level":97,"exp":940900},{"level":98,"exp":960400},{"level":99,"exp":980100},{"level":100,"exp":1000000}] [
{
"level": 1,
"exp": 100
},
{
"level": 2,
"exp": 400
},
{
"level": 3,
"exp": 900
},
{
"level": 4,
"exp": 1600
},
{
"level": 5,
"exp": 2500
},
{
"level": 6,
"exp": 3600
},
{
"level": 7,
"exp": 4900
},
{
"level": 8,
"exp": 6400
},
{
"level": 9,
"exp": 8100
},
{
"level": 10,
"exp": 10000
},
{
"level": 11,
"exp": 12100
},
{
"level": 12,
"exp": 14400
},
{
"level": 13,
"exp": 16900
},
{
"level": 14,
"exp": 19600
},
{
"level": 15,
"exp": 22500
},
{
"level": 16,
"exp": 25600
},
{
"level": 17,
"exp": 28900
},
{
"level": 18,
"exp": 32400
},
{
"level": 19,
"exp": 36100
},
{
"level": 20,
"exp": 40000
},
{
"level": 21,
"exp": 44100
},
{
"level": 22,
"exp": 48400
},
{
"level": 23,
"exp": 52900
},
{
"level": 24,
"exp": 57600
},
{
"level": 25,
"exp": 62500
},
{
"level": 26,
"exp": 67600
},
{
"level": 27,
"exp": 72900
},
{
"level": 28,
"exp": 78400
},
{
"level": 29,
"exp": 84100
},
{
"level": 30,
"exp": 90000
},
{
"level": 31,
"exp": 96100
},
{
"level": 32,
"exp": 102400
},
{
"level": 33,
"exp": 108900
},
{
"level": 34,
"exp": 115600
},
{
"level": 35,
"exp": 122500
},
{
"level": 36,
"exp": 129600
},
{
"level": 37,
"exp": 136900
},
{
"level": 38,
"exp": 144400
},
{
"level": 39,
"exp": 152100
},
{
"level": 40,
"exp": 160000
},
{
"level": 41,
"exp": 168100
},
{
"level": 42,
"exp": 176400
},
{
"level": 43,
"exp": 184900
},
{
"level": 44,
"exp": 193600
},
{
"level": 45,
"exp": 202500
},
{
"level": 46,
"exp": 211600
},
{
"level": 47,
"exp": 220900
},
{
"level": 48,
"exp": 230400
},
{
"level": 49,
"exp": 240100
},
{
"level": 50,
"exp": 250000
},
{
"level": 51,
"exp": 260100
},
{
"level": 52,
"exp": 270400
},
{
"level": 53,
"exp": 280900
},
{
"level": 54,
"exp": 291600
},
{
"level": 55,
"exp": 302500
},
{
"level": 56,
"exp": 313600
},
{
"level": 57,
"exp": 324900
},
{
"level": 58,
"exp": 336400
},
{
"level": 59,
"exp": 348100
},
{
"level": 60,
"exp": 360000
},
{
"level": 61,
"exp": 372100
},
{
"level": 62,
"exp": 384400
},
{
"level": 63,
"exp": 396900
},
{
"level": 64,
"exp": 409600
},
{
"level": 65,
"exp": 422500
},
{
"level": 66,
"exp": 435600
},
{
"level": 67,
"exp": 448900
},
{
"level": 68,
"exp": 462400
},
{
"level": 69,
"exp": 476100
},
{
"level": 70,
"exp": 490000
},
{
"level": 71,
"exp": 504100
},
{
"level": 72,
"exp": 518400
},
{
"level": 73,
"exp": 532900
},
{
"level": 74,
"exp": 547600
},
{
"level": 75,
"exp": 562500
},
{
"level": 76,
"exp": 577600
},
{
"level": 77,
"exp": 592900
},
{
"level": 78,
"exp": 608400
},
{
"level": 79,
"exp": 624100
},
{
"level": 80,
"exp": 640000
},
{
"level": 81,
"exp": 656100
},
{
"level": 82,
"exp": 672400
},
{
"level": 83,
"exp": 688900
},
{
"level": 84,
"exp": 705600
},
{
"level": 85,
"exp": 722500
},
{
"level": 86,
"exp": 739600
},
{
"level": 87,
"exp": 756900
},
{
"level": 88,
"exp": 774400
},
{
"level": 89,
"exp": 792100
},
{
"level": 90,
"exp": 810000
},
{
"level": 91,
"exp": 828100
},
{
"level": 92,
"exp": 846400
},
{
"level": 93,
"exp": 864900
},
{
"level": 94,
"exp": 883600
},
{
"level": 95,
"exp": 902500
},
{
"level": 96,
"exp": 921600
},
{
"level": 97,
"exp": 940900
},
{
"level": 98,
"exp": 960400
},
{
"level": 99,
"exp": 980100
},
{
"level": 100,
"exp": 1000000
}
]

View File

@@ -43,7 +43,7 @@
"pointId": 6, "pointId": 6,
"position": "-558&1561", "position": "-558&1561",
"previousPoint": "5&", "previousPoint": "5&",
"wayPoints": "&", "wayPoints": "-506&1647",
"chapater": 1, "chapater": 1,
"tips": "第一章&拦路官军" "tips": "第一章&拦路官军"
}, },
@@ -51,7 +51,7 @@
"pointId": 7, "pointId": 7,
"position": "-555&1363", "position": "-555&1363",
"previousPoint": "6&28", "previousPoint": "6&28",
"wayPoints": "&", "wayPoints": "-589&1466",
"chapater": 1, "chapater": 1,
"tips": "第一章&拦路官军" "tips": "第一章&拦路官军"
}, },
@@ -90,7 +90,7 @@
{ {
"pointId": 12, "pointId": 12,
"position": "-206&1353", "position": "-206&1353",
"previousPoint": "11&27", "previousPoint": "11&",
"wayPoints": "&", "wayPoints": "&",
"chapater": 1, "chapater": 1,
"tips": "第一章&拦路官军" "tips": "第一章&拦路官军"
@@ -98,7 +98,7 @@
{ {
"pointId": 13, "pointId": 13,
"position": "-247&1627", "position": "-247&1627",
"previousPoint": "12&", "previousPoint": "12&27",
"wayPoints": "&", "wayPoints": "&",
"chapater": 1, "chapater": 1,
"tips": "第一章&河间之战" "tips": "第一章&河间之战"
@@ -210,7 +210,7 @@
{ {
"pointId": 27, "pointId": 27,
"position": "-368&1875", "position": "-368&1875",
"previousPoint": "12&", "previousPoint": "13&",
"wayPoints": "&", "wayPoints": "&",
"chapater": 1, "chapater": 1,
"tips": "第一章&奇遇点2" "tips": "第一章&奇遇点2"
@@ -230,5 +230,37 @@
"wayPoints": "&", "wayPoints": "&",
"chapater": 1, "chapater": 1,
"tips": "第一章&奇遇点4" "tips": "第一章&奇遇点4"
},
{
"pointId": 30,
"position": "-402&2012",
"previousPoint": "27&",
"wayPoints": "&",
"chapater": 1,
"tips": "秘境怒狼洞穴"
},
{
"pointId": 31,
"position": "-555&721",
"previousPoint": "23&",
"wayPoints": "&",
"chapater": 1,
"tips": "遗迹第一关"
},
{
"pointId": 32,
"position": "-1294&721",
"previousPoint": "31&",
"wayPoints": "&",
"chapater": 1,
"tips": "遗迹第二关"
},
{
"pointId": 33,
"position": "-1200&1038",
"previousPoint": "32&",
"wayPoints": "&",
"chapater": 1,
"tips": "遗迹第三关"
} }
] ]

File diff suppressed because it is too large Load Diff

View File

@@ -1,162 +1,178 @@
[ [
{ {
"type": 1, "type": 1,
"isSeid": 0, "isSeid": 0,
"isBuff": 1, "isBuff": 1,
"isHalo": 0, "isHalo": 0,
"olyType": 102, "olyType": 102,
"haloObject": 0 "haloObject": 0
}, },
{ {
"type": 5, "type": 5,
"isSeid": 0, "isSeid": 0,
"isBuff": 1, "isBuff": 1,
"isHalo": 0, "isHalo": 0,
"olyType": 102, "olyType": 102,
"haloObject": 0 "haloObject": 0
}, },
{ {
"type": 8, "type": 8,
"isSeid": 0, "isSeid": 0,
"isBuff": 1, "isBuff": 1,
"isHalo": 0, "isHalo": 0,
"olyType": 102, "olyType": 102,
"haloObject": 0 "haloObject": 0
}, },
{ {
"type": 13, "type": 13,
"isSeid": 0, "isSeid": 0,
"isBuff": 1, "isBuff": 1,
"isHalo": 0, "isHalo": 0,
"olyType": 102, "olyType": 102,
"haloObject": 0 "haloObject": 0
}, },
{ {
"type": 18, "type": 18,
"isSeid": 0, "isSeid": 0,
"isBuff": 1, "isBuff": 1,
"isHalo": 0, "isHalo": 0,
"olyType": 101, "olyType": 101,
"haloObject": 0 "haloObject": 0
}, },
{ {
"type": 21, "type": 21,
"isSeid": 0, "isSeid": 0,
"isBuff": 1, "isBuff": 1,
"isHalo": 0, "isHalo": 0,
"olyType": 101, "olyType": 101,
"haloObject": 0 "haloObject": 0
}, },
{ {
"type": 22, "type": 22,
"isSeid": 0, "isSeid": 0,
"isBuff": 1, "isBuff": 1,
"isHalo": 0, "isHalo": 0,
"olyType": 101, "olyType": 101,
"haloObject": 0 "haloObject": 0
}, },
{ {
"type": 27, "type": 27,
"isSeid": 0, "isSeid": 0,
"isBuff": 1, "isBuff": 1,
"isHalo": 0, "isHalo": 0,
"olyType": 101, "olyType": 101,
"haloObject": 0 "haloObject": 0
}, },
{ {
"type": 28, "type": 28,
"isSeid": 0, "isSeid": 0,
"isBuff": 1, "isBuff": 1,
"isHalo": 0, "isHalo": 0,
"olyType": 101, "olyType": 101,
"haloObject": 0 "haloObject": 0
}, },
{ {
"type": 31, "type": 31,
"isSeid": 0, "isSeid": 0,
"isBuff": 1, "isBuff": 1,
"isHalo": 0, "isHalo": 0,
"olyType": 101, "olyType": 101,
"haloObject": 0 "haloObject": 0
}, },
{ {
"type": 32, "type": 32,
"isSeid": 0, "isSeid": 0,
"isBuff": 1, "isBuff": 1,
"isHalo": 0, "isHalo": 0,
"olyType": 101, "olyType": 101,
"haloObject": 0 "haloObject": 0
}, },
{ {
"type": 33, "type": 33,
"isSeid": 0, "isSeid": 0,
"isBuff": 1, "isBuff": 1,
"isHalo": 0, "isHalo": 0,
"olyType": 101, "olyType": 101,
"haloObject": 0 "haloObject": 0
}, },
{ {
"type": 34, "type": 34,
"isSeid": 0, "isSeid": 0,
"isBuff": 1, "isBuff": 1,
"isHalo": 0, "isHalo": 0,
"olyType": 101, "olyType": 101,
"haloObject": 0 "haloObject": 0
}, },
{ {
"type": 35, "type": 35,
"isSeid": 1, "isSeid": 1,
"isBuff": 0, "isBuff": 0,
"isHalo": 0, "isHalo": 0,
"olyType": 102, "olyType": 102,
"haloObject": 0 "haloObject": 0
}, },
{ {
"type": 101, "type": 101,
"isSeid": 1, "isSeid": 1,
"isBuff": 0, "isBuff": 0,
"isHalo": 0, "isHalo": 0,
"olyType": 101, "olyType": 101,
"haloObject": 0 "haloObject": 0
}, },
{ {
"type": 102, "type": 102,
"isSeid": 1, "isSeid": 1,
"isBuff": 0, "isBuff": 0,
"isHalo": 0, "isHalo": 0,
"olyType": 101, "olyType": 101,
"haloObject": 0 "haloObject": 0
}, },
{ {
"type": 114, "type": 114,
"isSeid": 1, "isSeid": 1,
"isBuff": 0, "isBuff": 0,
"isHalo": 0, "isHalo": 0,
"olyType": 101, "olyType": 101,
"haloObject": 0 "haloObject": 0
}, },
{ {
"type": 303, "type": 210,
"isSeid": 1, "isSeid": 1,
"isBuff": 0, "isBuff": 0,
"isHalo": 0, "isHalo": 0,
"olyType": 101, "olyType": 101,
"haloObject": 0 "haloObject": 0
}, },
{ {
"type": 312, "type": 303,
"isSeid": 1, "isSeid": 1,
"isBuff": 0, "isBuff": 0,
"isHalo": 0, "isHalo": 0,
"olyType": 101, "olyType": 101,
"haloObject": 0 "haloObject": 0
}, },
{ {
"type": 435, "type": 312,
"isSeid": 1, "isSeid": 1,
"isBuff": 0, "isBuff": 0,
"isHalo": 0, "isHalo": 0,
"olyType": 101, "olyType": 101,
"haloObject": 0 "haloObject": 0
} },
{
"type": 435,
"isSeid": 1,
"isBuff": 0,
"isHalo": 0,
"olyType": 101,
"haloObject": 0
},
{
"type": 2000,
"isSeid": 1,
"isBuff": 0,
"isHalo": 0,
"olyType": 101,
"haloObject": 0
}
] ]

View File

@@ -5,10 +5,10 @@
"quality": 1, "quality": 1,
"reward": "31001&50|31002&100", "reward": "31001&50|31002&100",
"additionalReward": "10201&5|10202&10", "additionalReward": "10201&5|10202&10",
"termsForAdd": "1&8&2|2&2&1|3&1&1", "termsForAdd": "1&2&2|2&2&1|3&1&1",
"actorNeeded": 2, "actorNeeded": 2,
"completeTime": 60, "completeTime": 60,
"suitFloor": "1&", "suitFloor": 1,
"weight": 1 "weight": 1
}, },
{ {
@@ -20,7 +20,7 @@
"termsForAdd": "2&1&1|3&2&1", "termsForAdd": "2&1&1|3&2&1",
"actorNeeded": 2, "actorNeeded": 2,
"completeTime": 60, "completeTime": 60,
"suitFloor": "1&", "suitFloor": 1,
"weight": 1 "weight": 1
}, },
{ {
@@ -32,7 +32,7 @@
"termsForAdd": "2&3&1|3&3&1", "termsForAdd": "2&3&1|3&3&1",
"actorNeeded": 2, "actorNeeded": 2,
"completeTime": 60, "completeTime": 60,
"suitFloor": "1&", "suitFloor": 1,
"weight": 1 "weight": 1
}, },
{ {
@@ -44,7 +44,7 @@
"termsForAdd": "2&4&1|3&4&1", "termsForAdd": "2&4&1|3&4&1",
"actorNeeded": 2, "actorNeeded": 2,
"completeTime": 60, "completeTime": 60,
"suitFloor": "1&", "suitFloor": 1,
"weight": 1 "weight": 1
}, },
{ {
@@ -53,10 +53,10 @@
"quality": 2, "quality": 2,
"reward": "17007&50|17008&100", "reward": "17007&50|17008&100",
"additionalReward": "10501&5|10502&10", "additionalReward": "10501&5|10502&10",
"termsForAdd": "1&9&1|2&4&1|3&5&1", "termsForAdd": "1&1&1|2&4&1|3&5&1",
"actorNeeded": 2, "actorNeeded": 2,
"completeTime": 60, "completeTime": 60,
"suitFloor": "1&", "suitFloor": 1,
"weight": 1 "weight": 1
}, },
{ {
@@ -68,7 +68,7 @@
"termsForAdd": "3&6&1", "termsForAdd": "3&6&1",
"actorNeeded": 2, "actorNeeded": 2,
"completeTime": 60, "completeTime": 60,
"suitFloor": "1&", "suitFloor": 1,
"weight": 1 "weight": 1
}, },
{ {
@@ -80,7 +80,7 @@
"termsForAdd": "3&7&1", "termsForAdd": "3&7&1",
"actorNeeded": 2, "actorNeeded": 2,
"completeTime": 60, "completeTime": 60,
"suitFloor": "1&", "suitFloor": 1,
"weight": 1 "weight": 1
}, },
{ {
@@ -92,7 +92,7 @@
"termsForAdd": "3&8&2", "termsForAdd": "3&8&2",
"actorNeeded": 3, "actorNeeded": 3,
"completeTime": 60, "completeTime": 60,
"suitFloor": "5&", "suitFloor": 1,
"weight": 1 "weight": 1
}, },
{ {
@@ -104,7 +104,7 @@
"termsForAdd": "1&1&1|2&1&1|3&1&1", "termsForAdd": "1&1&1|2&1&1|3&1&1",
"actorNeeded": 3, "actorNeeded": 3,
"completeTime": 60, "completeTime": 60,
"suitFloor": "5&", "suitFloor": 1,
"weight": 1 "weight": 1
}, },
{ {
@@ -116,7 +116,7 @@
"termsForAdd": "1&2&1|2&2&1|3&2&1", "termsForAdd": "1&2&1|2&2&1|3&2&1",
"actorNeeded": 3, "actorNeeded": 3,
"completeTime": 120, "completeTime": 120,
"suitFloor": "5&", "suitFloor": 1,
"weight": 1 "weight": 1
}, },
{ {
@@ -125,10 +125,10 @@
"quality": 4, "quality": 4,
"reward": "10105&50|10201&100", "reward": "10105&50|10201&100",
"additionalReward": "10703&5|10704&10", "additionalReward": "10703&5|10704&10",
"termsForAdd": "1&3&1|2&3&1|3&3&1", "termsForAdd": "1&1&1|2&3&1|3&3&1",
"actorNeeded": 3, "actorNeeded": 3,
"completeTime": 120, "completeTime": 120,
"suitFloor": "5&", "suitFloor": 1,
"weight": 1 "weight": 1
}, },
{ {
@@ -137,10 +137,10 @@
"quality": 4, "quality": 4,
"reward": "10202&50|10203&100", "reward": "10202&50|10203&100",
"additionalReward": "10705&5|12001&10", "additionalReward": "10705&5|12001&10",
"termsForAdd": "1&4&1|2&4&1|3&4&1", "termsForAdd": "1&2&1|2&4&1|3&4&1",
"actorNeeded": 3, "actorNeeded": 3,
"completeTime": 120, "completeTime": 120,
"suitFloor": "5&", "suitFloor": 1,
"weight": 1 "weight": 1
}, },
{ {
@@ -149,10 +149,10 @@
"quality": 5, "quality": 5,
"reward": "10204&50|10205&100", "reward": "10204&50|10205&100",
"additionalReward": "12002&5|12003&10", "additionalReward": "12002&5|12003&10",
"termsForAdd": "1&5&1|2&1&1|3&5&1", "termsForAdd": "1&1&1|2&1&1|3&5&1",
"actorNeeded": 3, "actorNeeded": 3,
"completeTime": 120, "completeTime": 120,
"suitFloor": "5&", "suitFloor": 1,
"weight": 1 "weight": 1
}, },
{ {
@@ -161,10 +161,10 @@
"quality": 5, "quality": 5,
"reward": "10301&50|10302&100", "reward": "10301&50|10302&100",
"additionalReward": "12004&5|12005&10", "additionalReward": "12004&5|12005&10",
"termsForAdd": "1&6&1|2&2&1|3&6&1", "termsForAdd": "1&2&1|2&2&1|3&6&1",
"actorNeeded": 3, "actorNeeded": 3,
"completeTime": 120, "completeTime": 120,
"suitFloor": "5&", "suitFloor": 1,
"weight": 1 "weight": 1
}, },
{ {
@@ -173,10 +173,10 @@
"quality": 5, "quality": 5,
"reward": "10303&50|10304&100", "reward": "10303&50|10304&100",
"additionalReward": "12006&5|12007&10", "additionalReward": "12006&5|12007&10",
"termsForAdd": "1&7&1|2&3&1|3&7&1", "termsForAdd": "1&1&1|2&3&1|3&7&1",
"actorNeeded": 3, "actorNeeded": 3,
"completeTime": 120, "completeTime": 120,
"suitFloor": "5&", "suitFloor": 1,
"weight": 1 "weight": 1
} }
] ]

View File

@@ -58,7 +58,7 @@
}, },
{ {
"id": 4, "id": 4,
"name": "长枪投射", "name": "长枪投射I",
"hurt_formula": " (ownAtk*2*ownTerAddtion/100 - oppoDef*oppoTerAddtion/100)*(1 + ownDamInc/100000 - oppoDamDec/100000)", "hurt_formula": " (ownAtk*2*ownTerAddtion/100 - oppoDef*oppoTerAddtion/100)*(1 + ownDamInc/100000 - oppoDamDec/100000)",
"gain_formula": "&", "gain_formula": "&",
"rage_cost": 100, "rage_cost": 100,
@@ -77,7 +77,7 @@
}, },
{ {
"id": 5, "id": 5,
"name": "赦免", "name": "赦免I",
"hurt_formula": 0, "hurt_formula": 0,
"gain_formula": "&", "gain_formula": "&",
"rage_cost": 0, "rage_cost": 0,
@@ -96,7 +96,7 @@
}, },
{ {
"id": 6, "id": 6,
"name": "连珠三箭", "name": "连珠三箭 I",
"hurt_formula": " (ownAtk*1.2*ownTerAddtion/100 - oppoDef*oppoTerAddtion/100)*(1 + ownDamInc/100000 - oppoDamDec/100000)", "hurt_formula": " (ownAtk*1.2*ownTerAddtion/100 - oppoDef*oppoTerAddtion/100)*(1 + ownDamInc/100000 - oppoDamDec/100000)",
"gain_formula": "&", "gain_formula": "&",
"rage_cost": 100, "rage_cost": 100,
@@ -115,7 +115,7 @@
}, },
{ {
"id": 7, "id": 7,
"name": "鼓舞", "name": "鼓舞 I",
"hurt_formula": 0, "hurt_formula": 0,
"gain_formula": "&", "gain_formula": "&",
"rage_cost": 0, "rage_cost": 0,
@@ -172,7 +172,7 @@
}, },
{ {
"id": 10, "id": 10,
"name": "巨锤震击", "name": "巨锤震击 I",
"hurt_formula": " (ownAtk*2*ownTerAddtion/100 - oppoDef*oppoTerAddtion/100)*(1 + ownDamInc/100000 - oppoDamDec/100000)", "hurt_formula": " (ownAtk*2*ownTerAddtion/100 - oppoDef*oppoTerAddtion/100)*(1 + ownDamInc/100000 - oppoDamDec/100000)",
"gain_formula": "&", "gain_formula": "&",
"rage_cost": 100, "rage_cost": 100,
@@ -191,7 +191,7 @@
}, },
{ {
"id": 11, "id": 11,
"name": "虎痴", "name": "虎痴 I",
"hurt_formula": 0, "hurt_formula": 0,
"gain_formula": "&", "gain_formula": "&",
"rage_cost": 0, "rage_cost": 0,
@@ -248,7 +248,7 @@
}, },
{ {
"id": 14, "id": 14,
"name": "敌阵突破", "name": "敌阵突破 I",
"hurt_formula": " (ownAtk*2*ownTerAddtion/100 - oppoDef*oppoTerAddtion/100)*(1 + ownDamInc/100000 - oppoDamDec/100000)", "hurt_formula": " (ownAtk*2*ownTerAddtion/100 - oppoDef*oppoTerAddtion/100)*(1 + ownDamInc/100000 - oppoDamDec/100000)",
"gain_formula": "&", "gain_formula": "&",
"rage_cost": 100, "rage_cost": 100,
@@ -267,7 +267,7 @@
}, },
{ {
"id": 15, "id": 15,
"name": "坚壁", "name": "坚壁 I",
"hurt_formula": 0, "hurt_formula": 0,
"gain_formula": "&", "gain_formula": "&",
"rage_cost": 0, "rage_cost": 0,
@@ -321,5 +321,233 @@
"skill_info": "极品技能", "skill_info": "极品技能",
"skilNameImage": 0, "skilNameImage": 0,
"skillSceneSpine": "&" "skillSceneSpine": "&"
},
{
"id": 18,
"name": "狼王爪击",
"hurt_formula": " (ownAtk*1.2*ownTerAddtion/100 - oppoDef*oppoTerAddtion/100)*(1 + ownDamInc/100000 - oppoDamDec/100000)",
"gain_formula": "&",
"rage_cost": 0,
"cd": 0,
"attack_area": 5,
"strike_area": 7,
"object": 0,
"skill_class": 3,
"effect": "&",
"actionName": "skill1",
"secondActionName": "&",
"oppoSecondActionName": "&",
"skill_info": "对自身3格范围内的所有敌人造成120%的伤害",
"skilNameImage": 6,
"skillSceneSpine": "nuqijidonghuablue"
},
{
"id": 19,
"name": "召唤狼群",
"hurt_formula": 0,
"gain_formula": "&",
"rage_cost": 0,
"cd": 0,
"attack_area": 5,
"strike_area": 1,
"object": 1,
"skill_class": 3,
"effect": "4012&",
"actionName": "skill2",
"secondActionName": "&",
"oppoSecondActionName": "&",
"skill_info": "召唤2只狼",
"skilNameImage": 7,
"skillSceneSpine": "nuqijidonghuablue"
},
{
"id": 20,
"name": "长枪投射II",
"hurt_formula": " (ownAtk*3*ownTerAddtion/100 - oppoDef*oppoTerAddtion/100)*(1 + ownDamInc/100000 - oppoDamDec/100000)",
"gain_formula": "&",
"rage_cost": 100,
"cd": 0,
"attack_area": 2,
"strike_area": 1,
"object": 0,
"skill_class": 1,
"effect": "3069&",
"actionName": "skill1",
"secondActionName": "&",
"oppoSecondActionName": "skill1_B",
"skill_info": "远距离投射长枪对目标造成300%的伤害目标为策略职业时伤害提升30%并且给目标添加一个策略伤害加深降低20%的效果持续4回合",
"skilNameImage": 1,
"skillSceneSpine": "nuqijidonghuablue"
},
{
"id": 21,
"name": "赦免II",
"hurt_formula": 0,
"gain_formula": "&",
"rage_cost": 0,
"cd": 3,
"attack_area": 5,
"strike_area": 1,
"object": 1,
"skill_class": 2,
"effect": "3072&",
"actionName": "skill2",
"secondActionName": "&",
"oppoSecondActionName": "&",
"skill_info": "回复自身10%生命值并且自身的策略伤害减免上升20%持续2回合",
"skilNameImage": 0,
"skillSceneSpine": "&"
},
{
"id": 22,
"name": "敌阵突破 II",
"hurt_formula": " (ownAtk*3*ownTerAddtion/100 - oppoDef*oppoTerAddtion/100)*(1 + ownDamInc/100000 - oppoDamDec/100000)",
"gain_formula": "&",
"rage_cost": 100,
"cd": 0,
"attack_area": 3,
"strike_area": 1,
"object": 0,
"skill_class": 1,
"effect": "3085&",
"actionName": "skill1",
"secondActionName": "&",
"oppoSecondActionName": "&",
"skill_info": "向目标冲锋造成300%伤害同时会生成自身攻击30%的护盾持续4回合冲锋会位移到目标的身后",
"skilNameImage": 4,
"skillSceneSpine": "nuqijidonghuablue"
},
{
"id": 23,
"name": "坚壁 II",
"hurt_formula": 0,
"gain_formula": "&",
"rage_cost": 0,
"cd": 3,
"attack_area": 2,
"strike_area": 1,
"object": 1,
"skill_class": 2,
"effect": "3089&",
"actionName": "skill2",
"secondActionName": "&",
"oppoSecondActionName": "&",
"skill_info": "使我方指定目标获得物理伤害减免提升30%持续2回合",
"skilNameImage": 0,
"skillSceneSpine": "&"
},
{
"id": 24,
"name": "连珠三箭 II",
"hurt_formula": " (ownAtk*1.5*ownTerAddtion/100 - oppoDef*oppoTerAddtion/100)*(1 + ownDamInc/100000 - oppoDamDec/100000)",
"gain_formula": "&",
"rage_cost": 100,
"cd": 0,
"attack_area": 4,
"strike_area": 1,
"object": 0,
"skill_class": 1,
"effect": "3093&",
"actionName": "skill1",
"secondActionName": "&",
"oppoSecondActionName": "&",
"skill_info": "对范围内的多个目标最多3个造成150%的伤害被攻击目标有33%的概率获得一个减益效果攻击时物理伤害加深减少30%持续4回合",
"skilNameImage": 2,
"skillSceneSpine": "nuqijidonghuablue"
},
{
"id": 25,
"name": "鼓舞 II",
"hurt_formula": 0,
"gain_formula": "&",
"rage_cost": 0,
"cd": 3,
"attack_area": 2,
"strike_area": 1,
"object": 1,
"skill_class": 2,
"effect": "3097&",
"actionName": "skill2",
"secondActionName": "&",
"oppoSecondActionName": "&",
"skill_info": "使我方指定目标获得幸运提升20%的效果持续4回合",
"skilNameImage": 0,
"skillSceneSpine": "&"
},
{
"id": 26,
"name": "猛毒迷雾",
"hurt_formula": " (ownAtk*1.2*ownTerAddtion/100 - oppoDef*oppoTerAddtion/100)*(1 + ownDamInc/100000 - oppoDamDec/100000)",
"gain_formula": "&",
"rage_cost": 100,
"cd": 0,
"attack_area": 2,
"strike_area": 4,
"object": 0,
"skill_class": 1,
"effect": "3109&",
"actionName": "skill1",
"secondActionName": "&",
"oppoSecondActionName": "&",
"skill_info": "对范围内目标进行毒雾攻击造成120%伤害附加中毒效果造成每回合30%策攻伤害持续4回合对已有中毒效果的单位立即生成一段毒伤害同时降低目标20%的敏捷持续3回合",
"skilNameImage": 3,
"skillSceneSpine": "nuqijidonghuablue"
},
{
"id": 27,
"name": "投毒",
"hurt_formula": " (ownAtk*1.8*ownTerAddtion/100 - oppoDef*oppoTerAddtion/100)*(1 + ownDamInc/100000 - oppoDamDec/100000)",
"gain_formula": "&",
"rage_cost": 0,
"cd": 3,
"attack_area": 2,
"strike_area": 1,
"object": 0,
"skill_class": 2,
"effect": "3113&",
"actionName": "skill2",
"secondActionName": "&",
"oppoSecondActionName": "&",
"skill_info": "对目标下毒造成180%伤害附加中毒效果造成每回合30%策攻伤害持续4回合对已有中毒效果的单位立即生成一段毒伤害",
"skilNameImage": 0,
"skillSceneSpine": "&"
},
{
"id": 28,
"name": "巨锤震击 II",
"hurt_formula": " (ownAtk*2.2*ownTerAddtion/100 - oppoDef*oppoTerAddtion/100)*(1 + ownDamInc/100000 - oppoDamDec/100000)",
"gain_formula": "&",
"rage_cost": 100,
"cd": 0,
"attack_area": 3,
"strike_area": 1,
"object": 0,
"skill_class": 1,
"effect": "3117&",
"actionName": "skill1",
"secondActionName": "skill1_B",
"oppoSecondActionName": "&",
"skill_info": "造成220%物理伤害并且击退1格如果不能击退则这次攻击伤害加深提升30%",
"skilNameImage": 5,
"skillSceneSpine": "nuqijidonghuablue"
},
{
"id": 29,
"name": "虎痴 II",
"hurt_formula": 0,
"gain_formula": "&",
"rage_cost": 0,
"cd": 3,
"attack_area": 5,
"strike_area": 1,
"object": 1,
"skill_class": 2,
"effect": "3121&",
"actionName": "skill2",
"secondActionName": "&",
"oppoSecondActionName": "&",
"skill_info": "恢复自身20%攻击力的血量并且给自身附加伤害减免15%4回合内作用2次",
"skilNameImage": 0,
"skillSceneSpine": "&"
} }
] ]

View File

@@ -973,5 +973,155 @@
"img": 44, "img": 44,
"info": "回春状态描述文字", "info": "回春状态描述文字",
"showOnChar": "回春" "showOnChar": "回春"
},
{
"buffId": 66,
"type": 33,
"name": "策略伤害加深下降",
"maxOlyNum": 1,
"round": 4,
"times": 0,
"cover": 1,
"buffOrDebuff": 1,
"gainvalue": "20000&",
"dotOrHot": 0,
"img": 3,
"info": "策略伤害加深降低20%",
"showOnChar": "增伤↓"
},
{
"buffId": 67,
"type": 34,
"name": "策略伤害减免上升 ",
"maxOlyNum": 1,
"round": 5,
"times": 0,
"cover": 1,
"buffOrDebuff": 0,
"gainvalue": "30000&",
"dotOrHot": 0,
"img": 7,
"info": "策略伤害减免上升30%",
"showOnChar": "减伤↑"
},
{
"buffId": 68,
"type": 28,
"name": "伤害减免上升",
"maxOlyNum": 1,
"round": 2,
"times": 0,
"cover": 1,
"buffOrDebuff": 0,
"gainvalue": "30000&",
"dotOrHot": 0,
"img": 8,
"info": "伤害减免增加30%",
"showOnChar": "减伤↑"
},
{
"buffId": 69,
"type": 5,
"name": "护盾(生命百分比)",
"maxOlyNum": 1,
"round": 2,
"times": 0,
"cover": 1,
"buffOrDebuff": 0,
"gainvalue": "1&20",
"dotOrHot": 0,
"img": 19,
"info": "可以抵消自身生命20%伤害的护盾",
"showOnChar": "护盾"
},
{
"buffId": 70,
"type": 5,
"name": "护盾(生命百分比)",
"maxOlyNum": 1,
"round": 2,
"times": 0,
"cover": 1,
"buffOrDebuff": 0,
"gainvalue": "1&30",
"dotOrHot": 0,
"img": 19,
"info": "可以抵消自身生命30%伤害的护盾",
"showOnChar": "护盾"
},
{
"buffId": 71,
"type": 31,
"name": "物理伤害加深下降",
"maxOlyNum": 1,
"round": 4,
"times": 0,
"cover": 1,
"buffOrDebuff": 1,
"gainvalue": "30000&",
"dotOrHot": 0,
"img": 7,
"info": "攻击时物理伤害加深下降30%",
"showOnChar": "增伤↓"
},
{
"buffId": 72,
"type": 22,
"name": "幸运上升 ",
"maxOlyNum": 1,
"round": 4,
"times": 0,
"cover": 1,
"buffOrDebuff": 0,
"gainvalue": "30&",
"dotOrHot": 0,
"img": 8,
"info": "幸运上升30%",
"showOnChar": "幸运↑"
},
{
"buffId": 73,
"type": 13,
"name": "中毒",
"maxOlyNum": 1,
"round": 4,
"times": 0,
"cover": 1,
"buffOrDebuff": 1,
"gainvalue": "1&30",
"dotOrHot": 1,
"img": 1,
"info": "每回合造成30%策攻的中毒伤害",
"showOnChar": "中毒"
},
{
"buffId": 74,
"type": 21,
"name": "敏捷下降",
"maxOlyNum": 1,
"round": 3,
"times": 0,
"cover": 1,
"buffOrDebuff": 1,
"gainvalue": "25&",
"dotOrHot": 0,
"img": 7,
"info": "敏捷下降25%",
"showOnChar": "敏捷↓"
},
{
"buffId": 75,
"type": 28,
"name": "伤害减免上升 ",
"maxOlyNum": 1,
"round": 4,
"times": 2,
"cover": 0,
"buffOrDebuff": 0,
"gainvalue": "15000&",
"dotOrHot": 0,
"img": 8,
"info": "伤害减免上升15%",
"showOnChar": "减伤↑"
} }
] ]

View File

@@ -0,0 +1,17 @@
[
{
"id": 1,
"string": "挑战规则\r\n玩家可以不断向上挑战关卡挑战不需要消耗资源。\r\n在镇念塔中挂机获得资源。\r\n\r\n收集\r\n当通过第一关后开启收集功能。\r\n每隔一定时间便可自动获得相关资源收益。\r\n通过层数越高收集单位时间内获得的收益越高。\r\n收集收益最多存储1个小时。\r\n\r\n任务探索\r\n探索任务每日5点刷新每次会刷新多个任务。\r\n可派遣武将完成任务任务完成后可获得奖励。\r\n每个任务会存在特殊加成条件当武将满足加成条件时可获得额外的加成奖励。\r\n\r\n奖励规则\r\n成功挑战关卡后会获得关卡奖励。\r\n每通过5个关卡可获得一份通关奖励。\r\n探索每隔一定时间可获得奖励。\r\n完成派遣任务可获得奖励\r\n\r\n",
"tip": "镇念塔说明"
},
{
"id": 2,
"string": "挑战规则\r\n玩家可以不断向上挑战首领关卡挑战不需要消耗资源。\r\n",
"tip": "秘境说明"
},
{
"id": 3,
"string": "这里写上远征玩法说明",
"tip": "远征说明"
}
]

View File

@@ -1,317 +1,352 @@
[ [
{ {
"id": 1, "1": 105,
"1": 105, "2": 105,
"2": 105, "3": 105,
"3": 105, "4": 105,
"4": 105, "5": 105,
"5": 105, "6": 100,
"6": 100, "7": 255,
"7": 255, "8": 105,
"8": 105, "9": 105,
"9": 105, "10": 105,
"10": 105, "11": 100,
"11": 100, "12": 100,
"12": 100, "13": 100,
"13": 100, "14": 100,
"14": 100, "15": 100,
"15": 100, "16": 100,
"16": 100, "17": 105,
"17": 105, "18": 100,
"18": 100, "19": 110,
"19": 110, "20": 110,
"20": 110, "21": 110,
"21": 110, "22": 105,
"22": 105, "23": 105,
"23": 105, "24": 105,
"24": 105, "25": 105,
"25": 105, "26": 105,
"26": 105, "27": 100,
"27": 100, "28": 100,
"28": 100, "29": 100,
"29": 100, "30": 100,
"30": 100, "31": 100,
"31": 100, "32": 100,
"32": 100 "id": 1
}, },
{ {
"id": 2, "1": 100,
"1": 100, "2": 105,
"2": 105, "3": 110,
"3": 110, "4": 100,
"4": 100, "5": 105,
"5": 105, "6": 95,
"6": 95, "7": 255,
"7": 255, "8": 100,
"8": 100, "9": 100,
"9": 100, "10": 100,
"10": 100, "11": 95,
"11": 95, "12": 100,
"12": 100, "13": 100,
"13": 100, "14": 100,
"14": 100, "15": 100,
"15": 100, "16": 100,
"16": 100, "17": 110,
"17": 110, "18": 100,
"18": 100, "19": 110,
"19": 110, "20": 110,
"20": 110, "21": 110,
"21": 110, "22": 105,
"22": 105, "23": 105,
"23": 105, "24": 105,
"24": 105, "25": 105,
"25": 105, "26": 105,
"26": 105, "27": 100,
"27": 100, "28": 100,
"28": 100, "29": 95,
"29": 95, "30": 100,
"30": 100, "31": 100,
"31": 100, "32": 100,
"32": 100 "id": 2
}, },
{ {
"id": 3, "1": 110,
"1": 110, "2": 110,
"2": 110, "3": 95,
"3": 95, "4": 100,
"4": 100, "5": 95,
"5": 95, "6": 95,
"6": 95, "7": 255,
"7": 255, "8": 100,
"8": 100, "9": 100,
"9": 100, "10": 95,
"10": 95, "11": 90,
"11": 90, "12": 90,
"12": 90, "13": 100,
"13": 100, "14": 95,
"14": 95, "15": 100,
"15": 100, "16": 100,
"16": 100, "17": 110,
"17": 110, "18": 100,
"18": 100, "19": 110,
"19": 110, "20": 110,
"20": 110, "21": 110,
"21": 110, "22": 105,
"22": 105, "23": 105,
"23": 105, "24": 95,
"24": 95, "25": 105,
"25": 105, "26": 100,
"26": 100, "27": 100,
"27": 100, "28": 100,
"28": 100, "29": 90,
"29": 90, "30": 100,
"30": 100, "31": 100,
"31": 100, "32": 100,
"32": 100 "id": 3
}, },
{ {
"id": 4, "1": 105,
"1": 105, "2": 105,
"2": 105, "3": 105,
"3": 105, "4": 105,
"4": 105, "5": 105,
"5": 105, "6": 95,
"6": 95, "7": 255,
"7": 255, "8": 110,
"8": 110, "9": 105,
"9": 105, "10": 100,
"10": 100, "11": 95,
"11": 95, "12": 100,
"12": 100, "13": 100,
"13": 100, "14": 110,
"14": 110, "15": 100,
"15": 100, "16": 100,
"16": 100, "17": 100,
"17": 100, "18": 100,
"18": 100, "19": 110,
"19": 110, "20": 110,
"20": 110, "21": 110,
"21": 110, "22": 105,
"22": 105, "23": 105,
"23": 105, "24": 100,
"24": 100, "25": 105,
"25": 105, "26": 105,
"26": 105, "27": 100,
"27": 100, "28": 100,
"28": 100, "29": 95,
"29": 95, "30": 100,
"30": 100, "31": 100,
"31": 100, "32": 100,
"32": 100 "id": 4
}, },
{ {
"id": 5, "1": 100,
"1": 100, "2": 105,
"2": 105, "3": 100,
"3": 100, "4": 100,
"4": 100, "5": 100,
"5": 100, "6": 110,
"6": 110, "7": 255,
"7": 255, "8": 105,
"8": 105, "9": 105,
"9": 105, "10": 100,
"10": 100, "11": 95,
"11": 95, "12": 105,
"12": 105, "13": 100,
"13": 100, "14": 105,
"14": 105, "15": 100,
"15": 100, "16": 100,
"16": 100, "17": 110,
"17": 110, "18": 100,
"18": 100, "19": 110,
"19": 110, "20": 110,
"20": 110, "21": 110,
"21": 110, "22": 105,
"22": 105, "23": 105,
"23": 105, "24": 110,
"24": 110, "25": 105,
"25": 105, "26": 105,
"26": 105, "27": 100,
"27": 100, "28": 100,
"28": 100, "29": 100,
"29": 100, "30": 100,
"30": 100, "31": 100,
"31": 100, "32": 100,
"32": 100 "id": 5
}, },
{ {
"id": 6, "1": 100,
"1": 100, "2": 100,
"2": 100, "3": 100,
"3": 100, "4": 95,
"4": 95, "5": 95,
"5": 95, "6": 95,
"6": 95, "7": 255,
"7": 255, "8": 95,
"8": 95, "9": 100,
"9": 100, "10": 100,
"10": 100, "11": 90,
"11": 90, "12": 95,
"12": 95, "13": 100,
"13": 100, "14": 95,
"14": 95, "15": 100,
"15": 100, "16": 100,
"16": 100, "17": 100,
"17": 100, "18": 100,
"18": 100, "19": 110,
"19": 110, "20": 110,
"20": 110, "21": 110,
"21": 110, "22": 105,
"22": 105, "23": 105,
"23": 105, "24": 105,
"24": 105, "25": 105,
"25": 105, "26": 100,
"26": 100, "27": 100,
"27": 100, "28": 100,
"28": 100, "29": 95,
"29": 95, "30": 100,
"30": 100, "31": 100,
"31": 100, "32": 100,
"32": 100 "id": 6
}, },
{ {
"id": 7, "1": 100,
"1": 100, "2": 100,
"2": 100, "3": 105,
"3": 105, "4": 105,
"4": 105, "5": 105,
"5": 105, "6": 100,
"6": 100, "7": 255,
"7": 255, "8": 95,
"8": 95, "9": 100,
"9": 100, "10": 100,
"10": 100, "11": 95,
"11": 95, "12": 100,
"12": 100, "13": 100,
"13": 100, "14": 100,
"14": 100, "15": 100,
"15": 100, "16": 100,
"16": 100, "17": 105,
"17": 105, "18": 100,
"18": 100, "19": 110,
"19": 110, "20": 110,
"20": 110, "21": 110,
"21": 110, "22": 105,
"22": 105, "23": 105,
"23": 105, "24": 105,
"24": 105, "25": 105,
"25": 105, "26": 100,
"26": 100, "27": 100,
"27": 100, "28": 100,
"28": 100, "29": 100,
"29": 100, "30": 100,
"30": 100, "31": 100,
"31": 100, "32": 100,
"32": 100 "id": 7
}, },
{ {
"id": 8, "1": 100,
"1": 100, "2": 100,
"2": 100, "3": 100,
"3": 100, "4": 95,
"4": 95, "5": 90,
"5": 90, "6": 95,
"6": 95, "7": 255,
"7": 255, "8": 95,
"8": 95, "9": 100,
"9": 100, "10": 100,
"10": 100, "11": 90,
"11": 90, "12": 95,
"12": 95, "13": 100,
"13": 100, "14": 95,
"14": 95, "15": 100,
"15": 100, "16": 100,
"16": 100, "17": 100,
"17": 100, "18": 100,
"18": 100, "19": 110,
"19": 110, "20": 110,
"20": 110, "21": 110,
"21": 110, "22": 105,
"22": 105, "23": 105,
"23": 105, "24": 105,
"24": 105, "25": 105,
"25": 105, "26": 100,
"26": 100, "27": 100,
"27": 100, "28": 100,
"28": 100, "29": 95,
"29": 95, "30": 100,
"30": 100, "31": 100,
"31": 100, "32": 100,
"32": 100 "id": 8
}, },
{ {
"id": 9, "1": 100,
"1": 100, "2": 105,
"2": 105, "3": 110,
"3": 110, "4": 100,
"4": 100, "5": 105,
"5": 105, "6": 95,
"6": 95, "7": 255,
"7": 255, "8": 100,
"8": 100, "9": 100,
"9": 100, "10": 100,
"10": 100, "11": 95,
"11": 95, "12": 100,
"12": 100, "13": 100,
"13": 100, "14": 100,
"14": 100, "15": 100,
"15": 100, "16": 100,
"16": 100, "17": 110,
"17": 110, "18": 100,
"18": 100, "19": 110,
"19": 110, "20": 110,
"20": 110, "21": 110,
"21": 110, "22": 105,
"22": 105, "23": 105,
"23": 105, "24": 105,
"24": 105, "25": 105,
"25": 105, "26": 105,
"26": 105, "27": 100,
"27": 100, "28": 100,
"28": 100, "29": 95,
"29": 95, "30": 100,
"30": 100, "31": 100,
"31": 100, "32": 100,
"32": 100 "id": 9
} },
{
"1": 105,
"2": 105,
"3": 105,
"4": 105,
"5": 105,
"6": 100,
"7": 255,
"8": 105,
"9": 105,
"10": 105,
"11": 100,
"12": 100,
"13": 100,
"14": 100,
"15": 100,
"16": 100,
"17": 105,
"18": 100,
"19": 110,
"20": 110,
"21": 110,
"22": 105,
"23": 105,
"24": 105,
"25": 105,
"26": 105,
"27": 100,
"28": 100,
"29": 100,
"30": 100,
"31": 100,
"32": 100,
"id": 10
}
] ]

View File

@@ -1,5 +1,4 @@
import { FIX_SMS_CODE_TELS, COUNTER, DEFAULT_ITEMS, ITID, DEFAULT_GOLD, DEFAULT_LV } from '@consts/consts'; import { FIX_SMS_CODE_TELS, COUNTER, DEFAULT_ITEMS, ITID, DEFAULT_GOLD, DEFAULT_LV } from '@consts/consts';
import { CounterModel } from '@db/Counter';
import { DEFAULT_HEROES } from '@consts/consts'; import { DEFAULT_HEROES } from '@consts/consts';
import { HeroModel } from '@db/Hero'; import { HeroModel } from '@db/Hero';
import { RoleModel } from '@db/Role'; import { RoleModel } from '@db/Role';
@@ -141,23 +140,17 @@ export default class Auth extends Service {
if(hero) { if(hero) {
continue; continue;
} }
const seqId = await CounterModel.getNewCounter(COUNTER.HID)||-1;
let dicHero = getHeroInfoById(hid); let dicHero = getHeroInfoById(hid);
if(!dicHero) { if(!dicHero) {
break; break;
} }
let {quality, initialStars: star, jobid: job, name: hName} = dicHero;
hero = await HeroModel.createHero({
roleId, roleName: role.roleName, hid, hName, star, quality, job, serverId: role.serverId
});
const heroInfo = {
roleId,
roleName: role.roleName,
hid: hid,
hName: dicHero.name,
seqId,
star: dicHero.quality,
lv: 30,
ce: 100
}
await HeroModel.createHero(heroInfo);
} }
for(let {id, count} of DEFAULT_ITEMS) { for(let {id, count} of DEFAULT_ITEMS) {