battleon.go 3.7 KB

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