battleon.go 3.7 KB

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