import { Data } from "../core/data/Data"; import { DataSystem } from "../core/data/DataSystem"; import { MapData } from "../core/data/MapData"; import { Http } from "../core/net/Http"; import { ConfigData } from "../data/ConfigData"; import { UserData } from "../data/UserData"; import { RedPointData } from "../main/RedPointData"; import { FormationData } from "./formation/FormationData"; /** * 用户英雄数据 * @author 袁浩 */ export class UserHeroData extends MapData { /** * 已拥有的武将 */ public haveHeros: number[] = []; /** * 未拥有的武将 */ public notHavetHeros: number[] = []; /** * 从服务端拉取数据 * @param http */ public async pull(http: Http) { let result = await http.send("/api/hero/getHero"); if (result && result.data) { let heroConfig: { [key: string]: Hero_Client } = DataSystem.getData(ConfigData).get("general"); let haveHeros = [];//已拥有的英雄 let notHavetHeros = [];//未拥有的英雄 for (let key in heroConfig) { let client = JSON.parse(JSON.stringify(heroConfig[key]));//不污染配置 let serverHero = result.data[key]; if (serverHero && serverHero.active) {//如果已经激活 haveHeros.push(client.id); this.set(client.id, { client: client, server: serverHero }); } else { notHavetHeros.push(client.id); this.set(client.id, { client: client, server: serverHero || null }); } } this.haveHeros = haveHeros; this.notHavetHeros = notHavetHeros; } } /** * 添加英雄 * @param id */ public addHero(id: number) { id = parseInt(id + ""); let clientData = DataSystem.getData(ConfigData).get("general")[id]; let chip = 0; if (this.has(id) && this.get(id).server) {//如果原来有碎片 chip = this.get(id).server.chip; } let hero: UserHero = { client: clientData, server: { id: id, chip: chip, star: clientData.initStar, lv: DataSystem.getData(UserData).campLv, percent: 0, active: true } } if (this.haveHeros.indexOf(id) == -1) {//首次获得 this.haveHeros.push(id); let index = this.notHavetHeros.indexOf(id); if (index != -1) { this.notHavetHeros.splice(index, 1); } DataSystem.getData(RedPointData).herosReward.push(id); } this.set(id, hero); } /** * 添加碎片 * @param id 英雄编号 * @param chip 碎片数量 */ public addChip(id: number, chip: number) { id = parseInt(id + ""); chip = parseInt(chip + ""); let hero: UserHero = this.get(id); if (hero && hero.server) { hero.server.chip += chip; } else { let clientData = DataSystem.getData(ConfigData).get("general")[id]; hero = { client: clientData, server: { id: id, chip: chip, star: clientData.initStar, active: false, lv: DataSystem.getData(UserData).campLv, percent: 0 } } } this.set(id, hero); } public sort(heroList: number[], camp: number, preUnlockHeros: number[] = [], nextUnlockHeros: number[] = [], nextCampLv: number = 0) { let userHeroData = DataSystem.getData(UserHeroData); let formationData = DataSystem.getData(FormationData); let formationHeroList = []; let noformationHeroList = []; let unlock_hechengHeroList = []; let unlock_huoquHeroList = []; let lockHeroList = []; for (let i = 0; i < heroList.length; i++) { const hero = userHeroData.get(heroList[i]); if (preUnlockHeros.indexOf(hero.client.id) != -1) {//如果已经解锁 hero.client.isunlock = true; } if (hero.client.isunlock || (nextUnlockHeros.indexOf(hero.client.id) != -1 && camp == 0)) {//如果已经解锁或者即将解锁 if (camp == 0 || hero.client.camp == camp) { if (hero.server && hero.server.active) {//已解锁 if (!!formationData.getIDByHero(hero.client.id)) {//在阵上 formationHeroList.push(hero); } else { noformationHeroList.push(hero); } } else { if (hero.client.isunlock) {//如果已经解锁 let chip = !!hero.server ? hero.server.chip : 0; if (chip >= hero.client.needChip) {//合成 unlock_hechengHeroList.push(hero); } else {//获取 unlock_huoquHeroList.push(hero); } } else { lockHeroList.push(hero); } } hero.client.unlockLv = hero.client.isunlock ? nextCampLv - 1 : nextCampLv; } } } formationHeroList.sort((a: UserHero, b: UserHero): number => { if (a.client.color > b.client.color) { return -1; } else if (a.client.color < b.client.color) { return 1; } else { if (a.server.star > b.server.star) { return -1; } else if (a.server.star < b.server.star) { return 1; } else { if (a.server.lv > b.server.lv) { return -1; } else if (a.server.lv < b.server.lv) { return 1; } if (a.server.id > b.server.id) { return -1; } else if (a.server.id < b.server.id) { return 1; } return 0; } } }); noformationHeroList.sort((a: UserHero, b: UserHero): number => { if (a.client.color > b.client.color) { return -1; } else if (a.client.color < b.client.color) { return 1; } else { if (a.server.star > b.server.star) { return -1; } else if (a.server.star < b.server.star) { return 1; } else { if (a.server.lv > b.server.lv) { return -1; } else if (a.server.lv < b.server.lv) { return 1; } if (a.server.id > b.server.id) { return -1; } else if (a.server.id < b.server.id) { return 1; } return 0; } } }); unlock_hechengHeroList.sort((a: UserHero, b: UserHero): number => { if (a.client.color > b.client.color) { return -1; } else if (a.client.color < b.client.color) { return 1; } else { if (a.client.id > b.client.id) { return -1; } else if (a.client.id < b.client.id) { return 1; } return 0; } }); unlock_huoquHeroList.sort((a: UserHero, b: UserHero): number => { if (a.client.color > b.client.color) { return -1; } else if (a.client.color < b.client.color) { return 1; } else { if (a.client.id > b.client.id) { return -1; } else if (a.client.id < b.client.id) { return 1; } return 0; } }); lockHeroList.sort((a: UserHero, b: UserHero): number => { if (a.client.unlockLv > b.client.unlockLv) { return -1; } else if (a.client.unlockLv < b.client.unlockLv) { return 1; } else { if (a.client.color > b.client.color) { return -1; } else if (a.client.color < b.client.color) { return 1; } else { if (a.client.id > b.client.id) { return -1; } else if (a.client.id < b.client.id) { return 1; } return 0; } } }); return formationHeroList.concat(noformationHeroList).concat(unlock_hechengHeroList).concat(unlock_huoquHeroList).concat(lockHeroList); } } export interface UserHero { client: Hero_Client; server: Hero_Server; } export interface Hero_Client { id: number; name: string; isunlock: boolean; camp: number; color: number; unlockLv: number; initStar: number; needChip: number; hero_res: string; attack: number; attSpeed: number; commander: number; upRatio: string; skillID: number; introduce: string; } export interface Hero_Server { /** * 编号 */ id: number; /** * 碎片 */ chip: number; /** * 武将星级 */ star: number; /** * 武将等级 */ lv: number; /** * 升级进度 */ percent: number; /** * 是否已拥有 */ active: boolean; }