battle.go 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. package battle
  2. import (
  3. "fmt"
  4. "net/http"
  5. "time"
  6. "wartank/pkg/components/section"
  7. "wartank/pkg/types"
  8. "wartank/server/serv_bots/warbot/angar/battle/battle_register"
  9. "wartank/server/serv_bots/warbot/angar/battle/battle_wait"
  10. "wartank/server/serv_bots/warbot/angar/battle/battle_worker"
  11. )
  12. /*
  13. Объект ожидания сражения на базе
  14. */
  15. // Battle -- объект ожидания сражения на базе
  16. type Battle struct {
  17. *section.Section
  18. bot types.IBot
  19. conn *http.Client
  20. battleRegister *battle_register.BattleRegister // Регистратор на сражение
  21. battleWaiter *battle_wait.BattleWait // Ождатель начала сражения
  22. battleWorker *battle_worker.BattleWorker // Исполнитель сражения
  23. }
  24. // NewBattle -- возвращает новый *Battle
  25. func NewBattle(bot types.IBot) (*Battle, error) {
  26. if bot == nil {
  27. return nil, fmt.Errorf("NewBattle(): IBot == nil")
  28. }
  29. sf := &Battle{
  30. bot: bot,
  31. conn: bot.BotNet().Conn(),
  32. }
  33. var err error
  34. {
  35. sf.battleRegister, err = battle_register.NewBattleRegister(bot)
  36. if err != nil {
  37. return nil, fmt.Errorf("NewBattle(): при создании регистратора на сражения, err=\n\t%w", err)
  38. }
  39. sf.battleWaiter, err = battle_wait.NewBattleWait(bot)
  40. if err != nil {
  41. return nil, fmt.Errorf("NewBattle(): при создании ожидателя сражения, err=\n\t%w", err)
  42. }
  43. sf.battleWorker, err = battle_worker.NewBattleWorker(bot)
  44. if err != nil {
  45. return nil, fmt.Errorf("NewBattle(): при создании исполнителя сражения, err=\n\t%w", err)
  46. }
  47. }
  48. // sf.shotTimeFull.Set(8000) // 8000 msec
  49. return sf, nil
  50. }
  51. func (sf *Battle) Run() error {
  52. var err error
  53. { // ISection
  54. sf.Section, err = section.NewSection(sf.bot, `<span>до начала `)
  55. if err != nil {
  56. return fmt.Errorf("Battle.Run(): in create *Section, err=\n\t%w", err)
  57. }
  58. }
  59. sf.battleRegister.Run()
  60. sf.battleWaiter.Run()
  61. sf.battleWorker.Run()
  62. go sf.run()
  63. return nil
  64. }
  65. // запускает в работу сражение
  66. func (sf *Battle) run() {
  67. // sf.CountDown().SetInt(2)
  68. for {
  69. select {
  70. case <-sf.bot.Ctx().Done():
  71. return
  72. default:
  73. sf.battleRegister.Register()
  74. sf.battleWaiter.Wait()
  75. sf.battleWorker.Work()
  76. for len(sf.CountDown().ChanSig()) > 0 {
  77. <-sf.CountDown().ChanSig()
  78. }
  79. time.Sleep(time.Second * 2) // Пауза между циклами, чтобы сервер не долбить запросами
  80. }
  81. }
  82. }
  83. // Alarm -- возвращает признак начала сражения (для браузера)
  84. func (sf *Battle) Alarm() types.IStatParam {
  85. return sf.battleWorker.Alarm()
  86. }