diff --git a/gm-server/app/controller/users.ts b/gm-server/app/controller/users.ts index 9470353c4..9fc8fa370 100644 --- a/gm-server/app/controller/users.ts +++ b/gm-server/app/controller/users.ts @@ -41,7 +41,7 @@ export default class UserController extends Controller { public async createRoleData() { const { ctx } = this; - const { hid, hlv, eid, ecount, itemid, itemcount, count, lv, skinid, selectedRowKeys: uids, optType, ehid } = ctx.request.body; + const { hid, hlv, eid, ecount, itemid, itemcount, count, lv, skinid, selectedRowKeys: uids, optType, ehid, war } = ctx.request.body; if(optType == 'hero') { ctx.body = await ctx.service.users.createHero(uids, hid, hlv); } else if(optType == 'equip') { @@ -56,6 +56,8 @@ export default class UserController extends Controller { ctx.body = await ctx.service.users.levelUp(uids, lv); } else if (optType == 'skin') { ctx.body = await ctx.service.users.addSkin(uids, skinid); + } else if (optType == 'war') { + ctx.body = await ctx.service.users.setWarRecord(uids, war); } else { ctx.body = ctx.service.utils.resResult(STATUS.WRONG_PARMS); } diff --git a/gm-server/app/service/users.ts b/gm-server/app/service/users.ts index c724de431..4f08889af 100644 --- a/gm-server/app/service/users.ts +++ b/gm-server/app/service/users.ts @@ -100,6 +100,7 @@ import { UserTaskModel } from '@db/UserTask'; import { UserTaskHistoryModel } from '@db/UserTaskHistory'; import { UserTaskRecModel } from '@db/UserTaskRec'; import { WishPoolReportModel } from '@db/WishPoolReport'; +import { DicWar } from '@pubUtils/dictionary/DicWar'; // import { resResult } from '@pubUtils/util'; @@ -949,4 +950,59 @@ export default class GMUsers extends Service { return Buffer.from(codes.join('\n')); } + + public async setWarRecord(roleIds: string[], _warId: string) { + const { ctx } = this; + let warId = parseInt(_warId); + if(warId < 104) return ctx.service.utils.resResult(STATUS.WRONG_PARMS, null, '不可跳到序章以前') + let dicWar = gameData.war.get(warId); + if(!dicWar) return ctx.service.utils.resResult(STATUS.WRONG_PARMS); + + for(let roleId of roleIds) { + await this.setSingleWarRecord(roleId, dicWar); + } + return ctx.service.utils.resResult(STATUS.SUCCESS); + } + + private async setSingleWarRecord(roleId: string, dicWar: DicWar) { + let { warStar } = await RoleModel.findByRoleId(roleId); + let deleteIds: number[] = [], myMaxWarId = 0, insertParams: DicWar[] = []; + for(let i = 0; i < warStar.length; i++) { + let { id, warType } = warStar[i]; + if(warType == dicWar.warType) { + if(id >= dicWar.war_id) { + deleteIds.push(id); + } + if(id > myMaxWarId) { + myMaxWarId = id; + } + } + } + let newWarStar = warStar.filter(cur => { + return deleteIds.indexOf(cur.id) == -1; + }); + if(myMaxWarId < dicWar.war_id) { + for(let id = myMaxWarId + 1; id < dicWar.war_id; id++) { + let _dicWar = gameData.war.get(id) + if(_dicWar && _dicWar.warType == dicWar.warType) { + newWarStar.push({ id, warType: _dicWar.warType, star: 0 }); + insertParams.push(_dicWar); + } + } + } + let preGkIndex = newWarStar.findIndex(cur => cur.id == dicWar.previousGk); + console.log(dicWar.previousGk) + if(dicWar.previousGk && preGkIndex == -1) { + let _dicWar = gameData.war.get(dicWar.previousGk); + newWarStar.push({ id: _dicWar.war_id, warType: _dicWar.warType, star: 3 }); + } + if(insertParams.length > 0) { + await RScriptRecordModel.insertScripts(roleId, insertParams); + } + if(deleteIds.length > 0) { + await RScriptRecordModel.deleteByWarId(roleId, deleteIds); + } + let role = await RoleModel.updateRoleInfo(roleId, { warStar: newWarStar }); + return role; + } } diff --git a/shared/db/RScriptRecord.ts b/shared/db/RScriptRecord.ts index 75274a2a9..9d4f9fcb9 100644 --- a/shared/db/RScriptRecord.ts +++ b/shared/db/RScriptRecord.ts @@ -1,7 +1,6 @@ import BaseModel from './BaseModel'; import { index, getModelForClass, prop, DocumentType } from '@typegoose/typegoose'; - - +import { DicWar } from '../pubUtils/dictionary/DicWar' @index({ roleId: 1, battleId: 1 }) export default class RScriptRecord extends BaseModel { @@ -13,10 +12,10 @@ export default class RScriptRecord extends BaseModel { @prop({ required: true, default: 0 }) warType: number; // 关卡 id - @prop({ required: true, default: '' }) + @prop({ required: false, default: '' }) scriptBefore: string; // 战场前剧本 - @prop({ required: true, default: '' }) + @prop({ required: false, default: '' }) scriptAfter: string; // 战场后剧本 @@ -41,6 +40,22 @@ export default class RScriptRecord extends BaseModel { const items: RScriptRecordType[] = await RScriptRecordModel.find({ roleId, warType }).select('battleId scriptBefore scriptAfter').lean(lean); return items; } + + public static async deleteByWarId(roleId: string, battleId: number[]) { + return await RScriptRecordModel.deleteMany({ roleId, battleId: { $in: battleId } }); + } + + public static async insertScripts(roleId: string, dicWars: DicWar[]) { + let insertParams = dicWars.map(dicWar => { + let doc = new RScriptRecordModel(); + let param = { ...doc.toJSON(), roleId, battleId: dicWar.war_id, warType: dicWar.warType } + if(dicWar.scriptBefore) param.scriptBefore = dicWar.scriptBefore; + if(dicWar.scriptAfter) param.scriptAfter = dicWar.scriptAfter; + return param; + }); + console.log('&&&&', insertParams) + return await RScriptRecordModel.insertMany(insertParams); + } } export const RScriptRecordModel = getModelForClass(RScriptRecord); diff --git a/shared/db/Role.ts b/shared/db/Role.ts index a5b23aff1..1dab9ddb7 100644 --- a/shared/db/Role.ts +++ b/shared/db/Role.ts @@ -720,6 +720,7 @@ export default class Role extends BaseModel { const role: RoleType = await RoleModel.findOneAndUpdate({ roleId }, { $inc: { totalPay: price } }, { new: true }).lean(); return role; } + } export const RoleModel = getModelForClass(Role); diff --git a/shared/pubUtils/dictionary/DicWar.ts b/shared/pubUtils/dictionary/DicWar.ts index 5b7127a5f..84ccbf196 100644 --- a/shared/pubUtils/dictionary/DicWar.ts +++ b/shared/pubUtils/dictionary/DicWar.ts @@ -1,7 +1,7 @@ // 关卡表 import {decodeArrayListStr, decodeArrayStr, parseNumberList, readFileAndParse} from '../util' import { WAR_RELATE_TABLES, WAR_TYPE } from '../../consts'; - +import { isString } from 'underscore' export interface DicWar { // 关卡id @@ -40,6 +40,10 @@ export interface DicWar { readonly mapseid: number[]; // 秘境类型 readonly movePoint: number; + // 战前剧本 + readonly scriptBefore: string; + // 战后剧本 + readonly scriptAfter: string; } export const dicWar = new Map(); @@ -60,6 +64,16 @@ export function loadWar() { o.teammateReward = parseFixReward(o.teammateReward); o.fobiddenCharactor = parseForbiddenChara(o.fobiddenCharactor); o.mapseid = parseNumberList(o.mapseid); + if(o.script_id && isString(o.script_id)) { + let scripts = o.script_id?.split('&')||[]; + for(let script of scripts) { + if(script.indexOf('R_') != -1) { + o.scriptBefore = script; + } else if (script.indexOf('RE_') != -1) { + o.scriptAfter = script; + } + } + } dicWar.set(o.war_id, o); if(o.warType == WAR_TYPE.PVP) {