| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485 |
- // package battle -- объект сражения
- package battle
- import (
- "fmt"
- "net/http"
- "time"
- "wartank/pkg/components/section"
- "wartank/pkg/types"
- "wartank/server/serv_bots/warbot/angar/battle/battle_register"
- "wartank/server/serv_bots/warbot/angar/battle/battle_wait"
- "wartank/server/serv_bots/warbot/angar/battle/battle_worker"
- )
- // Battle -- объект сражения
- type Battle struct {
- *section.Section
- bot types.ИБот
- conn *http.Client
- battleRegister *battle_register.BattleRegister // Регистратор на сражение
- battleWaiter *battle_wait.BattleWait // Ождатель начала сражения
- battleWorker *battle_worker.BattleWorker // Исполнитель сражения
- }
- // NewBattle -- возвращает новый *Battle
- func NewBattle(bot types.ИБот) (*Battle, error) {
- section, err := section.NewSection(bot, "Группа сражения", `<span>до начала `)
- if err != nil {
- return nil, fmt.Errorf("NewBattle(): in create *Section, err=\n\t%w", err)
- }
- sf := &Battle{
- Section: section,
- bot: bot,
- conn: bot.Сеть().Коннект(),
- }
- {
- sf.battleRegister, err = battle_register.NewBattleRegister(bot)
- if err != nil {
- return nil, fmt.Errorf("NewBattle(): при создании регистратора на сражения, err=\n\t%w", err)
- }
- sf.battleWaiter, err = battle_wait.NewBattleWait(bot)
- if err != nil {
- return nil, fmt.Errorf("NewBattle(): при создании ожидателя сражения, err=\n\t%w", err)
- }
- sf.battleWorker, err = battle_worker.NewBattleWorker(bot)
- if err != nil {
- return nil, fmt.Errorf("NewBattle(): при создании исполнителя сражения, err=\n\t%w", err)
- }
- }
- // sf.shotTimeFull.Set(8000) // 8000 msec
- return sf, nil
- }
- func (sf *Battle) Run() error {
- go sf.run()
- return nil
- }
- // запускает в работу сражение
- func (sf *Battle) run() {
- // sf.CountDown().SetInt(2)
- for {
- select {
- case <-sf.bot.Кнт().Done():
- return
- default:
- sf.battleRegister.Register()
- sf.battleWaiter.Wait()
- sf.battleWorker.Work()
- for len(sf.ВремяОпрос().КаналСиг()) > 0 {
- <-sf.ВремяОпрос().КаналСиг()
- }
- time.Sleep(time.Second * 2) // Пауза между циклами, чтобы сервер не долбить запросами
- }
- }
- }
- // ЕслиНачало -- возвращает признак начала сражения (для браузера)
- func (sf *Battle) ЕслиНачало() types.ИСтатПарам {
- return sf.battleWorker.Alarm()
- }
|