| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194 |
- package manevr
- import (
- "context"
- // "log"
- "strings"
- "time"
- "wartank/app/lev1/repair_time"
- // "wartank/internal/components/sound"
- . "wartank/app/lev0/types"
- . "gitp78su.ipnodns.ru/svi/kern"
- . "gitp78su.ipnodns.ru/svi/kern/kc/helpers"
- . "gitp78su.ipnodns.ru/svi/kern/krn/ktypes"
- )
- /*
- Пытается маневрировать после выстрела
- */
- // манёвр -- маневрирует после выстрела
- type манёвр struct {
- ИСражениеПроцесс // FIXME:
- лог ILogBuf
- isEnd ISafeBool
- ctxEnd context.Context
- еслиНадо ISafeBool
- еслиГотов ISafeBool // Возможность выполнить манёвр
- manevrTime *repair_time.RepairTime // Время до восстановления манёвра
- chTick chan int // Тики для поиска маневра
- }
- // НовМанёвр -- возвращает новый манёвр
- func НовМанёвр(проц ИСражениеПроцесс) ИМанёвр {
- Hassert(проц != nil, "НовМанёвр(): ИСражениеПроцесс==nil")
- сам := &манёвр{
- ИСражениеПроцесс: проц,
- лог: проц.Бот().КонтБот().Log(),
- ctxEnd: проц.Контекст(),
- еслиНадо: NewSafeBool(),
- isEnd: проц.ЕслиКонец(),
- еслиГотов: NewSafeBool(),
- manevrTime: repair_time.NewRepairTime(),
- chTick: make(chan int, 1),
- }
- _ = сам.manevrTime.Уст("0") // При запуске боя есть возможность маневрировать
- go сам.makeTick()
- go сам.run()
- return сам
- }
- // ЕслиГотов -- возвращает признак готовности к манёвру
- func (сам *манёвр) ЕслиГотов() bool {
- return сам.еслиГотов.Get()
- }
- // УстНадо -- устанавливает требование манёвра
- func (сам *манёвр) УстНадо() {
- сам.еслиНадо.Set()
- }
- // Генерирует тик для уменьшения времени ожидания восстановления возможности манёвра
- func (сам *манёвр) makeTick() {
- defer func() {
- close(сам.chTick)
- // log._rintf("манёвр.makeTick(): сражение завершено\n")
- }()
- for {
- select {
- case <-сам.ctxEnd.Done():
- return
- default:
- if сам.manevrTime.Получ() == 0 {
- сам.chTick <- 1
- }
- сам.manevrTime.Dec()
- time.Sleep(time.Second * 1)
- }
- }
- }
- // Рабочий цикл поиска маневра (~)
- func (сам *манёвр) run() {
- for range сам.chTick {
- if !сам.еслиГотов.Get() {
- continue
- }
- сам.findManevrTime()
- }
- }
- // Ищет время для манёвра
- func (сам *манёвр) findManevrTime() {
- var (
- еслиНайдено bool
- ind int
- lstBattleOn = сам.СписПолучить()
- стрВых string
- )
- for ind, стрВых = range lstBattleOn {
- // <a href="pve?4-88.ILinkListener-currentControl-maneuverLink" class="simple-but blue"><span><span>5 секунд</span></span></a>
- if strings.Contains(стрВых, `-currentControl-maneuverLink`) {
- еслиНайдено = true
- break
- }
- }
- if !еслиНайдено { // Или манёвр успел восстановиться, или конец сражения
- if strings.Contains(стрВых, `<span>Маневр</span>`) {
- _ = сам.manevrTime.Уст("0")
- time.Sleep(time.Second * 1)
- return
- }
- if сам.isEnd.Get() {
- time.Sleep(time.Second * 1)
- return
- }
- сам.лог.Warn("findManevrTime(): ошибка в поиске времени манёвра, стрВых=%v", стрВых)
- time.Sleep(time.Second * 1)
- return
- }
- { // Найти время манёвра
- lstTime := strings.Split(стрВых, `ILinkListener-currentControl-maneuverLink" class="simple-but blue"><span><span>`)
- if len(lstTime) != 2 {
- сам.лог.Err("манёвр.findManevrTime(): нет двух полей во времени ожидания инд=%v\n\n%v\n%v\n%v",
- ind,
- lstBattleOn[ind-1],
- стрВых,
- lstBattleOn[ind+1],
- )
- сам.еслиГотов.Reset()
- time.Sleep(time.Second * 1)
- return
- }
- strTime := lstTime[1]
- lstTime = strings.Split(strTime, ` секунд</span></span></a>`)
- strTime = lstTime[0]
- if err := сам.manevrTime.Уст(strTime); err != nil {
- сам.лог.Err("манёвр.findManevrTime(): при обновлении времени ожидания манёвра, ош=\n\t%v", err)
- сам.еслиГотов.Reset()
- time.Sleep(time.Second * 1)
- return
- }
- }
- сам.еслиГотов.Set()
- сам.лог.Info("манёвр.findManevrTime(): до манёвра, время=%v", сам.manevrTime.Получ())
- }
- // Выполнить -- принудительный манёвр по требованию
- func (сам *манёвр) Выполнить() {
- var (
- еслиНайдено = false
- lstBattleOn = сам.СписПолучить()
- strOut = ""
- )
- if !сам.еслиГотов.Get() {
- time.Sleep(time.Second * 1)
- return
- }
- 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 !еслиНайдено { // Либо ждём восстановления манёвра, либо сражение закончилось
- сам.еслиГотов.Reset()
- time.Sleep(time.Second * 1)
- 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 {
- сам.лог.Err("манёвр.Выполнить(): при выполнении GET-команды маневра, ош=\n\t%v", err)
- сам.еслиГотов.Reset()
- time.Sleep(time.Second * 1)
- return
- }
- сам.СтрОбновить(lstBattleOn)
- // sound.манёвр()
- }
- }
- // IsReady -- возвращает готовность манёвра
- func (сам *манёвр) IsReady() bool {
- return сам.manevrTime.IsReady()
- }
|