Files
slgclient/assets/scripts/map/ui/MapUIProxy.ts
2025-11-18 18:38:53 +08:00

736 lines
25 KiB
TypeScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import { _decorator } from 'cc';
import { Basic, Conscript, General } from "../../config/Basci";
import LoginCommand from "../../login/LoginCommand";
import DateUtil from "../../utils/DateUtil";
import MapUICommand from "./MapUICommand";
export class CityAddition {
cost: number = 0;
armyCnt: number = 0;//军队数量
vanguardCnt: 0;//军队前锋数量 默认每队只有两个位置 前锋数量影响第三个位置的开启
soldierCnt: 0;//带兵数加成
han: number = 0;//汉阵营加成
qun: number = 0;//群阵营加成
wei: number = 0;//魏阵营加成
shu: number = 0;//蜀阵营加成
wu: number = 0;//吴阵营加成
taxRate:number = 0;//交换的税率
durable:number = 0;//耐久
public clear(): void {
this.cost = 0;
this.armyCnt = 0;
this.vanguardCnt = 0;
this.soldierCnt = 0;
this.han = 0;
this.qun = 0;
this.wei = 0;
this.shu = 0;
this.wu = 0;
this.durable = 0;
}
};
/**城池加成类型*/
export class CityAdditionType {
static Durable: number = 1;//耐久
static Cost: number = 2;
static ArmyTeams: number = 3;//队伍数量
static Speed: number = 4;//速度
static Defense: number = 5;//防御
static Strategy: number = 6; //谋略
static Force: number = 7; //攻击武力
static ConscriptTime: number = 8;//征兵时间
static ReserveLimit: number = 9;//预备役上限
static Unkonw: number = 10;
static HanAddition: number = 11;
static QunAddition: number = 12;
static WeiAddition: number = 13;
static ShuAddition: number = 14;
static WuAddition: number = 15;
static DealTaxRate: number = 16;//交易税率
static Wood: number = 17;
static Iron: number = 18;
static Grain: number = 19;
static Stone: number = 20;
static Tax: number = 21;//税收
static ExtendTimes: number = 22;//扩建次数
static WarehouseLimit: number = 23;//仓库容量
static SoldierLimit: number = 24;//带兵数量
static VanguardLimit: number = 25;//前锋数量
}
/**设施*/
export class Facility {
level: number = 0;
type: number = 0;
upTime:number = 0; //升级的时间0为该等级已经升级成功
public isUping(): boolean{
return this.upLastTime() > 0
}
public isNeedUpdateLevel(): boolean{
return this.upLastTime() < 0
}
public upLastTime(): number{
if(this.upTime > 0){
let cfg:FacilityConfig = MapUICommand.getInstance().proxy.getFacilityCfgByType(this.type);
var costTime = cfg.upLevels[this.level].time;
return DateUtil.leftTime((this.upTime+costTime)*1000);
}else{
return 0;
}
}
}
/**设施(配置)*/
export class FacilityConfig {
name: string = "";
type: number = 0;
des: string = "";
additions: number[] = [];
conditions: FacilityOpenCondition[] = [];
upLevels: FacilityUpLevel[] = [];
}
/**设施加成类型配置*/
export class FacilityAdditionCfg {
type: number = 0;
des: string = "";
value: string = "";
}
/**设施开启条件配置*/
export class FacilityOpenCondition {
type: number = 0;
level: number = 0;
}
/**设施升级配置*/
export class FacilityUpLevel {
level: number = 0;
values: number[] = [];
wood: number = 0;
iron: number = 0;
stone: number = 0;
grain: number = 0;
decree: number = 0;
time:number = 0;
}
export class BasicGeneral {
limit: number = 0;
}
export class WarReport {
id: number = 0;
attack_rid: number = 0;
defense_rid: number = 0;
beg_attack_army: any = {};
beg_defense_army: any = {};
end_attack_army: any = {};
end_defense_army: any = {};
result: number = 0;
rounds: any = {};
attack_is_read: boolean = false;
defense_is_read: boolean = false;
destroy_durable: number = 0;
occupy: number = 0;
x: number = 0;
y: number = 0;
ctime: number = 0;
beg_attack_general: any[] = [];
beg_defense_general: any[] = [];
end_attack_general: any[] = [];
end_defense_general: any[] = [];
is_read: boolean = false;
}
export class WarReportRound {
isAttack: boolean = false;
attack: any = {};
defense: any = {};
attackLoss: number = 0;
defenseLoss: number = 0;
round: number = 0;
turn: number = 0;
}
export default class MapUIProxy {
protected _myFacility: Map<number, Map<number, Facility>> = new Map<number, Map<number, Facility>>();//城市设施
protected _facilityCfg: Map<number, FacilityConfig> = new Map<number, FacilityConfig>();//设施配置
protected _facilityAdditionCfg: Map<number, FacilityAdditionCfg> = new Map<number, FacilityAdditionCfg>();//升级加成配置
protected _warReport: Map<number, WarReport> = new Map<number, WarReport>();
protected _additions: Map<number, CityAddition> = new Map<number, CityAddition>();
protected _basic: Basic
public clearData(): void {
this._warReport.clear();
this._myFacility.clear();
this._additions.clear();
}
/**
* 当前城市的设施
* @param data
*/
public updateMyFacilityList(cityId: number, datas: any[]): void {
console.log("updateMyFacilityList:", datas);
let list: Map<number, Facility> = new Map<number, Facility>();
this._myFacility.set(cityId, list);
for (var i = 0; i < datas.length; i++) {
var obj = new Facility();
obj.level = datas[i].level;
obj.type = datas[i].type;
obj.upTime = datas[i].up_time;
list.set(obj.type, obj);
}
console.log("list:", list);
}
public updateMyFacility(cityId: number, data: any): Facility {
console.log("updateMyFacility:", data);
if (this._myFacility.has(cityId)) {
let list: Map<number, Facility> = this._myFacility.get(cityId);
let facilityData: Facility = list.get(data.type);
if (facilityData == null) {
facilityData = new Facility();
list.set(data.type, facilityData);
}
facilityData.level = data.level;
facilityData.type = data.type;
facilityData.upTime = data.up_time;
return facilityData;
}
return null;
}
/**更新设施加成数据*/
public updateMyCityAdditions(cityId: number): CityAddition {
if (this._myFacility.has(cityId)) {
let addition: CityAddition = null;
if (this._additions.has(cityId)) {
addition = this._additions.get(cityId);
} else {
addition = new CityAddition();
this._additions.set(cityId, addition);
}
addition.clear();//清除旧数据 重新计算
let list: Map<number, Facility> = this._myFacility.get(cityId);
list.forEach((data: Facility, type: number) => {
if (data.level > 0) {
let cfg: FacilityConfig = this.getFacilityCfgByType(data.type);
if (cfg) {
let addValue: number = 0;
let index: number = -1;
index = cfg.additions.indexOf(CityAdditionType.ArmyTeams);
if (index != -1) {
//军队数量加成
addValue = cfg.upLevels[data.level - 1].values[index];
addition.armyCnt += addValue;
}
index = cfg.additions.indexOf(CityAdditionType.Cost);
if (index != -1) {
//cost加成
addValue = cfg.upLevels[data.level - 1].values[index];
addition.cost += addValue;
}
index = cfg.additions.indexOf(CityAdditionType.SoldierLimit);
if (index != -1) {
//带兵数加成
addValue = cfg.upLevels[data.level - 1].values[index];
addition.soldierCnt += addValue;
}
index = cfg.additions.indexOf(CityAdditionType.VanguardLimit);
if (index != -1) {
//带兵数加成
addValue = cfg.upLevels[data.level - 1].values[index];
addition.vanguardCnt += addValue;
}
index = cfg.additions.indexOf(CityAdditionType.HanAddition);
if (index != -1) {
//汉阵营加成
addValue = cfg.upLevels[data.level - 1].values[index];
addition.han += addValue;
}
index = cfg.additions.indexOf(CityAdditionType.QunAddition);
if (index != -1) {
//群阵营加成
addValue = cfg.upLevels[data.level - 1].values[index];
addition.qun += addValue;
}
index = cfg.additions.indexOf(CityAdditionType.WeiAddition);
if (index != -1) {
//魏阵营加成
addValue = cfg.upLevels[data.level - 1].values[index];
addition.wei += addValue;
}
index = cfg.additions.indexOf(CityAdditionType.ShuAddition);
if (index != -1) {
//蜀阵营加成
addValue = cfg.upLevels[data.level - 1].values[index];
addition.shu += addValue;
}
index = cfg.additions.indexOf(CityAdditionType.WuAddition);
if (index != -1) {
//吴阵营加成
addValue = cfg.upLevels[data.level - 1].values[index];
addition.wu += addValue;
}
index = cfg.additions.indexOf(CityAdditionType.DealTaxRate);
if (index != -1) {
//交易税收
addValue = cfg.upLevels[data.level - 1].values[index];
addition.taxRate += addValue;
}
index = cfg.additions.indexOf(CityAdditionType.Durable);
if (index != -1) {
//console.log("CityAdditionType.Durable:", cfg.upLevels, addValue, index);
//耐久
addValue = cfg.upLevels[data.level - 1].values[index];
addition.durable += addValue;
}
}
}
});
console.log("updateMyCityAdditions", cityId, addition);
return addition;
}
return null;
}
/**
* 获取当前拥有的设施
* @param cityId
*/
public getMyFacilitys(cityId: number = 0): Map<number, Facility> {
return this._myFacility.get(cityId);
}
public getMyAllFacilitys(): Map<number, Map<number, Facility>> {
return this._myFacility;
}
/**获取指定的设施数据*/
public getMyFacilityByType(cityId: number = 0, type: number = 0): Facility {
if (this._myFacility.has(cityId)) {
let list: Map<number, Facility> = this._myFacility.get(cityId);
if (list.has(type)) {
return list.get(type);
}
}
return null;
}
/**获取城池的加成数据*/
public getMyCityAddition(cityId: number): CityAddition {
let addition: CityAddition = null;
if (this._additions.has(cityId)) {
addition = this._additions.get(cityId);
} else {
addition = new CityAddition();
this._additions.set(cityId, addition);
}
return addition;
}
public getMyCityCost(cityId: number):number{
let addition = this.getMyCityAddition(cityId);
console.log("getMyCityCost:", cityId, addition, this._basic.city.cost);
return addition.cost + this._basic.city.cost;
}
//最大耐久
public getMyCityMaxDurable(cityId: number):number{
let addition = this.getMyCityAddition(cityId);
console.log("getMyCityMaxDurable:", cityId, addition, this._basic.city.durable);
return addition.durable + this._basic.city.durable;
}
public getTransformRate():number {
return this._basic.city.transform_rate
}
/**
* 全部设施配置
* @param jsonAsset
*/
public setAllFacilityCfg(jsonAssets: any[]): void {
this._facilityCfg = new Map();
let mainJson: any = null;//设施类型配置
let additionJson: any = null;//升级类型配置
let otherJsons: any[] = [];//具体升级配置
for (let i: number = 0; i < jsonAssets.length; i++) {
if (jsonAssets[i]._name == "facility") {
mainJson = jsonAssets[i].json;
} else if (jsonAssets[i]._name == "facility_addition") {
additionJson = jsonAssets[i].json;
} else {
otherJsons.push(jsonAssets[i].json);
}
}
console.log("mainJson", mainJson, additionJson);
if (mainJson != null && additionJson != null) {
//主配置存在才处理配置文件
this._facilityCfg.clear();
for (let i: number = 0; i < mainJson.list.length; i++) {
let cfgData: FacilityConfig = new FacilityConfig();
cfgData.type = mainJson.list[i].type;
cfgData.name = mainJson.list[i].name;
this._facilityCfg.set(cfgData.type, cfgData);
}
this._facilityAdditionCfg.clear();
for (let i: number = 0; i < additionJson.list.length; i++) {
let cfgData: FacilityAdditionCfg = new FacilityAdditionCfg();
cfgData.type = additionJson.list[i].type;
cfgData.des = additionJson.list[i].des;
cfgData.value = additionJson.list[i].value;
this._facilityAdditionCfg.set(cfgData.type, cfgData);
}
let jsonList: any[] = [];
for (let i: number = 0; i < otherJsons.length; i++) {
this.getFacilityUpLevelJsonList(otherJsons[i], jsonList);
}
console.log("jsonList", jsonList, otherJsons);
for (let i: number = 0; i < jsonList.length; i++) {
let type: number = jsonList[i].type;
let cfgData: FacilityConfig = this._facilityCfg.get(type);
if (cfgData) {
//存在主配置 才加入升级配置
cfgData.des = jsonList[i].des;
cfgData.additions = jsonList[i].additions;
cfgData.conditions = [];
for (let j: number = 0; j < jsonList[i].conditions.length; j++) {
let conditionData: FacilityOpenCondition = new FacilityOpenCondition();
conditionData.type = jsonList[i].conditions[j].type;
conditionData.level = jsonList[i].conditions[j].level;
cfgData.conditions.push(conditionData);
}
cfgData.upLevels.length = jsonList[i].levels.length;
for (let k: number = 0; k < jsonList[i].levels.length; k++) {
let upLevelData: FacilityUpLevel = new FacilityUpLevel();
upLevelData.level = jsonList[i].levels[k].level;
upLevelData.values = jsonList[i].levels[k].values;
upLevelData.wood = jsonList[i].levels[k].need.wood;
upLevelData.iron = jsonList[i].levels[k].need.iron;
upLevelData.grain = jsonList[i].levels[k].need.grain;
upLevelData.wood = jsonList[i].levels[k].need.wood;
upLevelData.stone = jsonList[i].levels[k].need.stone;
upLevelData.time = jsonList[i].levels[k].time;
cfgData.upLevels[upLevelData.level - 1] = upLevelData;
//console.log("upLevelData:", upLevelData)
}
}
}
}
this._facilityCfg.forEach((value: FacilityConfig, key: number) => {
console.log("this._facilityCfg", key, value);
});
}
protected getFacilityUpLevelJsonList(data: any, list: any[]): void {
if (typeof (data) == "string" || typeof (data) == "number") {
return;
}
if (data.type != undefined && data.additions != undefined) {
//代表是需要的数据
list.push(data);
} else {
//代表有多条数据在更里层
for (let key in data) {
this.getFacilityUpLevelJsonList(data[key], list);
}
}
}
public getFacilityCfgByType(type: number = 0): FacilityConfig {
return this._facilityCfg.get(type);
}
public getFacilityAdditionCfgByType(type: number = 0): FacilityAdditionCfg {
return this._facilityAdditionCfg.get(type);
}
/**设施是否解锁*/
public isFacilityUnlock(cityId: number, type: number): boolean {
let isUnlock: boolean = true;
let cfg: FacilityConfig = this.getFacilityCfgByType(type);
for (let i: number = 0; i < cfg.conditions.length; i++) {
let data: Facility = this.getMyFacilityByType(cityId, cfg.conditions[i].type);
if (data && data.level < cfg.conditions[i].level) {
isUnlock = false;
break;
}
}
return isUnlock;
}
public setBasic(data: any): void {
this._basic = data.json;
console.log("setBasic:", this._basic);
}
public getConscriptBaseCost(): Conscript {
return this._basic.conscript;
}
public getDefenseSoldiers(level:number): number {
console.log("getDefenseSoldiers:", level);
return this._basic.npc.levels[level-1].soilders
}
public getBasicGeneral(): General {
return this._basic.general;
}
public updateWarReports(data: any): void {
var list = data.list;
for (var i = 0; i < list.length; i++) {
var obj: WarReport = this.createWarReprot(list[i]);
this._warReport.set(obj.id, obj);
}
}
public updateWarReport(data: any): void {
var obj: WarReport = this.createWarReprot(data);
this._warReport.set(obj.id, obj);
}
protected createWarReprot(data: any): WarReport {
var obj = new WarReport();
obj.id = data.id;
obj.attack_rid = data.a_rid;
obj.defense_rid = data.d_rid;
obj.beg_attack_general = this.arrayToObject(JSON.parse(data.b_a_general));
obj.end_attack_general = this.arrayToObject(JSON.parse(data.e_a_general));
obj.end_attack_army = JSON.parse(data.e_a_army);
obj.beg_attack_army = JSON.parse(data.b_a_army);
try {
obj.beg_defense_army = JSON.parse(data.b_d_army);
obj.end_defense_army = JSON.parse(data.e_d_army);
obj.beg_defense_general = this.arrayToObject(JSON.parse(data.b_d_general));
obj.end_defense_general = this.arrayToObject(JSON.parse(data.e_d_general));
obj.rounds = this.createRoundsData(data.rounds, obj.beg_attack_general, obj.beg_defense_general)
} catch (error) {
}
obj.result = data.result;
obj.defense_is_read = data.d_is_read;
obj.attack_is_read = data.a_is_read;
obj.is_read = this.isReadObj(obj);
obj.destroy_durable = data.destroy;
obj.occupy = data.occupy;
obj.x = data.x;
obj.y = data.y;
obj.ctime = data.ctime;
return obj;
}
private createRoundsData(data: string, attack_generals: any[], defense_generals: any[]): any[] {
var generals: any[] = attack_generals.concat(defense_generals);
var _list: any[] = [];
var rounds: any[] = JSON.parse(data);
for (var i = 0; i < rounds.length; i++) {
var round: any[] = rounds[i].b;
if(!round){
continue;
}
for (var j = 0; j < round.length; j++) {
var turn = round[j];
var attack_id = turn[0];
var defense_id = turn[1];
var attack_loss = turn[2];
var defense_loss = turn[3];
var obj = new WarReportRound();
obj.attack = this.getMatchGeneral(generals, attack_id);
obj.defense = this.getMatchGeneral(generals, defense_id);
obj.isAttack = this.getMatchGeneral(attack_generals, attack_id) != null;
obj.attackLoss = attack_loss;
obj.defenseLoss = defense_loss;
obj.round = i + 1;
obj.turn = j + 1;
_list.push(obj);
}
}
return _list;
}
protected arrayToObject(arr: any): any {
let temp: any = [];
for (var i = 0; i < arr.length; i++) {
var data = arr[i];
var obj: any = {}
obj.id = data[0];
obj.cfgId = data[1];
obj.physical_power = data[2];
obj.order = data[3];
obj.level = data[4];
obj.exp = data[5];
obj.cityId = data[6];
obj.curArms = data[7];
obj.hasPrPoint = data[8];
obj.attack_distance = data[9];
obj.force_added = data[10];
obj.strategy_added = data[11];
obj.defense_added = data[12];
obj.speed_added = data[13];
obj.destroy_added = data[14];
obj.star_lv = data[15];
obj.star = data[16];
temp.push(obj);
}
return temp;
}
protected getMatchGeneral(generals: any[], id: number = 0): any {
for (var i = 0; i < generals.length; i++) {
if (generals[i].id == id) {
return generals[i];
}
}
return null;
}
public updateWarRead(id: number = 0, isRead: boolean = true) {
var data = this._warReport.get(id);
var roleData = LoginCommand.getInstance().proxy.getRoleData();
if (data) {
if (data.defense_rid == roleData.rid) {
data.defense_is_read = isRead;
data.is_read = isRead;
}
if (data.attack_rid == roleData.rid) {
data.attack_is_read = isRead;
data.is_read = isRead;
}
this._warReport.set(id, data);
}
}
public updateAllWarRead(isRead: boolean = true) {
this._warReport.forEach(element => {
this.updateWarRead(element.id, isRead)
});
}
public isRead(id: number = 0): boolean {
var data = this._warReport.get(id);
var roleData = LoginCommand.getInstance().proxy.getRoleData();
if (data) {
if (data.defense_rid == roleData.rid) {
return data.defense_is_read;
}
if (data.attack_rid == roleData.rid) {
return data.attack_is_read;
}
}
return false;
}
public isReadObj(obj: any): boolean {
var roleData = LoginCommand.getInstance().proxy.getRoleData();
if (obj.defense_rid == roleData.rid) {
return obj.defense_is_read;
}
if (obj.attack_rid == roleData.rid) {
return obj.attack_is_read;
}
return false;
}
public getWarReport(): WarReport[] {
var arr: WarReport[] = Array.from(this._warReport.values());
arr = arr.sort(this.sortIsRead);
arr = arr.concat();
var backArr: WarReport[] = [];
// for (var i = 0; i < arr.length; i++) {
// if (arr[i].is_read == true) {
// backArr.push(arr[i]);
// arr.splice(i, 1);
// i--;
// }
// }
backArr = arr.concat(backArr);
// backArr = backArr.reverse();
return backArr;
}
public sortIsRead(a: any, b: any): number {
if (a.id < b.id) {
return 1;
}
return -1;
}
public isReadNum(): number {
var num = 0;
var arr = this.getWarReport();
for (var i = 0; i < arr.length; i++) {
if (!this.isRead(arr[i].id)) {
num++;
}
}
return num;
}
}