package angar import ( "fmt" "sync" "strconv" "strings" "wartank/pkg/components/section" "wartank/pkg/types" "wartank/server/serv_bots/warbot/angar/angar_attack" "wartank/server/serv_bots/warbot/angar/angarnet" "wartank/server/serv_bots/warbot/angar/base" "wartank/server/serv_bots/warbot/angar/batmas" "wartank/server/serv_bots/warbot/angar/battle" "wartank/server/serv_bots/warbot/angar/convoy" "wartank/server/serv_bots/warbot/angar/fuel" "wartank/server/serv_bots/warbot/angar/missions" "wartank/server/serv_bots/warbot/angar/netstat" "wartank/server/serv_bots/warbot/tank/tankstat/static_param" "github.com/sirupsen/logrus" ) /* Объект ангара приложения */ // Angar -- ангар для танка type Angar struct { *section.Section net *angarnet.AngarNet netKill *angar_attack.AngarAttack bot types.ИБот convoy *convoy.Convoy battle *battle.Battle batMas *batmas.BatMas base *base.Base missions *missions.Missions золото types.ИСтатПарам уровень types.ИСтатПарам progress types.ИСтатПарам fuel *fuel.Fuel игроковОнлайн types.ИСтатПарам сереброВсего types.ИСтатПарам silverOnline types.ИСтатПарам stat *netstat.NetStat block sync.Mutex } // NewAngar -- возвращает новый *Angar func NewAngar(bot types.ИБот) (*Angar, error) { section, err := section.NewSection(bot, "Ангар", `Ангар`) if err != nil { return nil, fmt.Errorf("NewAngar(): in create ISection, err=\n\t%w", err) } золото, ош := static_param.НовСтатПарам("gold") if ош != nil { return nil, fmt.Errorf("NewAngar(): при создании статистики золота, ош=\n\t%w", ош) } уровень, ош := static_param.НовСтатПарам("level") if ош != nil { return nil, fmt.Errorf("NewAngar(): при создании статистики уровня бота, ош=\n\t%w", ош) } прогресс, ош := static_param.НовСтатПарам("progress") if ош != nil { return nil, fmt.Errorf("NewAngar(): при создании статистики прогресса уровня, ош=\n\t%w", ош) } игроковОнлайн, ош := static_param.НовСтатПарам("online") if ош != nil { return nil, fmt.Errorf("NewAngar(): при создании статистики игроков онлайн, ош=\n\t%w", ош) } сереброВсего, ош := static_param.НовСтатПарам("silver_all") if ош != nil { return nil, fmt.Errorf("NewAngar(): при создании статистики серебра всего, ош=\n\t%w", ош) } сереброСессия, ош := static_param.НовСтатПарам("silver_online") if ош != nil { return nil, fmt.Errorf("NewAngar(): при создании статистики серебра заработанного за сессию, ош=\n\t%w", ош) } sf := &Angar{ Section: section, bot: bot, золото: золото, уровень: уровень, progress: прогресс, игроковОнлайн: игроковОнлайн, сереброВсего: сереброВсего, silverOnline: сереброСессия, } { // Сеть sf.net, err = angarnet.NewAngarNet(sf) if err != nil { return nil, fmt.Errorf("NewAngar(): in create , err=\n\t%w", err) } } { // Сеть атаки sf.netKill, err = angar_attack.NewAngarAttack(sf) if err != nil { return nil, fmt.Errorf("NewAngar(): in create , err=\n\t%w", err) } } { // Статистика sf.stat, err = netstat.NewNetStat(sf.bot) if err != nil { return nil, fmt.Errorf("NewAngar(): in create NetResource, err=\n\t%w", err) } } { // Convoy sf.convoy, err = convoy.NewConvoy(sf.bot) if err != nil { return nil, fmt.Errorf("NewAngar(): in create IConvoy, err=\n\t%w", err) } } { // Сражение sf.battle, err = battle.NewBattle(sf.bot) if err != nil { return nil, fmt.Errorf("NewAngar(): in create IBattle, err=\n\t%w", err) } } { // Битва мастеров sf.batMas, err = batmas.NewBatMas(sf.bot) if err != nil { return nil, fmt.Errorf("NewAngar(): in create *BatMas, err=\n\t%w", err) } // go sf.batMas.Run() } { // База sf.base, err = base.NewBase(sf) if err != nil { return nil, fmt.Errorf("NewAngar(): in make IBase, err=\n\t%w", err) } } { // Миссии sf.missions, err = missions.NewMissions(sf.bot) if err != nil { return nil, fmt.Errorf("NewAngar(): in make *Missions, err=\n\t%w", err) } } { // Топливо sf.fuel, err = fuel.NewFuel(sf) if err != nil { return nil, fmt.Errorf("NewAngar(): in make *Missions, err=\n\t%w", err) } } return sf, nil } // запускает обработку ангара func (sf *Angar) Пуск() error { { // Запуск компонентов if err := sf.netKill.Run(); err != nil { return fmt.Errorf("Angar.Run(): при пуске сетевой секции опыт за топливо, err=\n\t%w", err) } if err := sf.convoy.Run(); err != nil { return fmt.Errorf("Angar.Run(): при пуске конвоя, err=\n\t%w", err) } if err := sf.battle.Run(); err != nil { return fmt.Errorf("Angar.Run(): при пуске сражения, err=\n\t%w", err) } if err := sf.batMas.Run(); err != nil { return fmt.Errorf("Angar.Run(): при пуске схватки, err=\n\t%w", err) } if err := sf.base.Run(); err != nil { return fmt.Errorf("Angar.Run(): при пуске базы, err=\n\t%w", err) } if err := sf.missions.Run(); err != nil { return fmt.Errorf("Angar.Run(): при пуске наград, err=\n\t%w", err) } go sf.fuel.Run() } go func() { sf.SetCountDown(1) count := 0 for { select { case <-sf.bot.Кнт().Done(): // Отмена контекста sf.ВремяОпрос().Стоп() return case <-sf.ВремяОпрос().КаналСиг(): // Метка времени sf.updateResurs() sf.stat.Update() switch count { case 0: sf.checkConvoy() count = 6 default: count-- } if err := sf.Section.SetCountDown(60); err != nil { sf.Закончить() logrus.WithError(err).Errorln("Angar.Run(): in update ICountTime") return } } } }() return nil } // Обновляет ресурсы ангара func (sf *Angar) updateResurs() { if err := sf.net.UpdateLst(); err != nil { // log._rintf("ERRO Angar.updateResurs(): при обработке ангара в сети, err=\n\t%v\n", err) return } sf.findGold() sf.findSilver() } // IMissions -- возвращает ссылку на объект миссий func (sf *Angar) Миссии() types.ИМиссии { return sf.missions } // Сражение -- возвращает объект сражения func (sf *Angar) Сражение() types.ИСражениеСцена { return sf.battle } // Конвой -- возвращает объект конвоя func (sf *Angar) Конвой() types.Конвой { return sf.convoy } // Золото -- возвращает объект золота func (sf *Angar) Золото() types.ИСтатПарам { return sf.золото } // Топливо -- возвращает объект топлива func (sf *Angar) Топливо() types.ИСтатПарам { return sf.fuel.Fuel() } // Уровень -- возвращает объект уровня игрока func (sf *Angar) Уровень() types.ИСтатПарам { return sf.уровень } // Прогресс -- возвращает прогрес уровня игрока func (sf *Angar) Прогресс() types.ИСтатПарам { return sf.progress } // ИгрокиОнлайн -- возвращает количество игроков онлайн func (sf *Angar) ИгрокиОнлайн() types.ИСтатПарам { return sf.игроковОнлайн } // СереброВсего -- возвращает объект всего серебра в ангаре func (sf *Angar) СереброВсего() types.ИСтатПарам { return sf.сереброВсего } // СереброЗаработаноСессия -- возвращает объект серебра за сессию в ангаре func (sf *Angar) СереброЗаработаноСессия() types.ИСтатПарам { return sf.silverOnline } // СереброОбновить -- на основе фактического серебра -- обновляет вырабатанное серебро func (sf *Angar) СереброОбновить(silverFact int) { if sf.сереброВсего.Получ() == 0 { // Если запуск sf.сереброВсего.Уст(silverFact) return } if sf.сереброВсего.Получ() > silverFact { // Если потрачего серебро sf.сереброВсего.Уст(silverFact) return } if sf.сереброВсего.Получ() < silverFact { // Если заработано so := sf.silverOnline.Получ() sd := silverFact - sf.сереброВсего.Получ() sf.silverOnline.Уст(so + sd) } sf.сереброВсего.Уст(silverFact) } // База -- возвращает базу func (sf *Angar) База() types.ИБаза { sf.block.Lock() defer sf.block.Unlock() return sf.base } // Проверяет на исполнение конвоя func (sf *Angar) checkConvoy() { var ( strOut string isFind bool lstAngar = sf.СписПолучить() ) for _, strOut = range lstAngar { if strings.Contains(strOut, `>Конвой`) { isFind = true break } } if !isFind { return } if !strings.Contains(strOut, `Конвой`) { return } sf.convoy.UpdateLst() } // Ищет в теле текста ангара серебро func (sf *Angar) findSilver() { // _mt.Println("\tAngarNet.findSilver()") lstAngar := sf.СписПолучить() var strOut string for _, strSilver := range lstAngar { if strings.Contains(strSilver, `Серебро `) strSilver := lstSilver[1] iSilver, err := strconv.Atoi(strSilver) if err != nil { // log._rintf("ERRO AngarNet.findSilver(): silver(%v) not number, err=\n\t%v\n", strSilver, err) return } sf.сереброВсего.Уст(iSilver) } // Ищет в теле текста ангара золото func (sf *Angar) findGold() { var ( lstAngar = sf.bot.Ангар().СписПолучить() strOut string isFind bool ) for _, strGold := range lstAngar { if strings.Contains(strGold, `Золото `) strGold := lstGold[1] iGold, err := strconv.Atoi(strGold) if err != nil { // log._rintf("ERRO AngarNet.findGold(): gold(%v) not number, err=\n\t%v\n", strGold, err) return } sf.bot.Ангар().Золото().Уст(iGold) }