Przeglądaj źródła

SVI Исправления со временем

SVI 11 miesięcy temu
rodzic
commit
0d5800a845
28 zmienionych plików z 245 dodań i 62 usunięć
  1. 1 5
      app/lev0/types/iarena_build.go
  2. 2 0
      app/lev0/types/ibot.go
  3. 11 7
      app/lev1/down_time/down_time.go
  4. 4 2
      app/lev2/arena/arena.go
  5. 1 0
      app/lev2/arena/arena_angar/arena_angar.go
  6. 2 1
      app/lev2/arena/arena_arsenal/arena_arsenal.go
  7. 6 0
      app/lev2/arena/arena_bank/arena_bank.go
  8. 38 1
      app/lev2/arena/arena_bank/bf_bank_prod/bf_bank_prod.go
  9. 1 0
      app/lev2/arena/arena_base/arena_base.go
  10. 1 0
      app/lev2/arena/arena_battle/arena_battle.go
  11. 6 12
      app/lev2/arena/arena_build/arena_build.go
  12. 1 0
      app/lev2/arena/arena_convoy/arena_convoy.go
  13. 1 1
      app/lev2/arena/arena_convoy/bf_glory_make/bf_glory_make.go
  14. 2 1
      app/lev2/arena/arena_death/death_wait/death_wait.go
  15. 1 0
      app/lev2/arena/arena_fuel_duel/arena_fuel_duel.go
  16. 1 0
      app/lev2/arena/arena_fuel_storage/arena_fuel_storage.go
  17. 1 0
      app/lev2/arena/arena_market/arena_market.go
  18. 1 0
      app/lev2/arena/arena_masters/arena_masters.go
  19. 1 0
      app/lev2/arena/arena_medal/arena_medal.go
  20. 1 0
      app/lev2/arena/arena_mine/arena_mine.go
  21. 2 1
      app/lev2/arena/arena_missions/arena_missions.go
  22. 1 0
      app/lev2/arena/arena_polygon/arena_polygon.go
  23. 30 14
      app/lev3/bot/bot.go
  24. 1 1
      app/lev3/serv_web/web_gui/page_bot_show/btn_mine_time/btn_mine_time.go
  25. 2 2
      app/lev3/serv_web/web_gui/page_bot_show/page_bot_show.go
  26. 82 0
      desktop/win_main/frm_bank/frm_bank.go
  27. 41 14
      desktop/win_main/frm_bot_param/frm_bot_param.go
  28. 3 0
      desktop/win_main/win_main.go

+ 1 - 5
app/lev0/types/iarena_build.go

@@ -1,8 +1,6 @@
 package types
 
 import (
-	. "gitp78su.ipnodns.ru/svi/kern/krn/ktypes"
-
 	. "wartank/app/lev0/alias"
 )
 
@@ -13,10 +11,8 @@ type ИАренаСтроение interface {
 	Уровень() ИСтатПарам
 	// ПродуктСейчас -- производимый продукта сейчас
 	ПродуктСейчас() ИСтатПарам
-	// ВремяОстат -- объект счётчика времени
+	// ВремяОстат -- сколько времени до окончания продукта ждать
 	ВремяОстат() ИВремяОстат
-	// ПродуктВремяСейчас -- сколько времени до окончания продукта ждать
-	ПродуктВремяСейчас() ISafeString
 	// ОбратВремяУст -- устанавливает новое значение обратного счётчика времени
 	ОбратВремяУст(времяСек АВремя)
 }

+ 2 - 0
app/lev0/types/ibot.go

@@ -25,4 +25,6 @@ type ИБот interface {
 	ЕслиРабота() bool
 	//  КонтБот -- возвращает контекст бота
 	КонтБот() ILocalCtx
+	// СигРабота -- требование работы от бота
+	СигРабота(арена string)
 }

+ 11 - 7
app/lev1/down_time/down_time.go

