Prechádzať zdrojové kódy

SVI Переделка на новую архитектуру

SVI 1 rok pred
rodič
commit
20ee0908c2

+ 206 - 0
app/lev0/bfunc/bf_ammo_make/bf_ammo_make.go

@@ -0,0 +1,206 @@
+// package bf_ammo_make -- бизнес-функция производства снарядов
+package bf_ammo_make
+
+import (
+	"strings"
+	"time"
+
+	. "gitp78su.ipnodns.ru/svi/kern/kc/helpers"
+	. "gitp78su.ipnodns.ru/svi/kern/krn/ktypes"
+
+	. "wartank/app/lev0/types"
+)
+
+const (
+	стрКумулятивы = "кумулятивы"
+	стрБронебойки = "бронебойки"
+	стрФугасы     = "фугасы"
+	стрРемки      = "ремки"
+)
+
+// СнарядыСделать -- делает снаряды в арсенале
+func СнарядыСделать(конт ILocalCtx) {
+	арсенал:=конт.Get("арсенал")
+	if арсенал==nil{ // Арсенала может и не быть
+		return
+	}
+	приоритет(конт)
+}
+
+// ищет приоритет производства
+func приоритет(конт ILocalCtx){
+	арсенал:=конт.Get("арсенал").Val().(ИАренаАрсенал)
+	var (
+		ремкаКол  = арсенал.Ремки().Получ()
+		фугасКол  = арсенал.Фугасы().Получ()
+		кумульКол = арсенал.Кумулятивы().Получ()
+		ббКол     = арсенал.Бронебойки().Получ()
+		снарядТип string
+	)
+	if ремкаКол < 70 { // Контроль ремки по времени суток и минимальному количеству ремок
+		сделатьРемку(конт)
+		арсенал.ПродуктСейчас().ИмяУст(стрРемки)
+		return
+	}
+	{ // Контроль по числу снарядов. В равных долях без приоритетов
+		// снарядТип = стрФугасы
+		снарядТип = стрБронебойки
+		if ббКол > фугасКол {
+			снарядТип = стрФугасы
+		}
+
+		if фугасКол > кумульКол {
+			снарядТип = стрКумулятивы
+		}
+
+		switch снарядТип {
+		case стрФугасы: // Мало фугасов
+			сделатьФугасы(конт)
+		case стрКумулятивы: // Мало кумулятивов
+			сделатьКумули(конт)
+		case стрБронебойки: // Мало бронебойных
+			сделатьБронебойки(конт)
+		default:
+			// log._rintf("ERRO Арсенал.сделать(): неизвестный тип арсенала(%v)", typeArmor)
+		}
+		арсенал.ПродуктСейчас().ИмяУст(снарядТип)
+	}
+}
+
+// Создать бронебойные
+func сделатьБронебойки(конт ILocalCtx)  {
+	арсенал:=конт.Get("арсенал").Val().(ИАренаАрсенал)
+	var (
+		стрВых      string
+		lstArsenal  = арсенал.СписПолучить()
+		еслиНайдено bool
+		инд         int
+	)
+	for инд, стрВых = range lstArsenal {
+		if strings.Contains(стрВых, `<span class="green2">Бронебойный снаряд</span><br/>`) {
+			еслиНайдено = true
+			break
+		}
+	}
+	if !еслиНайдено {
+		return
+	}
+	стрВых = lstArsenal[инд+10]
+	// Получить ссылку на бронебойные
+	lstArmor := strings.Split(стрВых, `<a class="simple-but border" href="`)
+	if len(lstArmor) <= 1 { // Тут возможно есть пустая строка
+		return // Считаем, что производство уже запущено
+	}
+	strLink := lstArmor[1]
+	lstArmor = strings.Split(strLink, `"><span><span>Начать производство</span></span></a>`)
+	strLink = "https://wartank.ru/production/" + lstArmor[0]
+	time.Sleep(time.Millisecond * 50)
+	if _, err := арсенал.Сеть().Get(strLink); err != nil {
+		// log._rintf("ERRO ArsenalNet.makeArmor(): in update lstArsenal,  err=\n\t%v\n", err)
+		return
+	}
+	арсенал.ПродуктСейчас().ИмяУст(стрБронебойки)
+}
+
+// Создать кумулятивные
+func сделатьКумули(конт ILocalCtx)  {
+	арсенал:=конт.Get("арсенал").Val().(ИАренаАрсенал)
+	var (
+		стрВых      string
+		lstArsenal  = арсенал.СписПолучить()
+		еслиНайдено bool
+		инд         int
+	)
+	for инд, стрВых = range lstArsenal {
+		if strings.Contains(стрВых, `<span class="green2">Кумулятивный снаряд</span><br/>`) {
+			еслиНайдено = true
+			break
+		}
+	}
+	if !еслиНайдено {
+		return
+	}
+	стрВых = lstArsenal[инд+10]
+	if !strings.Contains(стрВых, `>Начать производство<`) {
+		return
+	}
+	// Получить ссылку на кумулятив
+	списКумул := strings.Split(стрВых, `<a class="simple-but border" href="`)
+	strLink := списКумул[1]
+	списКумул = strings.Split(strLink, `"><span><span>Начать производство</span></span></a>`)
+	strLink = "https://wartank.ru/production/" + списКумул[0]
+	time.Sleep(time.Millisecond * 50)
+	if _, err := арсенал.Сеть().Get(strLink); err != nil {
+		// log._rintf("ERRO ArsenalNet.makeКумуль(): in make product arsenal кумуль , err=\n\t%v\n", err)
+		return
+	}
+	арсенал.ПродуктСейчас().ИмяУст(стрКумулятивы)
+}
+
+// Создать фугасы
+func сделатьФугасы(конт ILocalCtx)  {
+	арсенал:=конт.Get("арсенал").Val().(ИАренаАрсенал)
+	var (
+		lstArsenal  = арсенал.СписПолучить()
+		стрВых      string
+		еслиНайдено bool
+		инд         int
+	)
+
+	for инд, стрВых = range lstArsenal {
+		if strings.Contains(стрВых, `<span class="green2">Фугасный снаряд</span><br/>`) {
+			еслиНайдено = true
+			break
+		}
+	}
+	if !еслиНайдено {
+		return
+	}
+	стрВых = lstArsenal[инд+10]
+	if !strings.Contains(стрВых, `"><span><span>Начать производство</span></span></a>`) {
+		return
+	}
+	// Получить ссылку на ремку
+	списКумул := strings.Split(стрВых, `<a class="simple-but border" href="`)
+	strLink := списКумул[1]
+	списКумул = strings.Split(strLink, `"><span><span>Начать производство</span></span></a>`)
+	strLink = "https://wartank.ru/production/" + списКумул[0]
+	time.Sleep(time.Millisecond * 50)
+	if _, err := арсенал.Сеть().Get(strLink); err != nil {
+		// log._rintf("ERRO ArsenalNet.makeФугас(): in make request arsenal product, err=\n\t%v\n", err)
+		return
+	}
+	арсенал.ПродуктСейчас().ИмяУст(стрФугасы)
+}
+
+// Создать ремку. Выполняется если подходят условия
+func сделатьРемку(конт ILocalCtx)  {
+	арсенал:=конт.Get("арсенал").Val().(ИАренаАрсенал)
+	var (
+		стрВых      string
+		еслиНайдено bool
+		инд         int
+	)
+	lstArsenal := арсенал.Сеть().ВебВоркер().Получ("https://wartank.ru/production/Armory")
+	// <span class="green2">Ремкомплект</span><br/>
+	for инд, стрВых = range lstArsenal {
+		if strings.Contains(стрВых, `<span class="green2">Ремкомплект</span><br/>`) {
+			еслиНайдено = true
+			break
+		}
+	}
+	Hassert(еслиНайдено, "сделатьРемку():Не найдена контрольная строка ремок")
+	стрВых = lstArsenal[инд+10]
+	// Если кривая строка, то надо вернуться
+	if strings.Contains(стрВых, `</div></div></div></div></div></div></div></div>`) {
+		return
+	}
+	// Получить ссылку на ремку
+	_ссылка := strings.TrimPrefix(стрВых, `<a class="simple-but border" href="`)
+	_ссылка = strings.TrimSuffix(_ссылка, `"><span><span>Начать производство</span></span></a>`)
+	// https://wartank.ru/production/Armory?37-1.ILinkListener-productions-3-production-startProduceLink
+	ссылка := "https://wartank.ru/production/" + _ссылка
+	time.Sleep(time.Millisecond * 50)
+	_ = арсенал.Сеть().ВебВоркер().Получ(ссылка)
+	арсенал.ПродуктСейчас().ИмяУст(стрРемки)
+}

