arena_death.go 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. // package arena_death -- арена схватки (все против всех)
  2. package arena_death
  3. import (
  4. "time"
  5. . "wartank/app/lev0/types"
  6. "wartank/app/lev2/arena"
  7. "wartank/app/lev2/arena/arena_death/death_register"
  8. "wartank/app/lev2/arena/arena_death/death_wait"
  9. "wartank/app/lev2/arena/arena_death/death_worker"
  10. . "gitp78su.ipnodns.ru/svi/kern/krn/ktypes"
  11. )
  12. // АренаСхватка -- объект схватки
  13. type АренаСхватка struct {
  14. ИАрена
  15. конт ILocalCtx
  16. клиент ИХттпВоркер
  17. регистрация *death_register.СхваткаРегистрация // Регистратор на сражение
  18. ожидание *death_wait.СражениеОжидание // Ожидатель начала схватки
  19. действие *death_worker.СхваткаИсполнитель // Исполнитель схватки
  20. }
  21. // НовСражение -- возвращает новый *Battle
  22. func НовСхватка(конт IKernelCtx) *АренаСхватка {
  23. бот := конт.Get("бот").Val().(ИБот)
  24. сам := &АренаСхватка{
  25. конт: конт,
  26. клиент: бот.Сеть().ВебВоркер(),
  27. }
  28. аренаКонфиг := arena.АренаКонфиг{
  29. Конт_: конт,
  30. АренаИмя_: "Арена схватки",
  31. СтрКонтроль_: `<span>до начала `,
  32. ФнПуск_: сам.пуск,
  33. СтрУрл_: "https://wartank.ru/dm",
  34. }
  35. сам.ИАрена = arena.НовАрена(конт, аренаКонфиг)
  36. сам.регистрация = death_register.НовСхваткаРегистрация(конт)
  37. сам.ожидание = death_wait.НовСражениеОжидание(конт)
  38. сам.действие = death_worker.НовСхваткаИсполнитель(конт)
  39. // сам.shotTimeFull.Set(8000) // 8000 msec
  40. return сам
  41. }
  42. func (сам *АренаСхватка) Пуск() error {
  43. go сам.пуск()
  44. return nil
  45. }
  46. // запускает в работу сражение
  47. func (сам *АренаСхватка) пуск() {
  48. for {
  49. select {
  50. case <-сам.конт.Ctx().Done():
  51. return
  52. default:
  53. сам.регистрация.Зарегистрироваться()
  54. сам.ожидание.Ожидать()
  55. сам.действие.Пуск()
  56. time.Sleep(time.Second * 2) // Пауза между циклами, чтобы сервер не долбить запросами
  57. }
  58. }
  59. }
  60. // ЕслиНачало -- возвращает признак начала схватки (для браузера)
  61. func (сам *АренаСхватка) ЕслиНачало() ИСтатПарам {
  62. return сам.действие.Тревога()
  63. }