process_divwar.go 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  1. package process_divwar
  2. import (
  3. "context"
  4. "strings"
  5. "time"
  6. . "wartank/app/lev0/types"
  7. "wartank/app/lev1/health"
  8. "wartank/app/lev1/manevr"
  9. "wartank/app/lev1/shot"
  10. "wartank/app/lev2/arena"
  11. "wartank/kernel"
  12. . "wartank/kernel/kernel_types"
  13. )
  14. /*
  15. Предоставляет сетевой компонент при непосредственном сражении
  16. */
  17. // ПроцессДивизияВойна -- непосредственно танкует в сражении
  18. type ПроцессДивизияВойна struct {
  19. ИАрена
  20. бот ИБот
  21. лог ИЯдроЛог
  22. ctxDivWar context.Context // Контекст сражения
  23. fnCancelDivWar func() // Функция отмены сражения
  24. выстрел ИВыстрел // Объект выстрела
  25. здоровье ИЗдоровье // Текущее здоровье танка
  26. манёвр ИМанёвр // Возможность маневрирования
  27. логин string
  28. chTick chan int // Ежесекундная проверка на окончание сражения
  29. isEnd ИБезопБул
  30. }
  31. // НовПроцессДивизияВойна -- возвращает новый *DivWarOn
  32. func НовПроцессДивизияВойна(конт ИБотКонтекст) ИСражениеПроцесс {
  33. лог:=kernel.НовЛог("ПроцессДивизияВойна")
  34. бот:=конт.Получ("бот").(ИБот)
  35. ctxDivWar, fnCancelDivWar := context.WithTimeout(бот.Контекст(), time.Second*305)
  36. сам := &ПроцессДивизияВойна{
  37. бот: бот,
  38. лог:лог,
  39. ctxDivWar: ctxDivWar,
  40. fnCancelDivWar: fnCancelDivWar,
  41. логин: бот.Имя(),
  42. isEnd: kernel.НовБезопБул(),
  43. }
  44. аренаКонфиг := arena.АренаКонфиг{
  45. Бот_: бот,
  46. АренаИмя_: "Сражение",
  47. СтрКонтроль_: `<title>Сражения</title>`,
  48. ФнПуск_: сам.пуск,
  49. СтрУрл_: "https://wartank.ru/pve",
  50. }
  51. сам.ИАрена = arena.НовАрена(конт, аренаКонфиг)
  52. if сам.checkEnd() {
  53. return nil
  54. }
  55. go сам.makeTick()
  56. go сам.run()
  57. return сам
  58. }
  59. // Манёвр -- возвращает объект манёвра
  60. func (сам *ПроцессДивизияВойна) Манёвр() ИМанёвр {
  61. return сам.манёвр
  62. }
  63. // Выстрел -- возвращает объект выстрела
  64. func (сам *ПроцессДивизияВойна) Выстрел() ИВыстрел {
  65. return сам.выстрел
  66. }
  67. // пускает сражение
  68. func (сам *ПроцессДивизияВойна) пуск() {
  69. }
  70. // Ежесекудный тик
  71. func (сам *ПроцессДивизияВойна) makeTick() {
  72. defer func() {
  73. close(сам.chTick)
  74. сам.isEnd.Уст()
  75. }()
  76. for !сам.isEnd.Получ() {
  77. select {
  78. case <-сам.бот.Контекст().Done(): // Отмена контекста приложения
  79. return
  80. case <-сам.ctxDivWar.Done(): // Битва закончилась
  81. return
  82. default:
  83. if сам.isEnd.Получ() {
  84. return
  85. }
  86. сам.chTick <- 1
  87. time.Sleep(time.Second * 1)
  88. }
  89. }
  90. }
  91. // запускает сражение
  92. func (сам *ПроцессДивизияВойна) run() {
  93. // defer log._rintf("ПроцессДивизияВойна.run(): сражение завершено\n")
  94. { // Подготовка к сражению
  95. сам.выстрел = shot.НовВыстрел(сам) // Объект выстрела
  96. сам.здоровье = health.НовЗдоровье(сам)
  97. сам.манёвр = manevr.НовМанёвр(сам)
  98. }
  99. for { // Рабочий цикл сражения
  100. select {
  101. case <-сам.ctxDivWar.Done():
  102. return
  103. case <-сам.ВремяОстат().КаналСиг():
  104. if сам.checkEnd() {
  105. return
  106. }
  107. }
  108. }
  109. }
  110. // Проверяет окончание сражения
  111. func (сам *ПроцессДивизияВойна) checkEnd() bool {
  112. defer func() {
  113. if сам.isEnd.Получ() {
  114. сам.fnCancelDivWar()
  115. // log._rintf("DivWarOn.checkEnd(): сражение завершено\n")
  116. }
  117. }()
  118. сам.Обновить()
  119. lstDivWarOn := сам.СписПолучить()
  120. for _, strOut := range lstDivWarOn {
  121. if strings.Contains(strOut, `" class="simple-but gray"><span><span>ОБЫЧНЫЕ</span></span></a>`) {
  122. сам.isEnd.Сброс()
  123. return false
  124. }
  125. }
  126. сам.isEnd.Уст()
  127. сам.fnCancelDivWar()
  128. return true
  129. }
  130. // ЕслиКонец -- возвращает признак окончания сражения (интерфейс)
  131. func (сам *ПроцессДивизияВойна) ЕслиКонец() ИБезопБул {
  132. return сам.isEnd
  133. }
  134. // Ctx -- возвращает контекст отмены сражения
  135. func (сам *ПроцессДивизияВойна) Ctx() context.Context {
  136. return сам.ctxDivWar
  137. }
  138. // CancelBattle - -вызов функции отмены контекста сражения
  139. func (сам *ПроцессДивизияВойна) CancelBattle() {
  140. сам.fnCancelDivWar()
  141. }