PlayerData.ts 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390
  1. import { ch } from "../../ch/ch";
  2. import { gui } from "../../core/ui/ui";
  3. import { Container } from "../../core/util_class/Container";
  4. import GameData from "../../core/util_class/GameData";
  5. import { Toast } from "../../core/util_class/Toast";
  6. export enum LvDir {
  7. none = 0,
  8. left = 1,
  9. right = 2,
  10. up = 3,
  11. down = 4,
  12. xCenter = 5,
  13. xOut = 6,
  14. yCenter = 7,
  15. yOut = 8,
  16. }
  17. //定义事件
  18. interface event_protocol {
  19. item_count(type: number, count: number): void;//道具数量改变
  20. chang_skin(type: number): void;//皮肤改变
  21. }
  22. //排行榜key
  23. export enum rand_type {
  24. floor = "floor",//最高层数
  25. day_lv = 'day_lv',//每日通关关数
  26. }
  27. //自定义数据
  28. export enum data_type {
  29. last_gift_sidebar = 'last_gift_sidebar',//最后一次侧边栏时间
  30. max_floor = 'max_floor',//最高层数
  31. coin = 'coin',//铜币
  32. life = 'life',//体力
  33. lv = 'lv',//当日所在关卡数
  34. is_win = 'is_win', // 连胜状态
  35. lv_dir = 'lv_dir' // 关卡方向状态
  36. }
  37. //每日数据
  38. export enum day_data_type {
  39. floor = 'floor',//每日完成
  40. try = 'try',//每日重试次数
  41. total_lv = 'total_lv',//每日通关数
  42. everyday_gift = 'everyday_gift',//每日获得礼包
  43. everyday_gift_redpoint = 'everyday_gift_redpoint',//每日获得礼包红点
  44. get_free_coin = 'get_free_coin',//获得免费金币
  45. get_free_lottery = 'get_free_lottery',//获得免费抽奖
  46. use_item = 'use_item',//使用道具
  47. watch_ad = 'watch_ad',//观看广告
  48. task_reward_state = 'task_reward_state',//任务奖励是否领取
  49. }
  50. //每周数据
  51. export enum week_data_type {
  52. sign_day = 'sign_day',//签到奖励
  53. }
  54. //每月数据
  55. export enum month_data_type {
  56. }
  57. export default class PlayerData extends GameData<data_type, day_data_type, week_data_type, month_data_type> {
  58. private static _instance: PlayerData;
  59. public event = ch.get_new_event<event_protocol>();
  60. //道具容器
  61. private items: Container = new Container();
  62. public provinceInfo: [number, string][] = []
  63. public static getInstance(gid: string, uid: string): PlayerData {
  64. if (!this._instance) {
  65. this._instance = new PlayerData(gid, uid, "PlayerData",
  66. new Map([
  67. [data_type.max_floor, { min: 1 }],
  68. [data_type.coin, { min: 0 }],
  69. [data_type.life, { min: 0, max: 5 }],
  70. [data_type.lv, { min: 1 }]
  71. ]),
  72. new Map([
  73. [day_data_type.floor, { min: 0 }],
  74. [day_data_type.try, { min: 0 }],
  75. [day_data_type.everyday_gift, { min: 0, max: 3 }],
  76. [day_data_type.everyday_gift_redpoint, { min: 0, max: 1 }],
  77. [day_data_type.get_free_coin, { min: 0, max: 1 }],
  78. [day_data_type.get_free_lottery, { min: 0, max: 1 }],
  79. [day_data_type.use_item, { min: 0, max: 3 }],
  80. [day_data_type.watch_ad, { min: 0, max: 8 }],
  81. ]),
  82. new Map([
  83. [week_data_type.sign_day, { min: 0, max: 7 }],
  84. ]));
  85. }
  86. return this._instance;
  87. }
  88. //数据初始化
  89. protected on_init(): void {
  90. ch.sign.init(2, null, 7);
  91. this.items.addItem({ type: 1, count: 1 });
  92. this.items.addItem({ type: 2, count: 1 });
  93. this.items.addItem({ type: 3, count: 1 });
  94. this.items.addItem({ type: 5, count: 0 });
  95. //道具初始化
  96. ch.log.log("道具初始化", this);
  97. }
  98. //序列化加入自定义数据
  99. protected on_serialize(data: { [key: string]: number | string | any; }): void {
  100. data.sign = ch.sign.getSignData();
  101. data.items = this.items.serialize();
  102. // data.lv_dir = this.data.get(data_type.lv_dir);
  103. // data.is_win = this.data.get(data_type.is_win);
  104. }
  105. //反序列化加入自定义数据
  106. protected on_unserialize(data: { [key: string]: number | string | any; }): void {
  107. this.items.unserialize(data.items);
  108. ch.sign.init(2, data.sign, 7);
  109. // if (data.lv_dir !== undefined) {
  110. // this.data.set(data_type.lv_dir, data.lv_dir);
  111. // }
  112. // if (data.is_win !== undefined) {
  113. // this.data.set(data_type.is_win, data.is_win);
  114. // }
  115. }
  116. //是否使用远程数据
  117. protected on_check(local: any, remote: any): boolean {
  118. return true;
  119. }
  120. /**使用道具*/
  121. async use_item(type: number, count: number = 1) {
  122. // if (GameLink.getInst().state != GameState.wait) return;
  123. //const layout = gui.get(Main).getLayout<Layout_Main>();
  124. let ret = this.items.useCount(type, count);
  125. if (ret) {
  126. let b = true;
  127. if (type == 1) {
  128. //layout.Container.eliminate();
  129. } else if (type == 2) {
  130. //layout.Container.shuffle();
  131. } else if (type == 3) {
  132. //layout.Container.Empty();
  133. } else if (type == 5) {
  134. // layout.Container.AddTime();
  135. }
  136. this.set_use_item_num(1);
  137. this.event.emit(this.event.key.item_count, ret.type, ret.count);
  138. this.setDirty();
  139. }
  140. }
  141. /**增加道具*/
  142. add_item(type: number, count: number = 1): void {
  143. let ret = this.items.addCount(type, count);
  144. if (ret) {
  145. this.event.emit(this.event.key.item_count, ret.type, ret.count);
  146. this.setDirty();
  147. }
  148. }
  149. set_item(type: number, count: number = -1): void {
  150. const c = this.get_item(type);
  151. if (type < count) {
  152. this.add_item(type, count - c);
  153. }
  154. }
  155. get_item(type: number): number {
  156. return this.items.getCount(type);
  157. }
  158. //获取签到天数
  159. public get_sign(): number {
  160. return this.week_data.get(week_data_type.sign_day);
  161. }
  162. //设置签到天数
  163. public set_sign(count: number) {
  164. this.week_data.set(week_data_type.sign_day, count);
  165. }
  166. //获取是否当日首次通过收藏进入
  167. public get_is_favorite(): number {
  168. return //this.day_data.get(day_data_type.isFavorite);
  169. }
  170. //设置已从收藏进入
  171. public set_is_favorite(): void {
  172. // this.day_data.set(day_data_type.isFavorite, 1);
  173. this.setDirty();
  174. }
  175. //获取关卡数
  176. public get_max_floor(): number {
  177. return this.data.get(data_type.max_floor);
  178. }
  179. //设置关卡数
  180. public set_max_floor(floor: number): any {
  181. this.data.set(data_type.max_floor, floor);
  182. this.setDirty();
  183. }
  184. //获取关卡数
  185. public get_lv(): number {
  186. return this.data.get(data_type.lv);
  187. }
  188. //设置关卡数
  189. public set_lv(lv: number): void {
  190. this.data.set(data_type.lv, lv);
  191. this.setDirty();
  192. }
  193. //获取铜币数量
  194. public get_coin(): number {
  195. return this.data.get(data_type.coin);
  196. }
  197. //设置铜币数量
  198. public set_coin(coin: number): void {
  199. this.data.set(data_type.coin, coin);
  200. this.setDirty();
  201. }
  202. //获取今日使用道具数量
  203. public get_use_item_num(): number {
  204. return this.day_data.get(day_data_type.use_item);
  205. }
  206. //设置今日使用道具数量
  207. public set_use_item_num(num: number): void {
  208. this.day_data.add(day_data_type.use_item, num);
  209. }
  210. //获取今日广告观看数量
  211. public get_watch_ad_num(): number {
  212. return this.day_data.get(day_data_type.watch_ad);
  213. }
  214. //设置今日广告观看数量
  215. public set_watch_ad_num(num: number): void {
  216. this.day_data.add(day_data_type.watch_ad, num);
  217. this.setDirty();
  218. }
  219. //获取任务奖励状态
  220. public get_task_state() {
  221. return this.day_data.get_Array(day_data_type.task_reward_state);
  222. }
  223. //设置任务奖励状态
  224. public set_task_state(task_state: any): void {
  225. this.day_data.set_Array(day_data_type.task_reward_state, task_state);
  226. this.setDirty();
  227. }
  228. //获取体力
  229. public get_life(): number {
  230. return this.data.get(data_type.life);
  231. }
  232. //设置体力
  233. public set_life(life: number): void {
  234. if (life > 5) {
  235. life = 5;
  236. } else if (life < 0) {
  237. life = 0;
  238. }
  239. this.data.set(data_type.life, life);
  240. this.setDirty();
  241. }
  242. public async initProvinceInfo() {
  243. this.provinceInfo = await chsdk.getAllProvince();
  244. }
  245. public async getAllProvinceInfo() {
  246. return this.provinceInfo
  247. }
  248. //////////////////////////////////////////////////////////////////////////////////////////
  249. protected async load_data(): Promise<{ [key: string]: any; }> {
  250. return super.load_data();
  251. }
  252. public user_info: { uid: string, nickName: string, avatar: string, province: string };
  253. public get nickName(): string {
  254. return this.user_info.nickName;
  255. }
  256. public get avatarUrl(): string {
  257. return this.user_info.avatar;
  258. }
  259. public async init_user_info() {
  260. this.user_info = {
  261. uid: this.uid,
  262. nickName: ch.sdk.get_player_info().nickName,
  263. avatar: ch.sdk.get_player_info().avatarUrl,
  264. province: ch.sdk.get_player_info().province
  265. }
  266. }
  267. protected async save_data(save_data: { [key: string]: any; }): Promise<boolean> {
  268. return super.save_data(save_data);
  269. }
  270. public async save_rank_floor() {
  271. const floor = this.data.get(data_type.max_floor);
  272. ch.sdk.saveRankData(rand_type.floor, floor, ch.sdk.updateType.none, 0, { province: this.user_info.province });
  273. }
  274. public async get_rank_floor(): Promise<{ list: any[], owner: any, index: number }> {
  275. let index = 0;
  276. const d = await ch.sdk.loadRankData(rand_type.floor, ch.sdk.updateType.none, 100, true, false);
  277. console.log("全国排行榜", d);
  278. if (d.data.own) {
  279. for (let i = 0; i < d.data.list.length; i++) {
  280. if (d.data.own.userId === d.data.list[i].userId) {
  281. index = i + 1;
  282. }
  283. }
  284. if (d.data.own.rank > 100) {
  285. index = 101;
  286. }
  287. } else {
  288. index = 101;
  289. }
  290. return { list: d.data.list, owner: d.data.own, index: index };
  291. }
  292. public async save_Province_floor() {//地区
  293. const floor = this.data.get(data_type.max_floor);
  294. ch.sdk.saveProvinceRankData(rand_type.floor, floor, ch.sdk.updateType.none);
  295. }
  296. public async get_Province_Rank(hid: number): Promise<{ list: any[], ower: any, index: number }> {
  297. let index = 0;
  298. console.log("hid", hid);
  299. const d = await ch.sdk.loadProvinceRankData(hid, rand_type.floor, ch.sdk.updateType.none, 100, true);
  300. console.log("地区排行榜", d);
  301. if (d.data.own) {
  302. for (let i = 0; i < d.data.list.length; i++) {
  303. if (d.data.own.userId === d.data.list[i].userId) {
  304. index = i + 1;
  305. }
  306. }
  307. if (d.data.own.rank > 100) {
  308. index = 101;
  309. }
  310. } else {
  311. index = 101;
  312. }
  313. return { list: d.data.list, ower: d.data.own, index };
  314. }
  315. async loadPfInfo(): Promise<boolean> {
  316. return new Promise(async (resolve) => {
  317. let k = await ch.sdk.getUserInfo();
  318. if (k) {
  319. resolve(true);
  320. } else {
  321. Toast.makeText(gui.getLayerNode(5), '需要授权').show();
  322. resolve(false);
  323. }
  324. })
  325. }
  326. }