Переглянути джерело

d02 Исправления, доработки

SVI 2 роки тому
батько
коміт
774b8bfbf6

+ 2 - 0
pkg/types/iserv_bot.go

@@ -20,6 +20,8 @@ type IServBot interface {
 	ResetAutoGame()
 	// IsAutoGame -- возвращает признак автоматического начала игры
 	IsAutoGame() bool
+	// IsRun -- признак, что бот работает
+	IsRun() bool
 	// Make -- создайт компоненты бота
 	Make() error
 }

+ 114 - 33
server/gui/win_main/win_main.go

@@ -35,6 +35,14 @@ type WinMain struct {
 	lblSpace      *widget.Label      // Разделитель к базе
 	lblRuda       *widget.Label      // Количество руды
 	lblFerrum     *widget.Label      // Количество железа
+	lblSteel      *widget.Label      // Количество стали
+	lblPlumbum    *widget.Label      // Количество свинца
+	frmStatLeft   *widget.Form       // Левая колонка статистики
+	frmStatRight  *widget.Form       // Правая колонка статистики
+	lblAtack      *widget.Label      // Сила атаки
+	lblArmor      *widget.Label      // Броня бота
+	lblFyne       *widget.Label      // Точность бота
+	lblHard       *widget.Label      // Прочность танка
 }
 
 // NewWinMain -- возвращает новое главное окно
@@ -65,22 +73,43 @@ func NewWinMain(serv types.IServer) (*WinMain, error) {
 	}
 	tabLogin := container.NewTabItem("Логин", formLogin)
 
-	sf.lblFuel = widget.NewLabel("0")
-	itemFuel := widget.NewFormItem("Топливо", sf.lblFuel)
-	sf.lblGold = widget.NewLabel("0")
-	itemGold := widget.NewFormItem("Золото", sf.lblGold)
-	sf.lblSilver = widget.NewLabel("0")
-	itemSilver := widget.NewFormItem("Серебро", sf.lblSilver)
-	sf.lblGlory = widget.NewLabel("0")
-	itemGlory := widget.NewFormItem("Слава", sf.lblGlory)
 	sf.lblSpace = widget.NewLabel("======")
-	itemSpace := widget.NewFormItem("=========", sf.lblSpace)
-	sf.lblRuda = widget.NewLabel("0")
-	itemRuda := widget.NewFormItem("Руда", sf.lblRuda)
-	sf.lblFerrum = widget.NewLabel("0")
-	itemFerrum := widget.NewFormItem("Железо", sf.lblFerrum)
-	frmStat := widget.NewForm(itemFuel, itemGold, itemSilver, itemGlory, itemSpace, itemRuda, itemFerrum)
-	tabStat := container.NewTabItem("Статистика", frmStat)
+	itemSpace := widget.NewFormItem("==========", sf.lblSpace)
+
+	{ // Левая колонка статистики
+		sf.lblFuel = widget.NewLabel("0")
+		itemFuel := widget.NewFormItem("Топливо", sf.lblFuel)
+		sf.lblGold = widget.NewLabel("0")
+		itemGold := widget.NewFormItem("Золото", sf.lblGold)
+		sf.lblSilver = widget.NewLabel("0")
+		itemSilver := widget.NewFormItem("Серебро", sf.lblSilver)
+		sf.lblGlory = widget.NewLabel("0")
+		itemGlory := widget.NewFormItem("Слава", sf.lblGlory)
+		sf.lblRuda = widget.NewLabel("0")
+		itemRuda := widget.NewFormItem("Руда", sf.lblRuda)
+		sf.lblFerrum = widget.NewLabel("0")
+		itemFerrum := widget.NewFormItem("Железо", sf.lblFerrum)
+		sf.lblSteel = widget.NewLabel("0")
+		itemSteel := widget.NewFormItem("Сталь", sf.lblSteel)
+		sf.lblPlumbum = widget.NewLabel("0")
+		itemPlumbum := widget.NewFormItem("Свинец", sf.lblPlumbum)
+		sf.frmStatLeft = widget.NewForm(itemFuel, itemGold, itemSilver, itemGlory, itemSpace, itemRuda, itemFerrum, itemSteel, itemPlumbum)
+	}
+	{ // Правая колонка статистики
+		sf.lblAtack = widget.NewLabel("0")
+		itemAtack := widget.NewFormItem("Атака", sf.lblAtack)
+		sf.lblArmor = widget.NewLabel("0")
+		itemArmor := widget.NewFormItem("Броня", sf.lblArmor)
+		sf.lblFyne = widget.NewLabel("0")
+		itemFyne := widget.NewFormItem("Точность", sf.lblFyne)
+		sf.lblHard = widget.NewLabel("0")
+		itemPower := widget.NewFormItem("Прочность", sf.lblHard)
+
+		sf.frmStatRight = widget.NewForm(itemAtack, itemArmor, itemFyne, itemPower, itemSpace)
+	}
+
+	hStat := container.NewHBox(sf.frmStatLeft, sf.frmStatRight)
+	tabStat := container.NewTabItem("Статистика", hStat)
 	sf.tabBot = container.NewAppTabs(tabLogin, tabStat)
 
 	sf.boxLeft = container.NewVBox(text1)
@@ -102,6 +131,26 @@ func NewWinMain(serv types.IServer) (*WinMain, error) {
 	return sf, nil
 }
 