@@ -2,6 +2,7 @@
 package down_time
 
 import (
+	"strings"
 	"sync"
 	"time"
 
@@ -15,7 +16,7 @@ import (
 )
 
 const (
-	спатьИнтервал = time.Millisecond * 1000 // Малый интервал сна, в мсек
+	спатьИнтервал = time.Millisecond * 250 // Малый интервал сна, в мсек
 )
 
 // ВремОбрат -- счётчик обратного времени для игровой зоны (анга, база, битва и т.п.)
@@ -52,12 +53,14 @@ func (сам *ВремОбрат) ПолучМилСек() АМилСек {
 
 func (сам *ВремОбрат) ждать() {
 	time.Sleep(спатьИнтервал)
-	timeNow := TimeNow()
-	if сам.времПорог.Get() > int(timeNow) {
-		return
+	цОстат := сам.времПорог.Get() - int(TimeNow())
+	остат := time.Millisecond * time.Duration(цОстат)
+	стрОстат := остат.String()
+	if strings.HasPrefix(стрОстат, "-") {
+		if len(сам.канВызов) < 3 {
+			сам.канВызов <- 1
+		}
 	}
-	сам.канВызов <- 1
-	// сам.времПорог.Set(int(timeNow) + int(сам.остатПарсер.ПолучМилСек()))
 }
 
 // Запускает тикер для интервалов сна (через каждые 1000 мСек)
@@ -88,7 +91,8 @@ func (сам *ВремОбрат) String() string {
 	defer сам.блок.RUnlock()
 	цОстат := сам.времПорог.Get() - int(TimeNow())
 	остат := time.Millisecond * time.Duration(цОстат)
-	return остат.String()
+	стрОстат := остат.String()
+	return стрОстат
 }
 
 // КаналСиг -- возвращает канал чтения тиков

+ 4 - 2
app/lev2/arena/arena.go

@@ -20,8 +20,9 @@ import (
 type АренаКонфиг struct {
 	Конт_        ILocalCtx
 	АренаИмя_    alias.ААренаИмя
-	СтрКонтроль_ string // Контрольная строка для арены
-	СтрУрл_      string // Адрес арены
+	СтрКонтроль_ string        // Контрольная строка для арены
+	СтрУрл_      string        // Адрес арены
+	ВремОстат_   alias.АМилСек // Время на цикл работы
 }
 
 // Контролирует правильность параметров
@@ -29,6 +30,7 @@ func (сам *АренаКонфиг) контроль() {
 	Hassert(сам.Конт_ != nil, "АренаКонфиг.СтрКонтроль(): конт ==nil")
 	Hassert(сам.АренаИмя_ != "", "АренаКонфиг.СтрКонтроль(): СценаИмя_ == \"\"")
 	Hassert(сам.СтрУрл_ != "", "АренаКонфиг.СтрКонтроль(): СтрУрл_ == \"\"")
+	Hassert(сам.ВремОстат_ != 0, "АренаКонфиг.СтрКонтроль(): ВремОстат_ == 0")
 }
 
 // Арена -- арена игры

+ 1 - 0
app/lev2/arena/arena_angar/arena_angar.go

@@ -53,6 +53,7 @@ func НовАнгар(конт ILocalCtx) ИАренаАнгар {
 		АренаИмя_:    "Ангар",
 		СтрКонтроль_: "<title>Ангар</title>",
 		СтрУрл_:      "https://wartank.ru/angar",
+		ВремОстат_:   1,
 	}
 	конт.Set("ангар", сам, "Объект ангара бота")
 	сам.ИАрена = arena.НовАрена(конт, аренаКонф)

+ 2 - 1
app/lev2/arena/arena_arsenal/arena_arsenal.go

@@ -56,11 +56,12 @@ func НовАрсенал(конт ILocalCtx) *АренаАрсенал {
 		АренаИмя_:    "Арсенал",
 		СтрКонтроль_: `<span class="green2">Ремкомплект</span><br/>`,
 		СтрУрл_:      "https://wartank.ru/production/Armory",
+		ВремОстат_:   1,
 	}
 	сам.ИАренаСтроение = arena_build.НовАренаСтроение(конт, аренаКонфиг)
 	сам.вЛог = web_log.НовВебЛог(true)
 	// go сам.пуск()
-	сам.вЛог.Добавить("НовАрсенал(): Арсенал создан")
+	сам.вЛог.Добавить("НовАрсенал(): Арсенал создан\n")
 	конт.Set("арсенал", сам, "Арсенал бота")
 	_ = ИАренаАрсенал(сам)
 	return сам

+ 6 - 0
app/lev2/arena/arena_bank/arena_bank.go

@@ -45,6 +45,7 @@ func НовБанк(конт ILocalCtx) ИАренаБанк {
 		АренаИмя_:    "Банк",
 		СтрКонтроль_: `<span class="green2">Серебро</span><br/>`,
 		СтрУрл_:      "https://wartank.ru/production/Bank",
+		ВремОстат_:   1,
 	}
 	сам.ИАренаСтроение = arena_build.НовАренаСтроение(конт, аренаКонфиг)
 	конт.Set("банк", сам, "Арена банка бота")
@@ -58,6 +59,11 @@ func (сам *АренаБанк) Пуск() {
 	bf_bank_upgrade_fast.БанкАпгрейдБесплатно(сам.конт)
 	bf_bank_take.БанкЗабрать(сам.конт)
 	bf_bank_prod.СереброПроизводить(сам.конт)
+	select {
+	case <-сам.ВремяОстат().КаналСиг(): // Надо обновить время
+		сам.Бот().СигРабота("банк")
+	default: // Ничего не делать
+	}
 }
 
 // Проверяет необходимость постройки полигона

+ 38 - 1
app/lev2/arena/arena_bank/bf_bank_prod/bf_bank_prod.go

@@ -9,6 +9,7 @@ import (
 	. "gitp78su.ipnodns.ru/svi/kern/kc/helpers"
 	. "gitp78su.ipnodns.ru/svi/kern/krn/ktypes"
 
+	"wartank/app/lev0/alias"
 	"wartank/app/lev0/cons"
 	. "wartank/app/lev0/types"
 )
@@ -117,6 +118,42 @@ func сделатьСеребро(конт ILocalCtx) {
 		log.Printf("сделатьСеребро(): link=%v", strLink)
 		lstBank = банк.Сеть().ВебВоркер().Получ(strLink)
 		log.Printf("сделатьСеребро(): link=%v", strLink)
+		// Начать производство с полным временем
+		времОстат := банк.ВремяОстат()
+		времОстат.Уст(alias.АВремя(time1))
+		return
 	}
-	банк.ПродуктВремяСейчас().Set(time1)
+	// Производство уже идёт, надо взять текущее время
+	устТекущееВремя(конт)
+}
+
+var времОстат string
+
+// Устанавливает текущее время производства серебра
+func устТекущееВремя(конт ILocalCtx) {
+	база := конт.Get("база").Val().(ИАренаБаза)
+	списБаза := база.СписПолучить()
+	// Найти контрольную строку
+	var (
+		инд int
+		стр string
+	)
+	for инд, стр = range списБаза {
+		if strings.Contains(стр, `<span class="green2">Банк -`) {
+			break
+		}
+	}
+	if стр == "" {
+		return
+	}
+	стр = списБаза[инд+11]
+	стр = strings.TrimPrefix(стр, `<td><div class="value-block lh1"><span><span>`)
+	стр = strings.TrimSuffix(стр, `</span></span></div></td>`)
+	if стр == времОстат {
+		return
+	}
+	времОстат = стр
+	банк := конт.Get("банк").Val().(ИАренаБанк)
+	времОстат := банк.ВремяОстат()
+	времОстат.Уст(alias.АВремя(стр))
 }

+ 1 - 0
app/lev2/arena/arena_base/arena_base.go

@@ -39,6 +39,7 @@ func НовБаза(конт ILocalCtx) *АренаБаза {
 		АренаИмя_:    "База",
 		СтрКонтроль_: `<title>База</title>`,
 		СтрУрл_:      "https://wartank.ru/buildings",
+		ВремОстат_:   1,
 	}
 	сам.ИАрена = arena.НовАрена(конт, аренаКонфиг)
 	конт.Set("база", сам, "База бота")

+ 1 - 0
app/lev2/arena/arena_battle/arena_battle.go

@@ -31,6 +31,7 @@ func НовСражение(конт ILocalCtx) *АренаСражение {
 		АренаИмя_:    "Арена сражения",
 		СтрКонтроль_: "<title>Сражения</title>",
 		СтрУрл_:      "https://wartank.ru/pve",
+		ВремОстат_:   1,
 	}
 	сам.ИАренаСтроение = arena_build.НовАренаСтроение(конт, аренаКонфиг)
 

+ 6 - 12
app/lev2/arena/arena_build/arena_build.go

@@ -2,7 +2,7 @@
 package arena_build
 
 import (
-	. "gitp78su.ipnodns.ru/svi/kern"
+	// . "gitp78su.ipnodns.ru/svi/kern"
 	. "gitp78su.ipnodns.ru/svi/kern/krn/ktypes"
 
 	. "wartank/app/lev0/alias"
@@ -15,17 +15,17 @@ import (
 // АренаСтроение -- арена-строение (что-то производит, есть время производства)
 type АренаСтроение struct {
 	ИАрена
-	времяОстат    ИВремяОстат // Обратный отсчёт до окончания работы режима
-	продуктВремя  ISafeString
+	времяОстат ИВремяОстат // Обратный отсчёт до окончания работы режима
+	// продуктВремя  ISafeString
 	продуктСейчас ИСтатПарам
 }
 
 // НовАренаСтроение -- возвращает новую арену-строение
 func НовАренаСтроение(конт ILocalCtx, аренаКонфиг arena.АренаКонфиг) *АренаСтроение {
 	сам := &АренаСтроение{
-		ИАрена:        arena.НовАрена(конт, аренаКонфиг),
-		времяОстат:    down_time.НовВремОбрат(конт, 5),
-		продуктВремя:  NewSafeString(),
+		ИАрена:     arena.НовАрена(конт, аренаКонфиг),
+		времяОстат: down_time.НовВремОбрат(конт, аренаКонфиг.ВремОстат_),
+		// продуктВремя:  NewSafeString(),
 		продуктСейчас: lev1.НовСтатПарам("не задано"),
 	}
 	_ = ИАренаСтроение(сам)
@@ -46,9 +46,3 @@ func (сам *АренаСтроение) ОбратВремяУст(время
 func (сам *АренаСтроение) ВремяОстат() ИВремяОстат {
 	return сам.времяОстат
 }
-
-// ВремяОстат -- объект оставшегося времени
-func (сам *АренаСтроение) ПродуктВремяСейчас() ISafeString {
-	сам.продуктВремя.Set(сам.времяОстат.String())
-	return сам.продуктВремя
-}

+ 1 - 0
app/lev2/arena/arena_convoy/arena_convoy.go

@@ -36,6 +36,7 @@ func НовКонвой(конт ILocalCtx) *АренаКонвой {
 		АренаИмя_:    "Конвой",
 		СтрКонтроль_: `<title>Конвой</title>`,
 		СтрУрл_:      "https://wartank.ru/convoy",
+		ВремОстат_:   1,
 	}
 	сам.ИАренаСтроение = arena_build.НовАренаСтроение(конт, аренаКонфиг)
 	конт.Set("конвой", сам, "Арена конвоя бота")

+ 1 - 1
app/lev2/arena/arena_convoy/bf_glory_make/bf_glory_make.go

@@ -26,7 +26,7 @@ func атакаНачать(конт ILocalCtx, strOut string) {
 	lstConvoy := конвой.Сеть().ВебВоркер().Получ(strLink)
 	конвой.СтрОбновить(lstConvoy)
 	начатьРазведку(конт)
-	конвой.ПродуктВремяСейчас().Set("01")
+	конвой.ВремяОстат().Уст("01")
 }
 
 func атакаПроверить(конт ILocalCtx) string {

+ 2 - 1
app/lev2/arena/arena_death/death_wait/death_wait.go

@@ -5,6 +5,7 @@ import (
 	"strings"
 	"time"
 
+	"wartank/app/lev0/alias"
 	. "wartank/app/lev0/types"
 	"wartank/app/lev2/arena"
 	"wartank/app/lev2/arena/arena_build"
@@ -99,6 +100,6 @@ func (сам *СражениеОжидание) ждать() string {
 	strTime := lstTime[1]
 	lstTime = strings.Split(strTime, ` (`)
 	strTime = lstTime[0]
-	сам.ПродуктВремяСейчас().Set(strTime)
+	сам.ВремяОстат().Уст(alias.АВремя(strTime))
 	return strTime
 }

+ 1 - 0
app/lev2/arena/arena_fuel_duel/arena_fuel_duel.go

@@ -30,6 +30,7 @@ func НовАренаТопливоДуэль(конт ILocalCtx) *АренаТ
 		АренаИмя_:    "Арена топливной дуэли",
 		СтрКонтроль_: "<title>Бой</title>",
 		СтрУрл_:      "https://wartank.ru/battle",
+		ВремОстат_:   1,
 	}
 	конт.Set("арена_топливо_бой", сам, "Арена боя за топливо")
 	сам.ИАренаСтроение = arena_build.НовАренаСтроение(конт, аренаКонфиг)

+ 1 - 0
app/lev2/arena/arena_fuel_storage/arena_fuel_storage.go

@@ -34,6 +34,7 @@ func НовАренаБак(конт ILocalCtx) *АренаБак {
 		АренаИмя_:    "Склад_топлива",
 		СтрКонтроль_: `<title>Склад топлива</title>`,
 		СтрУрл_:      "https://wartank.ru/fuelStore",
+		ВремОстат_:   1,
 	}
 	сам.ИАренаСтроение = arena_build.НовАренаСтроение(конт, аренаКонфиг)
 	конт.Set("бак", сам, "Топливная база")

+ 1 - 0
app/lev2/arena/arena_market/arena_market.go

@@ -33,6 +33,7 @@ func НовРынок(конт ILocalCtx) ИАренаРынок {
 		АренаИмя_:    "Рынок",
 		СтрКонтроль_: `<title>Рынок</title>`,
 		СтрУрл_:      "https://wartank.ru/market",
+		ВремОстат_:   1,
 	}
 	конт.Set("рынок", сам, "Рынок бота")
 	сам.ИАренаСтроение = arena_build.НовАренаСтроение(конт, аренаКонфиг)

+ 1 - 0
app/lev2/arena/arena_masters/arena_masters.go

@@ -39,6 +39,7 @@ func НовБитваМастеров(конт ILocalCtx) *БитваМасте
 		АренаИмя_:    "Битва мастеров",
 		СтрКонтроль_: `/> Битва мастеров <`,
 		СтрУрл_:      "https://wartank.ru/pvp",
+		ВремОстат_:   1,
 	}
 	сам.ИАренаСтроение = arena_build.НовАренаСтроение(конт, аренаКонфиг)
 	конт.Set("pvp", сам, "Арена битвы мастеров")

+ 1 - 0
app/lev2/arena/arena_medal/arena_medal.go

@@ -27,6 +27,7 @@ func НовАренаМедали(конт ILocalCtx) *АренаМедаль {
 		АренаИмя_:    "Медали",
 		СтрКонтроль_: `<title>Медали</title>`,
 		СтрУрл_:      "https://wartank.ru/medals/current",
+		ВремОстат_:   1,
 	}
 	сам.ИАрена = arena.НовАрена(конт, аренаКонфиг)
 	конт.Set("арена_медали", сам, "Арена получения медалей")

+ 1 - 0
app/lev2/arena/arena_mine/arena_mine.go

@@ -47,6 +47,7 @@ func НовШахта(конт ILocalCtx) *АренаШахта {
 		АренаИмя_:    "Шахта",
 		СтрКонтроль_: `<span class="green2">Руда</span><br/>`,
 		СтрУрл_:      "https://wartank.ru/production/Mine",
+		ВремОстат_:   1,
 	}
 	сам.ИАренаСтроение = arena_build.НовАренаСтроение(конт, аренаКонфиг)
 	сам.лог = сам.ВебЛог()

+ 2 - 1
app/lev2/arena/arena_missions/arena_missions.go

@@ -29,7 +29,8 @@ func НовМиссии(конт ILocalCtx) *АренаМиссии {
 		Конт_:        конт,
 		АренаИмя_:    "Миссии",
 		СтрКонтроль_: "<title>Миссии</title>",
-		СтрУрл_:      "https://wartank.ru/missions/", // https://wartank.ru/missions/
+		СтрУрл_:      "https://wartank.ru/missions/",
+		ВремОстат_:   1,
 	}
 	сам.ИАрена = arena.НовАрена(конт, аренаКонфиг)
 	конт.Set("миссии_простые", сам, "Арена простых миссий")

+ 1 - 0
app/lev2/arena/arena_polygon/arena_polygon.go

@@ -54,6 +54,7 @@ func НовПолигон(конт ILocalCtx) *АренаПолигон {
 		АренаИмя_:    "Полигон",
 		СтрКонтроль_: `<title>Полигон</title>`,
 		СтрУрл_:      "https://wartank.ru/polygon",
+		ВремОстат_:   1,
 	}
 	сам.ИАренаСтроение = arena_build.НовАренаСтроение(конт, аренаКонфиг)
 	конт.Set("полигон", сам, "Полигон бота")

+ 30 - 14
app/lev3/bot/bot.go

@@ -44,6 +44,7 @@ type Бот struct {
 	лог            ILogBuf
 	конт           ILocalCtx
 	конфиг         *bot_config.БотКонфиг
+	канРабота      chan string
 }
 
 // ЗагрузитьВарБот -- загружает бота из базы
@@ -113,6 +114,7 @@ func создатьЯдроВарБот(конфиг *bot_config.БотКонф
 		еслиРаботает: NewSafeBool(),
 		конфиг:       конфиг,
 		лог:          лог,
+		канРабота:    make(chan string, 20),
 	}
 	сам.еслиАвтозапуск = NewSafeBoolReact()
 	сам.еслиАвтозапуск.Add(сам.Имя(), сам.автозапускИзм)
@@ -144,6 +146,11 @@ func создатьЯдроВарБот(конфиг *bot_config.БотКонф
 	return сам
 }
 
+// СигРабота -- сигнал-требование от бота начать работу досрочно
+func (сам *Бот) СигРабота(арена string) {
+	сам.канРабота <- арена
+}
+
 // ЕслиРабота -- возвращает признак, что бот подключен
 func (сам *Бот) ЕслиРабота() bool {
 	return сам.еслиРаботает.Get()
@@ -179,24 +186,33 @@ func (сам *Бот) пуск() {
 		select {
 		case <-сам.конт.Ctx().Done():
 			return
+		case арена := <-сам.канРабота: // Требование досрочной работы
+			switch арена {
+			case "банк":
+				сам.банк.Пуск()
+			default: // Непонятно что за арена требует
+				fmt.Printf("Бот.пуск() арена=%v, не обрабатывается", арена)
+			}
+			continue
 		default:
-			сам.ангар.Пуск()
-			сам.база.Пуск()
-			сам.шахта.Пуск()
-			сам.арсенал.Пуск()
-			сам.полигон.Пуск()
+			// сам.ангар.Пуск()
+			// сам.база.Пуск()
+			// сам.шахта.Пуск()
+			// сам.арсенал.Пуск()
+			// сам.полигон.Пуск()
 			сам.банк.Пуск()
-			сам.бак.Пуск()
-			сам.бойТопливо.Пуск()
-			сам.аренаМедаль.Пуск()
-			сам.рынок.Пуск()
-			сам.конвой.Пуск()
-			сам.миссииПростые.Пуск()
-			// сам.сражение.Пуск()
-			//сам.битваМастер.Пуск()
+			// сам.бак.Пуск()
+			// сам.бойТопливо.Пуск()
+			// сам.аренаМедаль.Пуск()
+			// сам.рынок.Пуск()
+			// сам.конвой.Пуск()
+			// сам.миссииПростые.Пуск()
+
+			//- сам.сражение.Пуск()
+			//- сам.битваМастер.Пуск()
 
 			fmt.Printf("бот цикл\n=============\n\n")
-			time.Sleep(time.Second * 5)
+			time.Sleep(time.Millisecond * 100)
 		}
 	}
 }

+ 1 - 1
app/lev3/serv_web/web_gui/page_bot_show/btn_mine_time/btn_mine_time.go

@@ -43,7 +43,7 @@ func (sf *BtnMineTime) click(dict map[string]string) string {
 		return sf.Btn.Html()
 	}
 	шахта := bot.КонтБот().Get("шахта").Val().(ИАренаШахта)
-	strOut := fmt.Sprintf("[Время: %v]", шахта.ПродуктВремяСейчас().Get())
+	strOut := fmt.Sprintf("[Время: %v]", шахта.ВремяОстат().String())
 	sf.Btn.Text().Set(strOut)
 	return sf.Btn.Html()
 }

+ 2 - 2
app/lev3/serv_web/web_gui/page_bot_show/page_bot_show.go

@@ -147,7 +147,7 @@ func (сам *СтраницаБотПоказать) гетБотПоказ(к
 		сам.рендер.Доб("полигон_режим", полигон.Состояние().Получ())
 		сам.рендер.Доб("полигон_сделать_кол", полигон.ПродуктСейчас().ЗначСтр())
 		сам.рендер.Доб("полигон_сделать_назв", полигон.ПродуктСейчас().Имя())
-		сам.рендер.Доб("полигон_сделать_время", полигон.ПродуктВремяСейчас())
+		сам.рендер.Доб("полигон_сделать_время", полигон.ВремяОстат())
 	}
 	{ // Арсенал
 		арс := бот.КонтБот().Get("арсенал").Val().(ИАренаАрсенал)
@@ -158,7 +158,7 @@ func (сам *СтраницаБотПоказать) гетБотПоказ(к
 		сам.рендер.Доб("оружейная_бронебойки", арс.Бронебойки().ЗначСтр())
 		сам.рендер.Доб("оружейная_фугасы", арс.Фугасы().ЗначСтр())
 		сам.рендер.Доб("оружейная_ремки", арс.Ремки().ЗначСтр())
-		сам.рендер.Доб("оружейная_время", арс.ПродуктВремяСейчас().Get())
+		сам.рендер.Доб("оружейная_время", арс.ВремяОстат().String())
 		сам.рендер.Доб("мощь", бот.Стата().Мощь().ЗначСтр())
 		сам.рендер.Доб("мощь", бот.Стата().Мощь().ЗначСтр())
 	}

+ 82 - 0
desktop/win_main/frm_bank/frm_bank.go

@@ -0,0 +1,82 @@
+// package frm_bank -- фрейм состояния банка
+package frm_bank
+
+import (
+	"time"
+
+	. "gitp78su.ipnodns.ru/svi/kern"
+	. "gitp78su.ipnodns.ru/svi/kern/krn/ktypes"
+	tk "modernc.org/tk9.0"
+	. "wartank/app/lev0/types"
+	// "wartank/desktop/win_add_bot"
+	// "wartank/desktop/win_main/frm_status"
+)
+
+type FrmBank struct {
+	ctx           IKernelCtx
+	лблУровень    *tk.TLabelWidget
+	лблРабота     *tk.TLabelWidget
+	лблВремяОстат *tk.TLabelWidget
+}
+
+func NewFrmBank(frmStateBot *tk.TFrameWidget) *FrmBank {
+	sf := &FrmBank{
+		ctx: GetKernelCtx(),
+	}
+	frmBank := frmStateBot.Frame(tk.Border(1), tk.Relief(tk.SUNKEN))
+	tk.Pack(frmBank, tk.Side(tk.LEFT), tk.Fill(tk.FILL_Y))
+
+	лблПараметрыБанк := frmBank.Label(tk.Txt("Банк"),
+		tk.Background("#888"),
+		tk.Border(1),
+		tk.Relief(tk.GROOVE),
+	)
+	tk.Pack(лблПараметрыБанк, tk.Side(tk.TOP), tk.Fill(tk.FILL_X))
+
+	sf.лблУровень = frmBank.TLabel(tk.Txt("Уровень"),
+		tk.Border(1),
+		tk.Relief(tk.GROOVE),
+	)
+	tk.Pack(sf.лблУровень, tk.Side(tk.TOP), tk.Fill(tk.FILL_X))
+
+	sf.лблРабота = frmBank.TLabel(tk.Txt("Работа"),
+		tk.Border(1),
+		tk.Relief(tk.GROOVE),
+	)
+	tk.Pack(sf.лблРабота, tk.Side(tk.TOP), tk.Fill(tk.FILL_X))
+
+	sf.лблВремяОстат = frmBank.TLabel(tk.Txt("Время"),
+		tk.Border(1),
+		tk.Relief(tk.GROOVE),
+	)
+	tk.Pack(sf.лблВремяОстат, tk.Side(tk.TOP), tk.Fill(tk.FILL_X))
+
+	sf.update()
+	return sf
+}
+
+func (sf *FrmBank) update() {
+	select {
+	case <-sf.ctx.Ctx().Done():
+		return
+	default:
+		farm := sf.ctx.Get("ботоФерма").Val().(ИБотоФерма)
+		lstBot := farm.ListBot()
+		if len(lstBot) > 0 {
+			bot := lstBot[0]
+			ботСеть := bot.КонтБот()
+			bank := ботСеть.Get("банк").Val().(ИАренаБанк)
+			{ // Стата танка
+				стрУровень := bank.Уровень().ЗначСтр()
+				sf.лблУровень.Configure(tk.Txt("Уровень: " + стрУровень))
+
+				стрРабота := bank.ПродуктСейчас().ЗначСтр()
+				sf.лблРабота.Configure(tk.Txt("Работа: " + стрРабота))
+
+				стрВремяОстат := bank.ВремяОстат().String()
+				sf.лблВремяОстат.Configure(tk.Txt("Работа: " + стрВремяОстат))
+			}
+		}
+	}
+	tk.TclAfter(time.Millisecond*250, sf.update)
+}

+ 41 - 14
desktop/win_main/frm_bot_param/frm_bot_param.go

@@ -2,8 +2,6 @@
 package frm_bot_param
 
 import (
-	// "time"
-
 	"time"
 
 	. "gitp78su.ipnodns.ru/svi/kern"
@@ -21,7 +19,9 @@ type FrmBotParam struct {
 	лблТочность  *tk.TLabelWidget
 	лблПрочность *tk.TLabelWidget
 	лблМощь      *tk.TLabelWidget
-	// стрАтака string
+	лблТопливо   *tk.TLabelWidget
+	лблЗолото    *tk.TLabelWidget
+	лблСеребро   *tk.TLabelWidget
 }
 
 func NewFrmBotParam(frmStateBot *tk.TFrameWidget) *FrmBotParam {
@@ -68,6 +68,23 @@ func NewFrmBotParam(frmStateBot *tk.TFrameWidget) *FrmBotParam {
 	)
 	tk.Pack(sf.лблМощь, tk.Side(tk.TOP), tk.Fill(tk.FILL_X))
 
+	sf.лблТопливо = frmBotForce.TLabel(tk.Txt("Топливо"),
+		tk.Border(1),
+		tk.Relief(tk.GROOVE),
+	)
+	tk.Pack(sf.лблТопливо, tk.Side(tk.TOP), tk.Fill(tk.FILL_X))
+
+	sf.лблЗолото = frmBotForce.TLabel(tk.Txt("Золото"),
+		tk.Border(1),
+		tk.Relief(tk.GROOVE),
+	)
+
+	sf.лблСеребро = frmBotForce.TLabel(tk.Txt("Серебро"),
+		tk.Border(1),
+		tk.Relief(tk.GROOVE),
+	)
+	tk.Pack(sf.лблСеребро, tk.Side(tk.TOP), tk.Fill(tk.FILL_X))
+
 	sf.update()
 	return sf
 }
@@ -81,18 +98,28 @@ func (sf *FrmBotParam) update() {
 		lstBot := farm.ListBot()
 		if len(lstBot) > 0 {
 			bot := lstBot[0]
-			стрАтака := bot.Стата().Атака().ЗначСтр()
-			sf.лблАтака.Configure(tk.Txt("Атака: " + стрАтака))
-			стрБроня := bot.Стата().Броня().ЗначСтр()
-			sf.лблБроня.Configure(tk.Txt("Броня: " + стрБроня))
-			стрТочность := bot.Стата().Точность().ЗначСтр()
-			sf.лблТочность.Configure(tk.Txt("Точность: " + стрТочность))
-			стрПрочность := bot.Стата().Прочность().ЗначСтр()
-			sf.лблПрочность.Configure(tk.Txt("Прочность: " + стрПрочность))
-			стрМощь := bot.Стата().Мощь().ЗначСтр()
-			sf.лблМощь.Configure(tk.Txt("Мощь: " + стрМощь))
-		}
+			ботСеть := bot.КонтБот()
+			ангар := ботСеть.Get("ангар").Val().(ИАренаАнгар)
+			{ // Стата танка
+				стрАтака := bot.Стата().Атака().ЗначСтр()
+				sf.лблАтака.Configure(tk.Txt("Атака: " + стрАтака))
+				стрБроня := bot.Стата().Броня().ЗначСтр()
+				sf.лблБроня.Configure(tk.Txt("Броня: " + стрБроня))
+				стрТочность := bot.Стата().Точность().ЗначСтр()
+				sf.лблТочность.Configure(tk.Txt("Точность: " + стрТочность))
+				стрПрочность := bot.Стата().Прочность().ЗначСтр()
+				sf.лблПрочность.Configure(tk.Txt("Прочность: " + стрПрочность))
+				стрМощь := bot.Стата().Мощь().ЗначСтр()
+				sf.лблМощь.Configure(tk.Txt("Мощь: " + стрМощь))
 
+				стрТопливо := ангар.Топливо().ЗначСтр()
+				sf.лблТопливо.Configure(tk.Txt("Топливо: " + стрТопливо))
+				стрЗолото := ангар.Золото().ЗначСтр()
+				sf.лблЗолото.Configure(tk.Txt("Золото: " + стрЗолото))
+				стрСеребро := ангар.Серебро().ЗначСтр()
+				sf.лблСеребро.Configure(tk.Txt("Серебро: " + стрСеребро))
+			}
+		}
 	}
 	tk.TclAfter(time.Millisecond*250, sf.update)
 }

+ 3 - 0
desktop/win_main/win_main.go

@@ -10,6 +10,7 @@ import (
 
 	. "wartank/app/lev0/types"
 	"wartank/desktop/win_add_bot"
+	"wartank/desktop/win_main/frm_bank"
 	"wartank/desktop/win_main/frm_bot_param"
 	"wartank/desktop/win_main/frm_status"
 )
@@ -24,6 +25,7 @@ type WinMain struct {
 	chBotAdd    chan ИБот
 	frmStatus   *frm_status.FrmStatus
 	frmBotForce *frm_bot_param.FrmBotParam
+	frmBank     *frm_bank.FrmBank
 }
 
 var (
@@ -82,6 +84,7 @@ func (sf *WinMain) new() {
 	}
 	// Панель силы бота
 	sf.frmBotForce = frm_bot_param.NewFrmBotParam(frmStateBot)
+	sf.frmBank = frm_bank.NewFrmBank(frmStateBot)
 	tk.WmProtocol(sf.winMain, tk.WM_DELETE_WINDOW, tk.Command(sf.quit))
 	sf.liveUpdate()
 }