package battle_worker
import (
"context"
"time"
. "wartank/app/lev0/types"
"wartank/app/lev2/arena"
"wartank/app/lev2/arena/arena_net"
"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/pkg/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.АренаКонфиг{
Бот_: сам.бот,
АренаИмя_: "Исполнитель сражения",
СтрКонтроль_: `
Сражения`,
ФнПуск_: сам.пуск,
}
сам.ИАрена = arena.НовАрена(конт, аренаКонфиг)
сам.сеть = arena_net.НовАренаСеть(конт, сам, "https://wartank.ru/pve")
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 (сам *СражениеДействие) Сеть() ИАренаСеть {
return сам.сеть
}
func (сам *СражениеДействие) МанёврНадоУст() {
if сам.манёвр == nil {
return
}
сам.манёвр.УстНадо()
}
// ВыстрелБлок -- признак запрета стрельбы при слабом здоровье
func (сам *СражениеДействие) ВыстрелБлок() ИЕслиВыстрел {
return сам.еслиВыстрел
}
// Кнт -- возвращает контекст отмены сражения
func (сам *СражениеДействие) Контекст() context.Context {
return сам.кнт
}
// ОтменитьДействие -- вызов функции отмены контекста сражения
func (сам *СражениеДействие) Отменить() {
сам.фнОтменить()
}