Pārlūkot izejas kodu

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

SVI 1 gadu atpakaļ
vecāks
revīzija
fe0950cf61

+ 0 - 873
app/lev3/bot/angar/base/base.go

@@ -1,873 +0,0 @@
-// package base -- база в игре
-package base
-
-import (
-	"fmt"
-	"log"
-	"strconv"
-	"strings"
-	"sync"
-	"time"
-
-	"wartank/app/lev0/alias"
-	"wartank/app/lev0/cons"
-	. "wartank/app/lev0/types"
-	"wartank/app/lev2/arena"
-	"wartank/app/lev2/arena_arsenal"
-	"wartank/app/lev2/arena_bank"
-	"wartank/app/lev2/arena_fuel_storage"
-	"wartank/app/lev2/arena_laborator"
-	"wartank/app/lev2/arena_market"
-	"wartank/app/lev2/arena_mine"
-	"wartank/app/lev2/arena_polygon"
-)
-
-/*
-	Объект базы в игре.
-*/
-
-const (
-	времОжидПлат    = "01:00" // Время ожидания платного ускорения
-	времОжидБесплат = "30:00" // Время ожидания бесплатного ускорения
-)
-
-// База -- объект базы
-type База struct {
-	ИАрена
-	бот          ИБот
-	арсенал      ИАренаАрсенал
-	банк         *arena_bank.АренаБанк
-	полигон      *arena_polygon.АренаПолигон
-	шахта        ИАренаШахта
-	рынок        *arena_market.АренаРынок
-	складТоплива *arena_fuel_storage.АренаСкладТоплива
-	лаборатория  *arena_laborator.АренаЛаборатория
-	времОстат    int // Сколько времени спать до опроса базы
-	блок         sync.Mutex
-}
-
-// НовБаза -- возвращает новую базу бота
-func НовБаза(конт ИБотКонтекст, ангар ИАнгар) (*База, error) {
-	log.Printf("НовБаза(): %q\n", ангар.Бот().Имя())
-	сам := &База{
-		бот: ангар.Бот(),
-	}
-	аренаКонфиг := arena.АренаКонфиг{
-		Бот_:         ангар.Бот(),
-		АренаИмя_:    "База",
-		СтрКонтроль_: `<title>База</title>`,
-		ФнПуск_:      сам.пуск,
-		СтрУрл_:      "https://wartank.ru/buildings",
-	}
-	сам.ИАрена = arena.НовАрена(конт, аренаКонфиг)
-	var ош error
-	{ // Arsenal
-		сам.арсенал, ош = arena_arsenal.НовАрсенал(конт, сам)
-		if ош != nil {
-			return nil, fmt.Errorf("NewBase(): in create IArsenal, err=\n\t%w", ош)
-		}
-	}
-	{ // Bank
-		сам.банк, ош = arena_bank.НовБанк(конт, сам)
-		if ош != nil {
-			return nil, fmt.Errorf("NewBase(): in create IBank, err=\n\t%w", ош)
-		}
-	}
-	{ // Mine
-		сам.шахта, ош = arena_mine.НовШахта(конт, сам)
-		if ош != nil {
-			return nil, fmt.Errorf("NewBase(): in create IMine, err=\n\t%w", ош)
-		}
-	}
-	сам.рынок = arena_market.НовРынок(конт, сам)
-	// Polygon
-	сам.полигон = arena_polygon.НовПолигон(конт, сам)
-	{ // Лаборатория
-		сам.лаборатория, ош = arena_laborator.НоваяЛаборатория(ангар.Бот())
-		if ош != nil {
-			return nil, fmt.Errorf("НовБаза(): при создании лаборатории, err=\n\t%w", ош)
-		}
-	}
-	{ // Склад топлива
-		сам.складТоплива, ош = arena_fuel_storage.НовСкладТоплива(конт, сам)
-		if ош != nil {
-			return nil, fmt.Errorf("НовБаза(): при создании склада топлива, err=\n\t%w", ош)
-		}
-	}
-	return сам, nil
-}
-
-// Запускает базу в обработку
-func (сам *База) Пуск() {
-	log.Printf("Base.Run()\n")
-	if err := сам.runComponent(); err != nil {
-		panic(fmt.Errorf("Base.Run(): run, err=\n\t%w", err))
-	}
-	go сам.пуск()
-}
-
-// Собственная работа
-func (сам *База) пуск() {
-	фнЦикл := func() {
-		defer time.Sleep(time.Minute * 2)
-		сам.Обновить()
-		сам.проверитьПолигонУсиление()              // Проверить усиление полигона
-		if err := сам.проверитьБанк(); err != nil { // Проверка режимов банка
-			log.Printf("ERRO Base.Run(): при проверке банка, err=\n\t%v\n", err)
-		}
-		сам.проверитьАрсенал() // Проверка арсенала
-		сам.проверитьШахту()   // Проверка шахты
-		сам.setCountDown()     // Установка счётчика времени
-
-	}
-	for {
-		select {
-		case <-сам.Контекст().Done():
-			return
-		// case <-сам.ВремяОпрос().КаналСиг():
-		// 	фнЦикл()
-		default:
-			log.Printf("База.пуск()\n")
-			фнЦикл()
-		}
-	}
-}
-
-// Запускает компоненты
-func (сам *База) runComponent() error {
-	log.Printf("Base.runComponent()\n")
-	сам.блок.Lock()
-	defer сам.блок.Unlock()
-	if err := сам.банк.Пуск(); err != nil {
-		return fmt.Errorf("Base.runComponent(): in run IBank, err=\n\t%w", err)
-	}
-	сам.рынок.Пуск()
-	сам.полигон.Пуск()
-	сам.складТоплива.Пуск()
-	сам.лаборатория.Пуск()
-	return nil
-}
-
-// Выбирает время обновления базы по компонентам
-func (сам *База) setCountDown() {
-	timeBase := сам.банк.ВремяОстат().String()
-	timeCount := timeBase
-	timeArsenal := сам.арсенал.ВремяОстат().String()
-	timeMine := сам.шахта.ВремяОстат().String()
-	if timeArsenal < timeCount {
-		timeCount = timeArsenal
-	}
-	if timeMine < timeCount {
-		timeCount = timeMine
-	}
-	if timeCount <= "05" {
-		сам.времОстат = 5
-		return
-	}
-	if timeCount > "00:10:00" {
-		сам.времОстат = 600
-	}
-	ош := сам.ОбратВремяУст(alias.Время(timeCount))
-	if ош != nil {
-		log.Printf("ERRO Base.setCountDown(): при установке обратного отсчёта времени, err=\n\t%v\n", ош)
-		сам.Отменить()
-	}
-}
-
-// Арсенал -- возвращает объект арсенала
-func (сам *База) Арсенал() ИАренаАрсенал {
-	return сам.арсенал
-}
-
-// Банк -- возвращает объект банка
-func (сам *База) Банк() ИБанк {
-	сам.блок.Lock()
-	defer сам.блок.Unlock()
-	return сам.банк
-}
-
-// Полигон -- возвращает объект полигона
-func (сам *База) Полигон() ИАренаПолигон {
-	return сам.полигон
-}
-
-// Шахта -- возвращает объект шахты
-func (сам *База) Шахта() ИАренаШахта {
-	return сам.шахта
-}
-
-// Рынок -- возвращает объект рынка
-func (сам *База) Рынок() ИРынок {
-	return сам.рынок
-}
-
-// Проверяет на забрать шахту
-func (сам *База) проверитьШахту() {
-	if сам.шахта.Руда().Получ() == 0 {
-		сам.шахтаСтатаОбновить()
-	}
-	сам.шахтаАпгрейдФорсаж() // Нужно ли ускорить апгрейд шахты
-	if сам.шахта.АренаСостояние().Состояние() == "upgrade" {
-		return
-	}
-	сам.шахтаСтатаОбновить()
-	сам.checkMineTime()
-}
-
-// Проверяет время ожидания шахты
-func (сам *База) checkMineTime() {
-	var (
-		lstBase     = сам.СписПолучить()
-		strOut      string
-		еслиНайдено bool
-		ind         int
-	)
-	for ind, strOut = range lstBase {
-		if !strings.Contains(strOut, `<span class="green2">Шахта - `) {
-			continue
-		}
-		ind += 11
-		strOut = lstBase[ind]
-		еслиНайдено = true
-		break
-	}
-	if !еслиНайдено {
-		return
-	}
-	if !strings.Contains(strOut, `<td><div class="value-block lh1"><span><span>`) {
-		return
-	}
-	/*
-		lstTime := strings.Split(strOut, `<td><div class="value-block lh1"><span><span>`)
-		strTime := lstTime[1]
-		lstTime = strings.Split(strTime, `</span></span></div></td>`)
-		strTime = lstTime[0]
-		if err := сам.шахта.Уст(alias.Время(strTime)); err != nil {
-			log.Printf("ERRO Base.checkMineTime(): при установке обратного отсчёта(%v), err=\n\t%v\n", strTime, err)
-		}
-	*/
-}
-
-// Проверка статистики шахты
-func (сам *База) шахтаСтатаОбновить() {
-	var (
-		lstMine     = сам.СписПолучить()
-		strOut      string
-		еслиНайдено bool
-		ind         int
-	)
-	{ // Ищем руду
-		for _, strOut = range lstMine {
-			if strings.Contains(strOut, `<span class="nwr"><img class="rico vm" src="/images/icons/ore.png?2" alt="Руда" title="Руда"/>`) {
-				еслиНайдено = true
-				break
-			}
-		}
-		if еслиНайдено && strings.Contains(strOut, `<span class="nwr"><img class="rico vm" src="/images/icons/ore.png?2" alt="Руда" title="Руда"/> `) {
-			списРуда := strings.Split(strOut, `<span class="nwr"><img class="rico vm" src="/images/icons/ore.png?2" alt="Руда" title="Руда"/> `)
-			стрРуда := списРуда[1]
-			списРуда = strings.Split(стрРуда, ` &nbsp;&nbsp;</span>`)
-			стрРуда = списРуда[0]
-			целРуда, err := strconv.Atoi(стрРуда)
-			if err != nil {
-				log.Printf("ERRO Base.checkMineStat(): руда(%v) не число, err=\n\t%v\n", стрРуда, err)
-				return
-			}
-			сам.шахта.Руда().Уст(целРуда)
-		}
-	}
-	{ // Ищем железо
-		for _, strOut = range lstMine {
-			if strings.Contains(strOut, `<span class="nwr"><img class="rico vm" src="/images/icons/iron.png?2" alt="Железо" title="Железо"/> `) {
-				еслиНайдено = true
-				break
-			}
-		}
-		if еслиНайдено && strings.Contains(strOut, `<span class="nwr"><img class="rico vm" src="/images/icons/iron.png?2" alt="Железо" title="Железо"/> `) {
-			lstFerrum := strings.Split(strOut, `<span class="nwr"><img class="rico vm" src="/images/icons/iron.png?2" alt="Железо" title="Железо"/> `)
-			strFerrum := lstFerrum[1]
-			lstFerrum = strings.Split(strFerrum, ` &nbsp;&nbsp;</span>`)
-			strFerrum = lstFerrum[0]
-			iFerrum, err := strconv.Atoi(strFerrum)
-			if err != nil {
-				log.Printf("ERRO Base.checkMineStat(): железо(%v) не число, err=\n\t%v\n", strFerrum, err)
-				return
-			}
-			сам.шахта.Железо().Уст(iFerrum)
-		}
-	}
-	{ // Ищем сталь
-		for _, strOut = range lstMine {
-			if strings.Contains(strOut, `<span class="nwr"><img class="rico vm" src="/images/icons/steel.png?2" alt="Сталь" title="Сталь"/> `) {
-				еслиНайдено = true
-				break
-			}
-		}
-		if еслиНайдено && strings.Contains(strOut, `<span class="nwr"><img class="rico vm" src="/images/icons/steel.png?2" alt="Сталь" title="Сталь"/> `) {
-			lstSteel := strings.Split(strOut, `<span class="nwr"><img class="rico vm" src="/images/icons/steel.png?2" alt="Сталь" title="Сталь"/> `)
-			strSteel := lstSteel[1]
-			lstSteel = strings.Split(strSteel, ` &nbsp;&nbsp;</span>`)
-			strSteel = lstSteel[0]
-			iSteel, err := strconv.Atoi(strSteel)
-			if err != nil {
-				log.Printf("ERRO Base.checkMineStat(): сталь(%v) не число, err=\n\t%v\n", strSteel, err)
-				return
-			}
-			сам.шахта.Сталь().Уст(iSteel)
-		}
-	}
-	{ // Ищем свинец
-		for _, strOut = range lstMine {
-			if strings.Contains(strOut, `<span class="nwr"><img class="rico vm" src="/images/icons/plumbum.png?2" alt="Свинец" title="Свинец"/> `) {
-				еслиНайдено = true
-				break
-			}
-		}
-		if еслиНайдено && strings.Contains(strOut, `<span class="nwr"><img class="rico vm" src="/images/icons/plumbum.png?2" alt="Свинец" title="Свинец"/> `) {
-			lstPlumbum := strings.Split(strOut, `<span class="nwr"><img class="rico vm" src="/images/icons/plumbum.png?2" alt="Свинец" title="Свинец"/> `)
-			strPlumbum := lstPlumbum[1]
-			lstPlumbum = strings.Split(strPlumbum, ` &nbsp;&nbsp;</span>`)
-			strPlumbum = lstPlumbum[0]
-			iPlumbum, err := strconv.Atoi(strPlumbum)
-			if err != nil {
-				log.Printf("ERRO Base.checkMineStat(): свинец(%v) не число, err=\n\t%v\n", strPlumbum, err)
-				return
-			}
-			сам.шахта.Свинец().Уст(iPlumbum)
-		}
-	}
-	{ // Ищем время обработки и режим
-		lstBase := сам.СписПолучить()
-		/*
-			for ind, strOut = range lstBase {
-				if strings.Contains(strOut, `<span class="green2">Шахта - `) {
-					еслиНайдено = true
-					ind += 11
-					strOut = lstBase[ind]
-					break
-				}
-			}
-			/*
-				/*
-			if еслиНайдено && strings.Contains(strOut, `<td><div class="value-block lh1"><span><span>`) {
-				lstTime := strings.Split(strOut, `<td><div class="value-block lh1"><span><span>`)
-				strTime := lstTime[1]
-				lstTime = strings.Split(strTime, `</span></span></div></td>`)
-				strTime = lstTime[0]
-				if err := сам.шахта.Уст(alias.Время(strTime)); err != nil {
-					log.Printf("ERRO Base.checkMineStat(): при установке времени ожидания шахты(%v)\n\terr=%v\n", strTime, err)
-				}
-			}
-		*/
-
-		ind -= 3
-		if ind < 0 {
-			log.Printf("Base.checkMineStat(): отрицательный индекс(%v)!\n", ind)
-			return
-		}
-		strOut = lstBase[ind]
-		switch {
-		case strings.Contains(strOut, `/images/icons/iron.png`): // Железо
-			lstNum := strings.Split(strOut, `<td class="vam"><div class="nwr pr5 gray1"><img class="rico vm" src="/images/icons/iron.png?2" alt="iron"/>&nbsp;`)
-			strNum := lstNum[1]
-			lstNum = strings.Split(strNum, `</div></td>`)
-			strNum = lstNum[0]
-			работа := alias.АренаРаботаИмя("Железо-" + strNum)
-			сам.шахта.АренаСостояние().РаботаИмяУст(работа)
-		case strings.Contains(strOut, `/images/icons/ore.png`): // Руда
-			lstNum := strings.Split(strOut, `<td class="vam"><div class="nwr pr5 gray1"><img class="rico vm" src="/images/icons/ore.png?2" alt="ore"/>&nbsp;`)
-			strNum := lstNum[1]
-			lstNum = strings.Split(strNum, `</div></td>`)
-			strNum = lstNum[0]
-			работа := alias.АренаРаботаИмя("Руда-" + strNum)
-			сам.шахта.АренаСостояние().РаботаИмяУст(работа)
-		case strings.Contains(strOut, `/images/icons/steel.png`): // Руда
-			lstNum := strings.Split(strOut, `<td class="vam"><div class="nwr pr5 gray1"><img class="rico vm" src="/images/icons/steel.png?2" alt="steel"/>&nbsp;`)
-			strNum := lstNum[1]
-			lstNum = strings.Split(strNum, `</div></td>`)
-			strNum = lstNum[0]
-			работа := alias.АренаРаботаИмя("Сталь-" + strNum)
-			сам.шахта.АренаСостояние().РаботаИмяУст(работа)
-		}
-	}
-}
-
-// Проверяет режимы арсенала
-func (сам *База) проверитьАрсенал() {
-	// countTime := сам.арсенал.ВремяОпрос().Получ()
-	// if countTime > 3 {
-	// 	return
-	// }
-	/*
-		if err := сам.арсенал.СтатаОбновить(); err != nil {
-			// log._rintf("ERRO Base.checkArsenal(): при обновлении арсенала, err=\n\t%v\n", err)
-			return
-		}
-	*/
-	if работа := сам.арсенал.АренаСостояние().РаботаИмя(); работа == "" {
-		сам.проверитьАрсеналРежим()
-	}
-	сам.проверитьАрсеналУскорение() // Нужно ли ускорить апгрейд арсенала
-	if сам.арсенал.АренаСостояние().Состояние() == cons.РежимАпгрейд {
-		return
-	}
-	сам.проверитьАрсеналВремя()
-	сам.проверитьАрсеналРежим()
-}
-
-// Проверяет время готовности арсенала
-func (сам *База) проверитьАрсеналВремя() {
-	var (
-		lstBase     = сам.СписПолучить()
-		ind         int
-		strOut      string
-		еслиНайдено bool
-	)
-	for ind, strOut = range lstBase {
-		if !strings.Contains(strOut, `Производит снаряды, ремкомплекты<br/>`) {
-			continue
-		}
-		ind += 10
-		strOut = lstBase[ind]
-		еслиНайдено = true
-		break
-	}
-	if !еслиНайдено {
-		return
-	}
-	if !strings.Contains(strOut, ":") {
-		return
-	}
-	lstTime := strings.Split(strOut, `<td><div class="value-block lh1"><span><span>`)
-	if len(lstTime) != 2 { // Возможно, производство
-		return
-	}
-	/*
-		strTime := lstTime[1]
-		lstTime = strings.Split(strTime, `</span></span></div></td>`)
-		strTime = lstTime[0]
-		if err := сам.арсенал.Уст(alias.Время(strTime)); err != nil {
-			log.Printf("ERRO Base.checkArsenalTime(): при установке времени ожидания арсенала(%v)\n\terr=%v\n", strTime, err)
-		}
-	*/
-}
-
-// Проверяет режим производства арсенала
-func (сам *База) проверитьАрсеналРежим() {
-	var (
-		strOut  string
-		lstBase = сам.СписПолучить()
-	)
-	for _, strOut = range lstBase {
-		if strings.Contains(strOut, `HollowCharge.png`) {
-			сам.арсенал.АренаСостояние().СостояниеУст("кумулятивы")
-			return
-		}
-		if strings.Contains(strOut, `ArmorPiercing.png`) {
-			сам.арсенал.АренаСостояние().СостояниеУст("бронебойки")
-			return
-		}
-		if strings.Contains(strOut, `HighExplosive.png`) {
-			сам.арсенал.АренаСостояние().СостояниеУст("фугасы")
-			return
-		}
-		if strings.Contains(strOut, `repairkit.gif`) {
-			сам.арсенал.АренаСостояние().СостояниеУст("ремки")
-			return
-		}
-	}
-}
-
-// Проверяет на ускорение апгрейда арсенала
-func (сам *База) проверитьАрсеналУскорение() {
-	var (
-		ind         int
-		strOut      = ""
-		еслиНайдено bool
-		lstBase     = сам.СписПолучить()
-	)
-	{ // Проверка на платное ускорение апгрейда + время
-		for ind, strOut = range lstBase {
-			if strings.Contains(strOut, `Производит снаряды, ремкомплекты<br/>`) {
-				// Убедиться что есть строка платного ускорения
-				еслиНайдено = true
-				ind += 29
-				strOut = lstBase[ind]
-				break
-			}
-		}
-		if !еслиНайдено {
-			return
-		}
-		{ // Платное ускорение
-			if strings.Contains(strOut, `Ускорить за`) {
-				/*
-					if err := сам.арсенал.ОбратВремяУст(времОжидПлат); err != nil {
-						log.Printf("WARN Base.checkArsenalForce(): при установке платного времени ускорения апгрейда арсенала(%v)\n\terr=%v\n", времОжидПлат, err)
-					}
-				*/
-				сам.арсенал.АренаСостояние().СостояниеУст("апгрейд")
-				сам.арсенал.АренаСостояние().СостояниеУст(cons.РежимАпгрейд)
-				return
-			}
-		}
-	}
-	{ // Проверка на бесплатное ускорение апгрейда
-		еслиНайдено = false
-		for ind, strOut = range lstBase {
-			if strings.Contains(strOut, `Производит снаряды, ремкомплекты<br/>`) {
-				// Убедиться что есть строка платного ускорения
-				еслиНайдено = true
-				ind += 26
-				strOut = lstBase[ind]
-				break
-			}
-		}
-		if !еслиНайдено {
-			return
-		}
-		if !strings.Contains(strOut, `>Ускорение<`) {
-			return
-		}
-		сам.арсенал.АренаСостояние().СостояниеУст(cons.РежимАпгрейд)
-		lstLink := strings.Split(strOut, `<td style="width:50%;padding-left:1px;"><a class="simple-but border" href="`)
-		strLink := lstLink[1]
-		lstLink = strings.Split(strLink, `"><span><span>Ускорение</span></span></a>`)
-		strLink = "https://wartank.ru/" + lstLink[0]
-		lstBase, err := сам.Сеть().Get(strLink)
-		if err != nil {
-			// log._rintf("ERRO NetBank.checkArsenalForce(): при GET-запросе на бесплатном ускорении апгрейда арсенала, err=\n\t%v\n", err)
-			return
-		}
-		// sound.ArsenalForce()
-		if err := сам.СтрОбновить(lstBase); err != nil {
-			// log._rintf("ERRO NetBank.checkArsenalForce(): при обновлении lstBase, err=\n\t%v\n", err)
-			return
-		}
-		сам.арсенал.АренаСостояние().СостояниеУст("апгрейд")
-		сам.арсенал.АренаСостояние().СостояниеУст(cons.РежимАпгрейд)
-		/*
-			if err := сам.арсенал.ОбратВремяУст(времОжидБесплат); err != nil {
-				log.Printf("WARN Base.checkArsenalForce(): при установке бесплатного времени ускорения апгрейда арсенала(%v)\n\terr=%v\n", времОжидБесплат, err)
-			}
-		*/
-	}
-	// Все проверки прошли -- это просто работа
-	сам.арсенал.АренаСостояние().СостояниеУст(cons.РежимРабота)
-}
-
-// Проверяет режим банка
-func (сам *База) проверитьБанк() error {
-	if сам.банк.АренаСостояние().РаботаИмя() == "" {
-		сам.checkBankMode()
-	}
-	сам.checkBankTime() // Проверка времени ожидания
-	countTime := сам.банк.ВремяОстат().ПолучМилСек()
-	if countTime > 5_000 {
-		return nil
-	}
-	сам.checkBankForce() // Нужно ли ускорить апгрейд банка
-	if сам.банк.АренаСостояние().Состояние() == cons.РежимАпгрейд {
-		return nil
-	}
-	сам.checkBankProduct() // Запуск производства в  банке
-	return nil
-}
-
-// Проверяет режим работы банка
-func (сам *База) checkBankMode() {
-	var (
-		strOut      string
-		еслиНайдено bool
-		lstBase     = сам.СписПолучить()
-	)
-	for _, strOut = range lstBase {
-		if strings.Contains(strOut, `<td class="vam"><div class="nwr pr5 gray1"><img class="rico vm" src="/images/icons/silver.png?2" alt="silver"/>&nbsp;`) {
-			еслиНайдено = true
-			break
-		}
-	}
-	if !еслиНайдено {
-		return
-	}
-	lstSilver := strings.Split(strOut, `<td class="vam"><div class="nwr pr5 gray1"><img class="rico vm" src="/images/icons/silver.png?2" alt="silver"/>&nbsp;`)
-	strSilver := lstSilver[1]
-	lstSilver = strings.Split(strSilver, `</div></td>`)
-	работа := alias.АренаРаботаИмя("Серебро-" + lstSilver[0])
-	сам.банк.АренаСостояние().РаботаИмяУст(работа)
-	сам.банк.АренаСостояние().СостояниеУст(cons.РежимРабота)
-
-}
-
-// Проверяет на время ожидания банка
-func (сам *База) checkBankTime() {
-	var (
-		strOut      string
-		ind         int
-		еслиНайдено bool
-		lstBase     = сам.СписПолучить()
-	)
-	for ind, strOut = range lstBase {
-		if strings.Contains(strOut, `Производит серебро<br/>`) {
-			еслиНайдено = true
-			ind += 10
-			strOut = lstBase[ind]
-			break
-		}
-	}
-	if !еслиНайдено {
-		return
-	}
-	if !strings.Contains(strOut, `<td><div class="value-block lh1"><span><span>`) {
-		return
-	}
-	lstTime := strings.Split(strOut, `<td><div class="value-block lh1"><span><span>`)
-	strTime := lstTime[1]
-	lstTime = strings.Split(strTime, `</span></span></div></td>`)
-	strTime = lstTime[0]
-	if err := сам.банк.ОбратВремяУст(alias.Время(strTime)); err != nil {
-		log.Printf("ERRO Base.checkBankTime(): при установке времени ожидания банка(%v)\n\terr=%v\n", strTime, err)
-	}
-}
-
-// Проверяет на произвести в банке
-func (сам *База) checkBankProduct() {
-	var (
-		strOut      string
-		ind         int
-		еслиНайдено bool
-		lstBase     = сам.СписПолучить()
-	)
-	for ind, strOut = range lstBase {
-		if strings.Contains(strOut, `Производит серебро<br/>`) {
-			еслиНайдено = true
-			ind += 11
-			strOut = lstBase[ind]
-			break
-		}
-	}
-	if !еслиНайдено {
-		return
-	}
-	if !strings.Contains(strOut, `>Производство</span>`) {
-		return
-	}
-	сам.банк.UpdateLst()
-	ош := сам.банк.ОбратВремяУст("01:00")
-	if ош != nil {
-		log.Printf("ERRO Base.checkBankProduct(): при установке обратного времени ожидания банка, err=\n\t%v\n", ош)
-		сам.бот.Сервер().Отменить()
-	}
-}
-
-// Проверка получения серебра из банка
-
-// Проверяет на ускорение апгрейда банка
-func (сам *База) checkBankForce() {
-	var (
-		ind     int
-		strOut  = ""
-		isOut   bool
-		lstBase = сам.СписПолучить()
-	)
-	{ // Проверка на платное ускорение апгрейда
-		for ind, strOut = range lstBase {
-			if strings.Contains(strOut, `Производит серебро<br/>`) {
-				// Убедиться что есть строка платного ускорения
-				isOut = true
-				ind += 29
-				strOut = lstBase[ind]
-				break
-			}
-		}
-		if isOut && strings.Contains(strOut, `Ускорить за`) {
-			if err := сам.банк.ОбратВремяУст(времОжидПлат); err != nil {
-				log.Printf("WARN Base.checkBankForce(): при установке времени ожидания платного ускорения апгрейда банка(%v)\n\terr=%v\n", времОжидПлат, err)
-			}
-			сам.банк.АренаСостояние().РаботаИмяУст("")
-			сам.банк.АренаСостояние().СостояниеУст(cons.РежимАпгрейд)
-			return
-		}
-	}
-	{ // Проверка на бесплатное ускорение апгрейда
-		isOut = false
-		for ind, strOut = range lstBase {
-			if strings.Contains(strOut, `Производит серебро<br/>`) {
-				// Убедиться что есть строка платного ускорения
-				isOut = true
-				ind += 26
-				strOut = lstBase[ind]
-				break
-			}
-		}
-		if isOut && strings.Contains(strOut, `>Ускорение<`) {
-
-			lstLink := strings.Split(strOut, `<td style="width:50%;padding-left:1px;"><a class="simple-but border" href="`)
-			strLink := lstLink[1]
-			lstLink = strings.Split(strLink, `"><span><span>Ускорение</span></span></a>`)
-			strLink = "https://wartank.ru/" + lstLink[0]
-			lstBase, err := сам.Сеть().Get(strLink)
-			if err != nil {
-				// log._rintf("ERRO NetBank.checkBankForce(): при GET-запросе на бесплатном ускорении апгрейда банка, err=\n\t%v\n", err)
-				return
-			}
-			if err := сам.СтрОбновить(lstBase); err != nil {
-				// log._rintf("ERRO NetBank.checkBankForce(): при обновлении lstBase, err=\n\t%v\n", err)
-				return
-			}
-			сам.банк.АренаСостояние().РаботаИмяУст("")
-			сам.банк.АренаСостояние().СостояниеУст(cons.РежимАпгрейд)
-			if err := сам.банк.ОбратВремяУст(времОжидБесплат); err != nil {
-				log.Printf("WARN Base.checkBankForce(): при установке времени бесплатного ускорения апгрейда банка(%v)\n\terr=%v\n", времОжидБесплат, err)
-			}
-		}
-	}
-}
-
-// Проверяет на ускорение апгрейда шахты
-func (сам *База) шахтаАпгрейдФорсаж() {
-	var (
-		ind     int
-		strOut  = ""
-		isOut   bool
-		lstBase = сам.СписПолучить()
-	)
-	{ // Проверка на платное ускорение апгрейда
-		for ind, strOut = range lstBase {
-			if strings.Contains(strOut, `Производит ресурсы<br/>`) {
-				// Убедиться что есть строка платного ускорения
-				isOut = true
-				ind += 29
-				strOut = lstBase[ind]
-				break
-			}
-		}
-		if isOut && strings.Contains(strOut, `Ускорить за`) {
-			сам.шахта.АренаСостояние().РаботаИмяУст("")
-			сам.шахта.АренаСостояние().СостояниеУст(cons.РежимАпгрейд)
-			/*
-				if err := сам.шахта.ОбратВремяУст(времОжидПлат); err != nil {
-					log.Printf("WARN Base.checkMineForce(): при установке времени платного апгрейда шахты(%v)\n\terr=%v\n", времОжидПлат, err)
-				}
-			*/
-			return
-		}
-	}
-	{ // Проверка на время бесплатного ускорение апгрейда
-		isOut = false
-		for ind, strOut = range lstBase {
-			if strings.Contains(strOut, `Производит ресурсы<br/>`) {
-				// Убедиться что есть строка платного ускорения
-				isOut = true
-				ind += 26
-				strOut = lstBase[ind]
-				break
-			}
-		}
-		if isOut && strings.Contains(strOut, `>Ускорение<`) {
-			lstLink := strings.Split(strOut, `<td style="width:50%;padding-left:1px;"><a class="simple-but border" href="`)
-			strLink := lstLink[1]
-			lstLink = strings.Split(strLink, `"><span><span>Ускорение</span></span></a>`)
-			strLink = "https://wartank.ru/" + lstLink[0]
-			lstBase, err := сам.Сеть().Get(strLink)
-			if err != nil {
-				// log._rintf("ERRO NetBank.checkMineForce(): при GET-запросе на бесплатном ускорении апгрейда шахты, err=\n\t%v\n", err)
-				return
-			}
-			if err := сам.СтрОбновить(lstBase); err != nil {
-				// log._rintf("ERRO NetBank.checkMineForce(): при обновлении lstBase, err=\n\t%v\n", err)
-				return
-			}
-			/*
-				if err := сам.шахта.ОбратВремяУст(времОжидБесплат); err != nil {
-					log.Printf("WARN Base.checkMineForce(): при установке времени апгрейда шахты(%v)\n\terr=%v\n", времОжидБесплат, err)
-				}
-			*/
-			// sound.MineForce()
-			сам.шахта.АренаСостояние().РаботаИмяУст("")
-			сам.шахта.АренаСостояние().СостояниеУст(cons.РежимАпгрейд)
-			return
-		}
-	}
-	// Все проверки прошли -- это просто работа
-	сам.шахта.АренаСостояние().СостояниеУст(cons.РежимРабота)
-}
-
-// Проверяет на ускорение апгрейда полигона
-func (сам *База) проверитьПолигонУсиление() {
-	var (
-		ind     int
-		strOut  = ""
-		isOut   bool
-		lstBase = сам.СписПолучить()
-	)
-	countTime := сам.полигон.ВремяОстат().ПолучМилСек()
-	if countTime > 3_000 {
-		return
-	}
-	{ // Проверка на платное ускорение апгрейда
-		for ind, strOut = range lstBase {
-			if strings.Contains(strOut, `Производит усиление танка<br/>`) {
-				// Убедиться что есть строка платного ускорения
-				isOut = true
-				ind += 29
-				strOut = lstBase[ind]
-				break
-			}
-		}
-		if isOut && strings.Contains(strOut, `Ускорить за`) {
-			// strTime := lstBase[ind-21]
-			// lstTime := strings.Split(strTime, `<td><div class="value-block lh1"><span><span>`)
-			// strTime = lstTime[1]
-			// lstTime = strings.Split(strTime, `</span></span></div></td>`)
-			// strTime = lstTime[0]
-			// if err := сам.polygon.CountDown().Set(strTime); err != nil {
-			// 	// log._rintf("WARN Base.checkMineForce(): при установке времени апгрейда полигона(%v)\n\terr=%v\n", strTime, err)
-			// }
-			сам.полигон.АренаСостояние().РаботаИмяУст("")
-			сам.полигон.АренаСостояние().СостояниеУст(cons.РежимАпгрейд)
-			if err := сам.полигон.ОбратВремяУст(времОжидПлат); err != nil {
-				log.Printf("WARN Base.checkPolygonForce(): при установке платного времени апгрейда полигона(%v)\n\terr=%v\n", времОжидПлат, err)
-			}
-			return
-		}
-	}
-	{ // Проверка на бесплатное ускорение апгрейда
-		isOut = false
-		for ind, strOut = range lstBase {
-			if strings.Contains(strOut, `Производит усиление танка<br/>`) {
-				// Убедиться что есть строка платного ускорения
-				isOut = true
-				ind += 26
-				strOut = lstBase[ind]
-				break
-			}
-		}
-		if isOut && strings.Contains(strOut, `>Ускорение<`) {
-			lstLink := strings.Split(strOut, `<td style="width:50%;padding-left:1px;"><a class="simple-but border" href="`)
-			strLink := lstLink[1]
-			lstLink = strings.Split(strLink, `"><span><span>Ускорение</span></span></a>`)
-			strLink = "https://wartank.ru/" + lstLink[0]
-			lstBase, err := сам.Сеть().Get(strLink)
-			if err != nil {
-				// log._rintf("ERRO NetBank.checkPolygonForce(): при GET-запросе на бесплатном ускорении апгрейда полигона, err=\n\t%v\n", err)
-				return
-			}
-			if err := сам.СтрОбновить(lstBase); err != nil {
-				// log._rintf("ERRO NetBank.checkPolygonForce(): при обновлении lstBase, err=\n\t%v\n", err)
-				return
-			}
-			// sound.MineForce()
-			сам.полигон.АренаСостояние().РаботаИмяУст("")
-			сам.полигон.АренаСостояние().СостояниеУст(cons.РежимАпгрейд)
-			// Установить время ожидания для обновления
-			if err := сам.полигон.ОбратВремяУст(времОжидБесплат); err != nil {
-				log.Printf("WARN Base.checkPolygonForce(): при установке времени бесплатного апгрейда полигона(%v)\n\terr=%v\n", времОжидБесплат, err)
-			}
-			// log._rintf("INFO NetBank.checkPolygonForce(): ускорено строительство полигона\n")
-			return
-		}
-	}
-	// Все проверки прошли -- это просто работа
-	сам.полигон.АренаСостояние().СостояниеУст(cons.РежимРабота)
-}