+ 1 - 1
app/lev0/bfunc/bf_ammo_stat/bf_ammo_stat.go

@@ -1,4 +1,4 @@
-// package bf_ammo_stat -- бизнес-процесс статистики снарядов
+// package bf_ammo_stat -- бизнес-функция статистики снарядов
 package bf_ammo_stat
 
 import (

+ 1 - 1
app/lev0/bfunc/bf_fuel_attack/bf_fuel_attack.go

@@ -1,4 +1,4 @@
-// package bf_fuel_attack -- бизнес-процесс боя на топливе
+// package bf_fuel_attack -- бизнес-функция боя на топливе
 package bf_fuel_attack
 
 import (

+ 1 - 1
app/lev0/bfunc/bf_fuel_find/bf_fuel_find.go

@@ -1,4 +1,4 @@
-// package bf_fuel_find -- процесс поиска топлива в баке
+// package bf_fuel_find -- бизнес-функция поиска топлива в баке
 package bf_fuel_find
 
 import (

+ 1 - 1
app/lev0/bfunc/bf_gold_find/bf_gold_find.go

@@ -1,4 +1,4 @@
-// package bf_gold_find -- бизнес-процесс поиска золота
+// package bf_gold_find -- бизнес-функция поиска золота
 package bf_gold_find
 
 import (

+ 1 - 1
app/lev0/bfunc/bf_mission_simple/bf_missin_simple.go

@@ -1,4 +1,4 @@
-// package bf_mission_simple -- простые миссии
+// package bf_mission_simple -- бизнес-функция забрать простые миссии
 package bf_mission_simple
 
 import (

+ 1 - 1
app/lev0/bfunc/bf_polygon_activate/bf_polygon_activate.go

@@ -1,4 +1,4 @@
-// package bf_polygon_activate -- бизнес-процесс активации усиления полигона
+// package bf_polygon_activate -- бизнес-функция активации усиления полигона
 package bf_polygon_activate
 
 import (

+ 1 - 1
app/lev0/bfunc/bf_silver_find/bf_silver_find.go

@@ -1,4 +1,4 @@
-// package bf_silver_find -- ищет серебро бота
+// package bf_silver_find -- бизнес-функция поиск серебро бота
 package bf_silver_find
 
 import (

+ 1 - 1
app/lev0/bfunc/bf_silver_get/bf_silver_get.go

@@ -1,4 +1,4 @@
-// package bf_silver_get -- процесс забора серебра
+// package bf_silver_get -- бизнес-функция забора серебра
 package bf_silver_get
 
 import (

+ 1 - 1
app/lev0/bfunc/bf_silver_prod/bf_silver_prod.go

@@ -1,4 +1,4 @@
-// package bf_silver_prod -- бизнес-процесс производить серебро
+// package bf_silver_prod -- бизнес-функция производить серебро
 package bf_silver_prod
 
 import (

+ 1 - 1
app/lev0/bfunc/bf_tank_stat/bf_tank_stat.go

@@ -1,4 +1,4 @@
-// package bf_tank_stat -- бизнес-процесс поиска статы танка
+// package bf_tank_stat -- бизнес-функция поиска статы танка
 package bf_tank_stat
 
 import (

+ 1 - 1
app/lev0/cons/cons.go

@@ -29,7 +29,7 @@ const ( // Режимы работы
 // 	WinDefault alias.ОкноИмя = "winDefault"
 
 // 	WinConfig                 alias.ОкноИмя = "winConfig"                 // Режим конфигурирования
-// 	WinConfigServer           alias.ОкноИмя = "winConfigServer"           // Режим конфигуррования сервера
+// 	WinConfigServer           alias.ОкноИмя = "winConfigServer"           // Режим конфигурирования сервера
 // 	WinConfigServerHostInput  alias.ОкноИмя = "winConfigServerHostInput"  // Режим ввода хоста сервера
 // 	WinConfigServerLoginInput alias.ОкноИмя = "winConfigServerLoginInput" // Режим ввода логина на сервер
 // 	WinConfigServerPassInput  alias.ОкноИмя = "winConfigServerPassInput"  // Режим ввода пароля входа на сервер

+ 2 - 4
app/lev0/types/ibase_build.go

@@ -4,10 +4,8 @@ package types
 type ИБазаСтроение interface {
 	// Уровень -- возвращает уровень шахты
 	Уровень() ИСтатПарам
-	// ПродуктКолСейчас -- количество производимого продукта
-	ПродуктКолСейчас() int
-	// ПродуктИмяСейчас -- количество производимого продукта сейчас
-	ПродуктИмяСейчас() string
+	// ПродуктСейчас -- производимый продукта сейчас
+	ПродуктСейчас() ИСтатПарам
 	// ПродуктВремяСейчас -- сколько времени до окончания продукта ждать
 	ПродуктВремяСейчас() string
 }

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

@@ -14,4 +14,6 @@ type ИСтатПарам interface {
 	Уст(val int)
 	// Имя -- возвращает имя параметра
 	Имя() string
+	// ИмяУст -- устанавливает имя параметра
+	ИмяУст(string)
 }

+ 7 - 0
app/lev1/stat_param/stat_param.go

@@ -58,3 +58,10 @@ func (сам *статПарам) Имя() string {
 	defer сам.RUnlock()
 	return сам.имя
 }
+
+// ИмяУст -- устанавливает значение имени
+func (сам *статПарам) ИмяУст(val string) {
+	сам.Lock()
+	defer сам.Unlock()
+	сам.имя = val
+}

+ 5 - 200
app/lev2/arena/arena_arsenal/arena_arsenal.go

@@ -34,8 +34,7 @@ type АренаАрсенал struct {
 	бронебойка   ИСтатПарам
 	кумулятив    ИСтатПарам
 	ремка        ИСтатПарам
-	продуктИмя   string     // Что сейчас делается
-	продуктКол   ИСтатПарам // Сколько делается прямо сейчас
+	продукт      ИСтатПарам // Что делается прямо сейчас
 	продуктВремя string     // Сколько осталось времени прямо сейчас
 	конт         ILocalCtx
 }
@@ -52,7 +51,7 @@ func НовАрсенал(конт ILocalCtx) ИАренаАрсенал {
 		бронебойка: lev1.НовСтатПарам(стрБронебойки),
 		кумулятив:  lev1.НовСтатПарам(стрКумулятивы),
 		ремка:      lev1.НовСтатПарам(стрРемки),
-		продуктКол: lev1.НовСтатПарам("свинец"),
+		продукт: lev1.НовСтатПарам("свинец"),
 		конт:       конт,
 
 		лог: лог,
@@ -72,14 +71,9 @@ func НовАрсенал(конт ILocalCtx) ИАренаАрсенал {
 	return сам
 }
 
-// ПродуктКолСейчас -- возвращает количество производимого продукта
-func (сам *АренаАрсенал) ПродуктКолСейчас() int {
-	return сам.продуктКол.Получ()
-}
-
-// ПродуктИмяСейчас -- возвращает имя производимого продукта
-func (сам *АренаАрсенал) ПродуктИмяСейчас() string {
-	return сам.продуктИмя
+// ПродуктКолСейчас -- возвращает производимый продукт
+func (сам *АренаАрсенал) ПродуктСейчас() ИСтатПарам {
+	return сам.продукт
 }
 
 // ПродуктВремяСейчас -- сколько осталось времени до производства продукта
@@ -125,7 +119,6 @@ func (сам *АренаАрсенал) пуск() {
 		}
 		_ = сам.уровеньОбновить()
 		сам.забрать()
-		сам.сделать()
 		сам.лог.Info("пуск(): бот=%q, цикл завершён\n", сам.бот.Имя())
 	}
 	for {
@@ -374,191 +367,3 @@ func (сам *АренаАрсенал) Кумулятивы() ИСтатПар
 func (сам *АренаАрсенал) Ремки() ИСтатПарам {
 	return сам.ремка
 }
-
-// Выбирает что надо делать, запускает процесс изготовления
-func (сам *АренаАрсенал) сделать() bool {
-	сам.Обновить()
-	// _mt.Println("\tArsenalNet.сделать()")
-	var (
-		ремкаКол  = сам.Ремки().Получ()
-		фугасКол  = сам.Фугасы().Получ()
-		кумульКол = сам.Кумулятивы().Получ()
-		ббКол     = сам.Бронебойки().Получ()
-		снарядТип string
-	)
-	if ремкаКол < 70 { // Контроль ремки по времени суток и минимальному количеству ремок
-		for !сам.сделатьРемку() {
-		}
-		сам.продуктИмя = стрРемки
-		return true
-	}
-	{ // Контроль по числу снарядов. В равных долях без приоритетов
-		// снарядТип = стрФугасы
-		снарядТип = стрБронебойки
-		if ббКол > фугасКол {
-			снарядТип = стрФугасы
-		}
-
-		if фугасКол > кумульКол {
-			снарядТип = стрКумулятивы
-		}
-
-		switch снарядТип {
-		case стрФугасы: // Мало фугасов
-			for !сам.сделатьФугасы() {
-			}
-		case стрКумулятивы: // Мало кумулятивов
-			for !сам.сделатьКумули() {
-			}
-		case стрБронебойки: // Мало бронебойных
-			for !сам.сделатьБронебойки() {
-			}
-		default:
-			// log._rintf("ERRO Арсенал.сделать(): неизвестный тип арсенала(%v)", typeArmor)
-		}
-		сам.продуктИмя = снарядТип
-	}
-	return true
-}
-
-// Создать бронебойные
-func (сам *АренаАрсенал) сделатьБронебойки() bool {
-	var (
-		стрВых      string
-		lstArsenal  = сам.СписПолучить()
-		еслиНайдено bool
-		инд         int
-	)
-	for инд, стрВых = range lstArsenal {
-		if strings.Contains(стрВых, `<span class="green2">Бронебойный снаряд</span><br/>`) {
-			еслиНайдено = true
-			break
-		}
-	}
-	if !еслиНайдено {
-		return false
-	}
-	стрВых = lstArsenal[инд+10]
-	// Получить ссылку на бронебойные
-	lstArmor := strings.Split(стрВых, `<a class="simple-but border" href="`)
-	if len(lstArmor) <= 1 { // Тут возможно есть пустая строка
-		return true // Считаем, что производство уже запущено
-	}
-	strLink := lstArmor[1]
-	lstArmor = strings.Split(strLink, `"><span><span>Начать производство</span></span></a>`)
-	strLink = "https://wartank.ru/production/" + lstArmor[0]
-	time.Sleep(time.Millisecond * 50)
-	if _, err := сам.Сеть().Get(strLink); err != nil {
-		// log._rintf("ERRO ArsenalNet.makeArmor(): in update lstArsenal,  err=\n\t%v\n", err)
-		return false
-	}
-	сам.АренаСостояние().СостояниеУст(стрБронебойки)
-	return true
-}
-
-// Создать кумулятивные
-func (сам *АренаАрсенал) сделатьКумули() bool {
-	var (
-		стрВых      string
-		lstArsenal  = сам.СписПолучить()
-		еслиНайдено bool
-		инд         int
-	)
-	for инд, стрВых = range lstArsenal {
-		if strings.Contains(стрВых, `<span class="green2">Кумулятивный снаряд</span><br/>`) {
-			еслиНайдено = true
-			break
-		}
-	}
-	if !еслиНайдено {
-		return false
-	}
-	стрВых = lstArsenal[инд+10]
-	if !strings.Contains(стрВых, `>Начать производство<`) {
-		return false
-	}
-	// Получить ссылку на кумулятив
-	списКумул := strings.Split(стрВых, `<a class="simple-but border" href="`)
-	strLink := списКумул[1]
-	списКумул = strings.Split(strLink, `"><span><span>Начать производство</span></span></a>`)
-	strLink = "https://wartank.ru/production/" + списКумул[0]
-	time.Sleep(time.Millisecond * 50)
-	if _, err := сам.Сеть().Get(strLink); err != nil {
-		// log._rintf("ERRO ArsenalNet.makeКумуль(): in make product arsenal кумуль , err=\n\t%v\n", err)
-		return false
-	}
-	сам.АренаСостояние().СостояниеУст(стрКумулятивы)
-	return true
-}
-
-// Создать фугасы
-func (сам *АренаАрсенал) сделатьФугасы() bool {
-	var (
-		lstArsenal  = сам.СписПолучить()
-		стрВых      string
-		еслиНайдено bool
-		инд         int
-	)
-
-	for инд, стрВых = range lstArsenal {
-		if strings.Contains(стрВых, `<span class="green2">Фугасный снаряд</span><br/>`) {
-			еслиНайдено = true
-			break
-		}
-	}
-	if !еслиНайдено {
-		return false
-	}
-	стрВых = lstArsenal[инд+10]
-	if !strings.Contains(стрВых, `"><span><span>Начать производство</span></span></a>`) {
-		return false
-	}
-	// Получить ссылку на ремку
-	списКумул := strings.Split(стрВых, `<a class="simple-but border" href="`)
-	strLink := списКумул[1]
-	списКумул = strings.Split(strLink, `"><span><span>Начать производство</span></span></a>`)
-	strLink = "https://wartank.ru/production/" + списКумул[0]
-	time.Sleep(time.Millisecond * 50)
-	if _, err := сам.Сеть().Get(strLink); err != nil {
-		// log._rintf("ERRO ArsenalNet.makeФугас(): in make request arsenal product, err=\n\t%v\n", err)
-		return false
-	}
-	сам.АренаСостояние().СостояниеУст(стрФугасы)
-	// log._rintf("INFO Арсенал.makeФугас()\n")
-	return true
-}
-
-// Создать ремку. Выполняется если подходят условия
-func (сам *АренаАрсенал) сделатьРемку() bool {
-	// _mt.Println("\tArsenalNet.makeРемка()")
-	var (
-		стрВых      string
-		еслиНайдено bool
-		инд         int
-	)
-	lstArsenal := сам.Сеть().ВебВоркер().Получ("https://wartank.ru/production/Armory")
-	// <span class="green2">Ремкомплект</span><br/>
-	for инд, стрВых = range lstArsenal {
-		if strings.Contains(стрВых, `<span class="green2">Ремкомплект</span><br/>`) {
-			еслиНайдено = true
-			break
-		}
-	}
-	if !еслиНайдено {
-		return false
-	}
-	стрВых = lstArsenal[инд+10]
-	// Если кривая строка, то надо вернуться
-	if strings.Contains(стрВых, `</div></div></div></div></div></div></div></div>`) {
-		return true
-	}
-	// Получить ссылку на ремку
-	_ссылка := strings.TrimPrefix(стрВых, `<a class="simple-but border" href="`)
-	_ссылка = strings.TrimSuffix(_ссылка, `"><span><span>Начать производство</span></span></a>`)
-	// https://wartank.ru/production/Armory?37-1.ILinkListener-productions-3-production-startProduceLink
-	ссылка := "https://wartank.ru/production/" + _ссылка
-	time.Sleep(time.Millisecond * 50)
-	_ = сам.Сеть().ВебВоркер().Получ(ссылка)
-	сам.АренаСостояние().СостояниеУст(стрРемки)
-	return true
-}

+ 3 - 3
app/lev2/arena/arena_fuel_storage/arena_fuel_storage.go

@@ -341,9 +341,9 @@ func (сам *АренаСкладТоплива) Топливо() ИСтатП
 	return сам.топливо
 }
 
-// ПродуктКолСейчас -- возвращает кол-во продукта прямо сейчас
-func (сам *АренаСкладТоплива) ПродуктКолСейчас() int {
-	return сам.топливо.Получ()
+// ПродуктСейчас -- возвращает продукт прямо сейчас
+func (сам *АренаСкладТоплива) ПродуктСейчас() ИСтатПарам {
+	return сам.топливо
 }
 
 // ПродуктИмяСейчас -- возвращает имя продукта прямо сейчас

+ 31 - 31
app/lev2/arena/arena_mine/arena_mine.go

@@ -26,8 +26,7 @@ type АренаШахта struct {
 	сталь        ИСтатПарам
 	свинец       ИСтатПарам
 	уровень      ИСтатПарам
-	продуктИмя   string     // Что сейчас делается
-	продуктКол   ИСтатПарам // Сколько делается прямо сейчас
+	продукт      ИСтатПарам // делается прямо сейчас
 	продуктВремя string     // Сколько осталось времени прямо сейчас
 	кнт          ILocalCtx
 }
@@ -35,15 +34,15 @@ type АренаШахта struct {
 // НовШахта -- возвращает новый *Mine
 func НовШахта(конт ILocalCtx) ИАренаШахта {
 	сам := &АренаШахта{
-		бот:        конт.Get("бот").Val().(ИБот),
-		база:       конт.Get("база").Val().(ИАренаБаза),
-		руда:       lev1.НовСтатПарам("руда"),
-		железо:     lev1.НовСтатПарам("железо"),
-		сталь:      lev1.НовСтатПарам("сталь"),
-		свинец:     lev1.НовСтатПарам("свинец"),
-		продуктКол: lev1.НовСтатПарам("кол-во"),
-		уровень:    lev1.НовСтатПарам("уровень"),
-		кнт:        конт,
+		бот:     конт.Get("бот").Val().(ИБот),
+		база:    конт.Get("база").Val().(ИАренаБаза),
+		руда:    lev1.НовСтатПарам("руда"),
+		железо:  lev1.НовСтатПарам("железо"),
+		сталь:   lev1.НовСтатПарам("сталь"),
+		свинец:  lev1.НовСтатПарам("свинец"),
+		продукт: lev1.НовСтатПарам("кол-во"),
+		уровень: lev1.НовСтатПарам("уровень"),
+		кнт:     конт,
 	}
 	аренаКонфиг := arena.АренаКонфиг{
 		Бот_:         сам.бот,
@@ -188,8 +187,8 @@ func (сам *АренаШахта) количествоПолучить() (bool
 			сам.лог.Добавить("ОШИБКА Шахта.количествоПолучить(): кол-во руды (%v) не число, err=\n\t%v\n", _число, err)
 			return false, fmt.Errorf("")
 		}
-		сам.продуктКол.Уст(iNum)
-		сам.продуктИмя = "руда"
+		сам.продукт.Уст(iNum)
+		сам.продукт.ИмяУст("руда")
 		сам.лог.Добавить("Шахта.количествоПолучить(): кол-во руды = %v\n", iNum)
 	case "железо":
 		_число := strings.TrimPrefix(strOut, `<td class="vam"><div class="nwr pr5 gray1"><img class="rico vm" src="/images/icons/iron.png?2" alt="iron"/>&nbsp;`)
@@ -199,8 +198,8 @@ func (сам *АренаШахта) количествоПолучить() (bool
 			сам.лог.Добавить("ОШИБКА Шахта.количествоПолучить(): кол-во железа (%v) не число, err=\n\t%v\n", _число, err)
 			return false, fmt.Errorf("")
 		}
-		сам.продуктКол.Уст(iNum)
-		сам.продуктИмя = "железо"
+		сам.продукт.Уст(iNum)
+		сам.продукт.ИмяУст("железо")
 		сам.лог.Добавить("Шахта.количествоПолучить(): кол-во железа = %v\n", iNum)
 	case "сталь":
 		_число := strings.TrimPrefix(strOut, `<td class="vam"><div class="nwr pr5 gray1"><img class="rico vm" src="/images/icons/steel.png?2" alt="steel"/>&nbsp;`)
@@ -210,8 +209,8 @@ func (сам *АренаШахта) количествоПолучить() (bool
 			сам.лог.Добавить("ОШИБКА Шахта.количествоПолучить(): кол-во стали (%v) не число, err=\n\t%v\n", _число, err)
 			return false, fmt.Errorf("")
 		}
-		сам.продуктКол.Уст(iNum)
-		сам.продуктИмя = "сталь"
+		сам.продукт.Уст(iNum)
+		сам.продукт.ИмяУст("сталь")
 		сам.лог.Добавить("Шахта.количествоПолучить(): кол-во стали = %v\n", iNum)
 	case "свинец":
 		_число := strings.TrimPrefix(strOut, `<td class="vam"><div class="nwr pr5 gray1"><img class="rico vm" src="/images/icons/plumbum.png?2" alt="plumbum"/>&nbsp;`)
@@ -221,8 +220,8 @@ func (сам *АренаШахта) количествоПолучить() (bool
 			сам.лог.Добавить("ОШИБКА Шахта.количествоПолучить(): кол-во свинца (%v) не число, err=\n\t%v\n", _число, err)
 			return false, fmt.Errorf("")
 		}
-		сам.продуктКол.Уст(iNum)
-		сам.продуктИмя = "свинец"
+		сам.продукт.Уст(iNum)
+		сам.продукт.ИмяУст("свинец")
 		сам.лог.Добавить("Шахта.количествоПолучить(): кол-во свинца = %v\n", iNum)
 	default:
 		сам.лог.Добавить("Шахта.количествоПолучить(): неизвестный режим (%v)\n", режим)
@@ -331,6 +330,7 @@ func (сам *АренаШахта) уровеньОбновить() bool {
 	return true
 }
 
+/*
 // Строит шахту при нулевом уровне
 func (сам *АренаШахта) построить() bool {
 	сам.лог.Добавить("Шахта.построить()\n")
@@ -374,6 +374,7 @@ func (сам *АренаШахта) построить() bool {
 	_ = сам.Сеть().ВебВоркер().Получ(ссылка)
 	return true
 }
+*/
 
 // Пытается проапгрейдить топливный склад
 func (сам *АренаШахта) проапгрейдить() bool {
@@ -511,14 +512,9 @@ func (сам *АренаШахта) Руда() ИСтатПарам {
 	return сам.руда
 }
 
-// ПродуктКолСейчас -- возвращает количество производимого продукта
-func (сам *АренаШахта) ПродуктКолСейчас() int {
-	return сам.продуктКол.Получ()
-}
-
-// ПродуктИмяСейчас -- возвращает имя производимого продукта
-func (сам *АренаШахта) ПродуктИмяСейчас() string {
-	return сам.продуктИмя
+// ПродуктКолСейчас -- возвращает производимый продукта
+func (сам *АренаШахта) ПродуктСейчас() ИСтатПарам {
+	return сам.продукт
 }
 
 // ПродуктВремяСейчас -- сколько осталось времени до производства продукта
@@ -656,7 +652,8 @@ func (сам *АренаШахта) рудаСделать() bool {
 		// log._rintf("ERRO Шахта.сделатьРуду(): кол-во(%v) не число, err=\n\t%v\n", strNum, err)
 		return false
 	}
-	сам.продуктКол.Уст(iNum)
+	сам.продукт.Уст(iNum)
+	сам.продукт.ИмяУст("руда")
 	return true
 }
 
@@ -718,7 +715,8 @@ func (сам *АренаШахта) железоСделать() bool {
 		// log._rintf("ERRO MineNet.makeFerrum(): кол-во(%v) не число, err=\n\t%v\n", strNum, err)
 		return false
 	}
-	сам.продуктКол.Уст(iNum)
+	сам.продукт.Уст(iNum)
+	сам.продукт.ИмяУст("железо")
 	return true
 }
 
@@ -777,7 +775,8 @@ func (сам *АренаШахта) стальСделать() bool {
 		// log._rintf("ERRO MineNet.makeSteel(): кол-во(%v) не число, err=\n\t%v\n", strNum, err)
 		return false
 	}
-	сам.продуктКол.Уст(iNum)
+	сам.продукт.Уст(iNum)
+	сам.продукт.ИмяУст("сталь")
 	return true
 }
 
@@ -836,6 +835,7 @@ func (сам *АренаШахта) свинецСделать() bool {
 		// log._rintf("ERRO Шахта.сделатьСвинец(): кол-во(%v) не число, err=\n\t%v\n", strNum, err)
 		return false
 	}
-	сам.продуктКол.Уст(iNum)
+	сам.продукт.Уст(iNum)
+	сам.продукт.ИмяУст("свинец")
 	return true
 }

+ 22 - 28
app/lev2/arena/arena_polygon/arena_polygon.go

@@ -12,6 +12,7 @@ import (
 	. "wartank/app/lev0/alias"
 	"wartank/app/lev0/cons"
 	. "wartank/app/lev0/types"
+	"wartank/app/lev1"
 	"wartank/app/lev2/arena"
 )
 
@@ -31,12 +32,11 @@ const (
 // АренаПолигон -- объект полигона на базе
 type АренаПолигон struct {
 	ИАрена
-	бот           ИБот
-	танкСтат      ИТанкСтат
-	продуктСейчас ISafeString
-	продуктКол    ISafeInt
-	лог           ILogBuf
-	конт          ILocalCtx
+	бот      ИБот
+	танкСтат ИТанкСтат
+	продукт  ИСтатПарам
+	лог      ILogBuf
+	конт     ILocalCtx
 }
 
 // НовПолигон -- возвращает новый *Polygon
@@ -45,12 +45,11 @@ func НовПолигон(конт ILocalCtx) *АренаПолигон {
 	бот := конт.Get("бот").Val().(ИБот)
 	лог.Info("НовПолигон(): бот=%s\n", бот.Имя())
 	сам := &АренаПолигон{
-		бот:           бот,
-		танкСтат:      бот.Стата(),
-		продуктСейчас: NewSafeString(),
-		продуктКол:    NewSafeInt(),
-		лог:           лог,
-		конт:          конт,
+		бот:      бот,
+		танкСтат: бот.Стата(),
+		продукт:  lev1.НовСтатПарам("что-то"),
+		лог:      лог,
+		конт:     конт,
 	}
 	аренаКонфиг := arena.АренаКонфиг{
 		Бот_:         бот,
@@ -65,14 +64,9 @@ func НовПолигон(конт ILocalCtx) *АренаПолигон {
 	return сам
 }
 
-// ПродуктКолСейчас -- количество продукта, что именно сейчас производится на полигоне
-func (сам *АренаПолигон) ПродуктКолСейчас() int {
-	return сам.продуктКол.Get()
-}
-
-// ПродуктИмяСейчас -- что именно сейчас производится на полигоне
-func (сам *АренаПолигон) ПродуктИмяСейчас() string {
-	return сам.продуктСейчас.Get()
+// ПродуктСейчас -- продукт, что именно сейчас производится на полигоне
+func (сам *АренаПолигон) ПродуктСейчас() ИСтатПарам {
+	return сам.продукт
 }
 
 // ПродуктВремяСейчас -- сколько осталось времени до обновы полигона
@@ -117,7 +111,7 @@ func (сам *АренаПолигон) пуск() {
 		сам.усилениеПровер()
 		сам.времяОбнов()
 
-		if сам.продуктСейчас.Get() == стрАпгрейд {
+		if сам.продукт.Имя() == стрАпгрейд {
 			ош := сам.ВремяОстат().Уст("00:10:00")
 			if ош != nil {
 				log.Printf("Полигон(): при установке времени обратного отсчета, ош=\n\t%v\n", ош)
@@ -251,8 +245,8 @@ func (сам *АренаПолигон) проверитьУскорение() b
 			}
 			сам.АренаСостояние().РаботаИмяУст("")
 			сам.АренаСостояние().СостояниеУст(cons.РежимАпгрейд)
-			сам.продуктСейчас.Set(стрАпгрейд)
-			сам.продуктКол.Reset()
+			сам.продукт.Уст(-1)
+			сам.продукт.ИмяУст(стрАпгрейд)
 			return true
 		}
 	}
@@ -272,8 +266,8 @@ func (сам *АренаПолигон) проверитьУскорение() b
 			return false
 		}
 		сам.АренаСостояние().СостояниеУст(cons.РежимАпгрейд)
-		сам.продуктСейчас.Set(стрАпгрейд)
-		сам.продуктКол.Reset()
+		сам.продукт.ИмяУст(стрАпгрейд)
+		сам.продукт.Уст(-1)
 		lstLink := strings.Split(strOut, `<td style="width:50%;padding-left:1px;"><a class="simple-but border" href="`)
 		strLink := lstLink[1]
 		lstLink = strings.Split(strLink, `"><span><span>Ускорение</span></span></a>`)
@@ -290,7 +284,7 @@ func (сам *АренаПолигон) проверитьУскорение() b
 		}
 		сам.АренаСостояние().РаботаИмяУст("")
 		сам.АренаСостояние().СостояниеУст(cons.РежимАпгрейд)
-		сам.продуктКол.Reset()
+		сам.продукт.Уст(-1)
 		if err := сам.ОбратВремяУст(времОжидБесплат); err != nil {
 			log.Printf("WARN Base.checkArsenalForce(): при установке бесплатного времени ускорения апгрейда арсенала(%v)\n\terr=%v\n", времОжидБесплат, err)
 		}
@@ -400,6 +394,6 @@ func (сам *АренаПолигон) усилениеПровер() {
 		return
 	}
 	сам.танкСтат.ФорсажОбнов(форсажИмя, iForce)
-	сам.продуктСейчас.Set("усиление-" + форсажИмя)
-	сам.продуктКол.Set(iForce)
+	сам.продукт.ИмяУст("усиление-" + форсажИмя)
+	сам.продукт.Уст(iForce)
 }

+ 2 - 0
app/lev3/bot/bot.go

@@ -12,6 +12,7 @@ import (
 	. "gitp78su.ipnodns.ru/svi/kern/krn/ktypes"
 
 	. "wartank/app/lev0/alias"
+	"wartank/app/lev0/bfunc/bf_ammo_make"
 	"wartank/app/lev0/bfunc/bf_ammo_stat"
 	"wartank/app/lev0/bfunc/bf_fuel_attack"
 	"wartank/app/lev0/bfunc/bf_fuel_find"
@@ -179,6 +180,7 @@ func (сам *Бот) пуск() {
 			bf_polygon_activate.ПолигонАктивировать(сам.конт)
 			bf_tank_stat.ТанкСтатПолучить(сам.конт)
 			bf_ammo_stat.СнарядыСтат(сам.конт)
+			bf_ammo_make.СнарядыСделать(сам.конт)
 		}
 	}
 }

+ 4 - 4
app/lev3/serv_web/serv_web.go

@@ -91,15 +91,15 @@ func (сам *СервВеб) постБотСтат(кнт *fiber.Ctx) error {
 	шахта := бот.КонтБот().Get("шахта").(ИАренаШахта)
 	диктБот["шахта_уровень"] = шахта.Уровень().ЗначСтр()
 	диктБот["шахта_режим"] = string(шахта.АренаСостояние().Состояние())
-	диктБот["шахта_сделать_кол"] = fmt.Sprint(шахта.ПродуктКолСейчас())
-	диктБот["шахта_сделать_назв"] = шахта.ПродуктИмяСейчас()
+	диктБот["шахта_сделать_кол"] = шахта.ПродуктСейчас().ЗначСтр()
+	диктБот["шахта_сделать_назв"] = шахта.ПродуктСейчас().Имя()
 	диктБот["шахта_сделать_время"] = шахта.ПродуктВремяСейчас()
 
 	полигон := бот.КонтБот().Get("полигон").(ИАренаПолигон)
 	диктБот["полигон_уровень"] = полигон.Уровень().ЗначСтр()
 	диктБот["полигон_режим"] = string(полигон.АренаСостояние().Состояние())
-	диктБот["полигон_сделать_кол"] = fmt.Sprint(полигон.ПродуктКолСейчас())
-	диктБот["полигон_сделать_назв"] = полигон.ПродуктИмяСейчас()
+	диктБот["полигон_сделать_кол"] = полигон.ПродуктСейчас().ЗначСтр()
+	диктБот["полигон_сделать_назв"] = полигон.ПродуктСейчас().Имя()
 	диктБот["полигон_сделать_время"] = полигон.ПродуктВремяСейчас()
 	return кнт.JSON(диктБот)
 }

+ 6 - 9
app/lev3/serv_web/web_api/web_api.go

@@ -262,7 +262,7 @@ func (сам *ВебАпи) арсеналРаботаИмя(кнт *fiber.Ctx)
 		return кнт.SendString("[Тип: нет такого бота]")
 	}
 	арсенал := бот.КонтБот().Get("арсенал").Val().(ИАренаАрсенал)
-	имя := арсенал.ПродуктИмяСейчас()
+	имя := арсенал.ПродуктСейчас().Имя()
 	if имя == "" {
 		return кнт.SendString("[Тип: пустое имя]")
 	}
@@ -367,8 +367,7 @@ func (сам *ВебАпи) арсеналРаботаКоличество(кн
 		return кнт.SendString("[Кол: нет такого бота]")
 	}
 	арсенал := бот.КонтБот().Get("арсенал").Val().(ИАренаПолигон)
-	колич := арсенал.ПродуктКолСейчас()
-	стрКолич := fmt.Sprint(колич)
+	стрКолич := арсенал.ПродуктСейчас().ЗначСтр()
 	if стрКолич == "" {
 		return кнт.SendString("[Кол: пустое кол]")
 	}
@@ -409,7 +408,7 @@ func (сам *ВебАпи) полигонРаботаИмя(кнт *fiber.Ctx)
 		return кнт.SendString("[Тип: нет такого бота]")
 	}
 	полигон := бот.КонтБот().Get("полигон").Val().(ИАренаПолигон)
-	имя := полигон.ПродуктИмяСейчас()
+	имя := полигон.ПродуктСейчас().Имя()
 	if имя == "" {
 		return кнт.SendString("[Тип: пустое имя]")
 	}
@@ -429,8 +428,7 @@ func (сам *ВебАпи) полигонРаботаКоличество(кн
 		return кнт.SendString("[Кол: нет такого бота]")
 	}
 	полигон := бот.КонтБот().Get("полигон").Val().(ИАренаПолигон)
-	колич := полигон.ПродуктКолСейчас()
-	стрКолич := fmt.Sprint(колич)
+	стрКолич := полигон.ПродуктСейчас().ЗначСтр()
 	if стрКолич == "" {
 		return кнт.SendString("[Кол: пустое кол]")
 	}
@@ -552,7 +550,7 @@ func (сам *ВебАпи) шахтаРаботаИмя(кнт *fiber.Ctx) erro
 		return кнт.SendString("[Тип: нет такого бота]")
 	}
 	шахта := бот.КонтБот().Get("шахта").Val().(ИАренаШахта)
-	имя := шахта.ПродуктИмяСейчас()
+	имя := шахта.ПродуктСейчас().Имя()
 	if имя == "" {
 		return кнт.SendString("[Тип: пустое имя]")
 	}
@@ -572,8 +570,7 @@ func (сам *ВебАпи) шахтаРаботаКоличество(кнт *f
 		return кнт.SendString("[Кол: нет такого бота]")
 	}
 	шахта := бот.КонтБот().Get("шахта").Val().(ИАренаШахта)
-	колич := шахта.ПродуктКолСейчас()
-	стрКолич := fmt.Sprint(колич)
+	стрКолич := шахта.ПродуктСейчас().ЗначСтр()
 	if стрКолич == "" {
 		return кнт.SendString("[Кол: пустое кол]")
 	}

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

@@ -79,16 +79,16 @@ func (сам *СтраницаБотПоказать) гетБотПоказ(к
 		шахта := бот.КонтБот().Get("шахта").Val().(ИАренаШахта)
 		сам.рендер.Доб("{.шахта_уровень}", шахта.Уровень().Получ())
 		сам.рендер.Доб("{.шахта_режим}", шахта.АренаСостояние().Состояние())
-		сам.рендер.Доб("{.шахта_сделать_кол}", шахта.ПродуктКолСейчас())
-		сам.рендер.Доб("{.шахта_сделать_назв}", шахта.ПродуктИмяСейчас())
+		сам.рендер.Доб("{.шахта_сделать_кол}", шахта.ПродуктСейчас().ЗначСтр())
+		сам.рендер.Доб("{.шахта_сделать_назв}", шахта.ПродуктСейчас().Имя())
 		сам.рендер.Доб("{.шахта_сделать_время}", шахта.ПродуктВремяСейчас())
 	}
 	{ // Полигон
 		полигон := бот.КонтБот().Get("полигон").Val().(ИАренаПолигон)
 		сам.рендер.Доб("полигон_уровень", полигон.Уровень().ЗначСтр())
 		сам.рендер.Доб("полигон_режим", полигон.АренаСостояние().Состояние())
-		сам.рендер.Доб("полигон_сделать_кол", полигон.ПродуктКолСейчас())
-		сам.рендер.Доб("полигон_сделать_назв", полигон.ПродуктИмяСейчас())
+		сам.рендер.Доб("полигон_сделать_кол", полигон.ПродуктСейчас().ЗначСтр())
+		сам.рендер.Доб("полигон_сделать_назв", полигон.ПродуктСейчас().Имя())
 		сам.рендер.Доб("полигон_сделать_время", полигон.ПродуктВремяСейчас())
 	}
 	{ // Арсенал