Erinome Godville UI+
Erinome Godville UI+ — расширение для браузеров, изначально основанное на Godville UI+, но получившее уже заметное количество отличий и дополнительных возможностей от оригинала.
Тема на форуме в квартале мастеровых: Erinome Godville UI+ - браузерное расширение для Годвилля (Firefox, Chrome, Opera).
_
Информеры
Дополнение может отслеживать различные события в жизни героя и выводить уведомления о них. Уведомление производится миганием иконки вкладки, и меткой в верхнем правом углу страницы. Дополнительно доступны всплывающие уведомления и звуковое уведомление.
Пользовательские информеры
Пользовательские информеры позволяют настроить уведомления на произвольный набор событий в игре.
Каждый информер описывается одной строкой в формате:
Текст уведомления | набор условий | тип информера и уведомлений
Информер можно временно отключить, закомментировав его символом # в начале строки
Несколько условий объединяются логическими операторами && (логическое «И»), || (логическое «ИЛИ») и группируются скобками. Доступно логическое отрицание «НЕ» !true = false
Также имеются другие операторы:
| Операторы | Описание | Примеры | 
|---|---|---|
| ==, != <, <= >, >= | равенство и неравенство меньше и меньше или равно больше и больше или равно | 100 == 100 → истина "строка" != "другая строка" → истина 100 > 200 → ложь | 
| ~, ~* | регистрозависимое и регистронезависимое регулярное выражение, возвращает результат в виде массива | "здесь есть число 4 и буква Ё" ~ "число 4" → ["число 4"] "здесь есть число 4 и буква Ё" ~ "число (.*?) и" → ["число 4 и", "4"] | 
| A[x] | извлечение элемента номер x из массива A (отсчет x ведется с нуля) | ("здесь есть число 4 и буква Ё" ~ "число (.*?) и")[1] → "4" ("здесь есть число 4 и буква Ё" ~ "число (.*?) и")[5] → undefined | 
| +, - *, / | сложение и вычитание умножение и деление | 100 + 200 → 300 50 * "строка" → NaN | 
| +, - ! | преобразование строки к числу, изменение знака логическое отрицание | +"50" → 50 !"строка" → ложь | 
Набор условий считается выполненным и активирует информер, когда итоговый результат преобразуем к истине:
| Результат | Примеры | Описание | 
|---|---|---|
| ложь | 0, "", [] false, null undefined, NaN | ноль (как цифра), пустая строка и пустой массив специальные значения, которые могут принимать переменные и могут получиться в результате применения операторов | 
| истина | - | истиной считается всё, что не попадает под ложь :) | 
Тип информера кодируется определённым числом, определяемым как сумма указанных в таблице модификаторов.
| Код | Название | Описание | 
|---|---|---|
| 0 | стандартный информер | включается, когда условие активации информера выполняется, выключается - когда условие активации информера перестает выполняться | 
| 1 | неотключаемый информер | включается при выполнении условия активации информера, выключается - только когда пользователь кликнет на этот информер (или после перезагрузки страницы, когда условие перестает выполняться) | 
| 16 | тип: стандартное уведомление | мигание заголовком окна браузера и соответствующей вкладки, добавляет метку в углу страницы | 
| 32 | тип: всплывающее уведомление | отображается всплывающим окошком поверх всех окон | 
| 64 | тип: звуковое уведомление | звуковое оповещение согласно настройкам eGUI+ | 
Например, чтобы создать неотключаемый информер, уведомляющий миганием и всплывающим окном, необходимо указать тип: 49 (1+16+32).
Если модификаторы типа уведомления не указаны, то информер будет использовать набор уведомлений, выбранный для всех пользовательских информеров в общей таблице настроек информеров.
Переменные
Полный и актуальный перечень доступных переменных находится в файле FAQ на странице дополнения.
Примечание: с апреля 2016 года разработчиками игры было запрещено использовать в аддонах точные внутриигровые данные, поэтому начиная с версии 1.1.1.0 вся информация для переменных берется из общедоступных внешних источников, а некоторые значения, которые более недоступны в точном виде, теперь рассчитываются косвенно - следовательно, возможны разнообразные ошибки.
| Полный перечень переменных версии 1.1.2.0 | |||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Переменная | Описание | ||||||||||||||
| gv.health | здоровье героя | ||||||||||||||
| gv.healthMax | максимальное здоровье героя | ||||||||||||||
| gv.healthPrc | здоровье героя в процентах | ||||||||||||||
| gv.gold | количество золота у героя | ||||||||||||||
| gv.inventory | количество предметов в инвентаре | ||||||||||||||
| gv.inventoryMax | максимальное количество предметов в инвентаре | ||||||||||||||
| gv.inventoryPrc | количество предметов в процентах | ||||||||||||||
| gv.inventoryHealing | количество лечебных трофеев в инвентаре | ||||||||||||||
| gv.inventoryUnsellable | количество непродаваемых торговцам трофеев в инвентаре | ||||||||||||||
| gv.supplies | количество припасов в плавании | ||||||||||||||
| gv.suppliesMax | максимальное количество припасов в режиме плавания | ||||||||||||||
| gv.suppliesPrc | количество припасов в процентах | ||||||||||||||
| gv.mileStones | количество столбов до столицы в поле | ||||||||||||||
| gv.portDistance | расстояние до порта в режиме плавания | ||||||||||||||
| gv.godpower | количество праны | ||||||||||||||
| gv.godpowerMax | максимальное количество праны (может ошибаться у лавковладельцев) | ||||||||||||||
| gv.godpowerPrc | количество праны в процентах | ||||||||||||||
| gv.auraName | название ауры, если она есть | ||||||||||||||
| gv.auraDuration | оставшаяся длительность ауры, если она есть (в секундах, но округляется до целых минут) | ||||||||||||||
| gv.charges | количество зарядов | ||||||||||||||
| gv.nearestTown | название ближайшего города | ||||||||||||||
| gv.currentTown | название текущего города, если герой в нем, иначе - пустая строка | ||||||||||||||
| gv.hasTemple | герой имеет достроенный храм | ||||||||||||||
| gv.hasArk | герой имеет достроенный ковчег | ||||||||||||||
| gv.currentMonster | название монстра, если герой бьется с ним в поле, иначе - пустая строка | ||||||||||||||
| gv.lastNews | текст строки из Вестей | ||||||||||||||
| gv.lastDiary | текст последней строки из дневника | ||||||||||||||
| gv.lastDiaryVoice | текст последнего гласа другого бога из дневника (вернёт пустую строку, если в дневнике не видно ни одного чужого гласа) | ||||||||||||||
| gv.lastGuildChat | текст последних сообщений гильдчата (доступен только когда открыта и развернута вкладка гильдчата) | ||||||||||||||
| gv.questName | название квеста | ||||||||||||||
| gv.questProgress | прогресс выполнения квеста в процентах | ||||||||||||||
| gv.isGoingBack | герой идет из поля в город | ||||||||||||||
| gv.isGoingForth | герой идет из города в поле (экспериментально, может ошибаться!) | ||||||||||||||
| gv.isTrading | герой продает трофеи (экспериментально, может ошибаться!) | ||||||||||||||
| gv.dailyForecast | текст астропрогноза | ||||||||||||||
| gv.arenaAvailable | доступен поход на арену | ||||||||||||||
| gv.sparAvailable | доступен тренировочный бой | ||||||||||||||
| gv.dungeonAvailable | доступен поход в подземелье | ||||||||||||||
| gv.sailAvailable | доступен заплыв в море | ||||||||||||||
| gv.arenaSendDelay | время до доступности похода на арену (в секундах, но округляется до минут (равно 0, когда недоступно)) | ||||||||||||||
| gv.sparSendDelay | время до доступности тренировочного боя (в секундах, но округляется до минут (равно 0, когда недоступно)) | ||||||||||||||
| gv.dungeonSendDelay | время до доступности похода в подземелье (в секундах, но округляется до минут (равно 0, когда недоступно)) | ||||||||||||||
| gv.sailSendDelay | время до доступности заплыва в море (в секундах, но округляется до минут (равно 0, когда недоступно)) | ||||||||||||||
| gv.inFight | герой находится в боевом режиме | ||||||||||||||
| gv.inBossFight | герой находится в бою с босс-монстром (любым) или корованом | ||||||||||||||
| gv.inTown | герой находится в городе | ||||||||||||||
| gv.fightType | тип боевого режима, возможные варианты: 
 | ||||||||||||||
