room_fish.go 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. package gamelogic
  2. import (
  3. "bet24.com/log"
  4. "bet24.com/servers/games/fish/config"
  5. "bet24.com/servers/games/fish/fish"
  6. "sync"
  7. )
  8. type fish_manager struct {
  9. fishkey int
  10. fish_list []*fish.Fish
  11. lock *sync.RWMutex
  12. spawn_manager *spawn_fish_manager
  13. roomName string
  14. }
  15. func newFishManager(roomName string) *fish_manager {
  16. this := new(fish_manager)
  17. this.fishkey = 0
  18. this.lock = &sync.RWMutex{}
  19. this.roomName = roomName
  20. //this.spawn_manager = newSpwanFishManager(false)
  21. return this
  22. }
  23. func (this *fish_manager) getFish(fishKey int) *fish.Fish {
  24. this.lock.RLock()
  25. defer this.lock.RUnlock()
  26. for _, v := range this.fish_list {
  27. if v.FishKey == fishKey {
  28. return v
  29. }
  30. }
  31. return nil
  32. }
  33. func (this *fish_manager) generateFish(isGroupState bool) (ret []*fish.Fish) {
  34. this.lock.Lock()
  35. defer this.lock.Unlock()
  36. // 清理死鱼
  37. for i := 0; i < len(this.fish_list); {
  38. if this.fish_list[i].IsDead() {
  39. //log.Debug("fish %d is dead", this.fish_list[i].FishKey)
  40. this.fish_list = append(this.fish_list[:i], this.fish_list[i+1:]...)
  41. } else {
  42. i++
  43. }
  44. }
  45. if isGroupState {
  46. return
  47. }
  48. spawns := this.spawn_manager.checkSpawn()
  49. for _, v := range spawns {
  50. //log.Debug("fish_manager.generateFish %v", v)
  51. fish := fish.GenerateFish(this.fishkey, v.FishID, v.Speed, v.RouteID, 0)
  52. this.fishkey++
  53. this.fish_list = append(this.fish_list, fish)
  54. ret = append(ret, fish)
  55. }
  56. return
  57. }
  58. func (this *fish_manager) addFish(fishID, delaySecs int) {
  59. this.lock.Lock()
  60. defer this.lock.Unlock()
  61. fish := fish.GenerateFish(this.fishkey, fishID, 0, 0, delaySecs)
  62. this.fishkey++
  63. this.fish_list = append(this.fish_list, fish)
  64. }
  65. func (this *fish_manager) removeFish(fishKey int) bool {
  66. this.lock.Lock()
  67. defer this.lock.Unlock()
  68. for k, v := range this.fish_list {
  69. if v.FishKey == fishKey {
  70. this.fish_list = append(this.fish_list[:k], this.fish_list[k+1:]...)
  71. return true
  72. }
  73. }
  74. log.Release("removeFish fishKey(%d) not exist", fishKey)
  75. return false
  76. }
  77. func (this *fish_manager) getFishCount() int {
  78. this.lock.RLock()
  79. defer this.lock.RUnlock()
  80. return len(this.fish_list)
  81. }
  82. func (this *fish_manager) dump() {
  83. this.lock.RLock()
  84. defer this.lock.RUnlock()
  85. log.Debug("fish_manager.dump total count = %d", len(this.fish_list))
  86. for _, v := range this.fish_list {
  87. v.Dump()
  88. }
  89. }
  90. func (this *fish_manager) clear(byCreate bool) {
  91. this.lock.Lock()
  92. defer this.lock.Unlock()
  93. this.fish_list = []*fish.Fish{}
  94. this.spawn_manager = newSpwanFishManager(byCreate, config.GetSpawn(this.roomName))
  95. }
  96. func (this *fish_manager) addExtraLife(seconds int) {
  97. this.lock.Lock()
  98. defer this.lock.Unlock()
  99. for _, v := range this.fish_list {
  100. v.AddExtraLife(seconds)
  101. }
  102. }
  103. func (this *fish_manager) getBossAfter() int {
  104. return this.spawn_manager.getBossAfter()
  105. }
  106. func (this *fish_manager) pauseForFrozen(seconds int64) {
  107. this.spawn_manager.pauseForFrozen(seconds)
  108. }
  109. func (this *fish_manager) getRandomFish() int {
  110. return this.spawn_manager.getRandomFish()
  111. }