battle.go 2.9 KB

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