任务:埋点30/70
This commit is contained in:
@@ -21,6 +21,14 @@ export const CHANNEL_PREFIX = {
|
||||
CITY: 'city', // 军团活动,诸侯混战,按城池分channel
|
||||
}
|
||||
|
||||
export const CHANNEL_TYPE = new Map([
|
||||
[ CHANNEL_PREFIX.SYS, 1 ],
|
||||
[ CHANNEL_PREFIX.WORLD, 2 ],
|
||||
[ CHANNEL_PREFIX.GUILD, 3 ],
|
||||
[ CHANNEL_PREFIX.TEAM, 4 ],
|
||||
[ 'private', 5 ],
|
||||
]);
|
||||
|
||||
// 消息来源
|
||||
export const MSG_SOURCE = {
|
||||
ROLE_SEND_TEXT: 0,
|
||||
@@ -42,7 +50,7 @@ export const MSG_SOURCE = {
|
||||
MYSTERY_FIRST_SUC: 16,
|
||||
VESTIGE_FIRST_SUC: 17,
|
||||
TEAM_INVITE: 18,
|
||||
HERO_WAKEUP: 19,
|
||||
HERO_WAKE_UP: 19,
|
||||
EQUIP_REFRESH_BEST: 20,
|
||||
ACQUIRE_RARE_GOODS: 21,
|
||||
GROUP_SEND_GIFT: 22,
|
||||
|
||||
@@ -265,4 +265,17 @@ export enum FIGURE_UNLOCK_CONDITION {
|
||||
GET_HERO = 1, // 获取武将
|
||||
HERO_FAVOR = 2, // 武将好感度达到
|
||||
GET_SKIN = 3, // 获得时装
|
||||
}
|
||||
}
|
||||
|
||||
// 神像随机属性数量
|
||||
export const TERAPH_RANDOM = {
|
||||
MIN: 2,
|
||||
MAX: 4
|
||||
}
|
||||
|
||||
// 道具特殊属性,如藏宝图等
|
||||
export const SPECIAL_ATTR = {
|
||||
WAR_ID: 1,
|
||||
TREASURE_ID: 2,
|
||||
TREASURE_TYPE: 3
|
||||
}
|
||||
@@ -1,7 +1,7 @@
|
||||
|
||||
export enum ROLE_SELECT {
|
||||
// 初始登录数据
|
||||
ENTRY = 'serverId userInfo.uid userInfo.tel userInfo.serverType ce topLineup topLineupCe teraphs roleId roleName tili lv exp gold coin vLv title hasGuild funcs eventStatus heads head frames frame spines spine guildCode frdCnt showLineup updatedAt heroNum heroNumUpdatedAt',
|
||||
ENTRY = 'serverId userInfo.uid userInfo.tel userInfo.serverType ce topLineup topLineupCe teraphs roleId roleName tili lv exp gold coin vLv title hasGuild funcs eventStatus heads head frames frame spines spine guildCode frdCnt showLineup updatedAt heroNum heroNumUpdatedAt loginTime',
|
||||
// 玩家列表显示基础数据
|
||||
SHOW_SIMPLE = 'roleId roleName ce head frame spine lv title job quitTime loginTime vLv guildName serverId userInfo.serverType',
|
||||
// 显示申请需要的信息
|
||||
|
||||
@@ -16,6 +16,8 @@ export const ADULT_AGE = 18;
|
||||
export const GUEST_MAX_TIME = 60 * 60; // 游客体验时间
|
||||
export const GUEST_DAY = 15; // 同一设备15天内不得重复体验游客模式
|
||||
|
||||
export const REFRESH_TIME = 5; // 统一一天刷新时间
|
||||
|
||||
export const COUNTER = {
|
||||
UID: { name: 'uid', def: 1 },
|
||||
GMUID: { name: 'gmuid', def: 1 },
|
||||
@@ -461,7 +463,10 @@ export const FILENAME = {
|
||||
DIC_SHOP: 'dic_zyz_shop',
|
||||
DIC_SHOP_LIST: 'dic_zyz_shopList',
|
||||
DIC_RANK: 'dic_zyz_rankingType',
|
||||
DIC_RANK_REWARD: 'dic_zyz_rankingReward'
|
||||
DIC_RANK_REWARD: 'dic_zyz_rankingReward',
|
||||
DIC_MAIN_TASK: 'dic_zyz_mainTask',
|
||||
DIC_DAILY_TASK: 'dic_zyz_dailyTask',
|
||||
DIC_ACHIEVEMENT: 'dic_zyz_achievement'
|
||||
}
|
||||
|
||||
export const WAR_RELATE_TABLES = [
|
||||
@@ -560,4 +565,51 @@ export enum SHOP_REFRESH_TYPE {
|
||||
WEEKLY = 2, // 每周
|
||||
MONTHLY = 3, // 每月
|
||||
FOREVER = 4 // 不重置
|
||||
}
|
||||
|
||||
// 任务的大类
|
||||
export enum TASK_FUN_TYPE {
|
||||
MAIN = 1, // 主线
|
||||
DAILY = 2, // 每日
|
||||
ACHIEVEMENT = 3, // 成就
|
||||
}
|
||||
|
||||
export enum TASK_TYPE {
|
||||
LOGIN_SUM = 1, // 累计登录
|
||||
LOGIN_SERIES = 2, // 连续登录
|
||||
ROLE_LV = 3, // 主公等级
|
||||
GASHA = 4, // 招募 暂无
|
||||
HERO_NUM = 5, // 武将数量
|
||||
HERO_STAR_UP = 6, // 升星次数
|
||||
HERO_QUALITY = 7, // 拥有品质
|
||||
HERO_QUALITY_STAR_UP = 8, // 某品质升星
|
||||
HERO_LV = 9, // 武将升级
|
||||
HERO_TRAIN = 10, // 武将训练
|
||||
HERO_QUALITY_UP = 11, // 武将升品
|
||||
HERO_WAKE_UP = 12, // 武将觉醒
|
||||
HERO_TRAIN_SUM = 13, // 武将总训练次数
|
||||
HERO_STAGE_UP = 14, // 武将兵种进阶
|
||||
HERO_FAVOUR_LV = 15, // 武将好感度升级
|
||||
HERO_CONNECT = 16, // 激活武将羁绊
|
||||
ROLE_SCHOOL_UNLOCK = 17, // 百家学宫解锁
|
||||
ROLE_SCHOOL_PUT_HERO = 18, // 百家学宫放置武将
|
||||
ROLE_TITLE = 19, // 爵位
|
||||
ROLE_TERAPH_STRENGTHEN = 20, // 神像强化
|
||||
ROLE_SCROLL_ACTIVE = 21, // 名将谱激活
|
||||
EQUIP_SUM = 22, // 总装备数
|
||||
EQUIP_BY_HERO = 23, // 各武将装备数量
|
||||
EQUIP_QUALITY = 24, // 装备品质
|
||||
EQUIP_STRENGTHEN = 25, // 装备栏强化
|
||||
EQUIP_JEWEL = 26, // 多少装备镶嵌宝石
|
||||
EQUIP_COMPOSE_SUIT = 27, // 合成套装
|
||||
EQUIP_SUIT = 28, // 拥有套装
|
||||
ROLE_SIGN = 29, // 签到 暂无
|
||||
EQUIP_REFINE = 30, // 成功精炼
|
||||
EQUIP_RESTRENGTHEN = 31, // 洗炼
|
||||
EQUIP_JEWEL_STAGE = 32, // 镶嵌几阶宝石
|
||||
EQUIP_JEWEL_SUM = 33, // 总计镶嵌多少宝石
|
||||
FRIEND_NUM = 34, // 好友人数
|
||||
FRIEND_SEND_HEART = 35, // 赠送友情点
|
||||
CHAT = 36, // 发送消息
|
||||
BATTLE_COST_AP = 37, // 消耗体力
|
||||
}
|
||||
@@ -1,420 +0,0 @@
|
||||
export const TURBO_CORE_URL = 'https://coresrv.tgamebox.cn';
|
||||
export const APP_ID = 'AXaXmIHPs9eONvzrBesD8aSKQNXYdALF';
|
||||
export const TURBO_PARM_SECRET = 'ipqw05du6ob4x130w89t31yrqd6xs005zzltcmg2zpqnvrjp1s';
|
||||
|
||||
export const ENCRYPT_IV = 'f7182j5f04e377ux';
|
||||
export const ENCRYPT_KEY = 'fiqaxijabbantusmprc234fj';
|
||||
|
||||
export const AUTH_SMS_CNT_PER_DAY = 8;
|
||||
|
||||
export const COUNTER = {
|
||||
UID: {name:'uid',def:1},
|
||||
GMUID: {name:'gmuid',def:1},
|
||||
API: {name:'api',def:1},
|
||||
GM_GROUP: {name:'gmgroup',def:1},
|
||||
HID: {name:'hid',def:10000},
|
||||
EID: {name:'eid',def:1},
|
||||
ROLE: {name:'role',def:1}
|
||||
};
|
||||
|
||||
export const ACTION_POIN = {
|
||||
MAX: 100000,
|
||||
PER: 6 * 60 * 1000
|
||||
};
|
||||
//武将养成系统分类
|
||||
export const HERO_SYSTEM_TYPE = {
|
||||
STAR: 1,
|
||||
TRAIN: 5,
|
||||
STAGEUP:6,
|
||||
SKIN:7,
|
||||
FAVOUR:8,
|
||||
CONNECT:9
|
||||
};
|
||||
|
||||
export const BATTLE_REWARD_TYPE = {
|
||||
FIX_REWARD: 1,
|
||||
CONDITION_REWARD: 2,
|
||||
RANDOM_REWARD: 3
|
||||
};
|
||||
|
||||
export const IT_TYPE = {
|
||||
BLUEPRT: 28
|
||||
}
|
||||
|
||||
export const GOOD_QUALITY = [1, 2, 3, 4, 5];
|
||||
|
||||
// 大类型,区分存到哪张表里
|
||||
export const GOOD_TYPE = {
|
||||
EQUIP: 1,
|
||||
CONSUMES: 2,
|
||||
SCRIPT: 3
|
||||
};
|
||||
|
||||
// 存到消耗品表内显示的类型
|
||||
export const CONSUME_TYPE = {
|
||||
CONSUME: 1, // 消耗品
|
||||
SOUL: 2, // 将魂
|
||||
BLUEPRT: 3, // 藏宝图
|
||||
POINT: 4, // 远征币等
|
||||
EXP: 5, // 经验书
|
||||
FAVOUR: 6, // 好感度道具
|
||||
SKIN: 7, // 好感度道具
|
||||
PIECE: 8, // 装备碎片
|
||||
JEWEL: 9,//宝石
|
||||
};
|
||||
|
||||
const itid_array = [
|
||||
{ id: 1, name: '剑', goodType: GOOD_TYPE.EQUIP },
|
||||
{ id: 2, name: '枪', goodType: GOOD_TYPE.EQUIP },
|
||||
{ id: 3, name: '刀', goodType: GOOD_TYPE.EQUIP },
|
||||
{ id: 4, name: '弓', goodType: GOOD_TYPE.EQUIP },
|
||||
{ id: 5, name: '拳', goodType: GOOD_TYPE.EQUIP },
|
||||
{ id: 6, name: '扇', goodType: GOOD_TYPE.EQUIP },
|
||||
{ id: 7, name: '宝剑', goodType: GOOD_TYPE.EQUIP },
|
||||
{ id: 8, name: '权杖', goodType: GOOD_TYPE.EQUIP },
|
||||
{ id: 9, name: '头盔', goodType: GOOD_TYPE.EQUIP },
|
||||
{ id: 10, name: '帽子', goodType: GOOD_TYPE.EQUIP },
|
||||
{ id: 11, name: '头巾', goodType: GOOD_TYPE.EQUIP },
|
||||
{ id: 12, name: '铠甲(衣)', goodType: GOOD_TYPE.EQUIP },
|
||||
{ id: 13, name: '战袍(衣)', goodType: GOOD_TYPE.EQUIP },
|
||||
{ id: 14, name: '法衣(衣)', goodType: GOOD_TYPE.EQUIP },
|
||||
{ id: 15, name: '铠甲(裤)', goodType: GOOD_TYPE.EQUIP },
|
||||
{ id: 16, name: '战袍(裤)', goodType: GOOD_TYPE.EQUIP },
|
||||
{ id: 17, name: '法衣(裤)', goodType: GOOD_TYPE.EQUIP },
|
||||
{ id: 18, name: '重靴', goodType: GOOD_TYPE.EQUIP },
|
||||
{ id: 19, name: '战靴', goodType: GOOD_TYPE.EQUIP },
|
||||
{ id: 20, name: '布鞋', goodType: GOOD_TYPE.EQUIP },
|
||||
{ id: 21, name: '饰品', goodType: GOOD_TYPE.EQUIP },
|
||||
{ id: 22, name: '消耗类物品(图纸类)', goodType: GOOD_TYPE.CONSUMES, type: CONSUME_TYPE.CONSUME },
|
||||
{ id: 35, name: '消耗类物品(经验书)', goodType: GOOD_TYPE.CONSUMES, type: CONSUME_TYPE.EXP },
|
||||
{ id: 36, name: '消耗类物品(好感道具)', goodType: GOOD_TYPE.CONSUMES, type: CONSUME_TYPE.FAVOUR },
|
||||
{ id: 23, name: '消耗类物品(材料类)', goodType: GOOD_TYPE.CONSUMES, type: CONSUME_TYPE.CONSUME },
|
||||
{ id: 24, name: '消耗类物品(宝箱类)', goodType: GOOD_TYPE.CONSUMES, type: CONSUME_TYPE.CONSUME },
|
||||
{ id: 26, name: '武将碎片', goodType: GOOD_TYPE.CONSUMES, type: CONSUME_TYPE.SOUL },
|
||||
{ id: 27, name: '货币', goodType: GOOD_TYPE.CONSUMES, isCurrency: true },
|
||||
{ id: 28, name: '藏宝图', goodType: GOOD_TYPE.CONSUMES, type: CONSUME_TYPE.BLUEPRT },
|
||||
{ id: 29, name: '礼器', goodType: GOOD_TYPE.EQUIP },
|
||||
{ id: 30, name: '宝甲', goodType: GOOD_TYPE.EQUIP },
|
||||
{ id: 31, name: '名驹', goodType: GOOD_TYPE.EQUIP },
|
||||
{ id: 32, name: '典籍', goodType: GOOD_TYPE.EQUIP },
|
||||
{ id: 33, name: '神兵', goodType: GOOD_TYPE.EQUIP },
|
||||
{ id: 34, name: '代币', goodType: GOOD_TYPE.CONSUMES, type: CONSUME_TYPE.POINT },
|
||||
{ id: 39, name: '时装', goodType: GOOD_TYPE.CONSUMES, type: CONSUME_TYPE.SKIN },
|
||||
{ id: 41, name: '装备碎片', goodType: GOOD_TYPE.CONSUMES, type: CONSUME_TYPE.PIECE }
|
||||
];
|
||||
|
||||
export const ITID = new Map<number, {id: number, name: string, goodType: number, type?: number, isCurrency?: boolean}>();
|
||||
for(let obj of itid_array) {
|
||||
ITID.set(obj.id, obj);
|
||||
}
|
||||
|
||||
export const CURRENCY_TYPE = {
|
||||
GOLD: "gold",
|
||||
COIN: "coin",
|
||||
ACTION_POINT: "ap",
|
||||
TREASURE_POINT: "treasurePoint",
|
||||
EXPEDITION_POINT: "expeditionPoint",
|
||||
DUNGEON_POINT: "dungeonPoint",
|
||||
FRIEND_POINT: "friendPoint"
|
||||
}
|
||||
|
||||
const currencyArr = [
|
||||
{ "gid": 31001, "name": "铜钱", "type": CURRENCY_TYPE.COIN },
|
||||
{ "gid": 31002, "name": "元宝", "type": CURRENCY_TYPE.GOLD },
|
||||
{ "gid": 31003, "name": "体力", "type": CURRENCY_TYPE.ACTION_POINT },
|
||||
{ "gid": 40001, "name": "远征币", "type": CURRENCY_TYPE.EXPEDITION_POINT },
|
||||
{ "gid": 40002, "name": "寻宝币", "type": CURRENCY_TYPE.TREASURE_POINT },
|
||||
{ "gid": 40003, "name": "情谊点", "type": CURRENCY_TYPE.FRIEND_POINT },
|
||||
{ "gid": 40004, "name": "秘境币", "type": CURRENCY_TYPE.DUNGEON_POINT },
|
||||
];
|
||||
export const CURRENCY = new Map<number, {gid: number, name: string, type: string}>();
|
||||
export const CURRENCY_BY_TYPE = new Map<string, number>();
|
||||
for(let obj of currencyArr) {
|
||||
CURRENCY.set(obj.gid, obj);
|
||||
CURRENCY_BY_TYPE.set(obj.type, obj.gid);
|
||||
}
|
||||
|
||||
export function getCurNameById(gid) {
|
||||
let currency = CURRENCY.get(gid);
|
||||
if (!currency) {
|
||||
return;
|
||||
}
|
||||
if (currency.type == CURRENCY_TYPE.COIN) {
|
||||
return 'coin';
|
||||
} else if (currency.type == CURRENCY_TYPE.GOLD) {
|
||||
return 'gold';
|
||||
} else if (currency.type == CURRENCY_TYPE.ACTION_POINT) {
|
||||
return 'ap';
|
||||
} else if (currency.type == CURRENCY_TYPE.FRIEND_POINT) {
|
||||
return 'frdCnt';
|
||||
} else if (currency.type == CURRENCY_TYPE.EXPEDITION_POINT) {
|
||||
return 'expeditionPoint';
|
||||
}
|
||||
}
|
||||
|
||||
export const WAR_TYPE = {
|
||||
NORMAL: 1, // 主线本
|
||||
VESTIGE: 2, // 遗迹本
|
||||
EVENT: 3, // 事件本
|
||||
DAILY: 4, // 每日
|
||||
EXPEDITION: 5, // 远征
|
||||
MYSTERY: 6, // 秘境
|
||||
WARLOARDS: 7, // 群雄
|
||||
TOWER: 8, // 天梯
|
||||
PVP: 9, // PVP
|
||||
GUILD_TIMER: 10, // 军团定时副本
|
||||
GUILD_WEEKLY: 11, // 军团周副本
|
||||
MAIN_ELITE: 12, // 主线精英
|
||||
MYSTERY_ELITE: 13 // 秘境精英
|
||||
};
|
||||
|
||||
// 藏宝图掉落参数
|
||||
export const BLUEPRT_CONST = {
|
||||
REFRESH_TIME: 5, // 每天几点刷新
|
||||
DAILY_CNT: 5, // 每天最多掉落多少张
|
||||
PER_AP: 15 // 每多少体力掉落1张藏宝图
|
||||
};
|
||||
|
||||
// 事件,是否开启保存随机记录方式
|
||||
export const EVENT_RANDOM_TYPE_ONE_OPEN = false;
|
||||
// 奇遇事件每次刷新几个
|
||||
export const EVENT_REFRESH_NUM = 3;
|
||||
// 奇遇事件开启等级
|
||||
export const EVENT_START_LV = 1;
|
||||
|
||||
// 存于用户Role表,事件开启状态
|
||||
export const EVENT_STATUS = {
|
||||
WAITING: 0, // 未开启
|
||||
STARTING: 1, // 初步触发,等到挑战完成
|
||||
OPEN: 2 // 开启
|
||||
};
|
||||
|
||||
// 奇遇事件状态
|
||||
export const EVENT_RECORD_STATUS = {
|
||||
WAITING: 0, // 初始状态
|
||||
BATTLE_SUCCESS: 1, // 挑战成功,待领取成功奖励
|
||||
BATTLE_FAIL: 2, // 挑战失败,可领取失败奖励
|
||||
SUCCESS_RECEIVED: 3, // 领取成功奖励
|
||||
FAIL_RECEIVED: 4 // 领取了失败奖励
|
||||
};
|
||||
|
||||
// 奇遇事件类型
|
||||
export const EVENT_TYPE = {
|
||||
BOX: 1, // 宝箱
|
||||
QUIZ: 2, // 答题
|
||||
BATTLE: 3 // 战斗
|
||||
};
|
||||
|
||||
export const EVENT_ANSWER_STATUS = {
|
||||
WAITING: 0,
|
||||
CORRECT: 1,
|
||||
WRONG: 2
|
||||
};
|
||||
|
||||
export const EXPEDITION_WAR_RECORD_STATUS = {
|
||||
HIDE: -1,
|
||||
WAITING: 0,
|
||||
SUCCESS: 1,
|
||||
FAIL: 2
|
||||
};
|
||||
|
||||
export const EVENT_START_BATTLE = 101;
|
||||
|
||||
export const HANG_UP_CONSTS = {
|
||||
ENABLE_LV: 2, // 第几层开始可以挂机
|
||||
UNIT_TIME: 10 * 60 * 1000, // 每几分钟能有一次收益
|
||||
MAX_TIME: 24 * 60 * 60 * 1000, // 最多可储存24小时收益
|
||||
MAX_SPD_UP_CNT: 2, // 每天可以收取多少次
|
||||
REFRESH_TIME: 5, // 每天的几点刷新
|
||||
SPD_UP_REC_TIME: 6 * 60 * 60 * 1000 // 加速直接获得6小时收益
|
||||
}
|
||||
|
||||
export const TOWER_TASK_CONST = {
|
||||
REFRESH_TIME: 5, // 每天几点刷新
|
||||
RAND_CNT: 8, // 每次刷新多少个任务
|
||||
MAX_TASK_REF_CNT: 8, // 完成的派遣任务数最多多少个
|
||||
MAX_HEROES_NUM: 3, // 每个任务最大派遣武将数
|
||||
COST_GOLD: 50 // 每次刷新花费的元宝
|
||||
}
|
||||
|
||||
export const DAILY_CONST = {
|
||||
REFRESH_TIME: 5 // 每天加点刷新
|
||||
}
|
||||
|
||||
export const DUNGEON_CONST = {
|
||||
REFRESH_TIME: 5, // 每天加点刷新
|
||||
MAX_CNT: 10, // 最大挑战次数
|
||||
MAX_BUY_CNT: 10 // 最大购买次数
|
||||
}
|
||||
|
||||
export const EXPEDITION_CONST = {
|
||||
REFRESH_TIME: 5, // 重置次数刷新时间
|
||||
INCREASE_POINT: 1, // 远征每成功一次累计的点数
|
||||
RESET_CNT: 1 // 可以免费重置的次数
|
||||
}
|
||||
|
||||
export const EVENT_QUIZ_NUM = 3;
|
||||
|
||||
export const DEFAULT_HEROES = [19, 53, 55, 54, 13];
|
||||
|
||||
export const FIX_SMS_CODE_TELS = ['18855953630', '13911134885', '15167549151', '15618654010', '15167549151', '18342915387'];
|
||||
|
||||
export const GONGSHI = {
|
||||
"TOWER_HANG_UP_SPEED_COST": "50",
|
||||
"TOWER_TASK_REF_COST": "200",
|
||||
"DAILY_REFRESH_NUM_COST": "50*num"
|
||||
};
|
||||
|
||||
/**
|
||||
* 计算元宝和次数相关的系数
|
||||
* 公式: A * num + B
|
||||
*/
|
||||
export const GOLD_COST_RATIO = {
|
||||
"TOWER_HANG_SPDUP": { "A": 0, "B": 50 }, // 天梯挂机加速花费
|
||||
"TOWER_TASK_REF": { "A": 0, "B": 50 }, // 天梯派遣刷新花费
|
||||
"DAILY_REF_NUM": { "A": 50, "B": 0 }, // 每日购买次数花费
|
||||
"DUNGRON_BUY_NUM": { "A": 0, "B": 50 } // 秘境购买次数花费
|
||||
}
|
||||
|
||||
export const EXPRESSION = {
|
||||
"CE": "1*hp+2*atk+2*matk+2*def+2*mdef+2*agi+2*luk+0*hit+0*cri+0*flee+0*antCri+0*damageIncrease+0*damageDecrease+0*defIngnore+0*bloodSuck"
|
||||
}
|
||||
|
||||
// 寻宝(共斗)相关
|
||||
export const COM_TEAM_STATUS = {
|
||||
DEFAULT: 0,
|
||||
FIGHTING: 1,
|
||||
WIN: 2,
|
||||
LOOSE: 3
|
||||
}
|
||||
|
||||
|
||||
// 寻宝配置常量
|
||||
export const COM_BTL_CONST = {
|
||||
ENABLE_LV: 1, // 功能开启等级
|
||||
ASSIST_DROP_RATE: 0.5, // 助战掉落占队长掉落的比例
|
||||
BLUEPRT_DROP_PER_AP: 10, // 藏宝图伪随机所需体力
|
||||
BTL_TIME_LMT: 10 * 60 * 1000, // 每局时长限制
|
||||
ROBOT_HURT_RAND_RATE: 0.05, // 每个机器人消耗 boss 血量百分比浮动范围
|
||||
FRDCNT_DROP: 10, // 每场情谊点掉落
|
||||
ROBOT_CE_RATIO: 0.2, // 机器人战力上下浮动百分比
|
||||
ASSIST_TIME: 60 * 1000, // 助战匹配机器人的等待时长
|
||||
CAP_TIME: 60 * 1000, // 队长匹配机器人的等待时长
|
||||
CAP_START_TIME: 60 * 1000, // 人齐后队长开始时长倒计时
|
||||
ROBOT_RND_LMT: 10, // 机器人输出伤害的回合数
|
||||
ROBOT_HURT_RATIO: 0.2, // 单个机器人输出总伤害占 boss 血量比重
|
||||
ROBOT_HURT_CH_RATIO: 0.1, // 机器人伤害上下浮动的比例
|
||||
ASSIST_REWARD_RATIO: 0.5, // 队员奖励比例
|
||||
}
|
||||
|
||||
// 机器人名字随机
|
||||
export const COM_BATTLE_ROBOT_ID_NAME = [
|
||||
{robotRoleId: 'cd9h0iy8', robotRoleName: '徐埋农'},
|
||||
{robotRoleId: 'rtdgr4oz', robotRoleName: '简普瞳'},
|
||||
{robotRoleId: 'rv96unin', robotRoleName: '邛瑛'},
|
||||
{robotRoleId: 'b33u625l', robotRoleName: '嵇晁伊'},
|
||||
{robotRoleId: 'l6wopj9p', robotRoleName: '颜校'},
|
||||
{robotRoleId: '6wdqcumj', robotRoleName: '吉辉娇'}
|
||||
];
|
||||
|
||||
export const REDIS_KEY = {
|
||||
USER_INFO: "userInfo", // 玩家缓存信息
|
||||
TOWER_RANK: "towerRank", // 天梯排行榜
|
||||
COM_TEAM_SEARCH_PRE: 'comTeamSerQ', // 匹配中的玩家,按品质分
|
||||
PVP_RANK: 'pvpRank'
|
||||
}
|
||||
|
||||
export const FUNC_OPT_TYPE = {
|
||||
LEVEL_UP: 1,
|
||||
BATTLE_END: 2
|
||||
}
|
||||
|
||||
|
||||
export const FUNCS_ID = {
|
||||
EVENT: 1
|
||||
}
|
||||
|
||||
export const FRIEND_DROP_TYPE = {
|
||||
COM_BATTLE: 1
|
||||
}
|
||||
|
||||
// 每日情谊点上限
|
||||
export const FRIEND_DROP_MAX = {
|
||||
COM_BTL: 150
|
||||
}
|
||||
|
||||
|
||||
// 武将上限
|
||||
export const HERO_GROW_MAX = {
|
||||
STAR: 6,
|
||||
COLORSTAR: 6,
|
||||
QUALITY: 3
|
||||
}
|
||||
|
||||
export const JOB_TYPE = {
|
||||
PHYSIC: 1,
|
||||
MAGIC: 2
|
||||
}
|
||||
|
||||
export const TERAPH_RANDOM = {
|
||||
MIN: 2,
|
||||
MAX: 4
|
||||
}
|
||||
|
||||
export const SPECIAL_ATTR = {
|
||||
WAR_ID: 1,
|
||||
TREASURE_ID: 2,
|
||||
TREASURE_TYPE: 3
|
||||
}
|
||||
|
||||
export const FILENAME = {
|
||||
DIC_BLUEPRT_COMPOSE: 'dic_blueprt_compose',
|
||||
DIC_BLUEPRT_POSSIBILITY: 'dic_blueprt_possibility',
|
||||
DIC_EXPEDITION: 'dic_expedition',
|
||||
DIC_EXPEDITION_POINT: 'dic_expedition_point',
|
||||
DIC_FUNC_SWITCH: 'dic_func_switch',
|
||||
DIC_GOODS: 'dic_goods',
|
||||
DIC_CHAREXP: 'dic_zyz_charexp',
|
||||
DIC_DAILY: 'dic_zyz_daily',
|
||||
DIC_EVENT: 'dic_zyz_event',
|
||||
DIC_FASHIONS: 'dic_zyz_fashions',
|
||||
DIC_FRIEND_SHIP: 'dic_zyz_friend_ship',
|
||||
DIC_FRIEND_SHIP_LEVEL: 'dic_zyz_friend_ship_level',
|
||||
DIC_GACHA: 'dic_gacha',
|
||||
DIC_GK_BRANCH: 'dic_zyz_gk_branch',
|
||||
DIC_GK_DAILY: 'dic_zyz_gk_daily',
|
||||
DIC_GK_DUNGEON: 'dic_zyz_gk_dungeon',
|
||||
DIC_GK_DUNGEON_ELITE: 'dic_zyz_gk_dungeonElite',
|
||||
DIC_GK_EVENT: 'dic_zyz_gk_event',
|
||||
DIC_GK_EXPEDITION: 'dic_zyz_gk_expedition',
|
||||
DIC_GK_MAIN: 'dic_zyz_gk_main',
|
||||
DIC_GK_MAIN_ELITE: 'dic_zyz_gk_mainElite',
|
||||
DIC_GK_TOWER: 'dic_zyz_gk_tower',
|
||||
DIC_GK_TREASURE: 'dic_zyz_gk_Treasure',
|
||||
DIC_HERO: 'dic_zyz_hero',
|
||||
DIC_HERO_QUALITY_UP: 'dic_zyz_hero_quality_up',
|
||||
DIC_HERO_STAR: 'dic_zyz_hero_star',
|
||||
DIC_HERO_WAKE: 'dic_zyz_hero_wake',
|
||||
DIC_HERO_SKILL: 'dic_zyz_heroskill',
|
||||
DIC_JOB: 'dic_zyz_job',
|
||||
DIC_KING_EXP: 'dic_zyz_kingexp',
|
||||
DIC_CHAR_EXP: 'dic_zyz_charexp',
|
||||
DIC_SE: 'dic_zyz_se',
|
||||
DIC_TOWER_TASK: 'dic_zyz_search',
|
||||
DIC_TOWER: 'dic_zyz_tower',
|
||||
DIC_XUNBAO: 'dic_zyz_xunbao',
|
||||
DIC_QUESTION: 'Questions',
|
||||
}
|
||||
|
||||
export const WAR_RELATE_TABLES = [
|
||||
FILENAME.DIC_GK_BRANCH,
|
||||
FILENAME.DIC_GK_DAILY,
|
||||
FILENAME.DIC_GK_DUNGEON,
|
||||
FILENAME.DIC_GK_DUNGEON_ELITE,
|
||||
FILENAME.DIC_GK_EVENT,
|
||||
FILENAME.DIC_GK_EXPEDITION,
|
||||
FILENAME.DIC_GK_MAIN,
|
||||
FILENAME.DIC_GK_MAIN_ELITE,
|
||||
FILENAME.DIC_GK_TOWER,
|
||||
FILENAME.DIC_GK_TREASURE
|
||||
]
|
||||
@@ -295,9 +295,16 @@ export default class Role extends BaseModel {
|
||||
return role;
|
||||
}
|
||||
|
||||
public static async findByUid(uid: number, serverId: number, select?: string, getters = false) {
|
||||
public static async findByUidAndSetTime(uid: number, serverId: number, select?: string, getters = false) {
|
||||
const curSec = nowSeconds();
|
||||
const role: RoleType = await RoleModel.findOneAndUpdate({ 'userInfo.uid': uid, serverId }, { loginTime: curSec, quitTime: curSec }, { new: true }).select(select).lean({ getters, virtuals: true });
|
||||
// 为了计算累计登录,此处查询new为false
|
||||
const role: RoleType = await RoleModel.findOneAndUpdate({ 'userInfo.uid': uid, serverId }, { loginTime: curSec, quitTime: curSec }, { new: false }).select(select).lean({ getters, virtuals: true });
|
||||
return role;
|
||||
}
|
||||
|
||||
public static async findByUid(uid: number, serverId: number, select?: string, getters = false) {
|
||||
const role: RoleType = await RoleModel.findOne({ 'userInfo.uid': uid, serverId }).select(select).lean({ getters, virtuals: true });
|
||||
|
||||
return role;
|
||||
}
|
||||
|
||||
|
||||
52
shared/db/UserTaskRec.ts
Normal file
52
shared/db/UserTaskRec.ts
Normal file
@@ -0,0 +1,52 @@
|
||||
import BaseModel from './BaseModel';
|
||||
import { index, getModelForClass, prop, DocumentType, modelOptions } from '@typegoose/typegoose';
|
||||
import { TASK_FUN_TYPE } from '../consts';
|
||||
import { genCode } from '../pubUtils/util';
|
||||
|
||||
/**
|
||||
* 玩家购买商店记录表,每个商品一条,每次刷新新建一条
|
||||
**/
|
||||
@modelOptions({ schemaOptions: { id: false } })
|
||||
@index({ roleId: 1, itemId: 1 })
|
||||
|
||||
export default class UserTaskRec extends BaseModel {
|
||||
@prop({ required: true })
|
||||
code: string; // 该记录唯一标识
|
||||
|
||||
@prop({ required: true })
|
||||
roleId: string; // 玩家id
|
||||
|
||||
@prop({ required: true, enum: TASK_FUN_TYPE })
|
||||
type: number; // 任务类型
|
||||
|
||||
@prop({ required: true })
|
||||
id: number; // 任务id,任务表内id
|
||||
|
||||
@prop({ required: true })
|
||||
taskType: number; // 行为类型
|
||||
|
||||
@prop({ required: true })
|
||||
group: number; // 行为类型下的分组
|
||||
|
||||
@prop({ required: true })
|
||||
count: number; // 达成次数
|
||||
|
||||
@prop({ required: true, default: false })
|
||||
received: boolean; // 是否已领取
|
||||
|
||||
public static async setTaskRec(roleId: string, type: number, taskType: number, group: number, count: number) {
|
||||
let rec: UserTaskRecType = await UserTaskRecModel.findOneAndUpdate({ roleId, type, group }, { $setOnInsert: { code: genCode(8), taskType, received: false }, $set: { count } }, { new: true, upsert: true }).lean();
|
||||
return rec;
|
||||
}
|
||||
|
||||
public static async incTaskRec(roleId: string, type: number, taskType: number, group: number, count: number) {
|
||||
|
||||
let rec: UserTaskRecType = await UserTaskRecModel.findOneAndUpdate({ roleId, type, group }, { $setOnInsert: { code: genCode(8), taskType, received: false }, $inc: { count } }, { new: true, upsert: true }).lean();
|
||||
return rec;
|
||||
}
|
||||
}
|
||||
|
||||
export const UserTaskRecModel = getModelForClass(UserTaskRec);
|
||||
|
||||
export interface UserTaskRecType extends Pick<DocumentType<UserTaskRec>, keyof UserTaskRec> { }
|
||||
export type UserTaskRecParam = Partial<UserTaskRecType>;
|
||||
@@ -1,7 +1,7 @@
|
||||
import { PvpEnemies, PvpOtherHeroes, WarStar } from "../../domain/dbGeneral";
|
||||
import { GuildType } from "../../db/Guild";
|
||||
import { RoleType } from "../../db/Role";
|
||||
import { WAR_TYPE } from "../../consts/consts";
|
||||
import { WAR_TYPE } from "../../consts";
|
||||
import { gameData } from "../../pubUtils/data";
|
||||
import { EXTERIOR } from "../../pubUtils/dicParam";
|
||||
|
||||
|
||||
12
shared/domain/roleField/task.ts
Normal file
12
shared/domain/roleField/task.ts
Normal file
@@ -0,0 +1,12 @@
|
||||
export class TaskParam {
|
||||
star?: number;
|
||||
quality?: number;
|
||||
lv?: number;
|
||||
count?: number;
|
||||
favourLv?: number;
|
||||
connectLv?: number;
|
||||
isPutOn?: number;
|
||||
oldLv?: number;
|
||||
stage?: number;
|
||||
chatType?: number;
|
||||
}
|
||||
@@ -18,7 +18,7 @@ import { dicTowerTask } from "./dictionary/DicTowerTask";
|
||||
import { dicWar, dicWarPvp } from "./dictionary/DicWar";
|
||||
import { dicWarJson } from "./dictionary/DicWarJson";
|
||||
import { dicXunbao } from "./dictionary/DicXunbao";
|
||||
import { SPECIAL_ATTR } from "../consts/consts";
|
||||
import { SPECIAL_ATTR } from "../consts";
|
||||
import { dicFashions } from "./dictionary/DicFashions";
|
||||
import { friendShips, friendShipHidAandIds } from "./dictionary/DicFriendShip";
|
||||
import { maxFriendShipLv, dicFriendShipLevelMap } from "./dictionary/DicFriendShipLevel";
|
||||
@@ -73,6 +73,7 @@ import { dicShop, dicShopItem } from "./dictionary/DicShop";
|
||||
import { dicShopList } from "./dictionary/DicShopList";
|
||||
import { dicRank } from "./dictionary/DicRank";
|
||||
import { dicRankReward } from "./dictionary/DicRankReward";
|
||||
import { dicTaskType, dicMainTask, dicDailyTask, dicAchievement } from "./dictionary/DicTask";
|
||||
|
||||
export const gameData = {
|
||||
blurprtCompose: dicBlueprtCompose,
|
||||
@@ -171,7 +172,11 @@ export const gameData = {
|
||||
shopList: dicShopList,
|
||||
dicMyHeroes: dicMyHeroes,
|
||||
rank: dicRank,
|
||||
generalRankReward: dicRankReward
|
||||
generalRankReward: dicRankReward,
|
||||
taskType: dicTaskType,
|
||||
mainTask: dicMainTask,
|
||||
dailyTask: dicDailyTask,
|
||||
achievement: dicAchievement
|
||||
};
|
||||
|
||||
// 在此提供一些原先在gamedata中提供的方法,以便更方便获取gameData数据
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
// 镇念塔表
|
||||
import { decodeArrayListStr, readJsonFile } from '../util'
|
||||
import { decodeArrayListStr, readJsonFile, parseNumberList } from '../util'
|
||||
import { FILENAME } from '../../consts';
|
||||
|
||||
export interface DicSuit {
|
||||
@@ -11,7 +11,7 @@ export interface DicSuit {
|
||||
readonly totalCount: number;
|
||||
// 套装效果
|
||||
readonly effect: Array<{ count: number, seid: number }>;
|
||||
readonly tireInfo: Map<number,number>;
|
||||
readonly tireInfo: Array<number>;
|
||||
}
|
||||
|
||||
const str = readJsonFile(FILENAME.DIC_SUIT);
|
||||
@@ -21,7 +21,7 @@ export const dicSuit = new Map<number, DicSuit>();
|
||||
|
||||
arr.forEach(o => {
|
||||
o.effect = parseSuitEffect(o.effect);
|
||||
o.tireInfo = parseTireInfo(o.tireInfo);
|
||||
o.tireInfo = parseNumberList(o.tireInfo);
|
||||
dicSuit.set(o.id, o);
|
||||
});
|
||||
arr = undefined;
|
||||
@@ -37,13 +37,4 @@ function parseSuitEffect(str: string) {
|
||||
result.push({ count: parseInt(count), seid: parseFloat(seid) });
|
||||
}
|
||||
return result
|
||||
}
|
||||
|
||||
function parseTireInfo(str: string) {
|
||||
let result = new Map<number,number>();
|
||||
let arrs = str.split('&');
|
||||
for (let arr of arrs) {
|
||||
result.set(parseInt(arr), 1);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
132
shared/pubUtils/dictionary/DicTask.ts
Normal file
132
shared/pubUtils/dictionary/DicTask.ts
Normal file
@@ -0,0 +1,132 @@
|
||||
// 任务
|
||||
import { RewardInter } from '../interface';
|
||||
import { readJsonFile, parseNumberList, parseGoodStr } from '../util';
|
||||
import { FILENAME, TASK_FUN_TYPE} from '../../consts';
|
||||
const _ = require('lodash');
|
||||
|
||||
type KeysEnum<T> = { [P in keyof Required<T>]: true };
|
||||
|
||||
interface DicTaskBase {
|
||||
// id
|
||||
readonly id: number;
|
||||
// 任务类型
|
||||
readonly taskType: number;
|
||||
// 类型下面的分组
|
||||
readonly group: number;
|
||||
// 任务参数
|
||||
readonly taskParam: number[];
|
||||
// 条件
|
||||
readonly condition: number;
|
||||
}
|
||||
|
||||
const DicTaskKeys: KeysEnum<DicTaskBase> = {
|
||||
id: true,
|
||||
taskType: true,
|
||||
group: true,
|
||||
taskParam: true,
|
||||
condition: true
|
||||
};
|
||||
|
||||
// 主线任务
|
||||
export interface DicMainTask extends DicTaskBase {
|
||||
// 奖励
|
||||
readonly taskReward: RewardInter[];
|
||||
// 任务阶段
|
||||
readonly taskStage: number;
|
||||
}
|
||||
|
||||
const DicMainTaskKeys: KeysEnum<DicMainTask> = {
|
||||
id: true,
|
||||
taskType: true,
|
||||
group: true,
|
||||
taskParam: true,
|
||||
condition: true,
|
||||
taskStage: true,
|
||||
taskReward: true
|
||||
};
|
||||
|
||||
// 每日任务
|
||||
export interface DicDailyTask extends DicTaskBase {
|
||||
// 奖励
|
||||
readonly taskReward: RewardInter[];
|
||||
// 活跃
|
||||
readonly point: number;
|
||||
// 经验基数
|
||||
readonly exp: number;
|
||||
}
|
||||
|
||||
const DicDailyTaskKeys: KeysEnum<DicDailyTask> = {
|
||||
id: true,
|
||||
taskType: true,
|
||||
group: true,
|
||||
taskParam: true,
|
||||
condition: true,
|
||||
taskReward: true,
|
||||
point: true,
|
||||
exp: true
|
||||
};
|
||||
|
||||
// 成就
|
||||
export interface DicAchievement extends DicTaskBase {
|
||||
// 奖励
|
||||
readonly taskReward: RewardInter[];
|
||||
// 活跃
|
||||
readonly point: number;
|
||||
}
|
||||
|
||||
const DicAchievementKeys: KeysEnum<DicAchievement> = {
|
||||
id: true,
|
||||
taskType: true,
|
||||
group: true,
|
||||
taskParam: true,
|
||||
condition: true,
|
||||
taskReward: true,
|
||||
point: true
|
||||
};
|
||||
|
||||
export type DicTask = DicTaskBase & { type: number };
|
||||
|
||||
export const dicMainTask = new Map<number, DicMainTask>(); // 主线任务
|
||||
export const dicDailyTask = new Map<number, DicDailyTask>(); // 每日任务
|
||||
export const dicAchievement = new Map<number, DicAchievement>(); // 成就
|
||||
|
||||
export const dicTaskType = new Map<number, DicTask[]>();
|
||||
|
||||
const mainTask = readJsonFile(FILENAME.DIC_MAIN_TASK);
|
||||
let arrMainTask = JSON.parse(mainTask);
|
||||
arrMainTask.forEach(o => {
|
||||
o.taskParam = parseNumberList(o.taskParam);
|
||||
o.taskReward = parseGoodStr(o.taskReward);
|
||||
dicMainTask.set(o.id, _.pick(o, Object.keys(DicMainTaskKeys)));
|
||||
pushDicTaskType(o.taskType, TASK_FUN_TYPE.MAIN, o);
|
||||
});
|
||||
arrMainTask = undefined;
|
||||
|
||||
const dailyTask = readJsonFile(FILENAME.DIC_DAILY_TASK);
|
||||
let arrDailyTask = JSON.parse(dailyTask);
|
||||
arrDailyTask.forEach(o => {
|
||||
o.taskParam = parseNumberList(o.taskParam);
|
||||
o.taskReward = parseGoodStr(o.taskReward);
|
||||
dicDailyTask.set(o.id, _.pick(o, Object.keys(DicDailyTaskKeys)));
|
||||
pushDicTaskType(o.taskType, TASK_FUN_TYPE.DAILY, o);
|
||||
});
|
||||
arrDailyTask = undefined;
|
||||
|
||||
const achievement = readJsonFile(FILENAME.DIC_ACHIEVEMENT);
|
||||
let arrAchievement = JSON.parse(achievement);
|
||||
arrAchievement.forEach(o => {
|
||||
o.taskParam = parseNumberList(o.taskParam);
|
||||
o.taskReward = parseGoodStr(o.taskReward);
|
||||
dicAchievement.set(o.id, _.pick(o, Object.keys(DicAchievementKeys)));
|
||||
pushDicTaskType(o.taskType, TASK_FUN_TYPE.ACHIEVEMENT, o);
|
||||
});
|
||||
arrAchievement = undefined;
|
||||
|
||||
function pushDicTaskType(taskType: number, type: number, o: any) {
|
||||
if(!dicTaskType.has(taskType)) {
|
||||
dicTaskType.set(taskType, new Array<DicTask>());
|
||||
}
|
||||
let newObj = _.pick(o, Object.keys(DicTaskKeys));
|
||||
newObj.type = type;
|
||||
dicTaskType.get(taskType).push(newObj)
|
||||
}
|
||||
@@ -5,7 +5,7 @@ import { ItemModel } from '../db/Item';
|
||||
import { EquipModel, RandSe, Holes } from './../db/Equip';
|
||||
import { BagInter, EquipInter } from './interface';
|
||||
import { gameData } from './data';
|
||||
import { RANDOM_SE_COUNT, FIX_ATTRIBUTES_RAN, ITID, CURRENCY_BY_TYPE, CURRENCY_TYPE, ROLE_SELECT, FIGURE_UNLOCK_CONDITION, CONSUME_TYPE, HERO_SYSTEM_TYPE } from '../consts';
|
||||
import { RANDOM_SE_COUNT, FIX_ATTRIBUTES_RAN, ITID, CURRENCY_BY_TYPE, CURRENCY_TYPE, ROLE_SELECT, FIGURE_UNLOCK_CONDITION, CONSUME_TYPE, HERO_SYSTEM_TYPE, TASK_TYPE } from '../consts';
|
||||
import { getRandValueByMinMax, getRandEelm } from './util';
|
||||
|
||||
import { findWhere } from 'underscore';
|
||||
@@ -13,6 +13,7 @@ import { RoleModel, RoleType } from '../db/Role';
|
||||
import { Figure } from '../domain/dbGeneral';
|
||||
import { getBeforeDaySeconds, nowSeconds } from './timeUtil';
|
||||
import { calPlayerCeAndSave, reCalAllHeroCe } from './playerCe';
|
||||
import { checkTask, checkTaskWithHeroes, checkTaskWithEquip } from './taskUtil';
|
||||
|
||||
export async function addSkins(roleId: string, id: number) {
|
||||
let skinInfo = gameData.fashion.get(id);
|
||||
@@ -61,7 +62,11 @@ export async function addEquips(roleId: string, roleName: string, weapon: EquipI
|
||||
}
|
||||
|
||||
const equip = await EquipModel.createEquip({roleId, roleName, id, name, quality, suitId, randRange, ePlaceId: type, randSe, holes, hid});
|
||||
return equip
|
||||
|
||||
// 任务
|
||||
let pushMessage = await checkTaskWithEquip(roleId, TASK_TYPE.EQUIP_SUIT, equip);
|
||||
|
||||
return { equipInfo: equip, pushMessage }
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -217,8 +222,8 @@ function unlockSingleFigure(dbFigures: Figure[], id: number, unlockDirect = fals
|
||||
}
|
||||
|
||||
export async function createHero(roleId: string, heroInfo: HeroUpdate) {
|
||||
let { role, figureInfo, heroes, calHeroResults, calAllHeroResults } = await createHeroes(roleId, [heroInfo])
|
||||
return { hero: heroes[0], role, figureInfo, calHeroResult: calHeroResults[0], calAllHeroResult: calAllHeroResults[0] }
|
||||
let { role, figureInfo, heroes, calHeroResults, calAllHeroResults, taskPushMessage } = await createHeroes(roleId, [heroInfo])
|
||||
return { hero: heroes[0], role, figureInfo, calHeroResult: calHeroResults[0], calAllHeroResult: calAllHeroResults[0], taskPushMessage }
|
||||
}
|
||||
|
||||
export async function createHeroes(roleId: string, heroInfos: HeroUpdate[]) {
|
||||
@@ -226,7 +231,7 @@ export async function createHeroes(roleId: string, heroInfos: HeroUpdate[]) {
|
||||
let heroNum = 0;
|
||||
let skinIds = new Array<number>();
|
||||
let conditions = new Array<{type: number, paramHid?: number, paramFavourLv?: number, paramSkinId?: number }>();
|
||||
let heroes = [], calHeroResults = [], calAllHeroResults = [];
|
||||
let heroes = [], calHeroResults = [], calAllHeroResults = [];
|
||||
|
||||
for(let heroInfo of heroInfos) {
|
||||
let curHero = await HeroModel.createHero(heroInfo); heroes.push(curHero);
|
||||
@@ -243,5 +248,11 @@ export async function createHeroes(roleId: string, heroInfos: HeroUpdate[]) {
|
||||
let figureInfo = await unlockFigure(roleId, conditions); // 解锁头像
|
||||
|
||||
let role = await RoleModel.incRoleInfo(roleId, { heroNum }, { heroNumUpdatedAt: nowSeconds() });
|
||||
return { role, figureInfo, heroes, calHeroResults, calAllHeroResults }
|
||||
// 任务
|
||||
let m1 = await checkTask(roleId, TASK_TYPE.HERO_NUM, heroNum, true, {});
|
||||
let m2 = await checkTaskWithHeroes(roleId, TASK_TYPE.HERO_QUALITY, heroes);
|
||||
let m3 = await checkTaskWithHeroes(roleId, TASK_TYPE.HERO_QUALITY_STAR_UP, heroes);
|
||||
let m4 = await checkTaskWithHeroes(roleId, TASK_TYPE.HERO_LV, heroes);
|
||||
let taskPushMessage = m1.concat(m2, m3, m4);
|
||||
return { role, figureInfo, heroes, calHeroResults, calAllHeroResults, taskPushMessage }
|
||||
}
|
||||
346
shared/pubUtils/taskUtil.ts
Normal file
346
shared/pubUtils/taskUtil.ts
Normal file
@@ -0,0 +1,346 @@
|
||||
import { gameData } from './data';
|
||||
import { DicTask } from './dictionary/DicTask';
|
||||
import { TASK_TYPE, ABI_STAGE } from '../consts';
|
||||
import { UserTaskRecModel, UserTaskRecType } from '../db/UserTaskRec'
|
||||
import { RoleType } from '../db/Role';
|
||||
import { TaskParam } from '../domain/roleField/task';
|
||||
import { getTodayZeroPoint } from './timeUtil';
|
||||
import { HeroType } from '../db/Hero';
|
||||
import { EquipType, EquipModel } from '../db/Equip';
|
||||
|
||||
export async function checkTaskWithRoles(taskType: number, roles: RoleType[]) {
|
||||
let pushMessage = new Array<{type: number, id: number, count: number, received: boolean}>();
|
||||
for(let role of roles) {
|
||||
let singlePush = await checkTaskWithRole(role.roleId, taskType, role);
|
||||
pushMessage.concat(singlePush);
|
||||
}
|
||||
return pushMessage
|
||||
}
|
||||
|
||||
export async function checkTaskWithRole(roleId: string, taskType: number, role: RoleType) {
|
||||
let pushMessage = new Array<{type: number, id: number, count: number, received: boolean}>();
|
||||
|
||||
if(taskType == TASK_TYPE.LOGIN_SUM)
|
||||
{
|
||||
let today = getTodayZeroPoint();
|
||||
if(today > role.loginTime) {
|
||||
pushMessage = await checkTask(roleId, taskType, 1, true, {});
|
||||
}
|
||||
}
|
||||
else if (taskType == TASK_TYPE.LOGIN_SERIES)
|
||||
{
|
||||
let today = getTodayZeroPoint();
|
||||
if(today > role.loginTime) {
|
||||
if(today - role.loginTime > 24 * 60 * 60 ) {
|
||||
pushMessage = await checkTask(roleId, taskType, 1, false, {});
|
||||
} else {
|
||||
pushMessage = await checkTask(roleId, taskType, 1, true, {});
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (taskType == TASK_TYPE.FRIEND_NUM)
|
||||
{
|
||||
let { friendCnt } = role;
|
||||
pushMessage = await checkTask(roleId, taskType, friendCnt, false, {});
|
||||
}
|
||||
|
||||
return pushMessage
|
||||
}
|
||||
|
||||
|
||||
export async function checkTaskWithHeroes(roleId: string, taskType: number, heroes: HeroType[]) {
|
||||
let pushMessage = new Array<{type: number, id: number, count: number, received: boolean}>();
|
||||
for(let hero of heroes) {
|
||||
let singlePush = await checkTaskWithHero(roleId, taskType, hero);
|
||||
pushMessage.concat(singlePush);
|
||||
}
|
||||
return pushMessage
|
||||
}
|
||||
|
||||
export async function checkTaskWithHero(roleId: string, taskType: number, hero: HeroType, args?: number[]) {
|
||||
let pushMessage = new Array<{type: number, id: number, count: number, received: boolean}>();
|
||||
if(taskType == TASK_TYPE.HERO_STAR_UP)
|
||||
{
|
||||
let dicHero = gameData.hero.get(hero.hid);
|
||||
let starUp = hero.star - dicHero.initialStars;
|
||||
if(hero.colorStar > 1) starUp += hero.colorStar - 1;
|
||||
pushMessage = await checkTask(roleId, taskType, 1, true, { star: starUp })
|
||||
}
|
||||
else if(taskType == TASK_TYPE.HERO_QUALITY)
|
||||
{
|
||||
let dicHero = gameData.hero.get(hero.hid);
|
||||
pushMessage = await checkTask(roleId, taskType, 1, true, { quality: dicHero.quality });
|
||||
}
|
||||
else if (taskType == TASK_TYPE.HERO_QUALITY_STAR_UP)
|
||||
{
|
||||
let dicHero = gameData.hero.get(hero.hid);
|
||||
pushMessage = await checkTask(roleId, taskType, 1, true, { quality: dicHero.quality, star: hero.star });
|
||||
}
|
||||
else if (taskType == TASK_TYPE.HERO_LV)
|
||||
{
|
||||
pushMessage = await checkTask(roleId, taskType, 1, true, { lv: hero.lv });
|
||||
}
|
||||
else if (taskType == TASK_TYPE.HERO_TRAIN)
|
||||
{
|
||||
let dicHero = gameData.hero.get(hero.hid);
|
||||
let initGrage = gameData.job.get(dicHero.jobid).grade;
|
||||
let curGrade = gameData.job.get(hero.job).grade;
|
||||
let count = (curGrade - initGrage) * (ABI_STAGE.END - ABI_STAGE.START) + (hero.jobStage - ABI_STAGE.START); // 训练次数
|
||||
pushMessage = await checkTask(roleId, taskType, 1, true, { count });
|
||||
}
|
||||
else if (taskType == TASK_TYPE.HERO_QUALITY_UP)
|
||||
{
|
||||
let dicHero = gameData.hero.get(hero.hid);
|
||||
if(hero.quality - dicHero.quality == 1) { // 每个武将升品算一次
|
||||
pushMessage = await checkTask(roleId, taskType, 1, true, {});
|
||||
}
|
||||
}
|
||||
else if (taskType == TASK_TYPE.HERO_STAGE_UP)
|
||||
{
|
||||
let dicHero = gameData.hero.get(hero.hid);
|
||||
let initGrage = gameData.job.get(dicHero.jobid).grade;
|
||||
let curGrade = gameData.job.get(hero.job).grade;
|
||||
let count = curGrade - initGrage; // 进阶次数
|
||||
pushMessage = await checkTask(roleId, taskType, 1, true, { count });
|
||||
}
|
||||
else if (taskType == TASK_TYPE.HERO_FAVOUR_LV)
|
||||
{
|
||||
pushMessage = await checkTask(roleId, taskType, 1, true, { favourLv: hero.favourLv })
|
||||
}
|
||||
else if (taskType == TASK_TYPE.EQUIP_BY_HERO)
|
||||
{
|
||||
// arg[0] 1:穿上 -1:脱下
|
||||
let { ePlace } = hero;
|
||||
let count = ePlace.filter(cur => cur.equip).length;
|
||||
pushMessage = await checkTask(roleId, taskType, args[0], true, { count, isPutOn: args[0] });
|
||||
}
|
||||
else if (taskType == TASK_TYPE.EQUIP_STRENGTHEN)
|
||||
{
|
||||
// args: 依次为原先的装备的强化等级
|
||||
let { ePlace } = hero;
|
||||
let index = 0;
|
||||
for(let { lv } of ePlace) {
|
||||
let p = await checkTask(roleId, taskType, 1, true, { oldLv: args[index++], lv });
|
||||
pushMessage = pushMessage.concat(p);
|
||||
}
|
||||
}
|
||||
|
||||
return pushMessage
|
||||
}
|
||||
|
||||
|
||||
export async function checkTaskWithEquip(roleId: string, taskType: number, equip: EquipType, args?: number[]) {
|
||||
let pushMessage = new Array<{type: number, id: number, count: number, received: boolean}>();
|
||||
if(taskType == TASK_TYPE.EQUIP_QUALITY)
|
||||
{
|
||||
// args[0] 1:装上 -1:脱下
|
||||
let dicGood = gameData.goods.get(equip.id);
|
||||
pushMessage = await checkTask(roleId, taskType, args[0], true, { quality: dicGood.quality })
|
||||
}
|
||||
else if (taskType == TASK_TYPE.EQUIP_JEWEL)
|
||||
{
|
||||
// args[0] 原来镶嵌了多少宝石
|
||||
let { holes } = equip;
|
||||
let jewelCount = holes.filter(cur => cur.jewel > 0).length;
|
||||
if(jewelCount > 0 && args[0] <= 0) { // 原来没有,镶嵌上了
|
||||
pushMessage = await checkTask(roleId, taskType, 1, true, {});
|
||||
} else if (jewelCount <= 0 && args[0] > 0) { // 原来镶嵌着,现在没了
|
||||
pushMessage = await checkTask(roleId, taskType, -1, true, {});
|
||||
}
|
||||
}
|
||||
else if (taskType == TASK_TYPE.EQUIP_COMPOSE_SUIT)
|
||||
{
|
||||
let dicGood = gameData.goods.get(equip.id);
|
||||
if(dicGood.suitId) {
|
||||
pushMessage = await checkTask(roleId, taskType, 1, true, {});
|
||||
}
|
||||
}
|
||||
else if (taskType == TASK_TYPE.EQUIP_SUIT)
|
||||
{
|
||||
let dicGood = gameData.goods.get(equip.id);
|
||||
if(dicGood.suitId) {
|
||||
let suit = gameData.suit.get(dicGood.suitId);
|
||||
let equips = await EquipModel.getEquipsByIds(roleId, suit.tireInfo);
|
||||
let everyEquip = new Map<number, number>();
|
||||
for(let equip of equips) {
|
||||
if(everyEquip.has(equip.id)) {
|
||||
everyEquip.set(equip.id, everyEquip.get(equip.id) + 1);
|
||||
} else {
|
||||
everyEquip.set(equip.id, 1);
|
||||
}
|
||||
}
|
||||
let minCount = 0, curCount = 0;
|
||||
for(let id of suit.tireInfo) {
|
||||
let count = everyEquip.get(id)||0;
|
||||
if(minCount > count) minCount = count;
|
||||
if(id == equip.id) curCount = count;
|
||||
}
|
||||
if(curCount == minCount) {
|
||||
pushMessage = await checkTask(roleId, taskType, 1, true, {});
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (taskType == TASK_TYPE.EQUIP_JEWEL_SUM)
|
||||
{
|
||||
// args[0] 原来镶嵌了多少宝石
|
||||
let { holes } = equip;
|
||||
let jewelCount = holes.filter(cur => cur.jewel > 0).length;
|
||||
pushMessage = await checkTask(roleId, taskType, jewelCount - args[0], true, {});
|
||||
}
|
||||
return pushMessage
|
||||
}
|
||||
|
||||
export async function checkTaskWithArgs(roleId: string, taskType: number, args: number[]) {
|
||||
let pushMessage = new Array<{type: number, id: number, count: number, received: boolean}>();
|
||||
|
||||
if(taskType == TASK_TYPE.ROLE_SCHOOL_PUT_HERO)
|
||||
{
|
||||
let [ hid, preHid ] = args;
|
||||
if(hid > 0 && preHid <= 0) { // 放置
|
||||
pushMessage = await checkTask(roleId, taskType, 1, true, {});
|
||||
} else if (hid <= 0 && preHid > 0) { // 卸下
|
||||
pushMessage = await checkTask(roleId, taskType, -1, true, {});
|
||||
}
|
||||
}
|
||||
else if (taskType == TASK_TYPE.EQUIP_JEWEL_STAGE)
|
||||
{
|
||||
// args 装上的, 卸下的
|
||||
let [putOnJewel, putOffJewel] = args;
|
||||
if(putOnJewel > 0) {
|
||||
let dicGood = gameData.goods.get(putOnJewel);
|
||||
let push = await checkTask(roleId, taskType, 1, true, { stage: dicGood.lvLimited });
|
||||
pushMessage.concat(push);
|
||||
}
|
||||
if(putOffJewel > 0) {
|
||||
let dicGood = gameData.goods.get(putOffJewel);
|
||||
let push = await checkTask(roleId, taskType, -1, true, { stage: dicGood.lvLimited });
|
||||
pushMessage.concat(push);
|
||||
}
|
||||
}
|
||||
else if (taskType == TASK_TYPE.CHAT)
|
||||
{
|
||||
// args[0] 聊天type 1-系统 2-世界 3-军团 4-组队 5-私聊
|
||||
pushMessage = await checkTask(roleId, taskType, 1, true, { chatType: args[0] })
|
||||
}
|
||||
|
||||
return pushMessage
|
||||
}
|
||||
|
||||
// 根据taskType判断有哪些任务需要check的
|
||||
export async function checkTask(roleId: string, taskType: number, count: number, isInc: boolean, param: TaskParam) {
|
||||
let tasks = gameData.taskType.get(taskType);
|
||||
let pushMessage = new Array<{type: number, id: number, count: number, received: boolean}>();
|
||||
let groups = new Map<number, { task0: DicTask, tasks: DicTask[] }>();
|
||||
for(let dicTask of tasks) {
|
||||
if(!groups.has(dicTask.group)) {
|
||||
groups.set(dicTask.group, { task0: dicTask, tasks: new Array<DicTask>() });
|
||||
}
|
||||
groups.get(dicTask.group).tasks.push(dicTask);
|
||||
}
|
||||
|
||||
for(let [ group, { task0, tasks } ] of groups) {
|
||||
let rec = await checkTaskRec(roleId, group, task0, count, isInc, param);
|
||||
if(rec) {
|
||||
for(let dicTask of tasks) {
|
||||
if(checkRecResult(rec, dicTask.condition)) {
|
||||
pushMessage.push({ type: dicTask.type, id: dicTask.id, count: rec.count, received: rec.received });
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return pushMessage;
|
||||
}
|
||||
|
||||
// 检查各项任务是否达成,达成了就保存到数据库
|
||||
export async function checkTaskRec(roleId: string, group: number, dicTask: DicTask, count: number, isInc: boolean, param: TaskParam ) {
|
||||
let { type, taskParam, taskType } = dicTask;
|
||||
let isMatch = false; // 条件是否满足
|
||||
switch(taskType) {
|
||||
case TASK_TYPE.LOGIN_SUM:
|
||||
case TASK_TYPE.LOGIN_SERIES:
|
||||
case TASK_TYPE.ROLE_LV:
|
||||
case TASK_TYPE.GASHA:
|
||||
case TASK_TYPE.HERO_NUM:
|
||||
case TASK_TYPE.HERO_QUALITY_UP:
|
||||
case TASK_TYPE.HERO_WAKE_UP:
|
||||
case TASK_TYPE.HERO_TRAIN_SUM:
|
||||
case TASK_TYPE.HERO_STAGE_UP:
|
||||
case TASK_TYPE.ROLE_SCHOOL_UNLOCK:
|
||||
case TASK_TYPE.ROLE_SCHOOL_PUT_HERO:
|
||||
case TASK_TYPE.ROLE_TITLE:
|
||||
case TASK_TYPE.ROLE_TERAPH_STRENGTHEN:
|
||||
case TASK_TYPE.ROLE_SCROLL_ACTIVE:
|
||||
case TASK_TYPE.EQUIP_SUM:
|
||||
case TASK_TYPE.EQUIP_JEWEL:
|
||||
case TASK_TYPE.EQUIP_COMPOSE_SUIT:
|
||||
case TASK_TYPE.EQUIP_SUIT:
|
||||
case TASK_TYPE.EQUIP_RESTRENGTHEN:
|
||||
case TASK_TYPE.EQUIP_REFINE:
|
||||
case TASK_TYPE.EQUIP_JEWEL_SUM:
|
||||
case TASK_TYPE.FRIEND_NUM:
|
||||
case TASK_TYPE.FRIEND_SEND_HEART:
|
||||
isMatch = true;
|
||||
break;
|
||||
case TASK_TYPE.HERO_STAR_UP:
|
||||
isMatch = taskParam[1] == param.star;
|
||||
break;
|
||||
case TASK_TYPE.HERO_QUALITY:
|
||||
case TASK_TYPE.EQUIP_QUALITY:
|
||||
isMatch = taskParam[1] == param.quality;
|
||||
break;
|
||||
case TASK_TYPE.HERO_QUALITY_STAR_UP:
|
||||
isMatch = taskParam[1] == param.quality && taskParam[2] == param.star;
|
||||
break;
|
||||
case TASK_TYPE.HERO_LV:
|
||||
isMatch = taskParam[1] == param.lv;
|
||||
break;
|
||||
case TASK_TYPE.HERO_TRAIN:
|
||||
isMatch = taskParam[1] == param.count;
|
||||
break;
|
||||
case TASK_TYPE.HERO_FAVOUR_LV:
|
||||
isMatch = taskParam[1] == param.favourLv;
|
||||
break;
|
||||
case TASK_TYPE.HERO_CONNECT:
|
||||
isMatch = taskParam[1] == param.connectLv;
|
||||
break;
|
||||
case TASK_TYPE.EQUIP_BY_HERO:
|
||||
if(param.isPutOn && param.count == taskParam[1]) { // 装上之后达到 +1
|
||||
isMatch = true;
|
||||
} else if (!param.isPutOn && param.count < taskParam[1]) { // 脱下后不能达到 -1
|
||||
isMatch = true;
|
||||
}
|
||||
break;
|
||||
case TASK_TYPE.EQUIP_STRENGTHEN:
|
||||
isMatch = param.oldLv < taskParam[1] && param.lv >= taskParam[1];
|
||||
break;
|
||||
case TASK_TYPE.EQUIP_JEWEL_STAGE:
|
||||
isMatch = param.stage == taskParam[1];
|
||||
break;
|
||||
case TASK_TYPE.CHAT:
|
||||
isMatch = param.chatType == 0 || param.chatType == taskParam[0];
|
||||
break;
|
||||
|
||||
}
|
||||
console.log('****isMatch', isMatch, type, taskType, group, count)
|
||||
|
||||
if(isMatch) {
|
||||
if(isInc) {
|
||||
let rec = await UserTaskRecModel.incTaskRec(roleId, type, taskType, group, count);
|
||||
return rec;
|
||||
} else {
|
||||
let rec = await UserTaskRecModel.setTaskRec(roleId, type, taskType, group, count);
|
||||
return rec;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function checkRecResult(rec: UserTaskRecType, condition: number) {
|
||||
if(!rec) return false;
|
||||
if(rec.received) return false;
|
||||
|
||||
if(rec.count >= condition) {
|
||||
return rec
|
||||
} else {
|
||||
return false
|
||||
}
|
||||
}
|
||||
@@ -1,4 +1,4 @@
|
||||
import { TIME_FORMAT } from '../consts';
|
||||
import { TIME_FORMAT, REFRESH_TIME } from '../consts';
|
||||
|
||||
const PER_SECOND = 1 * 1000;
|
||||
const PER_DAY = 24 * 60 * 60;
|
||||
@@ -13,7 +13,7 @@ export function nowSeconds() {
|
||||
return Math.floor(Date.now() / PER_SECOND );
|
||||
}
|
||||
|
||||
export function getTodayZeroPoint(hour = 0) {
|
||||
export function getTodayZeroPoint(hour = REFRESH_TIME) {
|
||||
var date = new Date();
|
||||
date.setHours(hour);
|
||||
date.setMinutes(0);
|
||||
|
||||
@@ -1,148 +1,4 @@
|
||||
[
|
||||
{
|
||||
"id": 8,
|
||||
"achieveTaskId": 8,
|
||||
"tab": 1,
|
||||
"tabName": "足迹",
|
||||
"subTab": 1,
|
||||
"subTabName": "登陆",
|
||||
"taskType": 29,
|
||||
"taskParam": "20&",
|
||||
"group": 1,
|
||||
"achieveTaskName": "情深义重·壹",
|
||||
"taskinfo": "累计签到20天",
|
||||
"condition": 20,
|
||||
"taskReward": 0,
|
||||
"point": 10
|
||||
},
|
||||
{
|
||||
"id": 9,
|
||||
"achieveTaskId": 9,
|
||||
"tab": 1,
|
||||
"tabName": "足迹",
|
||||
"subTab": 1,
|
||||
"subTabName": "登陆",
|
||||
"taskType": 29,
|
||||
"taskParam": "30&",
|
||||
"group": 1,
|
||||
"achieveTaskName": "情深义重·贰",
|
||||
"taskinfo": "累计签到30天",
|
||||
"condition": 30,
|
||||
"taskReward": 0,
|
||||
"point": 20
|
||||
},
|
||||
{
|
||||
"id": 10,
|
||||
"achieveTaskId": 10,
|
||||
"tab": 1,
|
||||
"tabName": "足迹",
|
||||
"subTab": 1,
|
||||
"subTabName": "登陆",
|
||||
"taskType": 29,
|
||||
"taskParam": "50&",
|
||||
"group": 1,
|
||||
"achieveTaskName": "情深义重·叁",
|
||||
"taskinfo": "累计签到50天",
|
||||
"condition": 50,
|
||||
"taskReward": 0,
|
||||
"point": 30
|
||||
},
|
||||
{
|
||||
"id": 11,
|
||||
"achieveTaskId": 11,
|
||||
"tab": 1,
|
||||
"tabName": "足迹",
|
||||
"subTab": 1,
|
||||
"subTabName": "登陆",
|
||||
"taskType": 29,
|
||||
"taskParam": "70&",
|
||||
"group": 1,
|
||||
"achieveTaskName": "情深义重·肆",
|
||||
"taskinfo": "累计签到70天",
|
||||
"condition": 70,
|
||||
"taskReward": 0,
|
||||
"point": 40
|
||||
},
|
||||
{
|
||||
"id": 12,
|
||||
"achieveTaskId": 12,
|
||||
"tab": 1,
|
||||
"tabName": "足迹",
|
||||
"subTab": 1,
|
||||
"subTabName": "登陆",
|
||||
"taskType": 29,
|
||||
"taskParam": "90&",
|
||||
"group": 1,
|
||||
"achieveTaskName": "情深义重·伍",
|
||||
"taskinfo": "累计签到90天",
|
||||
"condition": 90,
|
||||
"taskReward": 0,
|
||||
"point": 50
|
||||
},
|
||||
{
|
||||
"id": 13,
|
||||
"achieveTaskId": 13,
|
||||
"tab": 1,
|
||||
"tabName": "足迹",
|
||||
"subTab": 1,
|
||||
"subTabName": "登陆",
|
||||
"taskType": 29,
|
||||
"taskParam": "100&",
|
||||
"group": 1,
|
||||
"achieveTaskName": "情深义重·陆",
|
||||
"taskinfo": "累计签到100天",
|
||||
"condition": 100,
|
||||
"taskReward": 0,
|
||||
"point": 60
|
||||
},
|
||||
{
|
||||
"id": 14,
|
||||
"achieveTaskId": 14,
|
||||
"tab": 1,
|
||||
"tabName": "足迹",
|
||||
"subTab": 1,
|
||||
"subTabName": "登陆",
|
||||
"taskType": 29,
|
||||
"taskParam": "120&",
|
||||
"group": 1,
|
||||
"achieveTaskName": "情深义重·柒",
|
||||
"taskinfo": "累计签到120天",
|
||||
"condition": 120,
|
||||
"taskReward": 0,
|
||||
"point": 70
|
||||
},
|
||||
{
|
||||
"id": 15,
|
||||
"achieveTaskId": 15,
|
||||
"tab": 1,
|
||||
"tabName": "足迹",
|
||||
"subTab": 1,
|
||||
"subTabName": "登陆",
|
||||
"taskType": 29,
|
||||
"taskParam": "150&",
|
||||
"group": 1,
|
||||
"achieveTaskName": "情深义重·捌",
|
||||
"taskinfo": "累计签到150天",
|
||||
"condition": 150,
|
||||
"taskReward": 0,
|
||||
"point": 80
|
||||
},
|
||||
{
|
||||
"id": 16,
|
||||
"achieveTaskId": 16,
|
||||
"tab": 1,
|
||||
"tabName": "足迹",
|
||||
"subTab": 1,
|
||||
"subTabName": "登陆",
|
||||
"taskType": 29,
|
||||
"taskParam": "200&",
|
||||
"group": 1,
|
||||
"achieveTaskName": "情深义重·玖",
|
||||
"taskinfo": "累计签到200天",
|
||||
"condition": 200,
|
||||
"taskReward": 0,
|
||||
"point": 90
|
||||
},
|
||||
{
|
||||
"id": 1,
|
||||
"achieveTaskId": 1,
|
||||
@@ -254,5 +110,149 @@
|
||||
"condition": 15,
|
||||
"taskReward": 0,
|
||||
"point": 35
|
||||
},
|
||||
{
|
||||
"id": 8,
|
||||
"achieveTaskId": 8,
|
||||
"tab": 1,
|
||||
"tabName": "足迹",
|
||||
"subTab": 1,
|
||||
"subTabName": "登陆",
|
||||
"taskType": 1,
|
||||
"taskParam": "20&",
|
||||
"group": 1,
|
||||
"achieveTaskName": "情深义重·壹",
|
||||
"taskinfo": "累计登录20天",
|
||||
"condition": 20,
|
||||
"taskReward": 0,
|
||||
"point": 10
|
||||
},
|
||||
{
|
||||
"id": 9,
|
||||
"achieveTaskId": 9,
|
||||
"tab": 1,
|
||||
"tabName": "足迹",
|
||||
"subTab": 1,
|
||||
"subTabName": "登陆",
|
||||
"taskType": 1,
|
||||
"taskParam": "30&",
|
||||
"group": 1,
|
||||
"achieveTaskName": "情深义重·贰",
|
||||
"taskinfo": "累计登录30天",
|
||||
"condition": 30,
|
||||
"taskReward": 0,
|
||||
"point": 20
|
||||
},
|
||||
{
|
||||
"id": 10,
|
||||
"achieveTaskId": 10,
|
||||
"tab": 1,
|
||||
"tabName": "足迹",
|
||||
"subTab": 1,
|
||||
"subTabName": "登陆",
|
||||
"taskType": 1,
|
||||
"taskParam": "50&",
|
||||
"group": 1,
|
||||
"achieveTaskName": "情深义重·叁",
|
||||
"taskinfo": "累计登录50天",
|
||||
"condition": 50,
|
||||
"taskReward": 0,
|
||||
"point": 30
|
||||
},
|
||||
{
|
||||
"id": 11,
|
||||
"achieveTaskId": 11,
|
||||
"tab": 1,
|
||||
"tabName": "足迹",
|
||||
"subTab": 1,
|
||||
"subTabName": "登陆",
|
||||
"taskType": 1,
|
||||
"taskParam": "70&",
|
||||
"group": 1,
|
||||
"achieveTaskName": "情深义重·肆",
|
||||
"taskinfo": "累计登录70天",
|
||||
"condition": 70,
|
||||
"taskReward": 0,
|
||||
"point": 40
|
||||
},
|
||||
{
|
||||
"id": 12,
|
||||
"achieveTaskId": 12,
|
||||
"tab": 1,
|
||||
"tabName": "足迹",
|
||||
"subTab": 1,
|
||||
"subTabName": "登陆",
|
||||
"taskType": 1,
|
||||
"taskParam": "90&",
|
||||
"group": 1,
|
||||
"achieveTaskName": "情深义重·伍",
|
||||
"taskinfo": "累计登录90天",
|
||||
"condition": 90,
|
||||
"taskReward": 0,
|
||||
"point": 50
|
||||
},
|
||||
{
|
||||
"id": 13,
|
||||
"achieveTaskId": 13,
|
||||
"tab": 1,
|
||||
"tabName": "足迹",
|
||||
"subTab": 1,
|
||||
"subTabName": "登陆",
|
||||
"taskType": 1,
|
||||
"taskParam": "100&",
|
||||
"group": 1,
|
||||
"achieveTaskName": "情深义重·陆",
|
||||
"taskinfo": "累计登录100天",
|
||||
"condition": 100,
|
||||
"taskReward": 0,
|
||||
"point": 60
|
||||
},
|
||||
{
|
||||
"id": 14,
|
||||
"achieveTaskId": 14,
|
||||
"tab": 1,
|
||||
"tabName": "足迹",
|
||||
"subTab": 1,
|
||||
"subTabName": "登陆",
|
||||
"taskType": 1,
|
||||
"taskParam": "120&",
|
||||
"group": 1,
|
||||
"achieveTaskName": "情深义重·柒",
|
||||
"taskinfo": "累计登录120天",
|
||||
"condition": 120,
|
||||
"taskReward": 0,
|
||||
"point": 70
|
||||
},
|
||||
{
|
||||
"id": 15,
|
||||
"achieveTaskId": 15,
|
||||
"tab": 1,
|
||||
"tabName": "足迹",
|
||||
"subTab": 1,
|
||||
"subTabName": "登陆",
|
||||
"taskType": 1,
|
||||
"taskParam": "150&",
|
||||
"group": 1,
|
||||
"achieveTaskName": "情深义重·捌",
|
||||
"taskinfo": "累计登录150天",
|
||||
"condition": 150,
|
||||
"taskReward": 0,
|
||||
"point": 80
|
||||
},
|
||||
{
|
||||
"id": 16,
|
||||
"achieveTaskId": 16,
|
||||
"tab": 1,
|
||||
"tabName": "足迹",
|
||||
"subTab": 1,
|
||||
"subTabName": "登陆",
|
||||
"taskType": 1,
|
||||
"taskParam": "200&",
|
||||
"group": 1,
|
||||
"achieveTaskName": "情深义重·玖",
|
||||
"taskinfo": "累计登录200天",
|
||||
"condition": 200,
|
||||
"taskReward": 0,
|
||||
"point": 90
|
||||
}
|
||||
]
|
||||
@@ -153,7 +153,7 @@
|
||||
},
|
||||
{
|
||||
"id": 19,
|
||||
"name": "HERO_WAKEUP",
|
||||
"name": "HERO_WAKE_UP",
|
||||
"mean": "武将觉醒",
|
||||
"type": "1&",
|
||||
"template": "<color=#a49a48>恭喜</color><color=#c08834>%d</color><color=#c08834>,成功将</color><color=#f03420>%d</color><color=#c08834>觉醒</color>",
|
||||
|
||||
Reference in New Issue
Block a user