extend_map_id.go 5.8 KB

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