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