battle.go 2.7 KB

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