GridMapModel.ts 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177
  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. /** 合成物品数据 */
  13. export interface MergeItem {
  14. type: number,
  15. id: number,
  16. rate: number
  17. }
  18. export default class GridMapModel extends GridMapModelData {
  19. /** 配方可合成的物品 */
  20. public formulaMap: { [key: string]: MergeItem[] } = {};
  21. /** 可合成物品的配方 */
  22. public itemFormula: { [key: string]: string[] } = {};
  23. private ueGridMap: UEGridMap;
  24. constructor() {
  25. super('gridMap');
  26. }
  27. protected onRegister(): void {
  28. }
  29. Init(ueGridMap: UEGridMap) {
  30. this.ueGridMap = ueGridMap;
  31. this.FilterMergeChain();
  32. }
  33. /** 过滤合成链 */
  34. FilterMergeChain() {
  35. this.formulaMap = {};
  36. this.itemFormula = {};
  37. for (let key in Gamecfg.mergeInfo.pool) {
  38. let item = Gamecfg.mergeInfo.pool[key];
  39. let formulaKey1 = `${item.formula[0]}_${item.formula[1]}_${item.formula[2]}_${item.formula[3]}`;
  40. let formulaKey2 = `${item.formula[2]}_${item.formula[3]}_${item.formula[0]}_${item.formula[1]}`;
  41. this.formulaMap[formulaKey1] = [];
  42. this.formulaMap[formulaKey2] = [];
  43. for (let idx = 1; idx <= 4; idx++) {
  44. let mergeItem = item[`item${idx}`];
  45. let mergeItemRate = item[`rate${idx}`];
  46. if (mergeItem) {
  47. this.formulaMap[formulaKey1].push({ type: mergeItem[0], id: mergeItem[1], rate: mergeItemRate });
  48. this.formulaMap[formulaKey2].push({ type: mergeItem[0], id: mergeItem[1], rate: mergeItemRate });
  49. if (!this.itemFormula[`${mergeItem[0]}_${mergeItem[1]}`]) {
  50. this.itemFormula[`${mergeItem[0]}_${mergeItem[1]}`] = [];
  51. }
  52. this.itemFormula[`${mergeItem[0]}_${mergeItem[1]}`].push(formulaKey1);
  53. }
  54. }
  55. }
  56. }
  57. /** 请求棋盘信息 */
  58. async sendHcInfo(param: ReqHcInfo) {
  59. let ret = await GameDataCenter.gameServer.ReqApi("hc/HcInfo", param);
  60. if (ret?.res) {
  61. this.hcInfo = ret.res;
  62. EventMng.emit(GridEvent.HC_INFO_RSP, ret.res);
  63. EventMng.emit(GridEvent.HC_SP_UP);
  64. }
  65. }
  66. // 请求合成
  67. async sendHcMerge(param: ReqHcMerge) {
  68. let ret = await GameDataCenter.gameServer.ReqApi("hc/HcMerge", param);
  69. return ret;
  70. }
  71. sendEmitter(idx: number) {
  72. // let ret = await GameDataCenter.gameServer.ReqApi("hc/HcEmitter", param);
  73. // return ret;
  74. EventMng.emit(GridEvent.TRIGGER_EMITTER, { idx: idx, item: { type: 2, id: 10101 } });
  75. }
  76. /** 尝试合成 */
  77. public async TryMergeItems(fromCell: UECell, toCell: UECell) {
  78. //检测目标格子物品是否可以拖动
  79. if (toCell.IsEmpty() || toCell.GetCube().CanDrag()) {
  80. let ret = await this.sendHcMerge({ gzid1: fromCell.GetZIndex().toString(), gzid2: toCell.GetZIndex().toString() })
  81. if (ret && ret.res) {
  82. let fCube = ret.res[fromCell.GetZIndex()];
  83. let tCube = ret.res[toCell.GetZIndex()];
  84. if (toCell.IsEmpty()) {
  85. //格子上没有物品
  86. fromCell.MoveCubeToCell(toCell);
  87. toCell.SetCube(fromCell.GetCube());
  88. fromCell.SetCube(null);
  89. } else if (this.CanMergeItems(fromCell, toCell)) {
  90. toCell.GetCube().PlayMergeAnim();
  91. fromCell.ClearCube();
  92. toCell.ClearCube();
  93. EventMng.emit(GridEvent.HC_MERGE_RSP, { cell: toCell, cube: tCube });
  94. } else {
  95. this.SwitchCell(fromCell, toCell);
  96. }
  97. }
  98. } else {
  99. //回到原来位置
  100. fromCell.GetCube().BackToOriginalPos(true);
  101. }
  102. }
  103. /** 交换格子 */
  104. private SwitchCell(fromCell: UECell, toCell: UECell): void {
  105. let fromCube = fromCell.GetCube();
  106. let toCube = toCell.GetCube();
  107. fromCell.SetCube(toCube);
  108. toCell.SetCube(fromCube);
  109. toCube.MoveToNewPos(cc.v3(fromCell.node.x, fromCell.node.y));
  110. fromCube.MoveToNewPos(cc.v3(toCell.node.x, toCell.node.y), 0.05);
  111. }
  112. /** 将索引转换为位置 */
  113. public TranIdxToPos(idx: number): cc.Vec2 {
  114. let row = idx % 10;
  115. let col = Math.floor(idx / 10);
  116. return cc.v2(row - 1, col - 1);
  117. }
  118. /** 检测目标格子是否可以放置&合成&交换物品 */
  119. public CellCanPut(fromCell: UECell, toCell: UECell): boolean {
  120. //目标格子是空格子
  121. if (toCell.IsEmpty()) {
  122. return true;
  123. }
  124. //检测目标格子物品是否可以拖动
  125. if (toCell.GetCube().CanDrag()) {
  126. return true;
  127. }
  128. //目标位置是物品,但是可以合成
  129. if (this.CanMergeItems(fromCell, toCell)) {
  130. return true;
  131. }
  132. return false;
  133. }
  134. /** 是否可以合成 */
  135. private CanMergeItems(fromCell: UECell, toCell: UECell): boolean {
  136. let formulaKey = `${fromCell.GetCube().GetCubeData().type}_${fromCell.GetCube().GetCubeData().id}_${toCell.GetCube().GetCubeData().type}_${toCell.GetCube().GetCubeData().id}`;
  137. let mergeArr = this.formulaMap[formulaKey];
  138. if (gameMethod.isEmpty(mergeArr)) {
  139. return false;
  140. }
  141. return true;
  142. }
  143. /** 获取可合成的物品集 */
  144. public GetMergeItems(cube1: UECube, cube2: UECube) {
  145. let formulaKey = `${cube1.GetCubeData().type}_${cube1.GetCubeData().id}_${cube2.GetCubeData().type}_${cube2.GetCubeData().id}`;
  146. let mergeArr = this.formulaMap[formulaKey];
  147. return mergeArr || [];
  148. }
  149. }