The Tale Extended

Расширение базового функционала в браузерной игре Сказка

目前為 2015-02-28 提交的版本,檢視 最新版本

您需要先安裝使用者腳本管理器擴展,如 TampermonkeyGreasemonkeyViolentmonkey 之後才能安裝該腳本。

You will need to install an extension such as Tampermonkey to install this script.

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyUserscripts 後才能安裝該腳本。

你需要先安裝一款使用者腳本管理器擴展,比如 Tampermonkey,才能安裝此腳本

您需要先安裝使用者腳本管理器擴充功能後才能安裝該腳本。

(我已經安裝了使用者腳本管理器,讓我安裝!)

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

(我已經安裝了使用者樣式管理器,讓我安裝!)

// ==UserScript==
// @name        The Tale Extended
// @description Расширение базового функционала в браузерной игре Сказка
// @author      standy
// @version     0.3.6.2
// @include     http://the-tale.org/game/
// @run-at      document-end
// @license     MIT License
// @namespace   the-tale-ext
// ==/UserScript==
// @require     http://code.jquery.com/jquery-1.11.1.min.js
// @grant       GM_addStyle

(function (window, undefined) {

	var css = ".sort{cursor:default;position:relative}.sort-down:after,.sort-up:after{content:'';display:inline-block;width:0;height:0;margin:8px -9px 0 1px;vertical-align:1px;border-right:4px solid transparent;border-left:4px solid transparent}.sort-up:after{border-top:4px solid #000}.sort-down:after{border-bottom:4px solid #000}.caption a,.caption a:visited,.caption a:hover{opacity:.5}.caption.new-messages a,.caption.new-messages a:link,.caption.new-messages a:visited,.caption.new-messages a:hover{opacity:1}.link-ajax{color:#08c;cursor:default;background-image:-webkit-linear-gradient(left,#08c,#08c 50%,transparent 50%);background-image:-moz-linear-gradient(left,#08c,#08c 50%,transparent 50%);background-image:linear-gradient(left,#08c,#08c 50%,transparent 50%);background-size:2px 1px;background-position:0 95%;background-repeat:repeat-x}.link-ajax:hover{color:#005580;background-image:-webkit-linear-gradient(left,#005580,#005580 50%,transparent 50%);background-image:-moz-linear-gradient(left,#005580,#005580 50%,transparent 50%);background-image:linear-gradient(left,#005580,#005580 50%,transparent 50%)}span[title],input[disabled]{cursor:default}#abilities-block .angel-ability{width:auto!important;display:inline-block}#abilities-block .angel-ability.pgf-ability-help{margin:0 50px}#abilities-block .dropdown{width:auto!important}.ext-controls{font-size:12px}.ext-control{margin-right:10px}.ext-control.link-ajax{background:0 0}.table-stats th,.table-stats td{padding:1px 10px 1px 0;cursor:default}.table-stats .stats-name{width:16px;padding-right:0}.table-stats .stats-sum,.table-stats .stats-count,.table-stats .stats-average{text-align:right}.table-stats .stats-bonus{text-align:left;padding-left:10px;padding-right:5px}.table-stats th.stats-bonus{text-align:center}.table-stats .stats-against{border-top:10px solid #f5fafa}.table-stats .stats-row-dmgSum td{font-weight:700}.stats-side{margin-bottom:10px}.stats-side.stats-loot{margin-top:20px;padding-top:10px;border-top:1px solid #ccc}.archive-log-list{margin-left:30px}.stats-archive{display:block}.stats-archive-act{margin-right:6px}.stats-archive-me{color:#005000}.stats-archive-enemy{color:darkred}.stats-log{margin-top:10px;max-height:500px;overflow-y:auto}.log-record-short{display:inline-block}.log-record-short .submessage{display:inline-block;cursor:default;padding:0 2px}.log-record-short .submessage:first-child{padding-left:4px}.log-record-short .submessage:last-child{padding-right:4px}.log-record-short:hover{background:#ddd}.stats-me .glyphicon{color:#005000}.stats-loot .glyphicon{color:darkgoldenrod}.stats-enemy .glyphicon{color:darkred}.stats .glyphicon{font-size:12px;opacity:.8}.stats .glyphicon.small{font-size:9px}.log-block .glyphicon{font-size:12px;opacity:.8}.log-block .glyphicon-heart{vertical-align:-1px}.log-block .glyphicon-heart-empty{vertical-align:-2px}.log-block .glyphicon.small{font-size:9px}.act.me{color:#000}.act.me .glyphicon{color:#005000}.act.enemy{color:#B90000}.act.enemy .glyphicon{color:darkred}.act-rest.me,.act-heal.me{color:#005000}.act-heal.enemy{color:darkred}.act-godheal.act .glyphicon,.act-godheal.act{color:darkmagenta;text-decoration:underline}.act-vamp.me .glyphicon,.act-vamp.me .vamp{color:#005000}.act-vamp.enemy .glyphicon,.act-vamp.enemy .vamp{color:darkred}.act-slow.me{color:#00008B}.act-coins.me .glyphicon,.act-coins.me,.act-coins.enemy{color:darkgoldenrod}.act-coins.enemy{text-decoration:line-through}.act-coins .glyphicon{font-size:9px}.act-pvpeff.me{color:dodgerblue}.act-pvpeff.enemy{color:dodgerblue;text-decoration:line-through}.act-pvpice.me,.act-pvpflame.enemy,.act-pvpfail.enemy{color:darkgreen}.act-pvpice.enemy,.act-pvpflame.me,.act-pvpfail.me{color:darkred}.act-pvpice .glyphicon,.act-pvpflame .glyphicon,.act-pvpfail .glyphicon{font-size:15px}.sub-icon .glyphicon{font-size:10px;vertical-align:sub;margin-left:-1px}.act.me .sub-icon .glyphicon{color:darkred}.act.enemy .sub-icon .glyphicon{color:#005000}.me .value{color:darkred}.enemy .value{color:red}.msg-dmg.me .value{color:darkred}.msg-dmg.enemy .value{color:red}.msg-godhit{color:darkmagenta}.msg-pickup .item{color:darkgoldenrod}.msg-empty,.msg-drop{color:darkgoldenrod;text-decoration:line-through}.submessage .energy{color:dodgerblue}.submessage .coins{color:darkgoldenrod}.submessage .level,.submessage .exp,.archive-content .level{color:darkviolet;text-decoration:underline}.group{position:relative;margin-bottom:2px}.group .group-toggle{cursor:default}.group .on-open{display:none}.group.open .on-open{display:block}.group.open .on-close{display:none}.group.open{margin:0}.group .glyphicon-time{font-size:9px}.group-time.average{color:#8a6d3b;text-decoration:underline}.group-time.bad{color:#a94442;text-decoration:underline}.group-title{cursor:default;margin-right:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.group-title:hover{background:#ddd}.action-icon .glyphicon{font-size:10px;opacity:.8}.action-icon.fight{color:darkred}.action-icon.fight-god{color:darkviolet}.action-icon.equip,.action-icon.trade{color:darkgoldenrod}.action-icon.quest,.action-icon.noeffect,.action-icon.idle,.action-icon.energy{color:dodgerblue}.action-icon.rest{color:#005000}.action-icon.dead{color:darkred}.action-icon.broken{color:red}.action-icon{display:inline-block;vertical-align:text-bottom;width:15px}.group-title.god .group-time{color:darkviolet;text-decoration:underline}.group-time{margin-right:3px}.group-controls{position:absolute;right:0;top:1px}.group-controls .glyphicon{position:absolute;right:0;top:0}.group-controls .glyphicon:hover{color:#000}.group-stats{margin-bottom:2px}.group-stats .stat{margin:0 0 0 4px}.group-stats .stat-me+.stat-enemy{margin-left:8px}.group-stats .stat-me{color:#005000}.group-stats .stat-enemy{color:darkred}.group-stats .stat-against{display:inline-block;width:35px;white-space:nowrap}.text-muted{color:#999}.text-primary{color:#428bca}.text-success{color:#3c763d}.text-info{color:#31708f}.text-warning{color:#8a6d3b}.text-danger{color:#a94442}.quest-icon-mini{float:none;display:inline-block;margin:0;vertical-align:bottom;width:16px;height:16px;background-size:32px 192px;background-image:url('http://static.the-tale.org/static/168/game/images/quests.png')}.quest-icon-mini.caravan{background-position:0 0}.quest-icon-mini.delivery{background-position:0 -16px}.quest-icon-mini.help{background-position:0 -32px}.quest-icon-mini.help_friend{background-position:0 -48px}.quest-icon-mini.hometown{background-position:0 -64px}.quest-icon-mini.hunt{background-position:0 -80px}.quest-icon-mini.interfere_enemy{background-position:0 -96px}.quest-icon-mini.collect_debt{background-position:0 -112px}.quest-icon-mini.spying{background-position:0 -128px}.quest-icon-mini.search_smith{background-position:0 -144px}.quest-icon-mini.no-quest{background-position:0 -160px}.quest-icon-mini.next-spending{background-position:0 -176px}.quest-icon-mini.pilgrimage{background-position:-16px -80px}#pgf-towns-container .reload{font-size:12px}body .table-noborder tbody,.table-noborder td,.table-noborder th{border:none}.table tbody tr.unhover:hover td,.table tbody tr.unhover:hover th{background:inherit}.table-hover-dark tbody tr:hover td,.table-hover-dark tbody tr:hover th{background:#ddd}.table-towns th.size,.table-towns td.size{padding-left:0;padding-right:0}.table-towns th.size{text-align:center}.table-towns td.size{text-align:right}.table-towns td{white-space:nowrap}#log-block-sets{height:auto}.sets-header{margin:10px 0 5px}.sets{margin:5px 0 0 20px}.sets-inline{display:inline-block}.note-block{color:#999}input.input-tiny{height:11px;width:60px;font-size:12px;margin:-2px 0 -3px;vertical-align:0}input.input-tiny-num{width:30px}.input-append .add-on{height:11px;line-height:11px;margin-top:-2px;margin-bottom:-3px;vertical-align:-1px}.sets label{display:inline;font-weight:400;margin-bottom:0}.sets .input-wrap-inline{display:inline-block}.sets .input-wrap{transition:opacity .2s}.sets .input-wrap.disabled{opacity:.7}@font-face{font-family:'Glyphicons Halflings';src:url('data:application/octet-stream;base64,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/zr+0wXdAAEAAAAAAAAAAAAAAAAAAACfAbgAKASwAAAEsAAABLAAAASwAGQEsAAABLAAAAKMAAAFGAAAAowAAAUYAAABsgAAAUYAAADZAAAA2QAAAKMAAAEEAAAASAAAAQQAAAFGAAAEsABkBLAAyAH0AAAEsP/yBLAAAASw//MEsAAABLAADgSwABcEsABkBLD/uASw/7gEsAAABLAAAASwAAAEsAAABLAAAASwAB0EsABqBLAAFwSwABcEsAAXBLAAZASwABoEsABkBLAAAQSwAGQEsAAEBLD/nASwAAAEsAABBLAABASwAAAEsAAEBLAAFwSwABcEsABkBLAAAASwAGQEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAQSwAGQEsADIBLAAAASwAAAEsAA1BLAAZASwAMgEsP+1BLAAIQSwAAAEsAAABLAAAASwAAAEsAAABLD/mwSwAAEEsAAABLAAAASwAJQEsAABBLAAdQSwAAAEsAAABLAAAASwAAAEsADIBLAAAASwAIgEsADIBLAAyASwAMgEsAAABLAAAASwASwEsABkBLAAuQSwARAEsAADBLAAAwSwAAMEsAADBLAAAwSwAAMEsAAABLAABASwAAQEsAAEBLAAAASwAAAEsADMBLAAaASwAAAEsAAABLAAIgSwABcEsAAABLAAAASwAG8EsP/DBLD/wwSw/58EsABkBLAAAASwAAAEsAAABLAAZASw/+IEsABGBLD/OgSwABIEsAAABLAAAQSwAS4EsAAABLAAAASw/5sEsABKBLAAFQSwAAAEsAAABLAACASw/5sEsABhBLAAAgSwAAUEsAAABLAABQSwAAUEsAAFBLAAAATEAAAEsABkAAAAAAAA/9gAUAA5AMgAAAEnAGQAAgACAAIAAgACAAIAAgAAAAAAAAAAAAAA2QAAAAAABAAAAAAAAAAAAAAAFwAAAAAAAAAAAAAAAAAAAGQAZAAAABAAAABkAGT/nP+c/5z/nP+c/5z/nP+cAAQAAP/y//IAZAB5AAAAKgAqACoAKgBmAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkATABSAFQAYQBqgHOAf4CNgKYAswC7gMsA0wD9ARyBWQGDgYiBkQG4gdMB7AH6AiUCTAJYAmUCgoKRAqICu4LVguQC+YMPgywDRwNdg2qDjoOYA6KDtwP2BBMEIgQ1hEOESYRlBIUEmAS2hMWE44UDBRiFLoVJhWSFmIW2hdMF4YX6Bg4GIIYvhksGZgZ/BpKGnwathrWGuQbFBswG04bhhu2G+Ab9BwOHFocpBzuHTIdwh4QHooe7B9GH6AfwB/iIAYgKiBGIG4gkCDyIWohxCJCIsgjfiOuJBQkkiTmJRQliCWcJbIl7iZaJogmviboJw4naifOKDgoZCi4KTYp1CpuKuwraCuyK/osRCyYLb4t5i5mLpIu+i86MBgwtjEmMX4x0jIIMrgzYDOQNBo0ojUENWY1vjYWNlw2tDcKN2A3rDf8OFA4tDkYOVg5ljnUOhg6XjqGOtY7LDt0O948QDxoPNw9RD2oPhA+SD68Pu4/MD+aQAJAYEC0QSJBiEHwQoJC+EOIQ/ZEPERgRJ4AAQAAANsAmwARAAAAAAACAAEAAgAWAAABAAEBAAAAAAAAAA8AugABAAAAAAATABIAAAADAAEECQAAAGoAEgADAAEECQABACgAfAADAAEECQACAA4ApAADAAEECQADAEwAsgADAAEECQAEADgA/gADAAEECQAFAHgBNgADAAEECQAGADYBrgADAAEECQAIABYB5AADAAEECQAJABYB+gADAAEECQALACQCEAADAAEECQAMACQCNAADAAEECQATACQCWAADAAEECQDIABYCfAADAAEECQDJADACknd3dy5nbHlwaGljb25zLmNvbQBDAG8AcAB5AHIAaQBnAGgAdAAgAKkAIAAyADAAMQAzACAAYgB5ACAASgBhAG4AIABLAG8AdgBhAHIAaQBrAC4AIABBAGwAbAAgAHIAaQBnAGgAdABzACAAcgBlAHMAZQByAHYAZQBkAC4ARwBMAFkAUABIAEkAQwBPAE4AUwAgAEgAYQBsAGYAbABpAG4AZwBzAFIAZQBnAHUAbABhAHIAMQAuADAAMAAxADsAVQBLAFcATgA7AEcATABZAFAASABJAEMATwBOAFMASABhAGwAZgBsAGkAbgBnAHMALQBSAGUAZwB1AGwAYQByAEcATABZAFAASABJAEMATwBOAFMAIABIAGEAbABmAGwAaQBuAGcAcwAgAFIAZQBnAHUAbABhAHIAVgBlAHIAcwBpAG8AbgAgADEALgAwADAAMQA7AFAAUwAgADAAMAAxAC4AMAAwADEAOwBoAG8AdABjAG8AbgB2ACAAMQAuADAALgA3ADAAOwBtAGEAawBlAG8AdABmAC4AbABpAGIAMgAuADUALgA1ADgAMwAyADkARwBMAFkAUABIAEkAQwBPAE4AUwBIAGEAbABmAGwAaQBuAGcAcwAtAFIAZQBnAHUAbABhAHIASgBhAG4AIABLAG8AdgBhAHIAaQBrAEoAYQBuACAASwBvAHYAYQByAGkAawB3AHcAdwAuAGcAbAB5AHAAaABpAGMAbwBuAHMALgBjAG8AbQB3AHcAdwAuAGcAbAB5AHAAaABpAGMAbwBuAHMALgBjAG8AbQB3AHcAdwAuAGcAbAB5AHAAaABpAGMAbwBuAHMALgBjAG8AbQBXAGUAYgBmAG8AbgB0ACAAMQAuADAATQBvAG4AIABKAGEAbgAgADIANwAgADAAOAA6ADAAMQA6ADMANAAgADIAMAAxADQAAgAAAAAAAP+1ADIAAAAAAAAAAAAAAAAAAAAAAAAAAADbAAABAgEDAAMADQAOAQQBBQEGAQcBCAEJAQoBCwEMAQ0BDgEPARABEQESAO8BEwEUARUBFgEXARgBGQEaARsBHAEdAR4BHwEgASEBIgEjASQBJQEmAScBKAEpASoBKwEsAS0BLgEvATABMQEyATMBNAE1ATYBNwE4ATkBOgE7ATwBPQE+AT8BQAFBAUIBQwFEAUUBRgFHAUgBSQFKAUsBTAFNAU4BTwFQAVEBUgFTAVQBVQFWAVcBWAFZAVoBWwFcAV0BXgFfAWABYQFiAWMBZAFlAWYBZwFoAWkBagFrAWwBbQFuAW8BcAFxAXIBcwF0AXUBdgF3AXgBeQF6AXsBfAF9AX4BfwGAAYEBggGDAYQBhQGGAYcBiAGJAYoBiwGMAY0BjgGPAZABkQGSAZMBlAGVAZYBlwGYAZkBmgGbAZwBnQGeAZ8BoAGhAaIBowGkAaUBpgGnAagBqQGqAasBrAGtAa4BrwGwAbEBsgGzAbQBtQG2AbcBuAG5AboBuwG8Ab0BvgG/AcABwQHCAcMBxAHFAcYBxwHIAckBygHLAcwBzQHOAc8B0AHRAdIB0wHUAdUB1gHXBmdseXBoMQd1bmkwMDBEB3VuaTAwQTAHdW5pMjAwMAd1bmkyMDAxB3VuaTIwMDIHdW5pMjAwMwd1bmkyMDA0B3VuaTIwMDUHdW5pMjAwNgd1bmkyMDA3B3VuaTIwMDgHdW5pMjAwOQd1bmkyMDBBB3VuaTIwMkYHdW5pMjA1RgRFdXJvB3VuaTI1RkMHdW5pMjYwMQd1bmkyNzA5B3VuaTI3MEYHdW5pRTAwMQd1bmlFMDAyB3VuaUUwMDMHdW5pRTAwNQd1bmlFMDA2B3VuaUUwMDcHdW5pRTAwOAd1bmlFMDA5B3VuaUUwMTAHdW5pRTAxMQd1bmlFMDEyB3VuaUUwMTMHdW5pRTAxNAd1bmlFMDE1B3VuaUUwMTYHdW5pRTAxNwd1bmlFMDE4B3VuaUUwMTkHdW5pRTAyMAd1bmlFMDIxB3VuaUUwMjIHdW5pRTAyMwd1bmlFMDI0B3VuaUUwMjUHdW5pRTAyNgd1bmlFMDI3B3VuaUUwMjgHdW5pRTAyOQd1bmlFMDMwB3VuaUUwMzEHdW5pRTAzMgd1bmlFMDMzB3VuaUUwMzQHdW5pRTAzNQd1bmlFMDM2B3VuaUUwMzcHdW5pRTAzOAd1bmlFMDM5B3VuaUUwNDAHdW5pRTA0MQd1bmlFMDQyB3VuaUUwNDMHdW5pRTA0NAd1bmlFMDQ1B3VuaUUwNDYHdW5pRTA0Nwd1bmlFMDQ4B3VuaUUwNDkHdW5pRTA1MAd1bmlFMDUxB3VuaUUwNTIHdW5pRTA1Mwd1bmlFMDU0B3VuaUUwNTUHdW5pRTA1Ngd1bmlFMDU3B3VuaUUwNTgHdW5pRTA1OQd1bmlFMDYwB3VuaUUwNjIHdW5pRTA2Mwd1bmlFMDY0B3VuaUUwNjUHdW5pRTA2Ngd1bmlFMDY3B3VuaUUwNjgHdW5pRTA2OQd1bmlFMDcwB3VuaUUwNzEHdW5pRTA3Mgd1bmlFMDczB3VuaUUwNzQHdW5pRTA3NQd1bmlFMDc2B3VuaUUwNzcHdW5pRTA3OAd1bmlFMDc5B3VuaUUwODAHdW5pRTA4MQd1bmlFMDgyB3VuaUUwODMHdW5pRTA4NAd1bmlFMDg1B3VuaUUwODYHdW5pRTA4Nwd1bmlFMDg4B3VuaUUwODkHdW5pRTA5MAd1bmlFMDkxB3VuaUUwOTIHdW5pRTA5Mwd1bmlFMDk0B3VuaUUwOTUHdW5pRTA5Ngd1bmlFMDk3B3VuaUUxMDEHdW5pRTEwMgd1bmlFMTAzB3VuaUUxMDQHdW5pRTEwNQd1bmlFMTA2B3VuaUUxMDcHdW5pRTEwOAd1bmlFMTA5B3VuaUUxMTAHdW5pRTExMQd1bmlFMTEyB3VuaUUxMTMHdW5pRTExNAd1bmlFMTE1B3VuaUUxMTYHdW5pRTExNwd1bmlFMTE4B3VuaUUxMTkHdW5pRTEyMAd1bmlFMTIxB3VuaUUxMjIHdW5pRTEyMwd1bmlFMTI0B3VuaUUxMjUHdW5pRTEyNgd1bmlFMTI3B3VuaUUxMjgHdW5pRTEyOQd1bmlFMTMwB3VuaUUxMzEHdW5pRTEzMgd1bmlFMTMzB3VuaUUxMzQHdW5pRTEzNQd1bmlFMTM2B3VuaUUxMzcHdW5pRTEzOAd1bmlFMTM5B3VuaUUxNDAHdW5pRTE0MQd1bmlFMTQyB3VuaUUxNDMHdW5pRTE0NAd1bmlFMTQ1B3VuaUUxNDYHdW5pRTE0OAd1bmlFMTQ5B3VuaUUxNTAHdW5pRTE1MQd1bmlFMTUyB3VuaUUxNTMHdW5pRTE1NAd1bmlFMTU1B3VuaUUxNTYHdW5pRTE1Nwd1bmlFMTU4B3VuaUUxNTkHdW5pRTE2MAd1bmlFMTYxB3VuaUUxNjIHdW5pRTE2Mwd1bmlFMTY0B3VuaUUxNjUHdW5pRTE2Ngd1bmlFMTY3B3VuaUUxNjgHdW5pRTE2OQd1bmlFMTcwB3VuaUUxNzEHdW5pRTE3Mgd1bmlFMTczB3VuaUUxNzQHdW5pRTE3NQd1bmlFMTc2B3VuaUUxNzcHdW5pRTE3OAd1bmlFMTc5B3VuaUUxODAHdW5pRTE4MQd1bmlFMTgyB3VuaUUxODMHdW5pRTE4NAd1bmlFMTg1B3VuaUUxODYHdW5pRTE4Nwd1bmlFMTg4B3VuaUUxODkHdW5pRTE5MAd1bmlFMTkxB3VuaUUxOTIHdW5pRTE5Mwd1bmlFMTk0B3VuaUUxOTUHdW5pRTE5Nwd1bmlFMTk4B3VuaUUxOTkHdW5pRTIwMLgB/4WwAY0AS7AIUFixAQGOWbFGBitYIbAQWUuwFFJYIbCAWR2wBitcWFmwFCsAAAABUuZYrgAA') format('truetype')}.glyphicon{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings';font-style:normal;font-weight:400;line-height:1;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased}.glyphicon-asterisk:before{content:'\\2a'}.glyphicon-plus:before{content:'\\2b'}.glyphicon-euro:before{content:'\\20ac'}.glyphicon-minus:before{content:'\\2212'}.glyphicon-cloud:before{content:'\\2601'}.glyphicon-envelope:before{content:'\\2709'}.glyphicon-pencil:before{content:'\\270f'}.glyphicon-glass:before{content:'\\e001'}.glyphicon-music:before{content:'\\e002'}.glyphicon-search:before{content:'\\e003'}.glyphicon-heart:before{content:'\\e005'}.glyphicon-star:before{content:'\\e006'}.glyphicon-star-empty:before{content:'\\e007'}.glyphicon-user:before{content:'\\e008'}.glyphicon-film:before{content:'\\e009'}.glyphicon-th-large:before{content:'\\e010'}.glyphicon-th:before{content:'\\e011'}.glyphicon-th-list:before{content:'\\e012'}.glyphicon-ok:before{content:'\\e013'}.glyphicon-remove:before{content:'\\e014'}.glyphicon-zoom-in:before{content:'\\e015'}.glyphicon-zoom-out:before{content:'\\e016'}.glyphicon-off:before{content:'\\e017'}.glyphicon-signal:before{content:'\\e018'}.glyphicon-cog:before{content:'\\e019'}.glyphicon-trash:before{content:'\\e020'}.glyphicon-home:before{content:'\\e021'}.glyphicon-file:before{content:'\\e022'}.glyphicon-time:before{content:'\\e023'}.glyphicon-road:before{content:'\\e024'}.glyphicon-download-alt:before{content:'\\e025'}.glyphicon-download:before{content:'\\e026'}.glyphicon-upload:before{content:'\\e027'}.glyphicon-inbox:before{content:'\\e028'}.glyphicon-play-circle:before{content:'\\e029'}.glyphicon-repeat:before{content:'\\e030'}.glyphicon-refresh:before{content:'\\e031'}.glyphicon-list-alt:before{content:'\\e032'}.glyphicon-lock:before{content:'\\e033'}.glyphicon-flag:before{content:'\\e034'}.glyphicon-headphones:before{content:'\\e035'}.glyphicon-volume-off:before{content:'\\e036'}.glyphicon-volume-down:before{content:'\\e037'}.glyphicon-volume-up:before{content:'\\e038'}.glyphicon-qrcode:before{content:'\\e039'}.glyphicon-barcode:before{content:'\\e040'}.glyphicon-tag:before{content:'\\e041'}.glyphicon-tags:before{content:'\\e042'}.glyphicon-book:before{content:'\\e043'}.glyphicon-bookmark:before{content:'\\e044'}.glyphicon-print:before{content:'\\e045'}.glyphicon-camera:before{content:'\\e046'}.glyphicon-font:before{content:'\\e047'}.glyphicon-bold:before{content:'\\e048'}.glyphicon-italic:before{content:'\\e049'}.glyphicon-text-height:before{content:'\\e050'}.glyphicon-text-width:before{content:'\\e051'}.glyphicon-align-left:before{content:'\\e052'}.glyphicon-align-center:before{content:'\\e053'}.glyphicon-align-right:before{content:'\\e054'}.glyphicon-align-justify:before{content:'\\e055'}.glyphicon-list:before{content:'\\e056'}.glyphicon-indent-left:before{content:'\\e057'}.glyphicon-indent-right:before{content:'\\e058'}.glyphicon-facetime-video:before{content:'\\e059'}.glyphicon-picture:before{content:'\\e060'}.glyphicon-map-marker:before{content:'\\e062'}.glyphicon-adjust:before{content:'\\e063'}.glyphicon-tint:before{content:'\\e064'}.glyphicon-edit:before{content:'\\e065'}.glyphicon-share:before{content:'\\e066'}.glyphicon-check:before{content:'\\e067'}.glyphicon-move:before{content:'\\e068'}.glyphicon-step-backward:before{content:'\\e069'}.glyphicon-fast-backward:before{content:'\\e070'}.glyphicon-backward:before{content:'\\e071'}.glyphicon-play:before{content:'\\e072'}.glyphicon-pause:before{content:'\\e073'}.glyphicon-stop:before{content:'\\e074'}.glyphicon-forward:before{content:'\\e075'}.glyphicon-fast-forward:before{content:'\\e076'}.glyphicon-step-forward:before{content:'\\e077'}.glyphicon-eject:before{content:'\\e078'}.glyphicon-chevron-left:before{content:'\\e079'}.glyphicon-chevron-right:before{content:'\\e080'}.glyphicon-plus-sign:before{content:'\\e081'}.glyphicon-minus-sign:before{content:'\\e082'}.glyphicon-remove-sign:before{content:'\\e083'}.glyphicon-ok-sign:before{content:'\\e084'}.glyphicon-question-sign:before{content:'\\e085'}.glyphicon-info-sign:before{content:'\\e086'}.glyphicon-screenshot:before{content:'\\e087'}.glyphicon-remove-circle:before{content:'\\e088'}.glyphicon-ok-circle:before{content:'\\e089'}.glyphicon-ban-circle:before{content:'\\e090'}.glyphicon-arrow-left:before{content:'\\e091'}.glyphicon-arrow-right:before{content:'\\e092'}.glyphicon-arrow-up:before{content:'\\e093'}.glyphicon-arrow-down:before{content:'\\e094'}.glyphicon-share-alt:before{content:'\\e095'}.glyphicon-resize-full:before{content:'\\e096'}.glyphicon-resize-small:before{content:'\\e097'}.glyphicon-exclamation-sign:before{content:'\\e101'}.glyphicon-gift:before{content:'\\e102'}.glyphicon-leaf:before{content:'\\e103'}.glyphicon-fire:before{content:'\\e104'}.glyphicon-eye-open:before{content:'\\e105'}.glyphicon-eye-close:before{content:'\\e106'}.glyphicon-warning-sign:before{content:'\\e107'}.glyphicon-plane:before{content:'\\e108'}.glyphicon-calendar:before{content:'\\e109'}.glyphicon-random:before{content:'\\e110'}.glyphicon-comment:before{content:'\\e111'}.glyphicon-magnet:before{content:'\\e112'}.glyphicon-chevron-up:before{content:'\\e113'}.glyphicon-chevron-down:before{content:'\\e114'}.glyphicon-retweet:before{content:'\\e115'}.glyphicon-shopping-cart:before{content:'\\e116'}.glyphicon-folder-close:before{content:'\\e117'}.glyphicon-folder-open:before{content:'\\e118'}.glyphicon-resize-vertical:before{content:'\\e119'}.glyphicon-resize-horizontal:before{content:'\\e120'}.glyphicon-hdd:before{content:'\\e121'}.glyphicon-bullhorn:before{content:'\\e122'}.glyphicon-bell:before{content:'\\e123'}.glyphicon-certificate:before{content:'\\e124'}.glyphicon-thumbs-up:before{content:'\\e125'}.glyphicon-thumbs-down:before{content:'\\e126'}.glyphicon-hand-right:before{content:'\\e127'}.glyphicon-hand-left:before{content:'\\e128'}.glyphicon-hand-up:before{content:'\\e129'}.glyphicon-hand-down:before{content:'\\e130'}.glyphicon-circle-arrow-right:before{content:'\\e131'}.glyphicon-circle-arrow-left:before{content:'\\e132'}.glyphicon-circle-arrow-up:before{content:'\\e133'}.glyphicon-circle-arrow-down:before{content:'\\e134'}.glyphicon-globe:before{content:'\\e135'}.glyphicon-wrench:before{content:'\\e136'}.glyphicon-tasks:before{content:'\\e137'}.glyphicon-filter:before{content:'\\e138'}.glyphicon-briefcase:before{content:'\\e139'}.glyphicon-fullscreen:before{content:'\\e140'}.glyphicon-dashboard:before{content:'\\e141'}.glyphicon-paperclip:before{content:'\\e142'}.glyphicon-heart-empty:before{content:'\\e143'}.glyphicon-link:before{content:'\\e144'}.glyphicon-phone:before{content:'\\e145'}.glyphicon-pushpin:before{content:'\\e146'}.glyphicon-usd:before{content:'\\e148'}.glyphicon-gbp:before{content:'\\e149'}.glyphicon-sort:before{content:'\\e150'}.glyphicon-sort-by-alphabet:before{content:'\\e151'}.glyphicon-sort-by-alphabet-alt:before{content:'\\e152'}.glyphicon-sort-by-order:before{content:'\\e153'}.glyphicon-sort-by-order-alt:before{content:'\\e154'}.glyphicon-sort-by-attributes:before{content:'\\e155'}.glyphicon-sort-by-attributes-alt:before{content:'\\e156'}.glyphicon-unchecked:before{content:'\\e157'}.glyphicon-expand:before{content:'\\e158'}.glyphicon-collapse-down:before{content:'\\e159'}.glyphicon-collapse-up:before{content:'\\e160'}.glyphicon-log-in:before{content:'\\e161'}.glyphicon-flash:before{content:'\\e162'}.glyphicon-log-out:before{content:'\\e163'}.glyphicon-new-window:before{content:'\\e164'}.glyphicon-record:before{content:'\\e165'}.glyphicon-save:before{content:'\\e166'}.glyphicon-open:before{content:'\\e167'}.glyphicon-saved:before{content:'\\e168'}.glyphicon-import:before{content:'\\e169'}.glyphicon-export:before{content:'\\e170'}.glyphicon-send:before{content:'\\e171'}.glyphicon-floppy-disk:before{content:'\\e172'}.glyphicon-floppy-saved:before{content:'\\e173'}.glyphicon-floppy-remove:before{content:'\\e174'}.glyphicon-floppy-save:before{content:'\\e175'}.glyphicon-floppy-open:before{content:'\\e176'}.glyphicon-credit-card:before{content:'\\e177'}.glyphicon-transfer:before{content:'\\e178'}.glyphicon-cutlery:before{content:'\\e179'}.glyphicon-header:before{content:'\\e180'}.glyphicon-compressed:before{content:'\\e181'}.glyphicon-earphone:before{content:'\\e182'}.glyphicon-phone-alt:before{content:'\\e183'}.glyphicon-tower:before{content:'\\e184'}.glyphicon-stats:before{content:'\\e185'}.glyphicon-sd-video:before{content:'\\e186'}.glyphicon-hd-video:before{content:'\\e187'}.glyphicon-subtitles:before{content:'\\e188'}.glyphicon-sound-stereo:before{content:'\\e189'}.glyphicon-sound-dolby:before{content:'\\e190'}.glyphicon-sound-5-1:before{content:'\\e191'}.glyphicon-sound-6-1:before{content:'\\e192'}.glyphicon-sound-7-1:before{content:'\\e193'}.glyphicon-copyright-mark:before{content:'\\e194'}.glyphicon-registration-mark:before{content:'\\e195'}.glyphicon-cloud-download:before{content:'\\e197'}.glyphicon-cloud-upload:before{content:'\\e198'}.glyphicon-tree-conifer:before{content:'\\e199'}.glyphicon-tree-deciduous:before{content:'\\e200'}";

	if (typeof GM_addStyle != "undefined") {
		GM_addStyle(css);
	} else if (typeof PRO_addStyle != "undefined") {
		PRO_addStyle(css);
	} else if (typeof addStyle != "undefined") {
		addStyle(css);
	} else {
		var node = document.createElement("style");
		node.type = "text/css";
		node.appendChild(document.createTextNode(css));
		var heads = document.getElementsByTagName("head");
		if (heads.length > 0) {
			heads[0].appendChild(node);
		} else {
			document.documentElement.appendChild(node);
		}
	}

	var $ = window.$;
	var jQuery = window.$;
	var pgf = window.pgf;

	window.ext = (function (_ext) {
		"use strict";

//if (window.API_CLIENT > 'the_tale-v0.3.15.8') return;
setTimeout(function() {
$(document).on('ajaxSuccess.ext', function(event, XMLHttpRequest, setting, result) {
	"use strict";
	if (setting.url.indexOf('/game/api/info?api_client=') === 0) {
		var game_data = result.data;

		try {
			_ext.heroName = game_data.account.hero.base.name;
			_ext.map_version = game_data.map_version;
		} catch(e) {}


		if (!_ext.preloadDone) {
//			$(document).trigger(pgf.game.events.DATA_REFRESHED, game_data);
			_ext.publish('preload', game_data);
		}
		_ext.preloadDone = 1;

		if (!game_data.account.is_old) {
			_ext.publish('load', game_data);
			$('.ext-wait').hide();
			$(document).off('ajaxSuccess.ext');
			delete _ext.preloadDone;
		}
	}
});
}, 15000)

_ext.const = {
	MAX_LOG_LENGTH: 1000,
	MAX_ARCHIVE_LENGTH: 2000,
	FIGHT_START:  ['fight'],
	FIGHT:        ['hit', 'might', 'fire', 'poisoncloud', 'vamp', 'stunHit', 'crit', 'flame', 'poison', 'slow', 'mush', 'speed', 'ue', 'eva', 'stun', 'heal'],
	FIGHT_VALUES: ['hit', 'might', 'fire',                'vamp', 'stunHit', 'crit', 'flame', 'poison',                                               'heal'],
	FIGHT_COUNTS: [                        'poisoncloud',                                               'slow', 'mush', 'speed', 'ue', 'eva', 'stun'        ],
	DMG:          ['hit', 'might', 'fire', 'poisoncloud', 'vamp', 'stunHit', 'crit'                                                                         ],
	DOT:          [                                                                  'flame', 'poison'                                                      ],
	DEBUFF:       [                                                                                     'slow'                                              ],
	BUFF:         [                                                                                             'mush', 'speed', 'ue'                       ],
	ACTIVE:       ['hit', 'might', 'fire', 'poisoncloud', 'vamp', 'stunHit',                                    'mush'         , 'ue'                       ],
	PASSIVE:      [                                                          'crit', 'flame', 'poison', 'slow',         'speed',       'eva', 'stun', 'heal'],

	SUM_TO_MAIN: {flame: 'fire', poison: 'poisoncloud', crit: 'hit'},
	LOOT: ['pickup', 'empty', 'drop'],
	REST: ['rest'],
	SHORT: ['hit', 'might', 'fire', 'flame', 'poison', 'vamp', 'slow', 'poisoncloud', 'mush', 'ue', 'eva', 'heal', 'godheal', 'rest', 'coins', 'speed', 'stunHit', 'stun', 'pvpeff', 'pvpice', 'pvpflame', 'pvpfail'],
	ACTION_TYPE_NAMES: {
		0:  'idle',      //безделие
		1:  'quest',     //задание
		2:  'walk',      //путешествие между городами
		3:  'fight',     //сражение 1x1 с монстром
		4:  'dead',      //воскрешение
		5:  'city',      //действия в городе
		6:  'rest',      //отдых
		7:  'equip',     //экипировка
		8:  'trade',     //торговля
		9:  'nearcity',  //путешествие около города
		10: 'energy',    //восстановление энергии
		11: 'noeffect',  //действие без эффекта на игру
		12: 'proxy',     //прокси-действия для взаимодействия героев
		13: 'pvp',       //PvP 1x1
		14: 'test'       //проверочное действие
	},
	ACTION_TYPE_TEXTS: {
		idle:       'безделие',
		quest:      'задание',
		walk:       'путешествие между городами',
		fight:      'сражение 1x1 с монстром',
		dead:       'воскрешение',
		city:       'действия в городе',
		rest:       'отдых',
		equip:      'экипировка',
		trade:      'торговля',
		nearcity:   'путешествие около города',
		energy:     'восстановление энергии',
		noeffect:   'действие без эффекта на игру',
		proxy:      'прокси-действия для взаимодействия героев',
		pvp:        'PvP 1x1',
		undefined:  'неизвестное действие',
		broken:     'неразобранное действие'
	},
	ACTION_TYPE_ICONS: {
		idle:        '<span class="glyphicon glyphicon-home"></span>',
		quest:       '<span class="glyphicon glyphicon-globe"></span>',
		walk:        '<span class="glyphicon glyphicon-road"></span>',
		fight:       '<span class="glyphicon glyphicon-leaf"></span>',
		dead:        '<span class="glyphicon glyphicon-remove"></span>',
		city:        '<span class="glyphicon glyphicon-home"></span>',
		rest:        '<span class="glyphicon glyphicon-heart-empty"></span>',
		equip:       '<span class="glyphicon glyphicon-collapse-down"></span>',
		trade:       '<span class="glyphicon glyphicon-copyright-mark"></span>',
		nearcity:    '<span class="glyphicon glyphicon-globe"></span>',
		energy:      '<span class="glyphicon glyphicon-flash"></span>',
		noeffect:    '<span class="glyphicon glyphicon-music"></span>',
		broken:      '<span class="glyphicon glyphicon-ban-circle"></span>'
	},
	ERROR_CODES: {
		1: 'Неполное действие',
		2: 'Не найдено начало боя',
		3: 'Не найден конец боя',
		4: 'Дыра в середине действия',
		5: 'Запись обрывается'
	},
	ICONS: {
		hit:        '<span class="glyphicon glyphicon-leaf"></span>',
		crit:       '<span class="glyphicon glyphicon-star"></span>',
		might:      '<span class="glyphicon glyphicon-tower"></span>',
		fire:       '<span class="glyphicon glyphicon-fire"></span>',
		flame:      '<span class="glyphicon glyphicon-fire small"></span>',
		poisoncloud:'<span class="glyphicon glyphicon-tint"></span>',
		poison:     '<span class="glyphicon glyphicon-tint small"></span>',
		vamp:       '<span class="glyphicon glyphicon-cutlery"></span>',

		ue:         '<span class="glyphicon glyphicon-refresh"></span> ',
		eva:        '<span class="glyphicon glyphicon-transfer"></span> ',
		slow:       '<span class="glyphicon glyphicon-link"></span>',
		mush:       '<span class="glyphicon glyphicon-arrow-up"></span>',
		speed:      '<span class="glyphicon glyphicon-forward"></span>',

		stunHit:    '<span class="glyphicon glyphicon-step-forward"></span>',
		stun:       '<span class="glyphicon glyphicon-bell"></span>',

		rest:       '<span class="glyphicon glyphicon-heart-empty"></span>',
		heal:       '<span class="glyphicon glyphicon-heart"></span>',

		dmgSum:    '<span class="glyphicon glyphicon-asterisk"></span>',

		godheal:    '<span class="glyphicon glyphicon-heart-empty"></span>',
		coins:      '<span class="glyphicon glyphicon-copyright-mark"></span>',

		pickup:    '<span class="glyphicon glyphicon-ok-circle"></span>',
		empty:     '<span class="glyphicon glyphicon-remove-circle"></span>',
		drop:      '<span class="glyphicon glyphicon-ban-circle"></span>',

		pvpeff:     '<span class="glyphicon glyphicon-flash"></span>',
		pvpice:     '<span class="glyphicon glyphicon-cloud-upload"></span>',
		pvpflame:   '<span class="glyphicon glyphicon-cloud-download"></span>',
		pvpfail:    '<span class="glyphicon glyphicon-cloud"></span>'
	},
	ACTION_TRANSLATE: {
		hit: 'Удар',
		crit: 'Критический удар',
		stunHit: 'Разбег-толчок',
		stun: 'Шок',
		might: 'Тяжёлый удар',
		slow: 'Заморозка',
		speed: 'Ускорение',
		fire: 'Шар огня',
		flame: 'Пламя',
		mush: 'Волшебный гриб',
		ue: 'Шаг в сторону',
		eva: 'Увернулся',
		poisoncloud: 'Ядовитое облако',
		poison: 'Отравление',
		vamp: 'Удар вампира',
		heal: 'Регенерация',
		dmgSum: 'Всего'
	},
	MOBS: [null,"олень","одичавшая одежда","осы","хищный кустик","кабан-секач","бродячий дуб","волк","дух леса","оскорблённая эльфийка","блюститель природы","медведь","аристократ","единорог","призрачный волк","астральный охотник","головастик","домашний поползень","одичавшие светлячки","ползун","пиявка","гигантская росянка","сбежавший эксперимент","слизь","гидра","щупальце","химический мусорник","упырь","кикимора","бесхозный голем","охотник за реагентами","мутировавший гоблин","василиск","ожившее пугало","хищный хомяк","борец за справедливость","саранча","маньяк-извращенец","карточный шулер","богомол","благородный разбойник","одержимый колдун","механический дракончик","дварф-изгнанник","неистовый сектант","механический голем","убийца","полоумный маг","шакал","скорпион","налётчик","огненная лиса","орк-изгнанник","скарабей","гремучая змея","саламандра","пустынный дракончик","джинн","берсерк","смерч","заблудший шаман","шайтан","крыса","бандит","призрак","неупокоенный","гремлин","подыльник","странствующий рыцарь","нага","охотник за головами","суккуб","вирика","див","додо","ангиак","бхут","гвиллион","вилах","вендиго","галд","ачери","земляная даппи","огненная даппи","анчутка","жихарь","йиена","мара","боец Серого Ордена","спятивший лорд","волколак","медвелак","аколит огня","ламия","баргест","вий","гьюнальский паук","дэра","гриндель","грим","кагир","друджи","даса","стая ичетики","кера","куд","ларва","егви","каменный великан","каннибал","ламашту","лахама","наркоман","бывший палач","мародёр","страхолев","злоцвет","варвар","ночная хныка","омерзень","смрадень","глыдень","песчаный холерник","мать анаконд","белая гиена","мраморный бык","язвомор","лишайница","жирница","бульг","костогрыз","каменник","вирница","тигр","барбегаз","бродячий огонек","скальник","пупырник","стогница","куропатка гуанила","пёстробородый","капитан Серых Плащей","аколит льда","семиглаз","гюрза","медвежук","снежная росомаха","койот","горный манул","мастер огня","мастер льда","кобольд","пожиратель плоти","главарь пестробородых","ученик Силы","гомункул","некромант","тагар","стрига","приземник","лесной тролль","вурдалак","болотный тролль","бескуд","атач"]
};



var _subscribeList = [];
function publish(e) {
	var sp = e.split('.');
	var event = sp[0];
	var namespace = sp[1];
	for (var i=0; i<_subscribeList.length; i++) {
		var s = _subscribeList[i];
		if ((!namespace || namespace === s.namespace) && (!event || event === s.event)) {
			s.fn.apply(_ext, Array.prototype.slice.call(arguments, 1));
		}
	}
}
function subscribe(e, fn) {
	var events = e.split(',');
	if (events.length > 1) {
		events.forEach(function(ev) {subscribe(ev, fn);});
		return;
	}
	var sp = e.split('.');
	var event = sp[0];
	var namespace = sp[1];
	_subscribeList.push({
		event: event,
		namespace: namespace,
		fn: fn
	});
}
var cacheStore = {};
var cacheTimeId = {};
function cache(name, value, time) {
	if (arguments.length > 1) {
		cacheStore[name] = value;
		if (cacheTimeId[name]) window.clearTimeout(cacheTimeId[name]);
		if (time) {
			cacheTimeId[name] = window.setTimeout(function() {
				delete cacheStore[name];
			}, time)
		}
	} else {
		return cacheStore[name];
	}
}
$.extend(_ext, {
	subscribeList: _subscribeList,
	cacheStore: cacheStore,
	cache: cache,
	publish: publish,
	subscribe: subscribe
});

var _store = (function() {
	var prefix = 'ext-';
	function setStore(key, value) {
		localStorage.setItem(prefix + key, JSON.stringify(value));
	}
	function getStore(key) {
		return JSON.parse(localStorage.getItem(prefix + key) || localStorage.getItem(key));
	}
	if (window.localStorage && window.JSON) {
		return {
			get: getStore,
			set: setStore
		}
	} else {
		return {
			get: function() {},
			set: function() {}
		}
	}
})({});

/* log */
var _log = (function() {
	function setLog(name, messages) {
		try {
			if (name === 'messagesLog') {
				var max = _settings.settingsValues.maxLogLength || _ext.const.MAX_LOG_LENGTH;
				pgf.base.settings.set(name, JSON.stringify(messages.slice(messages.length - max)));
			} else {
				pgf.base.settings.set(name, JSON.stringify(messages));
			}
		} catch (e) {
			console.warn('setLog', name, e);
		}
	}
	function getLog(name) {
		var g = pgf.base.settings.get(name);
		return g ? JSON.parse(g) : '';
	}
	function logToConsole(name) {
		var strLog = pgf.base.settings.get(name);
		var s = strLog
			.replace(/\],\[/g, '],\n\t[')
			.replace(/\},{/g, '},\n\t{')
			.replace(/"(action|base|energy|habits|secondary|turn)"/g, '\n\t\t"$1"');
		console.log(s);
	}
	function toStr(messages) {
		var strLog = JSON.stringify(messages);
		var s = strLog
			.replace(/\],\[/g, '],\n\t[')
			.replace(/"(action|base|energy|habits|secondary|turn)"/g, '\n\t\t"$1"');
		return s;
	}
	function size() {
		var t = 0;
		for(var x in localStorage){
			t += localStorage[x].length * 2;
		}
//			console.log(t/1024+ " KB");
		return t;
	}
	if (window.localStorage && window.JSON) {
		return {
			toConsole: logToConsole,
			toStr: toStr,
			get: getLog,
			size: size,
			set: setLog
		};
	} else {
		return {
			toConsole: function() {},
			toStr: function() {},
			get: function() {},
			size: function() {},
			set: function() {}
		};
	}
})();
/* eo log */



/* settings */
var _settings = (function(_settings) {
	function getSettingInput(key) {
		return $('input[data-name="' + key + '"]');
	}

	var sets = [
		{
			title: 'Персонаж',
			fields: [{
				label: 'Начало имени героя:',
				note: 'Общая часть имени для всех падежей',
				inputs: [{
					name: 'heroNameStart',
					type: 'text'
				}]

			}]
		},
		{
			title: 'Уведомления',
			fields: [{
				label: 'Отправлять уведомления',
				name: 'notify',
				isToggle: 1,
				value: true,
				subs: [{
					label: 'Выбор в задании',
					name: 'notifyQuestChoose',
					isToggle: 1,
					value: true
				}, {
					label: 'Герой бездействует',
					name: 'notifyHeroIdle',
					isToggle: 1,
					value: true
				/*}, {
					label: 'Герой воскресает',
					name: 'notifyHeroDead',
					isToggle: 1,
					value: true*/
				}, {
					label: 'Здоровье ниже ',
					name: 'notifyHeroHp',
					isToggle: 1,
					value: true,
					inputs: [{
						type: 'num',
						name: 'notifyHeroHpLowerValue',
						value: 200
					}]
				}, {
					label: 'Энергия выше ',
					name: 'notifyHeroEnergy',
					isToggle: 1,
					value: true,
					inputs: [{
						type: 'num',
						name: 'notifyHeroEnergyGreaterValue',
						value: 9
					}]
				}]
			}]
		}, {
			title: 'Статистика',
			fields: [{
				label: 'Уровень героя: последний, или',
				name: 'statsByLevel',
				isToggle: 1,
				value: true,
				inputs: [{
					type: 'num',
					name: 'statsByLevelValue'
				}]
			}, {
				label: 'Монстр: последний, или',
				name: 'statsByMob',
				isToggle: 1,
				value: true,
				inputs: [{
					type: 'num',
					name: 'statsByMobId',
					addOn: 'ID'
				}],
				subs: [{
					label: 'Статистика героя против монстра',
					name: 'myStatsByMob',
					isToggle: 1,
					value: false
				}]
			}, {
				label: 'Количество действий в статистике:',
				inputs: [{
					name: 'statsActionsCount',
					type: 'num'
				}]
			}]
		}, {
			title: 'Отображение',
			fields: [{
				label: 'Выводить подробности действий',
				name: 'groupOpenOnDefault',
				isToggle: 1,
				value: true
			}, {
				label: 'Показывать архив',
				name: 'showArchive',
				isToggle: 1,
				value: false
			}]
		}, {
			title: 'Хранилище <span id="storage-size"></span>',
			fields: [{
				label: 'Сообщений в кратком журнале:',
				inputs: [{
					name: 'maxLogLength',
					type: 'num',
					value:  _ext.const.MAX_LOG_LENGTH
				}]
			}, {
				label: 'Действий в архиве:',
				inputs: [{
					name: 'maxArchiveLength',
					type: 'num',
					value:  _ext.const.MAX_ARCHIVE_LENGTH
				}]
			}, {
				label: '<span class="link-ajax" id="reset-stats">Очистить хранилище</span>'
			}]
		}
	];
	_ext.subscribe('settingsChange', checkDependences);
	function checkDependences(key, value, isDisabled) {
		if (deps[key]) {
			deps[key].forEach(function(keyName) {
				if (keyName) getSettingInput(keyName).closest('.input-wrap').toggleClass('disabled', isDisabled || !value);//.prop('disabled', !value);
			});
		}
	}

	var deps = {};
	function addSets(sets) {
		for (var i=0; i<sets.length;i++) {
			settingsDefaults(sets[i].fields);
		}

		function settingsDefaults(fields) {
			var childs = [];
			for (var i=0; i<fields.length;i++) {
				var st = fields[i];
				childs.push(st.name);
//					console.log('defaults', st.name);
				if (typeof settingsValues[st.name] === 'undefined') settingsValues[st.name] = st.value;
				var subsChilds = [];
				if (st.inputs) {
					subsChilds = settingsDefaults(st.inputs).concat(subsChilds);
				}
				if (st.subs) {
					subsChilds = settingsDefaults(st.subs).concat(subsChilds);
				}
				if (st.fields) subsChilds = settingsDefaults(st.fields).concat(subsChilds);

				if (subsChilds.length && st.name) {
					deps[st.name] = subsChilds;
					childs = subsChilds.concat(childs);
				}
			}
			return childs;
		}
	}

	var settingsValues = _log.get('settings') || {};
	addSets(sets);
	function drawSets(sets) {
		var $sets = _elements.getTabInner('sets');
		var html = '';
		for (var i=0; i<sets.length;i++) {
			var st = sets[i];
			html +=
				'<div class="">' +
					'<div class="sets-header">' + (st.title||'') + '</div>' +
					drawSetsGroup(st.fields) +
				'</div>';
		}
		html = '<div class="settings-form form-horizontal">' + html + '</div>';
		$sets.append(html);
		$sets.find('input').each(function() {
			var $input = $(this);
			var name = $input.data('name');
			var value = $input.is('[type="checkbox"]') ? $input.prop('checked') : $input.val();
			var isDisabled = $input.closest('.input-wrap').hasClass('disabled')//.prop('disabled');
			checkDependences(name, !isDisabled && value);
		});
	}

	function init() {
		var $sets = _elements.getTabInner('sets');

		drawSets(sets);

		$sets
			.on('change', 'input', function() {
				var $input = $(this);
				var name = $input.data('name');
				var value = $input.is('[type="checkbox"]') ? $input.prop('checked') : $input.val();
				if ($input.data('type') == 'num') { value =+value; }
				settingsValues[name] = value;
				var isDisabled = $input.closest('.input-wrap').hasClass('disabled')//.prop('disabled');
				_ext.publish('settingsChange', name, value, isDisabled);
				_log.set('settings', settingsValues);
			})
			.on('click', '#reset-stats', function() {
				if (confirm('Будет сброшена вся история\nПродолжить?')) {
					_ext.log.set('messagesLog', '');
					_ext.trace.messagesLog.splice(0, _ext.trace.messagesLog.length);
					_ext.log.set('archiveGroups', '');
					_ext.archive.archiveGroups.splice(0, _ext.archive.archiveGroups.length);
					_ext.stats.drawStatsSide();
					_ext.elements.getTabInner('group').html('')
				}
			});
	}

	function drawSetsGroup(fields) {
//			console.log('drawSetsGroup', sets);
		var html = '';
		for (var i=0;i<fields.length;i++) {
			var st = fields[i];

			var inputsHtml = '';
			if (st.inputs) {
				inputsHtml = ' ' + st.inputs.map(drawInput).join('');
			}
			var label =
				'<div class="input-wrap ' + (st.isToggle ? 'checkbox' : '') + '">' +
					'<label>' +
						drawInput(st) +
						st.label +
					'</label>' +
					inputsHtml +
				'</div>';


			html +=
				'<div class="sets' + (st.isInline ? ' sets-inline' : '') + '">' +
					'<div class="sets-title">' +
						label +
						(st.note ? '<div class="note-block">' + st.note + '</div>' : '') +
					'</div>' +
					(st.subs ? drawSetsGroup(st.subs) : '') +
				'</div>';
		}
		_log.set('settings', settingsValues);

		return html;

		function drawInput(st) {
			if (typeof settingsValues[st.name] === 'undefined') settingsValues[st.name] = st.value;
			var html = '';
			if (st.isToggle || st.type === 'checkbox') {
				html = '<input type="checkbox" data-name="' + st.name + '""' + (settingsValues[st.name] ? ' checked' : '') + '> ';
			} else if (st.type === 'text' || st.type === 'num') {
				html = '<input type="text" class="input-tiny input-tiny-' + st.type + '"' +
					' data-name="' + st.name + '"' +
					(' data-type="' + st.type + '"') +
					(settingsValues[st.name] ? ' value="' + settingsValues[st.name] + '"' : '') + '>';
				if (st.addOn) {
					html = '<div class="input-wrap input-append">' + html + '<span class="add-on">' + st.addOn + '</span></div>';
				} else {
					html = '<div class="input-wrap input-wrap-inline">' + html + '</div>';
				}
			}
			return html;
		}
	}

	_ext.isMyName = function(str) {
		return str.indexOf(_settings.settingsValues.heroNameStart) >= 0;
	};


	$.extend(_settings, {
		init: init,
		addSets: addSets,
		drawSets: drawSets,
		getSettingInput: getSettingInput,
		settingsValues: settingsValues
	});
	return _settings;
})({});
_ext.subscribe('init', function() {
	_settings.init();
});

_ext.subscribe('preload', function() {
	if (!_settings.settingsValues.heroNameStart) {
		var heroName = _ext.heroName;
		_settings.settingsValues.heroNameStart = heroName.substring(0, Math.max(3, heroName.length-2));
		_settings.getSettingInput('heroNameStart').val(_settings.settingsValues.heroNameStart).trigger('change');
	}
});

_ext.subscribe('settingsChange', function(key, value) {
	if (key === 'heroNameStart') {
		_trace.traceInit();
		_ext.groupMessages.drawMessages( _ext.groupMessages.list );
	}
});

/* eo settings */


var lastNonifyMessagesText = '';
_ext.subscribe('newMessages', function(messagesNew, gameData) {
	var hero = gameData.account.hero;
	var _settingsValues = _settings.settingsValues;
	if (!_settingsValues.notify) return;
	var notifyMessages = [];
	if (_settingsValues.notifyHeroHp) {
		var health = hero.base.health;
//		var healthMax = hero.base.max_health;
//		var healthPercent = health / healthMax * 100;
		var minHp = _settingsValues.notifyHeroHpLowerValue;
		if (health < minHp) {
			notifyMessages.push('Низкое здоровье: ' + health + ' HP');
		}
	}
	if (_settingsValues.notifyHeroEnergy) {
		var energy = hero.energy.value;
//		var energyMax = hero.energy.max;
//		var energyPercent = energy / energyMax * 100;
		var maxEnergy = _settingsValues.notifyHeroEnergyGreaterValue;
		if (energy > maxEnergy) {
			notifyMessages.push('Энергия накопилась: ' + energy);
		}
	}
	if (_settingsValues.notifyHeroIdle) {
		var actionType = hero.action.type;
		if (actionType === 0) {
			notifyMessages.push('Герой бездействует');
		}
	}

	if (notifyMessages.length) {
		var notifyMessagesText = notifyMessages.join('\n');
		if (notifyMessagesText != lastNonifyMessagesText) {
			_notification.sendNotify('The Tale Extended - ' + _ext.heroName, {
				tag: 'send',
				body: notifyMessagesText
			});
		}
		lastNonifyMessagesText = notifyMessagesText;
	}
});





/* trace */
var _trace = (function(_trace) {

	var messagesLog = _log.get('messagesLog') || [];
	function traceInit() {
		for (var i=0; i<messagesLog.length; i++) {
			var messageNew = messagesLog[i];
			messageNew[4] = _ext.parse.short(messageNew[2]) || false;
		}
	}

	function traceData(game_data) {

		var hero = game_data.account.hero;
		if (!hero) return;
		var heroData = {
			action: {
				description: hero.action.description,
				type: hero.action.type,
				info_link: hero.action.info_link,
				is_boss: hero.action.is_boss,
				percents: hero.action.percents
			},
			base: {
				health: hero.base.health,
				max_health: hero.base.max_health,
				level: hero.base.level,
				alive: hero.base.alive,
				money: hero.base.money
			},
			energy: {
				bonus: hero.energy.bonus,
				max: hero.energy.max,
				value: hero.energy.value
			},
			secondary: {
//					initiative: hero.secondary.initiative,
				loot_items_count: hero.secondary.loot_items_count,
//					max_bag_size: hero.secondary.max_bag_size,
//					move_speed: hero.secondary.move_speed,
				power: hero.secondary.power
			},
			turn: game_data.turn.number
		};

		var lastLog = messagesLog[messagesLog.length-1] || [];
		var lastTimestamp = lastLog[0];
		var messagesPack = hero.messages;
		messagesPack[messagesPack.length-1][3] = heroData;
		var messagesPackTimestamp = messagesPack[messagesPack.length-1][0];
		var messagesNew = [];
		for (var i=0; i<messagesPack.length; i++) {
			if (!lastTimestamp || messagesPack[i][0] > lastTimestamp) {
				var messageNew = messagesPack[i];
//					if (messagesPackTimestamp === messageNew[0]) messageNew[3] = heroData;
				messageNew[3] = messageNew[3] || false;
				messageNew[4] = _ext.parse.short(messageNew[2]) || false;

				messagesLog.push(messageNew);
				messagesNew.push(messageNew);
			}
		}
		_log.set('messagesLog', messagesLog.map(function(item) { return [item[0], item[1], item[2], item[3]]; }));
		_trace.heroData = heroData;

		_ext.publish('newTurn', messagesNew, game_data, messagesPackTimestamp);
		if (messagesNew.length) {
			_ext.publish('newMessages', messagesNew, game_data, messagesPackTimestamp);
		}
	}
	function traceStart() {
		$(document).bind(pgf.game.events.DATA_REFRESHED + '.ext-trace', function(e, game_data){
			traceData(game_data);
		});
	}
	function traceStop() {
		$(document).unbind(pgf.game.events.DATA_REFRESHED + '.ext-trace');
	}


	$.extend(_trace, {
		messagesLog: messagesLog, //.slice(messagesLog.length - 500)
		traceData: traceData,
		traceInit: traceInit,
		traceStart: traceStart,
		traceStop: traceStop
	});

	return _trace;
})({});

_ext.subscribe('init', function(game_data) {
	_trace.traceInit();
	_trace.traceStart();
});
/* eo trace */

_ext.subscribe('newMessages', function(messagesNew, gameData, timestamp) {


	_log.set('game_data', gameData);
	var hero = gameData.account.hero;
	var levelsLog = _log.get('levelsLog') || [];
	var lastLevel = (levelsLog[levelsLog.length-1] || [])[1];
	if (hero.base.level !== lastLevel) {
		console.info('level up!', hero.base.level);
		levelsLog.push([timestamp, hero.base.level]);
		_log.set('levelsLog', levelsLog);
	}
	var powersLog = _log.get('powersLog') || [];
	powersLog = powersLog.filter(function(t) { return typeof t[1] === 'number'; } );
	var lastPower = (powersLog[powersLog.length-1] || [])[1];
	var powerSum = hero.secondary.power[0] + hero.secondary.power[1];
	if (powerSum !== lastPower) {
		console.info('power up!', powerSum);
		powersLog.push([timestamp, powerSum]);
		_log.set('powersLog', powersLog);
	}
	_ext.trace.lastGameData = gameData;
});


_ext.subscribe('init', function() {
	$('#pgf-journal-container').on('click', '[data-ts]', function() {
		var timestamp = $(this).data('ts');
		_trace.messagesLog.forEach(function(message) {
			if (message[0] === timestamp) {
				console.log(message);
			}
		});
	});
	$('#pgf-journal-container').on('click', '[data-click]', function() {
		console.log($(this).data('click'));
	});
});

$('body').on('click', '.group-toggle', function() {
	$(this).closest('.group').toggleClass('open');
});



/* elements */
var _elements = (function(_elements) {
	var tabs = {};

	var $diaryRoot = $('#pgf-diary-container').parent().parent();
	var $diaryTabs = $diaryRoot.children('.nav-tabs');
	var $diaryContainer = $diaryRoot.children('.tab-content');

	var $equipRoot = $('#pgf-equipment-container').parent().parent();
	var $equipTabs = $equipRoot.children('.nav-tabs');
	var $equipContainer = $equipRoot.children('.tab-content');

	var zones = {
		main: {
			$tabs: $diaryTabs,
			$container: $diaryContainer
		},
		equip: {
			$tabs: $equipTabs,
			$container: $equipContainer
		}
	};



	function addTab(name, opts) {
		var zone = opts.zone || 'main';
		var $tabs = zones[zone].$tabs;
		var $container = zones[zone].$container;

		var $tab = $('<li class="pull-right"><a href="#pgf-'+name+'-container" class="pgf-'+name+'-tab-button" data-toggle="tab">'+opts.title+'</a></li>');
		if (zone == 'main') {
			var $content = $('<div class="tab-pane log-block" id="pgf-'+name+'-container"></div>');
		} else {
			var $content = $('<div class="tab-pane" id="pgf-'+name+'-container"></div>');
		}

		$tabs.append($tab);
		$container.append($content);

		var $inner = $content;
		if (opts.content) {
			$inner = $(opts.content).appendTo($content);
		}

		tabs[name] = {
			zone: zone,
			$tab: $tab,
			$content: $content,
			$inner: $inner
		};
		return $inner;
	}
	function getTabInner(name) {
		return tabs[name].$inner;
	}
	function getTab(name) {
		return tabs[name].$tab;
	}

	function activeTab(name) {
//		tabs[name].$tab.addClass('active').siblings().removeClass('active');
//		if (tabs[name].zone === 'mainMiddle') {
//			$('#pgf-journal-container').addClass('active').siblings().removeClass('active');
//			tabs[name].$content.show().siblings().hide();
//		} else {
//			tabs[name].$content.addClass('active').siblings().removeClass('active');
//		}
	}

	var controls = {};
	var $controls = $('<div class="ext-controls pull-right"></div>').insertAfter('#current-action-block, #pvp-info-block');
	function addControl(name, opts) {
		var html = '<span class="ext-control link-ajax" id="ext-' +  name + '" title="' + opts.title + '">' + (opts.content || '') + '</span>';

		var $el = $(html).appendTo($controls);
		controls[name] = {
			$el: $el
		};
		return $el;
	}
	function getControl(name) {
		return controls[name].$el;
	}

	$.extend(_elements, {
		addTab: addTab,
		activeTab: activeTab,
		getTab: getTab,
		getTabInner: getTabInner,

		addControl: addControl,
		getControl: getControl
	});
	return _elements;
})({});

/* eo elements */

_elements.addTab('sets', {zone: 'main', title: '<span class="glyphicon glyphicon-cog" title="Настройки &laquo;The Tale Extended&raquo;"></span>'});
_elements.addTab('towns', {zone: 'main', title: 'города'});
_elements.addTab('archive', {zone: 'main', title: 'архив'});
_elements.addTab('group', {zone: 'main', title: 'кратко'});
_ext.subscribe('init', function() {
	_elements.activeTab('group');
});


_elements.addControl('journal-log', {title: 'Журнал', content: '<span class="value"></span> <span class="glyphicon glyphicon-th-list"></span></span>'})
	.on('click', function() { _log.toConsole('messagesLog'); });

_elements.addControl('archive-log', {title: 'Архив', content: '<span class="value"></span> <span class="glyphicon glyphicon-th"></span></span>'})
	.on('click', function() { _log.toConsole('archiveGroups'); });


_ext.subscribe('newTurn', function(messagesNew) {
	window.setTimeout(function() {
		_ext.elements.getControl('journal-log')
			.find('.value').text(_trace.messagesLog.length);

		_ext.elements.getControl('archive-log')
			.find('.value').text(_ext.archive.archiveGroups.length);

		$('#storage-size')
			.text('(занято ' + Math.round( _ext.log.size() / 1024 / 1024 * 100 )/100 + 'Мб)');
	}, 10);
});


/* notifications */
var _notification = (function(_notification) {
	var rndStr = Math.random() + '';

	function request() {
		if (Notification.permission.toLowerCase() !== 'granted') {
			Notification.requestPermission( newMessage );
		}
		function newMessage(permission) {
			if( permission !== "granted" ) return false;
			var notify = new Notification("Thanks for letting notify you");
			return true;
		}
	}
	$('body').one('click', request);



	function sendNotify(name, options) {
//			if (!_settings.settingsValues.notify) return;

		var d = new Date();
		var h = d.getHours();
		var m = d.getMinutes();
		var time = h + ':' + (m<10?'0'+m:m);
		var nt = new Notification(name, {
			tag: options.tag + rndStr,
			body: options.body + (options.addTime ? '\n' + time : ''),
			icon: options.icon || (window.extPass + 'img/128.png')
		});
		nt.onclick = nt.onclose = function() {
			rndStr = Math.random() + '';
		};
	}


	$.extend(_notification, {
		sendNotify: sendNotify
	});
	return _notification;

})({});


/* quests */
var _quests = (function(_quests) {
	var lastQuests;
	function checkQuests(quests) {
		var line = quests[1].line;
		var lineOld = lastQuests && lastQuests[1] && lastQuests[1].line || [];
		var newLines = [];
		for (var i=0; i<line.length; i++) {
			var q = line[i];
			var qOld = lineOld[i];
			if (!qOld || !isSameQuest(q, qOld)) {

				if (_settings.settingsValues.notifyQuestChoose && q.choice_alternatives && q.choice_alternatives.length) {
//					console.info('quest!', q.type, _ext.heroName + ' ' + q.action + '!', q);
					if (_settings.settingsValues.notify) {
						_notification.sendNotify(q.name,  {
							tag: 'quest',
							body: _ext.heroName + ' ' + q.action + '!',
							icon: window.extPass + 'img/quest/caravan.png', //window.extPass + 'img/quest/' + q.type + '.png',
							addTime: 1
						});
					}
				} else {
//					console.info('quest.', q.type, q.experience, q.power, _ext.heroName + ' ' + q.action + '!', q);
				}
				newLines.push(q);

			}
		}
		if (newLines.length) {
			_ext.publish('questUpdate', line);
		}
		lastQuests = quests;
	}

	function isSameQuest(q1,q2) {
		var tests = ['action', 'choice', 'name', 'type', 'uid'];
		for (var s in tests) if (tests.hasOwnProperty(s)) {
			var key = tests[s];
			if (q1[key] !== q2[key]) return false;
		}
		return true;
	}

	$.extend(_quests, {
		checkQuests: checkQuests
	});
	return _quests;
})({});

_ext.subscribe('preload', function() {
	_ext.subscribe('newMessages', function(messagesNew, game_data) {
		var hero = game_data.account.hero;
		var quests = hero.quests.quests;
		_quests.checkQuests(quests);
	});
});
/* questss */



/* utils functions */

var _utils = {};
_utils.capitalize = function(text) {
	return text.substring(0,1).toUpperCase() + text.substring(1);
};
_utils.declenstionByNumber = function(number, titles, addCount) {
	return (addCount ? number + ' ' : '' ) + titles[ (number%100>4 && number%100<20)? 2 : [2, 0, 1, 1, 1, 2][(number%10<5)?number%10:5] ];
};
_utils.timeSpan = function(timeSpan) {
	timeSpan = timeSpan|0;
	var h = (timeSpan / 60 / 60)|0;
	var m = ((timeSpan / 60)|0) % 60;
	var s = timeSpan % 60;
	return (h ? h + ':' : '') + (m<10?'0':'') + m + ':' + (s<10?'0':'') + s ;
};

/* eo utils functions */


_ext.store = _store;
_ext.settings = _settings;
_ext.elements = _elements;
_ext.quests = _quests;
_ext.notification = _notification;
_ext.utils = _utils;
_ext.elements = _elements;
_ext.log = _log;
_ext.trace = _trace;



var _parse = (function(_parse) {

	var parseShortRaw = [
		/* --pvp-- */
		'[pvpeff]Мощный поток энергии вздыбил землю вокруг {actor}. Эффективность {} увеличена на {eff} единиц(а|у|ы).',
		'[pvpeff]Кровь на мгновение застилает глаза {actor}. Эффективность увеличена на {eff} единиц(а|у|ы).',
		'[pvpeff]{actor} почувствовал(а|о|и) как (его|ее|их) мышцы крепчают, а сознание очищается. Эффективность боя увеличилась на {eff} единиц(а|у|ы).',
		'[pvpeff]Хранитель усилил связь с {actor} и увеличил (его|ее|их) эффективность на {eff} единиц(а|у|ы).',

		'[pvpice]Хранитель {actor} сконцентрировался и увеличил скорость прироста энергии.',
		'[pvpice]Холодная голова и кристально чистые мысли помогли хранителю {actor} увеличить скорость прироста энергии.',

		'[pvpflame]Хранитель {actor} нарушил(а|о|и) концентрацию противник(а|ов) и уменьшил скорость прироста (его|ее|их) энергии.',

		'[pvpfail]Тучи за спиной {actor} сошлись… И снова разошлись, ничего не произошло.',
		'[pvpfail]Хранитель {actor} не смог сконцентрироваться и потратил энергию впустую.',
		'[pvpfail]Хранителю не хватило концентрации для установления связи с {actor}. Энергия ушла в никуда.',


		/* Удар */
		'[hit]Изучив тактику {victim}, {actor} провел(а|о|и) атаку и нанес(ла|ло|ли) {value} единиц(у|а|ы) урона.',
		'[hit]Сосредоточившись, {actor} провел(а|о|и) атаку и лишил(а|о|и) {victim} {value} HP.',
		'[hit]Обманув {victim}, {actor} смог(ла|ло|ли) провести неожиданную атаку, лишив противник(а|ов) {value} HP.',
		'[hit]Усыпив бдительность {victim}, {actor} набросил(ся|ась|ось|ись) на противник(а|ов) и нанес(ла|ло|ли) {value} единиц(у|а|ы) урона.',
		'[hit]{actor} нанес(ла|ло|ли) точный удар, уменьшая здоровье {victim} на {value} HP.',
		'[hit]Апперкот, и вокруг {victim} взметнул(ась|ись) {value} звездоч(ка|ки|ек).',
		'[hit]Быстрая атака {actor} лишила {victim} {value} HP.',
		'[hit]{actor} виртуозно провел(а|о|и) атаку и нанес(ла|ло|ли) {victim} {value} единиц(у|а|ы) урона.',
		'[hit]Рассекающий удар {actor} нан(ёс|есла|есло|если) {value} единиц(у|а|ы) урона {victim}.',
		'[hit]Стоило только {victim} замахнуться, как {actor} резко ударил(а|о|и) (его|ее|их) по больному месту и нанес(ла|ло|ли) {value} единиц(у|а|ы) урона.',
		'[hit]Умелая подсечка, и придорожный камень нанёс голов(е|ам) {victim} {value} урона.',
		'[hit]Ловко парировав удар, {actor} провод(ит|ят) успешный контрудар, лишая {victim} {value} HP.',
		'[hit]{actor} поцарапал(а|о|и) {victim} на {value} HP.',
		'[hit]{actor} быстро прицелил(ся|ась|ось|ись), изготовил(ся|ась|ось|ись) и в стремительном рывке обрушил(а|о|и) разящий удар в {value} единиц(у|а|ы) урона на {victim}.',
		'[hit]{victim} пропустил(а|о|и) удар и теперь страда(ет|ют) отсутствием {value} HP.',
		'[hit]{victim} пропуска(ет|ют) лёгкий тычок в {value} единиц(у|ы) урона.',
		'[hit]Быстрота реакции {actor} помогла (ему|ей|им) нанести {victim} {value} единиц(у|а|ы) урона.',
		'[hit]{actor} отош(ел|ла|ло|ли) в сторону, и {victim} с разбега врезал(ся|ась|ось|ись) в стену, потеряв {value} HP.',
		'[hit]{actor} поднатужил(ся|ась|ось|ись) и нанес(ла|ло|ли) {value} единиц(у|а|ы) урона.',
		'[hit]С кошачьей грацией {actor} извернул(ся|ась|ось|ись) и нанес(ла|ло|ли) {value} единиц(у|а|ы) урона.',
		'[hit]{actor} точным ударом поразил(а|о|и) {victim} на {value} единиц(у|а|ы) урона.',
		'[hit]{victim} потерял(а|о|и) {value} HP, пропустив атаку {actor}.',
		'[hit]«Скрытая атака!» — заорал(а|о|и) {actor} и выбил(а|о|и) из {victim} {value} HP.',
		'[hit]Замахиваясь, {victim} пропустил(а|о|и) резкий и быстрый выпад {actor}, забравший {value} HP.',
		'[hit]Молниеносная атака {actor} нанесла {value} единиц(у|а|ы) урона.',
		'[hit]После обмена серией стремительных ударов с {victim}, {actor} наконец наш(ел|ла|ло|ли) брешь в защите и нанес(ла|ло|ли) {value} единиц(у|а|ы) урона.',
		'[hit]Кувырком уходя из-под удара и контратакуя, {actor} сумел(а|о|и) нанести {victim} {value} единиц(у|а|ы) урона.',
		'[hit]{victim} приготовил(ся|ась|ось|ись) парировать удар, но не ожидал(а|о|и) от {actor} такой стремительности и теря(ет|ют) {value} HP.',
		'[hit]{victim} не ожидал(а|о|и) такого выпада от {actor} и получа(ет|ют) {value} единиц(у|а|ы) урона.',
		'[hit]{actor} провод(ит|ят) сногсшибательный приём, {victim} пада(ет|ют) и теря(ет|ют) {value} HP.',
		'[hit]Вложив всю злость в удар, {actor} нанес(ла|ло|ли) {value} единиц(у|а|ы) урона.',
		'[hit]{actor} поднатужил(ся|ась|ось|ись) и нанес(а|о|и) {value} единиц(у|а|ы) урона.',
		'[hit]Издавая зловещие звуки, {actor} сжима(ет|ют) {} что есть силы в своих объятиях! {victim} кряхт(ит|ят) и получа(ет|ют) {value} единиц(у|а|ы) урона.',
		'[hit]{victim} не ожидал(а|о|и) такого выпада от {actor}, и получа(е|ю)т {value} единиц(у|а|ы) урона.',
		'[hit]{victim} не ожидал(а|о|и) такого выпада от {actor}, и получил(а|о|и) {value} единиц(у|ы) урона.',
		'[hit]Вложив всю злость в удар, {actor} нанес(ла|ло|ли) {value} единиц(у|ы) урона.',
		'[hit]{actor} точным ударом поразил(а|о|и) {victim} на {value} единиц(у|ы) урона.',
		'[hit]{actor} провел(а|о|и) сногсшибательный прием, {victim} пада(ет|ют) и теря(ет|ют) {value} HP.',
		'[hit]Усыпив бдительность {victim}, {actor} набросил(ся|ась|ось|ись) на противника и нанес(ла|ло|ли) {value} единиц(у|ы) урона.',
		'[hit]После обмена серией стремительных ударов с {victim}, {actor} наконец наш(ел|ёл|ла|ло|ли) брешь в защите и нанес(ла|ло|ли) {value} единиц(у|ы) урона.',
		'[hit]Рассекающий удар {actor} нанес {value} единиц(у|ы) урона {victim}.',
		'[hit]Кувырком уходя из-под удара и контратакуя, {actor} сумел(а|о|и) нанести {victim} {value} единиц(у|ы) урона.',
		'[hit]«Скрытая атака!» — заорал(а|о|и) {actor} и выбил(а|о|и) из {victim} {value} HP.',
		'[hit]Ловко парировав удар, {actor} провел(а|о|и) успешный контрудар, лишая {victim} {value} HP.',
		'[hit]Издавая зловещие звуки, {actor} сжима(ет|ют) {victim} что есть силы в своих объятиях! {victim} кряхт(ит|ят) и получа(ет|ют) {value} единиц(у|ы) урона.',
		'[hit]Замахиваясь, {victim} пропустил(а|о|и) резкий и быстрый выпад {actor}, забравший {value} HP.',
		'[hit]{victim} приготовил(ся|ась|ось|ись) парировать удар, но не ожидал(а|о|и) от {actor} такой стремительности и теря(ет|ют) {value} HP.',
		'[hit]Стоило только {victim} замахнуться, как {actor} резко ударил(а|о|и) {victim} по больному месту и нанес(ла|ло|ли) {value} единиц(у|ы) урона.',
		'[hit]{victim} пропуска(ет|ют) легкий тычок в {value} единиц(у|ы) урона.',
		'[hit]Сосредоточившись, {actor} провел(а|о|и) атаку и лишил(а|о|и) {victim} {value} HP.',
		'[hit]Быстрая атака {actor} лишила {victim} {value} HP.',
		'[hit]Обманув {victim}, {actor} смог(ла|ло|ли) провести неожиданную атаку, лишив {victim} {value} HP.',
		'[hit]{victim} потерял(а|о|и) {value} HP, пропустив атаку {actor}.',
		'[hit]{actor} нанес(ла|ло|ли) точный удар, уменьшая здоровье {victim} на {value} HP.',
		'[hit]{actor} виртуозно провел(а|о|и) атаку и нанес(ла|ло|ли) {victim} {value} единиц(у|ы) урона.',
		'[hit]Молниеносная атака {actor} нанесла {value} единиц(у|ы) урона.',
		'[hit]Быстрота реакции {actor} помогла (ему|ей|ему|им) нанести {victim} {value} единиц(у|ы) урона.',
		'[hit]Изучив тактику {victim}, {actor} провел(а|о|и) атаку и нанес(ла|ло|ли) {value} единиц(у|ы) урона.',
		'[hit]С кошачьей грацией {actor} извернул(ся|ась|ось|ись) и нанес(ла|ло|ли) {value} единиц(у|ы) урона.',
		'[hit]{actor} быстро прицелил(ся|ась|ось|ись), изготовил(ся|ась|ось|ись) и в стремительном рывке обрушил(а|о|и) разящий удар в {value} единиц(у|ы) урона на {victim}.',
		'[hit]{victim} пропустил(а|о|и) удар и теперь страда(ет|ют) отсутствием {value} HP.',
		'[hit]{actor} отош(ел|ёл|ла|ло|ли) в сторону, и {victim} с разбега врезал(ся|ась|ось|ись) в стену, потеряв {value} HP.',
		'[hit]{actor} поцарапал(а|о|и) {victim} на {value} HP.',
		'[hit]Апперкот, и вокруг {victim} взметнул(ась|ось|ись) {value} звездоч(ка|ки|ек).',
		'[hit]Умелая подсечка, и придорожный камень нанес голов(е|ам) {victim} {value} урона.',
		'[hit]{actor} поднатужил(ся|ась|ось|ись) и нанес(ла|ло|ли) {value} единиц(у|ы) урона.',
		'[hit]{actor} ударил(а|о|и) так, что {value} НР {victim} как и не бывало.',


		/* Тяжёлый удар */
		'[might]Как следует размахнувшись, {actor} одним сильным ударом вынес(ла|ло|ли) из {victim} {value} HP.',
		'[might]Вложив всю свою силу в удар, {actor} нанес(ла|ло|ли) {victim} {value} единиц(у|а|ы) урона.',
		'[might]После короткого и очень сильного удара {actor} по телу {victim} прокатилась волна боли на {value} единиц(у|а|ы) урона.',
		'[might]Сильнейший удар обрушил(а|о|и) {actor}, выколачивая из {victim} {value} HP.',
		'[might]{victim} потерял(а|о|и) {value} HP от чрезвычайно сильного удара {actor}.',
		'[might]Собрав всю злобу и силу в один удар, {actor} уменьшил(а|о|и) здоровье {victim} на {value} HP.',
		'[might]{actor} размахнул(ся|ась|ось|ись) сильнее обычного и нанес(ла|ло|ли) {value} единиц(у|а|ы) урона.',
		'[might]Взяв размах от плеча, {actor} сокрушительным ударом выбил(а|о|и) из {victim} {value} HP.',
		'[might]Затаив злобу лютую, с особой жестокостью ударил {actor} {victim} на {value} единиц(у|а|ы) урона.',

		/* Отравление */
		'[poison]Яд тянет из {victim} силы и {value} HP.',
		'[poison]{victim} чувству(ет|ют) себя всё хуже. Отравление съедает {value} HP.',
		'[poison]Отрава вытягивает из {victim} {value} HP.',
		'[poison]Яд неумолимо отнимает здоровье {victim}. Еще {value} HP потрачен(о|ы) на борьбу с отравой.',
		'[poison]Чувствуя действие яда всё сильнее, {victim} теря(е|ю)т {value} HP.',
		'[poison]{victim} теря(е|ю)т {value} HP от отравления.',
		'[poison]Головокружение и тошнота — не самое страшное, куда серьёзней {victim} показалась потеря {value} HP.',
		'[poison]Отрава вытягивает из {victim} {value} HP.',
		'[poison]{victim} отравлен(а|о|ы) и теря(е|ю)т {value} единиц(у|ы) здоровья.',
		'[poison]{victim} страда(е|ю)т от отравления, получая {value} единиц(у|ы) урона.',
		'[poison]Медленно убивая {victim} изнутри, отравление наносит {value} единиц(у|ы) урона.',
		'[poison]Сильное отравление лишает {victim} {value} HP.',
		'[poison]Нанося {victim} {value} единиц(у|ы) урона, отравление грозит (ему|ей|им) летальным исходом.',
		'[poison]Охваченн(ый|ая|ое|ые) ядовитыми парами, {victim} теряет {value} HP.',
		'[poison]Смерть подступает всё ближе, и {victim} теря(е|ю)т от отравления {value} HP.',
		'[poison]Яд растекается по венам {victim}. Он(а|о|и) теря(е|ю)т {value} HP.',
		'[poison]{victim} задыха(е|ю)тся и кашля(е|ю)т в созданном {actor} ядовитом облаке.',

		/* Ядовитое облако */
		'[poisoncloud]{victim} оказал(ся|ась|ось|ись) в созданном {actor} облаке яда.',
		'[poisoncloud]Быстро создав ядовитое облако, {actor} окутал(а|о|и) им {victim}.',
		'[poisoncloud]{actor} создал(а|о|и) вокруг {victim} ядовитое облако.',
		'[poisoncloud]{victim} задыха(е|ю)тся и кашляет в созданном {actor} ядовитом облаке.',
		'[poisoncloud]Ядовитое облако, сотворённое {actor}, окутало {victim}.',
		'[poisoncloud]Ядовитое облако, созданное {actor}, обволокло {victim}.',
		'[poisoncloud]{actor} создал(а|о|и) странный пар вокруг {victim} и (тот|та|то|те) начал(а|о|и) задыхаться.',
		'[poisoncloud]{actor} создал(а|о|и) ядовитое облако вокруг {victim}.',


		/* Удар вампира */
		'[vamp]Жаждя крови {victim}, {actor} вонзил(а|о|и) зубы в (его|ее|их) тело. От такой атаки {victim} потерял(а|о|и) {value} HP, а {} приобрел(а|о|и) {vamp} HP.',
		'[vamp]Вконец остервенев от злости, {actor} вцепил(ся|ась|ось|ись) зубами в {victim} и нанес(ла|ло|ли) (ему|ей|им) {value} единиц(у|ы) урона, при этом восстановив {vamp} HP.',
		'[vamp]{actor} вспомнил(а|о|и), что из оружия у (него|нее|ней|них) есть ещё и зубы. Вцепившись ими в {victim}, он(а|о|и) восстановил(а|о|и) {vamp} HP и нанес(ла|ло|ли) противник(у|ам) {value} единиц(у|ы) урона.',
		'[vamp]Хорошо прицелившись, {actor} прыгнул(а|о|и) и впил(ся|ась|ось|ись) зубами в {victim}, нанеся (ему|ей|им) {value} единиц(у|ы) урона и восстановив себе {vamp} HP.',
		'[vamp]Выждав подходящий момент для сложной атаки, {actor} с силой грызанул(а|о|и) {victim} и, почувствовав (его|ее|их) кровь, восстановил(а|о|и) {vamp} HP. От укуса {} потерял(а|о|и) {value} HP.',
		'[vamp]{actor} зубами впил(ся|ась|ось|ись) в {victim}, нанес(ла|ло|ли) {value} единиц(у|а|ы) урона и восстановил(а|о|и) {vamp} HP.',
		'[vamp]Даже самая толстая кожа не спасла бы от укуса {actor}. {victim} проща(е|ю)тся с {value} HP, из которых {vamp} HP переход(и|я)т к {}.',
		'[vamp]{actor} вытянул(а|о|и) из {} {value} HP и излечил(а|о|и) свои раны на {vamp} HP.',


		/* Шаг в сторону */
		'[ue]Серией быстрых движений {actor} дезориентиру(ет|ют) {victim}.',
		'[ue]{actor} ловко уш(ел|ла|ло|ли) в сторону от {victim}.',
		'[ue]{actor} мастерски уш(ел|ла|ло|ли) от атаки {victim}.',

		/* Увернулся */
		'[eva]{actor} носит(ся|ась|ось|ись) кругами вокруг {victim}, вынуждая (его|ее|их) промахнуться.',
		'[eva]Отточенным движением {actor} уш(ел|ла|ло|ли) из-под удара.',
		'[eva]{actor} увернул(ся|ась|ось|ись) от {victim} и (его|ее|их) чудовищной силы удара.',
		'[eva]{actor} увернул(ся|ась|ось|ись) от удара.',
		'[eva]{actor} резко качнул(ся|ась|ось|ись) в сторону и {victim} промахнул(ся|ась|ось|ись).',
		'[eva]{actor} провел(а|о|и) обманное движение, и {victim} промазал(а|о|и).',

		'[eva]Солнце ослепило {victim}, и (тот|та|то|те) промахнул(ся|ась|ось|ись) по {actor}.',
		'[eva]{victim} слишком долго собирал(ся|ась|ось|ись) с мыслями, и удар пришёлся в никуда.',
		'[eva]{victim} «крякнул(а|о|и)» и промахнул(ся|ась|ось|ись).',
		'[eva]Перемудрив с обманными движениями, {victim} промахнул(ся|ась|ось|ись).',
		'[eva]{victim} поднатужил(ся|ась|ось|ись)… и промахнул(ся|ась|ось|ись)…',
		'[eva]{victim} промахнул(ся|ась|ось|ись)! {victim} промахнул(ся|ась|ось|ись)!',
		'[eva]{actor} вовремя подал(ся|ась|ось|ись) назад, и {victim} промахнул(ся|ась|ось|ись).',
		'[eva]{actor} успел(а|о|и) отбежать подальше, пока {victim} замахивал(ся|ась|ось|ись).',
		'[eva]Слишком сильно размахнувшись, {victim} сбил(ся|ась|ось|ись) с темпа и не попал(а|о|и) по {actor}.',
		'[eva]Сильнейший удар {victim} со свистом рассёк воздух, даже не задев {actor}.',
		'[eva]Попавшая в глаз {victim} соринка сорвала атаку, и он(а|о|и) промахнул(ся|ась|ось|ись).',
		'[eva]{victim}, готовясь к сильному удару, совсем забыл(а|о|и) о точности и промахнул(ся|ась|ось|ись).',
		'[eva]Явно считая, что сила есть, а точности не надо, {victim} промахнул(ся|ась|ось|ись) по {actor}.',
		'[eva]{victim} крякнул(а|о|и) и промахнул(ся|ась|ось|ись).',
		'[eva]Прыжок, кувырок, перекат, снова перекат... Отскок! {actor} так верт(и|я)тся, что {victim} никак не мо(жет|гут) попасть по (нему|ней|ним).',

		'[eva,fire]Слишком долго готовясь к атаке, {victim} упустил(а|о|и) подходящий момент, и (его|ее|их) огненный шар не попал в цель.',
		'[eva,fire]{victim} запустил(а|о|и) шар огня в {}, но не тут-то было! {actor} виртуозно уклонил(ся|ась|ось|ись) от пламени.',
		'[eva,fire]{actor} завороженно проводил(а|о|и) взглядом пролетевший мимо огненный шар.',
		'[eva,stunHit]{victim} разбежал(ся|ась|ось|ись) и пронес(ся|лась|лось|лись) мимо {actor}.',
		'[eva,stunHit]{victim} бросил(ся|ась|ось|ись) в сторону {actor}, но увы, проскочил(а|о|и) мимо.',
		'[eva,vamp]{victim} клацнул(а|о|и) зубами рядом с {actor}, не сумев вцепиться в (него|нее|них).',
		'[eva,vamp]{actor} ускользнул(а|о|и) от зубов {victim}.',
		'[eva,vamp]{victim} укусил(а|о|и) себя вместо {actor}.',
		'[eva,vamp]Слишком сильно открыв рот для укуса, {victim} ощутил(а|о|и) боль в челюсти и не смог(ла|ло|ли) укусить {actor}.',
		'[eva,vamp]{victim} попытал(ся|ась|ось|ись) укусить {actor}, но промахнул(ся|ась|ось|ись).',
		'[eva,vamp]{victim} раззявил(а|о|и) рот, но подходящий для укуса момент уже был упущен.',
		'[eva,vamp]{victim} промахнул(ся|ась|ось|ись), бесполезно клацнув зубами.',

		/* Заморозка */
		'[slow]Легко, почти непринуждённо, {actor} охлажда(ет|ют) воздух вокруг {victim}, сковывая (его|ее|их) движения.',
		'[slow]{actor}, сосредоточившись, ударил(а|о|и) {victim} потоком липкого холодного воздуха, сковав (его|ее|их) члены и замедлив движения.',
		'[slow]Собравшись, {actor} направля(ет|ют) инеевые искры в сторону врага. Воздух вокруг {victim} замерзает и густеет, замедляя (его|ее|их) движения.',
		'[slow]{actor} взывает к зимним ветрам и {victim} окутывает ужасный холод, (его|ее|их) движения замедляются.',
		'[slow]Призывая в помощь зимние ледяные ветра, {actor} бьет холодом, и {victim}, покрываясь инеем, замедля(ется|ются).',
		'[slow]{actor} встряхнул(а|о|и) кисти рук и на кончиках (его|ее|их) пальцев образовались ледяные иглы. Сконцентрировавшись, (он|она|оно|они) нанес(ла|ло|ли) удар холодом. Движения {victim} замедлились.',
		'[slow]Собравшись, {actor} направляет инеевые искры в сторону враг(а|ов). Воздух вокруг {victim} замерзает и густеет, замедляя (его|ее|их) движения.',
		'[slow]{actor} сделал(а|о|и) глубокий вдох и резко выдохнул(а|о|и). {victim} ощутил(а|о|и) как идёт мороз по коже и замедляются (его|ее|их) движения.',
		'[slow]{actor} вызыва(е|ю)т лютую стужу и направля(е|ю)т холод в сторону {victim}, замедляя (его|ее|их) движения.',

		/* Ускорение */
		'[speed]Скорость движений {actor} сильно возросла после того как он(а|о|и) сделал(а|о|и) магический пасс.',
		'[speed]{actor} использу(е|ю)т скрытые резервы организма и заметно ускоря(е|ю)тся.',
		'[speed]{actor} перенаправля(е|ю)т свою ци в нижнее русло и начина(е|ю)т двигаться быстрее.',
		'[speed]{actor} замыка(е|ю)т на себе потоки магии и начина(е|ю)т двигаться значительно быстрее.',
		'[speed]{actor} концентрируется и скорость (его|ее|их) движений возрастает.',
		'[speed]Обуздав стихию ветра, {actor} ускоря(е|ю)т движения.',
		'[speed]Воспользовавшись магией, {actor} начина(е|ю)т двигаться невероятно быстро.',
		'[speed]{actor} сотворя(е|ю)т сложный знак и значительно ускоря(е|ю)тся.',
		'[speed]Сделав сложный пасс, {actor} начина(е|ю)т двигаться быстрее.',

		/* Волшебный гриб */
		'[mush]«Волшебный гриб!» — воскликнул(а|о|и) {actor}, запихивая в рот мухомор.',
		'[mush]Откуда-то {actor} достал(а|о|и) и отправил(а|о|и) в рот волшебный синий гриб.',
		'[mush]{actor} случайно съел(а|о|и) обычный шампиньон, однако, благодаря самовнушению, все-равно получил(а|о|и) приток сил.',

		/* Шар огня */
		'[fire]{actor} броса(ет|ют) огненный шар в {victim} и сжига(ет|ют) (ему|ей|им) {value} HP.',
		'[fire]{actor} кида(ет|ют) огненный шар, опалив {victim} и нанеся {value} единиц(у|ы) урона (его|ее|их) здоровью.',
		'[fire]{actor} концентриру(ет|ют) магическую энергию и выпуска(ет|ют) пылающий огненный шар. {victim} получа(ет|ют) урон в {value} HP и сильные ожоги.',
		'[fire]{actor} выпустил(а|о|и) два огненных шара, но {victim} ловко увернул(ся|ась|ось|ись) и уже готовил(ся|ась|ось|ись) к удару, как оба шара, закрутившись по спирали, развернулись и врезались (ему|ей|им) в спину. Коварное самонаводящееся заклинание нанесло {value} единиц(у|ы) урона и подожгло {}.',
		'[fire]{actor} создал(а|о|и) огненный шар и направил(а|о|и) его прямо во врага… Есть контакт! Повреждение — {value} единиц(а|у|ы) урона.',
		'[fire]Выпущенный {actor} шар огня ожёг {victim} на {value} HP.',
		'[fire]Взывая к пламени, {actor} выпуска(ет|ют) огненный шар в ничего не подозревающ(его|ую|ее|их|ий) {victim}, уменьшая (его|ее|их) здоровье на {value} HP.',
		'[fire]Взывая к пламени, {actor} выпуска(ет|ют) огненный шар в ничего не подозревавший {victim}, уменьшая (его|ее|их) здоровье на {value} HP.',//err
		'[fire]{victim} не успел(а|о|и) увернуться от возникшего прямо из воздуха всполоха пламени. От ожогов (он|она|оно|они) потерял(а|о|и) {value} HP.',

		'[fire]{actor} выпустил(а|о|и) шар огня. Волшебное пламя нанесло {value} единиц(у|ы) урона ошарашенн(ому|ой|ым) {victim}.',
		'[fire]Почувствовав тепло, {actor} сформировал(а|о|и) его в огненный шар и ударил(а|о|и) им по {victim}, нанеся {value} единиц(у|ы) урона.',
		'[fire]{actor} взмахива(е|ю)т руками и магическое пламя стремительно покрывает {victim}, забирая {value} HP.',

		/* Пламя (после Шара огня) */
		'[flame]Теряя {value} HP, {victim} пыта(ется|ются) сбить с себя пламя.',
		'[flame]Пламя окутывает {victim}, нанося {value} единиц(у|ы) урона.',
		'[flame]Вместе с запахом паленого ветер уносит в сторону от {victim} {value} HP.',
		'[flame]Хрустящей корочки еще нет, но {value} HP у {victim} уже сгорело.',
		'[flame]Жаркое пламя наносит {victim} {value} единиц(у|ы) урона.',
		'[flame]Подожженн(ый|ая|ое|ые) {victim} теря(ет|ют) {value} HP.',
		'[flame]{victim} стара(ется|ются) сбить с себя пламя, но оно всё равно сжигает {value} HP.',
		'[flame]Весёлые языки пламени пляшут по {victim}, нанося {value} единиц(у|ы) урона.',
		'[flame]Пламя слизывает с {victim} {value} HP, как корова языком.',
		'[flame]Безжалостный огонь наносит {victim} {value} единиц(у|ы) урона.',
		'[flame]Пламя в недоступном месте вызвало у {victim} ужасную боль и нанесло {value} единиц(у|ы) урона.',
		'[flame]{victim} горит и получа(ет|ют) {value} единиц(у|ы) урона.',
		'[flame]Языки пламени гуляют по {victim}, и (он|она|оно|они) теря(ет|ют) {value} HP.',
		'[flame]Охваченн(ый|ая|ое|ые) огнём, {victim} лишил(ся|ась|ось|ись) {value} HP.',
		'[flame]{victim} меч(е|у)тся, охваченн(ый|ая|ое|ые) пламенем, и получа(е|ю)т {value} единиц(у|ы) урона.',
		'[flame]{victim} пыла(е|ю)т словно факел(ы) и получа(е|ю)т {value} единиц(у|ы) урона.',
		'[flame]От ожогов {victim} получа(е|ю)т {value} единиц(у|ы) урона.',

		/* Разбег-толчок */
		'[stunHit]{actor} разбежал(ся|ась|ось|ись) и в прыжке, толкнув {victim}, нанес(ла|ло|ли) {value} единиц(у|ы) урона.',
		'[stunHit]{actor} с разбега пнул(а|о|и) {victim} и нанес(ла|ло|ли) {value} единиц(у|ы) урона.',
		'[stunHit]Разбежавшись, {actor} толкнул(а|о|и) {victim}, выколачивая из (него|нее|них) {value} HP.',
		'[stunHit]Набрав скорость, {actor} врезал(ся|ась|ось|ись) всей массой в противника. {victim} получил(а|о|и) ушибы и потерял(а|о|и) {value} HP.',
		'[stunHit]Немного отступив, {actor} разогнал(ся|ась|ось|ись) и толчком нанес(ла|ло|ли) {victim} {value} единиц(у|ы) урона.',
		'[stunHit]Дождавшись, когда {victim} окаж(е|у)тся на достаточном расстоянии, {actor} разбежал(ся|ась|ось|ись) и ударил(а|о|и), нанеся {value} единиц(у|ы) урона.',
		'[stunHit]Примерившись, {actor} толчком выколотил(а|о|и) {value} единиц(у|ы) урона из {victim}.',
		'[stunHit]Подобно дикому кабану {actor} нес(е|у)тся вперед и таран(и|я)т {victim} так, что он(а|о|и) отлета(е|ю)т на несколько метров. От удара {} потерял(а|о|и) {value} HP.',
		'[stunHit]{actor} разбежал(ся|ась|ось|ись) и впечатал(а|о|и) {victim} в дерево, несчастн(ый|ая|ое|ые) не досчитал(ся|ась|ось|ись) {value} HP.',

		/* Шок (от Разбег-толчок)*/
		'[stun]{victim} в шоке и не мо(жет|гут) атаковать.',
		'[stun]{victim} пересчитыва(е|ю)т звёздочки, кружащиеся у (него|нее|них) над голов(ой|ами).',
		'[stun]{victim} пыта(е|ю)тся восстановить равновесие.',
		'[stun]{victim} было подумал(а|о|и) ударить, но оказал(ся|ась|ось|ись) не в состоянии додумать мысль.',
		'[stun]Оглушенн(ый|ая|ое|ые) {victim} вяло крут(и|я)т голов(ой|ами), не решаясь атаковать.',
		'[stun]{victim} пыта(е|ю)тся прийти в себя.',
		'[stun]Пропустив сильный удар, {victim} пыта(е|ю)тся устоять на ногах.',
		'[stun]{victim} с увлечением лов(и|я)т летающие вокруг голов(ы) звёздочки.',
		'[stun]У {victim} троится в глазах.',

		/* Регенерация */
		'[heal]Дав себе установку выздороветь, {actor} восстановил(а|о|и) {value} HP.',
		'[heal]Сконцентрировавшись, {actor} восстановил(а|о|и) {value} HP.',
		'[heal]{actor} восстановил(а|о|и) {value} HP.',
		'[heal]«Исцеление — это то, что сейчас важнее всего», — подумал(а|о|и) {actor} и восстановил(а|о|и) {value} HP.',
		'[heal]{actor} восстановил(а|о|и) {value} HP и смахнул(а|о|и) пот.',
		'[heal]{actor} отскакива(е|ю)т в сторону и, воспользовавшись короткой паузой, восстанавлива(е|ю)т {value} HP.',

		/* Помощь игрока */
		'[godheal]Вокруг {} засветился воздух и (его|ее|их) раны затянулись, излечив {value} HP.',
		'[godheal]Банка с йодом? Что мне с ней сделать, выпить?',
		'[godheal]Почувствовав жжение в теле, {} замечает, что (его|ее|их) раны затягиваются.',
		'[godheal]{} исцелен на {value} HP.',
		'[godheal]Зелёный луч ударил с небес, исцеляя {} на {value} HP.', //crit
		'[godheal]Снег посыпался на {}, восстанавливая {value} HP.',
		'[godheal]Банка с йодом? Что мне с ней сделать, выпить?',
		'[godheal]Ха-ха, божественная регенерация!',

		'[godhit]Неведомая сила подняла {} в воздух и швырнула под ноги {}.',
		'[godhit]Молния существенно поджарила {}.',
		'[godhit]Вот значит как работают вакуумные бомбы…',
		'[godhit]Бабочка неудачно приземлилась на {}, выведя (того|ту|то|тех) из равновесия, результат — серьёзная шишка у {}.',
		'[godhit]На горизонте показалась яркая точка, стремительно приближающаяся к {}. Мгновение и шар огня выжег аккуратный круг там, где находился противник.',
		'[godhit]«Неужели… Это… Случилось?!» — ошарашенно шепчет {}, наблюдая за тем, что подошедший отряд стражников делает с {}.',
		'[godhit]Неожиданно огромный перст опустился с небес прямо на {}. {} издал(а|о|и) сдавленный визг.',
		'[godhit]Лёгкий ветерок внезапно снёс {} с места и впечатал в скалу. {} злобно смеётся над оглушённым монстром.',
		'[godhit]Почувствовав приятный аромат жареного, {} замечает, что {} охватило яркое пламя. С душераздирающим визгом он(а|о|и) медленно обуглива(е|ю)тся.',
		'[godhit]{} оказал(ся|ась|ось|ись) не готов(а|о|ы) к падению метеорита. В образовавшемся кратере будет сложно искать добычу.',
		'[godhit]«Падающие наковальни — это, конечно, хорошо, но вот куда они потом пропадают?» — задался {} вопросом, созерцая то, во что превратил(ся|ась|ось|ись) {}.',
		'[godhit]{} еле успел(а|о|и) отскочить от взрыва шаровой молнии. {} подлетел(а|о|и) в воздух и больно упал(а|о|и) вниз.',

		/* Отдых */
		'[rest]Раны начинают затягиваться, и {actor} восстанавлива(ет|ют) {value} HP.',
		'[rest]Немного отдохнув и набравшись сил, {actor} восстановил(а|о|и) {value} HP.',
		'[rest]Увидев неподалёку небольшой кожаный мешочек, {actor} решил(а|о|и) изучить его и обнаружил(а|о|и) несколько пробирок с красной жидкостью, по запаху напоминавшей чай из целебных трав. Выпив последний сосуд, {actor} стал(а|о|и) чувствовать себя бодрее на {value} HP, а вот мешочек развеялся в прах. Увы, его с собой не забрать.',
		'[rest]{actor} стиснул(а|о|и) зубы и со второй попытки всё-таки вправил(а|о|и) недавно полученный вывих. Восстановлено {value} HP.',
		'[rest]{actor} уделил(а|о|и) внимание своему исстрадавшемуся телу: сделал(а|о|и) перевязку, промыл(а|о|и) раны, ссадины, — и облегчение не заставило себя долго ждать. Исцелено {value} HP.',
		'[rest]{actor} накладыва(ет|ют) повязку, как учили. Видать, не зря учили — восстанавливается {value} HP.',
		'[rest]{actor} прикладыва(ет|ют) прохладные примочки к ушибленному плечу, тем самым снимая отёк и успокаивая боль. Вылечено {value} HP.',
		'[rest]Как приятно на время отбросить грозное оружие, вездесущий рюкзак и прилечь на землицу родную. В блаженном покое {actor} восстанавлива(ет|ют) {value} HP.',
		'[rest]Использовав совет одного целителя, {actor} собрал(а|о|и) немного паутины и аккуратно уложил(а|о|и) её в промытую рану. Буквально на глазах кровь свернулась, образовав защитный слой. Вылечен(о) {value} HP.',
		'[rest]«Эльфийских капель не найти полезней! Эльфийские капли от всех болезней!» — напева(ет|ют) {actor}, восстанавливая {value} HP.',
		'[rest]Обнаружив неподалёку небольшой источник, {actor} решил(а|о|и) сделать несколько глотков и промыть раны. Появилось ощущение свежести, спокойствия и уверенности. Вылечено {value} HP.',
		'[rest]«Эх, а водичка-то из родничка просто прелесть», — {actor} поправля(ет|ют) {value} HP.',
		'[rest]{actor} слегка подкрепил(ся|ась|ось|ись), вылечено {value} HP.',
		'[rest]Проходящий мимо монах ткнул дорожной тростью в {actor}, и на (нем|ней|нем|них) сразу начали заживляться раны. Вылечено {value} HP.',
		'[rest]«Как хорошо просто полежать, дав своему телу немного отдохнуть, восстановить силы и здоровье». Исцелено {value} HP.',
		'[rest]Проходящий мимо шаман кастанул чайник и исцелил на {value} HP',
		'[rest]«Волшебный пластырь — действительно эффективная штука! За мгновение восстановил(а|о|и) {value} HP!»',
		'[rest]Растущие рядом лопухи помогли восстановить {value} HP.',
		'[rest]Целебные орочьи горчичники вылечили {value} HP, но оставили пару ожогов.',
		'[rest]Пара съеденных яблок улучшила настроение и восстановила {value} HP.',
		'[rest]«Наверное, стоит приложить что-нибудь холодное к ушибленной ноге и дать ей немного отдыха». Вылечено {value} HP.',
		'[rest]Ух ты, а подорожник помогает: вылечил(а|о|и) {value} HP',
		'[rest]Пожевал(а|о|и) корешок, он оказался целебным и восстановил {value} HP. «Хоть какая-то от этих диет польза».',
		'[rest]Крепкий отвар помог восстановить {value} HP.',
		'[rest]«Рана загнила. Делать нечего, чтобы зараза не пошла дальше, придётся прижигать». Вылечено {value} HP.',
		'[rest]Магическое зелье Й.О.Д. начинает действовать и восстанавливает {value} HP.',
		'[rest]«Ужас, как же раскалывается голова… Может есть смысл просто полежать ни о чём не думая?» Восстановлено {value} HP.',
		'[rest]Вино помогло вернуть {value} HP всего за несколько глотков.',
		'[rest]Пролетавшая мимо фея помогла восстановить {value} HP.',
		'[rest]Применил(а|о|и) магию вуду и исцелил(ся|ась|ось|ись) на {value} HP',
		'[rest]Удачно наложенная повязка восстановила {value} HP.',
		'[rest]Отвар из чистотела помог {actor} избавиться от раздражений на коже, чем сильно поднял настроение. Вылечено {value} HP.',
		'[rest]Втирая пиявок в кожу, {actor} восстановил(а|о|и) {value} HP.',
		'[rest]«Так вот от чего у меня плечо зудит!» — облегченно восклица(ет|ют) {actor}, выдирая кусок зуба из своей раны. Вылечено {value} HP.',
		'[rest]Отвар целебных трав возымел силу и вернул {value} HP.',
		'[rest]Сделав настой календулы, {actor} промыва(ет|ют) свои воспалённые и слезящиеся от пыли глаза. Вылечено {value} HP.',
		'[rest]Втерев в раны наскоро приготовленную мазь, {actor} сразу же почувствовал(а|о|и) себя лучше. Вылечено {value} HP.',
		'[rest]«Ну и гадость!» — {actor} выпивает очередную порцию запасенного когда-то лечебного отвара.',
		'[rest]Стиснув зубы, зашивает глубокий порез.',
		'[rest]Пьёт целебный отвар.',
		'[rest]{actor} чувствует, как лёгкие наполняются воздухом, а рассудок — ясностью.',
		'[rest]Война войной, а обед — по расписанию. Скушав маленько припасов, {} подлечил(ся|ась|ось|ись) на {value} HP.',
		'[rest]«Дела делами, а отдыхать и кушать надо — все-таки не из железа и камня я сделан(а|о).»',
		'[rest]«Вдали виднеется многовековой дуб. Прилягу под ним, думу подумаю…»',
		'[rest]Пьет целебный отвар.',
		'[rest]Пожевал(а|о|и) корешок, он оказался целебным и восстановил {value} HP. «Хоть какая-то от этих диет польза.»',
		'[rest]Использовав совет одного целителя, {} собрал(а|о|и) немного паутины и аккуратно уложил(а|о|и) ее в промытую рану. Буквально на глазах кровь свернулась, образовав защитный слой. Вылечено {value} HP.',


		/* Торговля */
		'[coins]Нет, таких торгашей надо вешать. {value} монет(а|у|ы) за {item}, он с ума сошёл!',
		'[coins]«Получил(а|о|и) {value} монет(а|у|ы) в награду за {item}.»',
		'[coins]{value} монет(а|у|ы) за {item}. Честная сделка.',
		'[coins]«За {item} {value} монет(а|у|ы). Вот же ей Бо… бей лавочников, спасай Пандору!»',
		'[coins]«Эх, не зря я тащил(а|о|и) {item}», — решил(а|о|и) {}, пряча {value} монет(а|у|ы).',
		'[coins]«Мне чужого не надо, вот и продаю {item}. Тем более, {value} монет(а|у|ы) не лишн(яя|ие|их)».',
		'[coins]Применив пытливость и изворотливость ума, {} продал(а|о|и) {item} аж за {value} монет(а|у|ы). Перед продажей оставил(а|о|и) подпись «{}» на самом заметном месте — хоть какой-то заметный след в истории.',
		'[coins]«Цел(ая|ые|ых) {value} монет(а|у|ы) за {item}? В чём подвох, торговец?»',
		'[coins]«{value} монет(а|у|ы) за {item}? Ладно, забирай, я сегодня добр(ый|ая|ое).»',
		'[coins]«Что?! {value} монет(а|у|ы) за мои подвиги?! А {item} на обочине валял(ся|ась|ось|ись), по-твоему?! Ладно, не ори. По рукам. Проклятый торгаш.»',
		'[coins]«Глупый торговец, отдал {value} монет(а|у|ы) за дешев(ый|ую|ое|ые) {item}.»',
		'[coins]{} скептически смотр(ит|ят) на {value} монет(а|у|ы), вырученн(ую|ые|ых) за {item}, и, пожимая плечами, убира(ет|ют) деньги в карман.',
		'[coins]{}, остервенело торгуясь, получа(ет|ют) таки {value} монет(а|у|ы) за {item}.',
		'[coins]«Отличная цена за {item}. Положил(а|о|и) {value} монет(а|у|ы) в кошелёк.»',
		'[coins]{} грозно посмотрел(а|о|и) на спекулянта: «Ладно, давай сюда сво(ю|и|их|й) {value} монет(а|у|ы) и забирай {item}, пока я не передумал(а|о|и).»', //err
		'[coins]«Не торговцы, а жлобы! Я ему {item}, а он мне жалк(ую|ие|их) {value} монет(а|у|ы)! Небось втридорога продаст!»',
		'[coins]«А {value} монет(а|у|ы) за {item} гораздо лучше чем ничего…»',
		'[coins]«Слышь, ты, хапуга?! {value} монет(а|у|ы) за {item}?! Окстись! Давай деньги. Молчи, с тобой торг закончен…»',
		'[coins]«{value} монет(а|у|ы) за {item}? Да это же последний писк моды!»',
		'[coins]«{value} монет(а|у|ы) за {item} — это надо обмыть!»',
		'[coins]«{value} монет(а|у|ы) за {item}… Выйдешь ты на тракт… Нет, нет, ничего! Удачной торговли вам! И детям вашим! Крохобор…»',
		'[coins]С обречённым видом {} расста(ё|ю)тся с {item} всего за {value} монет(а|у|ы).',
		'[coins]День явно был не самым удачным. Всего {value} монет(а|у|ы) за первоклассн(ый|ую|ое|ые) {item}. Но это был единственный покупатель, и {} со смиренным лицом спрятал(а|о|и) деньги в карман.',
		'[coins]Торговка была хороша, даже слишком. И {} пришлось отдать {item} всего за {value} монет(а|у|ы).',
		'[coins]«{value} монет(а|у|ы) против плохоньк(ой|ого|их) {item}? Соглас(ен|на|но).»',
		'[coins]«Обманывать людей нехорошо… но так выгодно…» — думал(а|о|и) {}, пересчитывая {value} монет(а|у|ы), полученн(ую|ые|ых) за {item}.',
		'[coins]«{value} монет(а|у|ы) за {item} и неприятный запах — ну что за место?!»',
		'[coins]«{item} стоит не меньше {value} монет(а|у|ы)! Нет, так я найду другого покупателя! То-то же!»',
		'[coins]«Отличная сделка! {value} монет(а|у|ы) лучше, чем {item}.»',
		'[coins]{item} остал(ся|ась|ось|ись) в лавке, а {value} монет(а|у|ы) забрал(а|о|и) {}.',
		'[coins]«Всего {value} монет(а|у|ы) за {item}?! Да они издеваются!»',
		'[coins]После долгих споров и препираний торговец все же согласился отдать {value} монет(а|у|ы) за {item}.',
		'[coins]«За прекрасн(ый|ую|ое|ые) {item} жалк(ую|их|ие) {value} монет(а|у|ы). Сволочи!»',
		'[coins]«Вынудил(а|о|и) торговца купить {item} за {value} монет(а|у|ы).»',
		'[coins]«Вшив(ая|ые|ых) {value} монет(а|у|ы) за {item}. Ворьё!»',
		'[coins]{value} монет(а|у|ы) — достойная плата за {item}.',
		'[coins]«Мошенники! Всего {value} монет(а|у|ы) за прекрасн(ый|ую|ое|ые) {item}!»',
		'[coins]«Безобразие! Жалк(ая|ие|их) {value} монет(а|у|ы) за редчайш(ий|ую|ее|ие) {item}?! Грабёж! Ох и жульё на здешнем рынке…»',
//		'[coins]{} споткнул(ся|ась|ось|ись) о камень, а это оказался кошель с {value} монетами! Вот так повезло!',
		'[coins]«Городской травник, гоблин преклонных лет, долго изучал состав принесённых сухих трав, попутно рассказывая о их свойствах. Травы были оценены в {value} монет(а|у|ы)».',
		'[coins]Заметив в моем инвентаре {item}, торговец в ужасе отпрянул и заплатил мне {value} монет(а|у|ы) за то, чтобы я выкинул(а|о) эту мерзость подальше.',
		'[coins]Творчески использовав классику торговли — обсчет, обвес и пересорт, продал(а|о) торговцу {item} за {value} монет(а|у|ы).',


		/* Поднял */
		'[pickup]{item} лег(ла|ло|ли) в рюкзак как родн(ая|ой|ое|ые).',
		'[pickup]«Вроде бы всего лишь {item}, а приятно.»',
		'[pickup]Обыскав место сражения, {} находит {item} и забирает добычу себе.',
		'[pickup]«{} всё равно больше не нужно, а мне {item} пригод(ится|ятся).»',
		'[pickup]«{item} самое место у меня в рюкзаке.»',
		'[pickup]{}, довольн(ый|ая|ое|ые) собой, обыскав {}, убира(ет|ют) найденн(ый|ую|ое|ые) {item} к себе в сумку.',
		'[pickup]«Эх, с паршивой овцы хоть шерсти клок!» — думал(а|о|и) {}, пряча {item} в рюкзак.',
		'[pickup]«Что с {} взять, кроме {item}?»',
		'[pickup]Попрыгав и похлопав в ладоши от восторга, {} упаковыва(ет|ют) обнаруженн(ый|ую|ое|ые) {item} в рюкзак.',
		'[pickup]«Превосходно, вот и трофеями судьба не обделила», — думает {}, убирая {item} в рюкзак.',
		'[pickup]Битва закончена лишь тогда, когда собраны трофеи. {}, положив {item} к себе в рюкзак, продолжа(ет|ют) своё странствие.',
		'[pickup]Вытерев {item} о траву, {} упаковал(а|о|и) добычу в рюкзак.',
		'[pickup]«{}, воровато озираясь, прикарманил(а|о|и) {item}.»',
		'[pickup]{} мертв(а|о|ы). {item} в рюкзаке. {} счастлив(а|о|ы).',
		'[pickup]«Нет худа без добра! Вот отличн(ый|ая|ое|ые) {item}, надо прибрать себе в рюкзак.»',
		'[pickup]«Что тут у нас? {item}! Неплохо…»',
		'[pickup]«Сегодня явно мой день, столь восхитительн(ый|ую|ое|ые) {item} не каждый раз найдёшь. Надо бы (его|ее|их) к себе в рюкзак положить.»',
		'[pickup]«Ну вот так всегда, никогда на них живого места нет: тут как-то неестественно вывернуто, там кость торчит, глаз вытек, рожа изуродована, а про шкуру так и вообще говорить нечего… Постойте-ка! А вот {item}, кажется, не очень помят(а|о|ы), да и кровью не пропитал(ся|ась|ось|ись). Решено. Беру!»',
		'[pickup]«{item}. А что ещё взять с {}?»',
		'[pickup]{} перебрал(а|о|и) добычу и закинул(а|о|и) {item} к себе в сумку.',
		'[pickup]Присвистнув от радости, {} пряч(ет|ат) найденн(ый|ую|ое|ые) {item} в сумку.',
		'[pickup]Какая удача! Обшарив останки {}, {} наш(ел|ла|ло|ли) {item}!',
		'[pickup]«Как(ой|ая|ое|ие) замечательн(ый|ая|ое|ые) {item}, в хозяйстве пригод(ится|ятся)», — {} убира(ет|ат) добычу в рюкзак.',
		'[pickup]«Невесть что, но горсть монет я за это уж точно получу» — пробормотал(а|о|и) {}, убирая {item} в рюкзак.',
		'[pickup]Чистая победа — грязн(ый|ая|ое|ые) {item}.',
		'[pickup]«Древняя мудрость гласит: {item} в рюкзак — авантюристу приятней… Неее… баба с возу — авантюристу легче?…»',
		'[pickup]«О, {item}! Пригод(и|я)тся.»',
		'[pickup]{item} воня(ет|ют) даже сильнее, чем грязн(ый|ая|ое|ые) {}, но {} не из брезгливых.',
		'[pickup]«Отлично, {item}! Доволочь до города — там можно будет продать.»',
		'[pickup]«Вот это я понимаю! {item}! То что надо!»',
		'[pickup]«Ух ты, как(ой|ая|ое|ие) прекрасн(ый|ая|ое|ые) {item}!» — {} с блаженным лицом укладывает трофей к себе в сумку.',
		'[pickup]«Так, что тут у нас? {item}? Долж(ен|на|но|ны) пригодиться.»',
		'[pickup]{} морщит нос, но вытира(ет|ют) дурно пахнущ(ий|ую|ее|ое|ие|их) {item} и запихива(е|ю)т в рюкзак.',//err
		'[pickup]«Не густо, всего лишь {item}, но хоть что-то.»',
		'[pickup]«Что это тут», — думал(а|о|и) {}, выуживая {item} из того, что осталось от {}.',
		'[pickup]«Хлам, конечно, но может и удастся продать…» — подумал(а|о|и) {}, убирая {item} в сумку.',
		'[pickup]Воровато оглядываясь по сторонам, {} запихивает в рюкзак {item}.',
		'[pickup]«Вот в такие моменты я понимаю, что всё не зря», — думает {}, умиляясь найденн(ому|ой|ым) {item} и пряча (его|ее|их) к себе в рюкзак.',
		'[pickup]«Хм… Не мешок бриллиантов, но и {item} с {} тоже ничего.»',
		'[pickup]Изумительн(ый|ая|ое|ые) {item} — достойная награда победителя.',
		'[pickup]«{item}? В рюкзак! В хозяйстве пригодится.»',
		'[pickup]«Не дело трофеями пренебрегать.» — пробормотал(а|о|и) {}, засовывая {item} к себе в рюкзак.',
		'[pickup]«Моя Прелесть», — подумал(а|о|и) {} и, оглядываясь по сторонам, бережно спрятал(а|о|и) {item} в рюкзак.',
		'[pickup]«Сражение превращается в бесполезный риск, если нет трофеев», — замечает про себя {}, пряча {item} в рюкзак.',
		'[pickup]«Приш(ел|ла|ло|ли), увидел(а|о|и), победил(а|о|и) — забрал(а|о|и) {item}!»',
		'[pickup]{} — смерть, победителю — {item} — вот естественный ход вещей.',
		'[pickup]«{item}! Всё в дом, всё в дом!»',
		'[pickup]Один из лучших экземпляров {item}, и победитель забирает (его|ее|их) по праву.',
		'[pickup]«Хороший враг — мёртвый враг, а хорош(ий|ая|ее|ие) {item} — {item} в рюкзаке.»',
		'[pickup]«Так себе {item}, но не бросать же.»',
		'[pickup]«Дело за малым: продать {item} и купить что-нибудь нужное.»',
		'[pickup]«{item}… Неплохой трофей…»',
		'[pickup]«Мертв(ый|ая|ое|ые) {} на первое, сладкое чувство победы на второе, и {item} на десерт.»',
		'[pickup]«Неплохая вещица, (этот|эта|это|эти) {item} — надо оставить себе.»',
		'[pickup]«После славной битвы и трофей должен быть достойным победителя! Что тут у нас… {item}, значит. Отлично!»',
		'[pickup]«С паршив(ого|ой|ых) {} хоть {item} клок… А, там про овцу и шерсть…»',
		'[pickup]«Раны болят не так сильно, если после боя тебя ждёт достойная награда… Вот прекрасн(ый|ая|ое|ые) {item}, положим (его|ее|их) в рюкзак… Хм-м, определённо, самочувствие стало лучше.»',
		'[pickup]«Нет лучшего места для {item}, чем мой рюкзак.»',
		'[pickup]{item} и слава — вот награда {} за победу над {} коварн(ым|ой|ыми)!',
		'[pickup]Грёзы о трофеях были не напрасны. {} восхищается {item} и убирает (его|ее|их) в рюкзак.',
		'[pickup]Взглядом опытного мародера {} осмотрел(а|о|и) останки {} и спрятал(а|о|и) {item} в рюкзак.',
		'[pickup]{}, воровато озираясь, прикарманил(а|о|и) {item}.',
		'[pickup]«Так, {item}, положу-ка я тебя вот сюда».',
		'[pickup]{} подбросил(а|о) {item} над головой. Т(от|о|а|е) перелетел(а|о|и) за спину и упал(а|о|и) прямо в рюкзак к остальной добыче. «В яблочко!» – довольно улыбнул(ся|ась|ось) {}.',
		'[pickup]«Что-то упало. Я точно видел(а|о), как что-то упало с {}. Да вот только непонятно, куда? О, наш(ел|ла|ло)! {item}!»',
		'[pickup]Немного постояв над найденн(ым|ой|ыми) {item}, {} аккуратно (его|ее|их) поднял(а|о) и спрятал(а|о) к себе в рюкзак.',
		'[pickup]«{item}? Возьму. Продам кому-нибудь на рынке».',
		

		/* Пусто */
		'[empty]«Нет, мешок денег было бы чересчур, но хоть что-то могло достаться в награду?»',
		'[empty]{} склоняется над поверженн(ым|ой|ыми) {}… и ничего не находит.',
		'[empty]Порывшись в останках {}, {} ничего не наш(ел|ла|ло), вытер(ла|ло|ли) руки и уш(ел|ла|ло).',
		'[empty]«Ненавижу, когда так получается: бьёшься, жизнью рискуешь, а награды нет!»',
		'[empty]{} посмотрел(а|о), что осталось от {}, и с досадой отметил(а|о): «Добычи нет.»',
		'[empty]{} не наш(ел|ла|ло) ничего полезного на тушк(е|ах) монстр(а|ов).',
		'[empty]«Тут брать нечего. Если так дело и дальше будет, я по миру пойду.»',
		'[empty]«И за что было сражаться? Добычи явно нет.»',
		'[empty]«Какая уж тут добыча? В живых остал(ся|ась|ось|ись), и то славно.»',
		'[empty]«Нечего взять с {}… Ладно, найду ещё кого-нибудь.»',
		'[empty]{} отдубасил(а|о) бандита так, что ничего ценного уже не осталось.',
		'[empty]{} с унынием смотрит на то, что осталось от {}. Совершенно очевидно, что здесь поживиться нечем.',
		'[empty]«И какой смысл столько времени тратить на сражение, если после этого даже взять нечего?»',
		'[empty]Сегодня {} без награды, но главное, что (он|она|оно) жив(а|о).',
		'[empty]«Что тут? Пусто…» — Пнув {}, {} продолжает свой путь.',
		'[empty]{} склоняется над поверженн(ым|ой|ыми) {} и… плюясь и ворча, не находит добычи.',
		'[empty]{} со злостью плюёт на останки {}, всё равно трофеев никаких.',
		'[empty]{} настолько увлек(ся|лась|лось|лись), что от {} ничего не осталось.',
		'[empty]{} понял(а|о|и), что поживиться тут нечем, но не унывает: «Легче сумка — шире шаг.»',
		'[empty]«Можно было бы строго судить авантюриста, если опять нет добычи, и этот авантюрист пошёл бы грабить караваны?…»',
		'[empty]В этот раз {} остал(ся|ась|ось|ись) без добычи.',
		'[empty]Небрежно осмотрев останки {}, и не найдя ничего полезного, {} отправил(ся|ась|ось|ись) дальше.',
		'[empty]«Тьфу ты ж! И взять с {} нечего!»',
		'[empty]«Трофеев нет, но будет ещё и на нашей улице праздник!»',
		'[empty]«Ангел хранитель, эй! Победили — это спасибо, конечно, но что я буду есть, если снова нет трофеев?»',
		'[empty]«Хранитель, эй! Победили — это спасибо, конечно, но что я буду есть, если снова нет трофеев?»',
		'[empty]«Победа есть, а добычи нет…»',
		'[empty]{} отдубасил(а|о) {} так, что ничего ценного уже не осталось.',
		'[empty]«Вот же тварь какая, и взять-то нечего.»',
		'[empty]Раздосадованн(ый|ая|ое|ые) отсутствием трофеев, {} глумится над останками {}.',
		'[empty]«Ну что за день сегодня такой?… Даже с {} взять нечего.»',
		'[empty]Измотанн(ый|ая|ое|ые) битвой {} с брезгливостью смотрит на место сражения, понимая, что трофеев здесь явно нет.',
		'[empty]Плохо. Очень плохо. {} остал(ся|ась|ось|ись) без добычи.',
		'[empty]Очередн(ой|ые) монстр(ы) без добычи, куда катится этот мир?',
		'[empty]Останки поверженн(ого|ой|ых) {} испарились прямо на глазах. Стоп! А где трофей?',
		'[empty]«И снова нечего взять.»',
		'[empty]Останки {} выглядят слишком противно, чтобы пытаться найти что-то ценное.',
		'[empty]Покойся с миром, несчастн(ый|ая|ое|ые) {}. Не принесла победа ни добычи, ни славы.',
		'[empty]«Да уж… Добычи нет, и стоило ли рисковать?»',
		'[empty]Ничего ценного. В следующий раз повезёт.',
		'[empty]«Совсем нет добычи? Будем искать!»',
		'[empty]И кукиш с маслом, как награда герою.',
		'[empty]«Вот же твари какие, и взять-то нечего.»',
		'[empty]«Рискуешь жизнью, терпишь лишения, сбиваешь ноги в кровь, и что в итоге? Ни-че-го!»',
		'[empty]После ожесточённой схватки {} оказал(ся|ась|ось|ись) настолько искромсан(а|о|ы), что о добыче можно и не думать.',
		'[empty]«Как-то и зимы холоднее стали, и рюкзаки делают маленькие. Тяжёлые времена ждут этот мир.»',
		'[empty]Столько сил потрачено и все напрасно.',


		/* Бросил */
		'[drop]«Вот несправедливость какая: отличн(ый|ая|ое|ые) {drop}, а забрать не получится — рюкзак уже полный.»',
		'[drop]«Надо что ли рюкзак побольше купить, а то такими вещами приходится разбрасываться… Неплох(ой|ая|ое|ие) был(и) {drop}.»',
//			'[drop]Короткая вспышка — и {} с удивлением смотр(ит|ят) на горстку пепла, оставшуюся от {drop}.', //manual drop
		'[drop]Найденн(ый|ая|ое|ые) {drop} не помеща(ется|ются) в рюкзак. «Кто ты, тот счастливчик, что получит (его|ее|их) задарма? И когда уже я найду брошенный кем-то трофей?»',
		'[drop]Сердце кровью обливается, когда приходится бросать {drop}. Но {} смотрит в набитый доверху рюкзак, и становится легче.',
		'[drop]Повертев в руках {drop}, доставш(ийся|уюся|ееся|иеся|егося) от {}, {} с сожалением выкинул(а|о|и) (его|ее|их) — в рюкзаке не осталось места.', //err
		'[drop]{} пытается запихнуть трофей в рюкзак, но, потерпев сокрушительное фиаско, решает, что {drop} ему не так уж сильно и нужен.',
		'[drop]{}, повертев в руках {item}, и не найдя куда (его|ее|их) засунуть, решил(а|о|и) в следующий раз купить штаны с дополнительными карманами.',
		'[drop]{item} остал(ся|ась|ось|ись) валяться на обочине дороги.',
		'[drop]В рюкзаке нет свободного места и {item} пришлось оставить.',
		'[drop]«Это не дело: рюкзак — битком — трофеи складывать некуда.»',
		'[drop]«Нужен рюкзак побольше, а то в этот уже не влезает.»',
		'[drop]«Хм… {item}. А запихнуть-то некуда — рюкзак набит — придется выкинуть.»',
		'[drop]{} пыжится, всё вертит и пытается впихнуть {item} в рюкзак, но там слишком мало места. Вздохнув, он выбрасывает {item}.',
		'[drop]Рюкзак полон и {} не может взять добыт(ый|ую|ое|ые) {item}.',
		'[drop]Хмуро глядя в набитый доверху рюкзак, {} оставляет добычу на земле.',
		'[drop]«Опять забыл(а|о|и) от хлама избавиться!» — ворчит {}, выбрасывая подобранн(ый|ую|ое|ые) {item}.',
		'[drop]«Надо срочно продать чего-нибудь, освободить место в рюкзаке. Ну жалко ж бросать {item}!»',
		'[drop]«Был бы рюкзак побольше… А пока {item} придется выбросить.»',
		'[drop]Найденн(ый|ая|ое|ые) {item} не помеща(ется|ются) в рюкзак. «Кто ты, тот счастливчик, что получит (его|ее|их) задарма? И когда уже я найду брошенный кем-то трофей?»',
		'[drop]Оставлю я {item} здесь, может кому сгодится.',
		'[drop]{item} никак не влаз(ит|ят) в рюкзак, придётся выкинуть.',
		'[drop]«Некуда уже пихать, ну и демон с {item}.»',
		'[drop]{} попытал(ся|ась|ось|ись) впихнуть {item} к себе в рюкзак, но, услышав подозрительный треск швов, оставил(а|о|и) эту затею и выкинул(а|о|и) добычу.',
		'[drop]«Нет, всё же грех жаловаться. Вон уже и трофеи складывать некуда!»',
		'[drop]«Надо что ли рюкзак побольше купить, а то такими вещами приходится разбрасываться… Неплох(ой|ая|ое|ие) был(а|о|и) {item}.»',
		'[drop]«Святой лук-порей! Опять куча хлама в инвентаре!» — со слезами на глазах, {} уходит прочь, а {item} остается одиноко лежать на земле.',
		'[drop]«Вот и {item} уже не влезает. Решено — пора продавать трофеи.»',
		'[drop]В придорожные кусты лет(и|я)т {item}. В рюкзак (его|ее|их) уже не впихнуть.',
		'[drop]Израненн(ый|ая|ое) {} смотрит в переполненный рюкзак и понимает, что {item} туда уже не влезет, и (его|ее|их) придётся бросить. Знакомая каждому, извечная и обидная ситуация.',
		'[drop]«В рюкзаке совсем нет места. Зачем мне столько барахла?» — думает {}, выбрасывая добытый {item}.',
		'[drop]Рюкзак полон настолько, что чуть ли не трещит по швам. {} с грустью оставляет добыт(ый|ую|ое|ые) {item} и идёт дальше.',
		'[drop]Красиво жить не запретишь! Рюкзак уже битком, и неплох(ой|ая|ое|ие) {item} летит в канаву.',
		'[drop]Рюкзак и так слишком тяжёлый. Вздохнув, {} оставляет {item} на поле боя.',
		'[drop]«То совсем пусто, то густо, так что уже и в рюкзак не влезает — придется выкидывать хорош(ий|ую|ое|ие) {item}.»',
		'[drop]{} безуспешно пытается засунуть {item} в трещащий по швам рюкзак: «Да здесь еще три артефакта влезет, глупая авоська! Где заклинание утрамбовывания?!»',
		'[drop]Обливаясь слезами, {} последний раз смотр(и|я)т на найденн(ый|ую|ое|ые) {item} и оставляет (его|ее|их) на обочине — в рюкзаке уже нет места.',
		'[drop]Неплох(ой|ая|ое|ие) {item}, но в рюкзак уже не влез(е|ю)т.',
		'[drop]«Так бывает», — отмеча(е|ю)т {}, глядя в доверху набитый рюкзак и выкидыва(е|ю)т {item}.',
		'[drop]«Если я возьму с собой ещё и {item}, то спина мне этого не простит.»',
		'[drop]«Так не достанешься же ты никому, {item}!» — иступлённо крикнул(а|о|и) {} и выбросил(а|о|и) трофей, не поместившийся в рюкзак, в канаву.',
		'[drop]{} пытается запихнуть трофей в рюкзак, но, потерпев сокрушительное фиаско, решает, что {item} (ему|ей|им) не так уж сильно и нуж(ен|на|но|ны).',
		

		/* Начало боя */
		'[fight]{} и {} сошлись на узкой дорожке.',
		'[fight]За спиной {} хрустнула ветка. Он(а|о|и) ме-едленно обернул(ся|ась|ось|ись), доставая оружие, и увидел(а|о|и) {}, стояв(шего|шую|шее|ших) с видом полной невинности.',
		'[fight]«А это ещё что за бести(я|и)? {}?»',
		'[fight]«Ни на минуту нельзя расслабиться!» — {} атаку(е|ю)т {}.',
		'[fight]Впереди {}, ищущ(ий|ая|ое|ие) неприятностей, — «Эй, я здесь!»',
		'[fight]{} преградил(а|о|и) дорогу. {} вынужден(а|о|и) принять сражение.',
		'[fight]«{}? Что ж, потанцуем!»',
		'[fight]{} на горизонте, в бой!',
		'[fight]Битвы не избежать — впереди {}.',
		'[fight]Как {} ни пытал(ся|ась|ось|ись) притвориться мертв(ым|ой), {} всё равно пош(ел|ла|ло|ли) в наступление.',
		'[fight]«Что там впереди? {}? Ближе… Сейчас я буду добывать трофеи.»',
		'[fight]«Что-то тут не так. Не в засаду ли меня несё… Проклятье! {}!»',
		'[fight]«Судьба сводит меня с {}? Что ж…»',
		'[fight]Ужасн(ый|ая|ое|ые) {} выскочил(а|о|и) из кустов.',
		'[fight]«Это {}! К бою!»',
		'[fight]«{}! Оружие наголо!»',
		'[fight]«Ни минуты покоя!» — на пути {}!',
		'[fight]«Ого, да это {}. Исчезающий вид!»',
		'[fight]«И так жить на свете страшно, а тут еще и {}!»',
		'[fight]«Проклятье! Не золотуха, так {}!»',
		'[fight]«Это была самая большая ошибка в твоей жизни… и последняя…» — грозно произнес(ла|ло|ли) {} и приготовил(ся|ась|ось|ись) к бою против {}.',
		'[fight]Обернул(ся|ась|ось|ись) на странный шум и увидел(а|о|и) {}.',
		'[fight]«{}, как мне вас не хватало!» — проворчал(а|о|и) {}, разминая кисти рук.',
		'[fight]«Неужто передо мной {}? Отлично! Будет чем пополнить мою коллекцию трофеев!»',
		'[fight]«Говорят, места тут спокойные. Тогда что тут дела(е|ю)т {}?!»',
		'[fight]«Ха-ха! Вот мы и сошлись, {}!»',
		'[fight]Вовремя заметив приближающ(егося|уюся|ееся|ихся|ийся) {}, {} приготовил(ся|ась|ось|ись) к бою.',
		'[fight]«На ловца и зверь бежит! Сегодня это {}!»',
		'[fight]Неожиданно перед {} появля(е|ю)тся {}, заставляя (его|ее|их) подпрыгнуть от испуга! «Никому не дозволено безнаказанно меня пугать!» — вопит {} и отчаянно бросается в бой.',
		'[fight]{} на пути!',
		'[fight]{} видит, как дорогу прегражда(е|ю)т {}.',
		'[fight]За очередным поворотом дороги {} сталкива(е|ю)тся с {}.',
		'[fight]«Подозрительно тихо, не нравится мне это… Так и есть, {}!»',
		'[fight]Из придорожных зарослей выскочил(а|о|и) {}!',
		'[fight]{}, чувствуя опасность, насторожил(ся|ась|ось|ись) и вовремя заметил(а|о|и) {}.',
		'[fight]{} заметил(а|о|и) впереди {} и готовится к схватке.',
		'[fight]«Впереди {}! Здоров(ый|ая|ое|ые), зараз(а|ы)!»',
		'[fight]«Вот сколько раз уже сражал(ся|ась|ось|ись) с {}, а популяция их всё не убывает… О! Вот опять!»',
		'[fight]Из-за кустов показыва(ется|ются) {}. «Не случайно нынешней ночью тревожные сны снились.»',
		'[fight]{} в опасности — на (его|ее|их) пути {}.',
		'[fight]«Я, отважн(ый|ая|ое) {}, смело принимаю бой! Никто не выстоит против меня! Даже {}!»',
		'[fight]{} преградил(а|о|и) дорогу. {} вынужден(а|о|и) принять сражение.',
		'[fight]«Хм, {}. Давно пора очистить от них Пандору!»',
		'[fight]«В книгах пишут, что нападение это лучшая защита. Как бы проверить?… Ха, {}! Как по заказу».',
		'[fight]{} бросил(а|о) камень в кусты, чем разозлил(а|о) {}, стоявш(его|ую|ее|их) за ними.', 
		'[fight]«Кажется, я нарушил(а|о) границы территории {}. Сейчас меня будут прогонять».',
		'[fight]«Ну, кто на меня? {}!»',
		'[fight]«Ни проехать, ни пройти пока {} сто(ит|ят) на пути!»',
		
		'[fight]Вовремя заметив {victim}, {actor} подкрал(ся|ась|ось|ись) сзади и сразил(а|о|и) противник(а|ов) одним ударом.',
		'[fight]{actor} зловеще ухмыльнул(ся|ась|ось), когда {victim} попал(ся|ась|ось|ись) в предусмотрительно установленную на дороге ловушку.'
//		'[walk]Проезжавший мимо крестьянин узнал {actor} и немного подвёз на своей телеге.'

		/* */
	];

	var parseHighlightRaw = [
		'[value]\\d+ звездоч(?:ка|ки|ек)?',
		'[value]\\d+ HP',
		'[value]\\d+ единиц(:?у|а|ы)? урона',
		'[value]\\d+ урона?',
		'[energy]\\d+ единиц(:?у|а|ы)? энергии',
		'[coins]\\d+ монет(?:ами|ой|а|у|ы)?',
		'[exp]\\d+ опыт(?:а)?',
		'[level]\\d+ уровень'
	];

	function processHighlightRaw(parseHighlightRaw) {
		var typeReg = /^\[[a-zA-Z]+\]/g;
		var result = [];
		for (var i = 0; i<parseHighlightRaw.length; i++) {
			var cfgString = parseHighlightRaw[i];
			var parsedCfg = {};

			var p = typeReg.exec(cfgString);
			if (p && p[0]) parsedCfg.type = p[0].substring(1, p[0].length-1);
			cfgString = cfgString.replace(typeReg, '');

			parsedCfg.regex = new RegExp(cfgString);
			result.push(parsedCfg)
		}
		return result;
	}
	function processShortRaw(cfgRaw) {
		var ESCAPE = /[?.]/g;
		var anyRegExp = new RegExp('({})', 'g');
		var numbersRegExp = new RegExp('({value})', 'g');
		var paramsRegExp = new RegExp('({[a-zA-Z]+})', 'g');
		var namesRegExp = '([а-яА-ЯёЁa-zA-Z\\d _\\-\']+)';

		var paramReg = /{([a-zA-Z]+)}/g;
		var result = [];

		var typeReg = /^\[([a-zA-Z]+)(?:,([a-zA-Z]+))?\]/;

		for(var i = 0; i<cfgRaw.length; i++) {
			var cfgString = cfgRaw[i].replace(/ё/g, 'е');
			var parsedCfg = {};

			var p = typeReg.exec(cfgString);
			if (p) {
				if (p[1]) parsedCfg.type = p[1];
				if (p[2]) parsedCfg.sec = p[2];
//				else parsedCfg.sec = 'vamp';
				cfgString = cfgString.replace(p[0], '');
			}
			if (cfgString.charAt(0) != '~') {
				cfgString = '^' + cfgString;
				cfgString = cfgString + '$';
			}

			var paramNames = [];
			do  {
				var p = paramReg.exec(cfgString);
				if (p) paramNames.push(p[1]);
			} while (p);
			parsedCfg.params = paramNames;

			cfgString = cfgString
				.replace(ESCAPE, '\\$&')
				.replace(/\(/g, '(?:')
				.replace(/\)/g, ')?')
				.replace(anyRegExp, '.+')
				.replace(numbersRegExp, '(\\d+)')
				.replace(paramsRegExp, namesRegExp);
			parsedCfg.regex = new RegExp(cfgString);
			result[i] = parsedCfg;
		}
		return result;
	}

	var cfgShort = processShortRaw(parseShortRaw);
	var cfgHighlight = processHighlightRaw(parseHighlightRaw);

	function parseShort(msg) {
		msg = msg.replace(/ё/g, 'е');
		for(var i = 0; i<cfgShort.length; i++) {
			var cfgParsedLine = cfgShort[i];
			var paramNames = cfgParsedLine.params;
			var values = cfgParsedLine.regex.exec(msg);

			if (values) {
				values = values.slice(1);

				var act = {};
				act.type = cfgParsedLine.type;
				if (cfgParsedLine.sec) act.sec = cfgParsedLine.sec;
				for(var paramIndex = 0; paramIndex < paramNames.length; paramIndex++) {
					var param = paramNames[paramIndex];
					act[param] = isNaN(values[paramIndex]) ? values[paramIndex] : +values[paramIndex];
				}

				act.isMe = (act.actor ? _ext.isMyName(act.actor) : (act.victim ? !_ext.isMyName(act.victim) : true ))|0;
				if (!_ext.settings.settingsValues.heroNameStart) act.isMe = 0;

			}
		}

		return act;
	}
	function parseHighlight(msg, act) {
		for (var i = 0; i<cfgHighlight.length; i++) {
			var regExp = cfgHighlight[i].regex;
			var type = cfgHighlight[i].type || 'value';
			msg = msg.replace(regExp, '<span class="' + type + '">$&</span>')
		}
		for (var cls in act) if (act.hasOwnProperty(cls)) {
			var value = act[cls];
			if (cls != 'value' && cls != 'type') {
				msg = msg.replace(value, '<span class="'+cls+'">'+value+'</span>')
			}
		}
		return msg;
	}


	$.extend(_parse, {
		short: parseShort,
		highlight: parseHighlight
	});
	return _parse;
})({});

_ext.parse = _parse;




var _const = _ext.const;
var _trace = _ext.trace;
var _elements = _ext.elements;
var _icons = _const.ICONS;

function isActType(types, actType) {
	return _const[types].indexOf(actType) >= 0;
}


/* towns */
var _towns = (function(_towns) {
	var $townsContent = _elements.getTabInner('towns');
	$('body')
		.on('click.town', '.town', function() {
			if (!mapData) return;
			var id = $(this).data('place-id');
			showMapDialogById(id);
		})
		.on('click.town', '.reload', function() {
			if (_ext.map_version) {
				_towns.mapDataUpdate(_ext.map_version)
					.done(function(mapData) {
						townParams(mapData);
					});
			}
		});


	$townsContent.html('<span class="link-ajax pull-right reload glyphicon glyphicon-repeat"></span>');



	var mapData;
	function mapDataUpdate(map_version) {
		return $.ajax({
			url: '/dcont/map/region-' + map_version + '.js',
			dataType: 'json',
			type: 'get'
		})
			.done(function(map_data) {
				_towns.mapData = mapData = map_data;
				_ext.publish('townsInit', map_data);
			});
	}

	function init() {
		var places = mapData.places;
		var html = '';
		for (var i in places) if (places.hasOwnProperty(i)) {
			var place = places[i];
			html +=
				'<tr class="place-row" data-place-id="' + place.id + '">' +
					'<td class="size"><span class="badge">' + place.size + '</span></td>' +
					'<td>' +
						'<span class="link-ajax town" data-place-id="' + place.id + '">' + place.name + '</span>' +
						' <span class="quest"></span>' +
					'</td>' +
//						'<td data-city-param="1" class="production"></td>' +
					'<td data-city-param="размер экономики"></td>' +
					'<td data-city-param="безопасность"></td>' +
					'<td data-city-param="транспорт"></td>' +
					'<td data-city-param="свобода"></td>' +
				'</tr>';
		}
		html =
			'<table class="table table-towns table-noborder table-hover-dark table-condensed">' +
				'<thead>' +
					'<th class="size" title="Размер города">Р</th>' +
					'<th>Название</th>' +
//						'<th>Произв.</th>' +
					'<th title="Размер экономики">Э</th>' +
					'<th title="Безопасность">Безоп.</th>' +
					'<th title="Транспорт">Транс.</th>' +
					'<th title="Свобода">Своб.</th>' +
				'</thead>' +
				'<tbody>' +
					html +
				'</tbody>' +
			'</table>';
		var $table = $(html).appendTo($townsContent);
		window.tables.makeSortable($table);



		_towns.townQuestUpdate = function(quests) {
			$('.place-row .quest').html('');
			for (var questsIndex=0;questsIndex<quests.length;questsIndex++) {
				var quest = quests[questsIndex];
				var actors = quest.actors;
				for (var i=0; i<actors.length; i++) {
					var actor = actors[i];
					var isFrom = i === 0 && actors.length > 1;
					var actorType = actor[0];
					var actorTypeId = actor[1];
					var placeId = actorTypeId == 1 ? actor[2].id : actor[2].place;
					var $placeRow = $('.place-row[data-place-id="' + placeId + '"]');
					var $townQuest = $placeRow.find('.quest');
					var questHtml =
						(isFrom ? '<span class="glyphicon glyphicon-arrow-right"></span>' : '<span class="glyphicon glyphicon-arrow-left"></span>') +
						'<span class="quest-icon-mini pgf-quest-icon ' + quest.type + '" title="' + actorType + '"></span> ';
					$townQuest.append(questHtml);
				}
			}
		};

		for (var i=0; i<_prevParams.length; i++) {
			_towns.townQuestUpdate.apply(_towns, _prevParams[i]);
		}

	}
	var _prevParams = [];
	_towns.townQuestUpdate = function() {
		_prevParams.push(arguments);
	};

	function townParams(mapData) {
		var places = mapData.places;
		for (var i in places) {
			(function(placeIndex) {
				var place = places[placeIndex];
				requestPlace(place.pos.x, place.pos.y)
					.done(function(html) {
						var parsed = parsePlaceHtml(html);
						var $placeRow = $('.place-row[data-place-id="' + placeIndex + '"]');
						parsed.cityParams.forEach(function(item) {
							var val = item.value;
							if (val < 100) val = '&nbsp;' + val;
							$placeRow.children('[data-city-param="' + item.name + '"]').html(val);
						});
					});
			})(i);
		}
	}


	function parsePlaceHtml(html) {
		var $info = $(html);

		var cityParams = [];
		var $cityParamsRows = $info.find('#pgf-cell-place-parameters').find('tr').slice(1);
		$cityParamsRows.each(function() {
			var $row = $(this);
			var paramName = $.trim($row.children('th').first().text());
			var valueText = $row.children('td').first().text();
			var value = parseFloat(valueText);
			cityParams.push({
				name: paramName,
				value: value
			});
		});
		return {
			cityParams: cityParams
		};
	}

	function requestPlace(x,y) {
		return $.ajax({
			url: '/game/map/cell-info?x=' + x + '&y=' + y + '&_=' + (+new Date()),
			method: 'get',
			dataType: 'html'
		});
	}


	function showMapDialogById(id) {
		var place = mapData.places[id];
		showMapDialog(place.pos.x, place.pos.y);
	}
	function showMapDialog(x, y) {
		pgf.ui.dialog.Create({ fromUrl: pgf.urls['game:map:cell_info'](x, y),
			OnOpened: function(dialog) {
				pgf.base.InitializeTabs('game-map-cell-info', 'map',
					[[jQuery('.pgf-cell-description-button', dialog), 'description'],
						[jQuery('.pgf-cell-persons-button', dialog), 'persons'],
						[jQuery('.pgf-cell-place-parameters-button', dialog),'place-parameters'],
						[jQuery('.pgf-cell-place-demographics-button', dialog),'place-demographics'],
						[jQuery('.pgf-cell-place-bills-button', dialog),'place-bills'],
						[jQuery('.pgf-cell-place-modifiers-button', dialog), 'place-modifiers'],
						[jQuery('.pgf-cell-place-chronicle-button', dialog), 'place-chronicle'],
						[jQuery('.pgf-cell-building-button', dialog), 'building'],
						[jQuery('.pgf-cell-map-button', dialog), 'map'],
						[jQuery('.pgf-cell-debug-button', dialog), 'debug']]);
				jQuery('[rel="tooltip"]', dialog).tooltip(pgf.base.tooltipsArgs);

				if (widgets.abilities) {
					widgets.abilities.UpdateButtons();
					widgets.abilities.RenderAbility(pgf.game.constants.abilities.building_repair);
					jQuery('.angel-ability', dialog).toggleClass('pgf-hidden', false);
				}

			},
			OnClosed: function(dialog) {
				pgf.base.HideTooltips(dialog);
			}
		});
	}

	$.extend(_towns, {
		init : init,
		mapDataUpdate : mapDataUpdate,
		showMapDialogById : showMapDialogById
	});
	return _towns;
})({});

_ext.subscribe('preload', function() {
	if (_ext.map_version) {
		_towns.mapDataUpdate(_ext.map_version)
			.done(function() {
				_towns.init();
			});
	}
});
_ext.subscribe('questUpdate', function(quest) {
	_towns.townQuestUpdate(quest);
});
/* eo towns */

/* shortMessages */
var _shortMessages = (function(_shortMessages) {
//		var $shortContainer = _elements.getTabInner('short');
	function htmlMessages(messages) {
		var html = '';
		for (var i=0; i<messages.length; i++) {
			var message = messages[i];
//				var m = JSON.stringify(message);  data-m=\''+ m +'\'
			var htmlShortMsg = htmlMessage(message);
			var timestamp = message[0];
			var time = message[1];
			var htmlMsg;
			if (htmlShortMsg) {
				while (messages[i+1] && messages[i+1][1] === time) {
					var htmlShortMsg2 = htmlMessage(messages[i+1]);
					if (!htmlShortMsg2) break;
					htmlShortMsg += htmlShortMsg2;
					i++;
				}
				htmlMsg = '<li data-ts="'+timestamp+'" class="log-record-short">' + htmlShortMsg + '</li>';
			} else {
				var htmlLongMsg = htmlLongMessage(message);
				htmlMsg = '<li data-ts="'+timestamp+'" class="log-record">' + htmlLongMsg + '</li>';
			}
			html = htmlMsg + html;
		}
		return html;
	}

	function htmlMessage(message) {
		var time = message[1];
		var msg = message[2];
		var act = message[4]; //_ext.parse.message(message, 'message');

		var htmlMsg;
		if (!act || !act.type) return '';
		var isMe = act.isMe;
		var type = act.type;
		var sec = act.sec;
		var t = '';
		var val = act.value || '';
		var icon = _icons[type];
//			if (sec) console.log(sec, message[3], time)
		if (sec) icon += '<span class="sub-icon">' + _icons[sec] + '</span>';
		if (type === 'hit') t = val;
		else if (type === 'vamp') t = val + icon + '<span class="vamp">' + act.vamp + '</span>';
		else if (isActType('SHORT', type)) t = val + icon;

		if (t) htmlMsg = '<span class="submessage act act-' + act.type + (isMe ? ' me' : ' enemy') + '" title="' + time + '> ' + msg + '">' + t + '</span>';
		return htmlMsg || '';
	}

	function htmlLongMessage(message) {
		var time = message[1];
		var msg = message[2];
		var act = message[4];

		var actType = '';
		if (act && act.type) {
			var isMe = act.isMe ;
			actType = ' msg msg-' + act.type + (isMe ? ' me' : ' enemy');
		}
		var messageHighlight = _ext.parse.highlight(msg, act);


		var htmlLongMsg =
			'<div class="pgf-time time">' + time + '</div>' +
				'<div class="pgf-message message">' +
				'<div class="submessage' + actType + '">' + messageHighlight + '</div>' +
			'</div>';

		return htmlLongMsg;
	}

	$.extend(_shortMessages, {
		htmlMessage: htmlMessage,
		htmlLongMessage: htmlLongMessage,
		htmlMessages: htmlMessages
	});
	return _shortMessages;
})({});

/* eo shortMessages */


/* group */
var _groupMessages = (function(_groupMessages) {

	var $groupsContent = _elements.getTabInner('group');
	var $lastGroup;

	var messagesGrouped = [];

	function addMessages(messagesList) {
		for (var i=0; i<messagesList.length; i++) {
			addMessage(messagesList[i]);
		}
		return messagesGrouped;
	}

	/*
	data: {
		actionName: "пытается одолеть волка"
		info_link: "/guide/mobs/7/info"
		type: "fight"
		typeId: 3
	}*/
	function addMessage(message) {
		var hero = message[3];
		var act = message[4];
		var action = hero.action || false;

		var currGr = messagesGrouped[messagesGrouped.length-1];
		var isFirstGrouop = !currGr;

		if (isFirstGrouop) {
			/* самая первая группа */
			currGr = { /* заглушка */
				data: {}
			}
		} else {
			var currActionName = currGr.data.actionName;
			var currType = currGr.data.type;
			var currInfoLink = currGr.data.info_link;
			var currTypeId = currGr.data.typeId;
		}


		if (action) {
			var actionName = action.description;
			var actionTypeId = action.type;
			var actionType = _const.ACTION_TYPE_NAMES[actionTypeId];
			var actionInfoLink = action.info_link;

			if (!currActionName) currGr.data.actionName = currActionName = actionName;
			if (!currType) currGr.data.type = currType = actionType;
			if (!currInfoLink) currGr.data.info_link = currInfoLink = actionInfoLink;
			if (!currTypeId) currGr.data.typeId = currTypeId = actionTypeId;
			var grData = {
				actionName: actionName,
				type: actionType,
				info_link: actionInfoLink,
				typeId: actionTypeId
			};
			if (isFirstGrouop) grData.isBroken = 1; // first group
		}


		if (act) {
			var actType = act.type;
			var isFightStart = isActType('FIGHT_START', actType);
			var isFightEnd = isActType('LOOT', actType);
			if (actType === 'godheal' || actType === 'godhit') {
				grData = $.extend(grData, {god: 1});
			}

			if (isFightStart) {
				if (!isFirstGrouop) finishGroup();
				newGroup(message, {fightStarted: 1}); //fight started, not finished
				return;
			}
			if (isFightEnd) {
				if (isFirstGrouop) {
					newGroup(message, grData)
				} else {
					var lastG = addToLastGroup(message, {
						actionName: 'в бою',
						type: 'fight',
						info_link: '',
						typeId: 3
					});
					if (lastG.data.fightStarted) {
						delete lastG.data.fightStarted;
						if (lastG.data.isBroken !== 4 && lastG.data.isBroken !== 5) {
							delete lastG.data.isBroken;
						}
					} else {
						lastG.data.isBroken = 2; //fight ended, but not started
					}
					finishGroup();
				}

				if (action && actionName !== currActionName) {
					newGroup([message[0], message[1], actionName, false, false], grData);
				}
				return;
			}
			if (currGr.messages && currGr.messages.length && !currGr.data.fightStarted && isActType('FIGHT', act.type)) {
				grData = $.extend(grData, {isBroken: 5});
			}

		}


		if (action && actionName && currActionName && actionName !== currActionName) {
			finishGroup();
			newGroup(message, grData);
			return;
		}
		if (isFirstGrouop) {
			newGroup(message, grData)
		} else {
			addToLastGroup(message, grData);
		}

		function addToLastGroup(message, data) {
			var lastG = messagesGrouped[messagesGrouped.length-1];
			if (data) lastG.data = $.extend(data, lastG.data);
			if (lastG.messages.length) {
				var prevMsg = lastG.messages[lastG.messages.length-1];
				if (message[0] - prevMsg[0] > 1200) lastG.data.isBroken = 4; // hole in messages 20 min
			}
			lastG.messages.push(message);
			return lastG;
		}

		function finishGroup(data) {
			var lastG = messagesGrouped[messagesGrouped.length-1];
			delete lastG.data.unfinished;
			if (lastG.data.fightStarted) {
				lastG.data.isBroken = 3; // fight started, not ended
			}
			if (data) lastG.data = $.extend(data, lastG.data);
			_ext.publish('groupFinished', lastG, messagesGrouped.length-1);
		}
		function newGroup(message, data) {
			var newG = {
				data: {unfinished: 1},
				messages: []
			};
			if (data) newG.data = $.extend(data, newG.data);
			if (message) newG.messages.push(message);
			messagesGrouped[messagesGrouped.length] = newG;
			_ext.publish('groupStarted', newG, messagesGrouped.length-1);
		}
	}

	function redrawGroup(index, isOpen) {
		var $group = $groupsContent.children('.group[data-index="'+index+'"]');
		if ($group.length) {
			if (typeof isOpen !== 'undefined') {
				$group.toggleClass('open', isOpen);
			}
			$group.html(drawGroupInner(messagesGrouped[index], messagesGrouped[index+1]));
		} else {
			$groupsContent.prepend(drawGroup(messagesGrouped[index], index, isOpen));
		}
	}


	function drawGroup(group, index, isOpen) {
		isOpen = isOpen || _ext.settings.settingsValues.groupOpenOnDefault;
		var html =
			'<div class="group' + (isOpen ? ' open' : '') + '" data-index="' + index + '">' +
				drawGroupInner(group, messagesGrouped[index+1]) +
			'</div>';
		return html;
	}
	function drawGroupInner(group, groupNext) {
		if (!group || !group.messages || !group.messages.length) { return ''; }
		var messages = group.messages;
		var groupData = group.data;

		var messageFirst = messages[0];
		var messageLast = messages[messages.length-1];

		var groupType = groupData.type;
		var groupLink = (groupData.info_link || '').replace('/info', '');
		var htmlGroupIcon = _const.ACTION_TYPE_ICONS[groupType] || '';
		var iconAttr = 'class="action-icon ' + groupType + '" title="' + _const.ACTION_TYPE_TEXTS[groupType] + '"';

		if (groupData.isBroken && !groupData.unfinished) {
			htmlGroupIcon = _const.ACTION_TYPE_ICONS['broken'];
			var title = _const.ERROR_CODES[groupData.isBroken || 1];
			iconAttr = 'class="action-icon broken" title="' + title + '"';
		}
		if (groupLink) {
			htmlGroupIcon = '<a ' + iconAttr + ' href="'+groupLink+'" target="_blank">' + htmlGroupIcon + '</a>';
		} else {
			htmlGroupIcon = '<span ' + iconAttr + '">' + htmlGroupIcon + '</span>';
		}


		var htmlTitle = '<span class="action-name">' + (groupData.actionName || 'неизвестное действие') + '</span>';

		var timeStart = messageFirst[0];
		var timeEnd = messageLast[0];
		if (groupType !== 'fight' && groupNext && groupNext.messages[0]) {
			var timeStartNext = groupNext.messages[0] && groupNext.messages[0][0];
			if (timeStartNext - timeEnd < 120) timeEnd = timeStartNext; // проверка на случай сломанной группы
		}
		var timeSpan = timeEnd - timeStart;
		var htmlTime = /*'<span class="glyphicon glyphicon-time"></span> ' +*/
			'<span class="group-time ' + (timeSpan > 600 ? 'bad' : timeSpan > 300 ? 'average' : '') + '">' +
				_ext.utils.timeSpan(timeSpan) +
			'</span> ';



		var htmlGroupList = _shortMessages.htmlMessages(messages);

		var html =
				'<div class="group-title on-close' + (groupData.god ? ' god' : '') + '">' + htmlGroupIcon + htmlTime + htmlTitle +'</div>' +
//					'<div class="group-stats on-close">' + htmlStats + '</div>' +
				'<div class="group-controls">' +
					'<span class="group-toggle on-close text-muted glyphicon glyphicon-chevron-up"></span>' +
					'<span class="group-toggle on-open text-muted glyphicon glyphicon-chevron-down"></span>' +
				'</div>' +
				'<ul class="unstyled pgf-log-list on-open">' + htmlGroupList + '</ul>';

		return html;
	}
	function drawMessages(messagesGrouped) {
		var html = '';
		for (var i=0; i<messagesGrouped.length; i++) {
			html = drawGroup(messagesGrouped[i], i) + html;
		}
		$groupsContent.html(html);
		$lastGroup = $groupsContent.children('.group').first();
	}
	function drawFakeMessage(message) {
		var html = _shortMessages.htmlLongMessage(message);
		$lastGroup.prepend(html);
	}


	$.extend(_groupMessages, {
		list: messagesGrouped,
		addMessages: addMessages,
		drawFakeMessage: drawFakeMessage,
//			addMessage: addMessage,
//			group: group,
		drawMessages: drawMessages,
		redrawGroup: redrawGroup
	});

	return _groupMessages;
})({});

_ext.subscribe('init', function() {
	_groupMessages.addMessages(_trace.messagesLog);
	_groupMessages.drawMessages( _groupMessages.list );
//		_ext.subscribe('groupFinished', function(group, index) {
//			_groupMessages.redrawGroup(index);
//		});
	_ext.subscribe('groupStarted', function(group, index) {
		_groupMessages.redrawGroup(index-1);
	});
	_ext.subscribe('newTurn', function(messagesNew) {
		_groupMessages.addMessages(messagesNew);
		_groupMessages.redrawGroup(_groupMessages.list.length-1);
	});

});

_elements.getTabInner('group').on('click', '.group-title', function() {
	var $group = $(this).closest('.group');
	var index = $group.data('index');
	console.log('group>', _groupMessages.list[index]);
});
/* eo group */

_ext.elements.addControl('group-toggle', {title: 'Только действия / Подробности', content: '<span class="glyphicon glyphicon-chevron-' + (_ext.settings.settingsValues.groupOpenOnDefault ? 'down' : 'up') + '"></span>'})
	.on('click', function() {
//			_ext.elements.activeTab('group');
		var $icon = $(this).children('.glyphicon');
		var isOpen = $icon.hasClass('glyphicon-chevron-up');
		_elements.getTabInner('group')
			.children('.group').toggleClass('open', isOpen);
		_elements.getTabInner('archive')
			.find('.group').toggleClass('open', isOpen);
		$icon.toggleClass('glyphicon-chevron-down glyphicon-chevron-up');
	});



/* archive */
var _archive = (function(_archive) {
	var showArchive = _ext.settings.settingsValues.showArchive;
	var $archiveTab = _elements.getTab('archive').toggle(showArchive);

	_ext.subscribe('settingsChange', function(key, value) {
		if (key === 'showArchive') {
			showArchive = value;
			$archiveTab.toggle(showArchive);
			if (!showArchive) $archiveContent.html('');
		}
	});

	var $archiveTabContent = _elements.getTabInner('archive');

	$('<span class="link-ajax archive-renew">обновить</span>').appendTo($archiveTabContent)
		.on('click', function() {
			drawArchiveGroups(_archive.archiveGroups);
		});
	var $archiveContent = $('<div class="archive-content"></div>').appendTo($archiveTabContent);

	$archiveContent.on('click', '.group-toggle', function() {
		$(this).closest('.group').toggleClass('open');
	});

	function drawArchiveGroups(archiveGroups) {
		var levelIndex = 0;
		var levelsLog = _ext.log.get('levelsLog') || [];
		for (var i=0; i<archiveGroups.length; i++) {
			var group = archiveGroups[i];
			var ts = group.ts[1];
			var lv = levelsLog[levelIndex] || [];
			while (ts > lv[0]) {
				levelIndex++;
				var lvlHtml = '<div class="level">' + lv[1] + ' уровень!</div>';
				$archiveContent.prepend(lvlHtml);
				var lv = levelsLog[levelIndex] || [];
			}
			drawArchiveGroup(archiveGroups[i], i, archiveGroups);
		}
	}

	function drawArchiveGroup(archiveGroup, index, archiveGroups) {
		var isOpen =  _ext.settings.settingsValues.groupOpenOnDefault;
		var groupType = archiveGroup.broken ? 'broken' : archiveGroup.type;
		if (archiveGroup.mobId) {
			var groupLink = '/guide/mobs/' + archiveGroup.mobId;
		}
		var htmlGroupIcon = _const.ACTION_TYPE_ICONS[groupType] || '';
		if (groupLink) {
			htmlGroupIcon = '<a class="action-icon ' + groupType + '" href="'+groupLink+'" target="_blank">' + htmlGroupIcon + '</a>';
		} else {
			htmlGroupIcon = '<span class="action-icon ' + groupType + '">' + htmlGroupIcon + '</span>';
		}
		var title = (archiveGroup.text || 'неизвестное действие');
		var htmlTitle = '<span class="action-name">' + title + '</span>';


		var timeStart = archiveGroup.ts[0];
		var timeEnd = archiveGroup.ts[1];
		var archiveGroupNext = archiveGroups[index+1];
		if (groupType !== 'fight' && archiveGroupNext && archiveGroupNext.ts) {
			var timeStartNext = archiveGroupNext.ts[0];
			if (timeStartNext - timeEnd < 120) timeEnd = timeStartNext; // проверка на случай сломанной группы (3)
		}
		var timeSpan = timeEnd - timeStart;

		var htmlTime = /*'<span class="glyphicon glyphicon-time"></span> ' +*/
			'<span class="group-time ' + (timeSpan > 600 ? 'bad' : timeSpan > 300 ? 'average' : '') + '">' +
				_ext.utils.timeSpan(timeSpan) +
			'</span> ';


		var htmlGroupList = '';
		if (archiveGroup.total && (archiveGroup.type === 'fight' || archiveGroup.type === 'fight-god')) {
			htmlGroupList =
				'<span class="stats-archive stats-archive-me">' +
					drawArchiveActStat(archiveGroup.total.me) +
				'</span>' +
				'<span class="stats-archive stats-archive-enemy">' +
					drawArchiveActStat(archiveGroup.total.enemy) +
				'</span>';
		} else {
			var actName = _const.ACTION_TYPE_TEXTS[archiveGroup.type || 'undefined'];
			if (archiveGroup.broken) {
				actName = _const.ERROR_CODES[archiveGroup.broken || 1]
			}
			htmlGroupList = '<span class="stats-archive">' + actName + '</span>';
		}
		var html =
				'<div class="group-title">' + htmlGroupIcon + htmlTime + htmlTitle +'</div>' +
				'<div class="group-controls">' +
					'<span class="group-toggle on-close text-muted glyphicon glyphicon-chevron-up"></span>' +
					'<span class="group-toggle on-open text-muted glyphicon glyphicon-chevron-down"></span>' +
				'</div>' +
				'<div class="archive-log-list on-open">' + htmlGroupList + '</div>';

		html =
			'<div class="group' + (isOpen ? ' open' : '') + '" data-index="' + index + '">' +
				html +
			'</div>';

		$archiveContent.prepend(html);

	}

	function drawArchiveActStat(stats) {

		var types = ['dmgSum'].concat(_const.FIGHT);
		var html = '';
//			html += JSON.stringify(stats)
		for (var i=0; i<types.length; i++) {
			var type = types[i];
			if (stats[type]) {
				var stat = stats[type];
				var htmlStat = '';
				var htmlStatName = _icons[type];
				var count = stat.count;
				var sum = stat.sum;
				if (isActType('FIGHT_COUNTS', type)) {
					htmlStat += count + 'x' + htmlStatName;
				} else {
					if (type === 'dmgSum') {
						htmlStat += htmlStatName + '=<b>' + sum + '</b> ';
					} else {
						htmlStat +=  count + 'x' + htmlStatName;
						htmlStat += '=' + sum + ' ';
					}
				}

				html += '<span class="stats-archive-act stats-archive-' + type + '">' + htmlStat + '</span>';
			}
		}
		return html;

	}


	/* пересчет группы в архив */
	function countArchiveFromGroup(group) {
		var groupData = group.data;
		var messages = group.messages;
		if (!messages.length) return false;
		var isBroken = groupData.isBroken;
		var dataType = groupData.type;
		var first = messages[0];
		var last = messages[messages.length-1];
		var archiveGroup = $.extend({}, {
			ts: [first[0], last[0]],
			type: dataType,
			text: groupData.actionName,
			broken: isBroken
		});

		if (dataType === 'fight' && !isBroken) {
			archiveGroup.me = {};
			archiveGroup.enemy = {};
			if (groupData.info_link) {
				var mobId = groupData.info_link.replace('/guide/mobs/', '').replace('/info', '');
				if (+mobId) archiveGroup.mobId = +mobId;
			}

			/* пересчет последней группы */
			for (var i=0; i<messages.length; i++) {
				var message = messages[i];
				var act = message[4];
				if (!act) continue;
				var type = act.type; /* тип фразы */
				if (isActType('FIGHT', type)) {
					var isMe = act.isMe;
					var addTo = archiveGroup[isMe ? 'me' : 'enemy'];
					if (isActType('FIGHT_VALUES', type)) {
						addTo[type] = addTo[type] || [];
						addTo[type].push(act.value);
					} else {
						addTo[type] = addTo[type] || 0;
						addTo[type]++;
					}
				} else if (isActType('LOOT', type)) {
					archiveGroup.loot = type;
				}
			}
		}

		upgradeArchiveGroup(archiveGroup);
		return archiveGroup;
	}



	/* добавляет к архивам поле total */
	function upgradeArchiveGroup(archiveGroup, index) {
		if (!archiveGroup || !archiveGroup.ts) return archiveGroup;
		if (archiveGroup.me) {
			$.extend(archiveGroup, {
				total:{
					me: countTotalFromArchive(archiveGroup.me, 'me'),
					enemy: countTotalFromArchive(archiveGroup.enemy, 'enemy', archiveGroup.mobId == 66)
				}
			});
		}
		return archiveGroup;

		/* подсчет всех сумм из архива */
		function countTotalFromArchive(archiveGroupFrom) {
			var addTo = {dmgSum: {count:0, sum:0}};
			for (var type in archiveGroupFrom) if (archiveGroupFrom.hasOwnProperty(type)) {
				var vals = archiveGroupFrom[type];
				var isPassive = isActType('PASSIVE', type);
				var isHeal = type === 'heal';

				var count;
				var sum;
				if (typeof vals === 'number') {
					count = vals;
					sum = 0;
				} else {
					count = vals.length;
					sum = vals.reduce(function(pv, cv) { return pv + cv; }, 0) || 0;
				}

				var av;
				var critMin;
				var critVals;
				var critCount = 0;
				addTo[type] = addTo[type] || {sum: 0, count: 0};
				if (type === 'hit' && sum) {
					av = sum/count;
					critMin = av * 1.35;
					critVals = vals.filter(function(item) { return item > critMin;});
					critCount = critVals.length;
				}
				if (critCount) {
					addTo.crit = addTo.crit || {sum: 0, count: 0};
					var critSum = critVals.reduce(function(pv, cv) { return pv + cv; }, 0)||0;
					addTo.crit.count += critCount;
					addTo.crit.sum += critSum;
				}
				addTo[type].count += count;
				addTo[type].sum += sum;


				var typeSumTo = _const.SUM_TO_MAIN[type];
				if (typeSumTo) {
					addTo[typeSumTo] = addTo[typeSumTo] || {sum: 0, count: 0};
					addTo[typeSumTo].sum += sum;
				}
				if (!isHeal) {
					if (!isPassive) {
						addTo.dmgSum.count += count;
					}
					addTo.dmgSum.sum += sum;
				}
			}
			return addTo;
		}
	}
	function downgradeArchiveGroup(fullStats) {
		var archiveGroup = $.extend({}, fullStats);
		delete archiveGroup.total;
		delete archiveGroup.level;
		return archiveGroup;
	}

	function addArchiveGroup(group) {
		var _archiveGroups = _archive.archiveGroups;
		if (!group) return;
		var archiveGroup = countArchiveFromGroup(group);

		if (!archiveGroup) return;

		var lastStatGroup = _archiveGroups[_archiveGroups.length-1];
		if (!lastStatGroup || lastStatGroup.ts[0] === archiveGroup.ts[0]) {
			/* последняя группа обновляется каждый ход*/
			_archiveGroups[_archiveGroups.length-1] = archiveGroup;
		} else if (lastStatGroup.ts[0] < archiveGroup.ts[0]) {
			_archiveGroups.push(archiveGroup);
		} else {
			var isInArr = false;
			for (var i=0; i<_archiveGroups.length; i++) {
				var sg = _archiveGroups[i];
				if (sg.ts[0] === archiveGroup.ts[0]) {
					_archiveGroups[i] = archiveGroup;
					isInArr = true;
					break;
				}
			}
			if (!isInArr) {
				_archiveGroups.push(archiveGroup);
				_archiveGroups.sort(function(a,b) {
					return a.ts[0] - b.ts[0];
				});
//					console.log('add to millde', archiveGroup);
			}
		}
	}
	function loadArchiveGroups() {
		var _archiveGroups = _ext.log.get('archiveGroups') || [];
		_archiveGroups.sort(function(a,b) {
			return a.ts[0] - b.ts[0];
		});
		for (var i=0; i<_archiveGroups.length-1; i++) { /* remove doubles */
			if (_archiveGroups[i].ts[0] === _archiveGroups[i+1].ts[0]) {
				_archiveGroups.splice(i, 1);
				i--;
			}
		}
		_archiveGroups.map(upgradeArchiveGroup);
		_archive.archiveGroups = _archiveGroups;
	}
	function saveArchiveGroups() {
		var _archiveGroups = _archive.archiveGroups;
		var max = _ext.settings.settingsValues.maxArchiveLength || _const.MAX_ARCHIVE_LENGTH;

		_archiveGroups = _archiveGroups.slice(_archiveGroups.length-max);
		var toSave = _archiveGroups.map(downgradeArchiveGroup);
		_ext.log.set('archiveGroups', toSave);
	}

	$.extend(_archive, {
		drawArchiveGroups: drawArchiveGroups,

		loadArchiveGroups: loadArchiveGroups,
		saveArchiveGroups: saveArchiveGroups,
		addArchiveGroup: addArchiveGroup
	});
	return _archive;
})({});
_ext.subscribe('init', function() {
	_archive.loadArchiveGroups();
	for (var i=1; i<_groupMessages.list.length; i++) {
		var gr = _groupMessages.list[i];
		_archive.addArchiveGroup(gr);
	}
	_archive.saveArchiveGroups();


	_ext.subscribe('newMessages', function() {
		var group = _groupMessages.list[_groupMessages.list.length - 1];

		_archive.addArchiveGroup(group);
	});
	_ext.subscribe('groupFinished', function(group, index) {
		_archive.addArchiveGroup(group);
		_archive.saveArchiveGroups();
	});
});
_elements.getTabInner('archive').on('click', '.group-title', function() {
	var $group = $(this).closest('.group');
	var index = $group.data('index');
	var ts = _archive.archiveGroups[index].ts || [];
	console.log('archive>', _archive.archiveGroups[index], index, new Date(ts[0] * 1000));
});
/* eo archive */



/* stats */
/* статистика собирается из архива */
var _stats = (function(_stats) {
	_ext.elements.addTab('stats-side', {zone: 'equip', title: 'стат', content: '<div class="stats" />'});
	_ext.elements.activeTab('stats-side');
	var $stats = _ext.elements.getTabInner('stats-side');


	function addToStats(addTo, addFrom) {
		for (var type in addFrom) if (addFrom.hasOwnProperty(type)) {
			var st = addFrom[type];
			addTo[type] = addTo[type] || {sum: 0, count: 0};
			if (typeof st === 'number') {
				addTo[type].count += st;
			} else {
				addTo[type].count += st.count;
				addTo[type].sum += st.sum;
			}
		}

	}

	function countStatsTotal(archiveGroups, count) {
		archiveGroups = archiveGroups || _archive.archiveGroups;
		count = count || archiveGroups.length;
		var me = {};
		var enemy = {};
		var fights = 0;
		var loot = { pickup: 0, empty: 0, drop: 0};
		var meByMob = {};
		var enemyByMob = {};
		var actionsTimes = {};
		var actionsCounts = {};
		var actionsSum = 0;
		var actionsTime = 0;
		var fightRestTime = 0;
		var otherTime = 0;
		var mobId;

		for (var i=Math.max(archiveGroups.length-count, 0); i<archiveGroups.length; i++) {
			var fullStats = archiveGroups[i];
			var type = fullStats.broken ? 'broken' : fullStats.type;
			if (!fullStats.ts || type==='broken') continue;
			if (type === 'fight') {
				mobId = fullStats.mobId;
				addToStats(me, fullStats.total.me );
				addToStats(enemy, fullStats.total.enemy);
				meByMob[mobId] = meByMob[mobId] || {};
				addToStats(meByMob[mobId], fullStats.total.me);
				enemyByMob[mobId] = enemyByMob[mobId] || {};
				addToStats(enemyByMob[mobId], fullStats.total.enemy);

				fights++;
				var lt = fullStats.loot;
				if (lt) {
					loot[lt]++;
				}
			}
			var nextFullStats = archiveGroups[i+1];
			var timeStart = fullStats.ts[0];
			var timeEnd = fullStats.ts[1];
			if (type !== 'fight' && nextFullStats && nextFullStats.ts) {
				var timeStartNext = nextFullStats.ts[0];
				if (timeStartNext - timeEnd < 120) timeEnd = timeStartNext; // проверка на случай сломанной группы (2)
			}
			var time = timeEnd - timeStart;
//				lastTimeEnd = fullStats.ts[1];
			if (type === 'fight' || type === 'rest') {
				fightRestTime += time;
			} else {
				otherTime += time;
			}
			type = type || 'undefined';
			actionsTimes[type] = (actionsTimes[type] || 0) + time;
			actionsCounts[type] = (actionsCounts[type] | 0) + 1;
			actionsTime += time;
			actionsSum++;
		}



		var statsTotal = {
			fights: fights,
			fightRestTime: fightRestTime,
			otherTime: otherTime,
			actionsTime: actionsTime,
			actionsTimes: actionsTimes,
			actionsCounts: actionsCounts,
			actionsSum: actionsSum,
			loot: loot,
			me: me,
			enemy: enemy,
			meByMob: meByMob,
			enemyByMob: enemyByMob
		};
		if (mobId) statsTotal.lastMobId = mobId;
		return statsTotal;
	}

	_ext.subscribe('settingsChange', function(key, value) {
		if (key==='statsByMob' || key==='statsByMobId' || key==='myStatsByMob' || key==='statsActionsCount' || key==='statsByLevel' || key==='statsByLevelValue') {
			drawStatsSide();
		}
	});
//		var statsActionsCount = _ext.settings.settingsValues.statsActionsCount;
//		var statsByMob = _ext.settings.settingsValues.statsByMob;
	function groupsByLevel(archiveGroups, level) {
		var levelsLog = _ext.log.get('levelsLog') || [];
		if (level) {
			var lv1 = levelsLog.filter(function(item) { return item[1] === level;})[0] || [];
			var lv2 = levelsLog.filter(function(item) { return item[1] === level+1;})[0] || [];
		} else {
			lv1 = levelsLog[levelsLog.length-1];
			lv2 = [];
		}
		var time1 = lv1[0];
		var time2 = lv2[0];
		var i1 = null;
		var i2 = null;
		for (var i=0; i<archiveGroups.length; i++) {
			var ts1 = archiveGroups[i].ts[0];
			var ts2 = archiveGroups[archiveGroups.length - 1 - i].ts[0];
			if (i1===null && ts1>time1) i1 = i;
			if (i2===null && ts2<time2) i2 = archiveGroups.length - 1 - i;
		}
		return (i1!==null && !time2) ? archiveGroups.slice(i1) : archiveGroups.slice(i1|0, i2|0);
	}
	function drawStatsSide(archiveGroups) {
		archiveGroups = archiveGroups || _archive.archiveGroups;
		var groups =  _ext.settings.settingsValues.statsByLevel ? groupsByLevel(archiveGroups, _ext.settings.settingsValues.statsByLevelValue) : archiveGroups;

		var statsTotal = countStatsTotal(groups, _ext.settings.settingsValues.statsActionsCount);
		var mobId = _ext.settings.settingsValues.statsByMob && (_ext.settings.settingsValues.statsByMobId || statsTotal.lastMobId);

		var html = '';
		var htmlMe;
		if(_ext.settings.settingsValues.myStatsByMob && mobId) {
			htmlMe = drawStatsSideByActor(statsTotal.meByMob[mobId]);
		} else {
			htmlMe = drawStatsSideByActor(statsTotal.me);
		}
		var htmlEnemy;
		if (mobId) {
			htmlEnemy =
				'<tr class="unhover">' +
					'<td class="stats-against" colspan="5"><a href="/guide/mobs/' + mobId + '" target="_blank">' + _const.MOBS[mobId] + '</a></td>' +
				'</tr>' +
				drawStatsSideByActor(statsTotal.enemyByMob[mobId]);
		} else {
			htmlEnemy =
				'<tr class="unhover">' +
					'<td class="stats-against" colspan="5">бестии</td>' +
				'</tr>' +
				drawStatsSideByActor(statsTotal.enemy);
		}
		var statsTable =
			'<table class="table table-condensed table-noborder table-hover-dark table-stats">' +
				'<tr class="unhover">' +
					'<th class="stats-name"></th>' +
					'<th class="stats-average" title="среднее значение">средн</th>' +
					'<th class="stats-count" title="количество срабатываний из 100 ударов">шанс</th>' +
					'<th class="stats-sum" title="доля от общего урона">урон</th>' +
					'<th class="stats-bonus" title="прибавка к урону от умения">эфф</th>' +
				'</tr>' +
				'<tbody class="stats-me">' +
					htmlMe +
				'</tbody>' +
				'<tbody class="stats-enemy">' +
					htmlEnemy +
				'</tbody>' +
			'</table>';


		var loot = statsTotal.loot;
		var htmlLoot = '<span class="stats-name" title="Поднял/Пусто/Выбросил">' + _icons.pickup + '</span> ' +
			'<span title="Поднял">' + loot.pickup + '</span> / <span title="Пусто">' + loot.empty + '</span> / <span title="Выбросил">' + loot.drop + '</span>';


		var htmlTime =
			'<b>' + statsTotal.actionsSum + '</b> ' + _ext.utils.declenstionByNumber(statsTotal.actionsSum, ['действие', 'действия', 'действий']) + ' за ' + _ext.utils.timeSpan(statsTotal.actionsTime) + '<br />';
		var interestAverageActions = [{
			type: 'fight,rest',
			text: 'бой/отдых',
			icon: '<span class="glyphicon glyphicon-flag"></span>'
		}, {
			type: 'walk',
			text: 'в пути'
		}, {
			type: 'quest,city,nearcity,noeffect',
			text: 'задания'
		}, {
			type: 'idle',
			text: 'безделье'
		}, {
			type: 'dead',
			text: 'воскресание'
		}, {
			type: 'energy',
			text: 'восстановление'
		}, {
			type: 'trade,equip',
			text: 'торговля и экипировка'
		}, {
			type: 'broken,proxy,pvp,undefined',
			text: 'остальное'
		}, {
			title: '<br/><b>В среднем:</b>'
		}, {
			type: 'fight,rest',
			countType: 'fight',
			countAverage: 1,
			icon: '<span class="glyphicon glyphicon-flag"></span>',
			text: 'на бой с учетом отдыха'
		}, {
			type: 'fight',
			countAverage: 1,
			text: 'на бой'
		}, {
			type: 'rest',
			countAverage: 1,
			text: 'на отдых'
		}];
		for (var i=0; i<interestAverageActions.length; i++) {
			var act = interestAverageActions[i];
			if (act.title) {
				htmlTime += act.title + '<br />';
				continue;
			}

			var types = act.type.split(',');
			var count = 0;
			var countTotal = 0;
			var time = 0;
			for (var j=0; j<types.length; j++) {
				var type = types[j];
				time += statsTotal.actionsTimes[type]||0;
				countTotal += statsTotal.actionsCounts[type]||0;
				if (!act.countType) count += statsTotal.actionsCounts[type];
			}
			type = types[0];
			if (act.countType) count = statsTotal.actionsCounts[act.countType];
			var timePercent = Math.round(time / statsTotal.actionsTime * 1000) / 10;
			if (act.countAverage) time = time/count;


			if (time) {
				htmlTime += '<span class="action-icon ' + (act.countType || type) + '" title="' + types.map(function(item) { return _const.ACTION_TYPE_TEXTS[item]; }).join(', ') + '">' + (act.icon || _const.ACTION_TYPE_ICONS[type]) + '</span>';
				if (!act.countAverage) {
					htmlTime += '<span title="' +  _ext.utils.timeSpan(time) + '">' + timePercent.toFixed(1) + '%</span> - ';
				} else {
					htmlTime += _ext.utils.timeSpan(time);
				}
				htmlTime +=  ' ' + act.text + ' (' + countTotal + ')<br />';
			}
		}


		html += statsTable;
		html += '<div class="stats-side stats-loot">' + htmlLoot + '</div>';
		html += '<div class="stats-side stats-time">' + htmlTime + '</div>';

		$stats.html(html);
	}
	function drawStatsSideByActor(stats) {
		var html = '';
		if (!stats) return html;
		var types = [].concat(_const.ACTIVE, ['dmgSum'], _const.PASSIVE);
		for (var i=0; i<types.length; i++) {
			var type = types[i];
			var isDot = isActType('DOT', type);
			var isPassive = isActType('PASSIVE', type);
			var sumTo = _const.SUM_TO_MAIN[type];
			var dmgSum = stats.dmgSum || {};
			var hit = stats.hit || {};

			if (stats[type]) {
				var stat = stats[type];
				var title = _const.ACTION_TRANSLATE[type] +
					(sumTo ? ', включено в ' + _const.ACTION_TRANSLATE[sumTo] :
						(isPassive ? ', не учитывается в сумме' : '' )
					);
				var htmlStat = '<td class="stats-name" title="' + title + '">' + _icons[type] + '</td> ';

				var count = stat.count;
				var sum = stat.sum;
				var average = (Math.round(sum / count * 100) / 100)||0;
				var hitCount = hit.count;
				var hitSum = hit.sum;
				var totalSum = dmgSum.sum;

				var chance = type === 'dmgSum' ? 100 : count/(hitCount + count) * 100;
				var chanceText = type === 'hit' ? '-' : chance>=100 ? Math.round(chance * 10)/10  : chance.toFixed(2);

				var countText = 'сработал ' + _ext.utils.declenstionByNumber(count, ['раз', 'раза', 'раз'], 1);

				if (!sum) {
					htmlStat += '<td class="stats-average"></td>';
					htmlStat += '<td class="stats-count" title="' + countText + '">' + chanceText + '</td>';
					htmlStat += '<td class="stats-count"></td>';
					htmlStat += '<td class="stats-sum"></td>';
				} else {
					var averagePercents = sum/count * hitCount/hitSum * 100;
					var averagePercentsText = Math.round(averagePercents * 100)/100 + '';

					var dmgPercents = sum/totalSum * 100;
					var dmgPercentsText = '' + (dmgPercents<100 ? dmgPercents.toFixed(1) : Math.round(dmgPercents)) + '%';
					var sumText = 'всего ' + _ext.utils.declenstionByNumber(sum, ['урон', 'урона', 'урона'], 1);

					var bonusPercent = Math.round((averagePercents - 100) * chance) / 100;
					var bonusPercentText = bonusPercent && !isDot ?
						(bonusPercent >= 0 ? '+' : '&ndash;') + Math.abs(bonusPercent) + '%' :
						'';
					var bpTranslateText = (averagePercentsText >= 100 ? '+' : '&ndash;') + Math.abs(Math.round(averagePercentsText*100 - 10000)/100) + '% x ' + chanceText;

					htmlStat += '<td class="stats-average" title="' + averagePercentsText + '%">' + average.toFixed(2) + '</td>';
					htmlStat += '<td class="stats-count" title="' + countText + '">' + chanceText + '</td>';
					htmlStat += '<td class="stats-sum" title="' + sumText + '">' + dmgPercentsText + '</td>';
					htmlStat += '<td class="stats-bonus" title="' + bpTranslateText + '">' + bonusPercentText + '</td>';
				}

				html += '<tr class="stats-row stats-row-' + type + '">' + htmlStat + '</tr>';
			}
		}
		return html;
	}


	$.extend(_stats, {
		drawStatsSide: drawStatsSide,
		countStatsTotal: countStatsTotal
	});
	return _stats;
})({});

_ext.subscribe('preload', function() {
	_stats.drawStatsSide();

	_ext.subscribe('newMessages', function() {
		_stats.drawStatsSide();
	});
});

/* eo stats */




_ext.archive = _archive;
_ext.groupMessages = _groupMessages;
_ext.shortMessages = _shortMessages;
_ext.towns = _towns;
_ext.stats = _stats;






var _auto = (function(_auto) {
	var sets = [{
		title: 'Помощь герою (<span class="link-ajax" data-auto="rest">миролюбие</span>/<span class="link-ajax" data-auto="fight">агрессия</span>)',
		fields: [{
			label: 'Автоматическая помощь',
			note: 'Внимание! Настройки применяются в момент нажатия',
			name: 'autohelp',
			isToggle: 1,
			value: false,
			subs: [{
				label: 'Уведомлять о помощи',
				name: 'autohelpNotify',
				isToggle: 1,
				value: false
			}, {
				label: 'Использовать бонусную энергию, оставить',
				note: 'Указанный запас энергии тратиться не будет',
				name: 'autohelpEnergyBonus',
				isToggle: 1,
				value: false,
				inputs: [{
					name: 'autohelpEnergyBonusMax',
					type: 'num'
				}]
			}, {
				label: 'Герой бездействует',
				name: 'autohelpIdle',
				isToggle: 1,
				value: true
			}, {
				label: 'Герой воскресает',
				name: 'autohelpDead',
				isToggle: 1,
				value: true
			}, {
				label: 'Здоровье в бою ниже ',
				name: 'autohelpHp',
				isToggle: 1,
				value: true,
				inputs: [{
					type: 'num',
					name: 'autohelpHpLowerValue',
					value: 200
				}],
				subs: [{
					label: 'только против босса',
					name: 'autohelpHpBoss',
					isToggle: 1,
					isInline: 1,
					value: true
				}]
			}, {
				label: 'Энергия выше ',
				name: 'autohelpEnergy',
				isToggle: 1,
				value: true,
				inputs: [{
					type: 'num',
					name: 'autohelpEnergyGreaterValue',
					value: 10
				}],
				subs: [{
					label: 'в бою',
					name: 'autohelpEnergyFight',
					isToggle: 1,
					isInline: 1,
					value: false
				}, {
					label: 'вне боя',
					name: 'autohelpEnergyRest',
					isToggle: 1,
					isInline: 1,
					value: false
				}, {
					label: 'в пути',
					name: 'autohelpEnergyWalk',
					isToggle: 1,
					isInline: 1,
					value: true
				}, {
					label: 'торг/медитация',
					name: 'autohelpEnergyTradeMed',
					isToggle: 1,
					isInline: 1,
					value: true
				}/*, {
					label: 'Починка',
					name: 'autohelpEnergyRepairBuilding',
					isToggle: 1,
					value: false,
					inputs: [{
						type: 'num',
						addOn: 'ID',
						name: 'autohelpEnergyRepairBuildingID'
					}, {
						type: 'num',
						addOn: 'X',
						name: 'autohelpEnergyRepairBuildingX'
					}, {
						type: 'num',
						addOn: 'Y',
						name: 'autohelpEnergyRepairBuildingY'
					}, {
						type: 'num',
						addOn: '%',
						name: 'autohelpEnergyRepairBuildingPercent'
					}]
				}*/]
			}]
		}, {
			label: 'Автоматический выбор в задании',
			name: 'autoquest',
			isToggle: 1,
			value: false,
			subs: [{
				label: 'Уведомлять о выборе',
				name: 'autoquestNotify',
				isToggle: 1,
				value: false
			}, {
				label: 'Задания, влияющие на честь',
//					note: 'Доставка, сопроводить караван, пошпионить',
				name: 'autoquestHonor',
				isToggle: 1,
				value: true,
				subs: [{
					label: 'честно',
					name: 'autoquestHonorPlus',
					isToggle: 1,
					isInline: 1,
					value: true
				}, {
					label: 'бесчестно',
					name: 'autoquestHonorMinus',
					isToggle: 1,
					isInline: 1,
					value: false
				}]
			}, {
				label: 'Задания, влияющие на миролюбие',
//					note: 'Выбить долг',
				name: 'autoquestPeace',
				isToggle: 1,
				value: true,
				subs: [{
					label: 'миролюбиво',
					name: 'autoquestPeacePlus',
					isToggle: 1,
					isInline: 1,
					value: true
				}, {
					label: 'воинственно',
					name: 'autoquestPeaceMinus',
					isToggle: 1,
					isInline: 1,
					value: false
				}]
			}]
		}, {
			label: 'Брать карты',
			name: 'autocard',
			isToggle: 1,
			value: false
		}]
	}];

	_ext.subscribe('preload', function(gameData) {
		if (gameData) {
			var hero = gameData.account.hero;
			var energyBonus = hero.energy.bonus;
			var $inputMax = _ext.settings.getSettingInput('autohelpEnergyBonusMax');
			if (!+$inputMax.val()) $inputMax.val(Math.max(0, energyBonus-10)).trigger('change');
		}
	});

	function initSets() {
		_ext.settings.addSets(sets);
		_ext.settings.drawSets(sets);

		var $sets = _ext.elements.getTabInner('sets');
		$sets.on('click', '[data-auto]', function(e) {
			e.preventDefault();
			var type = $(this).data('auto');
			var types = {
				rest: {
					autohelpIdle: 1,
					autohelpDead: 1,
					autohelpHp: 1,
					autohelpHpBoss: 1,
					autohelpEnergy: 1,
					autohelpEnergyFight: 0,
					autohelpEnergyRest: 0,
					autohelpEnergyWalk: 1,
					autohelpEnergyTradeMed: 1
				},
				fight: {
					autohelpIdle: 0,
					autohelpDead: 0,
					autohelpHp: 1,
					autohelpHpBoss: 0,
					autohelpEnergy: 1,
					autohelpEnergyFight: 1,
					autohelpEnergyRest: 0,
					autohelpEnergyWalk: 0,
					autohelpEnergyTradeMed: 0
				}
			};
			var conf = types[type];
			for (var key in conf) if (conf.hasOwnProperty(key)) {
				var value = !!conf[key];
				var $input = _ext.settings.getSettingInput(key);
				$input.prop('checked', value).trigger('change');
			}
		})
	}

	function checkHero(gameData) {
		var _settingsValues = _ext.settings.settingsValues;

		var hero = gameData.account.hero;
		var actionType = hero.action.type;
		var actionPercent = hero.action.percents;
		var actionName = _ext.const.ACTION_TYPE_NAMES[actionType];

		var energy = hero.energy.value;
		var energyBonus = _settingsValues.autohelpEnergyBonus ? hero.energy.bonus - _settingsValues.autohelpEnergyBonusMax : 0 ;
		if (energyBonus < 0) energyBonus = 0;

		if (energy + energyBonus < 4) return;


		var isFight = actionName === 'fight';
		var isRest = actionType < 10 && actionName !== 'fight';

		var isBoss = !!hero.action.is_boss;
		if (_settingsValues.autohelpHp && hero.base.health < _settingsValues.autohelpHpLowerValue && isFight && (!_settingsValues.autohelpHpBoss || isBoss)) {
			godHelp('Низкое здоровье: ' + hero.base.health);
			return;
		}
		if (_settingsValues.autohelpEnergy && energy > _settingsValues.autohelpEnergyGreaterValue && (
				(_settingsValues.autohelpEnergyFight && isFight) ||
				(_settingsValues.autohelpEnergyRest && isRest) ||
				(_settingsValues.autohelpEnergyWalk && actionName === 'walk') ||
				(_settingsValues.autohelpEnergyTradeMed && (actionName === 'trade' || actionName === 'energy'))
			)) {
			//console.log('check passed', energy, _settingsValues.autohelpEnergyGreaterValue)
//			if (_settingsValues.autohelpEnergyRepairBuilding && _settingsValues.autohelpEnergyRepairBuildingID) {
//				var x = _settingsValues.autohelpEnergyRepairBuildingX;
//				var y = _settingsValues.autohelpEnergyRepairBuildingY;
//				getBuildingState(x,y)
//					.done(function(integrity) {
//						if (integrity && integrity < (_settingsValues.autohelpEnergyRepairBuildingPercent/100 || 0.982)) {
//							godHelp('repair', 'building_repair', {building: _settingsValues.autohelpEnergyRepairBuildingID});
//						}
//					});
//			} else {
			godHelp('Накопилась энергия: ' + energy);

			return;
		}
		if (_settingsValues.autohelpIdle && actionType === 0 && !isFight && actionPercent > 0 && actionPercent < 0.8) {
			godHelp('Герой бездействует');
			return;
		}
		if (_settingsValues.autohelpDead && actionType === 4 && !isFight && actionPercent > 0 && actionPercent < 0.8) {
			godHelp('Герой умер');
			return;
		}

		var hasCard = !$('.pgf-get-card-button').hasClass('pgf-hidden');
		if (_settingsValues.autocard && hasCard) {
			$('.pgf-get-card-button a').trigger('click');
			return;
		}

		function godHelp(msg, ability, getParams) {
			ability = ability || 'help';
			console.log('god ' + ability + '!', getParams, actionName, msg, $.extend({}, hero));
			if (_settingsValues.autohelpNotify) {
				_ext.notification.sendNotify('The Tale Extended - ' + ext.heroName, {
					tag: 'autohelp',
					body: 'Сработала автоматическая помощь ' +
						'\n' + msg + '' +
						'\nТекущее действие: ' + _ext.const.ACTION_TYPE_TEXTS[actionName] + '',
					addTime: 1
				});
			}
//				console.log('godHelp! real');
			if (!_settingsValues.autohelp) return;
			var paramsStr = '';
			for (var key in getParams) if (getParams.hasOwnProperty(key)) {
				paramsStr += '&' + key + '=' + getParams[key];
			}
			var url = '/game/abilities/' + ability + '/api/use?api_version=1.0&api_client='+window.API_CLIENT + paramsStr;
//				console.log('url: ', url)
//				if (!_settingsValues.autohelp) return;
			hero.energy.value -= 4;
			$.ajax({
				url: url,
				dataType: 'json',
				type: 'post',
				data: {}
			})
		}
	}


	var CHOICES = {
		/* peacefullnes */
		peacePlus: [
			'прибегнуть к дипломатии' /* collect_debt */
		],
		peaceMinus: [
			'задействовать грубую силу' /* collect_debt */
		],
		honorPlus: [
			'довести дело до конца', /* spying */
			'защищать торговца', /* caravan */
			'честно выполнить свои обязательства' /* delivery */
		],
		honorMinus: [
			'поддаться укорам совести и раскрыться', /* spying */
			'шантажировать самостоятельно', /* spying */
			'присвоить письмо и продать', /* delivery */
			'украсть-украсть-украсть', /* delivery */
			'подделать письмо' /* delivery */
		]
	};

	var lastquest = '';
	function checkQuest(gameData) {
		var _settingsValues = _ext.settings.settingsValues;
		var selectChoices = {};
		if (_settingsValues.autoquestPeacePlus) selectChoices.peacePlus = 1;
		if (_settingsValues.autoquestPeaceMinus) selectChoices.peaceMinus = 1;
		if (_settingsValues.autoquestHonorPlus) selectChoices.honorPlus = 1;
		if (_settingsValues.autoquestHonorMinus) selectChoices.honorMinus = 1;

		var hero = gameData.account.hero;
		var quests = hero.quests.quests;
		var line = quests[1].line;
		for (var i=0; i<line.length; i++) {
			var q = line[i];
			for (var choiceIndex=0; choiceIndex < q.choice_alternatives.length; choiceIndex++) {
				var choiceName = q.choice_alternatives[choiceIndex][1];
				var option_uid = q.choice_alternatives[choiceIndex][0];
				for (var reward in CHOICES) {
					if (CHOICES[reward].indexOf(choiceName) >=0 ) {
						if (selectChoices[reward]) {
							chooseQuest(option_uid, choiceName);
						}
					}
				}
			}
		}
		function chooseQuest(uid, name) {
			if (_settingsValues.autoquestNotify && lastquest != name) {
				lastquest = name;
				_ext.notification.sendNotify('The Tale Extended - ' + ext.heroName, {
					tag: 'autoquest',
					body: 'Сделан выбор! \n— ' + name + '',
					addTime: 1,
					icon: window.extPass + 'img/quest/caravan.png'
				});
			}

			if (!_settingsValues.autoquest) return;
			$.ajax({
				url: '/game/quests/api/choose?api_version=1.0&api_client='+window.API_CLIENT+'&option_uid='+encodeURIComponent(uid),
				dataType: 'json',
				type: 'post',
				data: {
				}
			})
		}
	}



	function getBuildingState(x,y) {
		var dfr = $.Deferred();
		var name = 'integrity-' + x + '-' + y;
		if (_ext.cache(name)) {
			dfr.resolve(_ext.cache(name));
		} else {
			requestPlaceHtml(x,y)
				.done(function(html) {
//					var $info = $(html);
					var integrityParse = /data-building-integrity="([\d.]+)"/.exec(html);
					var integrity = integrityParse && integrityParse[1];
					_ext.cache(name, integrity, 10 * 60 * 1000);
					console.log('integrity request:', integrity)
					dfr.resolve(integrity);
				});
		}
		return dfr;
	}

	function requestPlaceHtml(x,y) {
		return $.ajax({
			url: '/game/map/cell-info?x=' + x + '&y=' + y + '&_=' + (+new Date),
			method: 'get',
			dataType: 'html'
		})
	}


	$.extend(_auto, {
		checkHero: checkHero,
		checkQuest: checkQuest,
		initSets: initSets
	});
	return _auto;
})({});
_ext.subscribe('newTurn', function(messagesNew, gameData) {
	window.setTimeout(function() {
		_auto.checkHero(gameData);
	}, 1000);
});
_ext.subscribe('newMessages', function(messagesNew, gameData) {
	window.setTimeout(function() {
		_auto.checkQuest(gameData);
	}, 1000);
});

_ext.subscribe('init', function() {
	_auto.initSets();
});
_ext.auto = _auto;



		_ext.publish('init');

		return _ext;
	})(window.ext || {});

//console.log('tables.js')
window.tables = (function(_tables) {
	"use strict";

	function makeSortable($table) {
		var $head = $table.find('thead tr').first();
		var $rows = $table.find('tbody tr');

		$head.children('th')
			.wrapInner('<span class="sort" />')
			.each(function(){

				var $th = $(this);
				var thIndex = $th.index();

				$th.children('.sort').click(function(){
					$th.siblings('th').children('.sort').attr('class', 'sort');
					var inverse = $(this).hasClass('sort-up');
					$(this).attr('class', 'sort sort-' + (inverse ? 'down' : 'up'));
					var arr = [];
					$rows.each(function() {
						var valueText = $.trim($(this).children('td').eq(thIndex).text());
						var value;

						value = (-valueText) || parseDate(valueText) || valueText;


						arr.push({
							$item: this,
							value: value
						})
					});
					arr.sort(function(a,b) {
						if (a.value == b.value) return 0;
						return a.value > b.value ?
							inverse ? 1 : -1
							: inverse ? -1 : 1;
					})
					arr.forEach(function(item) {
						$table.append(item.$item)
					})
				});

			});
	}


	$('.table').each(function() {
		makeSortable($(this))
	});

	$.extend(_tables, {
		makeSortable: makeSortable
	});

	function parseDate(str) { //02.04.2014 10:50
		var p = /(\d{2})\.(\d{2})\.(\d{4})\s(\d{1,2})\:(\d{2})/.exec(str);
		if (!p) return 0;
		return +new Date(p[3],p[2]-1,p[1],p[4],p[5]);
	}

	return _tables;
})({});



	injectDone();
})((typeof this.unsafeWindow !== 'undefined') ? this.unsafeWindow : window);