+// Обнуляет вкладку статистики бота, если её невозможно получить
+func (sf *WinMain) resetStat() {
+	{ // Левый фрейм статы
+		sf.lblFuel.SetText("0")
+		sf.lblGold.SetText("0")
+		sf.lblSilver.SetText("0")
+		sf.lblGlory.SetText("0")
+		sf.lblRuda.SetText("0")
+		sf.lblFerrum.SetText("0")
+		sf.lblSteel.SetText("0")
+		sf.lblPlumbum.SetText("0")
+	}
+	{ // Правый фрейм статы
+		sf.lblAtack.SetText("0")
+		sf.lblArmor.SetText("0")
+		sf.lblFyne.SetText("0")
+		sf.lblHard.SetText("0")
+	}
+}
+
 // Показывает статистику бота
 func (sf *WinMain) showStat() {
 	for {
@@ -111,18 +160,52 @@ func (sf *WinMain) showStat() {
 			continue
 		}
 		bot := sf.serv.ServBots().Get(sf.botLogin)
-		sf.lblFuel.Text = fmt.Sprint(bot.Angar().Fuel().Get())
-		sf.lblFuel.Refresh()
-		sf.lblGold.Text = fmt.Sprint(bot.Angar().Gold().Get())
-		sf.lblGold.Refresh()
-		sf.lblSilver.Text = fmt.Sprint(bot.Angar().SilverAll().Get())
-		sf.lblSilver.Refresh()
-		sf.lblGlory.Text = fmt.Sprint(bot.Angar().Convoy().Glory().Get())
-		sf.lblGlory.Refresh()
-		sf.lblRuda.Text = fmt.Sprint(bot.Angar().Base().Mine().Ruda().Get())
-		sf.lblRuda.Refresh()
-		sf.lblFerrum.Text = fmt.Sprint(bot.Angar().Base().Mine().Ferrum().Get())
-		sf.lblFerrum.Refresh()
+		if !bot.IsRun() {
+			log.Printf("WinMain.showStat(): base==nil")
+			sf.resetStat()
+			continue
+		}
+		{ // Левый фрейм статы
+			sf.lblFuel.Text = fmt.Sprint(bot.Angar().Fuel().Get())
+			sf.lblFuel.Refresh()
+			sf.lblGold.Text = fmt.Sprint(bot.Angar().Gold().Get())
+			sf.lblGold.Refresh()
+			strSilver := fmt.Sprint(bot.Angar().SilverAll().Get())
+			strSlv := ""
+			i := 0
+			for i0 := len(strSilver) - 1; i0 >= 0; i0-- {
+				run := string(strSilver[i0])
+				if i == 3 {
+					strSlv = run + "_" + strSlv
+					i = 0
+					continue
+				}
+				strSlv = run + strSlv
+				i++
+			}
+			sf.lblSilver.Text = strSlv
+			sf.lblSilver.Refresh()
+			sf.lblGlory.Text = fmt.Sprint(bot.Angar().Convoy().Glory().Get())
+			sf.lblGlory.Refresh()
+			sf.lblRuda.Text = fmt.Sprint(bot.Angar().Base().Mine().Ruda().Get())
+			sf.lblRuda.Refresh()
+			sf.lblFerrum.Text = fmt.Sprint(bot.Angar().Base().Mine().Ferrum().Get())
+			sf.lblFerrum.Refresh()
+			sf.lblSteel.Text = fmt.Sprint(bot.Angar().Base().Mine().Steel().Get())
+			sf.lblSteel.Refresh()
+			sf.lblPlumbum.Text = fmt.Sprint(bot.Angar().Base().Mine().Plumbum().Get())
+			sf.lblPlumbum.Refresh()
+		}
+		{ // Правый фрейм статы
+			sf.lblAtack.Text = fmt.Sprint(bot.Tank().TankStat().Attack().Get())
+			sf.lblAtack.Refresh()
+			sf.lblArmor.Text = fmt.Sprint(bot.Tank().TankStat().Armor().Get())
+			sf.lblArmor.Refresh()
+			sf.lblFyne.Text = fmt.Sprint(bot.Tank().TankStat().Fyne().Get())
+			sf.lblFyne.Refresh()
+			sf.lblHard.Text = fmt.Sprint(bot.Tank().TankStat().Hard().Get())
+			sf.lblHard.Refresh()
+		}
 	}
 }
 
@@ -167,7 +250,7 @@ func (sf *WinMain) btnAddClick() {
 
 }
 
-// Добавляет бота на жкран
+// Добавляет бота на экран
 func (sf *WinMain) addBot() {
 	log.Printf("WinMain.addBot(): %q\n", sf.botLogin)
 	err := sf.serv.ServBots().AddBot(sf.botLogin, sf.botPass)
@@ -179,6 +262,7 @@ func (sf *WinMain) addBot() {
 	sf.boxLeft.Add(btnBot)
 }
 
+// Показывает данные своего бота при клике на соответствующей кнопке
 func (sf *WinMain) btnBotClick() func() {
 	log.Println("WinMain.btnBotClick()")
 	_botLogin := sf.botLogin
@@ -191,11 +275,8 @@ func (sf *WinMain) btnBotClick() func() {
 		sf.entLogin.Refresh()
 		sf.entPass.Text = _botPass
 		sf.entPass.Refresh()
-		sf.checkAutoGame.Checked = bot.IsAutoGame()
-		sf.checkAutoGame.Refresh()
-		fuel := bot.Angar().Fuel()
-		sf.lblFuel.Text = fmt.Sprint(fuel.Get())
-		sf.lblFuel.Refresh()
+		sf.checkAutoGame.SetChecked(bot.IsAutoGame())
+		sf.resetStat()
 	}
 }
 

+ 5 - 0
server/serv_bots/warbot/warbot.go

@@ -76,6 +76,11 @@ func NewWarBot(server types.IServer, name string) (*WarBot, error) {
 	return sf, nil
 }
 
+// IsRun -- возвращает признак, что бот подключен
+func (sf *WarBot) IsRun() bool {
+	return sf.isRun.Get()
+}
+
 // Name -- возвращает имя бота
 func (sf *WarBot) Name() string {
 	return sf.name