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

@@ -1,5 +1,5 @@
import { Application, BackendSession, ChannelService, HandlerService, pinus } from "pinus";
import { GVG_ITEM, DATA_NAME, GVG_ACTIVE_TYPE, GVG_PERIOD, GVG_SERVER_TYPE, ITEM_CHANGE_REASON, LEAGUE_JOB, LEAGUE_MANAGE_TYPE, STATUS, GVG_REC_TYPE } from "../../../consts";
import { GVG_ITEM, DATA_NAME, GVG_ACTIVE_TYPE, GVG_PERIOD, GVG_SERVER_TYPE, ITEM_CHANGE_REASON, LEAGUE_JOB, LEAGUE_MANAGE_TYPE, STATUS, GVG_REC_TYPE, TASK_TYPE } from "../../../consts";
import { GVGLeagueModel } from "../../../db/GVGLeague";
import { GVGLeaguePrepareModel } from "../../../db/GVGLeaguePrepare";
import { GVGMainData, LeagueDistributeInfo, LeagueMemberDistributeInfo, LeagueMemberListInfo } from "../../../domain/gvgField/returnData";
@@ -20,6 +20,7 @@ import { addGVGReward, handleGVGCost } from "../../../services/gvg/gvgItemServic
import { RewardInter } from "../../../pubUtils/interface";
import { getGVGCities } from "../../../services/gvg/gvgBattleService";
import { GVGRecModel } from "../../../db/GVGRec";
import { checkGVGTask } from "../../../services/task/taskService";
export default function (app: Application) {
new HandlerService(app, {});
@@ -250,6 +251,38 @@ export class GVGHandler {
});
}
// 领取任务奖励
async receiveTask(msg: { taskId: number }, session: BackendSession) {
const roleId: string = session.get('roleId');
const guildCode: string = session.get('guildCode');
const roleName: string = session.get('roleName');
const sid: string = session.get('sid');
const { taskId } = msg;
let dicGVGTask = gameData.gvgTask.get(taskId);
if(!dicGVGTask) return resResult(STATUS.DIC_DATA_NOT_FOUND);
let { configId } = getGVGConfig();
const myLeague = await GVGLeagueModel.findLeagueByGuild(guildCode);
if(!myLeague) return resResult(STATUS.GVG_LEAGUE_NOT_EXIST);
// 检查
let rec = await GVGUserTaskModel.findByTaskId(configId, myLeague.leagueCode, roleId, taskId);
if(!rec || rec.count < dicGVGTask.condition) return resResult(STATUS.GVG_TASK_NOT_ENOUGH);
if(rec.status == 2) return resResult(STATUS.GVG_TASK_HAS_RECEIVED);
rec = await GVGUserTaskModel.receiveTask(configId, myLeague.leagueCode, roleId, taskId);
let leagueGoods = await addGVGReward(roleId, roleName, myLeague.leagueCode, sid, dicGVGTask.leagueReward, dicGVGTask.reward, ITEM_CHANGE_REASON.GVG_RECEIVE_TASK);
return resResult(STATUS.SUCCESS, {
curTask: {
id: rec.id,
status: rec.status
},
leagueGoods
});
}
// 千机阁数据
async getTech(msg: {}, session: BackendSession) {
const roleId = session.get('roleId');
@@ -321,6 +354,7 @@ export class GVGHandler {
// 千机阁解锁
async activate(msg: { techId: number, battleFeats: number }, session: BackendSession) {
const serverId = session.get('serverId');
const roleId = session.get('roleId');
const guildCode = session.get('guildCode');
const sid = session.get('sid');
@@ -359,6 +393,7 @@ export class GVGHandler {
// 添加 活跃
let active = await addGVGTechActive(myLeague.leagueCode, roleId);
checkGVGTask(serverId, roleId, sid, configId, myLeague.leagueCode, TASK_TYPE.GVG_TECH, { count: 1 });
return resResult(STATUS.SUCCESS, {
active,

View File

@@ -1,5 +1,5 @@
import { Application, BackendSession, ChannelService, HandlerService } from "pinus";
import { GVG_ACTIVE_TYPE, GVG_ITEM, GVG_ITEM_TYPE, GVG_PERIOD, GVG_RESOURCE_TYPE, ITEM_CHANGE_REASON, MAIL_TYPE, STATUS } from "../../../consts";
import { GVG_ACTIVE_TYPE, GVG_ITEM, GVG_ITEM_TYPE, GVG_PERIOD, GVG_RESOURCE_TYPE, ITEM_CHANGE_REASON, MAIL_TYPE, STATUS, TASK_TYPE } from "../../../consts";
import { GVGLeagueModel } from "../../../db/GVGLeague";
import { GVGLeagueFarmModel, GVGLeagueFarmType } from "../../../db/GVGLeagueFarm";
import { GVGLeagueFarmRecModel } from "../../../db/GVGLeagueFarmRec";
@@ -17,6 +17,7 @@ import { addGVGActive, addResource, getCostSeedReward, getItemIdOfSeedType, getL
import { getGVGConfig, getGVGPeriodData } from "../../../services/gvg/gvgService";
import { sendMailByContent } from "../../../services/mailService";
import { getAllServerName, getRoleOnlineInfo } from "../../../services/redisService";
import { checkGVGTask } from "../../../services/task/taskService";
export default function (app: Application) {
@@ -158,7 +159,7 @@ export class GVGProduceHandler {
// 种田
async plant(msg: { farmId: number, seeds: { fieldId: number, seedType: number }[] }, session: BackendSession) {
const roleId = session.get('roleId');
const roleName = session.get('roleName');
const serverId = session.get('serverId');
const guildCode = session.get('guildCode');
const sid = session.get('sid');
@@ -196,6 +197,7 @@ export class GVGProduceHandler {
const plantResult = await GVGLeagueFarmModel.plant(configId, myLeague.leagueCode, farmId, updateFields, roleId);
await rollbackUnPlantFields(cost, plantResult, session, myLeague.leagueCode); // 可能会有田已经被其他人占领的情况,将种子还回去
await GVGLeagueFarmRecModel.insertRecs(plantResult);
checkGVGTask(serverId, roleId, sid, configId, myLeague.leagueCode, TASK_TYPE.GVG_FARM, { count: 1 });
return resResult(STATUS.SUCCESS, {
...await getLeagueFarmShowResult(myLeague.leagueCode, roleId, farmId)
@@ -324,6 +326,7 @@ export class GVGProduceHandler {
const roleName = session.get('roleName');
const guildCode = session.get('guildCode');
const sid = session.get('sid');
const serverId = session.get('serverId');
const { farmId, fieldId, result } = msg;
let { configId, period } = getGVGPeriodData();
@@ -367,6 +370,7 @@ export class GVGProduceHandler {
let leagueGoods = await addGVGReward(roleId, roleName, myLeague.leagueCode, sid, leagueReward, reward, ITEM_CHANGE_REASON.HARVEST)
// 活跃
const active = await addGVGActive(myLeague.leagueCode, roleId, GVG_ACTIVE_TYPE.COST_PRODUCE_COIN, produceCoin);
checkGVGTask(serverId, roleId, sid, configId, myLeague.leagueCode, TASK_TYPE.GVG_FARM, { count: 1 });
return resResult(STATUS.SUCCESS, {
...await getLeagueFarmShowResult(myLeague.leagueCode, roleId, farmId, false),
@@ -449,6 +453,7 @@ export class GVGProduceHandler {
const roleName = session.get('roleName');
const guildCode = session.get('guildCode');
const sid = session.get('sid');
const serverId = session.get('serverId');
const { farmId, fieldId, result } = msg;
let { configId, period } = getGVGPeriodData();
@@ -486,6 +491,7 @@ export class GVGProduceHandler {
let leagueGoods = await addGVGReward(roleId, roleName, myLeague.leagueCode, sid, leagueReward, reward, ITEM_CHANGE_REASON.HARVEST)
// 活跃
const active = await addGVGActive(myLeague.leagueCode, roleId, GVG_ACTIVE_TYPE.COST_PRODUCE_COIN, produceCoin);
checkGVGTask(serverId, roleId, sid, configId, myLeague.leagueCode, TASK_TYPE.GVG_FARM, { count: 1 });
return resResult(STATUS.SUCCESS, {
...await getLeagueFarmShowResult(myLeague.leagueCode, roleId, farmId, false),

View File

@@ -15,12 +15,13 @@ import { SevenDaysData } from "../../domain/activityField/sevenDaysField";
import { ThirtyDaysData } from "../../domain/activityField/thirtyDaysField";
import { TreasureHuntData } from "../../domain/activityField/treasureHuntField";
import { TaskListReturn, TaskParam, TaskParamInter, UpdateTaskParam } from "../../domain/roleField/task";
import { gameData, getDicBlueprtById, getEquipSuitByHero } from "../../pubUtils/data";
import { gameData, getDicBlueprtById, getEquipSuitByHero, getGVGTasksByType } from "../../pubUtils/data";
import { getZeroPoint } from "../../pubUtils/timeUtil";
import { getActivityByServerId } from "../activity/activityService";
import { getRoleCreateTime, getRoleOnlineInfo, getServerCreateTime } from "../redisService";
import { getEquipById, getJewelByEquip, isRandSeUnLock } from "../equipService";
import { sendMessageToUserWithSuc } from "../pushService";
import { GVGUserTaskModel } from "../../db/GVGUserTask";
export class CheckTask {
serverId: number; // 区id
@@ -29,8 +30,12 @@ export class CheckTask {
roleCreateTime: number; // 玩家的创建时间
serverCreateTime: number; // 服务器的创建时间
configId?: number;
leagueCode?: string;
taskPushMessages: TaskListReturn[] = [];
activityTaskPushMessages = [];
gvgTaskPushMessages = [];
tasks: CheckSingleTask[] = [];
@@ -45,6 +50,11 @@ export class CheckTask {
this.tasks.push(task);
}
setLeague(configId: number, leagueCode: string) {
this.configId = configId;
this.leagueCode = leagueCode;
}
public async saveAndPush(sid?: string) {
for(let task of this.tasks) {
await task.check();
@@ -92,6 +102,9 @@ export class CheckTask {
if (this.taskPushMessages.length > 0) {
sendMessageToUserWithSuc(roleId, PUSH_ROUTE.TASK_UPDATE,this.taskPushMessages, sid);
}
if(this.gvgTaskPushMessages.length > 0) {
sendMessageToUserWithSuc(roleId, PUSH_ROUTE.GVG_TASK_UPDATE,this.gvgTaskPushMessages, sid);
}
if (this.activityTaskPushMessages.length > 0) {
sendMessageToUserWithSuc(roleId, PUSH_ROUTE.ACTIVITY_TASK_UPDATE, this.activityTaskPushMessages, sid);
}
@@ -123,6 +136,10 @@ export class CheckSingleTask {
this.parent.taskPushMessages.push(...param);
}
private addGVGTaskPushMessage(...param: {id: number, count: number}[]) {
this.parent.gvgTaskPushMessages.push(...param);
}
private addActivityTaskPushMessage(...param: any[]) {
this.parent.activityTaskPushMessages.push(...param);
}
@@ -177,6 +194,21 @@ export class CheckSingleTask {
}
}
// 联军任务
let dicGVGTasks = getGVGTasksByType(taskType);
console.log('#####', taskType, dicGVGTasks)
for(let { taskId, taskType, taskParam } of dicGVGTasks) {
let taskUpdateParam = await this.checkIsMatch(taskParam, async () => []);
if (taskUpdateParam) {
let rec = await GVGUserTaskModel.setOrIncTask(this.parent.configId, this.parent.leagueCode, roleId, taskType, taskId, taskUpdateParam);
if (!rec) continue;
if(rec.status == 1) {
this.addGVGTaskPushMessage({ id: taskId, count: rec.count });
}
}
}
// 检查活动任务
let activities = await getActivityByServerId(serverId);
for(let activity of activities) {
@@ -1404,6 +1436,24 @@ export class CheckSingleTask {
}
break;
}
case TASK_TYPE.GVG_FARM: // 132. 农庄种植/矿山采集/木堆砍柴
{
let { count } = param;
result = { inc: count };
break;
}
case TASK_TYPE.GVG_VESTIGE: // 133. 中原遗迹挑战
{
let { count } = param;
result = { inc: count };
break;
}
case TASK_TYPE.GVG_TECH: // 134. 千机阁捐献
{
let { count } = param;
result = { inc: count };
break;
}
}
return result
}

View File

@@ -20,7 +20,6 @@ import { checkPopUpCondition, checkPopUpConditionInCreateHero, checkPopUpConditi
import { sendMessageToUserWithSuc } from '../pushService';
import { getGoldId } from '../role/rewardService';
import { GachaResultIndb } from '../../domain/activityField/gachaField';
import { ActivityPopUpShopRecModel } from '../../db/ActivityPopUpShopRec';
export async function checkTaskWithRoles(roleId: string, sid: string, taskType: TASK_TYPE, roles: RoleType[]) {
for (let role of roles) {
@@ -43,6 +42,13 @@ export async function checkTask(serverId: number, roleId: string, sid: string, t
await task.saveAndPush(sid);
}
export async function checkGVGTask(serverId: number, roleId: string, sid: string, configId: number, leagueCode: string, taskType: TASK_TYPE, args?: TaskParamInter) {
let task = new CheckTask(serverId, roleId);
task.setParam(taskType, args);
task.setLeague(configId, leagueCode);
await task.saveAndPush(sid);
}
export async function checkTaskInEntry(serverId: number, roleId: string, sid: string, role: RoleType) {
let task = new CheckTask(serverId, roleId);
task.setRole(role);

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
}