Merge branch 'feature/gacha'

This commit is contained in:
luying
2021-07-02 11:55:27 +08:00
11 changed files with 311 additions and 183 deletions

View File

@@ -105,7 +105,7 @@ export const DAILY_CONST = {
export const DUNGEON_CONST = {
REFRESH_TIME: 5, // 每天加点刷新
MAX_CNT: 10, // 最大挑战次数
MAX_CNT: 100, // 最大挑战次数
MAX_BUY_CNT: 10 // 最大购买次数
}

View File

@@ -644,9 +644,9 @@ export enum GACHA_ID {
// 抽卡保底类型
export enum GACHA_FLOOR_TYPE {
PURPLE = 1, // 元宝招募,保底紫色
GOLD = 2, // 元宝招募,保底金色
ASSIGN = 3, // 求贤若渴,保底指定武将
PURPLE = 1, // 紫色保底10连必定会出一个紫的单抽不算
GOLD = 2, // 金色武将保底,按次数给保底,抽到就重新计算次数,单抽也算
ASSIGN = 3, // 求贤若渴,和活动抽卡金色保底伪随机n次内给且只给一个单抽也算
}
// 抽卡对应保底类型

View File

@@ -2,12 +2,16 @@ import BaseModel from './BaseModel';
import { index, getModelForClass, prop, DocumentType } from '@typegoose/typegoose';
export class Record {
@prop({ required: true })
hid: number; // 选中的武将id
@prop({ required: true })
count: number; // 次数
@prop({ required: true })
reward: string; // 奖励内容
@prop({ required: true })
time: Date; // 抽卡时间
@prop({ required: true })
hasGetFloor: boolean; // 是否抽到保底了
}
/**
@@ -23,44 +27,38 @@ export default class Activity_New_Hero_Gacha extends BaseModel {
@prop({ required: true })
roleId: string; // 用户Id
@prop({ required: true })
selected: boolean; // 是否选中默认false
@prop({ required: true })
hid: number; // 武将id
selectedHid: number; // 玩家选中的武将id
@prop({ required: true })
count: number; // 抽卡次数,抽中大奖后重新统计
@prop({ required: true })
records: Record[]; // 抽卡历史记录
@prop({ required: true })
hasGetFloor: boolean; // 是否抽到保底了
//重置统计次数
public static async resetCount(serverId: number, activityId: number, roleId: string, hid: number, count: number) {
let result: ActivityNewHeroGachaModelType = await ActivityNewHeroGachaModel.findOneAndUpdate({ serverId, roleId, activityId, hid },
public static async resetCount(serverId: number, activityId: number, roleId: string, count: number) {
let result: ActivityNewHeroGachaModelType = await ActivityNewHeroGachaModel.findOneAndUpdate({ serverId, roleId, activityId, },
{ $set: { count } }, { upsert: true, new: true }).lean(true);
return result;
}
//抽卡记录
public static async addRecord(serverId: number, activityId: number, roleId: string, hid: number, count: number, reward: string) {
let result: ActivityNewHeroGachaModelType = await ActivityNewHeroGachaModel.findOneAndUpdate({ serverId, roleId, activityId, hid },
{ $inc: { count }, $push: { records: { count, reward, time: new Date() } } }, { upsert: true, new: true }).lean(true);
public static async addRecord(serverId: number, activityId: number, roleId: string, hid: number, count: number, reward: string, hasGetFloor: boolean) {
let result: ActivityNewHeroGachaModelType = await ActivityNewHeroGachaModel.findOneAndUpdate({ serverId, roleId, activityId },
{ $set: { count, hasGetFloor }, $push: { records: { hid, count, reward, time: new Date(), hasGetFloor } } }, { upsert: true, new: true }).lean(true);
return result;
}
//设置选中武将
public static async selectedHero(serverId: number, activityId: number, roleId: string, hid: number, selected: boolean) {
let result: ActivityNewHeroGachaModelType[] = await ActivityNewHeroGachaModel.findOneAndUpdate(
{ serverId, roleId, activityId, hid }, { $set: { selected } }, { upsert: true, new: true }).lean(true);
return result;
}
//根据活动id查询活动数据
public static async findDataByHid(serverId: number, activityId: number, roleId: string, hid: number) {
let result: ActivityNewHeroGachaModelType = await ActivityNewHeroGachaModel.findOne({ serverId, roleId, activityId, hid }).lean(true);
public static async selectedHero(serverId: number, activityId: number, roleId: string, selectedHid: number) {
let result: ActivityNewHeroGachaModelType = await ActivityNewHeroGachaModel.findOneAndUpdate(
{ serverId, roleId, activityId }, { $set: { selectedHid } }, { upsert: true, new: true }).lean(true);
return result;
}
//根据活动id查询活动数据
public static async findData(serverId: number, activityId: number, roleId: string) {
let result: ActivityNewHeroGachaModelType[] = await ActivityNewHeroGachaModel.find({ serverId, roleId, activityId }).lean(true);
let result: ActivityNewHeroGachaModelType = await ActivityNewHeroGachaModel.findOne({ serverId, roleId, activityId }).lean(true);
return result;
}

View File

@@ -8,6 +8,8 @@ class Floor {
id: number; // 保底类型 1-紫将保底 2-金将保底 3-指定将保底
@prop({ required: true })
count: number; // 抽卡次数
@prop({ required: true })
hasGetFloor: boolean; // 是否抽到保底了
}
/**

View File

@@ -4,7 +4,7 @@ import { prop } from '@typegoose/typegoose';
import { UserGachaType } from '../../db/UserGacha';
import { getTimeFun } from '../../pubUtils/timeUtil';
import { DicGacha } from '../../pubUtils/dictionary/DicGacha';
import { GACHA_OCCUPY_HID } from '../../consts';
import { GACHA_OCCUPY_HID, GACHA_ID } from '../../consts';
import { gameData } from '../../pubUtils/data';
import { getFloorStatus } from '../../pubUtils/util';

View File

@@ -10,6 +10,7 @@ export class NewHeroGachaItem {
selected: boolean = false;//选中武将
floorCount: number = 0;//保底最大的次数,一定会出现一次
count: number = 0;//多少次没有抽中
hasGetFloor: boolean = false; // 是否有抽到保底,伪随机算法,抽到后未到保底次数强制不给
hid: number = 0;//武将id
name: string = '';//名字
cost: RewardInter[];//每次抽卡消耗资源
@@ -51,13 +52,14 @@ export class NewHeroGachaData extends ActivityBase {
}
//解析玩家记录
public setPlayerRecords(data: ActivityNewHeroGachaModelType[]) {
public setPlayerRecords(data: ActivityNewHeroGachaModelType) {
if (!data) {
return;
}
for (let item of this.list) {
let index = data.findIndex(obj => { return obj.hid == item.hid });
if (index != -1) {
item.count = data[index].count ? data[index].count : 0;
item.selected = data[index].selected ? data[index].selected : false;
}
item.count = data.count ? data.count : 0;
item.hasGetFloor = data.hasGetFloor||false;
item.selected = (data && data.selectedHid == item.hid);
}
}

View File

@@ -13,6 +13,8 @@ export interface DicGacha {
readonly cost: RewardInter[];
// 概率
readonly percent: { id: number, weight: number }[];
// 哪一个是大奖
readonly floorReward: number;
}
export const dicGacha = new Map<number, DicGacha>(); // id => dic