package angar import ( "fmt" "sync" // "log" "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" ) /* Объект ангара приложения */ // Angar -- ангар для танка type Angar struct { *section.Section net *angarnet.AngarNet netKill *angar_attack.AngarAttack server types.IServer bot types.IServBot convoy *convoy.Convoy battle *battle.Battle batMas *batmas.BatMas base *base.Base award *missions.Missions gold types.IStatParam level types.IStatParam progress types.IStatParam fuel *fuel.Fuel online types.IStatParam silverAll types.IStatParam silverOnline types.IStatParam stat *netstat.NetStat block sync.Mutex } // NewAngar -- возвращает новый *Angar func NewAngar(server types.IServer, bot types.IServBot) (*Angar, error) { { // Предусловия if server == nil { return nil, fmt.Errorf("NewAngar(): IServer == nil") } if bot == nil { return nil, fmt.Errorf("NewAngar(): IServBot == nil") } } sf := &Angar{ server: server, bot: bot, gold: static_param.NewStaticParam("gold"), level: static_param.NewStaticParam("level"), progress: static_param.NewStaticParam("progress"), online: static_param.NewStaticParam("online"), silverAll: static_param.NewStaticParam("silver_all"), silverOnline: static_param.NewStaticParam("silver_online"), } return sf, nil } // Одноразовый вызов для создания компонентов при запуске в работу func (sf *Angar) Make() error { sf.block.Lock() defer sf.block.Unlock() var err error { // Section sf.Section, err = section.NewSection(sf.server, `Ангар`) if err != nil { return fmt.Errorf("Angar.make(): in create *Section, err=\n\t%w", err) } } { // Сеть sf.net, err = angarnet.NewAngarNet(sf.server, sf.bot) if err != nil { return fmt.Errorf("Angar.make(): in create , err=\n\t%w", err) } } { // Сеть атаки sf.netKill, err = angar_attack.NewAngarAttack(sf.server, sf.bot) if err != nil { return fmt.Errorf("Angar.make(): in create , err=\n\t%w", err) } } { // Статистика sf.stat, err = netstat.NewNetStat(sf.server, sf.bot) if err != nil { return fmt.Errorf("Angar.make(): in create NetResource, err=\n\t%w", err) } } { // Convoy sf.convoy, err = convoy.NewConvoy(sf.server, sf.bot) if err != nil { return fmt.Errorf("Angar.make(): in create IConvoy, err=\n\t%w", err) } } { // Сражение sf.battle, err = battle.NewBattle(sf.server, sf.bot) if err != nil { return fmt.Errorf("Angar.make(): in create IBattle, err=\n\t%w", err) } } { // Битва мастеров sf.batMas, err = batmas.NewBatMas(sf.server, sf.bot) if err != nil { return fmt.Errorf("Angar.make(): in create *BatMas, err=\n\t%w", err) } // go sf.batMas.Run() } { // База sf.base, err = base.NewBase(sf.server, sf.bot) if err != nil { return fmt.Errorf("Angar.make(): in make IBase, err=\n\t%w", err) } } { // Миссии sf.award, err = missions.NewMissions(sf.server, sf.bot) if err != nil { return fmt.Errorf("Angar.make(): in make *Missions, err=\n\t%w", err) } } { // Топливо sf.fuel, err = fuel.NewFuel(sf.server, sf.bot) if err != nil { return fmt.Errorf("Angar.make(): in make *Missions, err=\n\t%w", err) } } return nil } // запускает обработку ангара func (sf *Angar) Run() error { { // Запуск компонентов if err := sf.net.Run(); err != nil { return fmt.Errorf("Angar.Run(): при пуске сетевой секции ангара, err=\n\t%w", err) } 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.award.Run(); err != nil { return fmt.Errorf("Angar.Run(): при пуске наград, err=\n\t%w", err) } go sf.fuel.Run() } go func() { sf.CountDown().Set(1) count := 0 for { select { case <-sf.server.Done(): // Отмена контекста sf.CountDown().Stop() return case <-sf.CountDown().ChanSig(): // Метка времени sf.updateResurs() sf.stat.Update() switch count { case 0: sf.checkConvoy() count = 6 default: count-- } sf.CountDown().Set(60) } } }() 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) Missions() types.IMissions { return sf.award } // Battle -- возвращает объект сражения func (sf *Angar) Battle() types.IBattle { return sf.battle } // Convoy -- возвращает объект конвоя func (sf *Angar) Convoy() types.IConvoy { return sf.convoy } // Gold -- возвращает объект золота func (sf *Angar) Gold() types.IStatParam { return sf.gold } // Fuel -- возвращает объект топлива func (sf *Angar) Fuel() types.IStatParam { return sf.fuel.Fuel() } // Level -- возвращает объект уровня игрока func (sf *Angar) Level() types.IStatParam { return sf.level } // Progress -- возвращает прогрес уровня игрока func (sf *Angar) Progress() types.IStatParam { return sf.progress } // Online -- возвращает количество игроков онлайн func (sf *Angar) Online() types.IStatParam { return sf.online } // SilverAll -- возвращает объект всего серебра в ангаре func (sf *Angar) SilverAll() types.IStatParam { return sf.silverAll } // SilverOnline -- возвращает объект серебра за сессию в ангаре func (sf *Angar) SilverOnline() types.IStatParam { return sf.silverOnline } // SilverUpdate -- на основе фактического серебра -- обновляет вырабатанное серебро func (sf *Angar) SilverUpdate(silverFact int) { if sf.silverAll.Get() == 0 { // Если запуск sf.silverAll.Set(silverFact) return } if sf.silverAll.Get() > silverFact { // Если потрачего серебро sf.silverAll.Set(silverFact) return } if sf.silverAll.Get() < silverFact { // Если заработано so := sf.silverOnline.Get() sd := silverFact - sf.silverAll.Get() sf.silverOnline.Set(so + sd) } sf.silverAll.Set(silverFact) } // Base -- возвращает базу func (sf *Angar) Base() types.IBase { sf.block.Lock() defer sf.block.Unlock() return sf.base } // Проверяет на исполнение конвоя func (sf *Angar) checkConvoy() { var ( strOut string isFind bool lstAngar = sf.GetLst() ) 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.GetLst() 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.silverAll.Set(iSilver) } // Ищет в теле текста ангара золото func (sf *Angar) findGold() { var ( lstAngar = sf.bot.Angar().GetLst() 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.Angar().Gold().Set(iGold) }