GridMapModel.ts 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244
  1. import GameDataCenter from "../../GameDataCenter";
  2. import { GridMapModelData } from "./GridMapModelData";
  3. import { ReqHcMerge } from "../../../shared/hc/PtlHcMerge";
  4. import EventMng from "../../../manager/EventMng";
  5. import { GridEvent } from "../../../logic/gridMap/GridEvent";
  6. import { HcType, HcUnlock, ReqHcInfo } from "../../../shared/hc/PtlHcInfo";
  7. import Gamecfg from "../../../common/gameCfg";
  8. import UECell from "../../../logic/gridMap/UECell";
  9. import UEGridMap from "../../../logic/gridMap/UEGridMap";
  10. import { gameMethod } from "../../../common/gameMethod";
  11. import UECube from "../../../logic/gridMap/UECube";
  12. import { ReqHcEmit } from "../../../shared/hc/PtlHcEmit";
  13. import { GridConstant } from "../../../logic/gridMap/GridConstant";
  14. import Config from "../../../Config";
  15. import { MsgHcTili_s } from "../../../shared/hc/server/MsgHcTili_s";
  16. import { MsgHcGeziInfo_s } from "../../../shared/hc/server/MsgHcGeziInfo_s";
  17. /** 合成物品数据 */
  18. export interface MergeItem {
  19. type: number,
  20. id: number,
  21. rate: number
  22. }
  23. export default class GridMapModel extends GridMapModelData {
  24. /** 配方可合成的物品 */
  25. public formulaMap: { [key: string]: MergeItem[] } = {};
  26. /** 可合成物品的配方 */
  27. public itemFormula: { [key: string]: string[] } = {};
  28. public ueGridMap: UEGridMap;
  29. constructor() {
  30. super('gridMap');
  31. }
  32. protected onRegister(): void {
  33. GameDataCenter.gameServer.ListenMsg('hc/server/HcTili_s', this.OnHcTili, this);
  34. GameDataCenter.gameServer.ListenMsg('hc/server/HcGeziInfo_s', this.OnHcGeziInfo, this);
  35. }
  36. Init(ueGridMap: UEGridMap) {
  37. this.ueGridMap = ueGridMap;
  38. this.FilterMergeChain();
  39. }
  40. OnHcTili(data: MsgHcTili_s) {
  41. this.hcInfo.tili = data.tili;
  42. this.hcInfo.maxTili = data.maxTili;
  43. this.hcInfo.lastTime = data.lastTime;
  44. EventMng.emit(GridEvent.HC_SP_UP);
  45. }
  46. OnHcGeziInfo(data: MsgHcGeziInfo_s) {
  47. }
  48. /** 过滤合成链 */
  49. FilterMergeChain() {
  50. this.formulaMap = {};
  51. this.itemFormula = {};
  52. for (let key in Gamecfg.mergeInfo.pool) {
  53. let item = Gamecfg.mergeInfo.pool[key];
  54. let formulaKey1 = `${item.formula[0]}_${item.formula[1]}_${item.formula[2]}_${item.formula[3]}`;
  55. let formulaKey2 = `${item.formula[2]}_${item.formula[3]}_${item.formula[0]}_${item.formula[1]}`;
  56. this.formulaMap[formulaKey1] = [];
  57. this.formulaMap[formulaKey2] = [];
  58. for (let idx = 1; idx <= 4; idx++) {
  59. let mergeItem = item[`item${idx}`];
  60. let mergeItemRate = item[`rate${idx}`];
  61. if (mergeItem) {
  62. this.formulaMap[formulaKey1].push({ type: mergeItem[0], id: mergeItem[1], rate: mergeItemRate });
  63. this.formulaMap[formulaKey2].push({ type: mergeItem[0], id: mergeItem[1], rate: mergeItemRate });
  64. if (!this.itemFormula[`${mergeItem[0]}_${mergeItem[1]}`]) {
  65. this.itemFormula[`${mergeItem[0]}_${mergeItem[1]}`] = [];
  66. }
  67. this.itemFormula[`${mergeItem[0]}_${mergeItem[1]}`].push(formulaKey1);
  68. }
  69. }
  70. }
  71. }
  72. /** 请求棋盘信息 */
  73. async sendHcInfo(param: ReqHcInfo) {
  74. let ret = await GameDataCenter.gameServer.ReqApi("hc/HcInfo", param);
  75. if (ret?.res) {
  76. this.hcInfo = ret.res;
  77. EventMng.emit(GridEvent.HC_INFO_RSP, ret.res);
  78. EventMng.emit(GridEvent.HC_SP_UP);
  79. }
  80. }
  81. // 请求合成
  82. async sendHcMerge(param: ReqHcMerge) {
  83. let ret = await GameDataCenter.gameServer.ReqApi("hc/HcMerge", param);
  84. return ret;
  85. }
  86. async sendEmitter(gzid: number) {
  87. let ret = await GameDataCenter.gameServer.ReqApi("hc/HcEmit", { gzid: gzid.toString() });
  88. if (ret?.res) {
  89. for (let key in ret.res) {
  90. if (Number(key) != gzid) {
  91. EventMng.emit(GridEvent.TRIGGER_EMITTER, { idx: gzid, targetIdx: Number(key), info: ret.res[key] });
  92. }
  93. }
  94. EventMng.emit(GridEvent.HC_EMITTER_REFRESH, { idx: gzid, info: ret.res[gzid.toString()] });
  95. }
  96. }
  97. /** 请求格子战斗 */
  98. async sendFightHc(gzid: number) {
  99. let ret = await GameDataCenter.gameServer.ReqApi("fight/FightHc", { gzid: gzid.toString() });
  100. if (ret?.res) {
  101. GameDataCenter.battle.startFight(ret.res, () => {
  102. if (ret.res.win) {
  103. EventMng.emit(GridEvent.HC_FIGHT_OVER, { gzid: gzid, list: ret.res.list });
  104. }
  105. });
  106. }
  107. }
  108. /** 请求格子战斗 */
  109. async sendHcSell(gzid: number) {
  110. let ret = await GameDataCenter.gameServer.ReqApi("hc/HcSell", { gzid: gzid.toString() });
  111. if (ret?.res) {
  112. for (let key in ret.res.list) {
  113. EventMng.emit(GridEvent.HC_CELL_CHANGE, { idx: Number(key), item: ret.res.list[key] });
  114. }
  115. EventMng.emit(GridEvent.HC_MERGE_DETAIL, { isShow: false });
  116. EventMng.emit(GridEvent.HC_CELL_SELECT, 0);
  117. }
  118. }
  119. /** 尝试合成 */
  120. public async TryMergeItems(fromCell: UECell, toCell: UECell) {
  121. //检测目标格子物品是否可以拖动
  122. if (toCell.IsEmpty() || toCell.GetCube().CanDrag()) {
  123. let ret = await this.sendHcMerge({ gzid1: fromCell.GetIdx().toString(), gzid2: toCell.GetIdx().toString() })
  124. if (ret && ret.res) {
  125. let fCube = ret.res?.list[fromCell.GetIdx()];
  126. let tCube = ret.res.list[toCell.GetIdx()];
  127. if (toCell.IsEmpty()) {
  128. //格子上没有物品
  129. fromCell.MoveCubeToCell(toCell);
  130. toCell.SetCube(fromCell.GetCube());
  131. fromCell.SetCube(null);
  132. } else if (this.CanMergeItems(fromCell, toCell)) {
  133. fromCell.ClearCube();
  134. toCell.ClearCube();
  135. let cube = toCell.CreateCube(tCube);
  136. cube.PlayMergeAnim();
  137. } else {
  138. this.SwitchCell(fromCell, toCell);
  139. }
  140. }
  141. } else {
  142. //回到原来位置
  143. fromCell.GetCube().BackToOriginalPos(true);
  144. }
  145. }
  146. /** 交换格子 */
  147. private SwitchCell(fromCell: UECell, toCell: UECell): void {
  148. let fromCube = fromCell.GetCube();
  149. let toCube = toCell.GetCube();
  150. fromCell.SetCube(toCube);
  151. toCell.SetCube(fromCube);
  152. toCube.MoveToNewPos(cc.v3(fromCell.node.x, fromCell.node.y));
  153. fromCube.MoveToNewPos(cc.v3(toCell.node.x, toCell.node.y), 0.05);
  154. }
  155. /** 将索引转换为位置 */
  156. public TranIdxToPos(idx: number): cc.Vec2 {
  157. let row = idx % 10;
  158. let col = Math.floor(idx / 10);
  159. return cc.v2(row - 1, col - 1);
  160. }
  161. /** 根据索引获取实际像素坐标 */
  162. public GetPosByIdx(idx: number): cc.Vec3 {
  163. let vec = this.TranIdxToPos(idx);
  164. const startX = -(GridConstant.ROW * GridConstant.CELL_WIDTH) / 2;
  165. const startY = (GridConstant.COL * GridConstant.CELL_WIDTH) / 2;
  166. return cc.v3(
  167. startX + vec.x * GridConstant.CELL_WIDTH + GridConstant.CELL_WIDTH / 2,
  168. startY - vec.y * GridConstant.CELL_WIDTH - GridConstant.CELL_WIDTH / 2
  169. )
  170. }
  171. /** 根据xy获取实际像素坐标 */
  172. public GetPosByVec(i: number, j: number): cc.Vec3 {
  173. const startX = -(GridConstant.ROW * GridConstant.CELL_WIDTH) / 2;
  174. const startY = (GridConstant.COL * GridConstant.CELL_WIDTH) / 2;
  175. return cc.v3(
  176. startX + j * GridConstant.CELL_WIDTH + GridConstant.CELL_WIDTH / 2,
  177. startY - i * GridConstant.CELL_WIDTH - GridConstant.CELL_WIDTH / 2
  178. )
  179. }
  180. /** 检测目标格子是否可以放置&合成&交换物品 */
  181. public CellCanPut(fromCell: UECell, toCell: UECell): boolean {
  182. //目标格子是空格子
  183. if (toCell.IsEmpty()) {
  184. return true;
  185. }
  186. //检测目标格子物品是否可以拖动
  187. if (toCell.GetCube().CanDrag()) {
  188. return true;
  189. }
  190. //目标位置是物品,但是可以合成
  191. if (this.CanMergeItems(fromCell, toCell)) {
  192. return true;
  193. }
  194. return false;
  195. }
  196. /** 是否可以合成 */
  197. private CanMergeItems(fromCell: UECell, toCell: UECell): boolean {
  198. let formulaKey = `${fromCell.GetCube().GetCubeData().info.type}_${fromCell.GetCube().GetCubeData().info.correlationId}_${toCell.GetCube().GetCubeData().info.type}_${toCell.GetCube().GetCubeData().info.correlationId}`;
  199. let mergeArr = this.formulaMap[formulaKey];
  200. if (gameMethod.isEmpty(mergeArr)) {
  201. return false;
  202. }
  203. return true;
  204. }
  205. /** 获取可合成的物品集 */
  206. public GetMergeItems(cube1: UECube, cube2: UECube) {
  207. let formulaKey = `${cube1.GetCubeData().info.type}_${cube1.GetCubeData().info.correlationId}_${cube2.GetCubeData().info.type}_${cube2.GetCubeData().info.correlationId}`;
  208. let mergeArr = this.formulaMap[formulaKey];
  209. return mergeArr || [];
  210. }
  211. }