+ 0 - 70
app/lev3/bot/angar/battle/battle.go

@@ -1,70 +0,0 @@
-// package battle -- объект сражения
-package battle
-
-import (
-	"time"
-
-	. "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"
-)
-
-// Сражение -- объект сражения
-type Сражение struct {
-	ИАрена
-	бот    ИБот
-	клиент ИХттпВоркер
-
-	регистрация *battle_register.СхваткаРегистрация // Регистратор на сражение
-	ожидание    *battle_wait.СхваткаОжидание        // Ожидатель начала сражения
-	действие    *battle_worker.СхваткаИсполнитель   // Исполнитель сражения
-
-}
-
-// НовСражение -- возвращает новый *Battle
-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 - 59
app/lev3/bot/angar/battle/battle_worker/battle_worker.go

@@ -1,59 +0,0 @@
-// package battle_worker -- исполнение битвы
-package battle_worker
-
-import (
-	"time"
-
-	. "wartank/app/lev0/types"
-	"wartank/app/lev1/stat_param"
-	"wartank/app/lev2/arena"
-	"wartank/app/lev2/arena_battle/battle_worker/battle_worker"
-	"wartank/app/lev2/arena_battle/battle_worker/battle_worker/battle_sound"
-)
-
-// СражениеДействие -- исполнение битвы
-type СхваткаИсполнитель struct {
-	ИАрена
-	конт ИБотКонтекст
-	бот  ИБот
-
-	еслиНачало ИСтатПарам
-
-	// Непосредственное сражение
-	действие *battle_worker.СражениеДействие
-
-	sound *battle_sound.BattleSound // Однопоточное проигрывание звука
-}
-
-// НовСражениеДействие -- возвращает новый исполнитель битвы
-func НовСражениеИсполнитель(конт ИБотКонтекст, bot ИБот) *СхваткаИсполнитель {
-	сам := &СхваткаИсполнитель{
-		конт:       конт,
-		бот:        bot,
-		еслиНачало: stat_param.НовСтатПарам("тревога"),
-		sound:      battle_sound.NewBattleSound(),
-	}
-	аренаКонфиг := arena.АренаКонфиг{
-		Бот_:         bot,
-		АренаИмя_:    "Ход сражения",
-		СтрКонтроль_: `<title>Сражения</title>`,
-		ФнПуск_:      сам.пуск,
-		СтрУрл_:      "https://wartank.ru/pve",
-	}
-	сам.ИАрена = arena.НовАрена(конт, аренаКонфиг)
-	return сам
-}
-
-// выполняет битву
-func (сам *СхваткаИсполнитель) пуск() {
-	сам.действие = battle_worker.НовСражениеДействие(сам.конт, сам.бот) // IBattleOn (онлайн)
-	сам.sound.Play()
-	time.Sleep(time.Second * 10) // Задержка для звука на странице
-	<-сам.действие.Контекст().Done()
-	// log._rintf("Battle.runBaton(): сражение завершено\n")
-}
-
-// Тревога -- возвращает признак начала сражения (для браузера)
-func (сам *СхваткаИсполнитель) Тревога() ИСтатПарам {
-	return сам.еслиНачало
-}

