// package arena_state -- состояние арены package arena_state import ( "sync" . "gitp78su.ipnodns.ru/svi/kern/kc/helpers" "wartank/app/lev0/alias" "wartank/app/lev0/cons" . "wartank/app/lev0/types" ) // СценаСостояние -- состояние сцены type АренаСостояние struct { знач alias.ААренаСостояние // Имя режима block sync.RWMutex } // НовСекцияРежим -- возвращает новый *СценаРежим func НовАренаСостояние() *АренаСостояние { сам := &АренаСостояние{ знач: cons.РежимНеСуществует, } _ = ИАренаСостояние(сам) return сам } // СостояниеУст -- устанавливает состояние арены func (сам *АренаСостояние) Уст(состояние alias.ААренаСостояние) { сам.block.Lock() defer сам.block.Unlock() switch сам.знач { case cons.РежимНеСуществует: if состояние != cons.РежимПостроено { Hassert(false, "АренаСостояние.Уст(): нельзя из 'не существует' перейти в '%v'", состояние) } case cons.РежимПостроено: switch состояние { case cons.РежимАпгрейд, cons.РежимАпгрейдПлатный, cons.РежимОжидание, cons.РежимРабота, cons.РежимЗабрать: сам.знач = состояние default: Hassert(false, "АренаСостояние.Уст(): нельзя из 'построено' перейти в '%v'", состояние) } case cons.РежимАпгрейд: switch состояние { case cons.РежимАпгрейдПлатный, cons.РежимОжидание: сам.знач = состояние return default: Hassert(false, "АренаСостояние.Уст(): нельзя из 'апгрейд' перейти в '%v'", состояние) } case cons.РежимАпгрейдПлатный: if состояние == cons.РежимОжидание { сам.знач = состояние return } if состояние == cons.РежимАпгрейд { сам.знач = состояние return } case cons.РежимОжидание: if состояние == cons.РежимРабота { сам.знач = состояние return } if состояние == cons.РежимАпгрейдПлатный { сам.знач = состояние return } case cons.РежимРабота: if состояние != cons.РежимЗабрать { Hassert(false, "АренаСостояние.Уст(): нельзя из 'работа' перейти в '%v'", состояние) } case cons.РежимЗабрать: if состояние != cons.РежимОжидание { Hassert(false, "АренаСостояние.Уст(): нельзя из 'забрать' перейти в '%v'", состояние) } default: Hassert(false, "АренаСостояние.Уст(): нельзя из '%v' перейти в '%v'", сам.знач, состояние) } сам.знач = состояние } // Состояние -- возвращает состояние арены func (сам *АренаСостояние) Получ() alias.ААренаСостояние { сам.block.RLock() defer сам.block.RUnlock() return сам.знач }