GridMapModel.ts 7.6 KB

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