battleon.go 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. package battle_worker
  2. import (
  3. "context"
  4. "time"
  5. . "wartank/app/lev0/types"
  6. "wartank/app/lev2/arena"
  7. "wartank/app/lev2/arena_battle/battle_worker/battle_worker/health"
  8. "wartank/app/lev2/arena_battle/battle_worker/battle_worker/manevr"
  9. "wartank/app/lev2/arena_battle/battle_worker/battle_worker/shot"
  10. "wartank/app/lev2/arena_battle/battle_worker/battle_worker/shot/is_shot"
  11. . "wartank/kernel/kernel_types"
  12. )
  13. /*
  14. Предоставляет сетевой компонент при непосредственном сражении
  15. */
  16. // СражениеДействие -- непосредственно танкует в сражении
  17. type СражениеДействие struct {
  18. ИАрена
  19. бот ИБот
  20. кнт context.Context // Контекст сражения
  21. фнОтменить func() // Функция отмены сражения
  22. выстрел *shot.Выстрел // Объект выстрела
  23. здоровье *health.Здоровье // Текущее здоровье танка
  24. манёвр *manevr.Манёвр // Возможность маневрирования
  25. логин string
  26. еслиВыстрел *is_shot.IsShot // Признак необходимости маскирования (запрет стрельбы, когда слабое здоровье)
  27. }
  28. // НовСражениеДействие -- возвращает новый *BattleOn
  29. func НовСражениеДействие(конт ИЯдроКонтекст, бот ИБот) *СражениеДействие {
  30. // Ограничить время сражения бота
  31. кнтСражение, фнОтменить := context.WithTimeout(бот.Контекст(), time.Second*305)
  32. сам := &СражениеДействие{
  33. бот: бот,
  34. кнт: кнтСражение,
  35. фнОтменить: фнОтменить,
  36. логин: бот.Имя(),
  37. еслиВыстрел: is_shot.NewIsShot(),
  38. }
  39. аренаКонфиг := arena.АренаКонфиг{
  40. Бот_: сам.бот,
  41. АренаИмя_: "Исполнитель сражения",
  42. СтрКонтроль_: `<title>Сражения</title>`,
  43. ФнПуск_: сам.пуск,
  44. СтрУрл_: "https://wartank.ru/pve",
  45. }
  46. сам.ИАрена = arena.НовАрена(конт, аренаКонфиг)
  47. go сам.пуск()
  48. _ = ИСражениеДействие(сам)
  49. return сам
  50. }
  51. // запускает сражение
  52. func (сам *СражениеДействие) пуск() {
  53. defer func() {
  54. сам.фнОтменить()
  55. // log._rintf("BattleOn.run(): сражение завершено\n")
  56. }()
  57. { // Подготовка к сражению
  58. var err error
  59. сам.выстрел, err = shot.НовВыстрел(сам) // Объект выстрела
  60. if err != nil {
  61. // log._rintf("ERRO BattleOn.Run(): при создании выстрела танка, err=\n\t%v\n", err)
  62. return
  63. }
  64. сам.здоровье, err = health.НовЗдоровье(сам)
  65. if err != nil {
  66. // log._rintf("ERRO BattleOn.Run(): при создании здоровья танка, err=\n\t%v\n", err)
  67. return
  68. }
  69. сам.манёвр, err = manevr.НовМанёвр(сам)
  70. if err != nil {
  71. // log._rintf("ERRO BattleOn.Run(): при создании маневра танка, err=\n\t%v\n", err)
  72. return
  73. }
  74. }
  75. // Рабочий цикл сражения
  76. <-сам.кнт.Done()
  77. }
  78. func (сам *СражениеДействие) МанёврНадоУст() {
  79. if сам.манёвр == nil {
  80. return
  81. }
  82. сам.манёвр.УстНадо()
  83. }
  84. // ВыстрелБлок -- признак запрета стрельбы при слабом здоровье
  85. func (сам *СражениеДействие) ВыстрелБлок() ИЕслиВыстрел {
  86. return сам.еслиВыстрел
  87. }
  88. // Кнт -- возвращает контекст отмены сражения
  89. func (сам *СражениеДействие) Контекст() context.Context {
  90. return сам.кнт
  91. }
  92. // ОтменитьДействие -- вызов функции отмены контекста сражения
  93. func (сам *СражениеДействие) Отменить() {
  94. сам.фнОтменить()
  95. }