import { _decorator, Component, Sprite, Enum } from "cc"; import { DataSystem } from "../core/data/DataSystem"; import { ConfigData } from "../data/ConfigData"; import { platform } from "../data/jsb/platform"; import { UserData } from "../data/UserData"; import { UserHeroData } from "../hero/UserHeroData"; import { TaskData } from "../task/TaskData"; import { RedPointData } from "./RedPointData"; const { ccclass, property } = _decorator; /** * 红点类型 */ export enum RedPointType { /** * 兵营是否可升级 */ Camp, /** * 是否有可升星、合成武将 */ Hero, /** * 是否有可领取奖励的任务 */ Task, /** * 是否有可领取的图鉴奖励 */ HeroReward, /** * 是否有抽奖次数 */ Draw, /** * 是否有征收粮食次数和奖励 */ GrainLevies, /** * 是否有贡献可领取 */ ContributionReward, /** *是否可领取切磋宝箱 */ ReceiveFightBox } /** * 红点组件 * @author 袁浩 * @description 给玩家提示 */ @ccclass("RedPoint") export class RedPoint extends Component { @property({ tooltip: "红点类型", type: Enum(RedPointType) }) public type: RedPointType = RedPointType.HeroReward; /** * 某些红点是在列表项中的,则需要传递此值 * 图鉴列表项:武将编号、任务列表:任务索引、征粮:索引 */ public param: number; private icon: Sprite; start() { this.icon = this.getComponent(Sprite); this.icon.enabled = false; //首次加载判断一次 let data = DataSystem.getData(RedPointData); this.checkHerosReward(data); this.checkDraw(data); this.checkGrainLevies(data); this.checkTask(); this.checkCamp(); this.checkHeros(); this.checkFission(data); this.checkFightBox(data); } update() { let data = DataSystem.getData(RedPointData); DataSystem.watch(RedPointData, "herosReward") && this.checkHerosReward(data); DataSystem.watch(RedPointData, "canDraw") && this.checkDraw(data); DataSystem.watch(RedPointData, "grainLevies") && this.checkGrainLevies(data); DataSystem.watch(TaskData, "hasReceived") && this.checkTask(); DataSystem.watch(UserData, "prestige") && this.checkCamp(); DataSystem.watch(RedPointData, "checkFission") && this.checkFission(data); DataSystem.watch(UserData, "contribution") && this.checkFission(data); DataSystem.watch(RedPointData, "canReceiveFightBox") && this.checkFightBox(data); this.checkHeros(); } private checkCamp() { if (this.type == RedPointType.Camp) { let userData = DataSystem.getData(UserData); let barrackConfig = DataSystem.getData(ConfigData).get('barrack'); if (barrackConfig[userData.campLv + 1]) {//如果没满级 let needPrestige = barrackConfig[userData.campLv].cost; this.icon.enabled = userData.prestige >= needPrestige; } else { this.icon.enabled = false; } } } /** * 升星验证 */ private checkHeros() { if (this.type == RedPointType.Hero) { let userHero = DataSystem.getData(UserHeroData); let canUpstar = false; let canCompose = false; for (let i = 0; i < userHero.haveHeros.length; i++) { let hero = DataSystem.getData(UserHeroData).get(userHero.haveHeros[i]); let starConfig = DataSystem.getData(ConfigData).get("star")[hero.server.star]; if (starConfig && hero.server.chip >= starConfig.nextReq) { canUpstar = true; break; } } for (let i = 0; i < userHero.notHavetHeros.length; i++) { let hero = DataSystem.getData(UserHeroData).get(userHero.notHavetHeros[i]); if (hero.server && !hero.server.active && hero.server.chip >= hero.client.needChip) { canCompose = true; } } this.icon.enabled = canUpstar || canCompose; } } /** * 图鉴奖励验证 * @param data */ private checkHerosReward(data: RedPointData) { if (this.type == RedPointType.HeroReward) { this.icon.enabled = data.herosReward.length > 0; } } /** * 抽奖验证 * @param data */ private checkDraw(data: RedPointData) { if (this.type == RedPointType.Draw) { this.icon.enabled = data.canDraw; } } /** * 征粮验证 * @param data */ private checkGrainLevies(data: RedPointData) { if (this.type == RedPointType.GrainLevies) { let hasLeviesReceive = data.grainLevies.times > 0; if (!hasLeviesReceive) { for (let i = 0; i < data.grainLevies.leviesDatas.length; i++) { if (!data.grainLevies.leviesDatas[i].isReceive) { hasLeviesReceive = true; break; } } } this.icon.enabled = hasLeviesReceive; } } /** * 检查任务 * @param data */ private checkTask() { let data = DataSystem.getData(TaskData); if (this.type == RedPointType.Task) { this.icon.enabled = data.hasReceived; } } /** * 神台红点检查 * @param data */ private checkFission(data: RedPointData) { if (this.type == RedPointType.ContributionReward) { this.icon.enabled = data.checkFission; !this.icon.enabled && (this.icon.enabled = DataSystem.getData(UserData).contribution >= 3000); } } /** * 检查切磋宝箱 */ private checkFightBox(data: RedPointData) { if (this.type == RedPointType.ReceiveFightBox) { this.icon.enabled = data.canReceiveFightBox; } } }