+ 0 - 47
app/lev3/bot/angar/battle/battle_worker/battle_worker/battle_sound/battle_sound.go

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

+ 0 - 105
app/lev3/bot/angar/battle/battle_worker/battle_worker/battle_worker.go

@@ -1,105 +0,0 @@
-package battle_worker
-
-import (
-	"context"
-	"time"
-
-	. "wartank/app/lev0/types"
-	"wartank/app/lev2/arena"
-	"wartank/app/lev2/arena_battle/battle_worker/battle_worker/health"
-	"wartank/app/lev2/arena_battle/battle_worker/battle_worker/manevr"
-	"wartank/app/lev2/arena_battle/battle_worker/battle_worker/shot"
-	"wartank/app/lev2/arena_battle/battle_worker/battle_worker/shot/is_shot"
-)
-
-/*
-	Предоставляет сетевой компонент при непосредственном сражении
-*/
-
-// СражениеДействие -- непосредственно танкует в сражении
-type СражениеДействие struct {
-	ИАрена
-	бот        ИБот
-	кнт        context.Context // Контекст сражения
-	фнОтменить func()          // Функция отмены сражения
-
-	выстрел     *shot.Выстрел    // Объект выстрела
-	здоровье    *health.Здоровье // Текущее здоровье танка
-	манёвр      *manevr.Манёвр   // Возможность маневрирования
-	логин       string
-	еслиВыстрел *is_shot.IsShot // Признак необходимости маскирования (запрет стрельбы, когда слабое здоровье)
-}
-
-// НовСражениеДействие -- возвращает новый *BattleOn
-func НовСражениеДействие(конт ИБотКонтекст, бот ИБот) *СражениеДействие {
-	// Ограничить время сражения бота
-	кнтСражение, фнОтменить := context.WithTimeout(бот.Контекст(), time.Second*305)
-	сам := &СражениеДействие{
-		бот:         бот,
-		кнт:         кнтСражение,
-		фнОтменить:  фнОтменить,
-		логин:       бот.Имя(),
-		еслиВыстрел: is_shot.NewIsShot(),
-	}
-	аренаКонфиг := arena.АренаКонфиг{
-		Бот_:         сам.бот,
-		АренаИмя_:    "Исполнитель сражения",
-		СтрКонтроль_: `<title>Сражения</title>`,
-		ФнПуск_:      сам.пуск,
-		СтрУрл_:      "https://wartank.ru/pve",
-	}
-	сам.ИАрена = arena.НовАрена(конт, аренаКонфиг)
-	go сам.пуск()
-	_ = ИСражениеДействие(сам)
-	return сам
-}
-
-// запускает сражение
-func (сам *СражениеДействие) пуск() {
-	defer func() {
-		сам.фнОтменить()
-		// log._rintf("BattleOn.run(): сражение завершено\n")
-	}()
-	{ // Подготовка к сражению
-		var err error
-		сам.выстрел, err = shot.НовВыстрел(сам) // Объект выстрела
-		if err != nil {
-			// log._rintf("ERRO BattleOn.Run(): при создании выстрела танка, err=\n\t%v\n", err)
-			return
-		}
-		сам.здоровье, err = health.НовЗдоровье(сам)
-		if err != nil {
-			// log._rintf("ERRO BattleOn.Run(): при создании здоровья танка, err=\n\t%v\n", err)
-			return
-		}
-		сам.манёвр, err = manevr.НовМанёвр(сам)
-		if err != nil {
-			// log._rintf("ERRO BattleOn.Run(): при создании маневра танка, err=\n\t%v\n", err)
-			return
-		}
-	}
-	// Рабочий цикл сражения
-	<-сам.кнт.Done()
-}
-
-func (сам *СражениеДействие) МанёврНадоУст() {
-	if сам.манёвр == nil {
-		return
-	}
-	сам.манёвр.УстНадо()
-}
-
-// ВыстрелБлок -- признак запрета стрельбы при слабом здоровье
-func (сам *СражениеДействие) ВыстрелБлок() ИЕслиВыстрел {
-	return сам.еслиВыстрел
-}
-
-// Кнт -- возвращает контекст отмены сражения
-func (сам *СражениеДействие) Контекст() context.Context {
-	return сам.кнт
-}
-
-// ОтменитьДействие -- вызов функции отмены контекста сражения
-func (сам *СражениеДействие) Отменить() {
-	сам.фнОтменить()
-}

