装备:精炼
This commit is contained in:
@@ -2,7 +2,7 @@ import { Application, BackendSession, HandlerService, } from "pinus";
|
||||
import { STATUS, EQUIP_STRENGTHEN_TYPE, CURRENCY_BY_TYPE, CURRENCY_TYPE, HERO_SYSTEM_TYPE, CONSUME_TYPE, HERO_GROW_MAX, MSG_SOURCE, JEWEL_PUSH_LV, TASK_TYPE, HERO_CE_RATIO } from "../../../consts";
|
||||
import { ItemInter } from "../../../pubUtils/interface";
|
||||
|
||||
import { resResult, parseGoodStr, getRandValueByMinMax, getRandEelm } from "../../../pubUtils/util";
|
||||
import { resResult, parseGoodStr } from "../../../pubUtils/util";
|
||||
import { addItems, handleCost, decreaseItems } from "../../../services/rewardService";
|
||||
import { EquipModel, EquipType } from "../../../db/Equip";
|
||||
import { HeroModel, EPlace } from "../../../db/Hero";
|
||||
@@ -10,8 +10,8 @@ import Role from "../../../db/Role";
|
||||
import { calPlayerCeAndSave } from "../../../services/playerCeService";
|
||||
import { getGoodById, gameData } from "../../../pubUtils/data";
|
||||
import { EQUIP } from "../../../pubUtils/dicParam";
|
||||
import { ITID, SPEICAL_ITEM, QUALITY_TYPE, equipTypeToSortAttr, IT_TYPE, QUENCH_TYPE } from "../../../consts";
|
||||
import { changeEquip, dressEquip, checkMaterialEnough, takeOffEquipAndCalPlayerCe, checkEquipCanPut, quenchOnce, checkQuenchMaxByQualityAndGrade, getRandSeResult } from "../../../services/equipService";
|
||||
import { ITID, QUALITY_TYPE, equipTypeToSortAttr, IT_TYPE, QUENCH_TYPE, REFINE_TYPE } from "../../../consts";
|
||||
import { changeEquip, dressEquip, checkMaterialEnough, takeOffEquipAndCalPlayerCe, checkEquipCanPut, quenchOnce, checkQuenchMaxByQualityAndGrade, getRandSeResult, refineOnce, checkRefineReachNextLv } from "../../../services/equipService";
|
||||
|
||||
import { findIndex } from 'underscore';
|
||||
import { pushEquipRefineSucMsg, pushNormalEquipMsg, pushNormalItemMsg } from "../../../services/chatService";
|
||||
@@ -268,14 +268,14 @@ export class EquipHandler {
|
||||
|
||||
}
|
||||
// 装备栏精炼
|
||||
public async refine(msg: { hid: number, ePlaceId: number, material: { id: number, count: number }[] }, session: BackendSession) {
|
||||
public async refine(msg: { hid: number, ePlaceId: number, type: REFINE_TYPE }, session: BackendSession) {
|
||||
let roleId: string = session.get('roleId');
|
||||
let roleName: string = session.get('roleName');
|
||||
let serverId = session.get('serverId');
|
||||
let sid: string = session.get('sid');
|
||||
let funcs: number[] = session.get('funcs');
|
||||
|
||||
let { hid, ePlaceId, material } = msg;
|
||||
let { hid, ePlaceId, type } = msg;
|
||||
|
||||
let hero = await HeroModel.findByHidAndRoleWithEquip(hid, roleId);
|
||||
if (!hero) return resResult(STATUS.HERO_NOT_FIND);
|
||||
@@ -285,45 +285,25 @@ export class EquipHandler {
|
||||
if (!curEplace) {
|
||||
return resResult(STATUS.ROLE_EQUIP_PLACE_NOT_ENOUGH);
|
||||
}
|
||||
let { lv, refineLv, equip } = curEplace; // 强化等级,精炼等级,精炼次数
|
||||
let { lv, refineLv: oldRefineLv, equip } = curEplace; // 强化等级,精炼等级,精炼次数
|
||||
|
||||
if (lv < HERO_GROW_MAX.EQUIP_STRENGTHEN) {
|
||||
return resResult(STATUS.ROLE_EQUIP_NOT_REACH_MAX);
|
||||
let refineLv = oldRefineLv, times = 0;
|
||||
while(
|
||||
(type == REFINE_TYPE.ONCE && times == 0) ||
|
||||
(type == REFINE_TYPE.ONE_LEVEL && !checkRefineReachNextLv(oldRefineLv, refineLv) )
|
||||
) {
|
||||
let result = await refineOnce(roleId, sid, lv, refineLv);
|
||||
console.log('*******', result);
|
||||
if(!result) break;
|
||||
refineLv = result;
|
||||
times ++;
|
||||
}
|
||||
if (refineLv >= HERO_GROW_MAX.EQUIP_REFINE) {
|
||||
return resResult(STATUS.ROLE_EQUIP_REACH_MAX);
|
||||
if(times == 0) {
|
||||
return resResult(STATUS.EQUIP_REFINE_ERR);
|
||||
}
|
||||
curEplace.refineLv = refineLv;
|
||||
|
||||
// 是否成功精炼
|
||||
let dicRefine = gameData.refine.get(refineLv + 1);
|
||||
if (!dicRefine) {
|
||||
return resResult(STATUS.DIC_DATA_NOT_FOUND)
|
||||
}
|
||||
|
||||
let { successRate } = dicRefine;
|
||||
for (let { id, count } of material) {
|
||||
let dicGoods = gameData.goods.get(id);
|
||||
if (!dicGoods) return resResult(STATUS.DIC_DATA_NOT_FOUND);
|
||||
if (!SPEICAL_ITEM.REFINE_ADD_RATE.includes(id)) {
|
||||
return resResult(STATUS.ROLE_WRONG_ITEM)
|
||||
}
|
||||
successRate += count * dicGoods.value;
|
||||
if (isNaN(successRate)) console.error(id, count, dicGoods.value);
|
||||
}
|
||||
|
||||
let ran = Math.floor(Math.random() * 100);
|
||||
let isSuccess = ran <= successRate;
|
||||
// 消耗道具提升成功率 每个道具提升10%成功率
|
||||
|
||||
// 精炼
|
||||
if (isSuccess) {
|
||||
curEplace.refineLv++;
|
||||
}
|
||||
|
||||
// 消耗
|
||||
let cost = dicRefine.material.concat(material);
|
||||
let result = await handleCost(roleId, sid, cost);
|
||||
if (!result) return resResult(STATUS.ROLE_MATERIAL_NOT_ENOUGH);
|
||||
|
||||
await calPlayerCeAndSave(HERO_SYSTEM_TYPE.EQUIP_BASE, sid, roleId, hero, { ePlace });
|
||||
|
||||
@@ -332,13 +312,11 @@ export class EquipHandler {
|
||||
ePlace: [curEplace]
|
||||
}
|
||||
|
||||
if (isSuccess) {
|
||||
let curEquip = <EquipType>equip;
|
||||
pushEquipRefineSucMsg(roleId, roleName, serverId, curEplace, curEquip ? curEquip.quality : 0);
|
||||
await checkTask(roleId, sid, funcs, TASK_TYPE.EQUIP_REFINE, 1, true, {});
|
||||
await checkActivityTask(serverId, sid, funcs, roleId, TASK_TYPE.EQUIP_REFINE_LV, 1, { lv: curEplace.refineLv });
|
||||
}
|
||||
return resResult(STATUS.SUCCESS, { isSuccess, curHero });
|
||||
let curEquip = <EquipType>equip;
|
||||
pushEquipRefineSucMsg(roleId, roleName, serverId, curEplace, curEquip ? curEquip.quality : 0);
|
||||
await checkTask(roleId, sid, funcs, TASK_TYPE.EQUIP_REFINE, times, true, {});
|
||||
await checkActivityTask(serverId, sid, funcs, roleId, TASK_TYPE.EQUIP_REFINE_LV, times, { lv: curEplace.refineLv });
|
||||
return resResult(STATUS.SUCCESS, { curHero });
|
||||
}
|
||||
|
||||
// 装备洗炼锁定
|
||||
@@ -431,7 +409,6 @@ export class EquipHandler {
|
||||
let { lockNum, removeSeidList } = randSe.reduce((pre, cur) => {
|
||||
return { lockNum: cur.locked?pre.lockNum+1: pre.lockNum, removeSeidList: [...pre.removeSeidList, cur.seid] }
|
||||
}, { lockNum: 0, removeSeidList: new Array<number>() });
|
||||
console.log('##########', lockNum, removeSeidList);
|
||||
|
||||
if (lockNum >= randSe.length) {
|
||||
return resResult(STATUS.ROLE_EQUIP_CANNOT_RESTRENGTHEN);
|
||||
|
||||
@@ -1,21 +1,12 @@
|
||||
import { Application, BackendSession, HandlerService, } from "pinus";
|
||||
import { STATUS, EQUIP_STRENGTHEN_TYPE, CURRENCY_BY_TYPE, CURRENCY_TYPE, HERO_SYSTEM_TYPE, CONSUME_TYPE, HERO_GROW_MAX, MSG_SOURCE, JEWEL_PUSH_LV, TASK_TYPE, DEBUG_MAGIC_WORD } from "../../../consts";
|
||||
import { ItemInter, RewardInter } from "../../../pubUtils/interface";
|
||||
import { STATUS, CONSUME_TYPE, DEBUG_MAGIC_WORD } from "../../../consts";
|
||||
import { RewardInter } from "../../../pubUtils/interface";
|
||||
|
||||
import { resResult, parseGoodStr, getRandValueByMinMax, getRandEelm } from "../../../pubUtils/util";
|
||||
import { addItems, handleCost, decreaseItems } from "../../../services/rewardService";
|
||||
import Equip, { EquipModel, EquipType } from "../../../db/Equip";
|
||||
import { HeroModel, EPlace } from "../../../db/Hero";
|
||||
import Role, { RoleModel } from "../../../db/Role";
|
||||
import { calPlayerCeAndSave } from "../../../services/playerCeService";
|
||||
import { resResult } from "../../../pubUtils/util";
|
||||
import { addItems, handleCost } from "../../../services/rewardService";
|
||||
import { RoleModel } from "../../../db/Role";
|
||||
import { gameData } from "../../../pubUtils/data";
|
||||
import { EQUIP } from "../../../pubUtils/dicParam";
|
||||
import { ITID, SPEICAL_ITEM, QUALITY_TYPE } from "../../../consts/constModules/itemConst";
|
||||
import { changeEquip, dressEquip, checkMaterialEnough, takeOffEquipAndCalPlayerCe } from "../../../services/equipService";
|
||||
|
||||
import { indexOf, findIndex } from 'underscore';
|
||||
import { pushEquipRefineSucMsg, pushNormalEquipMsg, pushNormalItemMsg } from "../../../services/chatService";
|
||||
import { checkTaskWithHero, checkTaskWithEquip, checkTask, checkTaskWithArgs, checkTaskConditionEquipSuitJewelStage, checkActivityTask } from "../../../services/taskService";
|
||||
import { ITID } from "../../../consts/constModules/itemConst";
|
||||
import { useGiftPackage } from "../../../services/activity/giftPackageService";
|
||||
import { getAp, setAp, setApBuyTimes } from "../../../services/actionPointService";
|
||||
import { ActionPointModel } from "../../../db/ActionPoint";
|
||||
|
||||
@@ -240,4 +240,27 @@ export function getRandSeResult(id: number, randSe: RandSe[]) {
|
||||
}
|
||||
}
|
||||
return randSe
|
||||
}
|
||||
|
||||
export async function refineOnce(roleId: string, sid: string, lv: number, refineLv: number) {
|
||||
|
||||
let dicRefine = gameData.refine.get(refineLv + 1);
|
||||
if (!dicRefine) return false;
|
||||
|
||||
if(lv < dicRefine.levelLimited) return false;
|
||||
|
||||
// 消耗
|
||||
let result = await handleCost(roleId, sid, dicRefine.consume);
|
||||
if (!result) return false;
|
||||
|
||||
return refineLv + 1;
|
||||
}
|
||||
|
||||
export function checkRefineReachNextLv(oldRefineLv: number, refineLv: number) {
|
||||
let oldDic = gameData.refine.get(oldRefineLv);
|
||||
let dic = gameData.refine.get(refineLv);
|
||||
if(!oldDic || !dic) return true;
|
||||
|
||||
console.log('*******', dic.level, oldDic.level)
|
||||
return dic.level > oldDic.level;
|
||||
}
|
||||
@@ -27,9 +27,7 @@ export enum HERO_SYSTEM_TYPE {
|
||||
export const HERO_GROW_MAX = {
|
||||
STAR: 6,
|
||||
COLORSTAR: 6,
|
||||
QUALITY: 3,
|
||||
EQUIP_STRENGTHEN: 100,
|
||||
EQUIP_REFINE: 15
|
||||
QUALITY: 3
|
||||
}
|
||||
|
||||
export const JOB_TYPE = {
|
||||
|
||||
@@ -164,11 +164,6 @@ export const CURRENCY_TYPE = {
|
||||
KING_EXP: 'kingExp'
|
||||
}
|
||||
|
||||
|
||||
export const SPEICAL_ITEM = {
|
||||
REFINE_ADD_RATE: [17039]
|
||||
};
|
||||
|
||||
const currencyArr = [
|
||||
{ "gid": 31001, "name": "铜钱", "type": CURRENCY_TYPE.COIN },
|
||||
{ "gid": 31002, "name": "元宝", "type": CURRENCY_TYPE.GOLD },
|
||||
@@ -279,4 +274,10 @@ export const SPECIAL_ATTR = {
|
||||
export enum QUENCH_TYPE {
|
||||
ONCE = 1, // 升一级
|
||||
ONE_GRADE = 2, // 升一品
|
||||
}
|
||||
|
||||
// 精炼类型
|
||||
export enum REFINE_TYPE {
|
||||
ONCE = 1, // 精炼一次
|
||||
ONE_LEVEL = 2, // 精炼一级
|
||||
}
|
||||
@@ -278,6 +278,7 @@ export const STATUS = {
|
||||
EQUIP_LEVEL_LIMIT: { code: 30510, simStr: '装备穿戴等级限制' },
|
||||
EQUIP_NOT_MATCH_JEWEL: { code: 30511, simStr: '装备不能镶嵌该宝石' },
|
||||
EQUIP_QUENCH_ERR: { code: 30512, simStr: '该装备不能再淬火或材料不足' },
|
||||
EQUIP_REFINE_ERR: { code: 30512, simStr: '该装备等级不足或材料不足' },
|
||||
//全局养成30600-30699
|
||||
ROLE_REACH_MAX_TITLE_LEVEL: { code: 30600, simStr: '玩家已达到最高的爵位' },
|
||||
ROLE_TERAPH_NOT_STRENGTHEN: { code: 30601, simStr: '玩家神像不能强化' },
|
||||
|
||||
@@ -62,7 +62,7 @@ function getInitialEplace() {
|
||||
p.id = i;
|
||||
p.equip = null;
|
||||
p.lv = 0;
|
||||
p.refineLv = 0;
|
||||
p.refineLv = 1;
|
||||
|
||||
ePlace.push(p);
|
||||
}
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import { readFileAndParse, parseGoodStr } from '../util'
|
||||
import { readFileAndParse } from '../util'
|
||||
import { FILENAME } from '../../consts'
|
||||
|
||||
export interface DicQuenchQuality {
|
||||
|
||||
@@ -9,13 +9,14 @@ export interface DicRefine {
|
||||
readonly id: number;
|
||||
// 精炼等级
|
||||
readonly level: number;
|
||||
// 精炼次数
|
||||
readonly count: number;
|
||||
// 等级限制
|
||||
readonly levelLimited: number;
|
||||
// 提高属性百分比
|
||||
readonly upPercent: number;
|
||||
// 材料
|
||||
readonly material: Array<RewardInter>;
|
||||
// 成功率
|
||||
readonly successRate: number;
|
||||
|
||||
readonly consume: Array<RewardInter>;
|
||||
}
|
||||
|
||||
export const dicRefine = new Map<number, DicRefine>();
|
||||
@@ -24,8 +25,8 @@ export function loadRefine() {
|
||||
let arr = readFileAndParse(FILENAME.DIC_REFINE);
|
||||
|
||||
arr.forEach(o => {
|
||||
o.material = parseGoodStr(o.material)
|
||||
dicRefine.set(o.level, o);
|
||||
o.consume = parseGoodStr(o.consume)
|
||||
dicRefine.set(o.id, o);
|
||||
});
|
||||
|
||||
arr = undefined;
|
||||
|
||||
@@ -5,7 +5,7 @@ import { ItemModel } from '../db/Item';
|
||||
import { EquipModel, RandSe, Holes, RandMain } from './../db/Equip';
|
||||
import { BagInter, EquipInter } from './interface';
|
||||
import { gameData, getQuenchByQualityAndGrade, getQuenchGradeByValue } from './data';
|
||||
import { RANDOM_SE_COUNT, FIX_ATTRIBUTES_RAN, ITID, CURRENCY_BY_TYPE, CURRENCY_TYPE, ROLE_SELECT, FIGURE_UNLOCK_CONDITION, CONSUME_TYPE, HERO_SYSTEM_TYPE, TASK_TYPE } from '../consts';
|
||||
import { RANDOM_SE_COUNT, ITID, CURRENCY_BY_TYPE, CURRENCY_TYPE, ROLE_SELECT, FIGURE_UNLOCK_CONDITION, CONSUME_TYPE, HERO_SYSTEM_TYPE, TASK_TYPE } from '../consts';
|
||||
import { getRandValueByMinMax, getRandEelm } from './util';
|
||||
|
||||
import { findWhere } from 'underscore';
|
||||
|
||||
Reference in New Issue
Block a user