arena_state.go 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. // package arena_state -- состояние арены
  2. package arena_state
  3. import (
  4. "sync"
  5. . "gitp78su.ipnodns.ru/svi/kern/kc/helpers"
  6. "wartank/app/lev0/alias"
  7. "wartank/app/lev0/cons"
  8. . "wartank/app/lev0/types"
  9. )
  10. // СценаСостояние -- состояние сцены
  11. type АренаСостояние struct {
  12. знач alias.ААренаСостояние // Имя режима
  13. block sync.RWMutex
  14. }
  15. // НовСекцияРежим -- возвращает новый *СценаРежим
  16. func НовАренаСостояние() *АренаСостояние {
  17. сам := &АренаСостояние{
  18. знач: cons.РежимНеСуществует,
  19. }
  20. _ = ИАренаСостояние(сам)
  21. return сам
  22. }
  23. // СостояниеУст -- устанавливает состояние арены
  24. func (сам *АренаСостояние) Уст(состояние alias.ААренаСостояние) {
  25. сам.block.Lock()
  26. defer сам.block.Unlock()
  27. switch сам.знач {
  28. case cons.РежимНеСуществует:
  29. if состояние != cons.РежимПостроено {
  30. Hassert(false, "АренаСостояние.Уст(): нельзя из 'не существует' перейти в '%v'", состояние)
  31. }
  32. case cons.РежимПостроено:
  33. switch состояние {
  34. case cons.РежимАпгрейд, cons.РежимАпгрейдПлатный, cons.РежимОжидание, cons.РежимРабота, cons.РежимЗабрать:
  35. сам.знач = состояние
  36. default:
  37. Hassert(false, "АренаСостояние.Уст(): нельзя из 'построено' перейти в '%v'", состояние)
  38. }
  39. case cons.РежимАпгрейд:
  40. switch состояние {
  41. case cons.РежимАпгрейдПлатный, cons.РежимОжидание:
  42. сам.знач = состояние
  43. return
  44. default:
  45. Hassert(false, "АренаСостояние.Уст(): нельзя из 'апгрейд' перейти в '%v'", состояние)
  46. }
  47. case cons.РежимАпгрейдПлатный:
  48. if состояние == cons.РежимОжидание {
  49. сам.знач = состояние
  50. return
  51. }
  52. if состояние == cons.РежимАпгрейд {
  53. сам.знач = состояние
  54. return
  55. }
  56. case cons.РежимОжидание:
  57. if состояние == cons.РежимРабота {
  58. сам.знач = состояние
  59. return
  60. }
  61. if состояние == cons.РежимАпгрейдПлатный {
  62. сам.знач = состояние
  63. return
  64. }
  65. case cons.РежимРабота:
  66. if состояние != cons.РежимЗабрать {
  67. Hassert(false, "АренаСостояние.Уст(): нельзя из 'работа' перейти в '%v'", состояние)
  68. }
  69. case cons.РежимЗабрать:
  70. if состояние != cons.РежимОжидание {
  71. Hassert(false, "АренаСостояние.Уст(): нельзя из 'забрать' перейти в '%v'", состояние)
  72. }
  73. default:
  74. Hassert(false, "АренаСостояние.Уст(): нельзя из '%v' перейти в '%v'", сам.знач, состояние)
  75. }
  76. сам.знач = состояние
  77. }
  78. // Состояние -- возвращает состояние арены
  79. func (сам *АренаСостояние) Получ() alias.ААренаСостояние {
  80. сам.block.RLock()
  81. defer сам.block.RUnlock()
  82. return сам.знач
  83. }