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. )
  13. /*
  14. Предоставляет сетевой компонент при непосредственном сражении
  15. */
  16. // СражениеДействие -- непосредственно танкует в сражении
  17. type СражениеДействие struct {
  18. ИАрена
  19. конт ILocalCtx
  20. кнт context.Context // Контекст сражения
  21. фнОтменить func() // Функция отмены сражения
  22. выстрел ИВыстрел // Объект выстрела
  23. здоровье ИЗдоровье // Текущее здоровье танка
  24. манёвр ИМанёвр // Возможность маневрирования
  25. логин string
  26. еслиКонец ISafeBool
  27. }
  28. // НовСражениеДействие -- возвращает новый *BattleOn
  29. func НовСражениеДействие(конт ILocalCtx) ИСражениеПроцесс {
  30. // Ограничить время сражения бота
  31. кнтСражение, фнОтменить := context.WithTimeout(конт.Ctx(), time.Second*305)
  32. сам := &СражениеДействие{
  33. конт: конт,
  34. кнт: кнтСражение,
  35. фнОтменить: фнОтменить,
  36. логин: конт.Get("бот_имя").Val().(string),
  37. еслиКонец: NewSafeBool(),
  38. }
  39. аренаКонфиг := arena.АренаКонфиг{
  40. Конт_: конт,
  41. АренаИмя_: "Исполнитель сражения",
  42. СтрКонтроль_: `<title>Сражения</title>`,
  43. ФнПуск_: сам.пуск,
  44. СтрУрл_: "https://wartank.ru/pve",
  45. }
  46. сам.ИАрена = arena.НовАрена(конт, аренаКонфиг)
  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. }