arena_angar.go 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307
  1. package arena_angar
  2. import (
  3. "fmt"
  4. "log"
  5. "strconv"
  6. "strings"
  7. "time"
  8. . "wartank/app/lev0/types"
  9. "wartank/app/lev1/arena"
  10. "wartank/app/lev2/bot/arena_angar/base"
  11. "wartank/app/lev2/bot/arena_angar/battle"
  12. "wartank/app/lev2/bot/arena_angar/bot_net_stat"
  13. "wartank/app/lev2/bot/arena_angar/convoy"
  14. "wartank/app/lev2/bot/arena_angar/fuel_attack"
  15. "wartank/app/lev2/bot/arena_angar/masters"
  16. "wartank/app/lev2/bot/arena_angar/missions"
  17. "wartank/app/lev2/bot/arena_angar/tank_params"
  18. "wartank/app/lev2/bot/bot_stat/stat_param"
  19. "wartank/app/lev2/bot/bot_stat/stat_resurs"
  20. "wartank/pkg/alias"
  21. "wartank/pkg/components/arena_net"
  22. )
  23. /*
  24. Объект ангара приложения
  25. */
  26. // Ангар -- ангар для танка
  27. type АренаАнгар struct {
  28. ИАрена
  29. прилож ИПриложение
  30. сеть ИАренаСеть
  31. бот ИБот
  32. уровень ИСтатПарам
  33. progress ИСтатПарам
  34. // топливо *fuel.Топливо
  35. игроковОнлайн ИСтатПарам
  36. silverOnline ИСтатПарам
  37. сетьТанкСтат *bot_net_stat.БотСетьСтат
  38. танкПарам *tank_params.ТанкПараметры
  39. словАрена map[alias.АренаИмя]ИАрена
  40. ресурсы *stat_resurs.СтатРесурсы
  41. }
  42. // НовАнгар -- возвращает новый *Angar
  43. func НовАнгар(конт ИБотКонтекст) (*АренаАнгар, error) {
  44. танкПарам := tank_params.НовТанкПараметры(конт)
  45. бот := конт.Получ("бот").(ИБот)
  46. сам := &АренаАнгар{
  47. бот: бот,
  48. уровень: stat_param.НовСтатПарам("уровень"),
  49. progress: stat_param.НовСтатПарам("прогресс"),
  50. игроковОнлайн: stat_param.НовСтатПарам("онлайн"),
  51. silverOnline: stat_param.НовСтатПарам("серебро онлайн"),
  52. танкПарам: танкПарам,
  53. словАрена: make(map[alias.АренаИмя]ИАрена),
  54. }
  55. аренаКонф := arena.АренаКонфиг{
  56. Бот_: бот,
  57. АренаИмя_: "Ангар",
  58. СтрКонтроль_: "<title>Ангар</title>",
  59. ФнПуск_: сам.пуск,
  60. СтрУрл_: "https://wartank.ru/angar",
  61. }
  62. конт.Уст("ангар", сам)
  63. сам.ИАрена = arena.НовАрена(конт, аренаКонф)
  64. сам.сеть = arena_net.НовАренаСеть(конт, сам, "https://wartank.ru/angar")
  65. var err error
  66. топливоБой, err := fuel_attack.НовТопливоБой(конт, сам)
  67. if err != nil {
  68. return nil, fmt.Errorf("НовАнгар(): in create <AngarAttackNet>, err=\n\t%w", err)
  69. }
  70. сам.словАрена["топливоБой"] = топливоБой
  71. // Статистика
  72. сам.сетьТанкСтат = bot_net_stat.НовБотСетьСтат(конт)
  73. конвой := convoy.НовКонвой(конт, сам.бот)
  74. сам.словАрена["конвой"] = конвой
  75. сражение := battle.НовСражение(конт, сам.бот)
  76. сам.словАрена["сражение"] = сражение
  77. битваМастеров := masters.НовБитваМастеров(конт, сам.бот)
  78. сам.словАрена["битваМастеров"] = битваМастеров
  79. база, err := base.НовБаза(конт, сам)
  80. if err != nil {
  81. return nil, fmt.Errorf("НовАнгар(): in make IBase, err=\n\t%w", err)
  82. }
  83. сам.словАрена["база"] = база
  84. миссии, err := missions.НовМиссии(конт, сам.бот)
  85. if err != nil {
  86. return nil, fmt.Errorf("НовАнгар(): in make *Missions, err=\n\t%w", err)
  87. }
  88. сам.словАрена["миссии"] = миссии
  89. сам.ресурсы = stat_resurs.НовСтатРесурсы(конт, сам)
  90. _ = ИАнгар(сам)
  91. return сам, nil
  92. }
  93. // Обновить -- обновить ангар принудительно
  94. func (сам *АренаАнгар) Обновить() {
  95. сам.РесурсыОбновить()
  96. сам.сетьТанкСтат.Update()
  97. сам.словАрена["конвой"].Пуск()
  98. сам.ресурсы.Топливо().Обновить()
  99. }
  100. // Запускает обработку ангара
  101. func (сам *АренаАнгар) пуск() {
  102. { // Запуск компонентов
  103. сам.танкПарам.Пуск()
  104. go сам.ресурсы.Топливо().Run()
  105. }
  106. фнЦикл := func() bool {
  107. сам.Обновить()
  108. // сам.конвойПроверить()
  109. if err := сам.ОбратВремяУст("01:00"); err != nil {
  110. сам.Отмена()
  111. log.Printf("Ангар.Run(): in update ICountTime, err=\n\t%v\n", err)
  112. return false
  113. }
  114. for _, арена := range сам.словАрена {
  115. арена.Пуск()
  116. }
  117. return true
  118. }
  119. go func() {
  120. ош := сам.ОбратВремяУст("01")
  121. if ош != nil {
  122. log.Printf("Ангар.Run(): in update ICountTime, ош=\n\t%v\n", ош)
  123. сам.прилож.Отменить()
  124. return
  125. }
  126. for {
  127. select {
  128. case <-сам.прилож.Конт().Done(): // Отмена контекста
  129. return
  130. case <-сам.ВремяОстат().КаналСиг(): // Метка времени
  131. if !фнЦикл() {
  132. return
  133. }
  134. default: // Запускается раз в минуту
  135. if !фнЦикл() {
  136. return
  137. }
  138. time.Sleep(time.Minute * 1)
  139. }
  140. }
  141. }()
  142. }
  143. // Обновляет ресурсы ангара
  144. func (сам *АренаАнгар) РесурсыОбновить() {
  145. сам.сеть.Обновить()
  146. сам.золотоНайти()
  147. сам.сереброНайти()
  148. }
  149. // IMissions -- возвращает ссылку на объект миссий
  150. func (сам *АренаАнгар) Миссии() ИМиссии {
  151. return сам.словАрена["миссии"].(ИМиссии)
  152. }
  153. // Сражение -- возвращает объект сражения
  154. func (сам *АренаАнгар) Сражение() ИСражениеСцена {
  155. return сам.словАрена["сражение"].(ИСражениеСцена)
  156. }
  157. // Конвой -- возвращает объект конвоя
  158. func (сам *АренаАнгар) Конвой() ИАренаКонвой {
  159. return сам.словАрена["конвой"].(ИАренаКонвой)
  160. }
  161. // Золото -- возвращает объект золота
  162. func (сам *АренаАнгар) Золото() ИСтатПарам {
  163. return сам.ресурсы.Золото()
  164. }
  165. // Топливо -- возвращает объект топлива
  166. func (сам *АренаАнгар) Топливо() ИСтатПарам {
  167. return сам.ресурсы.Топливо().Fuel()
  168. }
  169. // Уровень -- возвращает объект уровня игрока
  170. func (сам *АренаАнгар) Уровень() ИСтатПарам {
  171. return сам.уровень
  172. }
  173. // Прогресс -- возвращает прогресс уровня игрока
  174. func (сам *АренаАнгар) Прогресс() ИСтатПарам {
  175. return сам.progress
  176. }
  177. // ИгрокиОнлайн -- возвращает количество игроков онлайн
  178. func (сам *АренаАнгар) ИгрокиОнлайн() ИСтатПарам {
  179. return сам.игроковОнлайн
  180. }
  181. // СереброВсего -- возвращает объект всего серебра в ангаре
  182. func (сам *АренаАнгар) СереброВсего() ИСтатПарам {
  183. return сам.ресурсы.СереброВсего()
  184. }
  185. // СереброЗаработаноСессия -- возвращает объект серебра за сессию в ангаре
  186. func (сам *АренаАнгар) СереброЗаработаноСессия() ИСтатПарам {
  187. return сам.silverOnline
  188. }
  189. // СереброОбновить -- на основе фактического серебра -- обновляет выработанное серебро
  190. func (сам *АренаАнгар) СереброОбновить(silverFact int) {
  191. if сам.СереброВсего().Получ() == 0 { // Если запуск
  192. сам.СереброВсего().Уст(silverFact)
  193. return
  194. }
  195. if сам.СереброВсего().Получ() > silverFact { // Если потрачено серебро
  196. сам.СереброВсего().Уст(silverFact)
  197. return
  198. }
  199. if сам.СереброВсего().Получ() < silverFact { // Если заработано
  200. so := сам.silverOnline.Получ()
  201. sd := silverFact - сам.СереброВсего().Получ()
  202. сам.silverOnline.Уст(so + sd)
  203. }
  204. сам.СереброВсего().Уст(silverFact)
  205. }
  206. // База -- возвращает базу
  207. func (сам *АренаАнгар) База() ИБаза {
  208. return сам.словАрена["база"].(ИБаза)
  209. }
  210. /* Проверяет на исполнение конвоя
  211. func (сам *Ангар) конвойПроверить() {
  212. var (
  213. strOut string
  214. еслиНайдено bool
  215. lstAngar = сам.СписПолучить()
  216. )
  217. for _, strOut = range lstAngar {
  218. if strings.Contains(strOut, `>Конвой</span>`) {
  219. еслиНайдено = true
  220. break
  221. }
  222. }
  223. if !еслиНайдено {
  224. return
  225. }
  226. if !strings.Contains(strOut, `<a class="simple-but border gray mb1" href="convoy"><span><span>Конвой</span></span></a>`) {
  227. return
  228. }
  229. сам.конвой.UpdateLst()
  230. }
  231. */
  232. // Ищет в теле текста ангара серебро
  233. func (сам *АренаАнгар) сереброНайти() {
  234. // _mt.Println("\tAngarNet.findSilver()")
  235. lstAngar := сам.СписПолучить()
  236. var strOut string
  237. for _, strSilver := range lstAngar {
  238. if strings.Contains(strSilver, `<img title="Серебро" `) {
  239. strOut = strSilver
  240. break
  241. }
  242. }
  243. // Выделить топливо
  244. lstSilver := strings.Split(strOut, `<img title="Серебро" alt="Серебро" src="/images/icons/silver.png?2"/> `)
  245. strSilver := lstSilver[1]
  246. iSilver, err := strconv.Atoi(strSilver)
  247. if err != nil {
  248. // log._rintf("ERRO AngarNet.findSilver(): silver(%v) not number, err=\n\t%v\n", strSilver, err)
  249. return
  250. }
  251. сам.СереброВсего().Уст(iSilver)
  252. }
  253. // Ищет в теле текста ангара золото
  254. func (сам *АренаАнгар) золотоНайти() {
  255. var (
  256. lstAngar = сам.бот.Ангар().СписПолучить()
  257. strOut string
  258. еслиНайдено bool
  259. )
  260. for _, strGold := range lstAngar {
  261. if strings.Contains(strGold, `<img title="Золото" `) {
  262. strOut = strGold
  263. еслиНайдено = true
  264. break
  265. }
  266. }
  267. if !еслиНайдено {
  268. return
  269. }
  270. // Выделить топливо
  271. lstGold := strings.Split(strOut, `<img title="Золото" alt="Золото" src="/images/icons/gold.png?2"/> `)
  272. strGold := lstGold[1]
  273. iGold, err := strconv.Atoi(strGold)
  274. if err != nil {
  275. // log._rintf("ERRO AngarNet.findGold(): gold(%v) not number, err=\n\t%v\n", strGold, err)
  276. return
  277. }
  278. сам.бот.Ангар().Золото().Уст(iGold)
  279. }