PageRank.ts 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212
  1. import { _decorator, Component, Node } from "cc";
  2. import BaseUI from "../../scripts/base/BaseUI";
  3. import { Tips } from "../../scripts/mgr/Tips";
  4. import { CommonTabsTitle, OnTabClickListener } from "../common/CommonTabsTitle";
  5. import RankM, { RankDto } from "../../scripts/api/RankM";
  6. import Utils from "../../scripts/utils/Utils";
  7. import UserM from "../../scripts/api/UserM";
  8. import { ScrollView } from "cc";
  9. import AB from "../../scripts/base/AB";
  10. import ConfigM, { Config, ConfigGrade } from "../../scripts/api/ConfigM";
  11. import { instantiate } from "cc";
  12. import { GradeItem } from "../item/GradeItem";
  13. import { Prefab } from "cc";
  14. import { RankPlayerItem } from "../item/RankPlayerItem";
  15. import { HelpLayer } from "../layer/HelpLayer";
  16. import { TipsData, TipsLayer } from "../layer/TipsLayer";
  17. import { Vec2 } from "cc";
  18. import { HelpImage, HelpType } from "../layer/HelpImage";
  19. const { ccclass, property } = _decorator;
  20. @ccclass("PageRank")
  21. export class PageRank extends BaseUI implements OnTabClickListener {
  22. public static readonly RankTypeSeason = 0;
  23. public static readonly RankTypeTotal = 1;
  24. private tabs: CommonTabsTitle;
  25. private rank_people_layout: Node;
  26. protected onLoad(): void {
  27. super.onLoad();
  28. this.tabs = this.FindAs("CommonTabsTitle", CommonTabsTitle);
  29. this.rank_people_layout = this.FindNode("rank_people_layout");
  30. // 获取内部的水平ScrollView
  31. let gradeScrollView = this.FindAs("GradeItemScrollView", ScrollView);
  32. // 最简单的方式:设置内部ScrollView不取消内部事件,让外部ScrollView可以正常响应垂直滑动
  33. if (gradeScrollView) {
  34. gradeScrollView.cancelInnerEvents = false;
  35. }
  36. let tab_titles = [
  37. Utils.setI18nLabel("Rank.Season"),
  38. Utils.setI18nLabel("Rank.Total"),
  39. ];
  40. this.tabs.init(tab_titles, this);
  41. // this.refresh();
  42. this.initStaticGrades();
  43. }
  44. public onShow(): void {
  45. this.refresh();
  46. }
  47. async refresh() {
  48. let data = await this.init();
  49. this.initTitles();
  50. let grade = data.rankInfo.badgeId;
  51. if (grade <= 0) {
  52. grade = 8;
  53. }
  54. console.error("grade", grade);
  55. this.initRankPeoples(grade);
  56. // grade = 3;
  57. this.refreshMyGradeInGradeList(grade);
  58. }
  59. private refreshMyGradeInGradeList(grade: number) {
  60. let s = this.FindAs("GradeItemScrollView", ScrollView);
  61. let self = this;
  62. setTimeout(() => {
  63. s.scrollToOffset(new Vec2(100 * (8 - grade), 0), 0.1);
  64. self.refreshGradeSelected(grade);
  65. }, 1000);
  66. }
  67. private refreshGradeSelected(grade: number) {
  68. this.getComponentsInChildren(GradeItem).forEach((item) => {
  69. item.setSelected(item && item.data.id == grade);
  70. });
  71. let Allocation = ConfigM.ins.getGradeAllocation(grade);
  72. let PogBooster = ConfigM.ins.getGrade(grade)?.addition || 0;
  73. let desc = `${Allocation}% TOG Allocation + ${PogBooster}% POG Booster from Badge NFT`;
  74. this.setText("lbl_rank_add_tips", desc);
  75. this.setText(
  76. "lbl_grade_detail_grade_name",
  77. ConfigM.ins.getGrade(grade)?.name || "ROOKIE"
  78. );
  79. }
  80. private _type: number = PageRank.RankTypeSeason;
  81. async initRankPeoples(grade: number) {
  82. let tpl = await AB.ins.loadPrefab("prefab/item/RankPlayerItem");
  83. let data = await RankM.ins.rankPeoples(this._type, grade);
  84. this.rank_people_layout.removeAllChildren();
  85. if (!data || !data.rankList || data.rankList.length <= 0) {
  86. return;
  87. }
  88. for (let i = 0; i < data.rankList.length; i++) {
  89. let item = instantiate(tpl);
  90. item.getComponent(RankPlayerItem).init(data.rankList[i]);
  91. this.rank_people_layout.addChild(item);
  92. }
  93. }
  94. initTitles() {
  95. this.setText(
  96. "lbl_t_current_season",
  97. Utils.setI18nLabel("Rank.CurrentSeason")
  98. );
  99. this.setText("lbl_t_season_desc", Utils.setI18nLabel("Rank.TotalPogTip"));
  100. this.setText("lbl_t_sent", Utils.setI18nLabel("Rank.TodaySend"));
  101. this.setText("lbl_t_remaining", Utils.setI18nLabel("Rank.TodayRemaining"));
  102. this.setText("lbl_rank_my_tips", Utils.setI18nLabel("Rank.MyRankTip"));
  103. this.setText(
  104. "lbl_online_time_tips",
  105. Utils.setI18nLabel("Rank.WeekTimeTip")
  106. );
  107. this.setText(
  108. "lbl_t_grade_title",
  109. Utils.setI18nLabel("Rank.AllTankSegmentTitle")
  110. );
  111. }
  112. onGradeClick(data: ConfigGrade) {
  113. this.refreshGradeSelected(data.id);
  114. this.initRankPeoples(data.id);
  115. }
  116. async initStaticGrades() {
  117. let s = this.FindAs("GradeItemScrollView", ScrollView);
  118. s.content.removeAllChildren();
  119. let p = await AB.ins.loadPrefab("prefab/item/GradeItem");
  120. let grades = ConfigM.ins.Grades();
  121. for (let i = 0; i < grades.length; i++) {
  122. let item = instantiate(p);
  123. item
  124. .getComponent(GradeItem)
  125. .init(grades[i], this.onGradeClick.bind(this));
  126. s.content.addChild(item);
  127. }
  128. }
  129. async init(): Promise<RankDto> {
  130. this.FindNode("pog_info").active = this._type == PageRank.RankTypeSeason;
  131. let data: RankDto = await RankM.ins.rankData(this._type);
  132. this.ui(data);
  133. return data;
  134. }
  135. async ui(data: RankDto) {
  136. this.setText("lbl_total_pog", "" + Utils.formatNumber(data.seasonPog, 0));
  137. this.setText(
  138. "lbl_today_send",
  139. "" + Utils.formatNumber(data.dailyGrantPog, 0)
  140. );
  141. this.setText("lbl_remain_pog", "" + Utils.formatNumber(data.remainPog, 0));
  142. // let gradeAddValue = ConfigM.ins.getGradeAddValue(data.rankInfo.rank);
  143. let grade = data.rankInfo.badgeId;
  144. let gradeConfig = ConfigM.ins.getGrade(grade);
  145. if (gradeConfig != null) {
  146. this.setText(
  147. "lbl_rank_my",
  148. gradeConfig.name +
  149. " #" +
  150. data.rankInfo.rank +
  151. " +" +
  152. gradeConfig.addition +
  153. "%"
  154. );
  155. } else {
  156. this.setText("lbl_rank_my", "ROOKIE #" + data.rankInfo.rank);
  157. }
  158. this.setText("lbl_online_time", Utils.getTimeStrByS(data.onlineTime));
  159. this.setText("lbl_season_time", UserM.ins.getSeasonEndTimeText());
  160. }
  161. public onTabClick(index: number) {
  162. // this._type = index;
  163. // this.init();
  164. Tips.show("ComingSoon");
  165. this.tabs.setSelect(this._type);
  166. }
  167. protected simpleOnBtnClick(name: string): void {
  168. switch (name) {
  169. case "btn_rank_tips":
  170. HelpImage.show(HelpType.Rank);
  171. break;
  172. case "btn_utility":
  173. let content = `Check out POG Economy & Leaderboard Mechanics from Litepaper: `;
  174. let data = TipsLayer.build(content);
  175. data.link = `https://telgather.gitbook.io/telgather-litepaper/telgather-economy/pog-economy-and-leaderboard-mechanics`;
  176. data.show();
  177. break;
  178. }
  179. }
  180. }