Forráskód Böngészése

d04 Упрощение под скрипты в браузере

SVI 2 éve
szülő
commit
177094b2a5

+ 2 - 2
server/serv_bots/warbot/angar/battle/battle_worker/battleon/battleon.go

@@ -67,12 +67,12 @@ func (сам *СражениеДействие) пуск() {
 	}()
 	{ // Подготовка к сражению
 		var err error
-		сам.выстрел, err = shot.НовВыстрел(сам, сам.логин) // Объект выстрела
+		сам.выстрел, err = shot.НовВыстрел(сам) // Объект выстрела
 		if err != nil {
 			// log._rintf("ERRO BattleOn.Run(): при создании выстрела танка, err=\n\t%v\n", err)
 			return
 		}
-		сам.здоровье, err = health.НовЗдоровье(сам, сам.логин)
+		сам.здоровье, err = health.НовЗдоровье(сам)
 		if err != nil {
 			// log._rintf("ERRO BattleOn.Run(): при создании здоровья танка, err=\n\t%v\n", err)
 			return

+ 11 - 207
server/serv_bots/warbot/angar/battle/battle_worker/battleon/health/health.go

@@ -2,16 +2,9 @@ package health
 
 import (
 	"fmt"
-	"log"
-	"strconv"
 	"strings"
 	"time"
 
-	"wartank/server/serv_bots/warbot/angar/battle/battle_worker/battleon/health/healthtime"
-	"wartank/server/serv_bots/warbot/angar/battle/battle_worker/battleon/health/isrepair"
-	"wartank/server/serv_bots/warbot/angar/battle/battle_worker/battleon/health/repairtime"
-
-	// "wartank/pkg/components/sound"
 	"wartank/pkg/types"
 )
 
@@ -22,33 +15,19 @@ import (
 // Здоровье -- контроль здоровья танка
 type Здоровье struct {
 	types.ИСражениеДействие
-	время          *healthtime.HealthTime // Изменяемое здоровье танка
-	здоровПолн     *healthtime.HealthTime // Полное здоровье танка
-	здоровТекущ    int                    // Старое доровье (до опроса)
-	еслиНадоЛечить *isrepair.IsRepair     // Необходимость восстановления
-	времяДоЛеч     *repairtime.RepairTime // Время до восстановления
-	логин          string                 // Для поиска контрольных строк
-	канТик         chan int               // Канал для ровной отправки тиков
-	уронСтарый     int                    // Дельта урона здоровью за прошлый шаг
+	канТик     chan int // Канал для ровной отправки тиков
+	счётЛечить int      // Счётчик вызовов лечения
 }
 
 // НовЗдоровье -- возвращает новый *Здоровье
-func НовЗдоровье(действие types.ИСражениеДействие, логин string) (*Здоровье, error) {
+func НовЗдоровье(действие types.ИСражениеДействие) (*Здоровье, error) {
 	{ // Предусловия
 		if действие == nil {
 			return nil, fmt.Errorf("НовЗдоровье(): действие==nil")
 		}
-		if логин == "" {
-			return nil, fmt.Errorf("НовЗдоровье(): логин пустой")
-		}
 	}
 	sf := &Здоровье{
 		ИСражениеДействие: действие,
-		время:             healthtime.NewHealthTime(),
-		здоровПолн:        healthtime.NewHealthTime(),
-		еслиНадоЛечить:    isrepair.NewIsRepair(),
-		времяДоЛеч:        repairtime.NewRepairTime(),
-		логин:             логин,
 		канТик:            make(chan int, 2),
 	}
 	go sf.makeTik()
@@ -63,28 +42,14 @@ func (сам *Здоровье) makeTik() {
 		сам.Отменить()
 		// log._rintf("Здоровье.makeTick(): сражение завершёно\n")
 	}()
-	countLow := 0
 	for {
 		select {
 		case <-сам.Кнт().Done():
 			return
 		default:
-			if сам.ЕслиМёртвый() {
-				return
-			}
-			switch сам.времяДоЛеч.Получ() <= 0 {
-			case true:
-				countLow++
-			default:
-				countLow = 0
-			}
-			if countLow > 90 {
-				return
-			}
+			сам.канТик <- 1
+			time.Sleep(time.Second * 10)
 		}
-		сам.канТик <- 1
-		time.Sleep(time.Second * 1)
-		сам.времяДоЛеч.Dec()
 	}
 }
 
@@ -94,20 +59,13 @@ func (сам *Здоровье) пуск() {
 		сам.Отменить()
 	}()
 	for range сам.канТик {
-		if err := сам.здоровьеНайти(); err != nil { // Найти свой здоровье
-			log.Printf("Здоровье.run(): при попытке найти здоровье, err=\n\t%v\n", err)
-			return
-		}
-		сам.времЛечитьНайти()
-		if сам.еслиНадоЛечить.Get() {
-			сам.лечить()
-		}
+		сам.лечить()
 	}
 }
 
 // Полное -- возвращает объект полного здоровья танка
 func (сам *Здоровье) Полное() int {
-	return сам.здоровПолн.Get()
+	return 0
 }
 
 // ЕслиМёртвый -- возвращает признак мертвичины танка
@@ -123,176 +81,22 @@ func (сам *Здоровье) ЕслиМёртвый() bool {
 	return false
 }
 
-// Ищет время восстановления ремки
-func (сам *Здоровье) времЛечитьНайти() {
-	defer func() {
-		if сам.времяДоЛеч.ЕслиМожно() {
-			return
-		}
-		if сам.времяДоЛеч.ЕслиИзменилось() {
-			log.Printf("Здоровье.findRepair(): до ремки=%v\n", сам.времяДоЛеч.Получ())
-		}
-	}()
-	if сам.времяДоЛеч.ЕслиМожно() {
-		return
-	}
-	var (
-		strOut    string
-		lstBattle = сам.СписПолучить()
-		isFind    bool
-		ind       int
-	)
-	// <a href="pve?19-14.ILinkListener-currentControl-repairLink" class="simple-but blue"><span><span>12 секунд</span></span></a>
-	//
-	for ind, strOut = range lstBattle {
-		if !strings.Contains(strOut, `ILinkListener-currentControl-repairLink`) {
-			continue
-		}
-		if strings.Contains(strOut, ` секунд</span></span></a>`) {
-			isFind = true
-			break
-		}
-	}
-	if !isFind {
-		return
-	}
-	strOut = lstBattle[ind]
-	// <a href="pve?19-14.ILinkListener-currentControl-repairLink" class="simple-but blue"><span><span>12 секунд</span></span></a>
-	lstTime := strings.Split(strOut, `ILinkListener-currentControl-repairLink" class="simple-but blue"><span><span>`)
-	if len(lstTime) < 2 {
-		// log._rintf("ERRO Здоровье.findRepair(): при попытке получить ссылку на ремонт, strOut=\n%v\n", strOut)
-		сам.Отменить()
-		return
-	}
-	strTime := lstTime[1]
-	lstTime = strings.Split(strTime, ` секунд</span></span></a>`)
-	strTime = lstTime[0]
-	if err := сам.времяДоЛеч.Set(strTime); err != nil {
-		// log._rintf("ERRO Здоровье.findRepair(): при установке времени восстановления ремки, err=\n\t%v\n", err)
-		return
-	}
-}
-
 // Восстановливает здоровье (~)
 func (сам *Здоровье) лечить() {
-	var (
-		strOut       string
-		lstBattleOn  = сам.СписПолучить()
-		isFindRepair bool
-		ind          int
-	)
+
 	// <span>Ремкомплект</span>
 	// <a href="pve?19-14.ILinkListener-currentControl-repairLink" class="simple-but blue"><span><span>Ремкомплект</span></span></a>
-	for ind, strOut = range lstBattleOn {
-		if strings.Contains(strOut, `<span>Ремкомплект</span>`) {
-			isFindRepair = true
-			break
-		}
-	}
-	if !isFindRepair {
-		return
-	}
-	strOut = lstBattleOn[ind]
+
+	strLink := "https://wartank.ru/pve?19-{count}.ILinkListener-currentControl-repairLink"
 	// <a href="pve?6-26.ILinkListener-currentControl-repairLink" class="simple-but blue"><span><span>Ремкомплект</span></span></a>
-	lstLink := strings.Split(strOut, `<a href="`)
-	strLink := lstLink[1]
-	lstLink = strings.Split(strLink, `" class="simple-but blue"><span><span>Ремкомплект</span></span></a>`)
-	strLink = "https://wartank.ru/" + lstLink[0]
+	strLink = strings.ReplaceAll(strLink, "{count}", fmt.Sprint(сам.счётЛечить))
 	lstBattleOn, err := сам.Сеть().Get(strLink)
 	if err != nil {
 		// log._rintf("ERRO Здоровье.repair(): при выполнении GET-команды ремонта, err=\n\t%v\n", err)
-		сам.Отменить()
 		return
 	}
 	if err = сам.СтрОбновить(lstBattleOn); err != nil {
 		// log._rintf("ERRO Здоровье.repair(): при обновлении lstBattle, err=\n\t%v\n", err)
 		return
 	}
-	// sound.Repair()
-	сам.уст(сам.здоровПолн.Get())
-	// log._rintf("INFO Здоровье.repair(): здоровье восстановлено\n")
-}
-
-// Ищет своё здоровье (~)
-func (сам *Здоровье) здоровьеНайти() error {
-	var (
-		ind       int
-		strOut    string
-		isFind    bool
-		lstBattle = сам.СписПолучить()
-	)
-	if len(lstBattle) == 0 { // Принудительно обновим сражение
-		if err := сам.Сеть().UpdateLst(); err != nil {
-			сам.Отменить()
-			return fmt.Errorf("Здоровье.здоровьеНайти(): пустой lstBattle, err=\n\t%w", err)
-		}
-	}
-	for ind, strOut = range lstBattle {
-		if strings.Contains(strOut, `alt="`+сам.логин+`"`) {
-			isFind = true
-			break
-		}
-	}
-	if !isFind { // Свой танк не найден
-		сам.Отменить()
-		return fmt.Errorf("Здоровье.здоровьеНайти(): своё здоровье не найдено")
-	}
-	// Свой танк найден, ищем здоровье
-	ind += 11
-	strOut = lstBattle[ind]
-	lstHealth := strings.Split(strOut, `<div class="value-block lh1"><span><span>`)
-	strHealth := lstHealth[1]
-	lstHealth = strings.Split(strHealth, `</span></span></div>`)
-	strHealth = lstHealth[0]
-	iHealth, err := strconv.Atoi(strHealth)
-	if err != nil {
-		сам.Отменить()
-		return fmt.Errorf("Здоровье.здоровьеНайти(): здоровье(%v) не число, err=%w", strHealth, err)
-	}
-	сам.уст(iHealth)
-	return nil
-}
-
-// уст -- устанавливает текущее здоровье
-func (сам *Здоровье) уст(знач int) {
-	if знач <= 0 {
-		// log._rintf("WARN Здоровье.уст(): кривое значение здоровья танка(%v)\n", val)
-		знач = 0
-		сам.Отменить()
-		return
-	}
-
-	if знач > сам.здоровПолн.Get() {
-		// log._rintf("WARN Здоровье.уст(): кривое текущее здоровье, %v/%v\n", val, sf.full.Get())
-		сам.здоровПолн.Set(знач)
-		сам.ВыстрелБлок().Reset()
-		сам.еслиНадоЛечить.Reset()
-		сам.здоровТекущ = знач
-		return
-	}
-
-	дельта := сам.здоровТекущ - знач
-	if дельта > 0 { // Дельта будет больше нуля, если только было попадание в свой танк
-		if дельта != сам.уронСтарый {
-			// log._rintf("INFO Здоровье.уст(): потеря здоровья=%v/%v\n", -delta, val)
-			сам.уронСтарый = дельта
-			сам.здоровТекущ -= знач
-		}
-	}
-
-	if знач <= 500 { // Запретить стрельбу
-		сам.ВыстрелБлок().Set() // Установить запрет стрельбы пока слабое здоровье
-		сам.еслиНадоЛечить.Set()
-		// log._rintf("WARN Здоровье.setHealth(): низкий уровень здоровья(%v)\n", val)
-		сам.МанёврНадоУст()
-		return
-	}
-	// Разрешить стрельбу
-	сам.ВыстрелБлок().Reset()
-	сам.еслиНадоЛечить.Reset()
-	if дельта > сам.здоровПолн.Get()*4/10 { // Проверить на критичность падения здоровья на 40%
-		// log._rintf("WARN Здоровье.setHealth(): большая разовая потеря здоровья(%v)\n", delta)
-		сам.МанёврНадоУст()
-		return
-	}
 }

+ 12 - 116
server/serv_bots/warbot/angar/battle/battle_worker/battleon/shot/shot.go

@@ -3,15 +3,9 @@ package shot
 import (
 	"fmt"
 	// "log"
-	"strconv"
 	"strings"
 	"time"
 
-	"wartank/server/serv_bots/warbot/angar/battle/battle_worker/battleon/shot/damage"
-	"wartank/server/serv_bots/warbot/angar/battle/battle_worker/battleon/shottime"
-
-	// "wartank/internal/components/sound"
-	"wartank/pkg/alias"
 	"wartank/pkg/types"
 )
 
@@ -26,33 +20,23 @@ import (
 
 // Выстрел -- объект выстрела
 type Выстрел struct {
-	types.ИСражениеДействие                    // FIXME!!!
-	времяПерезаряд          *shottime.ShotTime // Сколько времени нужно для полной перезарядки
-	урон                    *damage.Damage     // Урон от выстрела с памятью
-	уронВсего               alias.ADamage      // Суммарный урон
-	логин                   string             // Логин для поиска контрольных строк
-	канТик                  chan int           // Тик для выстрела
+	types.ИСражениеДействие          // FIXME!!!
+	канТик                  chan int // Тик для выстрела
+	выстрелСчёт             int      // Счётчик выстрелов для сервера
 }
 
 // НовВыстрел -- возвращает новый *Shot
-func НовВыстрел(действие types.ИСражениеДействие, логин string) (*Выстрел, error) {
+func НовВыстрел(действие types.ИСражениеДействие) (*Выстрел, error) {
 	{ // Предусловия
 		if действие == nil {
 			return nil, fmt.Errorf("НовВыстрел(): действие==nil")
 		}
-		if логин == "" {
-			return nil, fmt.Errorf("НовВыстрел(): логин пустой")
-		}
 	}
 	sf := &Выстрел{
 		ИСражениеДействие: действие,
-		времяПерезаряд:    shottime.NewShotTime(),
-		урон:              damage.NewDamage(),
-		логин:             логин,
+		выстрелСчёт:       1,
 		канТик:            make(chan int, 2),
 	}
-	// Установить время перезарядки
-	sf.времяПерезаряд.Set(6800)
 	go sf.делайТик()
 	go sf.пуск()
 	return sf, nil
@@ -70,10 +54,9 @@ func (сам *Выстрел) делайТик() {
 			return
 		default:
 			сам.канТик <- 1 // Первый выстрел, потом спать по таймингу
-			перезарядка := сам.времяПерезаряд.Get()
 			// log._rintf("INFO Shot.run() перезарядка=%v msec\n", recharge)
 			// Если идёт перезарядка -- постепенно обнуляем время ожидания
-			time.Sleep(time.Millisecond * time.Duration(перезарядка))
+			time.Sleep(time.Millisecond * 6800)
 		}
 	}
 }
@@ -81,12 +64,8 @@ func (сам *Выстрел) делайТик() {
 // Цикл выстрела (в отдельном потоке)
 func (сам *Выстрел) пуск() {
 	for range сам.канТик {
-		if сам.ВыстрелБлок().Get() { // Стрелять нельзя
-			continue
-		}
 		// Стрелять можно, стандартное ожидание
 		сам.выстрел()
-		сам.найтиУрон()
 	}
 }
 
@@ -100,100 +79,17 @@ func (сам *Выстрел) выстрел() {
 		сам.Отменить()
 		return
 	}
-	var (
-		strOut      string
-		lstBattle   = сам.СписПолучить()
-		еслиНайдено bool
-		err         error
-	)
+
 	// <a href="pve?6-26.ILinkListener-currentControl-attackRegularShellLink" class="simple-but gray"><span><span>ОБЫЧНЫЕ</span></span></a>
-	for _, strOut = range lstBattle {
-		if strings.Contains(strOut, `-currentControl-attackRegularShellLink`) {
-			еслиНайдено = true
-			break
-		}
-	}
-	if !еслиНайдено {
-		// log._rintf("WARN Shot.shot(): не найдены ссылка на выстрел\n")
-		сам.Отменить()
-		return
-	}
-	lstLink := strings.Split(strOut, `<a href="`)
-	strLink := lstLink[1]
-	lstLink = strings.Split(strLink, `" class="simple-but gray"><span><span>ОБЫЧНЫЕ</span></span></a>`)
-	strLink = "https://wartank.ru/" + lstLink[0]
-	lstBattle, err = сам.Сеть().Get(strLink)
+
+	strLink := "https://wartank.ru/pve?6-{count}.ILinkListener-currentControl-attackRegularShellLink"
+	strLink = strings.ReplaceAll(strLink, "{count}", fmt.Sprint(сам.выстрелСчёт))
+	сам.выстрелСчёт++
+	_, err := сам.Сеть().Get(strLink)
 	if err != nil {
 		// log._rintf("ERRO Shot.shot(): при исполнении GET-команды выстрела обычным снарядом, err=\n\t%v\n", err)
-		сам.Отменить()
-		return
-	}
-	if err = сам.СтрОбновить(lstBattle); err != nil {
-		// log._rintf("ERRO Shot.shot(): при обновлении lstBattle, err=\n\t%v\n", err)
-		сам.Отменить()
 		return
 	}
 	сам.МанёврНадоУст()
 	// sound.Shot()
 }
-
-// Ищет урон от выстрела
-func (сам *Выстрел) найтиУрон() {
-	var (
-		ind     = 0
-		isFind  = false
-		lstShot = сам.СписПолучить()
-		strOut  string
-	)
-
-	for ind, strOut = range lstShot {
-		// <span class="yellow1 td_u">prospero tank</span>
-		if strings.Contains(strOut, `<span class="yellow1 td_u">`+сам.логин+`</span>`) {
-			ind += 2
-			strOut = lstShot[ind]
-			isFind = true
-			break
-		}
-	}
-	if !isFind { // Возможно был рикошет или манёвр
-		// log._rintf("WARN Shot.findDamage(): не найден урон от выстрела, strOut=%q, ind=%v\n", strOut, ind)
-		return
-	}
-	lstDamage := strings.Split(strOut, ` на  <span class="red1">`)
-	if len(lstDamage) == 1 {
-		return
-	}
-	strDamage := lstDamage[1]
-	iDamage, err := strconv.Atoi(strDamage)
-	if err != nil {
-		// log._rintf("ERRO Shot.findDamage(): damage(%v) не число, err=\n\t%v\n", strDamage, err)
-		return
-	}
-	if iDamage <= 0 { // Кривой урон от выстрела
-		сам.времяПерезаряд.Dec5()
-		// log._rintf("WARN Shot.findDamage(): ошибка в значении урона(%v)\n", iDamage)
-		iDamage = 0
-		return
-	}
-	сам.уронВсего += alias.ADamage(iDamage)
-	// log._rintf("INFO Shot.Damage(): damageSum=%v\n", sf.damageSum)
-	if iDamage < 70 {
-		сам.урон.Set(alias.ADamage(iDamage))
-		сам.времяПерезаряд.Inc210()
-	}
-	// log._rintf("INFO Shot.findDamage(): выстрел=+%v, урон=%v", iDamage, sf.damageSum)
-	сам.времяПерезарядОбновить(alias.ADamage(iDamage))
-}
-
-// времяПерезарядОбновить -- обновляет время перезарядки в зависимости от произведённого урона
-func (sf *Выстрел) времяПерезарядОбновить(val alias.ADamage) {
-	sf.урон.Set(val)
-	switch sf.урон.Result() {
-	case "none":
-		sf.времяПерезаряд.Dec5()
-	case "up":
-		sf.времяПерезаряд.Dec30()
-	case "down":
-		sf.времяПерезаряд.Inc210()
-	}
-}