diff --git a/game-server/app/resource b/game-server/app/resource new file mode 120000 index 000000000..773d17ffb --- /dev/null +++ b/game-server/app/resource @@ -0,0 +1 @@ +../../shared/resource \ No newline at end of file diff --git a/game-server/app/servers/battle/handler/normalBattleHandler.ts b/game-server/app/servers/battle/handler/normalBattleHandler.ts index 84788617c..f3a9721b3 100644 --- a/game-server/app/servers/battle/handler/normalBattleHandler.ts +++ b/game-server/app/servers/battle/handler/normalBattleHandler.ts @@ -1,9 +1,10 @@ import { Application, BackendSession } from 'pinus'; -import { BattleRecordModel } from '../../../../../shared/db/BattleRecord'; +import { BattleRecordModel } from '../../../db/BattleRecord'; import { getWarById, getGoodById } from '../../../util/gamedata'; -import { CounterModel } from '../../../../../shared/db/Counter'; -import { HeroModel } from '../../../../../shared/db/Hero'; -import { EquipModel } from '../../../../../shared/db/Equip'; +import { CounterModel } from '../../../db/Counter'; +import { HeroModel } from '../../../db/Hero'; +import { EquipModel } from '../../../db/Equip'; +import { genCode } from '../../../util/util'; export default function(app: Application) { return new NormalBattleHandler(app); @@ -13,9 +14,9 @@ export class NormalBattleHandler { constructor(private app: Application) { } - // 进入关卡前,设置status=0 - async checkBattle(msg: {battleId: number}, session: BackendSession) { - const { battleId } = msg; + // 进入关卡前,记录信息,生成唯一标识 + async checkBattle(msg: {battleId: number, heroes: Array }, session: BackendSession) { + const { battleId, heroes } = msg; let roleId = session.get('roleId'); let roleName = session.get('roleName'); let warInfo = getWarById(battleId); @@ -26,40 +27,54 @@ export class NormalBattleHandler { } } - const BattleRecord = await BattleRecordModel.updateBattleRecordByRole(roleId, battleId, { + const battleCode = genCode(8); + const BattleRecord = await BattleRecordModel.updateBattleRecordByCode(battleCode, { $set: { + roleId, roleName, + battleId, status: 0, warName: warInfo.gk_name, - warType: warInfo.war_type - }, - $inc: { - count: 1 + warType: warInfo.war_type, + record: { heroes } } - }); + }, true); + + let {status} = BattleRecord; - let { count, status} = BattleRecord; return { code: 200, data: { - battleId, count, status + battleId, battleCode, status } } } // 关卡结算,记录使用的武将,获得奖励 - async battleEnd(msg: {battleId: number, isSuccess: boolean, heroes: Array, }, session: BackendSession) { + async battleEnd(msg: {battleCode: string, battleId: number, isSuccess: boolean, heroes: Array, }, session: BackendSession) { - const { battleId, isSuccess, heroes } = msg; + const { battleCode, battleId, isSuccess, heroes } = msg; let roleId = session.get('roleId'); let roleName = session.get('roleName'); let warInfo = getWarById(battleId); - const BattleRecord = await BattleRecordModel.getBattleRecordByRole(roleId, battleId); + const BattleRecord = await BattleRecordModel.getBattleRecordByCode(battleCode, true); if(!BattleRecord || BattleRecord.status != 0) { return { code: 202, - data: '关卡状态错误,未开启挑战' + data: '关卡状态错误' + } + } + + let flag = 1; // 对比hero信息 + let { record: { heroes: dbHeroes } } = BattleRecord; + for(let hid of heroes) { + if(dbHeroes.indexOf(hid) == -1) flag = 0; + } + if(!flag) { + return { + code: 202, + data: '关卡信息不同' } } @@ -69,9 +84,6 @@ export class NormalBattleHandler { $set: { status: 1, record: { heroes } - }, - $inc: { - successCount: 1 } } reward = await this.handleReward(roleId, roleName, warInfo.reward); @@ -80,21 +92,18 @@ export class NormalBattleHandler { $set: { status: 2, record: { heroes } - }, - $inc: { - failCount: 1 } } reward = []; } - const result = await BattleRecordModel.updateBattleRecordByRole(roleId, battleId, params); - let {count, status} = result; + const updateResult = await BattleRecordModel.updateBattleRecordByCode(battleCode, params, true); + let { status } = updateResult; return { code: 200, data: { - battleId, count, status, + battleCode, battleId, status, goods: reward } } diff --git a/game-server/app/util/gamedata.ts b/game-server/app/util/gamedata.ts index 1cd7597e7..86e933ceb 100644 --- a/game-server/app/util/gamedata.ts +++ b/game-server/app/util/gamedata.ts @@ -4,7 +4,7 @@ const path = require('path'); var gamedata = {}; function initData () { - fs.readdirSync(__dirname + '/../../config/resource') + fs.readdirSync(__dirname + '/../resource') .filter(function(file) { return (file.indexOf(".") !== 0) && (file !== "index.js"); }) @@ -13,7 +13,7 @@ function initData () { var name = file.split('.')[0]; try { gamedata[name] = JSON.parse( - fs.readFileSync(path.resolve(__dirname, "../../config/resource/" + file)) + fs.readFileSync(path.resolve(__dirname, "../resource/" + file)) ); } catch(e) { console.error('【文件缺少】:' + file); diff --git a/game-server/app/util/util.ts b/game-server/app/util/util.ts new file mode 100644 index 000000000..db0241daa --- /dev/null +++ b/game-server/app/util/util.ts @@ -0,0 +1,10 @@ + + export function genCode(len) { + const chars = '123456789ABCDEFGHJKLMNPQRSTWXYZabcdefghijklmnopqrstuvwxyz'; + const charArr = chars.split(''); + let code = ''; + for (let i = 0; i < len; i++) { + code += charArr[Math.floor(Math.random() * charArr.length)]; + } + return code; + } \ No newline at end of file diff --git a/game-server/tsconfig.json b/game-server/tsconfig.json index b9eac9b6d..a4f8b540c 100644 --- a/game-server/tsconfig.json +++ b/game-server/tsconfig.json @@ -7,6 +7,7 @@ ], "module": "commonjs", //指定生成哪个模块系统代码 "target": "es2017", + "resolveJsonModule": true, "lib": [ "es2015", "es2016", @@ -24,6 +25,7 @@ "watch":false //在监视模式下运行编译器。会监视输出文件,在它们改变时重新编译。 }, "include":[ + "./app/**/*.json", "./app/**/*.ts", "./config/**/*.ts", "./app.ts", diff --git a/shared/db/BattleRecord.ts b/shared/db/BattleRecord.ts index fd95f094a..2ff819387 100644 --- a/shared/db/BattleRecord.ts +++ b/shared/db/BattleRecord.ts @@ -15,28 +15,28 @@ export default class BattleRecord extends BaseModel { @prop({ required: true }) roleName: string; // 角色名称 + @prop({ required: true }) + battleCode: string; // 关卡记录唯一标识 @prop({ required: true }) battleId: number; // 关卡 id @prop({ required: true }) status: number; // 关卡状态 0-挑战中 1-挑战成功 2-挑战失败 @prop({ required: true }) - count: number; // 挑战次数 - @prop({ required: true }) - successCount: number; // 成功次数 - @prop({ required: true }) - failCount: number; // 失败次数 - @prop({ required: true }) - record: object; // 失败次数 + record: { // 使用的武将等记录 + heroes: Array ; // 武将id + }; - public static async updateBattleRecordByRole( roleId: string, battleId: number, params: object, lean = true) { - const result = await BattleRecordModel.findOneAndUpdate({roleId, battleId}, params, {new: true, upsert: true}).lean(lean); + + public static async getBattleRecordByCode(battleCode: string, lean = true) { + const result = await BattleRecordModel.findOne({ battleCode }).lean(lean); return result; } - public static async getBattleRecordByRole(roleId: string, battleId: number, lean = true) { - const result = await BattleRecordModel.findOne({roleId, battleId}).lean(lean); + public static async updateBattleRecordByCode( battleCode: string, params: object, lean = true) { + const result = await BattleRecordModel.findOneAndUpdate({ battleCode }, params, {new: true, upsert: true}).lean(lean); return result; } + } export const BattleRecordModel = getModelForClass(BattleRecord); diff --git a/game-server/config/resource/dic_zyz_gk.json b/shared/resource/dic_zyz_gk.json similarity index 100% rename from game-server/config/resource/dic_zyz_gk.json rename to shared/resource/dic_zyz_gk.json diff --git a/game-server/config/resource/goods.json b/shared/resource/goods.json similarity index 100% rename from game-server/config/resource/goods.json rename to shared/resource/goods.json