feat(活动): 小游戏添加任务

This commit is contained in:
luying
2023-03-28 17:18:34 +08:00
parent f7344aed85
commit c65c339e3a
8 changed files with 75 additions and 15 deletions

View File

@@ -1,6 +1,6 @@
import { Application, BackendSession, HandlerService, } from 'pinus';
import { resResult } from '../../../pubUtils/util';
import { ITEM_CHANGE_REASON, REDIS_KEY, STATUS } from '../../../consts';
import { ITEM_CHANGE_REASON, MINI_GAME_TYPE, REDIS_KEY, STATUS, TASK_TYPE } from '../../../consts';
import { addReward, stringToConsumeParam, stringToRewardParam } from '../../../services/activity/giftPackageService';
import { getPlayerMiniGameData, getPlayerMiniGameDataShow } from '../../../services/activity/miniGameService';
import { ActivityMiniGameRecModel } from '../../../db/ActivityMiniGameRec';
@@ -10,6 +10,7 @@ import { Rank } from '../../../services/rankService';
import { nowSeconds } from '../../../pubUtils/timeUtil';
import { RoleRankInfo } from '../../../domain/rank';
import { getAllServerName } from '../../../services/redisService';
import { checkTask } from '../../../services/task/taskService';
export default function (app: Application) {
new HandlerService(app, {});
@@ -53,8 +54,7 @@ export class ForgeHandler {
if (!playerData) return resResult(STATUS.ACTIVITY_MISSING);
if(playerData.playCnt >= playerData.buyCnt + playerData.freeCnt) return resResult(STATUS.ACTIVITY_MINI_GAME_COUNT_LACK);
let record = await ActivityMiniGameRecModel.gameStart(serverId, activityId, playerData.roundIndex, playerData.todayIndex, roleId);
let record = await ActivityMiniGameRecModel.gameStart(serverId, activityId, playerData.roundIndex, playerData.todayIndex, roleId, playerData.gameType);
return resResult(STATUS.SUCCESS, {
activityId,
@@ -69,8 +69,8 @@ export class ForgeHandler {
* @param {BackendSession} session
* @memberof ForgeHandler
*/
async gameEnd(msg: { activityId: number, gameCode: string, score: number }, session: BackendSession) {
const { activityId, gameCode, score } = msg;
async gameEnd(msg: { activityId: number, gameCode: string, score: number, params: number[] }, session: BackendSession) {
const { activityId, gameCode, score, params } = msg;
const roleId = session.get('roleId');
const roleName = session.get('roleName');
const sid = session.get('sid');
@@ -80,7 +80,7 @@ export class ForgeHandler {
if (!playerData) return resResult(STATUS.ACTIVITY_MISSING);
// 记录得分&次数
let record = await ActivityMiniGameRecModel.gameEnd(activityId, roleId, gameCode, score);
let record = await ActivityMiniGameRecModel.gameEnd(activityId, roleId, gameCode, score, params);
if(!record) return resResult(STATUS.ACTIVITY_MINI_GAME_RECORD_NOT_FOUND);
let playerRecord = await ActivityMiniGameModel.incScore(serverId, activityId, playerData.roundIndex, roleId, score, playerData.nextRefreshTime);
@@ -94,6 +94,9 @@ export class ForgeHandler {
let r = new Rank(REDIS_KEY.ACTIVITY_MINI_GAME, { activityId, roundIndex: playerData.roundIndex });
await r.setRankWithRoleInfo(roleId, score, nowSeconds(), null, true);
if(playerData.gameType == MINI_GAME_TYPE.SHOOT) await checkTask(serverId, roleId, sid, TASK_TYPE.MINI_GAME_SHOOT, { score });
if(playerData.gameType == MINI_GAME_TYPE.ERASE) await checkTask(serverId, roleId, sid, TASK_TYPE.MINI_GAME_ERASE, { step: params[0] });
return resResult(STATUS.SUCCESS, {
activityId,
gameCode,

View File

@@ -1453,6 +1453,22 @@ export class CheckSingleTask {
result = { inc: count };
break;
}
case TASK_TYPE.MINI_GAME_SHOOT: // 135. 单局射箭获得X分
{
let { score } = param;
if(score >= dicTaskParam[0]) {
result = { inc: 1 };
}
break;
}
case TASK_TYPE.MINI_GAME_ERASE: // 136. 单局翻牌不超出X步
{
let { step } = param;
if(step <= dicTaskParam[0]) {
result = { inc: 1 };
}
break;
}
}
return result
}

View File

@@ -260,4 +260,9 @@ export enum BIND_PHONE_STATUS {
WAIT_BIND = 0, // 待绑定
HAS_BIND = 1, // 已绑定待领取
RECEIVED = 2, // 已领取
}
export enum MINI_GAME_TYPE {
ERASE = 1, // 消消乐
SHOOT = 2, // 射箭
}

View File

@@ -853,6 +853,8 @@ export enum TASK_TYPE {
GVG_FARM = 132, // 农庄种植/矿山采集/木堆砍柴
GVG_VESTIGE = 133, // 中原遗迹挑战
GVG_TECH = 134, // 千机阁捐献
MINI_GAME_SHOOT = 135, // 单局射箭获得X分
MINI_GAME_ERASE = 136, // 单局翻牌不超出X步
}
// 任务累积类型

View File

@@ -16,6 +16,9 @@ export default class Activity_MiniGame_Rec extends BaseModel {
@prop({ required: true })
activityId: number; // 活动Id
@prop({ required: true })
gameType: number; // 小游戏类型
@prop({ required: true })
roundIndex: number; // 第几轮
@@ -34,6 +37,9 @@ export default class Activity_MiniGame_Rec extends BaseModel {
@prop({ required: true })
isComplete: boolean; // 是否结束
@prop({ required: true, type: Number, default:[] })
params: number[]; // 是否结束
public static async findRecords(serverId: number, activityId: number, roundIndex: number, roleId: string) {
let result: ActivityMiniGameRecModelType[] = await ActivityMiniGameRecModel.find({ serverId, roleId, activityId, roundIndex, isComplete: true }).lean();
return result;
@@ -44,14 +50,14 @@ export default class Activity_MiniGame_Rec extends BaseModel {
return result;
}
public static async gameStart(serverId: number, activityId: number, roundIndex: number, todayIndex: number, roleId: string) {
public static async gameStart(serverId: number, activityId: number, roundIndex: number, todayIndex: number, roleId: string, gameType: number) {
let gameCode = genCode(10);
let result: ActivityMiniGameRecModelType = await ActivityMiniGameRecModel.findOneAndUpdate({ gameCode }, { $set: { serverId, activityId, roundIndex, todayIndex, roleId, score: 0, isComplete: false } }, { new: true, upsert: true }).lean();
let result: ActivityMiniGameRecModelType = await ActivityMiniGameRecModel.findOneAndUpdate({ gameCode }, { $set: { serverId, activityId, roundIndex, todayIndex, roleId, score: 0, isComplete: false, gameType } }, { new: true, upsert: true }).lean();
return result;
}
public static async gameEnd(activityId: number, roleId: string, gameCode: string, score: number) {
let result: ActivityMiniGameRecModelType = await ActivityMiniGameRecModel.findOneAndUpdate({ activityId, roleId, gameCode, isComplete: false }, { $set: { score, isComplete: true } }, { new: true }).lean();
public static async gameEnd(activityId: number, roleId: string, gameCode: string, score: number, params: number[]) {
let result: ActivityMiniGameRecModelType = await ActivityMiniGameRecModel.findOneAndUpdate({ activityId, roleId, gameCode, isComplete: false }, { $set: { score, isComplete: true, params } }, { new: true }).lean();
return result;
}
}

View File

@@ -61,6 +61,9 @@ export class TaskParamInter {
skipTower?: boolean;
debugInfo?: {condition: number};
score?: number; // 小游戏得分
step?: number; // 步数
};
export class TaskParam extends TaskParamInter {

View File

@@ -345,14 +345,19 @@ export const ACTIVITY = {
LOOPACTIVITYRATIO: 0.9, // 糜家商队循环活动小兵倍率
LOOPACTIVITYRATIO_SZTM: 0.9, // 神州探秘循环活动小兵倍率
ACTIVITY_ZHUMING_CAST_NUMLIMIT: 12, // 朱明集会神兵铸造材料数量总上限
ACTIVITY_FLIPCARD_SCORE: '1&10|33&8|41&7|51&6|57&5', // 翻拍小游戏的得分规则min&socre区间下限至下一档之间的得分
ACTIVITY_ARCHERY_SCORE: '0&1|1&2|2&3|3&3|4&4|5&5|6&6|7&7|8&8|9&9|10&12', // 射箭小游戏中的环数以及对应得分,环数&得分
ACTIVITY_FLIPCARD_SCORE: '1&50|21&30|25&25|29&15', // 翻拍小游戏的得分规则min(含)&socre区间下限至下一档之间的得分
ACTIVITY_ARCHERY_SCORE: '0&0|1&1|2&1|3&1|4&1|5&1|6&1|7&2|8&3|9&4|10&5', // 射箭小游戏中的环数以及对应得分,环数(含)&得分
ACTIVITY_EATTING_RICEDUMPLING_SPINE_POINT: '30&0&-5|80&1&-6|100&2&-7', // 进度阶段上限&额外加分&该阶段每0.1s进度条减少进度
ACTIVITY_EATTING_RICEDUMPLING_TOTALCOUNT: 12, // 一个粽子图片=点击X下
ACTIVITY_EATTING_RICEDUMPLING_COUNTDOWN: 20, // 张飞吃粽子游戏倒计时(秒)
ACTIVITY_EATTING_RICEDUMPLING_PROGRESS_SPEED: 15, // 点击1下进度条增加进度
ACTIVITY_EATTING_RICEDUMPLING_PROGRESS_KEYPOINT: '30&80', // 张飞吃粽子进度条达到x进入狂暴模式动画
ACTIVITY_EATTING_RICEDUMPLING_ROBOT_SPEED: '4.2&3.5', // 机器人每X秒少一个粽子图片/每X秒少一个粽子图片
ACTIVITY_ARCHERY_SCORE_EXTRADD: '2&2&一箭双雕|3&4&连中三元|4&8&箭无虚发|5&16&百发百中', // 连续X次10环&额外加分&文字提示
ACTIVITY_ARCHERY_ONCE_NUM: 5, // 一轮射箭可射几箭
ACTIVITY_CATCH_ZONGZI_COUNTDOWN: 20, // 接粽子游戏倒计时(秒)
ACTIVITY_CATCH_ZONGZI_PERSCREEN_COUNT: 10, // 接粽子小游戏一次掉落的粽子总数
ACTIVITY_CATCH_ZONGZI_TYPE_RATIO: '1&0.8&1|2&0.2&2', // 粽子类型&掉落比例系数&得分 小粽子type=1 大粽子type=2
};
export const BATTLE_PREPARING = {
CHANGE_ORDER_OPEN: 109, // 出兵界面行动顺序按钮开启关卡
@@ -368,7 +373,7 @@ export const RECHARGE = {
RECHARGE_RMB_RETURN_LEVEL_LIMITED: 6, // 角色到达x级后可以收到充值返还邮件
};
export const MINIGAME = {
MINIGAME_ARCHER_RANGE: '0&100|29&80|69&60|104&40|143&20|177&0', // 射箭小游戏圈数积分
MINIGAME_ARCHER_RANGE: '0&10|29&9|69&8|104&7|143&6|177&0', // 射箭小游戏圈圆心距离和环数 圆心距离(含)&环
MINIGAME_FLIPCARD_TYPE: 'baihe|guyuan|hongdou|huasheng|lianzi|nuomi|yimi|zao', // 翻牌游戏资源
};
export const JEWEL = {
@@ -429,8 +434,8 @@ export const GVG = {
GVG_REVIVE_GOLD: '1&100|2&100|3&100|4&100|5&100|6&100|7&100|8&100|9&100|10&100|11&200', // GVG激战期元宝购买复活的消耗次数&元宝数
GVG_VESTIGE_CHALLENGE_TIME: '5:00:00&22:00:00', // 征战中原遗迹可挑战时间
GVG_DEFAULT_BATTLE_CD: 20, // 激战期战斗锁定时长,用于玩家退出时获取不到数据的情况
GVG_VESTIGE_BUY_COST: "31002&200", // 每次购买消耗
GVG_VESTIGE_BUY_LIMIT: 10, // 每日上限
GVG_VESTIGE_BUY_COST: '31002&200', // 单人遗迹购买挑战每次消耗
GVG_VESTIGE_BUY_LIMIT: 10, // 单人遗迹购买挑战次数每日上限
};
export const PLATFORM_CONFIG = {
OPEN_ANIMATION: 1, // 0关1开开场动画视频

View File

@@ -1138,5 +1138,25 @@
"content": 0,
"condition": "count",
"sumType": 2
},
{
"id": 135,
"name": "小游戏",
"info": "单局射箭获得X分大于等于均可",
"param": "score&count",
"string": "得分&达成次数",
"content": "(大于等于均可)",
"condition": "count",
"sumType": 2
},
{
"id": 136,
"name": "小游戏",
"info": "单局翻牌不超出X步 (小于等于均可)",
"param": "step&count",
"string": "步数&达成次数",
"content": "(小于等于均可)",
"condition": "count",
"sumType": 2
}
]