| gv.fightStep | номер шага в боевом режиме | ||||||||||||||
| gv.enemyHealth | суммарное здоровье противников в боевом режиме | ||||||||||||||
| gv.enemyHealthMax | максимальное суммарное здоровье противников в боевом режиме | ||||||||||||||
| gv.enemyHealthPrc | суммарное здоровье противников в процентах (имеет смысл для одиночных противников) | ||||||||||||||
| gv.enemyGold | количество золота у противника | ||||||||||||||
| gv.enemyCount | количество противников (имеет смысл для корованов) | ||||||||||||||
| gv.enemyAliveCount | количество живых противников (имеет смысл для корованов) | ||||||||||||||
| gv.enemyHasAbility("название способности") | проверяет, имеет ли противник указанную способность (имеет смысл для боссов) | ||||||||||||||
| gv.enemyAbilitiesCount | количество способностей у противника (имеет смысл для боссов) | ||||||||||||||
| gv.alliesHealth | суммарное здоровье союзников в боевом режиме | ||||||||||||||
| gv.alliesHealthMax | суммарный максимум здоровья союзников в боевом режиме | ||||||||||||||
| gv.alliesHealthPrc | суммарное здоровье союзников в процентах (фактически, не имеет смысла) | ||||||||||||||
| gv.alliesCount | количество союзников | ||||||||||||||
| gv.alliesAliveCount | количество живых союзников | ||||||||||||||
| gv.expTimeout | количество минут до окончания штрафа возложения золота в храме (или 10080, если данных нет) | ||||||||||||||
| gv.logTimeout | количество минут до гарантированного бревна в подземелье (или 10080, если данных нет) | ||||||||||||||
| gv.getSeconds | точное локальное время: секунды (0-59 | ||||||||||||||
| gv.getMinutes | точное локальное время: минуты (0-59) | ||||||||||||||
| gv.getHours | точное локальное время: часы (0-23) | ||||||||||||||
| gv.getDay | текущий день недели (1-7) | ||||||||||||||
| gv.voiceCooldown | время отката в секундах после гласа, который был услышан героем (уменьшается до 0) | ||||||||||||||
| gv.windowFocused | определяет, активна ли текущая вкладка браузера. | ||||||||||||||
Готовые примеры
| Здесь можно посмотреть примеры пользовательских информеров | 
|---|
| Мониторинг удачного стечения обстоятельств | 
| Скоро ZPG арена | gv.godpower >=50 && gv.getMinutes >=59 && gv.arenaAvailable Пора на ZPG арену | gv.godpower >=50 && gv.getMinutes < 2 && gv.arenaAvailable Кабак с подвалом! | gv.dungeonAvailable && gv.healthPrc>70 && gv.inTown && gv.inventoryUnsellable==gv.inventory Кабак с подвалом с распаковкой! | !gv.dungeonSendDelay && gv.godpower < 50 && gv.healthPrc>70 && gv.inTown && gv.inventoryHealing==gv.inventory Копать!(здоровье>65%,прана>=30%)| gv.healthPrc > 65 && gv.godpower >=30 && !gv.inTown && !gv.isTrading && !gv.isFishing && !gv.inFight && gv.currentMonster == "" Рыбалка! | gv.lastDiary ~* "отвлекает пираний, насадил на крючок|Подойдя к крутому берегу, бросил|Убедившись в отсутствии инспектора рыбнадзора в ближайших кустах|чтобы задобрить Ёрмунганда перед рыбалкой|Рыбалка — дело тонкое. Сломал|для рыбалки. Посмотрим, кто клюнет на|на берегу посмотреть, кто всплывёт|Настоящего рыбака|руку в воду по локоть|Cтоило бы накопать червей|А коль так, то и рыба должна повестись|Рыбалка в этих краях запрещена, но так даже|порыбачить. Лично я бы, правда|как я трачу на рыбалку|куда-то убежал. Прид|Крепкая вещица. Надеюсь, что улов оправдает|внеплановый рыбный день|такую рыбу, чтобы хоть раз не надо было врать|В качестве наживки попробую"|0 | 
| Мониторинг во время боя | 
| 
# Варианты от Евклиопы
Низкое здоровье на боссе с учетом праны и типа босса	|	gv.inFight && gv.fightType == "monster" && (gv.enemyHasAbility("бойкий") && gv.godpower < 25 && gv.health < 300 || gv.enemyHasAbility("бойкий") && gv.godpower >= 25 && gv.health < 150||!gv.enemyHasAbility("бойкий") && gv.godpower < 25 && gv.health < 150 )
Босс всё: на лучезарном с остатками праны или невысоком хп 	|	gv.inFight && gv.fightType == "monster" && gv.enemyHealth < 300 && (gv.godpower > 25 && (gv.enemyHasAbility("лучезарный") || gv.health < 180) || gv.enemyHasAbility("взрывной") && gv.healthPrc < 65)
№ Примеры от Servelll 
Риск нокаута героя (подзем)|gv.fightType=="monster" && gv.alliesCount==4 && (((gv.health - 1) <= ((gv.alliesHealthMax+gv.healthMax)/16 - 45 + 5*gv.enemyAbilitiesCount) && ((gv.alliesHealthMax+gv.healthMax)/16 - 45 + 5*gv.enemyAbilitiesCount) < 102) || ((gv.health - 1) <= 102 && ((gv.alliesHealthMax+gv.healthMax)/16 - 45 + 5*gv.enemyAbilitiesCount) >= 102))|1
Риск нокаута героя двойным ударом (подзем)|gv.fightType=="monster" && gv.alliesCount==4 && gv.enemyHasAbility("бойкий") && (((gv.health - 1) <= 2*((gv.alliesHealthMax+gv.healthMax)/16 - 45 + 5*gv.enemyAbilitiesCount) && ((gv.alliesHealthMax+gv.healthMax)/16 - 45 + 5*gv.enemyAbilitiesCount) < 102) || ((gv.health - 1) <= 204 && ((gv.alliesHealthMax+gv.healthMax)/16 - 45 + 5*gv.enemyAbilitiesCount) >= 102))|1
# приблизительно 2 удара осталось, если все живы
Взрывной при смерти!	|	gv.enemyHasAbility("взрывной") && gv.enemyHealth < gv.alliesHealthMax/5
Лучезарному скоро каюк	|	gv.enemyHasAbility("лучезарный") && gv.enemyHealth < gv.alliesHealthMax/5
# приблизительно 1 удар остался, если все живы. Срабатывает только если вкладка с игрой не активна
Вернись, пора рулить	|	!gv.windowFocused && gv.fightType == 'monster' && gv.enemyHealth < gv.alliesHealthMax/9	
 | 
| Пенсионные города | 
| Нижние Котлы (37%±12%) | gv.gold>2000 && !gv.inTown && gv.mileStones>=0 && gv.mileStones<=4 && gv.currentMonster=="" && !gv.isGoingBack && !(gv.dailyForecast~"ведут в Годвилль") БольшиеБодуны (58%±18%) | gv.gold>2000 && !gv.inTown && gv.mileStones>=23 && gv.mileStones<=31 && gv.currentMonster=="" && !gv.isGoingBack && !(gv.dailyForecast~"ведут в Годвилль") ЛосАдминос (49%±16%) | gv.gold>2000 && !gv.inTown && gv.mileStones>=46 && gv.mileStones<=51 && gv.currentMonster=="" && !gv.isGoingBack && !(gv.dailyForecast~"ведут в Годвилль") Пивнотаун (69%±20%) | gv.gold>2000 && !gv.inTown && gv.mileStones>=101 && gv.mileStones<=109 && gv.currentMonster=="" && !gv.isGoingBack && !(gv.dailyForecast~"ведут в Годвилль") МалыеСаппорт..(47%±15%) | gv.gold>2000 && !gv.inTown && gv.mileStones>=110 && gv.mileStones<=120 && gv.currentMonster=="" && !gv.isGoingBack && !(gv.dailyForecast~"ведут в Годвилль") Тризвездинск (51%±15%) | gv.gold>2000 && !gv.inTown && gv.mileStones>=152 && gv.mileStones<=160 && gv.currentMonster=="" && !gv.isGoingBack && !(gv.dailyForecast~"ведут в Годвилль") | 
| Анализ прогнозов | 
| Прогноз на активацию трофеев | gv.dailyForecast ~* "активируемые трофеи могут обходиться вдвое дешевле" Прогноз на распаковку 70% | gv.dailyForecast ~* "распаковывается в 70" Прогноз на дорогие трофеи | gv.dailyForecast ~* "Активируемые трофеи сегодня можно продать вдвое дороже обычного" Прогноз на пенс.день | gv.dailyForecast ~* "отказаться от пьянок" Прогноз на годвилль-день | gv.dailyForecast ~* "все дороги ведут в Годвилль" Прогноз на эффективные молитвы | gv.dailyForecast ~* "эффективность молитв в храмах" Прогноз на остроухость | gv.dailyForecast ~* "слышимость гласов|реагируют на божьи гласы" Прогноз на боссов | gv.dailyForecast ~* "выкопать|так и прут" -- День Рыбалки |gv.dailyForecast ~* "садиться с удочкой почаще" Прогноз на день долгого задания |gv.dailyForecast ~* "советуют героям не спешить и просто рубить монстров в своё удовольствие" Прогноз на день невозложения |gv.dailyForecast ~* "Сконвертировать золото в опыт храмовладельцам сегодня не удастся" День без прокачки умений |gv.dailyForecast ~* "тренеры ушли в астрал|прокачка умений не осуществляется" |