arena_angar.go 11 KB

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