+ 0 - 48
app/lev3/bot/angar/battle/battle_worker/battle_worker/battlesound/battlesound.go

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

+ 0 - 167
app/lev3/bot/angar/battle/battle_worker/battle_worker/manevr/manevr.go

@@ -1,167 +0,0 @@
-package manevr
-
-import (
-	"fmt"
-	"log"
-	"strings"
-	"time"
-	"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/internal/components/sound"
-	. "wartank/app/lev0/types"
-)
-
-/*
-	Пытается маневрировать после выстрела
-*/
-
-// Манёвр -- маневрирует после выстрела
-type Манёвр struct {
-	ИСражениеДействие                         // FIXME:
-	еслиМанёврНадо    *is_manevr.IsManevr     // Требование выполнить манёвр
-	времяЖдать        *repair_time.RepairTime // Время до восстановления манёвра
-	chTick            chan int                // Тики для поиска маневра
-}
-
-// НовМанёвр -- возвращает новый *Manevr
-func НовМанёвр(действие ИСражениеДействие) (*Манёвр, error) {
-	{ // Предусловия
-		if действие == nil {
-			return nil, fmt.Errorf("НовМанёвр(): действие==nil")
-		}
-	}
-	сам := &Манёвр{
-		ИСражениеДействие: действие,
-		еслиМанёврНадо:    is_manevr.NewIsManevr(),
-		времяЖдать:        repair_time.NewRepairTime(),
-		chTick:            make(chan int, 1),
-	}
-	_ = сам.времяЖдать.Set("0") // При запуске боя есть возможность маневрировать
-	go сам.makeTick()
-	go сам.пуск()
-	return сам, nil
-}
-
-// Генерирует тик для уменьшения времени ожидания восстановления возможности манёвра
-func (сам *Манёвр) makeTick() {
-	defer func() {
-		close(сам.chTick)
-		// log._rintf("Manevr.makeTick(): сражение завершено\n")
-	}()
-	for {
-		select {
-		case <-сам.Контекст().Done():
-			return
-		default:
-			if сам.времяЖдать.Получ() <= 0 {
-				сам.chTick <- 1
-			}
-			сам.времяЖдать.Dec()
-			time.Sleep(time.Second * 1)
-		}
-	}
-}
-
-// Рабочий цикл поиска маневра (~)
-func (сам *Манёвр) пуск() {
-	for range сам.chTick {
-		if !сам.еслиМанёврНадо.Get() { // Если нет требования манёвра -- пропускаем
-			continue
-		}
-		сам.манёвр()
-		сам.времяМанёврНайти() // Найти время после манёвра
-	}
-}
-
-// Ищет время для манёвра
-func (сам *Манёвр) времяМанёврНайти() {
-	var (
-		еслиНайдено bool
-		ind         int
-		lstBattleOn = сам.СписПолучить()
-		strOut      string
-	)
-	for ind, strOut = range lstBattleOn {
-		// <a href="pve?4-88.ILinkListener-currentControl-maneuverLink" class="simple-but blue"><span><span>5 секунд</span></span></a>
-		if strings.Contains(strOut, `-currentControl-maneuverLink`) {
-			еслиНайдено = true
-			break
-		}
-	}
-	if !еслиНайдено { // Или манёвр успел восстановиться, или конец сражения
-		if strings.Contains(strOut, `<span>Маневр</span>`) {
-			_ = сам.времяЖдать.Set("0")
-			return
-		}
-		log.Printf("Манёвр.времяМанёврНайти(): не найдено время манёвра")
-		сам.Отменить()
-		return
-	}
-	{ // Найти время манёвра
-		lstTime := strings.Split(strOut, `ILinkListener-currentControl-maneuverLink" class="simple-but blue"><span><span>`)
-		if len(lstTime) != 2 {
-			log.Printf("Manevr.findManevrTime(): нет двух полей во времени ожидания, ind=%v, lstBattleOn[-1]=%v, lstBattleOn[ind]=%v, lstBattleOn[+1]=%v",
-				ind, lstBattleOn[ind-1], strOut, lstBattleOn[ind+1])
-			сам.Отменить()
-			return
-		}
-		strTime := lstTime[1]
-		lstTime = strings.Split(strTime, ` секунд</span></span></a>`)
-		strTime = lstTime[0]
-		if err := сам.времяЖдать.Set(strTime); err != nil {
-			log.Println("Manevr.findManevrTime(): при обновлении времени ожидания манёвра")
-			сам.Отменить()
-			return
-		}
-	}
-	log.Printf("Manevr.findManevrTime(): до манёвра %v\n", сам.времяЖдать.Получ())
-}
-
-// Манёвр по возможности
-func (сам *Манёвр) манёвр() {
-	var (
-		еслиНайдено = false
-		lstBattleOn = сам.СписПолучить()
-		strOut      = ""
-	)
-	for _, strOut = range lstBattleOn {
-		// <a href="pve?4-21.ILinkListener-currentControl-maneuverLink" class="simple-but blue"><span><span>Маневр</span></span></a>
-		if strings.Contains(strOut, `<span>Маневр</span>`) {
-			еслиНайдено = true
-			break
-		}
-	}
-	if !еслиНайдено { // Либо ждём восстановления манёвра, либо сражение закончилось
-		return
-	}
-	{ // Попытка манёвра
-		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.Printf("Manevr.Manevr(): при выполнении GET-команды маневра, err=\n\t%v\n", err)
-			сам.Отменить()
-			return
-		}
-		if err = сам.СтрОбновить(lstBattleOn); err != nil {
-			log.Printf("Manevr.Manevr(): при обновлении lstBattle, err=\n\t%v\n", err)
-			сам.Отменить()
-			return
-		}
-		// sound.Manevr()
-	}
-	сам.еслиМанёврНадо.Сброс()
-}
-
-// ЕслиГотов -- возвращает готовность манёвра
-func (сам *Манёвр) ЕслиГотов() bool {
-	return сам.времяЖдать.ЕслиМожно()
-}
-
-// УстНадо -- устанавливает признак необходимости манёвра
-func (сам *Манёвр) УстНадо() {
-	сам.еслиМанёврНадо.Set()
-}

