extend_map_id.go 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243
  1. package data
  2. import (
  3. "f1-game/internal/pb"
  4. "f1-game/internal/types"
  5. "os"
  6. cfile "github.com/cherry-game/cherry/extend/file"
  7. clog "github.com/cherry-game/cherry/logger"
  8. cprofile "github.com/cherry-game/cherry/profile"
  9. "google.golang.org/protobuf/proto"
  10. )
  11. var (
  12. _mapData = &pb.MapData{}
  13. _mapDataExt = &pb.MapDataEXT{}
  14. _mapInnerScene = &pb.MapData{}
  15. )
  16. func MapData() *pb.MapData {
  17. return _mapData
  18. }
  19. func InnerScene() []*pb.TileData {
  20. return _mapInnerScene.Tiles
  21. }
  22. func MapInfo() *pb.MapInfo {
  23. return _mapData.MapInfo
  24. }
  25. func MapWidth() int32 {
  26. return MapInfo().Width
  27. }
  28. func MapHeight() int32 {
  29. return MapInfo().Height
  30. }
  31. func AreaData() []*pb.AreaData {
  32. return _mapDataExt.AreaData
  33. }
  34. func BornData() map[int32]*pb.BornData {
  35. return _mapDataExt.BornData
  36. }
  37. func ReserveBornData() map[int32]*pb.BornData {
  38. return _mapDataExt.ReserveBornData
  39. }
  40. func ResData() map[int32]*pb.ResData {
  41. return _mapDataExt.ResData
  42. }
  43. func PointToTileID(x, y int32) (int32, bool) {
  44. return MapData().PointToTileID(x, y)
  45. }
  46. func TileIDToPoint(tileID int32) (int32, int32) {
  47. return MapData().TileIDToPoint(tileID)
  48. }
  49. func IsPointOutOfBound(x, y int32) bool {
  50. return MapData().IsPointOutOfBound(x, y)
  51. }
  52. func GetBornTileID(tileID int32) (int32, bool) {
  53. tileExtend := _mapDataExt.Tiles[tileID]
  54. if tileExtend == nil || !tileExtend.IsBornPoint {
  55. return 0, false
  56. }
  57. tile := _mapData.Tiles[tileID]
  58. if tile == nil {
  59. return 0, false
  60. }
  61. if tile.CastleCenter >= 0 {
  62. return tile.CastleCenter, true
  63. }
  64. return tile.CoordIndex, true
  65. }
  66. func GetReserveBornTileID(tileID int32) (int32, bool) {
  67. tileExtend := _mapDataExt.Tiles[tileID]
  68. if tileExtend == nil || !tileExtend.IsReserveBornPoint {
  69. return 0, false
  70. }
  71. tile := _mapData.Tiles[tileID]
  72. if tile == nil {
  73. return 0, false
  74. }
  75. if tile.CastleCenter >= 0 {
  76. return tile.CastleCenter, true
  77. }
  78. return tile.CoordIndex, true
  79. }
  80. // IsInnerSceneFoundation 判断是否内城地基
  81. func IsInnerSceneFoundation(tileID int32) bool {
  82. innerScene := InnerScene()
  83. if tileID >= int32(len(innerScene)) {
  84. return true
  85. }
  86. return innerScene[tileID].Terrain == pb.TerrainType_tt_foundation
  87. }
  88. func (p *mapIDConfig) LoadData(nodeID string) {
  89. nodeRow, ok := Node.GetByNodeID(nodeID)
  90. if !ok {
  91. clog.Fatalf("node id not found. map id = %v", nodeID)
  92. return
  93. }
  94. mapIDRow, ok := MapID.GetByMapID(nodeRow.MapID)
  95. if !ok {
  96. clog.Fatalf("map id not found. mapID = %v", nodeRow.MapID)
  97. }
  98. var err error
  99. // !!! 这个必须放在第一个
  100. err = p.loadMapData(mapIDRow.MapGroup, mapIDRow.MapDataFilepath)
  101. if err != nil {
  102. clog.Fatalf("map data not found. mapID = %v", nodeRow.MapID)
  103. return
  104. }
  105. err = p.loadMapDataExt(mapIDRow.MapGroup, mapIDRow.MapDataExtFilepath)
  106. if err != nil {
  107. clog.Fatalf("map ext data not found. mapID = %v", nodeRow.MapID)
  108. return
  109. }
  110. err = p.loadMapInnerScene(mapIDRow.MapGroup, mapIDRow.InnerSceneFilepath)
  111. if err != nil {
  112. clog.Fatalf("inner scene data not found. mapID = %v", nodeRow.MapID)
  113. return
  114. }
  115. }
  116. func (p *mapIDConfig) loadMapData(dir, filePath string) error {
  117. if err := p.loadProtoData(dir, filePath, _mapData); err != nil {
  118. return err
  119. }
  120. // 检测数据是否有效,无效则 Panic
  121. // 检查系统城上的点有没有被设置成固定障碍点的
  122. for _, castle := range _mapData.Castles {
  123. tile := _mapData.Tiles[castle.Center]
  124. if tile.IsBlock() {
  125. x, y := _mapData.TileIDToPoint(castle.Center)
  126. clog.Fatalf("castle center is block. tileID = %d, point = (%d, %d) ,configID = %d", castle.Center, x, y, castle.ConfigId)
  127. }
  128. for _, tileID := range castle.Childs {
  129. tile := _mapData.Tiles[tileID]
  130. if tile.IsBlock() {
  131. x, y := _mapData.TileIDToPoint(tileID)
  132. clog.Fatalf("castle child is block. tileID = %d, point = (%d, %d) ,configID = %d", tileID, x, y, castle.ConfigId)
  133. }
  134. }
  135. for tag, value := range castle.Tag_TilePoints {
  136. if tag == int32(pb.MapRuleTag_mrt_wall) {
  137. continue
  138. }
  139. for _, tileID := range value.Points {
  140. tile := _mapData.Tiles[tileID]
  141. if tile.IsBlock() {
  142. x, y := _mapData.TileIDToPoint(tileID)
  143. clog.Fatalf("castle tag tile is block. tileID = %d, point = (%d, %d) ,configID = %d, tag = %s", tileID, x, y, castle.ConfigId, pb.MapRuleTag_name[tag])
  144. }
  145. }
  146. }
  147. }
  148. return nil
  149. }
  150. func (p *mapIDConfig) loadMapDataExt(dir, filePath string) error {
  151. if err := p.loadProtoData(dir, filePath, _mapDataExt); err != nil {
  152. return err
  153. }
  154. // 检查资源点有没有导常
  155. for _, resData := range _mapDataExt.ResData {
  156. if _mapData.IsTileBlock(resData.Center) {
  157. clog.Fatalf("res data is block: %+v", resData)
  158. }
  159. }
  160. return nil
  161. }
  162. func (p *mapIDConfig) loadMapInnerScene(dir, filePath string) error {
  163. return p.loadProtoData(dir, filePath, _mapInnerScene)
  164. }
  165. func (p *mapIDConfig) loadProtoData(dir, filePath string, m proto.Message) error {
  166. fullPath, err := cfile.JoinPath(cprofile.Path(), "../data_map/", dir, filePath)
  167. if err != nil {
  168. return err
  169. }
  170. bytes, err := os.ReadFile(fullPath)
  171. if err != nil {
  172. return err
  173. }
  174. if err = proto.Unmarshal(bytes, m); err != nil {
  175. return err
  176. }
  177. return nil
  178. }
  179. // GetOffsetPoints 获取偏移坐标点,不包含中心点
  180. func GetOffsetPoints(x, y int32, odd, even types.Points) types.Points {
  181. var points types.Points
  182. var offsets types.Points
  183. if x%2 == 0 {
  184. offsets = even
  185. } else {
  186. offsets = odd
  187. }
  188. for _, pt := range offsets {
  189. if pt.X == 0 && pt.Y == 0 {
  190. continue
  191. }
  192. points.Add(x+pt.X, y+pt.Y)
  193. }
  194. return points
  195. }