battle.go 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  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.ИБот
  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.ИБот) (*Battle, error) {
  24. section, err := section.NewSection(bot, "Группа сражения", `<span>до начала `)
  25. if err != nil {
  26. return nil, fmt.Errorf("NewBattle(): in create *Section, err=\n\t%w", err)
  27. }
  28. sf := &Battle{
  29. Section: section,
  30. bot: bot,
  31. conn: bot.Сеть().Коннект(),
  32. }
  33. {
  34. sf.battleRegister, err = battle_register.NewBattleRegister(bot)
  35. if err != nil {
  36. return nil, fmt.Errorf("NewBattle(): при создании регистратора на сражения, err=\n\t%w", err)
  37. }
  38. sf.battleWaiter, err = battle_wait.NewBattleWait(bot)
  39. if err != nil {
  40. return nil, fmt.Errorf("NewBattle(): при создании ожидателя сражения, err=\n\t%w", err)
  41. }
  42. sf.battleWorker, err = battle_worker.NewBattleWorker(bot)
  43. if err != nil {
  44. return nil, fmt.Errorf("NewBattle(): при создании исполнителя сражения, err=\n\t%w", err)
  45. }
  46. }
  47. // sf.shotTimeFull.Set(8000) // 8000 msec
  48. return sf, nil
  49. }
  50. func (sf *Battle) Run() error {
  51. go sf.run()
  52. return nil
  53. }
  54. // запускает в работу сражение
  55. func (sf *Battle) run() {
  56. // sf.CountDown().SetInt(2)
  57. for {
  58. select {
  59. case <-sf.bot.Кнт().Done():
  60. return
  61. default:
  62. sf.battleRegister.Register()
  63. sf.battleWaiter.Wait()
  64. sf.battleWorker.Work()
  65. for len(sf.ВремяОпрос().КаналСиг()) > 0 {
  66. <-sf.ВремяОпрос().КаналСиг()
  67. }
  68. time.Sleep(time.Second * 2) // Пауза между циклами, чтобы сервер не долбить запросами
  69. }
  70. }
  71. }
  72. // ЕслиНачало -- возвращает признак начала сражения (для браузера)
  73. func (sf *Battle) ЕслиНачало() types.ИСтатПарам {
  74. return sf.battleWorker.Alarm()
  75. }