package process_divwar
import (
"context"
"strings"
"time"
. "wartank/app/lev0/types"
"wartank/app/lev1/health"
"wartank/app/lev1/manevr"
"wartank/app/lev1/shot"
"wartank/app/lev2/arena"
"wartank/kernel"
. "wartank/kernel/kernel_types"
)
/*
Предоставляет сетевой компонент при непосредственном сражении
*/
// ПроцессДивизияВойна -- непосредственно танкует в сражении
type ПроцессДивизияВойна struct {
ИАрена
бот ИБот
лог ИЯдроЛог
ctxDivWar context.Context // Контекст сражения
fnCancelDivWar func() // Функция отмены сражения
выстрел ИВыстрел // Объект выстрела
здоровье ИЗдоровье // Текущее здоровье танка
манёвр ИМанёвр // Возможность маневрирования
логин string
chTick chan int // Ежесекундная проверка на окончание сражения
isEnd ИБезопБул
}
// НовПроцессДивизияВойна -- возвращает новый *DivWarOn
func НовПроцессДивизияВойна(конт ИБотКонтекст) ИСражениеПроцесс {
лог:=kernel.НовЛог("ПроцессДивизияВойна")
бот:=конт.Получ("бот").(ИБот)
ctxDivWar, fnCancelDivWar := context.WithTimeout(бот.Контекст(), time.Second*305)
сам := &ПроцессДивизияВойна{
бот: бот,
лог:лог,
ctxDivWar: ctxDivWar,
fnCancelDivWar: fnCancelDivWar,
логин: бот.Имя(),
isEnd: kernel.НовБезопБул(),
}
аренаКонфиг := arena.АренаКонфиг{
Бот_: бот,
АренаИмя_: "Сражение",
СтрКонтроль_: `
Сражения`,
ФнПуск_: сам.пуск,
СтрУрл_: "https://wartank.ru/pve",
}
сам.ИАрена = arena.НовАрена(конт, аренаКонфиг)
if сам.checkEnd() {
return nil
}
go сам.makeTick()
go сам.run()
return сам
}
// Манёвр -- возвращает объект манёвра
func (сам *ПроцессДивизияВойна) Манёвр() ИМанёвр {
return сам.манёвр
}
// Выстрел -- возвращает объект выстрела
func (сам *ПроцессДивизияВойна) Выстрел() ИВыстрел {
return сам.выстрел
}
// пускает сражение
func (сам *ПроцессДивизияВойна) пуск() {
}
// Ежесекудный тик
func (сам *ПроцессДивизияВойна) makeTick() {
defer func() {
close(сам.chTick)
сам.isEnd.Уст()
}()
for !сам.isEnd.Получ() {
select {
case <-сам.бот.Контекст().Done(): // Отмена контекста приложения
return
case <-сам.ctxDivWar.Done(): // Битва закончилась
return
default:
if сам.isEnd.Получ() {
return
}
сам.chTick <- 1
time.Sleep(time.Second * 1)
}
}
}
// запускает сражение
func (сам *ПроцессДивизияВойна) run() {
// defer log._rintf("ПроцессДивизияВойна.run(): сражение завершено\n")
{ // Подготовка к сражению
сам.выстрел = shot.НовВыстрел(сам) // Объект выстрела
сам.здоровье = health.НовЗдоровье(сам)
сам.манёвр = manevr.НовМанёвр(сам)
}
for { // Рабочий цикл сражения
select {
case <-сам.ctxDivWar.Done():
return
case <-сам.ВремяОстат().КаналСиг():
if сам.checkEnd() {
return
}
}
}
}
// Проверяет окончание сражения
func (сам *ПроцессДивизияВойна) checkEnd() bool {
defer func() {
if сам.isEnd.Получ() {
сам.fnCancelDivWar()
// log._rintf("DivWarOn.checkEnd(): сражение завершено\n")
}
}()
сам.Обновить()
lstDivWarOn := сам.СписПолучить()
for _, strOut := range lstDivWarOn {
if strings.Contains(strOut, `" class="simple-but gray">ОБЫЧНЫЕ`) {
сам.isEnd.Сброс()
return false
}
}
сам.isEnd.Уст()
сам.fnCancelDivWar()
return true
}
// ЕслиКонец -- возвращает признак окончания сражения (интерфейс)
func (сам *ПроцессДивизияВойна) ЕслиКонец() ИБезопБул {
return сам.isEnd
}
// Ctx -- возвращает контекст отмены сражения
func (сам *ПроцессДивизияВойна) Ctx() context.Context {
return сам.ctxDivWar
}
// CancelBattle - -вызов функции отмены контекста сражения
func (сам *ПроцессДивизияВойна) CancelBattle() {
сам.fnCancelDivWar()
}