angar.go 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307
  1. package angar
  2. import (
  3. "fmt"
  4. "log"
  5. "strconv"
  6. "strings"
  7. "time"
  8. "wartank/pkg/alias"
  9. "wartank/pkg/arena"
  10. "wartank/pkg/components/arena_net"
  11. . "wartank/pkg/kernel/kernel_types"
  12. . "wartank/server/lev0/types"
  13. "wartank/server/serv_bots/warbot/angar/base"
  14. "wartank/server/serv_bots/warbot/angar/battle"
  15. "wartank/server/serv_bots/warbot/angar/convoy"
  16. "wartank/server/serv_bots/warbot/angar/fuel_attack"
  17. "wartank/server/serv_bots/warbot/angar/masters"
  18. "wartank/server/serv_bots/warbot/angar/missions"
  19. "wartank/server/serv_bots/warbot/angar/net_stat"
  20. "wartank/server/serv_bots/warbot/angar/tank_params"
  21. "wartank/server/serv_bots/warbot/stat_resurs"
  22. "wartank/server/serv_bots/warbot/stat_tank/static_param"
  23. )
  24. /*
  25. Объект ангара приложения
  26. */
  27. // Ангар -- ангар для танка
  28. type Ангар struct {
  29. ИАрена
  30. слог ИЛоггер
  31. сеть ИАренаСеть
  32. бот ИБот
  33. уровень ИСтатПарам
  34. progress ИСтатПарам
  35. // топливо *fuel.Топливо
  36. игроковОнлайн ИСтатПарам
  37. silverOnline ИСтатПарам
  38. сетьТанкСтат *net_stat.NetStat
  39. танкПарам *tank_params.ТанкПараметры
  40. словАрена map[alias.АренаИмя]ИАрена
  41. ресурсы *stat_resurs.СтатРесурсы
  42. }
  43. // НовАнгар -- возвращает новый *Angar
  44. func НовАнгар(бот ИБот) (*Ангар, error) {
  45. танкПарам := tank_params.НовТанкПараметры(бот)
  46. сам := &Ангар{
  47. слог: бот.Сервер().Слог(),
  48. бот: бот,
  49. уровень: static_param.НовСтатПарам("level"),
  50. progress: static_param.НовСтатПарам("progress"),
  51. игроковОнлайн: static_param.НовСтатПарам("online"),
  52. silverOnline: static_param.НовСтатПарам("silver_online"),
  53. танкПарам: танкПарам,
  54. словАрена: make(map[alias.АренаИмя]ИАрена),
  55. }
  56. аренаКонф := arena.АренаКонфиг{
  57. Бот_: бот,
  58. АренаИмя_: "Ангар",
  59. СтрКонтроль_: "<title>Ангар</title>",
  60. ФнПуск_: сам.пуск,
  61. СтрУрл_: "https://wartank.ru/angar",
  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. сам.сетьТанкСтат = net_stat.NewNetStat(сам.бот)
  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. сам.слог.Ошибка("Ангар.Run(): in update ICountTime, ош=\n\t%w\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. }