battle.go 2.6 KB

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