diff --git a/game-server/app/servers/activity/handler/gachaHandler.ts b/game-server/app/servers/activity/handler/gachaHandler.ts index 45b56039c..818b97283 100644 --- a/game-server/app/servers/activity/handler/gachaHandler.ts +++ b/game-server/app/servers/activity/handler/gachaHandler.ts @@ -119,10 +119,9 @@ export class GachaHandler { const roleId: string = session.get('roleId'); for (let { hid } of hope) { - let dicHero = gameData.hero.get(hid); if (hid != 0) { - if (!dicHero) return resResult(STATUS.DIC_DATA_NOT_FOUND); - if (hid != 0 && dicHero.quality != HERO_QUALITY_TYPE.GOLD) { + let dicRecruit = gameData.recruit.get(hid); + if (!dicRecruit || !dicRecruit.canHope) { return resResult(STATUS.GACHA_HOPE_NOT_GOLD); } } @@ -274,8 +273,8 @@ export class GachaHandler { let dicHero = gameData.hero.get(hid); if (!dicHero) return resResult(STATUS.DIC_DATA_NOT_FOUND); - let index = gameData.recruit.findIndex(cur => cur.actorId == hid); - if (index == -1) return resResult(STATUS.GACHA_CAN_NOT_PICK); + let dicRecruit = gameData.recruit.get(hid); + if (!dicRecruit || !dicRecruit.canVisit) return resResult(STATUS.GACHA_CAN_NOT_PICK); let { pieceId } = dicHero; let gachaId = getNormalGachaId(); diff --git a/game-server/app/servers/role/handler/heroHandler.ts b/game-server/app/servers/role/handler/heroHandler.ts index ea8d7d670..1fb161123 100644 --- a/game-server/app/servers/role/handler/heroHandler.ts +++ b/game-server/app/servers/role/handler/heroHandler.ts @@ -52,7 +52,7 @@ export class HeroHandler { // 根据dic_hero 获得 1. 碎片id 2. 碎片数量 3. 初始武将星级 4. 初始品质 let dicHero = gameData.hero.get(hid); if (!dicHero) return resResult(STATUS.DIC_DATA_NOT_FOUND); - let { pieceId, quality, pieceCount } = dicHero; + let { pieceId, pieceCount } = dicHero; // 碎片数量是否足够 let costResult = await handleCost(roleId, sid, [{ id: pieceId, count: pieceCount }], ITEM_CHANGE_REASON.COMPOSE_HERO); if (!costResult) return resResult(STATUS.ROLE_MATERIAL_NOT_ENOUGH); @@ -587,7 +587,7 @@ export class HeroHandler { let dicJob = getJobByGradeAndClass(dicHero.jobClass, 0); let newSkins = initSkinTalent(skins); - let dicHeroScroll = getScollByStar(dicHero.quality, dicHero.initialStars, dicHero.quality, 0); + let dicHeroScroll = getScollByStar(dicHero.quality, dicHero.initialStar, dicHero.quality, dicHero.initialColorStar); let initInfo = HeroModel.getInitInfo(hid, { job: dicJob.jobid, skins: newSkins, skinId, ce, scrollActive: scrollActive, @@ -741,7 +741,7 @@ export class HeroHandler { await RoleModel.updateRoleInfo(roleId, { jewelCount: 0 }); let heroInfos = []; - for(let { actorId } of gameData.recruit) { + for(let [actorId] of gameData.recruit) { let dicHero = gameData.hero.get(actorId); if(!dicHero) continue; let { jobid, grade } = gameData.jobClassMaxGrades.get(dicHero.jobClass); diff --git a/game-server/app/servers/role/handler/roleHandler.ts b/game-server/app/servers/role/handler/roleHandler.ts index de00436e1..8c5e222a6 100644 --- a/game-server/app/servers/role/handler/roleHandler.ts +++ b/game-server/app/servers/role/handler/roleHandler.ts @@ -302,9 +302,9 @@ export class RoleHandler { }; if (!scrollActive) { // 初次激活 update.scrollActive = true; - update.scrollStar = dicHero.initialStars; + update.scrollStar = dicHero.initialStar; update.scrollQuality = dicHero.quality; - update.scrollColorStar = 0; + update.scrollColorStar = dicHero.initialColorStar; } else { if (star > scrollStar) { // 可以升星 update.scrollStar++; diff --git a/game-server/app/services/activity/gachaService.ts b/game-server/app/services/activity/gachaService.ts index 7d128e6ee..146c15d74 100644 --- a/game-server/app/services/activity/gachaService.ts +++ b/game-server/app/services/activity/gachaService.ts @@ -483,7 +483,7 @@ export class GachaPull { export function getAllHeroByQuality(quality: number) { let allHero: number[] = []; let allQuality: number[] = []; - for (let { actorId } of gameData.recruit) { + for (let [actorId] of gameData.recruit) { let dicHero = gameData.hero.get(actorId); if (dicHero.quality == quality) { allHero.push(actorId); diff --git a/game-server/app/services/activity/newHeroService.ts b/game-server/app/services/activity/newHeroService.ts index a1019b0e5..c8c62c3af 100644 --- a/game-server/app/services/activity/newHeroService.ts +++ b/game-server/app/services/activity/newHeroService.ts @@ -27,6 +27,9 @@ import { refreshGacha } from './gachaService'; let userGacha: UserGachaType = await UserGachaModel.findByRole(roleId, playerData.gachaId, activityId); let dicGacha = gameData.gacha.get(playerData.gachaId); userGacha = await refreshGacha(dicGacha, userGacha); + if(!userGacha.pickHero) { + userGacha = await UserGachaModel.updateInfo(roleId, playerData.gachaId, activityId, { pickHero: playerData.getDefaultHero() }) + } playerData.setPlayerRecords(userGacha, dicGacha); return playerData; @@ -94,6 +97,15 @@ export async function challengeNewHeroGK(serverId: number, roleId: string, activ * */ export async function newHeroGiftPoint(serverId: number, activityId: number, roleId: string, addPoint: number) { - let result = await ActivityNewHeroGiftModel.addPoint(serverId, activityId, roleId, addPoint); - return result.totalPoint; + let activityData = await getActivityById(activityId); + + let createTime = await getRoleCreateTime(roleId); + let serverTime = await getServerCreateTime(serverId); + let playerData = new NewHeroGiftData(activityData, createTime, serverTime); + + if(playerData.canRecordTaskPoint()) { + let result = await ActivityNewHeroGiftModel.addPoint(serverId, activityId, roleId, addPoint); + return result.totalPoint; + } + return 0 } diff --git a/game-server/app/services/battleService.ts b/game-server/app/services/battleService.ts index 4e91c1c4f..d2d4d85dd 100644 --- a/game-server/app/services/battleService.ts +++ b/game-server/app/services/battleService.ts @@ -621,8 +621,8 @@ export function getRandRobot(cnt = 1, withAttr = false) { heroes.push(new ComRoleStatusHero({ hid: hero.actorId, skinId: hero.actorId, - star: hero.star||dicHero.initialStars, - colorStar: 0, + star: hero.star? hero.star: dicHero.initialStar, + colorStar: hero.star? 0: dicHero.initialColorStar, lv: hero.lv, quality: dicHero.quality })); diff --git a/game-server/app/services/rankService.ts b/game-server/app/services/rankService.ts index 7044ef6f0..72bec08a1 100644 --- a/game-server/app/services/rankService.ts +++ b/game-server/app/services/rankService.ts @@ -1102,7 +1102,7 @@ export async function setRankRedisFromDb(type: string, args?: { serverId?: numbe } else if (type == REDIS_KEY.HERO_RANK) { let serverId = args.serverId; - for (let { actorId: hid } of gameData.recruit) { + for (let [hid] of gameData.recruit) { let ranks = await HeroModel.getRank(hid, serverId, HERO_SELECT.RANK_LINEUP); let r = new Rank(type, { serverId, hid }); r.setIsInit(true); diff --git a/shared/consts/constModules/itemConst.ts b/shared/consts/constModules/itemConst.ts index d4448fdf3..0ea41d6d4 100644 --- a/shared/consts/constModules/itemConst.ts +++ b/shared/consts/constModules/itemConst.ts @@ -235,6 +235,7 @@ export enum HERO_QUALITY_TYPE { BLUE = 1, // 蓝将 PURPLE = 2, // 紫将 GOLD = 3, // 金 + UR = 4, // ur武将 } export const FIX_ATTRIBUTES_RAN = 20; // 固定属性值+-20%随机 diff --git a/shared/consts/statusCode.ts b/shared/consts/statusCode.ts index 3aee439c0..2e6ae89fb 100644 --- a/shared/consts/statusCode.ts +++ b/shared/consts/statusCode.ts @@ -434,7 +434,7 @@ export const STATUS = { // 抽卡相关 31101-31200 GACHA_COST_NOT_ENOUGH: { code: 31101, simStr: '招募券不足' }, GACHA_NOT_ASSIGN: { code: 31102, simStr: '请选择武将' }, - GACHA_HOPE_NOT_GOLD: { code: 31103, simStr: '武将品质错误' }, + GACHA_HOPE_NOT_GOLD: { code: 31103, simStr: '该武将不可许愿' }, GACHA_CAN_NOT_PICK: { code: 31104, simStr: '不可选择该武将' }, GACHA_TURNTABLE_POINT_NOT_ENOUGH: { code: 31105, simStr: '转盘积分不足' }, GACHA_HAS_VISITED: { code: 31106, simStr: '该武将已拜访过' }, diff --git a/shared/db/Hero.ts b/shared/db/Hero.ts index 96cd4939f..7ce718876 100644 --- a/shared/db/Hero.ts +++ b/shared/db/Hero.ts @@ -224,9 +224,9 @@ export default class Hero extends BaseModel { public static getInitInfo(hid: number, heroInfo: HeroUpdate = {}): HeroUpdate { let dicHero = gameData.hero.get(hid) - let { quality, initialStars: star, jobid: job, name: hName } = dicHero; + let { quality, initialStar: star, initialColorStar: colorStar, jobid: job, name: hName } = dicHero; const doc = new HeroModel(); - const update = { ...doc.toJSON(), hid, skinId: hid, hName, star, quality, job, lv: DEFAULT_HERO_LV, exp: getHeroExpByLv(DEFAULT_HERO_LV - 1) || 0, ...heroInfo}; + const update = { ...doc.toJSON(), hid, skinId: hid, hName, star, colorStar, quality, job, lv: DEFAULT_HERO_LV, exp: getHeroExpByLv(DEFAULT_HERO_LV - 1) || 0, ...heroInfo}; delete update._id; return update } diff --git a/shared/domain/activityField/newHeroGKField.ts b/shared/domain/activityField/newHeroGKField.ts index 035903762..9d5f04747 100644 --- a/shared/domain/activityField/newHeroGKField.ts +++ b/shared/domain/activityField/newHeroGKField.ts @@ -6,12 +6,10 @@ import { ActivityBase } from './activityField'; /******* 存在数据库里的数据 *******/ interface NewHeroGkWarInDb { warId: number; // 关卡id - icon: string; // 图标文件名 startDay: number; // 活动第几天开启 } interface NewHeroGkDataInDb { - bg: string; // 背景图 wars: NewHeroGkWarInDb[]; // 关卡 } @@ -19,13 +17,11 @@ interface NewHeroGkDataInDb { // 每日关卡活动数据 export class NewHeroGachaWar { warId: number; // 关卡id - icon: string; // 图标文件名 startTime: number; // 活动第几天开启,13位时间戳 isSuccess: boolean = false; // 是否成功 constructor(data: NewHeroGkWarInDb, beginTime: number) { this.warId = data.warId; - this.icon = data.icon; this.startTime = getTimeFunM(beginTime).getAfterDayWithHour(data.startDay - 1); } @@ -35,7 +31,6 @@ export class NewHeroGachaWar { } export class NewHeroGKData extends ActivityBase { - bg: string; // 背景图 wars: NewHeroGachaWar[] = []; // 关卡 constructor(activityData: ActivityModelType, createTime: number, serverTime: number) { @@ -45,7 +40,6 @@ export class NewHeroGKData extends ActivityBase { public initData(data: string) { let dataObj: NewHeroGkDataInDb = JSON.parse(data); - this.bg = dataObj.bg; let arr = dataObj.wars||[]; for (let obj of arr) { this.wars.push(new NewHeroGachaWar(obj, this.beginTime)) diff --git a/shared/domain/activityField/newHeroGachaField.ts b/shared/domain/activityField/newHeroGachaField.ts index b82441559..cc684a598 100644 --- a/shared/domain/activityField/newHeroGachaField.ts +++ b/shared/domain/activityField/newHeroGachaField.ts @@ -1,33 +1,34 @@ import { ActivityModelType } from '../../db/Activity'; import { UserGachaType } from '../../db/UserGacha'; import { DicGacha } from '../../pubUtils/dictionary/DicGacha'; -import { RewardInter } from '../../pubUtils/interface'; import { ActivityBase } from './activityField'; interface NewHeroGachaItemInDb { hid: number; - position: string; // x&y + isDefault: boolean; } interface NewHeroGachaDataInDb { gachaId: number; // dic_zyz_gacha表的id,卡池的概率,消耗都通过这个表读取 - icon: string; // 大地图的icon图片文件名 heroes: NewHeroGachaItemInDb[]; // 本期活动pick的武将 - bg: string; // 首页背景图片 - uiType: number; // 布局格式,具体什么代表什么含义由策划和客户端定 +} + +class NewHeroGachaItem { + hid: number; + isDefault: boolean; + constructor(hero: NewHeroGachaItemInDb) { + this.hid = hero.hid; + this.isDefault = hero.isDefault; + } } // 每日关卡活动数据 export class NewHeroGachaData extends ActivityBase { gachaId: number; - icon: string; - heroes: NewHeroGachaItemInDb[]; - bg: string; - uiType: number; + heroes: NewHeroGachaItem[] = []; pickHero: number = 0; count: number = 0; isFree: boolean = false; // 免费次数 - cost: RewardInter[] = []; // 消耗 constructor(activityData: ActivityModelType, createTime: number, serverTime: number) { super(activityData, createTime, serverTime) @@ -37,25 +38,30 @@ export class NewHeroGachaData extends ActivityBase { public initData(data: string) { let dataObj: NewHeroGachaDataInDb = JSON.parse(data); this.gachaId = dataObj.gachaId; - this.icon = dataObj.icon; - this.heroes = dataObj.heroes; - this.bg = dataObj.bg; - this.uiType = dataObj.uiType; + let heroes = dataObj.heroes||[]; + for(let hero of heroes) { + this.heroes.push(new NewHeroGachaItem(hero)) + } } public findItem(hid: number) { return this.heroes.find(obj => { return obj && obj.hid == hid }) } + public getDefaultHero() { + let hero = this.heroes.find(obj => obj.isDefault)||this.heroes[0]; + return hero?.hid||0; + } + //解析玩家记录 public setPlayerRecords(data: UserGachaType, dic: DicGacha) { - if(dic) this.cost = dic.cost; if (data) { this.pickHero = data.pickHero; this.count = data.count; this.isFree = data.freeCount < dic?.free.count; } } + public isPickHero(hid: number) { return this.heroes.findIndex(cur => cur.hid == hid) != -1; diff --git a/shared/domain/activityField/newHeroGiftField.ts b/shared/domain/activityField/newHeroGiftField.ts index cc8f28c13..90b65fc07 100644 --- a/shared/domain/activityField/newHeroGiftField.ts +++ b/shared/domain/activityField/newHeroGiftField.ts @@ -1,24 +1,17 @@ +import moment = require('moment'); import { ActivityModelType } from '../../db/Activity'; import { ActivityNewHeroGiftModelType } from '../../db/ActivityNewHeroGift'; import { ActivityBase } from './activityField'; /******* 存在数据库里的数据 *******/ -interface NewHeroGiftExplain { - index: number; - explain: string; -} - interface NewHeroGiftRewardInDb { index: number; // 下标 - cover: string; // 翻牌背面的图片文件名 reward: string; // 奖励 type&id&count countMax: number; // 最多抽出次数 } interface NewHeroGiftDataInDb { - hid: number; // 左侧的立绘武将 - position: string; // 位置 x&y - explain: NewHeroGiftExplain[]; // 玩法说明 + startTaskTime: string; // 开始计算任务积分的时间 hh:mm:ss rewards: NewHeroGiftRewardInDb[]; // 奖励 consumePoint: number; // 每转一次消耗的点数 } @@ -26,14 +19,12 @@ interface NewHeroGiftDataInDb { /******* 返回给客户端的数据 *******/ class NewHeroGiftReward { index: number; // 下标 - cover: string; // 翻牌背面的图片文件名 reward: string; // 奖励 type&id&count countMax: number; // 最多抽出次数 buyCount: number = 0; // 转出的次数 constructor(data: NewHeroGiftRewardInDb) { this.index = data.index; - this.cover = data.cover; this.reward = data.reward; this.countMax = data.countMax; } @@ -44,11 +35,9 @@ class NewHeroGiftReward { } export class NewHeroGiftData extends ActivityBase { - hid: number; // 左侧的立绘武将 - position: string; // 位置 x&y consumePoint: number; // 每转一次消耗的点数 - explain: NewHeroGiftExplain[]; // 玩法说明 rewards: NewHeroGiftReward[] = []; // 奖励 + startTaskTime: number; // 开始计算任务积分的时间 时间戳 totalPoint: number = 0; // 已获得的点数 consumeTotalPoint: number = 0; // 总消耗的点数 @@ -60,14 +49,12 @@ export class NewHeroGiftData extends ActivityBase { public initData(data: string) { let dataObj: NewHeroGiftDataInDb = JSON.parse(data); - this.hid = dataObj.hid; - this.position = dataObj.position; this.consumePoint = dataObj.consumePoint; - this.explain = dataObj.explain let arr = dataObj.rewards||[]; for (let obj of arr) { this.rewards.push(new NewHeroGiftReward(obj)) } + this.startTaskTime = moment(moment(this.beginTime).format(`YYYY-MM-DD ${dataObj.startTaskTime}`)).valueOf(); } public findItem(index: number) { @@ -88,4 +75,7 @@ export class NewHeroGiftData extends ActivityBase { } } + public canRecordTaskPoint() { + return Date.now() >= this.startTaskTime && Date.now() <= this.endTime + } } \ No newline at end of file diff --git a/shared/domain/dbGeneral.ts b/shared/domain/dbGeneral.ts index 3e67cc4db..7fea42024 100644 --- a/shared/domain/dbGeneral.ts +++ b/shared/domain/dbGeneral.ts @@ -62,13 +62,8 @@ export class PvpHeroInfo { this.actorName = dicHero.name; this.quality = dicHero.quality; this.job = dicHero.jobid; - if(dicHero.quality == 4) { - this.star = 6; - this.colorStar = dicHero.initialStars; - } else { - this.star = dicHero.initialStars; - } - + this.star = dicHero.initialStar; + this.colorStar = dicHero.initialColorStar; this.lv = lv; } diff --git a/shared/pubUtils/dictionary/DicHero.ts b/shared/pubUtils/dictionary/DicHero.ts index 6b81e62b4..82dd2939d 100644 --- a/shared/pubUtils/dictionary/DicHero.ts +++ b/shared/pubUtils/dictionary/DicHero.ts @@ -22,7 +22,9 @@ export interface DicHero { // 武将碎片 readonly pieceId: number; // 初始星级 - readonly initialStars: number; + readonly initialStar: number; + // 初始星级 + readonly initialColorStar: number; // 合成碎片数量 readonly pieceCount: number; // 主属性 @@ -38,7 +40,7 @@ export interface DicHero { } type KeysEnum = { [P in keyof Required]: true }; -const DicHeroKeys: KeysEnum = {heroId: true, name: true, quality: true, camp: true, jobClass: true, jobid: true, skill: true, pieceId: true, initialStars: true, pieceCount: true, baseAbilityArr: true, baseAbilityUpArr: true, initialSkin: true, recruit: true, face_id: true, talentId: true}; +const DicHeroKeys: KeysEnum = {heroId: true, name: true, quality: true, camp: true, jobClass: true, jobid: true, skill: true, pieceId: true, initialStar: true, initialColorStar: true, pieceCount: true, baseAbilityArr: true, baseAbilityUpArr: true, initialSkin: true, recruit: true, face_id: true, talentId: true}; export const dicHero = new Map(); export function loadHero() { dicHero.clear(); @@ -48,6 +50,13 @@ export function loadHero() { o.baseAbilityArr = parseBaseAbilityArr(o); o.baseAbilityUpArr = parseBaseAbilityUpArr(o); o.recruit = parseInt(o.recruit) == 1; + if(o.quality == 4) { + o.initialStar = 6; + o.initialColorStar = o.initialStars - 6; + } else { + o.initialStar = o.initialStars; + o.initialColorStar = 0; + } dicHero.set(o.heroId, _.pick(o, Object.keys(DicHeroKeys))); }); arr = undefined; diff --git a/shared/pubUtils/dictionary/DicRecruit.ts b/shared/pubUtils/dictionary/DicRecruit.ts index 05a0f8f41..4cb2c8a28 100644 --- a/shared/pubUtils/dictionary/DicRecruit.ts +++ b/shared/pubUtils/dictionary/DicRecruit.ts @@ -10,16 +10,20 @@ export interface DicRecruit { readonly actorId: number; // 权重 readonly weight: number; + // 是否可以拜访 + readonly canVisit: number; + // 是否可以许愿 + readonly canHope: number; } -export const dicRecruit = new Array(); +export const dicRecruit = new Map(); export function loadRecruit() { - dicRecruit.splice(0, dicRecruit.length); + dicRecruit.clear(); let arr = readFileAndParse(FILENAME.DIC_RECRUIT); arr.forEach(o => { - dicRecruit.push(o); + dicRecruit.set(o.actorId, o); }); arr = undefined;