import { _decorator, Component, Label, Node, Prefab, EditBox, Slider, instantiate } from 'cc'; const { ccclass, property } = _decorator; import { ArmyCmd, ArmyData } from "../../general/ArmyProxy"; import GeneralCommand from "../../general/GeneralCommand"; import ArmyCommand from "../../general/ArmyCommand"; import { GeneralCampType, GeneralConfig, GeneralData } from "../../general/GeneralProxy"; import MapUICommand from "./MapUICommand"; import MapCommand from "../MapCommand"; import { MapCityData } from "../MapCityProxy"; import { CityAddition, CityAdditionType, Facility } from "./MapUIProxy"; import CityGeneralItemLogic from "./CityGeneralItemLogic"; import LoginCommand from "../../login/LoginCommand"; import { Conscript } from "../../config/Basci"; import { EventMgr } from '../../utils/EventMgr'; @ccclass('CityArmySettingLogic') export default class CityArmySettingLogic extends Component { @property(Label) labelId: Label = null; @property(Label) labelCost: Label = null; @property(Label) labelSoldierCnt: Label = null; @property(Label) labelSpeed: Label = null; @property(Label) labelAtkCity: Label = null; @property(Label) labelAddition: Label = null; @property(Label) labelAdditionTip: Label = null; @property(Node) additionTouchNode: Node = null; @property(Node) additionTipNode: Node = null; @property(Label) labelResCost: Label = null; @property(Node) generalLayer: Node = null; @property(Prefab) generalPrefab: Prefab = null; @property([EditBox]) editBoxs: EditBox[] = []; @property([Slider]) sliders: Slider[] = []; @property([Node]) tipNodes: Node[] = []; protected _generalCnt: number = 3; protected _order: number = 0; protected _cityId: number = 0; protected _cityData: MapCityData = null; protected _isUnlock: boolean = false; protected _data: ArmyData = null; protected _addition: CityAddition = null; protected _gengeralLogics: CityGeneralItemLogic[] = []; protected _soldiers: number[] = null; protected _totalSoldiers: number[] = null; protected _curConscripts: number[] = null;//当前征兵数 protected _conTimes: number[] = null; protected _conCnts: number[] = null; protected onLoad(): void { this.initView(); this.additionTipNode.active = false; this.additionTouchNode.on(Node.EventType.TOUCH_START, this.onShowAdditionTip, this); this.additionTouchNode.on(Node.EventType.TOUCH_END, this.onHideAdditionTip, this); this.additionTouchNode.on(Node.EventType.TOUCH_CANCEL, this.onHideAdditionTip, this); } protected onDestroy(): void { this._gengeralLogics.length = 0; } protected onEnable(): void { this._soldiers = [0, 0, 0]; this._totalSoldiers = [0, 0, 0]; this._curConscripts = [0, 0, 0]; this._conTimes = [0, 0, 0]; this._conCnts = [0, 0, 0]; EventMgr.on("update_army", this.onUpdateArmy, this); EventMgr.on("chosed_general", this.onChooseGeneral, this); EventMgr.on("update_city_addition", this.onUpdateAddition, this); } protected onDisable(): void { EventMgr.targetOff(this); this._data = null; this._addition = null; this._cityData = null; } protected initView(): void { for (let i: number = 0; i < this._generalCnt; i++) { let item: Node = instantiate(this.generalPrefab); item.parent = this.generalLayer; let comp: CityGeneralItemLogic = item.getComponent(CityGeneralItemLogic); comp.index = i; this._gengeralLogics.push(comp); } } protected onShowAdditionTip(): void { if (this._data && this.labelAddition.string != "无") { this.additionTipNode.active = true; } } protected onHideAdditionTip(): void { this.additionTipNode.active = false; } protected clearSoldiers(): void { for (let i: number = 0; i < this._generalCnt; i++) { this._soldiers[i] = 0; this._totalSoldiers[i] = 0; } } protected onUpdateArmy(armyData: ArmyData): void { if (armyData.cityId == this._cityId && armyData.order == this._order) { this.setData(this._cityId, this._order); } } protected onUpdateAddition(cityId: number): void { if (this._cityId == cityId) { this.setData(this._cityId, this._order); } } protected onChooseGeneral(cfgData: any, curData: any, position: any): void { ArmyCommand.getInstance().generalDispose(this._cityData.cityId, curData.id, this._order, Number(position), this._cityData); } protected updateView(): void { let comp: CityGeneralItemLogic = null; let generalData: GeneralData = null; let generalCfg: GeneralConfig = null; let isUnlock: boolean = false; let totalCost: number = 0; let soldierCnt: number = 0; let totalSoldierCnt: number = 0; this.clearSoldiers(); if (this._isUnlock) { for (let i: number = 0; i < this._gengeralLogics.length; i++) { comp = this._gengeralLogics[i]; generalData = null; isUnlock = true; if (i == 2) { //只有第二个副将才需要判断是否解锁 isUnlock = this._addition.vanguardCnt >= this._order; } if (this._data && this._data.generals[i] > 0) { generalData = GeneralCommand.getInstance().proxy.getMyGeneral(this._data.generals[i]); generalCfg = GeneralCommand.getInstance().proxy.getGeneralCfg(generalData.cfgId); totalCost += generalCfg.cost; this._soldiers[i] = this._data.soldiers[i]; this._totalSoldiers[i] = generalData.level * 100 + this._addition.soldierCnt; soldierCnt += this._soldiers[i]; totalSoldierCnt += this._totalSoldiers[i]; this._conTimes[i] = this._data.conTimes[i]; this._conCnts[i] = this._data.conCnts[i]; } if (isUnlock == false || generalData == null) { this.tipNodes[i].active = true; this.editBoxs[i].node.active = false; this.sliders[i].node.active = false; } else { this.tipNodes[i].active = false; this.editBoxs[i].node.active = true; this.sliders[i].node.active = true; let totalValue: number = this._totalSoldiers[i] - this._soldiers[i]; if(this._data && this._data.cmd == ArmyCmd.Conscript){ var can = this._conCnts[i] == 0 this.sliders[i].enabled = can; this.editBoxs[i].string = "0"; this.sliders[i].progress = 0; this.editBoxs[i].enabled = can; }else if(this._data && this._data.cmd > ArmyCmd.Idle || totalValue <= 0) { //不可征兵 this.editBoxs[i].string = "0"; this.sliders[i].progress = 0; this.editBoxs[i].enabled = false; this.sliders[i].enabled = false; this.setCurConscriptForIndex(i, 0); } else { this.editBoxs[i].enabled = true; this.sliders[i].enabled = true; let curValue: number = 0; if (this.editBoxs[i].string != "") { curValue = Math.max(0, Math.min(parseInt(this.editBoxs[i].string), totalValue)); } this.setCurConscriptForIndex(i, curValue); } } comp.setData(this._cityId, this._order, generalData, this._soldiers[i], this._totalSoldiers[i], this._conCnts[i], this._conTimes[i], isUnlock); } } this.labelId.string = "部队" + this._order; this.labelCost.string = totalCost + "/" + MapUICommand.getInstance().proxy.getMyCityCost(this._cityId); this.labelSoldierCnt.string = soldierCnt + "/" + totalSoldierCnt; this.labelAddition.string = "无"; if (this._data) { let generals: GeneralData[] = ArmyCommand.getInstance().getArmyGenerals(this._data); let speed: number = ArmyCommand.getInstance().getArmySpeed(generals); this.labelSpeed.string = speed.toFixed(2); let destroy: number = ArmyCommand.getInstance().getArmyDestroy(generals); this.labelAtkCity.string = destroy.toFixed(2); let camp: number = ArmyCommand.getInstance().getArmyCamp(generals); if (camp > 0) { if (camp == GeneralCampType.Han && this._addition.han > 0) { this.labelAdditionTip.string = "汉阵营加成:" + this._addition.han; this.labelAddition.string = "阵营"; } else if (camp == GeneralCampType.Qun && this._addition.han > 0) { this.labelAdditionTip.string = "群阵营加成:" + this._addition.qun; this.labelAddition.string = "阵营"; } else if (camp == GeneralCampType.Wei && this._addition.han > 0) { this.labelAdditionTip.string = "魏阵营加成:" + this._addition.wei; this.labelAddition.string = "阵营"; } else if (camp == GeneralCampType.Shu && this._addition.han > 0) { this.labelAdditionTip.string = "蜀阵营加成:" + this._addition.shu; this.labelAddition.string = "阵营"; } else if (camp == GeneralCampType.Wu && this._addition.han > 0) { this.labelAdditionTip.string = "吴阵营加成:" + this._addition.wu; this.labelAddition.string = "阵营"; } } } else { this.labelSpeed.string = "0"; } this.updateResCost(); } protected setCurConscriptForIndex(index: number, cnt: number = 0): void { let maxCnt: number = this._totalSoldiers[index] - this._soldiers[index]; cnt = Math.min(cnt, maxCnt); let percent: number = cnt / maxCnt; this.editBoxs[index].string = cnt + ""; this.sliders[index].progress = percent; this._curConscripts[index] = cnt; } protected getTotalConscriptCnt(): number { let totalCnt: number = 0; for (let i = 0; i < this._curConscripts.length; i++) { totalCnt += this._curConscripts[i]; } return totalCnt; } protected updateResCost(): void { let totalCnt: number = this.getTotalConscriptCnt(); if (totalCnt > 0) { var myRoleRes = LoginCommand.getInstance().proxy.getRoleResData(); var baseCost: Conscript = MapUICommand.getInstance().proxy.getConscriptBaseCost(); let str: string = "消耗: " + "金币:" + totalCnt * baseCost.cost_gold + "/" + myRoleRes.gold; str += " 木材:" + totalCnt * baseCost.cost_wood + "/" + myRoleRes.wood; str += " 金属:" + totalCnt * baseCost.cost_iron + "/" + myRoleRes.iron; str += " 谷物:" + totalCnt * baseCost.cost_grain + "/" + myRoleRes.grain; this.labelResCost.string = str; } else { this.labelResCost.string = ""; } } protected onChangeEditBox(editBox: EditBox): void { let index: number = this.editBoxs.indexOf(editBox); if (index >= 0) { this.setCurConscriptForIndex(index, parseInt(this.editBoxs[index].string)); this.updateResCost(); } } protected onChangeSlider(slider: Slider): void { let index: number = this.sliders.indexOf(slider); if (index >= 0) { let maxCnt: number = this._totalSoldiers[index] - this._soldiers[index]; this.setCurConscriptForIndex(index, Math.floor(this.sliders[index].progress * maxCnt)); this.updateResCost(); } } protected onClickQuick(): void { if (this._data && this._data.cmd == ArmyCmd.Idle || this._data.cmd == ArmyCmd.Conscript) { for (let i: number = 0; i < this._totalSoldiers.length; i++) { if(this._conCnts[i] > 0){ //正在征兵的不能重复征兵 this.setCurConscriptForIndex(i, 0); }else{ let maxCnt: number = this._totalSoldiers[i] - this._soldiers[i]; if (maxCnt > 0) { this.setCurConscriptForIndex(i, maxCnt); } } } this.updateResCost(); } } protected onClickSure(): void { if (this._data && this._data.cmd == ArmyCmd.Idle || this._data.cmd == ArmyCmd.Conscript) { let totalCnt: number = this.getTotalConscriptCnt(); if (totalCnt > 0) { ArmyCommand.getInstance().generalConscript(this._data.id, this._curConscripts, null); } } } protected onClickPrev(): void { this._curConscripts = [0, 0, 0]; if (this._order == 1) { //第一个就跳到最后一个 this.setData(this._cityId, this._addition.armyCnt); } else { this.setData(this._cityId, this._order - 1); } } protected onClickNext(): void { this._curConscripts = [0, 0, 0]; if (this._order == this._addition.armyCnt) { //最后一个就跳到第一个 this.setData(this._cityId, 1); } else { this.setData(this._cityId, this._order + 1); } } protected onClickClose(): void { this.node.active = false; } public setData(cityId: number, order: number = 1): void { this._curConscripts = [0, 0, 0]; this._cityId = cityId; this._order = order; this._cityData = MapCommand.getInstance().cityProxy.getMyCityById(this._cityId); this._data = ArmyCommand.getInstance().proxy.getArmyByOrder(order, cityId); this._addition = MapUICommand.getInstance().proxy.getMyCityAddition(cityId); this._isUnlock = this._addition.armyCnt >= this._order; let facility: Map = MapUICommand.getInstance().proxy.getMyFacilitys(this._cityId); if (facility == null) { MapUICommand.getInstance().qryCityFacilities(this._cityId); } this.updateView(); } }