// package bf_fuel_attack -- бизнес-процесс боя на топливе
package bf_fuel_attack
import (
"fmt"
"os"
"strings"
"time"
. "gitp78su.ipnodns.ru/svi/kern/kc/helpers"
. "gitp78su.ipnodns.ru/svi/kern/krn/ktypes"
"wartank/app/lev0/cons"
. "wartank/app/lev0/types"
)
// ТопливоАтаковать -- бой на топливе
func ТопливоАтаковать(конт ILocalCtx) {
ангар := конт.Get("ангар").Val().(ИАренаАнгар)
топливо := ангар.Топливо().Получ()
if топливо < cons.ТопливоМин { // Минимальная ёмкость бака -- 315
return
}
списСтрБой := начатьБой(конт)
списВыстрел1 := выбратьБойСлабый(конт, списСтрБой)
сделатьВыстрелы(конт, списВыстрел1)
}
// Идёт в атаку, если топлива больше cons.ТопливоМин
func начатьБой(конт ILocalCtx) []string {
// Получить ссылку на атаку
ангар := конт.Get("ангар").Val().(ИАренаАнгар)
списАнгар := ангар.СписПолучить()
var (
стрАнализ string
еслиЕсть bool
)
for _, стрАтак := range списАнгар {
if strings.Contains(стрАтак, `В бой!`) {
стрАнализ = стрАтак
еслиЕсть = true
break
}
}
Hassert(еслиЕсть, "начатьБой(): не найдена строка 'Начать бой'")
// Вырезать ссылку на атаку
списАнгар = strings.Split(стрАнализ, `В бой!`)
бойСсылка = "https://wartank.ru/" + списАнгар[0]
арена := конт.Get("арена_топливо").Val().(ИАрена)
списСтрБой, err := арена.Сеть().Get(бойСсылка)
Hassert(err == nil, "начатьБой(): in make GET-request to battle, err=\n\t%v", err)
return списСтрБой
}
// Выбирает первого более слабого противника и делает первый выстрел
func выбратьБойСлабый(конт ILocalCtx, списСтрБой []string) []string {
// _mt.Println("\tAngarNet.makeSelectBattle()")
var стрАнализ string
// Выдернуть строку с первой ссылкой на противника
for _, стрБой_ := range списСтрБой {
if strings.Contains(стрБой_, `opponents-opponents-0`) {
стрАнализ = стрБой_
break
}
}
var ссылкаБой string
switch стрАнализ == "" {
case true: // Такая ситуация возможна, если уже были какие-то выстрелы
return списСтрБой
default: // Успешный выстрел
// Вырезать ссылку из строки
списСтрБой = strings.Split(стрАнализ, `
Добить`) {
strOut = strShoot
break
}
}
var linkShoot2 string
switch strOut == "" {
case true: // Первый выстрел был неудачным
for _, strShoot := range lstShoot2 {
if strings.Contains(strShoot, `Взять реванш`) {
strOut = strShoot
break
}
}
if strOut == "" { // Это ситуация для третьего выстрела
списВыстрел3 = lstShoot2
return nil
}
// Вырезать ссылку из строки
lstShoot2 = strings.Split(strOut, `Взять реванш`)
linkShoot2 = "https://wartank.ru/" + lstShoot2[0]
default: // Первый выстрел был удачным
// Вырезать ссылку из строки
lstShoot2 = strings.Split(strOut, `Добить`)
linkShoot2 = "https://wartank.ru/" + lstShoot2[0]
}
_, err = арена.Сеть().Get(linkShoot2)
Hassert(err == nil, "сделатьВыстрелы(): in Get-response shoot2, err=\n\t%v", err)
fuel := ангар.Топливо().Получ()
fuel -= 30
ангар.Топливо().Уст(fuel)
return nil
}
err := фнВыстрел2()
Hassert(err == nil, "сделатьВыстрелы(): при выполнении выстрел-2, ош=\n\t%v", err)
фнВыстрел3 := func() (err error) { // Третий выстрел
// _mt.Println("\tAngarNet.makeShooting().fnShoot3()")
defer func() {
if _panic := recover(); _panic != nil {
msg := time.Now().Local().Format("2006-01-02 15:04:05.000 fnShoot3\n")
msg += "\tNetClient.makeShooting().fnShoot3()\n"
msg0 := fmt.Sprintf("%v\n", _panic)
msg1 := ""
for _, _msg := range strings.Split(msg0, "\n") {
if _msg == "" {
continue
}
msg1 += "\t" + _msg + "\n"
}
msg += msg1
// _mt.Println(msg)
err = fmt.Errorf("%v", msg)
msg1 = "" // Сброс накопленной ошибки
for _, _msg := range списВыстрел3 {
if _msg == "" {
continue
}
msg1 += "\t" + _msg + "\n"
}
msg += msg1
// Выкинуть ошибку в файл
_ = os.MkdirAll("./errors", 0700)
err = os.WriteFile("./errors/attack_shoot3.html", []byte(msg), 0600)
}
}()
// Получить ссылку на третий выстрел
var strOut string
for _, strShoot3 := range списВыстрел3 {
if strings.Contains(strShoot3, `Уничтожить`) {
strOut = strShoot3
break
}
}
linkShoot3 := ""
switch strOut == "" {
case true: // Если не найдена ссылка -- значит было поражение в выстреле
if strOut == "" {
for _, strShoot3 := range списВыстрел3 {
if strings.Contains(strShoot3, `Взять реванш`) {
strOut = strShoot3
break
}
}
}
// Вырезать ссылку из строки
списВыстрел3 = strings.Split(strOut, `Взять реванш`)
linkShoot3 = "https://wartank.ru/" + списВыстрел3[0]
default: // Успешный выстрел
// Вырезать ссылку из строки
списВыстрел3 = strings.Split(strOut, `Уничтожить`)
linkShoot3 = "https://wartank.ru/" + списВыстрел3[0]
}
if _, err = арена.Сеть().Get(linkShoot3); err != nil {
return fmt.Errorf("ТопливоБой.makeShooting(): in Get-response shoot3, err=\n\t%w", err)
}
fuel := ангар.Топливо().Получ()
fuel -= 30
ангар.Топливо().Уст(fuel)
return nil
}
err = фнВыстрел3()
Hassert(err == nil, "сделатьВыстрелы().фнВыстрел3(): при выстрел-3, ош=\n\t%v", err)
ангар.Обновить()
}
|