polygon.go 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586
  1. package polygon
  2. import (
  3. "fmt"
  4. "log"
  5. "strconv"
  6. "strings"
  7. "time"
  8. "wartank/pkg/alias"
  9. "wartank/pkg/components/safe_int"
  10. "wartank/pkg/components/safe_string"
  11. "wartank/pkg/cons"
  12. "wartank/pkg/section"
  13. "wartank/pkg/types"
  14. "wartank/server/serv_bots/warbot/angar/base/polygon/polygonnet"
  15. "wartank/server/serv_bots/warbot/tank/tankstat/static_param"
  16. )
  17. /*
  18. Объект полигона на базе
  19. */
  20. const (
  21. времОжидПлат = "05:00" // Время ожидания платного ускорения
  22. времОжидБесплат = "30:00" // Время ожидания бесплатного ускорения
  23. стрПрочность = "прочность"
  24. стрТочность = "точность"
  25. стрБроня = "броня"
  26. стрАтака = "атака"
  27. )
  28. // Полигон -- объект полигона на базе
  29. type Полигон struct {
  30. *section.Секция
  31. бот types.ИБот
  32. танкСтат types.ИТанкСтат
  33. сеть *polygonnet.ПолигонСеть
  34. продуктСейчас *safe_string.БезопСтрока
  35. продуктКол *safe_int.БезопЦелое
  36. уровень *static_param.СтатПарам
  37. }
  38. // НовПолигон -- возвращает новый *Polygon
  39. func НовПолигон(база types.ИБаза) (*Полигон, error) {
  40. секция, ош := section.НовСекция(база.Бот(), "Полигон", `<title>Полигон</title>`)
  41. if ош != nil {
  42. return nil, fmt.Errorf("НовПолигон(): при создании ИСекция, ош=\n\t%w", ош)
  43. }
  44. уровень, ош := static_param.НовСтатПарам("уровень полигона")
  45. if ош != nil {
  46. return nil, fmt.Errorf("НовПолигон(): при создании уровня полигона, ош=\n\t%w", ош)
  47. }
  48. сам := &Полигон{
  49. Секция: секция,
  50. бот: база.Бот(),
  51. танкСтат: база.Бот().Танк().ТанкСтат(),
  52. продуктСейчас: safe_string.НовБезопСтрока(),
  53. продуктКол: safe_int.НовБезопЦелое(),
  54. уровень: уровень,
  55. }
  56. сам.сеть, ош = polygonnet.НовПолигонСеть(сам)
  57. if ош != nil {
  58. return nil, fmt.Errorf("NewPolygon(): in create NetPolygon, err=\n\t%w", ош)
  59. }
  60. _ = types.ИБазаПолигон(сам)
  61. return сам, nil
  62. }
  63. // Уровень -- возвращает уровень полигона
  64. func (сам *Полигон) Уровень() types.ИСтатПарам {
  65. return сам.уровень
  66. }
  67. // ПродуктКолСейчас -- количество продукта, что именно сейчас производится на полигоне
  68. func (сам *Полигон) ПродуктКолСейчас() int {
  69. return сам.продуктКол.Получ()
  70. }
  71. // ПродуктИмяСейчас -- что именно сейчас производится на полигоне
  72. func (сам *Полигон) ПродуктИмяСейчас() string {
  73. return сам.продуктСейчас.Получ()
  74. }
  75. // ПродуктВремяСейчас -- сколько осталось времени до обновы полигона
  76. func (сам *Полигон) ПродуктВремяСейчас() string {
  77. return сам.ВремяОстат().String()
  78. }
  79. // Пуск -- запускает работу полигона в отдельном потоке
  80. func (сам *Полигон) Пуск() error {
  81. go сам.пуск()
  82. return nil
  83. }
  84. const (
  85. стрАпгрейд = "апгрейд"
  86. )
  87. // выполняет опрос полигона базы.
  88. func (сам *Полигон) пуск() {
  89. сам.ОбратВремяУст("02")
  90. фнРабота := func() {
  91. defer func() {
  92. for сам.ВремяОстат().ПолучМилСек() > 0 {
  93. time.Sleep(time.Second * 5)
  94. continue
  95. }
  96. }()
  97. сам.усилениеДобавить()
  98. сам.усилениеПровер()
  99. сам.времяОбнов()
  100. сам.построитьПровер()
  101. сам.проверитьУскорение()
  102. if сам.продуктСейчас.Получ() == стрАпгрейд {
  103. сам.ВремяОстат().Уст("00:10:00")
  104. }
  105. счёт := 5
  106. for счёт > 0 {
  107. if сам.уровеньПолучить() {
  108. break
  109. }
  110. счёт--
  111. }
  112. }
  113. for {
  114. select {
  115. case <-сам.Кнт().Done():
  116. return
  117. case <-сам.ВремяОстат().КаналСиг():
  118. фнРабота()
  119. default:
  120. фнРабота()
  121. }
  122. }
  123. }
  124. // Проверяет уровень полигона
  125. func (сам *Полигон) уровеньПолучить() bool {
  126. var (
  127. стрВых = ""
  128. еслиНидено bool
  129. )
  130. lstBase, err := сам.сеть.Клиент().Get("https://wartank.ru/buildings")
  131. if err != nil {
  132. log.Printf("Полигон.уровеньПолучить(): при обновлении строк базы, err=\n\t%v\n", err)
  133. return false
  134. }
  135. // <span class="green2">Полигон - 5</span><br/>
  136. for _, стрВых = range lstBase {
  137. if strings.Contains(стрВых, `<span class="green2">Полигон - `) {
  138. еслиНидено = true
  139. break
  140. }
  141. }
  142. if !еслиНидено {
  143. return false
  144. }
  145. стрУровень := strings.TrimPrefix(стрВых, `<span class="green2">Полигон - `)
  146. стрУровень = strings.TrimSuffix(стрУровень, `</span><br/>`)
  147. цУров, ош := strconv.Atoi(стрУровень)
  148. if ош != nil {
  149. return false
  150. }
  151. сам.уровень.Уст(цУров)
  152. return true
  153. }
  154. // Проверяет на ускорение апгрейда полигона
  155. func (сам *Полигон) проверитьУскорение() {
  156. var (
  157. strOut = ""
  158. еслиНайдено bool
  159. )
  160. lstBase, err := сам.сеть.Клиент().Get("https://wartank.ru/buildings")
  161. if err != nil {
  162. log.Printf("Полигон.проверитьУскорение(): при обновлении строк базы, err=\n\t%v\n", err)
  163. return
  164. }
  165. // Проверка на платное ускорение апгрейда + время
  166. { // Платное ускорение
  167. if strings.Contains(strOut, `Ускорить за`) {
  168. if err := сам.ОбратВремяУст(времОжидПлат); err != nil {
  169. log.Printf("WARN Base.checkArsenalForce(): при установке платного времени ускорения апгрейда арсенала(%v)\n\terr=%v\n", времОжидПлат, err)
  170. }
  171. сам.СценаРежим().РаботаУст(стрАпгрейд)
  172. сам.СценаРежим().РежимУст(cons.РежимАпгрейд)
  173. сам.продуктСейчас.Уст(стрАпгрейд)
  174. сам.продуктКол.Уст(0)
  175. return
  176. }
  177. }
  178. { // Проверка на бесплатное ускорение апгрейда
  179. еслиНайдено = false
  180. for _, strOut = range lstBase {
  181. if strings.Contains(strOut, `Производит снаряды, ремкомплекты<br/>`) {
  182. // Убедиться что есть строка платного ускорения
  183. еслиНайдено = true
  184. break
  185. }
  186. }
  187. if !еслиНайдено {
  188. return
  189. }
  190. if !strings.Contains(strOut, `>Ускорение<`) {
  191. return
  192. }
  193. сам.СценаРежим().РежимУст(cons.РежимАпгрейд)
  194. сам.продуктСейчас.Уст(стрАпгрейд)
  195. сам.продуктКол.Уст(0)
  196. lstLink := strings.Split(strOut, `<td style="width:50%;padding-left:1px;"><a class="simple-but border" href="`)
  197. strLink := lstLink[1]
  198. lstLink = strings.Split(strLink, `"><span><span>Ускорение</span></span></a>`)
  199. strLink = "https://wartank.ru/" + lstLink[0]
  200. lstBase, err := сам.сеть.Get(strLink)
  201. if err != nil {
  202. // log._rintf("ERRO NetBank.checkArsenalForce(): при GET-запросе на бесплатном ускорении апгрейда арсенала, err=\n\t%v\n", err)
  203. return
  204. }
  205. // sound.ArsenalForce()
  206. if err := сам.СтрОбновить(lstBase); err != nil {
  207. // log._rintf("ERRO NetBank.checkArsenalForce(): при обновлении lstBase, err=\n\t%v\n", err)
  208. return
  209. }
  210. сам.СценаРежим().РаботаУст(стрАпгрейд)
  211. сам.СценаРежим().РежимУст(cons.РежимАпгрейд)
  212. сам.продуктКол.Уст(0)
  213. if err := сам.ОбратВремяУст(времОжидБесплат); err != nil {
  214. log.Printf("WARN Base.checkArsenalForce(): при установке бесплатного времени ускорения апгрейда арсенала(%v)\n\terr=%v\n", времОжидБесплат, err)
  215. }
  216. }
  217. // Все проверки прошли -- это просто работа
  218. сам.СценаРежим().РаботаУст("work")
  219. }
  220. // Проверяет необходимость постройки полигона
  221. func (сам *Полигон) построитьПровер() {
  222. фнПостроить := func() bool { // Поиск кнопки строительства
  223. // https://wartank.ru/building-upgrade/Polygon
  224. списПолигон, ош := сам.сеть.Клиент().Get("https://wartank.ru/building-upgrade/Polygon")
  225. if ош != nil {
  226. log.Printf("Полигон.построитьПровер(): при чтении страницы строительства полигона, ош=\n\t%v\n", ош)
  227. return false
  228. }
  229. стрСсылка := ""
  230. еслиНайти := false
  231. // <a class="simple-but border mb5" href="Polygon?66-1.ILinkListener-upgradeLink-link">
  232. for _, стрСсылка = range списПолигон {
  233. if strings.Contains(стрСсылка, `href="Polygon?`) {
  234. еслиНайти = true
  235. break
  236. }
  237. }
  238. if !еслиНайти { // Время полигона вышло
  239. return false
  240. }
  241. _ссылка := strings.TrimPrefix(стрСсылка, `<a class="simple-but border mb5" href="`)
  242. _ссылка = strings.TrimSuffix(_ссылка, `">`)
  243. ссылка := "https://wartank.ru/building-upgrade/" + _ссылка
  244. // https://wartank.ru/building-upgrade/Polygon?83-1.ILinkListener-upgradeLink-link
  245. списПолигон, ош = сам.сеть.Клиент().Get(ссылка)
  246. if ош != nil {
  247. log.Printf("Полигон.построитьПровер(): при выполнении запроса на строительство, ош=\n\t%v\n", ош)
  248. return false
  249. }
  250. for _, стр := range списПолигон {
  251. if strings.Contains(стр, `href="Polygon?`) {
  252. return false
  253. }
  254. }
  255. { // подтверждение постройки
  256. // "<a class=\"simple-but border w50 mXa mb10\" w:id=\"confirmLink\" href=\"../wicket/page?13-1.ILinkListener-confirmLink\"><span><span>да, подтверждаю</span></span></a>"
  257. стрСсылка := ""
  258. еслиНайти := false
  259. for _, стрСсылка = range списПолигон {
  260. if strings.Contains(стрСсылка, `.ILinkListener-confirmLink`) {
  261. еслиНайти = true
  262. break
  263. }
  264. }
  265. if !еслиНайти { // Время полигона вышло
  266. return false
  267. }
  268. _ссылка := strings.TrimPrefix(стрСсылка, "<a class=\"simple-but border w50 mXa mb10\" w:id=\"confirmLink\" href=\"../")
  269. _ссылка = strings.TrimSuffix(_ссылка, "\"><span><span>да, подтверждаю</span></span></a>")
  270. ссылка := "https://wartank.ru/" + _ссылка
  271. // https://wartank.ru/wicket/page?135-1.ILinkListener-confirmLink
  272. _, ош = сам.сеть.Клиент().Get(ссылка)
  273. if ош != nil {
  274. log.Printf("Полигон.построитьПровер(): при выполнении запроса на строительство, ош=\n\t%v\n", ош)
  275. return false
  276. }
  277. }
  278. return true
  279. }
  280. фнПостроить()
  281. log.Printf("Полигон.построитьПровер(): построен упешно\n")
  282. }
  283. // Обновляет оставшееся время полигона
  284. //
  285. // Этот объект сам описывает своё время
  286. func (сам *Полигон) времяОбнов() {
  287. var (
  288. strLastTime string
  289. еслиНайдено bool
  290. isSet bool
  291. lstPolygon = сам.СписПолучить()
  292. )
  293. defer func() {
  294. if !isSet {
  295. сам.ОбратВремяУст("05")
  296. }
  297. }()
  298. for _, lastTime := range lstPolygon {
  299. if strings.Contains(lastTime, `>Осталось: `) {
  300. strLastTime = lastTime
  301. еслиНайдено = true
  302. break
  303. }
  304. }
  305. if !еслиНайдено { // Время полигона вышло
  306. return
  307. }
  308. lstTime := strings.Split(strLastTime, `>Осталось: `)
  309. strLastTime = lstTime[1]
  310. lstTime = strings.Split(strLastTime, `</span>`)
  311. strLastTime = lstTime[0]
  312. if err := сам.Уст(alias.Время(strLastTime)); err != nil {
  313. // log._rintf("ERRO Polygon.updateTime(): при установке времени ожидания полигона(%v)\n\terr=%v\n", strLastTime, err)
  314. return
  315. }
  316. isSet = true
  317. }
  318. // Проверяет что именно активировано
  319. func (сам *Полигон) усилениеПровер() {
  320. var (
  321. еслиНайдено bool
  322. lstPolygon = сам.СписПолучить()
  323. ind = 0
  324. strOut string
  325. )
  326. for ind, strOut = range lstPolygon {
  327. if strings.Contains(strOut, `<span>Активно</span>`) {
  328. ind -= 9
  329. еслиНайдено = true
  330. break
  331. }
  332. }
  333. if !еслиНайдено {
  334. return
  335. }
  336. strOut = lstPolygon[ind]
  337. форсажИмя := ""
  338. switch { // Вычисляем контрольную строку
  339. case strings.Contains(strOut, `>улучшение точности<`):
  340. форсажИмя = стрТочность
  341. case strings.Contains(strOut, `>увеличение прочности<`):
  342. форсажИмя = стрПрочность
  343. case strings.Contains(strOut, `>усиление брони<`):
  344. форсажИмя = стрБроня
  345. case strings.Contains(strOut, `>усиление атаки<`):
  346. форсажИмя = стрАтака
  347. }
  348. // Вычислим на сколько
  349. strOut = lstPolygon[ind+1]
  350. lstOut := strings.Split(strOut, `<span class="green2">+`)
  351. strOut = lstOut[1]
  352. lstOut = strings.Split(strOut, ` на `)
  353. strOut = lstOut[0]
  354. iForce, err := strconv.Atoi(strOut)
  355. if err != nil {
  356. // log._rintf("NetPolygon.checkTime(): force(%v) not number, err=\n\t%v\n", strOut, err)
  357. return
  358. }
  359. сам.танкСтат.ФорсажОбнов(форсажИмя, iForce)
  360. сам.продуктСейчас.Уст("усиление-" + форсажИмя)
  361. сам.продуктКол.Уст(iForce)
  362. }
  363. // Выбирает самый слабый параметр и усиливает его
  364. func (сам *Полигон) усилениеДобавить() {
  365. if ош := сам.сеть.Обновить(); ош != nil {
  366. // log._rintf("Polygon.checkPolygon(): при принудительном обновлении lstPlygon, mode=%s\terr=\n\t%v\n", сам.ModeCurrent().Get(), err)
  367. сам.ОбратВремяУст("05")
  368. return
  369. }
  370. lstPoligon := сам.СписПолучить()
  371. if len(lstPoligon) == 0 {
  372. return
  373. }
  374. stat := сам.танкСтат
  375. iAttack := stat.Атака().Получ()
  376. iArmor := stat.Броня().Получ()
  377. iFyne := stat.Точность().Получ()
  378. iHard := stat.Прочность().Получ()
  379. strParam := стрАтака
  380. iParam := iHard
  381. {
  382. /*
  383. Вычислить самый слабый параметр.
  384. Политика вычислений:
  385. 1) hard -- прочность, самый низкоприоритетный параметр
  386. 2) armor -- броня, чуть лучше power
  387. 3) fyne -- точность, чуть лучше armor
  388. 4) attack -- атака, самый важный
  389. */
  390. if iArmor <= iParam {
  391. iParam = iArmor
  392. strParam = стрБроня
  393. }
  394. if iFyne <= iParam {
  395. iParam = iFyne
  396. strParam = стрТочность
  397. }
  398. if iAttack < iParam {
  399. strParam = стрАтака
  400. }
  401. }
  402. // Найти нужную строку активации
  403. var (
  404. ind int
  405. strOut string
  406. еслиНайдено bool
  407. )
  408. switch strParam {
  409. case стрАтака: // Усиливаем атаку
  410. for ind, strOut = range lstPoligon {
  411. if strings.Contains(strOut, `>усиление атаки<`) {
  412. еслиНайдено = true
  413. break
  414. }
  415. }
  416. if !еслиНайдено {
  417. return
  418. }
  419. ind += 8
  420. strOut = lstPoligon[ind]
  421. if strOut == "" {
  422. return
  423. }
  424. lstLink := strings.Split(strOut, `<a class="simple-but border" href="`)
  425. strOut = lstLink[1]
  426. lstLink = strings.Split(strOut, `"><span><span>Получить бесплатно</span></span></a>`)
  427. strLink := "https://wartank.ru/" + lstLink[0]
  428. if _, err := сам.сеть.Get(strLink); err != nil {
  429. // log._rintf("ERRO NetPolygon.addForce(): in make request force attack, err=\n\t%v\n", err)
  430. return
  431. }
  432. { // Узнать на сколько форсирована атака
  433. strForce := lstPoligon[ind-7]
  434. lstForce := strings.Split(strForce, `<span class="green2">+`)
  435. strForce = lstForce[1]
  436. lstForce = strings.Split(strForce, ` на `)
  437. strForce = lstForce[0]
  438. iForce, err := strconv.Atoi(strForce)
  439. if err != nil {
  440. // log._rintf("ERRO NetPolygon.addForce(): strForceAttack(%v) not int, err=\n\t%v\n", strForce, err)
  441. return
  442. }
  443. сам.танкСтат.ФорсажОбнов("attack", iForce)
  444. сам.СценаРежим().РаботаУст(стрАтака)
  445. }
  446. case стрБроня: // Усиливаем броню
  447. еслиНайдено = false
  448. for ind, strOut = range lstPoligon {
  449. if strings.Contains(strOut, `>усиление брони<`) {
  450. еслиНайдено = true
  451. break
  452. }
  453. }
  454. if !еслиНайдено {
  455. return
  456. }
  457. ind += 8
  458. strOut = lstPoligon[ind]
  459. if strOut == "" {
  460. return
  461. }
  462. lstLink := strings.Split(strOut, `<a class="simple-but border" href="`)
  463. strOut = lstLink[1]
  464. lstLink = strings.Split(strOut, `"><span><span>Получить бесплатно</span></span></a>`)
  465. strLink := "https://wartank.ru/" + lstLink[0]
  466. if _, err := сам.сеть.Get(strLink); err != nil {
  467. // log._rintf("NetPolygon.addForce(): in make request force armor, err=\n\t%v\n", err)
  468. return
  469. }
  470. { // Узнать на сколько форсирована броня
  471. strForce := lstPoligon[ind-7]
  472. lstForce := strings.Split(strForce, `<span class="green2">+`)
  473. strForce = lstForce[1]
  474. lstForce = strings.Split(strForce, ` на `)
  475. strForce = lstForce[0]
  476. iForce, err := strconv.Atoi(strForce)
  477. if err != nil {
  478. // log._rintf("ERRO NetPolygon.addForce(): strForceArmor(%v) not int, err=\n\t%v\n", strForce, err)
  479. return
  480. }
  481. сам.танкСтат.ФорсажОбнов(стрБроня, iForce)
  482. сам.СценаРежим().РаботаУст(стрБроня)
  483. }
  484. case стрТочность: // Усиливаем точность
  485. еслиНайдено = false
  486. for ind, strOut = range lstPoligon {
  487. if strings.Contains(strOut, `>улучшение точности<`) {
  488. еслиНайдено = true
  489. break
  490. }
  491. }
  492. if !еслиНайдено {
  493. return
  494. }
  495. ind += 8
  496. strOut = lstPoligon[ind]
  497. if strOut == "" {
  498. return
  499. }
  500. lstLink := strings.Split(strOut, `<a class="simple-but border" href="`)
  501. strOut = lstLink[1]
  502. lstLink = strings.Split(strOut, `"><span><span>Получить бесплатно</span></span></a>`)
  503. strLink := "https://wartank.ru/" + lstLink[0]
  504. if _, err := сам.сеть.Get(strLink); err != nil {
  505. // log._rintf("ERRO NetPolygon.addForce(): in make request force fyne, err=\n\t%v\n", err)
  506. return
  507. }
  508. { // Узнать на сколько форсирована точность
  509. strForce := lstPoligon[ind-7]
  510. lstForce := strings.Split(strForce, `<span class="green2">+`)
  511. strForce = lstForce[1]
  512. lstForce = strings.Split(strForce, ` на `)
  513. strForce = lstForce[0]
  514. iForce, err := strconv.Atoi(strForce)
  515. if err != nil {
  516. // log._rintf("ERRO NetPolygon.addForce(): strForceFyne(%v) not int, err=\n\t%v\n", strForce, err)
  517. return
  518. }
  519. сам.танкСтат.ФорсажОбнов(стрТочность, iForce)
  520. сам.СценаРежим().РаботаУст(стрТочность)
  521. }
  522. case стрПрочность: // Усиливаем мощность
  523. еслиНайдено = false
  524. for ind, strOut = range lstPoligon {
  525. if strings.Contains(strOut, `>увеличение прочности<`) {
  526. еслиНайдено = true
  527. break
  528. }
  529. }
  530. if !еслиНайдено {
  531. return
  532. }
  533. ind += 8
  534. strOut = lstPoligon[ind]
  535. lstLink := strings.Split(strOut, `<a class="simple-but border" href="`)
  536. strOut = lstLink[1]
  537. lstLink = strings.Split(strOut, `"><span><span>Получить бесплатно</span></span></a>`)
  538. strLink := "https://wartank.ru/" + lstLink[0]
  539. if _, err := сам.сеть.Get(strLink); err != nil {
  540. // log._rintf("NetPolygon.addForce(): in make request force hard, err=\n\t%v\n", err)
  541. return
  542. }
  543. { // Узнать на сколько форсирована прочность
  544. strForce := lstPoligon[ind-7]
  545. lstForce := strings.Split(strForce, `<span class="green2">+`)
  546. strForce = lstForce[1]
  547. lstForce = strings.Split(strForce, ` на `)
  548. strForce = lstForce[0]
  549. iForce, err := strconv.Atoi(strForce)
  550. if err != nil {
  551. // log._rintf("ERRO NetPolygon.addForce(): strForceHard(%v) not int, err=\n\t%v\n", strForce, err)
  552. return
  553. }
  554. сам.танкСтат.ФорсажОбнов(стрПрочность, iForce)
  555. сам.СценаРежим().РаботаУст(стрПрочность)
  556. }
  557. default: // Неизвестно что
  558. сам.СценаРежим().РаботаУст("неизвестно")
  559. // log._rintf("ERRO NetPolygon.addForce(): неизвестно что это, strParam=%q", strParam)
  560. return
  561. }
  562. }