Selaa lähdekoodia

SVI Переделка на новую архитектуру

SVI 1 vuosi sitten
vanhempi
commit
aafb8139ac

+ 22 - 22
app/lev2/arena_division/div_war/div_war_on/health/health.go → app/lev1/health/health.go

@@ -9,11 +9,11 @@ import (
 	"strings"
 	"time"
 
-	"wartank/app/lev2/arena_division/div_war/div_war_on/health/health_time"
-	"wartank/app/lev2/arena_division/div_war/div_war_on/health/repair_time"
+	. "wartank/app/lev0/types"
+	"wartank/app/lev1/health/health_repair_time"
+	"wartank/app/lev1/health/health_time"
 
 	// "wartank/internal/components/sound"
-	. "wartank/app/lev0/types"
 	"wartank/kernel"
 	. "wartank/kernel/kernel_types"
 )
@@ -22,24 +22,24 @@ import (
 	Контролирует состояние здоровья танка
 */
 
-// Health -- контроль здоровья танка
-type Health struct {
+// Здоровье -- контроль здоровья танка
+type Здоровье struct {
 	ИДивизияВойнаДействие // FIXME:
 	fnCancel              func()
-	temp                  *health_time.HealthTime // Изменяемое здоровье танка
-	full                  *health_time.HealthTime // Полное здоровье танка
-	isRepair              ИБезопБул               // Необходимость восстановления
-	repairTime            *repair_time.RepairTime // Время до восстановления
-	isEnd                 ИБезопБул               // Ссылка на признак конца сражения
-	login                 string                  // Для поиска контрольных строк
-	chTick                chan int                // Канал для ровной отправки тиков
+	temp                  *health_time.HealthTime        // Изменяемое здоровье танка
+	full                  *health_time.HealthTime        // Полное здоровье танка
+	isRepair              ИБезопБул                      // Необходимость восстановления
+	repairTime            *health_repair_time.RepairTime // Время до восстановления
+	isEnd                 ИБезопБул                      // Ссылка на признак конца сражения
+	login                 string                         // Для поиска контрольных строк
+	chTick                chan int                       // Канал для ровной отправки тиков
 	// deltaOld                    int                    // Старая дельта потери здоровья
 	// countLow                    int
 	ctxBattle context.Context // Контекст сражения
 }
 
-// NewHealth -- возвращает новый *Health
-func NewHealth(дивВойна ИДивизияВойнаДействие, isEnd ИБезопБул, login string) (*Health, error) {
+// НовЗдоровье -- возвращает новый *Health
+func НовЗдоровье(дивВойна ИДивизияВойнаДействие, isEnd ИБезопБул, login string) (*Здоровье, error) {
 	{ // Предусловия
 		if дивВойна == nil {
 			return nil, fmt.Errorf("NewHealth(): дивВойна is nil")
@@ -51,14 +51,14 @@ func NewHealth(дивВойна ИДивизияВойнаДействие, isEn
 			return nil, fmt.Errorf("NewHealth(): login is empty")
 		}
 	}
-	сам := &Health{
+	сам := &Здоровье{
 		ИДивизияВойнаДействие: дивВойна,
 		fnCancel:   дивВойна.CancelBattle,
 		ctxBattle:  дивВойна.Ctx(),
 		temp:       health_time.NewHealthTime(),
 		full:       health_time.NewHealthTime(),
 		isRepair:   kernel.НовБезопБул(),
-		repairTime: repair_time.NewRepairTime(),
+		repairTime: health_repair_time.NewRepairTime(),
 		isEnd:      дивВойна.ЕслиКонец(),
 		login:      login,
 		chTick:     make(chan int, 2),
@@ -69,7 +69,7 @@ func NewHealth(дивВойна ИДивизияВойнаДействие, isEn
 }
 
 // Отправляет тики с заданным равным интервалом
-func (сам *Health) makeTik() {
+func (сам *Здоровье) makeTik() {
 	defer func() {
 		сам.CancelBattle()
 		close(сам.chTick)
@@ -102,7 +102,7 @@ func (сам *Health) makeTik() {
 }
 
 // Главный цикл обработки здоровья в сражении
-func (сам *Health) run() {
+func (сам *Здоровье) run() {
 	for {
 		select {
 		case <-сам.ctxBattle.Done():
@@ -127,12 +127,12 @@ func (сам *Health) run() {
 }
 
 // Full -- возвращает объект полного здоровья танка
-func (сам *Health) Full() int {
+func (сам *Здоровье) Full() int {
 	return сам.full.Get()
 }
 
 // IsDeath -- возвращает признак мертвичины танка
-func (сам *Health) IsDeath() bool {
+func (сам *Здоровье) IsDeath() bool {
 	if сам.isEnd.Получ() {
 		сам.fnCancel()
 		return true
@@ -151,7 +151,7 @@ func (сам *Health) IsDeath() bool {
 }
 
 // Ищет время восстановления ремки
-func (сам *Health) findRepairTime() {
+func (сам *Здоровье) findRepairTime() {
 	defer func() {
 		if сам.repairTime.IsReady() {
 			return
@@ -201,7 +201,7 @@ func (сам *Health) findRepairTime() {
 }
 
 // Восстанавливает здоровье (~)
-func (сам *Health) repair() {
+func (сам *Здоровье) repair() {
 	var (
 		strOut            string
 		lstBattleOn       = сам.СписПолучить()

+ 1 - 1
app/lev2/arena_division/div_war/div_war_on/health/repair_time/repair_time.go → app/lev1/health/health_repair_time/health_repair_time.go

@@ -1,4 +1,4 @@
-package repair_time
+package health_repair_time
 
 import (
 	"fmt"

+ 0 - 0
app/lev2/arena_division/div_war/div_war_on/health/health_time/health_time.go → app/lev1/health/health_time/health_time.go


+ 2 - 2
app/lev2/arena_angar/arena_angar.go

@@ -13,8 +13,8 @@ import (
 	"wartank/app/lev2/arena"
 	"wartank/app/lev2/arena_angar/fuel_attack"
 	"wartank/app/lev2/arena_base"
-	"wartank/app/lev2/arena_battle"
 	"wartank/app/lev2/arena_convoy"
+	"wartank/app/lev2/arena_duel"
 	"wartank/app/lev2/arena_masters"
 	"wartank/app/lev2/arena_missions"
 	"wartank/app/lev2/arena_upgrade"
@@ -78,7 +78,7 @@ func НовАнгар(конт ИБотКонтекст) (*АренаАнгар,
 
 	конвой := arena_convoy.НовКонвой(конт, сам.бот)
 	сам.словАрена["конвой"] = конвой
-	сражение := arena_battle.НовСражение(конт, сам.бот)
+	сражение := arena_duel.НовАренаДуэль(конт, сам.бот)
 	сам.словАрена["сражение"] = сражение
 	битваМастеров := arena_masters.НовБитваМастеров(конт, сам.бот)
 	сам.словАрена["битваМастеров"] = битваМастеров

+ 3 - 3
app/lev2/arena_death/arena_death.go

@@ -6,9 +6,9 @@ import (
 
 	. "wartank/app/lev0/types"
 	"wartank/app/lev2/arena"
-	"wartank/app/lev2/arena_battle/battle_register"
-	"wartank/app/lev2/arena_battle/battle_wait"
-	"wartank/app/lev2/arena_battle/battle_worker"
+	"wartank/app/lev2/arena_duel/battle_register"
+	"wartank/app/lev2/arena_duel/battle_wait"
+	"wartank/app/lev2/arena_duel/battle_worker"
 	. "wartank/kernel/kernel_types"
 )
 

+ 1 - 1
app/lev2/arena_death/death_worker/death_on/battle_sound/battle_sound.go

@@ -3,7 +3,7 @@ package battle_sound
 import (
 	"time"
 	"wartank/app/lev1/sound"
-	"wartank/app/lev2/arena_battle/battle_worker/battle_worker/battle_sound/is_sound_play"
+	"wartank/app/lev2/arena_duel/battle_worker/battle_worker/battle_sound/is_sound_play"
 )
 
 /*

+ 1 - 1
app/lev2/arena_death/death_worker/death_on/battlesound/battlesound.go

@@ -3,7 +3,7 @@ package battle_sound
 import (
 	"time"
 	"wartank/app/lev1/sound"
-	"wartank/app/lev2/arena_battle/battle_worker/battle_worker/battle_sound/is_sound_play"
+	"wartank/app/lev2/arena_duel/battle_worker/battle_worker/battle_sound/is_sound_play"
 )
 
 /*

+ 2 - 2
app/lev2/arena_death/death_worker/death_on/manevr/manevr.go

@@ -8,8 +8,8 @@ import (
 
 	"github.com/sirupsen/logrus"
 
-	"wartank/app/lev2/arena_battle/battle_worker/battle_worker/health/repair_time"
-	"wartank/app/lev2/arena_battle/battle_worker/battle_worker/manevr/is_manevr"
+	"wartank/app/lev2/arena_duel/battle_worker/battle_worker/health/repair_time"
+	"wartank/app/lev2/arena_duel/battle_worker/battle_worker/manevr/is_manevr"
 
 	// "wartank/internal/components/sound"
 	. "wartank/app/lev0/types"

+ 5 - 5
app/lev2/arena_division/div_war/div_war_on/div_war_on.go

@@ -7,8 +7,8 @@ import (
 	"time"
 
 	. "wartank/app/lev0/types"
+	"wartank/app/lev1/health"
 	"wartank/app/lev2/arena"
-	"wartank/app/lev3/bot/angar/division/div_war/div_war_on/health"
 	"wartank/app/lev3/bot/angar/division/div_war/div_war_on/manevr"
 	"wartank/app/lev3/bot/angar/division/div_war/div_war_on/shot"
 	"wartank/kernel"
@@ -26,9 +26,9 @@ type DivWarOn struct {
 	ctxDivWar      context.Context // Контекст сражения
 	fnCancelDivWar func()          // Функция отмены сражения
 
-	shot      *shot.Shot     // Объект выстрела
-	health    *health.Health // Текущее здоровье танка
-	manevr    *manevr.Manevr // Возможность маневрирования
+	shot      *shot.Shot       // Объект выстрела
+	health    *health.Здоровье // Текущее здоровье танка
+	manevr    *manevr.Manevr   // Возможность маневрирования
 	login     string
 	isMasking ИБезопБул // Признак необходимости маскирования (запрет стрельбы, когда слабое здоровье)
 	chTick    chan int  // Ежесекундная проверка на окончание сражения
@@ -101,7 +101,7 @@ func (сам *DivWarOn) run() {
 			// log._rintf("ERRO DivWarOn.Run(): при создании выстрела танка, err=\n\t%v\n", err)
 			return
 		}
-		сам.health, err = health.NewHealth(сам, сам.shot.IsEnd(), сам.login)
+		сам.health, err = health.НовЗдоровье(сам, сам.shot.IsEnd(), сам.login)
 		if err != nil {
 			// log._rintf("ERRO DivWarOn.Run(): при создании здоровья танка, err=\n\t%v\n", err)
 			сам.shot.IsEnd().Сброс()

+ 1 - 1
app/lev2/arena_division/div_war/div_war_on/div_war_sound/div_war_sound.go

@@ -3,7 +3,7 @@ package div_war_sound
 import (
 	"time"
 	"wartank/app/lev1/sound"
-	"wartank/app/lev2/arena_battle/battle_worker/battle_worker/battle_sound/is_sound_play"
+	"wartank/app/lev2/arena_duel/battle_worker/battle_worker/battle_sound/is_sound_play"
 )
 
 /*

+ 1 - 1
app/lev2/arena_division/div_war/div_war_on/divwarsound/divwarsound.go

@@ -3,7 +3,7 @@ package div_war_sound
 import (
 	"time"
 	"wartank/app/lev1/sound"
-	"wartank/app/lev2/arena_battle/battle_worker/battle_worker/battle_sound/is_sound_play"
+	"wartank/app/lev2/arena_duel/battle_worker/battle_worker/battle_sound/is_sound_play"
 )
 
 /*

+ 5 - 5
app/lev2/arena_division/div_war/divwaron/divwaron.go

@@ -8,7 +8,7 @@ import (
 
 	. "wartank/app/lev0/types"
 	"wartank/app/lev2/arena"
-	"wartank/app/lev3/bot/angar/division/div_war/div_war_on/health"
+		"wartank/app/lev1/health"
 	"wartank/app/lev3/bot/angar/division/div_war/div_war_on/manevr"
 	"wartank/app/lev3/bot/angar/division/div_war/div_war_on/shot"
 	"wartank/kernel"
@@ -26,9 +26,9 @@ type DivWarOn struct {
 	ctxDivWar      context.Context // Контекст сражения
 	fnCancelDivWar func()          // Функция отмены сражения
 
-	shot      *shot.Shot     // Объект выстрела
-	health    *health.Health // Текущее здоровье танка
-	manevr    *manevr.Manevr // Возможность маневрирования
+	shot      *shot.Shot       // Объект выстрела
+	health    *health.Здоровье // Текущее здоровье танка
+	manevr    *manevr.Manevr   // Возможность маневрирования
 	login     string
 	isMasking ИБезопБул // Признак необходимости маскирования (запрет стрельбы, когда слабое здоровье)
 	chTick    chan int  // Ежесекундная проверка на окончание сражения
@@ -101,7 +101,7 @@ func (сам *DivWarOn) run() {
 			// log._rintf("ERRO DivWarOn.Run(): при создании выстрела танка, err=\n\t%v\n", err)
 			return
 		}
-		сам.health, err = health.NewHealth(сам, сам.shot.IsEnd(), сам.login)
+		сам.health, err = health.НовЗдоровье(сам, сам.shot.IsEnd(), сам.login)
 		if err != nil {
 			// log._rintf("ERRO DivWarOn.Run(): при создании здоровья танка, err=\n\t%v\n", err)
 			сам.shot.IsEnd().Сброс()

+ 5 - 5
app/lev2/arena_division/divwar/div_war_on/div_war_on.go

@@ -8,7 +8,7 @@ import (
 
 	. "wartank/app/lev0/types"
 	"wartank/app/lev2/arena"
-	"wartank/app/lev3/bot/angar/division/div_war/div_war_on/health"
+		"wartank/app/lev1/health"
 	"wartank/app/lev3/bot/angar/division/div_war/div_war_on/manevr"
 	"wartank/app/lev3/bot/angar/division/div_war/div_war_on/shot"
 	"wartank/kernel"
@@ -26,9 +26,9 @@ type DivWarOn struct {
 	ctxDivWar      context.Context // Контекст сражения
 	fnCancelDivWar func()          // Функция отмены сражения
 
-	shot      *shot.Shot     // Объект выстрела
-	health    *health.Health // Текущее здоровье танка
-	manevr    *manevr.Manevr // Возможность маневрирования
+	shot      *shot.Shot       // Объект выстрела
+	health    *health.Здоровье // Текущее здоровье танка
+	manevr    *manevr.Manevr   // Возможность маневрирования
 	login     string
 	isMasking ИБезопБул // Признак необходимости маскирования (запрет стрельбы, когда слабое здоровье)
 	chTick    chan int  // Ежесекундная проверка на окончание сражения
@@ -101,7 +101,7 @@ func (сам *DivWarOn) run() {
 			// log._rintf("ERRO DivWarOn.Run(): при создании выстрела танка, err=\n\t%v\n", err)
 			return
 		}
-		сам.health, err = health.NewHealth(сам, сам.shot.IsEnd(), сам.login)
+		сам.health, err = health.НовЗдоровье(сам, сам.shot.IsEnd(), сам.login)
 		if err != nil {
 			// log._rintf("ERRO DivWarOn.Run(): при создании здоровья танка, err=\n\t%v\n", err)
 			сам.shot.IsEnd().Сброс()

+ 5 - 5
app/lev2/arena_division/divwar/divwaron/divwaron.go

@@ -8,7 +8,7 @@ import (
 
 	. "wartank/app/lev0/types"
 	"wartank/app/lev2/arena"
-	"wartank/app/lev3/bot/angar/division/div_war/div_war_on/health"
+		"wartank/app/lev1/health"
 	"wartank/app/lev3/bot/angar/division/div_war/div_war_on/manevr"
 	"wartank/app/lev3/bot/angar/division/div_war/div_war_on/shot"
 	"wartank/kernel"
@@ -26,9 +26,9 @@ type DivWarOn struct {
 	ctxDivWar      context.Context // Контекст сражения
 	fnCancelDivWar func()          // Функция отмены сражения
 
-	shot      *shot.Shot     // Объект выстрела
-	health    *health.Health // Текущее здоровье танка
-	manevr    *manevr.Manevr // Возможность маневрирования
+	shot      *shot.Shot       // Объект выстрела
+	health    *health.Здоровье // Текущее здоровье танка
+	manevr    *manevr.Manevr   // Возможность маневрирования
 	login     string
 	isMasking ИБезопБул // Признак необходимости маскирования (запрет стрельбы, когда слабое здоровье)
 	chTick    chan int  // Ежесекундная проверка на окончание сражения
@@ -101,7 +101,7 @@ func (сам *DivWarOn) run() {
 			// log._rintf("ERRO DivWarOn.Run(): при создании выстрела танка, err=\n\t%v\n", err)
 			return
 		}
-		сам.health, err = health.NewHealth(сам, сам.shot.IsEnd(), сам.login)
+		сам.health, err = health.НовЗдоровье(сам, сам.shot.IsEnd(), сам.login)
 		if err != nil {
 			// log._rintf("ERRO DivWarOn.Run(): при создании здоровья танка, err=\n\t%v\n", err)
 			сам.shot.IsEnd().Сброс()

+ 70 - 0
app/lev2/arena_duel/arena_duel.go

@@ -0,0 +1,70 @@
+// package arena_duel -- арена дуэли за топливо
+package arena_duel
+
+import (
+	"time"
+
+	. "wartank/app/lev0/types"
+	"wartank/app/lev2/arena"
+	"wartank/app/lev2/arena_duel/battle_register"
+	"wartank/app/lev2/arena_duel/battle_wait"
+	"wartank/app/lev2/arena_duel/battle_worker"
+)
+
+// АренаДуэль -- арена дуэли за топливо
+type АренаДуэль struct {
+	ИАрена
+	бот    ИБот
+	клиент ИХттпВоркер
+
+	регистрация *battle_register.СхваткаРегистрация // Регистратор на сражение
+	ожидание    *battle_wait.СхваткаОжидание        // Ожидатель начала сражения
+	действие    *battle_worker.СхваткаИсполнитель   // Исполнитель сражения
+
+}
+
+// НовСражение -- возвращает новую арену дуэли
+func НовАренаДуэль(конт ИБотКонтекст, бот ИБот) *АренаДуэль {
+	сам := &АренаДуэль{
+		бот:    бот,
+		клиент: бот.Сеть().ВебВоркер(),
+	}
+	аренаКонфиг := arena.АренаКонфиг{
+		Бот_:         бот,
+		АренаИмя_:    "Арена дуэли",
+		СтрКонтроль_: "<span>до начала ",
+		ФнПуск_:      сам.пуск,
+		СтрУрл_:      "https://wartank.ru/battle",
+	}
+	сам.ИАрена = arena.НовАрена(конт, аренаКонфиг)
+	сам.регистрация = battle_register.НовСражениеРегистрация(конт, бот)
+	сам.ожидание = battle_wait.НовСражениеОжидание(конт, бот)
+	сам.действие = battle_worker.НовСражениеИсполнитель(конт, бот)
+
+	// сам.shotTimeFull.Set(8000) // 8000 msec
+	return сам
+}
+
+func (сам *АренаДуэль) Пуск() {
+	go сам.пуск()
+}
+
+// запускает в работу дуэль
+func (сам *АренаДуэль) пуск() {
+	for {
+		select {
+		case <-сам.бот.Контекст().Done():
+			return
+		default:
+			сам.регистрация.Зарегистрироваться()
+			сам.ожидание.Ожидать()
+			сам.действие.Пуск()
+			time.Sleep(time.Second * 2) // Пауза между циклами, чтобы сервер не долбить запросами
+		}
+	}
+}
+
+// ЕслиНачало -- возвращает признак начала сражения (для браузера)
+func (сам *АренаДуэль) ЕслиНачало() ИСтатПарам {
+	return сам.действие.Тревога()
+}

+ 0 - 48
app/lev3/bot/angar/division/div_war/div_war_on/div_war_sound/div_war_sound.go

@@ -1,48 +0,0 @@
-package div_war_sound
-
-import (
-	"time"
-	"wartank/app/lev1/sound"
-	"wartank/app/lev2/arena_battle/battle_worker/battle_worker/battle_sound/is_sound_play"
-)
-
-/*
-	Выполняет контроль за запуском одной озвучки битвы
-*/
-
-// DivWarSound -- контроль одного раза запуска звука битвы
-type DivWarSound struct {
-	isPlay *is_sound_play.IsPlay
-}
-
-// NewDivWarSound -- возвращает новый  *DivWarSound
-func NewDivWarSound() *DivWarSound {
-	return &DivWarSound{
-		isPlay: is_sound_play.NewIsPlay(),
-	}
-}
-
-// Play -- играет музончик, если можно
-func (сам *DivWarSound) Play() {
-	if сам.isPlay.Get() {
-		return
-	}
-	go сам.play()
-}
-
-// Проигрывает экслюзивно в отдельном потоке звук
-func (сам *DivWarSound) play() {
-	сам.isPlay.Set()
-	val := 7
-	for val > 0 {
-		sound.DivWar()
-		val--
-		time.Sleep(time.Second * 1)
-	}
-	val = 600 // Пауза для блокировки повторного включения начатой битвы
-	for val >= 0 {
-		val--
-		time.Sleep(time.Second * 1)
-	}
-	сам.isPlay.Reset()
-}

+ 0 - 48
app/lev3/bot/angar/division/div_war/div_war_on/divwarsound/divwarsound.go

@@ -1,48 +0,0 @@
-package div_war_sound
-
-import (
-	"time"
-	"wartank/app/lev1/sound"
-	"wartank/app/lev2/arena_battle/battle_worker/battle_worker/battle_sound/is_sound_play"
-)
-
-/*
-	Выполняет контроль за запуском одной озвучки битвы
-*/
-
-// DivWarSound -- контроль одного раза запуска звука битвы
-type DivWarSound struct {
-	isPlay *is_sound_play.IsPlay
-}
-
-// NewDivWarSound -- возвращает новый  *DivWarSound
-func NewDivWarSound() *DivWarSound {
-	return &DivWarSound{
-		isPlay: is_sound_play.NewIsPlay(),
-	}
-}
-
-// Play -- играет музончик, если можно
-func (сам *DivWarSound) Play() {
-	if сам.isPlay.Get() {
-		return
-	}
-	go сам.play()
-}
-
-// Проигрывает экслюзивно в отдельном потоке звук
-func (сам *DivWarSound) play() {
-	сам.isPlay.Set()
-	val := 7
-	for val > 0 {
-		sound.DivWar()
-		val--
-		time.Sleep(time.Second * 1)
-	}
-	val = 600 // Пауза для блокировки повторного включения начатой битвы
-	for val >= 0 {
-		val--
-		time.Sleep(time.Second * 1)
-	}
-	сам.isPlay.Reset()
-}

+ 0 - 358
app/lev3/bot/angar/division/div_war/div_war_on/health/health.go

@@ -1,358 +0,0 @@
-package health
-
-import (
-	"context"
-	"fmt"
-
-	// "log"
-	// "strconv"
-	"strings"
-	"time"
-
-	. "wartank/app/lev0/types"
-	"wartank/app/lev2/arena_division/div_war/div_war_on/health/health_time"
-	"wartank/app/lev2/arena_division/div_war/div_war_on/health/repair_time"
-	// "wartank/internal/components/sound"
-	"wartank/kernel"
-	. "wartank/kernel/kernel_types"
-)
-
-/*
-	Контролирует состояние здоровья танка
-*/
-
-// Health -- контроль здоровья танка
-type Health struct {
-	ИДивизияВойнаДействие // FIXME:
-	fnCancel              func()
-	temp                  *health_time.HealthTime // Изменяемое здоровье танка
-	full                  *health_time.HealthTime // Полное здоровье танка
-	isRepair              ИБезопБул               // Необходимость восстановления
-	repairTime            *repair_time.RepairTime // Время до восстановления
-	isEnd                 ИБезопБул               // Ссылка на признак конца сражения
-	login                 string                  // Для поиска контрольных строк
-	chTick                chan int                // Канал для ровной отправки тиков
-	// deltaOld                    int                    // Старая дельта потери здоровья
-	// countLow                    int
-	ctxBattle context.Context // Контекст сражения
-}
-
-// NewHealth -- возвращает новый *Health
-func NewHealth(дивВойна ИДивизияВойнаДействие, isEnd ИБезопБул, login string) (*Health, error) {
-	{ // Предусловия
-		if дивВойна == nil {
-			return nil, fmt.Errorf("NewHealth(): дивВойна is nil")
-		}
-		if isEnd == nil {
-			return nil, fmt.Errorf("NewHealth(): isEnd is nil")
-		}
-		if login == "" {
-			return nil, fmt.Errorf("NewHealth(): login is empty")
-		}
-	}
-	сам := &Health{
-		ИДивизияВойнаДействие: дивВойна,
-		fnCancel:   дивВойна.CancelBattle,
-		ctxBattle:  дивВойна.Ctx(),
-		temp:       health_time.NewHealthTime(),
-		full:       health_time.NewHealthTime(),
-		isRepair:   kernel.НовБезопБул(),
-		repairTime: repair_time.NewRepairTime(),
-		isEnd:      дивВойна.ЕслиКонец(),
-		login:      login,
-		chTick:     make(chan int, 2),
-	}
-	go сам.makeTik()
-	go сам.run()
-	return сам, nil
-}
-
-// Отправляет тики с заданным равным интервалом
-func (сам *Health) makeTik() {
-	defer func() {
-		сам.CancelBattle()
-		close(сам.chTick)
-		// log._rintf("Health.makeTick(): сражение завершёно\n")
-	}()
-	count := 0
-	repairTime := 0
-	for {
-		select {
-		case <-сам.ctxBattle.Done():
-			return
-		default:
-			if сам.IsDeath() {
-				return
-			}
-			if сам.repairTime.Get() == repairTime {
-				count++
-			} else {
-				repairTime = сам.repairTime.Get()
-				count = 0
-			}
-			if count > 90 {
-				return
-			}
-		}
-		сам.chTick <- 1
-		time.Sleep(time.Second * 1)
-		сам.repairTime.Dec()
-	}
-}
-
-// Главный цикл обработки здоровья в сражении
-func (сам *Health) run() {
-	for {
-		select {
-		case <-сам.ctxBattle.Done():
-			сам.isEnd.Уст()
-			return
-		case <-сам.chTick:
-			// if err := сам.findHealth(); err != nil { // Найти свой здоровье
-			// 	// log._rintf("ERRO Health.run(): при попытке найти здоровье, err=\n\t%v\n", err)
-			// }
-			сам.findRepairTime()
-			if сам.ВыстрелБлок().Получ() {
-				if сам.isRepair.Получ() {
-					go сам.repair()
-				}
-				continue
-			}
-			if сам.isRepair.Получ() {
-				go сам.repair()
-			}
-		}
-	}
-}
-
-// Full -- возвращает объект полного здоровья танка
-func (сам *Health) Full() int {
-	return сам.full.Get()
-}
-
-// IsDeath -- возвращает признак мертвичины танка
-func (сам *Health) IsDeath() bool {
-	if сам.isEnd.Получ() {
-		сам.fnCancel()
-		return true
-	}
-	lstBattle := сам.СписПолучить()
-	for _, strOut := range lstBattle {
-		if strings.Contains(strOut, `>Ваш танк подбит.`) {
-			// log._rintf("INFO Health.repair(): танк подбит\n")
-			сам.temp.Set(0)
-			сам.isEnd.Уст()
-			сам.CancelBattle()
-			return true
-		}
-	}
-	return сам.isEnd.Получ()
-}
-
-// Ищет время восстановления ремки
-func (сам *Health) findRepairTime() {
-	defer func() {
-		if сам.repairTime.IsReady() {
-			return
-		}
-		// if сам.repairTime.IsChange() {
-		// log._rintf("INFO Health.findRepair(): до ремки=%v\n", сам.repairTime.Get())
-		// }
-	}()
-	if сам.repairTime.IsReady() {
-		return
-	}
-	var (
-		strOut      string
-		lstBattle   = сам.СписПолучить()
-		еслиНайдено bool
-		ind         int
-	)
-	// <a href="pve?19-14.ILinkListener-currentControl-repairLink" class="simple-but blue"><span><span>12 секунд</span></span></a>
-	//
-	for ind, strOut = range lstBattle {
-		if !strings.Contains(strOut, `ILinkListener-currentControl-repairLink`) {
-			continue
-		}
-		if strings.Contains(strOut, ` секунд</span></span></a>`) {
-			еслиНайдено = true
-			break
-		}
-	}
-	if !еслиНайдено {
-		return
-	}
-	strOut = lstBattle[ind]
-	// <a href="pve?19-14.ILinkListener-currentControl-repairLink" class="simple-but blue"><span><span>12 секунд</span></span></a>
-	lstTime := strings.Split(strOut, `ILinkListener-currentControl-repairLink" class="simple-but blue"><span><span>`)
-	if len(lstTime) < 2 {
-		// log._rintf("ERRO Health.findRepair(): при попытке получить ссылку на ремонт, strOut=\n%v\n", strOut)
-		сам.isEnd.Уст()
-		сам.CancelBattle()
-		return
-	}
-	// strTime := lstTime[1]
-	// lstTime = strings.Split(strTime, ` секунд</span></span></a>`)
-	// strTime = lstTime[0]
-	// if err := сам.repairTime.Set(strTime); err != nil {
-	// 	 log._rintf("ERRO Health.findRepair(): при установке времени восстановления ремки, err=\n\t%v\n", err)
-	// }
-}
-
-// Восстанавливает здоровье (~)
-func (сам *Health) repair() {
-	var (
-		strOut            string
-		lstBattleOn       = сам.СписПолучить()
-		еслиНайденоRepair bool
-		ind               int
-	)
-	// <span>Ремкомплект</span>
-	// <a href="pve?19-14.ILinkListener-currentControl-repairLink" class="simple-but blue"><span><span>Ремкомплект</span></span></a>
-	for ind, strOut = range lstBattleOn {
-		if strings.Contains(strOut, `<span>Ремкомплект</span>`) {
-			еслиНайденоRepair = true
-			break
-		}
-	}
-	if !еслиНайденоRepair {
-		return
-	}
-	strOut = lstBattleOn[ind]
-	// <a href="pve?6-26.ILinkListener-currentControl-repairLink" class="simple-but blue"><span><span>Ремкомплект</span></span></a>
-	lstLink := strings.Split(strOut, `<a href="`)
-	strLink := lstLink[1]
-	lstLink = strings.Split(strLink, `" class="simple-but blue"><span><span>Ремкомплект</span></span></a>`)
-	strLink = "https://wartank.ru/" + lstLink[0]
-	lstBattleOn, err := сам.Сеть().Get(strLink)
-	if err != nil {
-		// log._rintf("ERRO Health.repair(): при выполнении GET-команды ремонта, err=\n\t%v\n", err)
-		сам.isEnd.Уст()
-		сам.CancelBattle()
-		return
-	}
-	if err = сам.СтрОбновить(lstBattleOn); err != nil {
-		// log._rintf("ERRO Health.repair(): при обновлении lstBattle, err=\n\t%v\n", err)
-		сам.isEnd.Уст()
-		сам.CancelBattle()
-		return
-	}
-	// sound.Repair()
-	// log._rintf("INFO Health.repair(): здоровье восстановлено\n")
-}
-
-// Ищет своё здоровье (~)
-// func (сам *Health) findHealth() error {
-// 	var (
-// 		ind         int
-// 		strOut      string
-// 		еслиНайдено bool
-// 		lstBattle   = сам.СписПолучить()
-// 	)
-// 	if len(lstBattle) == 0 { // Принудительно обновим сражение
-// 		if err := сам.Сеть().Обновить(); err != nil {
-// 			сам.isEnd.Уст()
-// 			сам.fnCancel()
-// 			return fmt.Errorf("Health.findHealth(): после принудительного обновления lsBattleOn, err=\n\t%w", err)
-// 		}
-// 	}
-// 	for ind, strOut = range lstBattle {
-// 		if strings.Contains(strOut, `alt="`+сам.login+`"`) {
-// 			еслиНайдено = true
-// 			break
-// 		}
-// 	}
-// 	if !еслиНайдено { // Свой танк не найден
-// 		сам.isEnd.Уст()
-// 		сам.fnCancel()
-// 		return fmt.Errorf("Health.findHealth(): своё здоровье не найдено")
-// 	}
-// 	// Свой танк найден, ищем здоровье
-// 	ind += 11
-// 	strOut = lstBattle[ind]
-// 	lstHealth := strings.Split(strOut, `<div class="value-block lh1"><span><span>`)
-// 	strHealth := lstHealth[1]
-// 	lstHealth = strings.Split(strHealth, `</span></span></div>`)
-// 	strHealth = lstHealth[0]
-// 	iHealth, err := strconv.Atoi(strHealth)
-// 	if err != nil {
-// 		сам.isEnd.Уст()
-// 		сам.CancelBattle()
-// 		return fmt.Errorf("Health.findHealth(): здоровье(%v) не число, err=%w", strHealth, err)
-// 	}
-// 	сам.setHealth(iHealth)
-// 	return nil
-// }
-
-// setHealth -- устанавливает текущее здоровье
-// func (сам *Health) setHealth(val int) {
-// 	if val < 0 {
-// 		// log._rintf("WARN Health.setHealth(): кривое значение здоровья танка(%v)\n", val)
-// 		val = 0
-// 	}
-
-// 	if val > сам.full.Get() {
-// 		// log._rintf("WARN Health.setHealth(): кривое текущее здоровье, %v/%v\n", val, сам.full.Get())
-// 		сам.full.Set(val)
-// 		сам.temp.Set(val)
-// 		// сам.deltaOld = 0
-// 		сам.ВыстрелБлок().Сброс()
-// 		сам.isRepair.Сброс()
-// 		return
-// 	}
-
-// 	delta := сам.temp.Get() - val
-// 	// if delta > 0 { // Дельта будет больше нуля, если только
-// 	// 	if delta != сам.deltaOld {
-// 	// 		// log._rintf("INFO Health.setHealth(): потеря здоровья=%v/%v\n", -delta, val)
-// 	// 		сам.deltaOld = delta
-// 	// 		сам.temp.Set(val)
-// 	// 	}
-// 	// }
-
-// 	switch {
-// 	case сам.isEnd.Получ():
-// 		сам.temp.Set(0)
-// 		сам.isEnd.Уст()
-// 		сам.CancelBattle()
-// 		return
-// 	case val == 0:
-// 		сам.temp.Set(0)
-// 		сам.isEnd.Уст()
-// 		сам.CancelBattle()
-// 		return
-// 	case val <= 500: // Запретить стрельбу
-// 		сам.ВыстрелБлок().Уст() // Установить запрет стрельбы пока слабое здоровье
-// 		сам.isRepair.Уст()
-// 		// log._rintf("WARN Health.setHealth(): низкий уровень здоровья(%v)\n", val)
-// 		сам.Манёвр()
-// 	case val > 500: // Разрешить стрельбы
-// 		сам.ВыстрелБлок().Сброс()
-// 		сам.isRepair.Сброс()
-// 		if delta > сам.full.Get()*4/10 { // Проверить на критичность падения здоровья на 40%
-// 			// log._rintf("WARN Health.setHealth(): большая разовая потеря здоровья(%v)\n", delta)
-// 			сам.Манёвр()
-// 			сам.isRepair.Уст()
-// 			return
-// 		}
-// 	}
-
-// 	isMask := сам.ВыстрелБлок().Получ()
-// 	switch isMask {
-// 	case true:
-// 		// сам.countLow++
-// 		// if сам.countLow >= 200 {
-// 		// 	сам.isEnd.Уст()
-// 		// 	сам.CancelBattle()
-// 		// 	return
-// 		// }
-// 	default:
-// 		// сам.countLow = 0
-// 	}
-// 	if val == сам.full.Get() {
-// 		сам.temp.Set(val)
-// 		сам.isRepair.Сброс()
-// 		сам.ВыстрелБлок().Сброс()
-// 		// сам.countLow = 0
-// 	}
-// }