const ThemeManager = require("../utils/ThemeManger"); const { RoomState, GameNotificationKey, WechatShareType } = require("../utils/GameEnum"); const GameModule = require("../utils/GameModule"); const TapTapTool = require("../utils/TapTapTool"); const WeChat = require('../net/WeChat'); const HomeApi = require('../net/HomeApi'); const DWTool = require('../utils/DWTool'); cc.Class({ extends: cc.Component, properties: { // Public Properties bgNode: cc.Node, /** 当前显示的图片 */ buildSprite: cc.Sprite, /** 柱子 */ pillarTop: cc.Sprite, pillarBottom: cc.Sprite, pillarRight: cc.Sprite, pillarLeft: cc.Sprite, bottomBg: cc.Sprite, lockBtnFrames: [cc.SpriteFrame], /** 升级按钮的两种状态图 */ updateBtnFrames: [cc.SpriteFrame], /** 未解锁状态的节点 */ lockNode: cc.Node, /** 需要花费所有金币 */ costLabel: cc.Label, /** 未解锁的建筑名称 */ unLockBuildName: cc.RichText, /** 未解锁需要花费多少金币 */ unlockRichText: cc.RichText, /** 未解锁需要总部等级 */ unlockLevelLabel: cc.Label, /** 建筑昵称 */ buildNameLabel: cc.Label, /** 这里当做升级建筑按钮 */ updateBtn: cc.Node, /** 看广告或者分享群免费升级 */ videoBtn: cc.Button, videoRichText: cc.RichText, /** 解锁按钮 */ lockBtn: cc.Sprite, /** 将要解锁建筑的类型图 */ unlockBuildingType: cc.Sprite, lockBottomNode: cc.Node, /** 等级进度条 */ levelProgressBar: cc.ProgressBar, /** 生产了多少金币 */ rateProgressLabel: cc.Label, /** 下一级生产多少金币 */ nextRateLabel: cc.Label, openDoorSkeletion: sp.Skeleton, updateSkeletion: sp.Skeleton, // 满级提示 maxNode: cc.Node, // artistNode: cc.Node, // artistMan: cc.Prefab, awardWrap: cc.Node, awardPrefab: cc.Prefab, _itemId: 0, skillEfcNode: cc.Node, coupletLeftSrpite: cc.Sprite, coupletRightSrpite: cc.Sprite, //对联数组 coupletFrames: [cc.SpriteFrame] }, // LIFE-CYCLE CALLBACKS: onLoad () { this.setupUI(); this.openDoorSkeletion.setCompleteListener(() => { // 升级建筑 this.updateBuilding(); GameEvent.fire(GameNotificationKey.PlaySuccessAnimation, true); }); //点击解锁建筑 let self = this; this.unlockBuildingEvent = _.debounce(() => { // 如果当前不够钱, 点击不生效 if (!TapTapTool.compare(GameModule.userInfo.gold, self.data.unlockScore)) { return; } // 点完立刻隐藏 self.lockBtn.node.active = false; let position = self.lockBtn.node.convertToWorldSpace(cc.v2(self.lockBtn.node.width / 2, self.lockBtn.node.height / 2)); GameEvent.fire(GameNotificationKey.PlayUpdateCoinAnimation, position); self.openDoorSkeletion.setAnimation(1, "changjing_kaiqi2"); self.lockBottomNode.runAction(cc.fadeOut(0.7)); self.lockBottomNode.active = false; }, 1000, true); this.isFullUpdate = false; this.longCount = 0; //点击升级建筑 this.updateBtn.on(cc.Node.EventType.TOUCH_START, () => { if (!this._isTouch) { this._isTouch = true; this.schedule(this.longUpdateBuilding, 0.3); } }, this); this.updateBtn.on(cc.Node.EventType.TOUCH_CANCEL, () => { this._isTouch = false; this.unschedule(this.longUpdateBuilding, this); this.isFullUpdate = false; this.longCount = 0 }, this); this.updateBtn.on(cc.Node.EventType.TOUCH_END, () => { this._isTouch = false; this.updateBuildingEvent(); this.unschedule(this.longUpdateBuilding, this); this.isFullUpdate = false; this.longCount = 0 }, this); this.setupEventListener(); }, //长按升级建筑 longUpdateBuilding() { this.updateBuildingEvent(); this.longCount += 1; if (this.longCount > 5 && !this.isFullUpdate) { this.unschedule(this.longUpdateBuilding, this); this.isFullUpdate = true; this.schedule(this.longUpdateBuilding, 0.2); } }, setupUI() { this._adState = GameGlobal._adVideoState; this.refreshWatchVideoUI(); this.humanList = []; this.humanPool = new cc.NodePool(); for (let i = 0; i < 5; i++) { let artist = cc.instantiate(this.artistMan); this.humanPool.put(artist); this.humanList.push(artist); } }, setupEventListener() { GameEvent.on(GameNotificationKey.AdUpdateStateNotification, this, (adState, callBack) => { if (adState === 3 && callBack.type != undefined && callBack.type == 'updateRoom') { this.finishVideoOrShare(callBack.roomId); } if (adState === 0 || adState === 1) { this.initRoomAd(); } this.videoBtn.interactable = true; }); }, initRoomAd() { if (!CC_WECHATGAME || window.tt == undefined) { return; } //// 说明有广告 if (GameGlobal._adVideoState == 0) { this._adState = 2; } else if (GameGlobal._adVideoState === 1) { this._adState = 1; } this.refreshWatchVideoUI(); }, ///观看广告或者分享获取升级建筑 watchVideoOrShare() { if (CC_WECHATGAME) { if (this._adState == 1) { this.videoBtn.interactable = false; GameEvent.on(GameNotificationKey.ShowShareAction, this, (type, isOk) => { if (type == WechatShareType.UpRoomLevel) { if (isOk) { this.finishVideoOrShare(this.data.roomId); } else { this.videoBtn.interactable = true; } GameEvent.off(GameNotificationKey.ShowShareAction, this); } }); WeChat.shareAction(WechatShareType.UpRoomLevel, () => { }, () => { this.videoBtn.interactable = true; console.log('分享失败或取消'); }); } else if (this._adState == 2) { this.videoBtn.interactable = false; let adObject = new Object(); adObject.type = 'updateRoom'; adObject.roomId = this.data.roomId; GameGlobal._adVideo.showVideo(adObject); } } }, finishVideoOrShare(roomId) { if (this.data.roomId == roomId) { HomeApi.reportInformation(2, () => { GameGlobal._upRoomInfo.count += 1; /// 时间重置为5分钟 GameGlobal._upRoomInfo.cdTime = 5 * 60 * 1000; this.updateBuildingEvent(true); this.refreshWatchVideoUI(); this.videoBtn.interactable = true; }, (code, msg) => { this.videoBtn.interactable = true; }); } }, //刷新观看视频或者分享文案 refreshWatchVideoUI() { if (this._adState == 1) { if (window.tt != undefined) { this.videoRichText.string = '分享\n免费升级'; } else { this.videoRichText.string = '分享到群\n免费升级'; } } else if (this._adState == 2) { this.videoRichText.string = '看广告\n免费升级'; } }, //每帧更新数据 update (dt) { if (this.data) { // 不断刷新界面 this.layout(this.data); } }, updateItem(data, itemId, resetCallback) { if (!isNaN(itemId)) { // if (this._itemId == itemId && itemId != 0) { // return; // } this._itemId = itemId; } if (typeof data != 'object') { return; } if (resetCallback) { this.resetCallback = resetCallback; } this.data = data; this.buildNameLabel.string = `等级${data.level} ${data.name}` ; this.refreshTheme(); this.layout(data); // 配置界面上的奖励礼包 this.configAward(); //升级房间时不用刷新人物 if (!isNaN(itemId)) { this.artistListLayout(); } }, layout(data) { // console.log(GameModule.skill.isUsingSkill3); // 判断是否有下一级, 没有的话就是满级 if (data.hasNext === 1 && data.level < GameGlobal.BuildingManager.getLevelCount(data.roomId)) { // 判断是否已经解锁 if (data.isUnlocked) { let ratio = data.level % 25; this.levelProgressBar.progress = ratio / 25; // let gold1 = TapTapTool.goldStrToClass(data.gold1); let gold2 = TapTapTool.goldStrToClass(data.gold2); let roomMt = TapTapTool.goldStrToClass(data.roomMt); var secondGold = TapTapTool.multiple(gold1,data.level); secondGold = TapTapTool.add(secondGold, gold2); var nextGold = TapTapTool.multiple(gold1,(data.level+1)); nextGold = TapTapTool.add(nextGold, gold2); let nextDiffer = TapTapTool.sub(nextGold, secondGold); secondGold = TapTapTool.multiple(secondGold,roomMt); secondGold = TapTapTool.multiple(secondGold, GameModule.skill.multiple); secondGold = TapTapTool.multiple(secondGold, GameModule.userInfo.perpetualMt); secondGold = TapTapTool.multiple(secondGold, {'n': GameModule.shop.multiple, 'e': 0}); this.rateProgressLabel.string = `${TapTapTool.parseToString(secondGold)}/秒`; nextDiffer = TapTapTool.multiple(nextDiffer,roomMt); nextDiffer = TapTapTool.multiple(nextDiffer, GameModule.skill.multiple); nextDiffer = TapTapTool.multiple(nextDiffer, {'n': GameModule.shop.multiple, 'e': 0}); nextDiffer = TapTapTool.multiple(nextDiffer, GameModule.userInfo.perpetualMt); this.nextRateLabel.string = `+${TapTapTool.parseToString(nextDiffer)}/秒`; this.lockNode.active = false; this.costLabel.string = TapTapTool.parseToString(data.nextUpGold); // 判断是否有足够的金额解锁 if (TapTapTool.compare(GameModule.userInfo.gold, data.nextUpGold)) { this.setState(RoomState.Update); } else { let isAd = DWTool.checkIsOldUser() && GameGlobal._upRoomInfo != undefined && GameGlobal._upRoomInfo.count < GameGlobal._upRoomInfo.maxCount && GameGlobal._upRoomInfo.cdTime <= 0; if (isAd) { this.setState(RoomState.WatchVideo); } else { this.setState(RoomState.UnLock); } } } else { this.lockNode.active = true; this.costLabel.string = 0; this.unLockBuildName.string = `${data.name}`; let unLockData = TapTapTool.goldStrToClass(data.unlockScore); this.unlockRichText.string = ` ${TapTapTool.parseToString(unLockData)}`; // 判断是否有足够的金额解锁 if (TapTapTool.compare(GameModule.userInfo.gold, unLockData) && GameModule.userInfo.buildingLevel >= data.buildingLevel) { this.unlockBuildingType.node.active = true; this.lockBtn.spriteFrame = this.lockBtnFrames[1]; this.lockBtn.node.getComponent(cc.Button).interactable = true; } else { this.unlockBuildingType.node.active = false; this.lockBtn.spriteFrame = this.lockBtnFrames[0]; this.lockBtn.node.getComponent(cc.Button).interactable = false; } if (data.buildingLevel > 0) { this.unlockLevelLabel.node.active = true; this.unlockLevelLabel.string = `需要总部等级${data.buildingLevel}级`; } else { this.unlockLevelLabel.node.active = false; this.unlockLevelLabel.string = ''; } this.setState(RoomState.Lock); } } else { this.rate = data.rate; this.levelProgressBar.progress = 1.0; this.setState(RoomState.Full); let gold1 = TapTapTool.goldStrToClass(data.gold1); let gold2 = TapTapTool.goldStrToClass(data.gold2); let roomMt = TapTapTool.goldStrToClass(data.roomMt); var secondGold = TapTapTool.multiple(gold1,data.level); secondGold = TapTapTool.add(secondGold, gold2); secondGold = TapTapTool.multiple(secondGold,roomMt); this.rateProgressLabel.string = `${TapTapTool.parseToString(secondGold)}/秒`; } //使用技能3的时候楼层增加对联效果 if (data.isUnlocked && GameModule.skill.isUsingSkill3) { //大于0为单层显示对联 if (GameModule.skill.skill3Floor > 0) { if (this.data.roomId % 2 == 0) { this.skillEfcNode.active = false; } else { if (this.skillEfcNode.active == false) { this.skillEfcNode.active = true; let arr = this.randNum(0,(this.coupletFrames.length - 1),2); this.coupletLeftSrpite.spriteFrame = this.coupletFrames[arr[0]]; this.coupletRightSrpite.spriteFrame = this.coupletFrames[arr[1]]; } } } else { if (this.data.roomId % 2 == 0) { if (this.skillEfcNode.active == false) { this.skillEfcNode.active = true; let arr = this.randNum(0,(this.coupletFrames.length - 1),2); this.coupletLeftSrpite.spriteFrame = this.coupletFrames[arr[0]]; this.coupletRightSrpite.spriteFrame = this.coupletFrames[arr[1]]; } } else { this.skillEfcNode.active = false; } } } else { this.skillEfcNode.active = false; } }, randNum(min, max, num) { var arr = [], t; function fn(i) { for (i; i < num; i++) { t = parseInt(Math.random() * (max - min + 1) + min); for(var k in arr) { if (arr[k] == t) { fn(i); break; } } arr[i] = t; } } fn(0); return arr }, //根据房间不同状态显示不同界面 setState(state) { if (this.state === state) { return; } switch (state) { case RoomState.Lock: this.openDoorSkeletion.node.active = true; this.openDoorSkeletion.clearTracks(); this.openDoorSkeletion.setToSetupPose(); this.lockBtn.node.active = true; this.lockBottomNode.stopAllActions(); this.lockBottomNode.opacity = 255; this.lockBottomNode.active = true; this.lockNode.active = true; this.updateBtn.active = false; this.updateBtn.getComponent(cc.Button).interactable = false; this.updateBtn.getComponent(cc.Sprite).spriteFrame = this.updateBtnFrames[0]; this.maxNode.active = false; this.videoBtn.node.active = false; this._isTouch = false; this.unschedule(this.longUpdateBuilding, this); break; case RoomState.UnLock: this.openDoorSkeletion.node.active = false; this.lockBtn.node.active = false; this.lockBottomNode.active = false; this.updateBtn.active = true; this.lockNode.active = false; this.updateBtn.getComponent(cc.Button).interactable = false; this.updateBtn.getComponent(cc.Sprite).spriteFrame = this.updateBtnFrames[0]; this.maxNode.active = false; this.videoBtn.node.active = false; this._isTouch = false; this.unschedule(this.longUpdateBuilding, this); break; case RoomState.Update: this.openDoorSkeletion.node.active = false; this.lockBtn.node.active = false; this.lockBottomNode.active = false; this.updateBtn.active = true; this.lockNode.active = false; this.updateBtn.getComponent(cc.Sprite).spriteFrame = this.updateBtnFrames[1]; this.updateBtn.getComponent(cc.Button).interactable = true; this.maxNode.active = false; this.videoBtn.node.active = false; break; case RoomState.Full: this.openDoorSkeletion.node.active = false; this.lockBtn.node.active = false; this.lockBottomNode.active = false; this.lockNode.active = false; this.maxNode.active = true; this.updateBtn.active = false; this.videoBtn.node.active = false; this._isTouch = false; this.unschedule(this.longUpdateBuilding, this); break; case RoomState.WatchVideo: this.openDoorSkeletion.node.active = false; this.lockBtn.node.active = false; this.lockBottomNode.active = false; this.updateBtn.active = true; this.lockNode.active = false; this.updateBtn.getComponent(cc.Button).interactable = false; this.updateBtn.getComponent(cc.Sprite).spriteFrame = this.updateBtnFrames[0]; this.maxNode.active = false; this.updateBtn.active = false; this.videoBtn.node.active = true; this._isTouch = false; this.unschedule(this.longUpdateBuilding, this); break; default: break; } this.state = state; }, refreshTheme() { ThemeManager.setItemBuildSpriteFrame(this.data.roomId, this.buildSprite); let lockBottomSprite = this.lockBottomNode.getComponent(cc.Sprite); ThemeManager.setItemLockDownSpriteFrame(lockBottomSprite); }, setListViewAdapter(listViewAdapter) { this._listViewAdapter = listViewAdapter; }, deleteItem() { this._listViewAdapter.removeItem(this); }, // 解锁建筑事件 unlockBuilding() { this.unlockBuildingEvent(); }, updateBuildingEvent(isFree = false) { if (this.state === RoomState.Update || this.state === RoomState.WatchVideo) { let position = this.updateBtn.convertToWorldSpace(cc.v2(this.updateBtn.width / 2, this.updateBtn.height / 2)); GameEvent.fire(GameNotificationKey.PlayUpdateCoinAnimation, position); this.updateBuilding(isFree); if (!this.updateSkeletion.node.active) { this.updateSkeletion.node.active = true; this.updateSkeletion.setAnimation(0, "changjing_sj"); this.updateSkeletion.setCompleteListener(() => { this.updateSkeletion.node.active = false; }); } } }, // 升级建筑 updateBuilding(isFree) { //判断是否免费升级 if (!isFree) { //升级前判断金币是否足够 if (this.data.isUnlocked) { if (!TapTapTool.compare(GameModule.userInfo.gold, this.data.nextUpGold)) { return; } } else { if (!TapTapTool.compare(GameModule.userInfo.gold, this.data.unlockScore)) { return; } } } GameModule.audioMng.playUpdateBuilding(); // 从配置文件里获取 let maxLevel = GameGlobal.BuildingManager.getLevelCount(this.data.roomId); let nextLevel = this.data.level + 1; let level = nextLevel > maxLevel ? maxLevel : nextLevel; let buildModel = GameGlobal.BuildingManager.getBuildingInfo(this.data.roomId, level); buildModel.roomStars = this.data.roomStars; buildModel.roomMt = this.data.roomMt; buildModel.awardCount = this.data.awardCount; buildModel.isUnlocked = 1; if (this.resetCallback) { this.resetCallback(buildModel, this._itemId); } if (this.awardScript) { this.awardScript.roomLevel = level; } if (this.data.isUnlocked) { // 当前楼层已解锁 if (!isFree) { GameModule.userInfo.gold = TapTapTool.sub(GameModule.userInfo.gold, this.data.nextUpGold); } GameModule.userInfo.updateRecordModify(buildModel); } else { // 当前楼层未解锁 GameModule.userInfo.gold = TapTapTool.sub(GameModule.userInfo.gold, this.data.unlockScore); GameModule.userInfo.recordUnlockModify.push(buildModel); // 成功解锁后立刻调用上报,提交数据 GameModule.userInfo.doReport(); GameEvent.fire(GameNotificationKey.UnlockLevelHome,buildModel); } this.updateItem(buildModel); GameEvent.fire(GameNotificationKey.RefreshBuildingData, buildModel); }, artistListLayout() { for (let child of this.humanList) { this.humanPool.put(child); } let self = this; let addHuman = function (artist, index) { let human = null; if (self.humanPool.size() > 0) { human = self.humanPool.get(); } else { human = cc.instantiate(self.artistMan); self.humanList.push(human); } self.artistNode.addChild(human); let direction = (index > 0) ? 1 : -1; human.getComponent('ArtistMan').init(artist, direction); }; if (this.data.isUnlocked && this.data.roomStars && this.data.roomStars.length > 0) { let direction = (Math.random() - 0.5) * 2; for(let i = 0; i < this.data.roomStars.length; ++i) { let starId = this.data.roomStars[i]; let artist = new Object(); artist.starId = starId; addHuman(artist, direction); direction = -direction; } } }, configAward() { //每25级可以领取一次里程碑加成奖励 let awardCount = this.data.awardCount; let totalCount = Math.floor(this.data.level / 25); if (awardCount < totalCount) { if (!this.isHasAward) { let awardNode = cc.instantiate(this.awardPrefab); this.awardScript = awardNode.getComponent('LevelHomeAward'); this.awardWrap.addChild(awardNode); this.showProp(); } else { if (parseInt(this.data.level) % 25 == 0) { this.showProp(); } } } else { if (this.awardScript) { this.isHasAward = false; this.awardScript.node.position = cc.v2(150, -10); this.awardScript.node.active = false; this.awardScript.isPlay = false; this.awardScript.isPlaying = false; } } }, hideAward() { this.isHasAward = false; this.awardScript.node.position = cc.v2(150, -10); this.awardScript.node.active = false; this.awardScript.isPlay = false; this.awardScript.isPlaying = false; this.configAward(); }, showProp(isPlayAnimation=true) { if (!this.isHasAward) { this.isHasAward = true; this.awardScript.init(this.data.roomId, this.data.level, (awardCount) => { // 显示领取动画 this.data.awardCount = awardCount; this.hideAward(); }); if (isPlayAnimation) { this.awardScript.showAnimation(); } else { this.awardScript.node.position = cc.v2(150, -10); this.awardScript.node.active = true; } } else { this.awardScript.updateAnimation(); } }, });