UserHeroData.ts 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319
  1. import { Data } from "../core/data/Data";
  2. import { DataSystem } from "../core/data/DataSystem";
  3. import { MapData } from "../core/data/MapData";
  4. import { Http } from "../core/net/Http";
  5. import { ConfigData } from "../data/ConfigData";
  6. import { UserData } from "../data/UserData";
  7. import { RedPointData } from "../main/RedPointData";
  8. import { FormationData } from "./formation/FormationData";
  9. /**
  10. * 用户英雄数据
  11. * @author 袁浩
  12. */
  13. export class UserHeroData extends MapData<number, UserHero> {
  14. /**
  15. * 已拥有的武将
  16. */
  17. public haveHeros: number[] = [];
  18. /**
  19. * 未拥有的武将
  20. */
  21. public notHavetHeros: number[] = [];
  22. /**
  23. * 从服务端拉取数据
  24. * @param http
  25. */
  26. public async pull(http: Http) {
  27. let result = await http.send("/api/hero/getHero");
  28. if (result && result.data) {
  29. let heroConfig: { [key: string]: Hero_Client } = DataSystem.getData(ConfigData).get("general");
  30. let haveHeros = [];//已拥有的英雄
  31. let notHavetHeros = [];//未拥有的英雄
  32. for (let key in heroConfig) {
  33. let client = JSON.parse(JSON.stringify(heroConfig[key]));//不污染配置
  34. let serverHero = result.data[key];
  35. if (serverHero && serverHero.active) {//如果已经激活
  36. haveHeros.push(client.id);
  37. this.set(client.id, { client: client, server: serverHero });
  38. }
  39. else {
  40. notHavetHeros.push(client.id);
  41. this.set(client.id, { client: client, server: serverHero || null });
  42. }
  43. }
  44. this.haveHeros = haveHeros;
  45. this.notHavetHeros = notHavetHeros;
  46. }
  47. }
  48. /**
  49. * 添加英雄
  50. * @param id
  51. */
  52. public addHero(id: number) {
  53. id = parseInt(id + "");
  54. let clientData = DataSystem.getData(ConfigData).get("general")[id];
  55. let chip = 0;
  56. if (this.has(id) && this.get(id).server) {//如果原来有碎片
  57. chip = this.get(id).server.chip;
  58. }
  59. let hero: UserHero = {
  60. client: clientData,
  61. server: {
  62. id: id,
  63. chip: chip,
  64. star: clientData.initStar,
  65. lv: DataSystem.getData(UserData).campLv,
  66. percent: 0,
  67. active: true
  68. }
  69. }
  70. if (this.haveHeros.indexOf(id) == -1) {//首次获得
  71. this.haveHeros.push(id);
  72. let index = this.notHavetHeros.indexOf(id);
  73. if (index != -1) {
  74. this.notHavetHeros.splice(index, 1);
  75. }
  76. DataSystem.getData(RedPointData).herosReward.push(id);
  77. }
  78. this.set(id, hero);
  79. }
  80. /**
  81. * 添加碎片
  82. * @param id 英雄编号
  83. * @param chip 碎片数量
  84. */
  85. public addChip(id: number, chip: number) {
  86. id = parseInt(id + "");
  87. chip = parseInt(chip + "");
  88. let hero: UserHero = this.get(id);
  89. if (hero && hero.server) {
  90. hero.server.chip += chip;
  91. }
  92. else {
  93. let clientData = DataSystem.getData(ConfigData).get("general")[id];
  94. hero = {
  95. client: clientData,
  96. server: {
  97. id: id,
  98. chip: chip,
  99. star: clientData.initStar,
  100. active: false,
  101. lv: DataSystem.getData(UserData).campLv,
  102. percent: 0
  103. }
  104. }
  105. }
  106. this.set(id, hero);
  107. }
  108. public sort(heroList: number[], camp: number, preUnlockHeros: number[] = [], nextUnlockHeros: number[] = [], nextCampLv: number = 0) {
  109. let userHeroData = DataSystem.getData(UserHeroData);
  110. let formationData = DataSystem.getData(FormationData);
  111. let formationHeroList = [];
  112. let noformationHeroList = [];
  113. let unlock_hechengHeroList = [];
  114. let unlock_huoquHeroList = [];
  115. let lockHeroList = [];
  116. for (let i = 0; i < heroList.length; i++) {
  117. const hero = userHeroData.get(heroList[i]);
  118. if (preUnlockHeros.indexOf(hero.client.id) != -1) {//如果已经解锁
  119. hero.client.isunlock = true;
  120. }
  121. if (hero.client.isunlock || (nextUnlockHeros.indexOf(hero.client.id) != -1 && camp == 0)) {//如果已经解锁或者即将解锁
  122. if (camp == 0 || hero.client.camp == camp) {
  123. if (hero.server && hero.server.active) {//已解锁
  124. if (!!formationData.getIDByHero(hero.client.id)) {//在阵上
  125. formationHeroList.push(hero);
  126. }
  127. else {
  128. noformationHeroList.push(hero);
  129. }
  130. }
  131. else {
  132. if (hero.client.isunlock) {//如果已经解锁
  133. let chip = !!hero.server ? hero.server.chip : 0;
  134. if (chip >= hero.client.needChip) {//合成
  135. unlock_hechengHeroList.push(hero);
  136. }
  137. else {//获取
  138. unlock_huoquHeroList.push(hero);
  139. }
  140. }
  141. else {
  142. lockHeroList.push(hero);
  143. }
  144. }
  145. hero.client.unlockLv = hero.client.isunlock ? nextCampLv - 1 : nextCampLv;
  146. }
  147. }
  148. }
  149. formationHeroList.sort((a: UserHero, b: UserHero): number => {
  150. if (a.client.color > b.client.color) {
  151. return -1;
  152. }
  153. else if (a.client.color < b.client.color) {
  154. return 1;
  155. }
  156. else {
  157. if (a.server.star > b.server.star) {
  158. return -1;
  159. }
  160. else if (a.server.star < b.server.star) {
  161. return 1;
  162. }
  163. else {
  164. if (a.server.lv > b.server.lv) {
  165. return -1;
  166. }
  167. else if (a.server.lv < b.server.lv) {
  168. return 1;
  169. }
  170. if (a.server.id > b.server.id) {
  171. return -1;
  172. }
  173. else if (a.server.id < b.server.id) {
  174. return 1;
  175. }
  176. return 0;
  177. }
  178. }
  179. });
  180. noformationHeroList.sort((a: UserHero, b: UserHero): number => {
  181. if (a.client.color > b.client.color) {
  182. return -1;
  183. }
  184. else if (a.client.color < b.client.color) {
  185. return 1;
  186. }
  187. else {
  188. if (a.server.star > b.server.star) {
  189. return -1;
  190. }
  191. else if (a.server.star < b.server.star) {
  192. return 1;
  193. }
  194. else {
  195. if (a.server.lv > b.server.lv) {
  196. return -1;
  197. }
  198. else if (a.server.lv < b.server.lv) {
  199. return 1;
  200. }
  201. if (a.server.id > b.server.id) {
  202. return -1;
  203. }
  204. else if (a.server.id < b.server.id) {
  205. return 1;
  206. }
  207. return 0;
  208. }
  209. }
  210. });
  211. unlock_hechengHeroList.sort((a: UserHero, b: UserHero): number => {
  212. if (a.client.color > b.client.color) {
  213. return -1;
  214. }
  215. else if (a.client.color < b.client.color) {
  216. return 1;
  217. }
  218. else {
  219. if (a.client.id > b.client.id) {
  220. return -1;
  221. }
  222. else if (a.client.id < b.client.id) {
  223. return 1;
  224. }
  225. return 0;
  226. }
  227. });
  228. unlock_huoquHeroList.sort((a: UserHero, b: UserHero): number => {
  229. if (a.client.color > b.client.color) {
  230. return -1;
  231. }
  232. else if (a.client.color < b.client.color) {
  233. return 1;
  234. }
  235. else {
  236. if (a.client.id > b.client.id) {
  237. return -1;
  238. }
  239. else if (a.client.id < b.client.id) {
  240. return 1;
  241. }
  242. return 0;
  243. }
  244. });
  245. lockHeroList.sort((a: UserHero, b: UserHero): number => {
  246. if (a.client.unlockLv > b.client.unlockLv) {
  247. return -1;
  248. }
  249. else if (a.client.unlockLv < b.client.unlockLv) {
  250. return 1;
  251. }
  252. else {
  253. if (a.client.color > b.client.color) {
  254. return -1;
  255. }
  256. else if (a.client.color < b.client.color) {
  257. return 1;
  258. }
  259. else {
  260. if (a.client.id > b.client.id) {
  261. return -1;
  262. }
  263. else if (a.client.id < b.client.id) {
  264. return 1;
  265. }
  266. return 0;
  267. }
  268. }
  269. });
  270. return formationHeroList.concat(noformationHeroList).concat(unlock_hechengHeroList).concat(unlock_huoquHeroList).concat(lockHeroList);
  271. }
  272. }
  273. export interface UserHero {
  274. client: Hero_Client;
  275. server: Hero_Server;
  276. }
  277. export interface Hero_Client {
  278. id: number;
  279. name: string;
  280. isunlock: boolean;
  281. camp: number;
  282. color: number;
  283. unlockLv: number;
  284. initStar: number;
  285. needChip: number;
  286. hero_res: string;
  287. attack: number;
  288. attSpeed: number;
  289. commander: number;
  290. upRatio: string;
  291. skillID: number;
  292. introduce: string;
  293. }
  294. export interface Hero_Server {
  295. /**
  296. * 编号
  297. */
  298. id: number;
  299. /**
  300. * 碎片
  301. */
  302. chip: number;
  303. /**
  304. * 武将星级
  305. */
  306. star: number;
  307. /**
  308. * 武将等级
  309. */
  310. lv: number;
  311. /**
  312. * 升级进度
  313. */
  314. percent: number;
  315. /**
  316. * 是否已拥有
  317. */
  318. active: boolean;
  319. }