feat(gvg): 任务

This commit is contained in:
luying
2023-01-18 10:02:31 +08:00
parent aab08f7ed5
commit 6619e33995
16 changed files with 332 additions and 31 deletions

View File

@@ -179,4 +179,5 @@ export const PUSH_ROUTE = {
LEAGUE_DISSMISS: 'onLeagueDismiss', // 当联军解散
LEAGUE_ABDICATE: 'onLeagueAbdicate', // 当被转让盟主
LEAGUE_ITEM_UPDATE: 'onLeagueItemUpdate',
GVG_TASK_UPDATE: 'onGVGTaskUpdate', // GVG任务更新
}

View File

@@ -574,6 +574,7 @@ export const FILENAME = {
DIC_GVG_CONTRIBUTE_BOX: 'dic_zyz_GVGContributeBox',
DIC_GVG_AREA: 'dic_zyz_GVGArea',
DIC_GVG_CITY_ADD: 'dic_zyz_GVGCityAdd',
DIC_GVG_TASK: 'dic_zyz_GVGTask',
}
export const WAR_RELATE_TABLES = [
@@ -799,7 +800,10 @@ export enum TASK_TYPE {
ARTIFACT_QUALITY_EQUIP = 128, // 穿戴X件品质为X的宝物
ARTIFACT_COMPOSE = 129, // 合成X次宝物
STAR_UP_SUM = 130, // 总计升星次数
BATTLE_BRANCH_ELITE = 131, // 通关
BATTLE_BRANCH_ELITE = 131, // 通关梦魇支线关卡
GVG_FARM = 132, // 农庄种植/矿山采集/木堆砍柴
GVG_VESTIGE = 133, // 中原遗迹挑战
GVG_TECH = 134, // 千机阁捐献
}
// 任务累积类型
@@ -1083,6 +1087,7 @@ export enum ITEM_CHANGE_REASON {
MINE_END = 167, // 挖矿
GVG_RECEIVE_BOX = 167, // 领取宝箱
GVG_RECEIVE_LV = 168, // 领取等级奖励
GVG_RECEIVE_TASK = 169, // 领取任务奖励
}
export enum TA_EVENT {

View File

@@ -332,6 +332,8 @@ export const STATUS = {
GVG_LV_NOT_ENOUGH: { code: 21326, simStr: '联军等级不足' },
GVG_LV_REWARD_HAS_RECEIVED: { code: 21327, simStr: '该等级奖励已领取过' },
GVG_LV_REWARD_NOT_REACH: { code: 21328, simStr: '请先领取上一级奖励再领取这一等级' },
GVG_TASK_NOT_ENOUGH: { code: 21329, simStr: '任务未达成' },
GVG_TASK_HAS_RECEIVED: { code: 21330, simStr: '任务已领取过' },
// 通用 30000 - 30099
DIC_DATA_NOT_FOUND: { code: 30000, simStr: '数据表未找到' },

View File

@@ -25,7 +25,7 @@ export default class GVGUserItem extends BaseModel {
expireTime: number;
public static async findByRole(configId: number, leagueCode: string, roleId: string) {
const result: GVGUserItemType[] = await GVGUserItemModel.find({ configId, leagueCode, roleId, expireTime: { $gte: nowSeconds() } }, { _id: 0 }).lean();
const result: GVGUserItemType[] = await GVGUserItemModel.find({ configId, leagueCode, roleId, expireTime: { $gte: nowSeconds() } }, { _id: 0, id: 1, count: 1 }).lean();
return result;
}

View File

@@ -1,6 +1,8 @@
import BaseModel from './BaseModel';
import { index, getModelForClass, prop, DocumentType, } from '@typegoose/typegoose';
import { getZeroPointD } from '../pubUtils/timeUtil';
import { TASK_FUN_TYPE } from '../consts';
import { UpdateTaskParam } from '../domain/roleField/task';
@index({ leagueCode: 1, roleId: 1, configId: 1, status: 1 })
export default class GVGUserTask extends BaseModel {
@@ -17,20 +19,52 @@ export default class GVGUserTask extends BaseModel {
@prop({ required: true, default: 0 })
id: number; // 任务id
@prop({ required: true, enum: TASK_FUN_TYPE })
type: number; // 任务类型
@prop({ required: true, default: 0 })
count: number; // 1-已达成
@prop({ required: true, default: 0 })
status: number; // 1-未领取 2-已领取
@prop({ required: true, default: 0 })
createTime: number; // 1-未领取 2-已领取
public static async findByRole(configId: number, leagueCode: string, roleId: string) {
let today = getZeroPointD();
const result: GVGUserTaskType[] = await GVGUserTaskModel.find({ configId, leagueCode, roleId, createdAt: { $gte: today } }, { _id: 0, id: 1, count: 1, status: 1 }).lean();
return result;
}
public static async setTaskRec(configId: number, leagueCode: string, roleId: string, taskType: number, taskId: number, count: number) {
let today = getZeroPointD();
let rec: GVGUserTaskType = await GVGUserTaskModel.findOneAndUpdate({ configId, leagueCode, roleId, id: taskId, createdAt: { $gte: today } }, { $setOnInsert: { taskType, status: 1 }, $set: { count } }, { new: true, upsert: true }).lean();
return rec;
}
public static async incTaskRec(configId: number, leagueCode: string, roleId: string, taskType: number, taskId: number, count: number) {
let today = getZeroPointD();
let rec: GVGUserTaskType = await GVGUserTaskModel.findOneAndUpdate({ configId, leagueCode, roleId, id: taskId, createdAt: { $gte: today } }, { $setOnInsert: { taskType, status: 1 }, $inc: { count } }, { new: true, upsert: true }).lean();
return rec;
}
public static async setOrIncTask(configId: number, leagueCode: string, roleId: string, taskType: number, taskId: number, param: UpdateTaskParam) {
if(param.set) {
return await this.setTaskRec(configId, leagueCode, roleId, taskType, taskId, param.set);
} else if (param.inc) {
return await this.incTaskRec(configId, leagueCode, roleId, taskType, taskId, param.inc);
}
}
public static async findByTaskId(configId: number, leagueCode: string, roleId: string, taskId: number) {
let today = getZeroPointD();
let rec: GVGUserTaskType = await GVGUserTaskModel.findOne({ configId, leagueCode, roleId, id: taskId, createdAt: { $gte: today } }).lean();
return rec;
}
public static async receiveTask(configId: number, leagueCode: string, roleId: string, taskId: number) {
let today = getZeroPointD();
let rec: GVGUserTaskType = await GVGUserTaskModel.findOneAndUpdate({ configId, leagueCode, roleId, id: taskId, createdAt: { $gte: today } }, { $set: { status: 2 } }, { new: true }).lean();
return rec;
}
}
export const GVGUserTaskModel = getModelForClass(GVGUserTask);

View File

@@ -126,6 +126,7 @@ import { dicGVGResourceBase, dicGVGResourceBaseByType, dicGVGResourceBaseByLv, l
import { dicGVGContributeBox, loadGVGContributeBox } from './dictionary/DicGVGContributeBox';
import { dicGVGArea, dicGVGCity, loadGVGArea } from './dictionary/DicGVGArea';
import { dicGVGCityAdd, loadGVGCityAdd } from './dictionary/DicGVGCityAdd';
import { dicGVGTask, dicGVGTaskByType, loadGVGTask } from './dictionary/DicGVGTask';
export const gameData = {
daily: dicDaily,
@@ -317,6 +318,8 @@ export const gameData = {
gvgArea: dicGVGArea,
gvgCity: dicGVGCity,
gvgCityAdd: dicGVGCityAdd,
gvgTask: dicGVGTask,
gvgTaskByType: dicGVGTaskByType,
};
// 在此提供一些原先在gamedata中提供的方法以便更方便获取gameData数据
@@ -1146,6 +1149,15 @@ function parseGVGSpFieldRatio() {
gameData.gvgSpFieldRatio.max = parseFloat(arr[0]);
}
export function getGVGTasksByType(taskType: number) {
let taskIds = gameData.gvgTaskByType.get(taskType)||[];
return taskIds.map(taskId => {
let dic = gameData.gvgTask.get(taskId);
console.log(taskId, dic)
return dic
});
}
// 初始加载
function initDatas() {
parseDicParam();
@@ -1352,6 +1364,7 @@ function loadDatas() {
loadGVGContributeBox();
loadGVGArea();
loadGVGCityAdd();
loadGVGTask();
}
// 重载dicParam

View File

@@ -0,0 +1,40 @@
// GVG任务
import { FILENAME } from '../../consts'
import { RewardInter } from '../interface';
import { parseGoodStr, parseNumberList, readFileAndParse } from '../util'
export interface DicGVGTask {
// 唯一id
id: number;
// 任务id
taskId: number;
// 任务类型
taskType: number;
// 任务参数
taskParam: number[];
// 条件
condition: number;
// 普通背包奖励
reward: RewardInter[];
// 联军背包奖励
leagueReward: RewardInter[];
}
export const dicGVGTask = new Map<number, DicGVGTask>();
export const dicGVGTaskByType = new Map<number, number[]>(); // type => []
export function loadGVGTask() {
dicGVGTask.clear();
let arr = readFileAndParse(FILENAME.DIC_GVG_TASK);
arr.forEach(o => {
o.taskParam = parseNumberList(o.taskParam);
o.reward = parseGoodStr(o.reward);
o.leagueReward = parseGoodStr(o.leagueReward);
dicGVGTask.set(o.taskId, o);
if(!dicGVGTaskByType.has(o.taskType)) {
dicGVGTaskByType.set(o.taskType, []);
}
dicGVGTaskByType.get(o.taskType)?.push(o.taskId);
});
arr = undefined;
}

View File

@@ -1,20 +1,23 @@
[
{
"id": 1,
"cityType": 1,
"foodAdd": 0.1,
"mineralAdd": 0.1,
"woodAdd": 0.1
"foodAdd": 10,
"mineralAdd": 10,
"woodAdd": 10
},
{
"id": 2,
"cityType": 2,
"foodAdd": 0.3,
"mineralAdd": 0.3,
"woodAdd": 0.3
"foodAdd": 30,
"mineralAdd": 30,
"woodAdd": 30
},
{
"id": 3,
"cityType": 3,
"foodAdd": 0.5,
"mineralAdd": 0.5,
"woodAdd": 0.5
"foodAdd": 50,
"mineralAdd": 50,
"woodAdd": 50
}
]

View File

@@ -0,0 +1,44 @@
[
{
"id": 1,
"type": 1,
"template": "%d贡献了%d%d",
"comments": "%d:玩家名 %d:粮食/木材/铁矿 %d:产量数值"
},
{
"id": 2,
"type": 1,
"template": "%d成功占领%d%d驻扎点",
"comments": "%d:玩家名 %d:遗迹名 %d:第X名"
},
{
"id": 3,
"type": 1,
"template": "%d占领%d%d驻扎点被%d成员抢占",
"comments": "%d:玩家名 %d:遗迹名 %d:第X名 %d联军名"
},
{
"id": 4,
"type": 1,
"template": "%d激活成功%d获得%d",
"comments": "%d:神机点名字 %d:本次获得该道具的玩家名,以顿号隔开 %d:道具名"
},
{
"id": 5,
"type": 1,
"template": "今日的遗迹已关闭,在大家的不懈努力下联军获得%d名",
"comments": "%d:联军驻扎分排名"
},
{
"id": 6,
"type": 1,
"template": "%d军团已退出本联军",
"comments": "%d:军团名"
},
{
"id": 7,
"type": 1,
"template": "%d军团加入本联军",
"comments": "%d:军团名"
}
]

View File

@@ -0,0 +1,32 @@
[
{
"id": 1,
"taskId": 1,
"taskType": 132,
"taskInfo": "农庄种植/矿山采集/木堆砍柴完成1次",
"taskParam": "1&",
"condition": 1,
"reward": "31002&500",
"leagueReward": "13&1"
},
{
"id": 2,
"taskId": 2,
"taskType": 133,
"taskInfo": "中原遗迹挑战1次",
"taskParam": "1&",
"condition": 1,
"reward": "31002&500",
"leagueReward": "13&1"
},
{
"id": 3,
"taskId": 3,
"taskType": 134,
"taskInfo": "千机阁捐献1次",
"taskParam": "1&",
"condition": 1,
"reward": "31002&500",
"leagueReward": "13&1"
}
]

View File

@@ -72,10 +72,10 @@
{
"id": 8,
"name": "武将",
"info": "x名x初始品质升至x星",
"info": "x名x品质升至x星",
"param": "herocount&quality&star&",
"string": "武将数量&品质&星级&",
"content": "升星可算彩星但需加上普通升星的星数比如彩6星填12=6+6;品质是使用等号判断的,紫色的升星不能达成蓝色的条件",
"content": "升至x星是只算普通升星的;品质是使用等号判断的,紫色的升星不能达成蓝色的条件",
"condition": "herocount",
"sumType": 1
},
@@ -325,7 +325,7 @@
"info": "通关秘境x次",
"param": "count&",
"string": "秘境挑战次数&",
"content": "只计算warType为6的关卡必须挑战胜利才计算扫荡也算",
"content": "只计算warType为6或13的关卡;必须挑战胜利才计算;扫荡也算",
"condition": "count",
"sumType": 2
},
@@ -335,7 +335,7 @@
"info": "秘境通关x关x难度",
"param": "warcount&warid&…",
"string": "填几个warid&关卡id&…",
"content": "只计算warType为6的关卡必须挑战胜利才计算扫荡也算",
"content": "只计算warType为6或13的关卡;必须挑战胜利才计算;扫荡也算",
"condition": "warcount",
"sumType": 1
},
@@ -362,7 +362,7 @@
{
"id": 48,
"name": "关卡",
"info": "通关支线x关",
"info": "通关遗迹x关",
"param": "warcount&warid",
"string": "挑战次数&",
"content": "只计算warType为2的关卡必须挑战胜利才计算扫荡也算",
@@ -571,11 +571,11 @@
},
{
"id": 73,
"name": "梦魇关卡",
"info": "梦魇通关第x关",
"param": "warcount&warid&",
"name": "精英任务",
"info": "精英通关第x关",
"param": "warcount&warid&",
"string": "关卡id",
"content": "只计算warType为12的关卡必须挑战胜利才计算计算扫荡主线基金是算这个type的",
"content": 0,
"condition": "warcount",
"sumType": 1
},
@@ -605,7 +605,7 @@
"info": "x名武将觉醒后升至x星",
"param": "herocount&star&",
"string": "武将数量&星级",
"content": "只算彩星填1不用计算黄星的6",
"content": 0,
"condition": "herocount",
"sumType": 1
},
@@ -1106,7 +1106,37 @@
"param": "warcount&warid",
"string": "挑战次数&",
"content": "只计算warType为13的关卡必须挑战胜利才计算扫荡也算",
"condition": "count",
"condition": "warcount",
"sumType": 1
},
{
"id": 132,
"name": "GVG",
"info": "农庄种植/矿山采集/木堆砍柴完成X次",
"param": "count&",
"string": "次数&",
"content": "三种活动完成任意一种即达成1次",
"condition": "count",
"sumType": 2
},
{
"id": 133,
"name": "GVG",
"info": "中原遗迹挑战X次",
"param": "count&",
"string": "次数&",
"content": 0,
"condition": "count",
"sumType": 2
},
{
"id": 134,
"name": "GVG",
"info": "千机阁捐献X",
"param": "count&",
"string": "次数&",
"content": 0,
"condition": "count",
"sumType": 2
}
]

View File

@@ -33,6 +33,6 @@
"DEBUG_TIME": 1,
"CHECK_WORD": 1,
"CAN_PAY": 1,
"SKIP_ENCODE": 0,
"SKIP_ENCODE": 1,
"NEED_REBATE": 0
}