BattleUIWindow.ts 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281
  1. import { _decorator, Component, Sprite, Label, Node, Prefab, instantiate, Button, random, log } from 'cc';
  2. import { Http } from '../../core/net/Http';
  3. import { ResourcesUtils } from '../../core/resourceManager/ResourcesUtils';
  4. import { OpenWindow } from '../../core/ui/window/OpenWindow';
  5. import { WindowManager } from '../../core/ui/window/WindowManager';
  6. import { WindowOpenMode } from '../../core/ui/window/WindowOpenMode';
  7. import { Log } from '../../core/utils/Log';
  8. import { MultipleType } from '../../Data/ADData';
  9. import { g } from '../../Data/g';
  10. import { platform } from '../../Data/platform';
  11. import { User } from '../../Data/User';
  12. import { BattleAvengeItem } from '../../Item/BattleAvengeItem';
  13. import { BattleFriendItem } from '../../Item/BattleFriendItem';
  14. import { BattleRole } from './BattleRole';
  15. const { ccclass, property } = _decorator;
  16. @ccclass('BattleUIWindow')
  17. export class BattleUIWindow extends Component {
  18. @property({ type: Node, tooltip: "切磋好友列表" })
  19. friendListNode: Node;
  20. @property({ type: Node, tooltip: "仇人列表" })
  21. avengeListNode: Node;
  22. @property({ type: Node, tooltip: "切磋好友列表content" })
  23. friendListContent: Node;
  24. @property({ type: Node, tooltip: "仇人列表content" })
  25. avengeListContent: Node;
  26. @property({ tooltip: "好友列表item预制体路径" })
  27. friendItemPrefab = "";
  28. @property({ tooltip: "仇人列表item预制体路径" })
  29. avengeItemPrefab = "";
  30. @property({ type: Http, tooltip: "消息控制" })
  31. http: Http;
  32. @property({ type: [Node], tooltip: "" })
  33. generalNode: Node[] = [];
  34. @property({ type: Label, tooltip: "当日次数文本" })
  35. dayBattleNumLabel: Label;
  36. @property({ type: Label, tooltip: "队伍人数文本" })
  37. myTeamNumLabel: Label;
  38. private battleData: Array<{ userID: number, lv: number, nickName: string, avator: string, isFriend: boolean, hasRedPacket: boolean, time: number, redPacketID: number }> = [];
  39. private _tabIndex: number = -1;
  40. start() {
  41. g.gameData.playAddMoneySound = false;
  42. g.gameData.hasNewRedPacketUpdate = g.gameData.hasBattleListUpdate = g.gameData.hasAvengeListUpdate = false;
  43. }
  44. public set tabIndex(value: number) {
  45. if (this._tabIndex == value) {
  46. return;
  47. }
  48. this._tabIndex = value;
  49. this._tabIndex == 1 ? this.onAvenge() : this.onBattle();
  50. }
  51. public get tabIndex() {
  52. return this._tabIndex;
  53. }
  54. update() {
  55. if (g.gameData.hasNewRedPacketUpdate || g.gameData.hasBattleListUpdate) {
  56. g.gameData.hasNewRedPacketUpdate = false;
  57. g.gameData.hasBattleListUpdate = false;
  58. if (this.tabIndex == 0) {
  59. this.onBattle();
  60. }
  61. }
  62. if (g.gameData.hasAvengeListUpdate) {
  63. g.gameData.hasAvengeListUpdate = false;
  64. if (this.tabIndex == 1) {
  65. this.onAvenge();
  66. }
  67. }
  68. if (g.gameData.hasBattleOverRefresh) {
  69. g.gameData.hasBattleOverRefresh = false;
  70. this.setBattleNum();
  71. }
  72. if (g.battleData.hasBattleTimesUpdate) {
  73. g.battleData.hasBattleTimesUpdate = false;
  74. this.onStartPlay();
  75. }
  76. }
  77. /**打开回调 */
  78. private async openHandler(data: any) {
  79. this.setBattleNum();
  80. // if (!g.gameData.hasRequestFriendData) {
  81. let getFriendResult = await this.http.send("/api/friend/GetOneLvFriends");//获取自己的好友信息
  82. if (!getFriendResult.code) {
  83. g.gameData.myFriendDatas = getFriendResult.data.friendDatas;
  84. g.gameData.myFriendDatas.sort((a: any, b: any): number => {
  85. return a.lv > b.lv ? -1 : 1;//好友等级高到低
  86. });
  87. } else {
  88. WindowManager.showTips(g.CodeMsg[getFriendResult.code]);
  89. }
  90. // let revengeResult = await this.http.send("/api/battle/GetRevenges");
  91. // if (!revengeResult.code) {
  92. // g.gameData.myAvengeDatas = revengeResult.data.revengeDatas;
  93. // g.gameData.myAvengeDatas.sort((a: any, b: any): number => {
  94. // return a.createTime > b.createTime ? -1 : 1;//优先最近战斗
  95. // });
  96. // } else {
  97. // WindowManager.showTips(g.CodeMsg[revengeResult.code]);
  98. // }
  99. // g.gameData.hasRequestFriendData = true;
  100. // }
  101. this.myTeamNumLabel.string = g.gameData.myFriendDatas.length + 1 + '人';
  102. let myMainGeneralData = null;
  103. let generals = g.gameData.getMyLocalData(g.userData.id).myLocalGenerals;
  104. if (!generals.length) {
  105. myMainGeneralData = { id: g.userData.id, lv: g.userData.lv, nickName: g.userData.nickName, avator: g.userData.avator };
  106. } else {
  107. generals.sort((a: any, b: any): number => {
  108. return a.generalLv > b.generalLv ? -1 : 1;//优先最近战斗
  109. });
  110. myMainGeneralData = { id: g.userData.id, lv: generals[0].generalLv, nickName: g.userData.nickName, avator: g.userData.avator };
  111. }
  112. //设置UI神将数据
  113. let nullData = { id: 0, lv: 0, nickName: '', avator: '' };
  114. this.generalNode[0].getComponent(BattleRole).setData(myMainGeneralData);
  115. this.generalNode[1].getComponent(BattleRole).setData(g.gameData.myFriendDatas.length > 0 ? g.gameData.myFriendDatas[0] : nullData);
  116. this.generalNode[2].getComponent(BattleRole).setData(g.gameData.myFriendDatas.length > 1 ? g.gameData.myFriendDatas[1] : nullData);
  117. this.tabIndex = data.tabIndex;
  118. }
  119. private async setBattleNum() {
  120. let result = await this.http.send("/api/battle/GetUserBattle");//获取出征信息
  121. if (!result.code) {
  122. g.gameData.battleRemainder = result.data.times;
  123. g.gameData.RemainderAddTimes = result.data.addTimes;
  124. g.gameData.RemainderHadAddTimes = result.data.hadAddTimes;
  125. this.dayBattleNumLabel.string = '' + (g.gameData.battleRemainder + g.gameData.RemainderHadAddTimes);
  126. } else {
  127. WindowManager.showTips(g.CodeMsg[result.code]);
  128. }
  129. }
  130. public onTabbarChange(t: Node, index: number): void {
  131. this.tabIndex = Number(index) - 1;
  132. }
  133. /**点击切磋tab */
  134. public onBattle() {
  135. this.friendListNode.active = true;
  136. this.avengeListNode.active = false;
  137. this.battleData = [];
  138. this.battleData.push({ userID: 0, lv: 0, nickName: '', avator: '', isFriend: false, hasRedPacket: false, time: 0, redPacketID: 0 });
  139. for (let i = 0; i < g.gameData.myFriendDatas.length; i++) {
  140. let data = g.gameData.myFriendDatas[i];
  141. if (data.lv > 7) {
  142. let itemData: any = { userID: data.id, lv: data.lv, nickName: data.nickName, avator: data.avator, isFriend: true, hasRedPacket: false, time: 0, redPacketID: 0 };
  143. this.battleData.push(itemData);
  144. }
  145. }
  146. let redPacketDatas = g.gameData.myRedPacketDatas.concat();
  147. for (let i = 0; i < redPacketDatas.length; i++) {//好友红包
  148. if (redPacketDatas[i].type == 1) {//切磋红包
  149. for (let j = 0; j < this.battleData.length; j++) {
  150. if (redPacketDatas[i].enemyID == this.battleData[j].userID) {
  151. this.battleData[j].hasRedPacket = true;
  152. this.battleData[j].time = redPacketDatas[i].canOpenTime;
  153. this.battleData[j].redPacketID = redPacketDatas[i].id;
  154. redPacketDatas.splice(i, 1);
  155. i--;
  156. break;
  157. }
  158. }
  159. }
  160. }
  161. for (let i = 0; i < redPacketDatas.length; i++) {//陌生玩家红包
  162. if (redPacketDatas[i].type == 1) {//切磋红包
  163. let itemData: any = {
  164. userID: redPacketDatas[i].enemyID,
  165. lv: redPacketDatas[i].enemyLv,
  166. nickName: redPacketDatas[i].enemyName,
  167. avator: redPacketDatas[i].enemyAvator,
  168. isFriend: false,
  169. hasRedPacket: true,
  170. time: redPacketDatas[i].canOpenTime,
  171. redPacketID: redPacketDatas[i].id,
  172. };
  173. this.battleData.push(itemData);
  174. }
  175. }
  176. this.friendListContent.removeAllChildren();
  177. this.addFriendItem();
  178. }
  179. /**复仇tab*/
  180. public onAvenge() {
  181. this.friendListNode.active = false;
  182. this.avengeListNode.active = true;
  183. this.avengeListContent.removeAllChildren();
  184. this.addAvengeItem();
  185. }
  186. public async addFriendItem() {
  187. for (let i = 0; i < this.battleData.length; i++) {
  188. let prefabData = await ResourcesUtils.load<Prefab>(this.friendItemPrefab, null, this.node);
  189. var itemNode = instantiate(prefabData);
  190. itemNode.parent = this.friendListContent;
  191. itemNode.getComponent(BattleFriendItem).setData(this.battleData[i], i == 0);
  192. }
  193. }
  194. public async addAvengeItem() {
  195. for (let i = 0; i < g.gameData.myAvengeDatas.length; i++) {
  196. let prefabData = await ResourcesUtils.load<Prefab>(this.avengeItemPrefab, null, this.node);
  197. var itemNode = instantiate(prefabData);
  198. itemNode.parent = this.avengeListContent;
  199. itemNode.getComponent(BattleAvengeItem).setData(g.gameData.myAvengeDatas[i]);
  200. }
  201. }
  202. /**打开盟友窗口 */
  203. public onOpenFriendWindow() {
  204. this.getComponent(OpenWindow).open(5);
  205. }
  206. /**点击加号 */
  207. public async onPlayVideo() {
  208. this.onStartPlay();
  209. }
  210. private async onStartPlay() {
  211. let result = await this.http.send("/api/ad/watchVideoAD");
  212. if (result.code == 0) {
  213. //播放视频
  214. let adData = await g.showRewardVideo();
  215. if (adData) {
  216. this.onVideoPlayOver();
  217. } else {
  218. //视频观看失败
  219. WindowManager.showTips("视频观看时间不足");
  220. }
  221. } else if (result.code == 108) {
  222. WindowManager.showTips("今日视频次数已用完,请明日再继续");
  223. } else {
  224. WindowManager.showTips("视频准备中,请稍后再试");
  225. }
  226. }
  227. /**点击发起挑战 */
  228. public async onInvite() {
  229. let result = await this.http.send("/api/app/share", {});
  230. if (result.code == 0) {
  231. platform.wxShare(result.data.url, result.data.title, result.data.descroption);
  232. } else {
  233. WindowManager.showTips("分享信息获取失败,请稍后再试");
  234. }
  235. }
  236. /**
  237. * 广告观看完毕
  238. */
  239. async onVideoPlayOver() {
  240. let result = await this.http.send("/api/wealth/AddDiamondForVideo", { multipleType: MultipleType.Battle, adData: g.adData });
  241. if (result.code == 0) {
  242. this.setBattleNum();
  243. if (result.data.addDiamond > 0) {
  244. WindowManager.open("Prefabs/Windows/神石领取界面", WindowOpenMode.NotCloseAndAdd, [result.data.addDiamond, -1]);
  245. }
  246. } else
  247. WindowManager.showTips(g.CodeMsg[result.code]);
  248. }
  249. /**
  250. * 关闭回调
  251. */
  252. public onClose() {
  253. WindowManager.close();
  254. g.gameData.isAddRole = true;
  255. }
  256. onDestroy() {
  257. g.gameData.playAddMoneySound = true;
  258. }
  259. }
  260. /**
  261. * (0表示随机,1表示好友, 2表示复仇, 3表示挑战)
  262. */
  263. export enum BattleType {
  264. RandomBattle,
  265. FriendBattle,
  266. avengeBattle,
  267. ChallengeBattle
  268. }