arena_state.go 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  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. Hassert(состояние == cons.РежимПостроено, "АренаСостояние.Уст(): нельзя из 'не существует' перейти в '%v'", состояние)
  30. case cons.РежимПостроено:
  31. switch состояние {
  32. case cons.РежимАпгрейд, cons.РежимАпгрейдПлатный, cons.РежимОжидание, cons.РежимРабота, cons.РежимЗабрать:
  33. сам.знач = состояние
  34. default:
  35. Hassert(false, "АренаСостояние.Уст(): нельзя из 'построено' перейти в '%v'", состояние)
  36. }
  37. case cons.РежимАпгрейд:
  38. switch состояние {
  39. case cons.РежимАпгрейдПлатный, cons.РежимОжидание:
  40. сам.знач = состояние
  41. return
  42. default:
  43. Hassert(false, "АренаСостояние.Уст(): нельзя из 'апгрейд' перейти в '%v'", состояние)
  44. }
  45. case cons.РежимАпгрейдПлатный:
  46. if состояние == cons.РежимОжидание {
  47. сам.знач = состояние
  48. return
  49. }
  50. if состояние == cons.РежимАпгрейд {
  51. сам.знач = состояние
  52. return
  53. }
  54. case cons.РежимОжидание:
  55. if состояние == cons.РежимРабота {
  56. сам.знач = состояние
  57. return
  58. }
  59. if состояние == cons.РежимАпгрейдПлатный {
  60. сам.знач = состояние
  61. return
  62. }
  63. case cons.РежимРабота:
  64. Hassert(состояние == cons.РежимЗабрать, "АренаСостояние.Уст(): нельзя из 'работа' перейти в '%v'", состояние)
  65. case cons.РежимЗабрать:
  66. Hassert(состояние == cons.РежимОжидание, "АренаСостояние.Уст(): нельзя из 'забрать' перейти в '%v'", состояние)
  67. default:
  68. Hassert(false, "АренаСостояние.Уст(): нельзя из '%v' перейти в '%v'", сам.знач, состояние)
  69. }
  70. сам.знач = состояние
  71. }
  72. // Состояние -- возвращает состояние арены
  73. func (сам *АренаСостояние) Получ() alias.ААренаСостояние {
  74. сам.block.RLock()
  75. defer сам.block.RUnlock()
  76. return сам.знач
  77. }