+ 0 - 106
app/lev3/bot/angar/battle/battle_worker/battleon/battleon.go

@@ -1,106 +0,0 @@
-package battle_worker
-
-import (
-	"context"
-	"time"
-
-	. "wartank/app/lev0/types"
-	"wartank/app/lev2/arena"
-	"wartank/app/lev2/arena_battle/battle_worker/battle_worker/health"
-	"wartank/app/lev2/arena_battle/battle_worker/battle_worker/manevr"
-	"wartank/app/lev2/arena_battle/battle_worker/battle_worker/shot"
-	"wartank/app/lev2/arena_battle/battle_worker/battle_worker/shot/is_shot"
-	. "wartank/kernel/kernel_types"
-)
-
-/*
-	Предоставляет сетевой компонент при непосредственном сражении
-*/
-
-// СражениеДействие -- непосредственно танкует в сражении
-type СражениеДействие struct {
-	ИАрена
-	бот        ИБот
-	кнт        context.Context // Контекст сражения
-	фнОтменить func()          // Функция отмены сражения
-
-	выстрел     *shot.Выстрел    // Объект выстрела
-	здоровье    *health.Здоровье // Текущее здоровье танка
-	манёвр      *manevr.Манёвр   // Возможность маневрирования
-	логин       string
-	еслиВыстрел *is_shot.IsShot // Признак необходимости маскирования (запрет стрельбы, когда слабое здоровье)
-}
-
-// НовСражениеДействие -- возвращает новый *BattleOn
-func НовСражениеДействие(конт ИЯдроКонтекст, бот ИБот) *СражениеДействие {
-	// Ограничить время сражения бота
-	кнтСражение, фнОтменить := context.WithTimeout(бот.Контекст(), time.Second*305)
-	сам := &СражениеДействие{
-		бот:         бот,
-		кнт:         кнтСражение,
-		фнОтменить:  фнОтменить,
-		логин:       бот.Имя(),
-		еслиВыстрел: is_shot.NewIsShot(),
-	}
-	аренаКонфиг := arena.АренаКонфиг{
-		Бот_:         сам.бот,
-		АренаИмя_:    "Исполнитель сражения",
-		СтрКонтроль_: `<title>Сражения</title>`,
-		ФнПуск_:      сам.пуск,
-		СтрУрл_:      "https://wartank.ru/pve",
-	}
-	сам.ИАрена = arena.НовАрена(конт, аренаКонфиг)
-	go сам.пуск()
-	_ = ИСражениеДействие(сам)
-	return сам
-}
-
-// запускает сражение
-func (сам *СражениеДействие) пуск() {
-	defer func() {
-		сам.фнОтменить()
-		// log._rintf("BattleOn.run(): сражение завершено\n")
-	}()
-	{ // Подготовка к сражению
-		var err error
-		сам.выстрел, err = shot.НовВыстрел(сам) // Объект выстрела
-		if err != nil {
-			// log._rintf("ERRO BattleOn.Run(): при создании выстрела танка, err=\n\t%v\n", err)
-			return
-		}
-		сам.здоровье, err = health.НовЗдоровье(сам)
-		if err != nil {
-			// log._rintf("ERRO BattleOn.Run(): при создании здоровья танка, err=\n\t%v\n", err)
-			return
-		}
-		сам.манёвр, err = manevr.НовМанёвр(сам)
-		if err != nil {
-			// log._rintf("ERRO BattleOn.Run(): при создании маневра танка, err=\n\t%v\n", err)
-			return
-		}
-	}
-	// Рабочий цикл сражения
-	<-сам.кнт.Done()
-}
-
-func (сам *СражениеДействие) МанёврНадоУст() {
-	if сам.манёвр == nil {
-		return
-	}
-	сам.манёвр.УстНадо()
-}
-
-// ВыстрелБлок -- признак запрета стрельбы при слабом здоровье
-func (сам *СражениеДействие) ВыстрелБлок() ИЕслиВыстрел {
-	return сам.еслиВыстрел
-}
-
-// Кнт -- возвращает контекст отмены сражения
-func (сам *СражениеДействие) Контекст() context.Context {
-	return сам.кнт
-}
-
-// ОтменитьДействие -- вызов функции отмены контекста сражения
-func (сам *СражениеДействие) Отменить() {
-	сам.фнОтменить()
-}