// 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(стрАнализ, `tankДобить`) { 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) ангар.Обновить() }