GridMapModel.ts 5.1 KB

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