The West - NERD Portrait

Displays some useful info on the portrait

  1. // ==UserScript==
  2. // @namespace https://greasyfork.org/users/8637
  3. // @name The West - NERD Portrait
  4. // @author neversleep1911
  5. // @description Displays some useful info on the portrait
  6. // @include http://*.the-west.*/game.php*
  7. // @include https://*.the-west.*/game.php*
  8. // @grant none
  9. // @version 1.0.2
  10. // @copyright Copyright (c) 2015 neversleep1911
  11. // @license MIT (http://opensource.org/licenses/MIT)
  12. // ==/UserScript==
  13.  
  14. (function(func) {
  15. var script;
  16. script = document.createElement("script");
  17. script.setAttribute("type", "text/javascript");
  18. script.textContent = "(" + func.toString() + ")();";
  19. document.body.appendChild(script);
  20. document.body.removeChild(script);
  21. })(function() {
  22. var Gui, I18n, NerdFormatter, NerdPortrait, Tab;
  23. I18n = function() {
  24. function I18n() {}
  25. var DEFAULT_LANGUAGE, STRINGS, language;
  26. DEFAULT_LANGUAGE = "en_US";
  27. STRINGS = {
  28. en_US: {
  29. buttons: {
  30. save: "Save"
  31. },
  32. messages: {
  33. text_saved: "Text saved",
  34. enter_text: "Enter text!"
  35. }
  36. },
  37. de_DE: {
  38. buttons: {
  39. save: "Speichern"
  40. },
  41. messages: {
  42. text_saved: "Text gespeichert",
  43. enter_text: "Text eingeben!"
  44. }
  45. },
  46. ru_RU: {
  47. buttons: {
  48. save: "Сохранить"
  49. },
  50. messages: {
  51. text_saved: "Текст сохранён",
  52. enter_text: "Введите текст!"
  53. }
  54. }
  55. };
  56. language = DEFAULT_LANGUAGE;
  57. I18n.language = function() {
  58. return language;
  59. };
  60. I18n.setLanguage = function(lang) {
  61. return language = STRINGS[lang] ? lang : DEFAULT_LANGUAGE;
  62. };
  63. I18n.tr = function(id) {
  64. var i, len, prop, properties, string;
  65. string = STRINGS[language];
  66. properties = id.split(".");
  67. for (i = 0, len = properties.length; i < len; i++) {
  68. prop = properties[i];
  69. if ((string = string[prop]) === void 0) {
  70. break;
  71. }
  72. }
  73. return string || id;
  74. };
  75. return I18n;
  76. }();
  77. Gui = function() {
  78. function Gui() {}
  79. Gui.createButton = function(options) {
  80. var button;
  81. if (options == null) {
  82. options = {};
  83. }
  84. if (options.icon) {
  85. button = new west.gui.Iconbutton(options.icon, options.onclick);
  86. } else {
  87. button = new west.gui.Button(options.text, options.onclick);
  88. }
  89. if (options.css) {
  90. $(button.getMainDiv()).css(options.css);
  91. }
  92. return button;
  93. };
  94. Gui.createTextarea = function(options) {
  95. var textarea;
  96. if (options == null) {
  97. options = {};
  98. }
  99. textarea = new west.gui.Textarea(options.content, null);
  100. if (options.width) {
  101. textarea.setWidth(options.width);
  102. }
  103. if (options.height) {
  104. textarea.setHeight(options.height);
  105. }
  106. if (options.css) {
  107. $(textarea.getMainDiv()).css(options.css);
  108. }
  109. return textarea;
  110. };
  111. Gui.createGroup = function(options) {
  112. var content, group, scrollPane;
  113. if (options == null) {
  114. options = {};
  115. }
  116. group = new west.gui.Groupframe("", "<div />");
  117. if (options.css) {
  118. $(group.getMainDiv()).css(options.css);
  119. }
  120. content = $(".tw2gui_groupframe_content_pane div", group.getMainDiv()).first();
  121. if (options.title) {
  122. content.append($("<h2>" + options.title + "</h2><hr style='margin-top: 2px; margin-bottom: 4px;' />"));
  123. }
  124. if (options.scrollPane) {
  125. scrollPane = new west.gui.Scrollpane;
  126. if (options.scrollPane.css) {
  127. $(scrollPane.getMainDiv()).css(options.scrollPane.css);
  128. }
  129. content.append(scrollPane.getMainDiv());
  130. group.scrollPane = scrollPane;
  131. group.appendToScrollContentPane = function(content) {
  132. scrollPane.appendContent(content);
  133. return group;
  134. };
  135. }
  136. return group;
  137. };
  138. return Gui;
  139. }();
  140. NerdFormatter = function() {
  141. function NerdFormatter() {}
  142. NerdFormatter.keys = [ {
  143. pattern: /%ch/,
  144. value: function() {
  145. return Character.healthRegen;
  146. }
  147. }, {
  148. pattern: /%ce/,
  149. value: function() {
  150. return Character.energyRegen;
  151. }
  152. }, {
  153. pattern: /%hp/,
  154. value: function() {
  155. return Math.round(Character.health * 100 / Character.maxHealth);
  156. }
  157. }, {
  158. pattern: /%hr/,
  159. value: function() {
  160. return Math.round(1 / (Character.healthRegen * Character.maxHealth) * 3600).formatDuration();
  161. }
  162. }, {
  163. pattern: /%ht/,
  164. value: function() {
  165. return ((Character.maxHealth - Character.health) / (Character.healthRegen * Character.maxHealth) * 3600).formatDuration();
  166. }
  167. }, {
  168. pattern: /%ep/,
  169. value: function() {
  170. return Math.round(Character.energy * 100 / Character.maxEnergy);
  171. }
  172. }, {
  173. pattern: /%er/,
  174. value: function() {
  175. return Math.round(1 / (Character.healthRegen * Character.maxEnergy) * 3600).formatDuration();
  176. }
  177. }, {
  178. pattern: /%et/,
  179. value: function() {
  180. return ((Character.maxEnergy - Character.energy) / (Character.energyRegen * Character.maxEnergy) * 3600).formatDuration();
  181. }
  182. }, {
  183. pattern: /%dl/,
  184. value: function() {
  185. return Character.duelLevel;
  186. }
  187. }, {
  188. pattern: /%dm/,
  189. value: function() {
  190. return Math.ceil(5 * Character.duelLevel / 7);
  191. }
  192. }, {
  193. pattern: /%dx/,
  194. value: function() {
  195. return Math.ceil(7 * Character.duelLevel / 5);
  196. }
  197. } ];
  198. NerdFormatter.format = function(s) {
  199. var i, k, len, ref;
  200. ref = this.keys;
  201. for (i = 0, len = ref.length; i < len; i++) {
  202. k = ref[i];
  203. s = s.replace(k.pattern, k.value());
  204. }
  205. return s;
  206. };
  207. return NerdFormatter;
  208. }();
  209. NerdPortrait = function() {
  210. function NerdPortrait() {
  211. if (instance) {
  212. return instance;
  213. }
  214. instance = this;
  215. EventHandler.listen([ "health", "energy", "wear_changed", "taskqueue-updated", "position_change", "character_level_up" ], function() {
  216. NerdPortrait.instance().update();
  217. });
  218. this.update();
  219. return;
  220. }
  221. var instance;
  222. NerdPortrait.ID = "tw_nerd_portrait";
  223. NerdPortrait.NAME = "NERD Portrait";
  224. NerdPortrait.AUTHOR = "neversleep1911";
  225. NerdPortrait.WEB_SITE = "https://greasyfork.org/scripts/9505";
  226. NerdPortrait.MIN_GAME_VERSION = "2.22";
  227. NerdPortrait.MAX_GAME_VERSION = Game.version.toString();
  228. NerdPortrait.LSK_TEXT = "3577cb3d-1fbf-4c37-9b6a-3854a6c4c34d";
  229. NerdPortrait.DEFAULT_TEXT = '<div style="color: whitesmoke; position: relative; left: 10px; top: 5px; font-size: 75%; font-weight: bold; line-height: 110%;">\n' + "Health: %hp%<br />\n" + "Regen: %ch (%ht)<br />\n" + "1HP / %hr<br /><br />\n\n" + "Energy: %ep%<br />\n" + "Regen: %ce (%et)<br />\n" + "1EP / %er<br /><br />\n\n" + "Duel Level: %dl (%dm-%dx)" + "</div>";
  230. instance = null;
  231. NerdPortrait.instance = function() {
  232. return instance;
  233. };
  234. NerdPortrait.prototype.update = function() {
  235. if (!this.content) {
  236. $("div.character_link").append(this.content = $("<div />"));
  237. }
  238. this.content.html(NerdFormatter.format(this.text()));
  239. };
  240. NerdPortrait.prototype.text = function() {
  241. return this._text || (this._text = localStorage.getItem(NerdPortrait.LSK_TEXT)) || NerdPortrait.DEFAULT_TEXT;
  242. };
  243. NerdPortrait.prototype.setText = function(_text) {
  244. this._text = _text;
  245. localStorage.setItem(NerdPortrait.LSK_TEXT, this._text);
  246. this.update();
  247. };
  248. return NerdPortrait;
  249. }();
  250. Tab = function() {
  251. function Tab() {
  252. if (instance) {
  253. return instance;
  254. }
  255. instance = this;
  256. this.maindiv = $("<div />");
  257. this.maindiv.append((this.textGroup = Gui.createGroup()).getMainDiv());
  258. this.maindiv.append((this.actionGroup = Gui.createGroup()).getMainDiv());
  259. this.textGroup.appendToContentPane((this.text = Gui.createTextarea({
  260. width: 598,
  261. height: 205
  262. })).getMainDiv());
  263. this.actionGroup.appendToContentPane((this.buttonSave = Gui.createButton({
  264. text: I18n.tr("buttons.save")
  265. })).getMainDiv());
  266. EventHandler.listen("WINDOW_OPENED", function(uid) {
  267. if (uid !== "scripts") {
  268. return;
  269. }
  270. Tab.instance().text.setContent(NerdPortrait.instance().text());
  271. $(Tab.instance().buttonSave.getMainDiv()).off("click").on("click", function() {
  272. var e, text;
  273. text = $.trim(Tab.instance().text.getContent());
  274. if (text !== "") {
  275. try {
  276. NerdPortrait.instance().setText(text);
  277. (new UserMessage(I18n.tr("messages.text_saved"), UserMessage.TYPE_SUCCESS)).show();
  278. } catch (_error) {
  279. e = _error;
  280. (new UserMessage(e, UserMessage.TYPE_ERROR)).show();
  281. }
  282. } else {
  283. (new UserMessage(I18n.tr("messages.enter_text"), UserMessage.TYPE_HINT)).show();
  284. }
  285. return false;
  286. });
  287. });
  288. }
  289. var instance;
  290. instance = null;
  291. Tab.instance = function() {
  292. return instance;
  293. };
  294. return Tab;
  295. }();
  296. $(document).ready(function() {
  297. var api;
  298. I18n.setLanguage(Game.locale);
  299. api = TheWestApi.register(NerdPortrait.ID, NerdPortrait.NAME, NerdPortrait.MIN_GAME_VERSION, NerdPortrait.MAX_GAME_VERSION, NerdPortrait.AUTHOR, NerdPortrait.WEB_SITE);
  300. api.setGui((new Tab).maindiv);
  301. new NerdPortrait;
  302. return true;
  303. });
  304. });