装备:精炼

This commit is contained in:
luying
2021-07-29 18:01:36 +08:00
parent 365f89acfa
commit 3c4f45bcd0
10 changed files with 71 additions and 79 deletions

View File

@@ -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);

View File

@@ -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";

View File

@@ -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;
}

View File

@@ -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 = {

View File

@@ -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, // 精炼一级
}

View File

@@ -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: '玩家神像不能强化' },

View File

@@ -62,7 +62,7 @@ function getInitialEplace() {
p.id = i;
p.equip = null;
p.lv = 0;
p.refineLv = 0;
p.refineLv = 1;
ePlace.push(p);
}

View File

@@ -1,4 +1,4 @@
import { readFileAndParse, parseGoodStr } from '../util'
import { readFileAndParse } from '../util'
import { FILENAME } from '../../consts'
export interface DicQuenchQuality {

View File

@@ -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;

View File

@@ -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';