Mousehunt Helper

DSXC's Mousehunt helper script.

当前为 2014-07-30 提交的版本,查看 最新版本

  1. // ==UserScript==
  2. // @name Mousehunt Helper
  3. // @namespace DSXC
  4. // @description DSXC's Mousehunt helper script.
  5. // @include http://www.mousehuntgame.com/*
  6. // @include https://www.mousehuntgame.com/*
  7. // @include http://apps.facebook.com/mousehunt/*
  8. // @include https://apps.facebook.com/mousehunt/*
  9. // @version 14.3
  10. // @revision - New zone, Dance Hall, added to the list of party locations, sorry it wasn't added before it was over.
  11. // @revision - New region and zone, Rift Plane and Gnawnia Rift added to travel destinations.
  12. // @revision - New crafting patterns for the Gnawnia Rift.
  13. // ==/UserScript==
  14. //===============================================================================
  15.  
  16. var SCRIPT = {
  17. scripturl: 'http://userscripts.org/scripts/source/58464.user.js',
  18. version: '14.3',
  19. versionurl: 'http://userscripts.org/scripts/source/58464.meta.js',
  20. lastupdate: DSXC_getValue('Update - Script', 'never')
  21. }
  22.  
  23. var STATE_OFF = 0, STATE_SOUND = 1, STATE_MESSAGE = 2;
  24. var SETTINGS = {
  25. horn: 0,
  26. king: 0,
  27. cheese: 0,
  28. washed: 0,
  29. season: 0,
  30. tourney: 0,
  31. direct: false,
  32. showall: false,
  33. timers: true,
  34. buttons: false,
  35. auto: false,
  36. length: 5
  37. }
  38.  
  39. var STATE = {
  40. title: document.title,
  41. ready: false,
  42. hash: '',
  43. level: -1,
  44. location: -1,
  45. trap: -1,
  46. base: -1,
  47. cheese: -1,
  48. route: null,
  49. maintenance: false,
  50. king: false,
  51. redirect: '',
  52. baseurl: location.protocol + '//www.mousehuntgame.com/',
  53. hornstate: 0, // 0 = countdown, 1 = ready, 2 = sounding
  54. userobject: null,
  55. errorshown: false,
  56. tourney: -1,
  57. lastjournal: 0
  58. }
  59.  
  60. var IMAGE = {
  61. config: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9oGDwceLTyDBTAAAAS1SURBVDjLTZRPaFRXFMa/c++dNzOdN2PrpCYTpw1xFUKtlHak2diq2KabGgoKLkKlK4m0QlpFQSmktG6qWFrdZNGKSCENWXRRRIjBSEi6SCFiQRo1VSfppPkzmcy/9959954unJHe1YVzOOd+3/fjwloLZoYxBs1TLpfBzIKZFQCEYSistTFjzBZmlswcN8wxZpYAEHh1Ya2VAKCIiIwxpJSyzJycnJzc4bruHAAeGxt7f2FhYVZKuWqtfVEIUfl95NLQ0r07+yxIBvXK01+Hv/kuEo3daQw3goh4enr6lXPnzv14/fr1pdnZ2StEBCLiu3fvto+Pj+cvXrz4W7lc0QCEXf5j8MAbLW+/uyPMvdcd+8hM/3D75++//Dj0gtBaC8HMuHbt2qeHDh062tra6haLxftNKVrr5M6dO2V3d/eBy1cu31rZqERUbQXVB1Pw/n3C9eWn7DoSxcLjd5wXYmytJQEglkgkSpVKBY7jIAzDDiJqGtqmtUYmk7Fevb5ttS4Cy8xBKOEHTH4AspbBEJKZBRFBAfA9z1sKwxCxWIxbW1v3Dw0NXWppaXmqlDqRTqfZGENBoP1a4cEWEwRSg6ANwJZhLAEwHgABwCoi4tOnT5cWFxeRy+Vo7969XKvVPiuXy8hms1BK8c2bN0UY6uWY5EQt0MIHQYcMywKWCUJG4kQUGmNIAMD58+dv5PP5G1evXoXv+5RKpZDNZtHwVxQKhXsnBr/Y15JOUhAEyg8YgRbQAWAsgYQAABARC2tt0lorT548+UFfX9+Rqampejweh5SSJiYmKBqN1vr7+z98dXumSiBlghBaCw4CwA/AbAWIwyoAWGshANSIyNFaq8HBwV/a2trmiYiEEOy6LjKZzGh3d/cCM2Pb9s4nNVDFDyx8X7Pva6rUV2HSrxUAQAgBQUSGiDaVUpGzZ89mlVJZIQRLKSkSiWBtbc00tkeIaNN5q//o7za5sdHVQ49aOvH365//9cmxwW+bAxUzN/VbAJxIJDwpJQFg13VpZWVlrVEPjTFKCHFr8s/C7f37j/StzMz4/tLSwXiUKsxMAJ6xAyAA4FcqFUSjURZCQEoJ13VRKpXKje1MRCERFX3P11IQjDW1f5YW15g5DoABQBARhBAMAJubmyIWi0EpBaUUXNdFtVq1zU+DmQUAVKuVZSklrLW2s7NTArAAiJkhrH3erzzPg+M4cBwHrus2XxhteChso7lcLrtSSpRKpZd2797dS0Q+MztEBCWEgLWWADhhGIpkMomZmRmsr69jz5498H0/x8wJAFoppU+dOnXQdd2jkUgEXV1dYmJioh/AT0TkExFE0x8Alplp69atGB0dRa1WQz6fh9a6DsA0JT18+PB+KpUKHMfh9vZ2hGE41wjtOYdoJO27rqvHx8fVmTNnsGvXLqpWq0in03ki8gBoAGJ0dPTR3NzcvVQqRfPz89ZxnLFGKM9oaV6MMeR5Ho4fP/51sVgciMfjpLVevXDhwpsdHR2bACwRgZkTAwMDX7mue2x1dbXQ29t74PDhw48bdUv/SxANhDAyMvJyoVBwcrlcvaenZ11rTUopMDMTERYWFrYNDw+7SqnSwMDARiaTMU0O/wOkOp5CS37/NAAAAABJRU5ErkJggg==',
  62. craft: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9oGDwcnBQeyIHAAAAMRSURBVDjLlZNNbxtVFIafOzMZOxM74/FH7DglrkybpIpC0gRSIipFlFSVUlHEAqGKX4AEEhIr+AOAWLBB3cGGFUJi2W0RCkYEDJRClMgB1RX14BgZTzJ27Ik9l0XdEpmkdV/prO65j857PgTHS0xPT5+3LOtKvV4/W61WZwzD2Aaub21tfeH7fgGQvZ/UhwBjlmWtRKNRI5VKXZ2dnQ07jvPE6urqBUVR3ozFYpdt2/4skUi0G43Gf1XQh8Lh8Fw2m/1paWmJUChEJBIhl8vJcrm8nc/nJw7nKv0A6/V6xzRNKpWKrNVq0nEcFhcXhWVZp+bn53f6tfxAUsodz/M80zRXACGEkKqqkslkRDKZNJrN5sVyufwpgEafsm37+87BLgvPLEshBIqiUK1W5dTUlKhUKmtACHAf2cNBDfbbnDqR1DdCAVX721WYmT0n6nXX8zxPn5yc9HVdVzzPI5/Pv9/PULTsWPDueDKY2Gu0RX7TfTedTl8vlUqV0dHRl8Ph8MfpdFpOTEwQj8fFoyyrschAaXJ8KO5LKW4WmhvAe6VSCQDXdW8MDw8D4HmeWF9fX3vYUJSwoX51fi5yRlMU/txpNop/tTKHl9nzvEqr1SqYpvmibdv5XC538ViaEVQ+emk5IV95YcS/8LQlgVf/1wvtnkHTNAfu7/SRloO68sHl5+JvBXRF+h0pfvuj/gnweW9eu90GwHGcg2MvRdN4/dK52LWRaEAi4dtbNXez2EgBjX7Wq/dSriyfjV4bTw3KwIDCnfK+2Cw2FvuF9QIzz86YX06dHJIBXWGv0Ra5X5x3gE0eQ/d7OPbkieDtudNhf9jQ+Mc9EN/crG3st/wPuxcA4B+KTjeOBBpWWP1x4UzEH4npYtftsPZz7eC23ZwGgl0XC8BTgAfsA7uAC9wF7gB7D4C6xhvZtDGSSQblPVhV/Pq7u9IFpYHngThQB74Git23NjAGnOwC94CqpioiNmSoslhuUii64ta2+wPwGnC127/vgI1uVb0qHGX77aFBpWSGVFdVuNFd4NNdu4+tfwEQ0ipmhXPGJwAAAABJRU5ErkJggg==',
  63. potion: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9oGDwciL6F+HeMAAAOLSURBVDjLhdRPbFRVFMfx77nv37xOHcoUOxApJGoRjYAaIKiRQCQYUwy6YePCpP5JCC5c6E42EBOjBKMLSNyJLowkRiMk/ktEkNjyJyKNWBcISFsozoxtp+3MvPfuPS6ABLQDZ//75NxzT47Qok58+drShYu6dxmR+4zQJurEuTRLm8lotVrZ92DvB3tmy/mtwLHhQbqKfq8XRKi1qEvRLGHi8oXuC+XsLLBn17f9vL5xzU05bzbsrYNHHljxxEuD7TO/C3gifogXFTBBHsXXRRt2Ll/2bJ+/bf3KH/6bldnAz44N6uqehRrUL5E6K+oyrLNkznLx71GSwhJsHT4+da6wv29T7casmQ1UBAPioqKoCVEvwnkx1svR9NrJBRG1pmV/36ba3r17uS04Upl4+7dzI4w3lXIaM5bkGEtCLjVCtG0htWqN0XK1D2Dr1q2tn6yq7DhwZOXau+86XirmtaMtlkaW0cgyUuew1vJPvU6aWc2ayNen/iiVOude2f7M2tk7FBGWloqfFGJfS4V2cQpj9YRyklFJLJOpBYR85FOIfVb1LH73Rux/He7+bmD1igXFgZFcRD6MODMxw8/lcVSERpJSrydMVibJpqZ5qDPWl5f1yIGhv+a9v2VDZdYO58bR5pqgPXMKWIXTE1OIMRgRPBEQwSJMp5bvz1dkuNHg/q6OLS0XuxAFT+eCgKJv8CKPh+OAVBUL1EPDVGioepbLeUM1SfmlOqnrOosrb/HLulg8T5xenWfB95gXBcyPArpyAZ1RQFsYIkZQYGhyWuLA3ApkGKfqGyE0BuTqkK1zOKfotS29XqlTgKAlOJXYA75aVJXUOYwIqsqCfEwpzoGC1eusUoojtU5/bQlemap/3mwkMtZIUGB+nANgJrMkziECmXMgoAqP39khI7X64ZbgG0+tOTk5k/SPVcY1EKN3hD5WlVqSEvsec8KAzCoCap3Te+NccvTspY9agjsPHuXEaPm5IEnkdGUcX0TbfY/MOS7WpinXG1hrdTq1smN5jwyVJ17c19c7c7trI9ve+3DVxnVrB0aMaBz4Mt5MSZ1jqDzO8MS0bu7ukuqf59/c/vzmdwALuFvdw/D4N19Vp+LCp490dy8JRebn0aBohC4jjcfyQf+Ph356ZferL3xx7Yf1Gtr6HgJGxPiqLjH3LO94dP2Tbb5v5NjhQ436mZNVIAZSILtpj4B/ATVLqIW4cZIuAAAAAElFTkSuQmCC',
  64. refresh: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9oHAQYoC7vvJQwAAAAZdEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIEdJTVBXgQ4XAAADk0lEQVQ4y52UX0xbVRzHP+f+K7ctLZYNDMPq6GRZxGyJ4MSJE3RkS0zUB+bDYrLsaeqDj5qYmBjjgwu+6ZuJvmwPLD4Q9WHGMAY4I7rMOHBKgcEK0qKFlraU3tue44O0KQjT+H065+acz/nd3+/7+8F/0Lm2Wv632pvs8lK0wKGesH0KMMofIwFR+3QDJwBzp/vGtr1o32ucef+N831KyaPJ+TuNH30+9BkwCmQBzjxz+PzhcOjC8Vu/DLx3Lf4akKwG6NuA2o8JR28T8bfE0lRjNrnM1Vj+SjIvhwEXsE4/2ngpMxetDemi7Ug48NTofHYQyFcA24Cy/+xzvR1dx+vtYC12jUViXS4CJYBjYd/R0kqi+b46L4ZtqkaLJ3v3+14HrB0jPNVS90hve+vAwo0R/YNvlz+JraxHJ/50RoGprrBPjt3NpaeT+TsdDwa6dfA4RUm9QffwUuEyiuV/AM92to6nY9HQ/LqKDt5OvTudci8CcSBzN+2iCQrJgrp9K5H/+fFm30s5p6QXMhvCrjFXZ1LuKCArv9xVr/eofPqhUtFlaCb9FTAJ/AEsAQpAKgDW51LON1Pp0qCQUuSlUrWa7AQCW3J4YF+gO5tKU5RwM77xPZC7h7uyl2c3+i2PiUAJvyWageAWoFF0I5apqWJRshmZ3I12f9Dm96XVSVcTWa/PxDQNG7CrfSgeaPR7jaIUhi4ov7ab4uk8gFNS2pqh636f33RgTVVHKBxXZWRJKk0TnIgEn9jB9NuldF0PeTwmqZybANYrQFMTKivFjJRSFFzJY032i8Cee9Eifg76vJ4aTdOYz7o/AakK0JVK/RDLjiilcEuSgCVae1vrzpXzUt2a1t+R66/29bztFCSJrCuvzma+ADJbfBhbcxItddZJDZqUEOz1mT11Hs0TXSmMvNzqL00mHQCr78i+TyPhBnGoKfRObHZOvzix+mHGVYNAegvQ1ERpOuVMtjXYr3gMoQkUXuQxIQh9PZ8fAoqA/9n9wUsvPH/y9MTYsLi2kP/y12ThYyBa9mrFNq5UMu2omzcSGxcsyxCmqeMgSuPxwvWqc96NzBrfDQ5g6mgO2jjwW7XFtlTSNkTu+uJ6P0LI7gPBNxcLjAE3yhXsjIQeNrQiqy6J1awzo8tig4Cg2hxtAGKXIgaBDo8ufIWSugJsADT4zLblnNux2Y4Lm32e2kzHv8qoHksH91Qawd5hjlb0F9+teenmFNIUAAAAAElFTkSuQmCC',
  65. travel: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9oGDwcpBgA4XEQAAANuSURBVDjL3ZRvbBN1GMe/v7te/9H2uLVrV6eOplsIDl2E4DI3s5GBMRsQZ6aJjBA3A0bUF2pIjEGDG4MYEzEmxogJEiM6NQgOjYhTzAwLrgbrFljHAsOxbt3Rdru7ttdr7+7nC2JiE/8EX/J99TzfPM/n1fN9gFtCP36+p6QfPPTszUNe3roWlNIS74P+Tt+f9aHe7X+7R/4LfOztHTXlQX8P7/U9brXZPYm5hd71j+5965/mS4AcgKFjezm3x2NLiom1Pr//NYdzWTNhGOTUPKS0DCUlZvSi+lQ8nvzkuQMn6Pt9W7HjlY9LgUff3MWvaagPaKqyEsRstVmtWyg1Q2AYUEogLUpUN0EEwUXldIoUtKKeySjtfS8e/H50EcaHb/Rg++7DN4CnBvavX9e88QVZnKmlphoCKPJqHi63ixaLOliWJVdikwAMMAyBR/DSMn8luTY9WVAzudcf7Nr/KgC8u+cRPL3vC7CtjaurfV5hH1/mFVgGuHxhHAYlKPMKxCwukOTCFHKKBg4GKOeAmMwS0yhS0zQtgtfXtHFNwPnZqejQ18MTONzfBfaesPc6y5C2O0LhClMv0viVScJxDDTKQKhsQDDUiOtiFDY7oBacyGSyuHNFFbE73JRShtGy6VXtzbW5++8NR5/p/dRghyNThfrVVRMenu8M3Ba0uXgBLsEOPtCIvDyP+PQ4QquacOnCEMrcy+CvqIRpFCEvpQkKCmUtnJPQQhtLda6p7vYRFgC+/Wns97qacsntWd5SURGwatkxqiNILsfOITb2A/yVtXDYdGSVeVDDDkNTAMZCObudUFOHIslIpZcaFiU1wnY/XI9oLI5vzpyPrKwqF60c95BPiFsW01epbgkTh5uHlpvFxV+OYLnvblp9VwORZQmpuRmi5IqYm09J09OzAxenxHcmZ5bOEADo2rQOR7+KAACe7960c9u2+ve8wlU6G1chijIRFy5BlqzY3LEbWr6AkeGzS9dm4+czqnFckTJnjwyOTgDIlxz2hvtqMDQ6dSN2uzoOdPdseSkRH6UcpxOHqwaE+BD5OSqei4z3zc0nB5x2S/b46V81HTD/NXpPdDQhq+QsrRse+LJ9c2vb2G+xxMmTp7/LZHOJjwZH+gFI/+vDPNnZEt75WMtB3oKqv/p11cGbh1E6gVtXfwAxKYLl39hF2gAAAABJRU5ErkJggg==',
  66. journal: 'data:image/gif;base64,R0lGODlhFAAUAPcAAAAAAP///zQTFCsVFnNRUxYLDBsHCTclKGJXWTQrLVRQUQgGB05MTTk4OVpbW4NqSZZ3UYNpSJd6V4tyVIFkRYBmSZN1VZR8Yop2X2xML31mUZmAa5eAb4NfRWlKNn5cSZiFe3xPO3lQPHZJNmc5KIU8LcdBK3MnGrxCLc1LM8pIMr5EL8RKNMZLNcdLNsRKNcdMN8BJNchQOcRNOclPO8hQO7BINoU2KcpUQLxPPMlVQcFSP7UrGMkzHbMvG4EhFLIuHKwwHLUxHqMrG7MxH5wrG8o8JcY6JLUzIa4yIa43JLc5Jqs0JL08KJ8xIro7KLk7KL88Krk6Kbk8Kbc7Kbo9K7o+LLY8K646KcFALrxBLbo+Lbk+LcREMbtAL688LLxDMIkyJMdJNas+Lo41J4gyJqpAMJE3K58+MNFTQKhDNMhTQMZSQL9RP6FCNblPPqBENp4XB4cVCGQPBpodD6MfEKMgEaAiEokcD7UlFaEhE2IWDnQbEV8WDqUoGbouHYkgFakrG6UqGrQvHp4nGoUiFrEvHpQmGYIhFqArHI8lGcM1I60uH5QoG28dFKwwIKMtHpYoHMs6J7UzI6MuIJ0rH4onG7Y3J706KrQ4KKkzJb07K54yJJowI4wsIKk2J4orILU7K7s9Lbs+Lrk+LqY6LLJANL9IOZU4Lr5VSZtHPqNXT655cnYPBaEYCm0PB1wOCIcZEFMSDYsgF3YbFHgcFYQjGZElHG0dFXkfGIIjGnUfGHIgGJYpIJguJIEnH6QzKHklHocuJ5o8M5I6MYo5MVwrJkoHAjwHA1QNCUEMCXAZE2cYE0IQDXMdF4MhG38hGognIGooJJlOSadXUWlbWi0FBDsIBj8MCmZKSUgBADQAACoAACUAACMAACIAABkAABYAABEAADcFBf///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAOQALAAAAAAUABQAAAj/AMkJHEhwGcGDCAdKizUroUNVwHbR0oPKIUFiiZJU6cTsUZ1VDqmVuvXsihdSmRwNO2UHIYFWdxr9CsYEyhZMh4qlMkXo4IA5RWo502XJ0xQpk6LBYXWpF0EE3foEAqQIGigsojZp4qXkj6tpBAscK+Snkq9PoaygaOEpmaAecQgyCCdLyKAno7hEycLChS1luPLQIbgAGSJISKho6SJmxpo0kcY1kyNsoANw2CgRWbLiRQ0dbd7QYATL2rZsAxNw4+OkSQwcO9SgsSHDBI9cJD4QFHfNDJscbs6MgZHiSJASHSwcbOCNk7EbX8CoMAIkjIgHGBIaeLXnh6RFhsiMKKBwwaKCb3h8DCkTIsIEEBYFHtB2wkMFCRziExSQAcIG/QdVo4F+AQEAOw==',
  67. close: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9kFBAYMCW+DdHoAAAN1SURBVDjLXZNNTNt1AIaf37+ltEUGBVaKmEyGCIrMTGogUYgzBi4wFzDFxMTFQHZSonFk6UXNTAzJjAvRA+GAB8UEiJjwMTEjIEbctBOTNkBBvrYCK1DStbT/fv9/HhYP23t+nyfv5YXH0tvbm+fz+a6GwuE/ImrsfjQe3w9HIn+vrKz09ff3lwNMTU09CjmdTgAmJiY+CQQC8mhrU/puLciNX6bk2sRPcv3nSelz/SkP/H65uLj4A8DMzAwA4n/J6OjocEN9nSO65EHGokhNoiUTaMkkmWSCtKqSSCQoePUc8RP5qzUvVFeNjY2hPIRHuurtdkfw93nSoQc89XoTUtNIHOyTDBwgFIXT7W8TXfPi7f2M5NZ6pcvl+ratre3hgrX19UTsr4Usbd8vKi69T47JBEJw59PLRDbWeO37cVKpJGoqzUiZhXg8RfPiv7hu3y7Wzc3NNZQUFXUdTo8LYlFWJ8fIq28gx2Si5FwTJa1vEQ6FCKkxZi9eoMC/jRGJvupFTp2tDehLS0vPxu7vkj7c58h9h/TdVeZ/u0HDjBsFSKfTiCwDy53NnNle5viEgXBSI73llZY3musUKaVZAIFbv5L0bZCrl1R/cAVN00ilUiiKgk5qPH/5Cyy5eqy5OgrNOgzZ2SLLYNArXq83Yn2umuD2DgY9lF7/Dsv5d9AJQTwaYdP9D6FQiIitjNg3s5iLT2LSaeTX1nEcDoeUgYGBDV22keLW84hsI/6sJ1DQ2PPdg4+aqPrqXXZXl7BYLIhCG8EsM8G8k1Q2teB2u+8JgKGhIflmS4ucfPlpUahL8uBiD5U3B6gwpBACohlwv/clRSPXMO5uol2fxlh6ir6+PrsOwGw2Z1XX1DTWdl/BO32DovkfMekUYhlBLANpqWBZGGcvmib44dfkP1Mll5eWXN3d3Vd1AG63e9ZkMrVmm3OebP38GsflZ/BHkgTUFIc6M/7iCu7WXyDd0Y05v0Cqqhrt6el5yeFwxAVATU0NHo+H9vb2Ybvd7mhsbJRlp8uFMScHVVUJHh2x5l2RUkqhquqK0+l8ZWdnJyiEQA/g8XgAsNlsXfPz83t7e3uXrFar2WazYTQaiUQiuFyuTDgcnj4+Pv54d3c3KIR49EwdHR0MDw8D0NnZaQkGg89Go1FbJpPBaDQeWq3W9cHBwYPHu/8B/IeoYeNzxNQAAAAASUVORK5CYII=',
  68. background: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABoAAAAaCAYAAACpSkzOAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9oHBhcQBlLyFLQAAAU8SURBVEjHdZbPb1zVFcc/98d7M7Zngu04sg1xkkZylSBaqXGRKgSLyLYIQgEWqFJ3bRdd9T9A7LuGLTtYIEWpqpZWKSnKJpEKTSgEkWAIjsgPfiQhmWRmPPPuTxb3Ps84pU86uvf9Op/zPefc+57g4aO1Cr338skRxcHlNs7+EqVXmN51iKmJWYiR7uA297uX8fY8RfkRm1f6cMED0F6F7ns73IqdkHXonU7Xp48d5vDB51laPMYvDk3x0/2OVtPjYsR7sE7Q6So2vtJ8eqXDN7f/yub1d+mcupJga9D914+Atm8stjjwzG9Y+9WLrDw+x9LCEGsDxgqsB5/NeQgRYoQQBNe+bXJ58yb/vXyS6ydPAJbWGvQSTCXIeoY8NsfhtVf47QvP8eQTJRMNQ28Aw0pQWTAGjM3moDIwrGBQRQpt2TPTYmb6CN3dB7h3433MJUt7HcwmakRdanPo6Kv84eUVFuYilY1URuxwbt0YxI2uV1ZQWYGxgbIQ7JnZR2dyH/c/P4v5ItBeRWE2gVKyd/V3/PrZY8zvjsmpFSPnLo07zI6pGwMObSrJZHM/D6Yr+hufYK7m1O1a+xnPrPyRJ5Y1xkaMFdvOnU9Orc9A/xCwvu/YTm9lI0IofNhPf+5DzJd3NTyl2Lf4Esv7phlWA7wXhDhW6Agh5LkHn8/rhvB+DG7BeDBGYKxnsrmXR9rrmKNXNQu797B7ZpX21JD+QGwDiBCAGEbAGMGHMVAA/5BKY1OTVBaEHKD1cVqTb2qifIqlhZLeIKkhQuakeX1ew0KC+TCmqK5jBlQOhkZQmYjWs4Twc01RHOGRlqM/EEnJjx0PAWtQXTvrwI3VrbLJhgYq5xHqSc1k8yDOe4Id2y9Etv/l4UNaO/1BUuHdCBzJQDsyKRxKPq6BNr2tiJTJ8TYkmxRpAxFjkMoksFbpvvBATl9dQwFICUpFpJzXbA0VmzdhfhaaZXYus4M8F1masSl1ZZHV5S6s1deprztVZZNCaGLsc+/BJM5HZtrQmgCtczQivSzyqGRSQXbqBMgwSnHdMFqCV6ADeC8Q4q5Giq+Qch7nPd2t1EnNEholFBpUTM6VygHkvTiEFIz3GRR3NorOXSmlQvCZxNkPkbJAyYiSo6KHnAYloShSusoiBdDIY1mkYLROgSg5GqUAJSNSaqy9IHHuLMF7lBTpZn5Q5zRpnZyVRQKUZbIaXuj8XA2SIFVOvZQ420OJ85JG42uMOYeQJVJGlBiLLDso1JiiMSuKFEidWqVGtVUyAk2sPUWIXcmNPzu8O4E1Q5QUCBlzNFlZVlRoKHVS0yjyXI+BajUSpIxIKbHmDtb8g+/+5lNRrn78McPhO/igkSKlUEhGwFpZAQ09Sl2ttgbU604KgfeC4fAvXDt5GUAyvQ5sWD699BZbg4tERF4XMb+UnBQqqaqboa5NHVBad3F7KfT6H3Dp3NtApH0UxXATFo5D78wW35WX2DO7TLO5yEQjonWkKMR2M9Rdp+TYxpq/Wc5HQpAMhorv717gg7N/go0Oc89B53T+8PU+h6WXoHO6wzX/H2ZnC6Rcpj3VpCg8WkUKJbbrAaMN1PmIDwJjJ7hzr8+t70/w73++DhsdFo/Drb+P/ZwAPPgMHnsRume2uP71BaYWLtLvt9D6J+xqlWnxqtQoMYILAuc11jX45lbg2o13uXXnNc6/cQruVcw/D9++83/+6wCm16FzOs1Xfq+5e3+R2fbT7H30CO3WAcpiF4JIZR5wv/cl12+epzc4x2TjNhffyj+QR6F7ZofbHwBbOem8JzJyVgAAAABJRU5ErkJggg=='
  69. }
  70.  
  71. var AUDIO = {
  72. cheese: 'data:audio/mid;base64,TVRoZAAAAAYAAQAIAeBNVHJrAAAAGQD/UQMGW5oA/1gEBAIYCAD/WQIAAAD/LwBNVHJrAAAAxQD/Aw9GaW5hbCBGYW50YXN5IDUA/yEBAAD/IAEAALAHfwCwCkAAwAQAkEZkgXCARlAAkEhkgXCASFAAkElkgXCASVAAkEtkgXCAS1AAkE1kAJBEZACQRmQAkDZkg2CATVAAkElkg2CARFAAgEZQAIA2UACASVAAkExkAJA1ZACQRWQAkENkg2CATFAAkEhkgmiAQ1AAkEFkPIBIUACQSGQ8gEVQAJBLZDyANVAAkDFkiWyAQVA8gEhQPIBLUDyAMVAA/y8ATVRyawAAABgA/wMLR29vZCBOaWdodCEA/yEBAAD/LwBNVHJrAAAAJgD/AxlPcmlnaW5hbCBieSBOb2J1byBVZW1hdHN1AP8hAQAA/y8ATVRyawAAACIA/wMVUzNNIGFuZCBtaWRpIGJ5IFlha3JhAP8hAQAA/y8ATVRyawAAAC4A/wMheWFrcmFAbmJyeWFuNzEuZG9ybS51c20ubWFpbmUuZWR1AP8hAQAA/y8ATVRyawAAABsA/wMOQXVndXN0IDQsIDE5OTcA/yEBAAD/LwBNVHJrAAAAKAD/AxtCZXN0IGhlYXJkIGluIEN1YmljIFBsYXllciEA/yEBAAD/LwA=',
  73. horn: 'data:audio/mid;base64,TVRoZAAAAAYAAQARA8BNVHJrAAAAXQD/AzZGaW5hbCBGYW50YXN5h1iBd4N0g0CDk4N0g0CBW4OMglCBeC9ieSCQX5azltiBmZdGlusvR00A/1EDB6EgAP9YBAQCGAgA8AV+fwkB9wD/WQIEAIG0AP8vAE1UcmsAAAD9nXDAOACwXVoAsFtAALAHf5Y0kDtkWIA7ZDKQPWRWgD1kMZA/ZFaAP2QxkEBkVoBAZDGQQmRWgEJkMZBEZFaARGQxkEVkVoBFZDGQR2QAkERkAJBAZIc8gEdkAIBEZACAQGQAkEdkAJBEZACQQGSBS4BHZACARGQAgEBkc5BHZACQRGQAkEBkgUuAR2QAgERkAIBAZHKQR2QAkERkAJBAZIFLgEdkAIBEZACAQGRykEhkAJBDZACQQGSHPIBIZACAQ2QAgEBkAJBKZACQRWQAkEJkhzyASmQAgEVkAIBCZACQTGQAkEdkAJBEZKUsgExkAIBHZACARGS1EP8vAE1UcmsAAABVnXDBKwCxXWQAsVtAALEHeJ1wkS9khzyBL2QAkS9kgUuBL2RzkS9kgUuBL2RykS9kgUuBL2RykTBkhzyBMGQAkTJkhzyBMmQAkTRkpSyBNGS1CP8vAE1UcmsAAADanXDCLwCyXUYAsltQALIHf51wkiNkhGOCI2SCWJIjZIFLgiNkc5IjZIFLgiNkcpIjZIFLgiNkcpIkaYRjgiRpgliSJm6EY4ImboJYkihzhGOCKHOCWJIjf3qCI39FkiN/eYIjf0WSI395giN/RZIjf3mCI39FkiN/eYIjf0WSI396giN/RZIjf3mCI39FkiN/eYIjf0WSI395giN/RZIjf3mCI39FkiN/eoIjf0WSI395giN/RZIjf3mCI39FkiN/eYIjf0WSI395giN/RZIjf4RjgiN/t3T/LwBNVHJrAAAAyJ1wwzAAs11aALNbQACzB26WNJM7ZFiDO2Qykz1kVoM9ZDGTP2RWgz9kMZNAZFaDQGQxk0JkVoNCZDGTRGRWg0RkMZNFZFaDRWQxk0dkAJNEZIRjg0dkAINEZIJYk0dkAJNEZIFLg0dkAINEZHOTR2QAk0RkgUuDR2QAg0RkcpNHZACTRGSBS4NHZACDRGRyk0hkAJNDZIRjg0hkAINDZIJYk0pkAJNCZIRjg0pkAINCZIJYk0xkAJNEZKJTg0xkAINEZLds/y8ATVRyawAAAAaBtAD/LwBNVHJrAAAABoG0AP8vAE1UcmsAAAAGgbQA/y8ATVRyawAAAAaBtAD/LwBNVHJrAAAABoG0AP8vAE1UcmsAAAA2nXDJAAC5XWQAuVtLALkHf51wyQAAmTFkiUeJMWSFMJkxZIlHiTFkhTCZMWSiU4kxZLdf/y8ATVRyawAAAAaBtAD/LwBNVHJrAAAABoG0AP8vAE1UcmsAAAAGgbQA/y8ATVRyawAAAAaBtAD/LwBNVHJrAAAABoG0AP8vAE1UcmsAAAAGgbQA/y8A',
  74. reward: 'data:audio/mid;base64,TVRoZAAAAAYAAQAJA8BNVHJrAAAAQAD/AzZGaW5hbCBGYW50YXN5h1iBd4N0g0CDk4N0g0CBW4OMglGBeC9ieSCQX5azltiBmZdGlusvR02B0gD/LwBNVHJrAAAAIwDwBX5/CQH3AP9RAwcK4gD/WAQEAhgIAP9ZAgAAgdIA/y8ATVRyawAAAVEAwTgAsQd/ALEKFACxW0C0QJE5RoEggTlGAJE7SIEggTtIAJE8SoEggTxKAJE+TIEggT5MAJFAToEggUBOAJFBUIEggUFQAJFDZINggUNkAJE8WoFwgTxaAJE+XIFwgT5cAJFAX4FwgUBfgXCRRWSBcIFFZIFwkUNijwCBQ2IAkUZpg2CBRmkAkT5fgXCBPl8AkT9hgXCBP2EAkUFkgXCBQWSBcJFIaYFwgUhpgXCRRmePAIFGZwCRSWSDYIFJZACRQV+BcIFBXwCRQmGBcIFCYQCRRGSBcIFEZIFwkUtpgXCBS2mBcJFMZIFwgUxkgXCRRF+BcIFEX4FwkUVigXCBRWKBcJFJZIFwgUlkgXCRTG6CQIFMbgCRSWmCQIFJaQCRTG6CQIFMbgCRTnOCQIFOcwCRS26CQIFLbgCRTnOCQIFOcwCRUHieAIFQeI8A/y8ATVRyawAAAT0AwkgAsgd/ALIKbgCyW0C0QJJRRoEgglFGAJJTSIEgglNIAJJUSoEgglRKAJJWTIEgglZMAJJYToEgglhOAJJZUIEggllQkmCST2SBcIJPZACSUWaBcIJRZgCSUmiBcIJSaACSUWaBcIJRZgCST2SDYIJPZJJgklJogXCCUmgAklRqgXCCVGoAklVsgXCCVWwAklRqgXCCVGoAklJog2CCUmgAklVpg2CCVWkAkk1kgXCCTWQAkk5mgXCCTmYAklBpgXCCUGmBcJJXboFwgldugXCSWG6BcIJYboFwklNpgXCCU2mBcJJVa4FwglVrgXCSWG6BcIJYboFwklVzgkCCVXMAklFugkCCUW4AklVzgkCCVXMAkld4gkCCV3gAklNzgkCCU3MAkld4gkCCV3gAkll/ngCCWX+PAP8vAE1UcmsAAAHGAMMwALMHeACzCkAAs1tQtECTOWSBIIM5ZACTO2aBIIM7ZgCTPGiBIIM8aACTPmqBIIM+agCTQGyBIINAbACTQW6BIINBbgCTPFoAk0BaAJNDWodAgzxaAINAWgCDQ1oAkzxeAJNCXgCTRV6HQIM8XgCDQl4Ag0Veg2CTP18Ak0NfAJNGX4dAgz9fAINDXwCDRl8Akz9fAJNGXwCTQ1+BcIM/XwCDRl8Ag0NfgXCTP18Ak0NfAJNGX4dAgz9fAINDXwCDRl8Akz9jAJNFYwCTSGOHQIM/YwCDRWMAg0hjg2CTRmQAk0JkAJNJZIdAg0ZkAINCZACDSWQAk0JkAJNGZACTSWSBcINCZACDRmQAg0lkgXCTQloAk0ZaAJNJWodAg0JaAINGWgCDSVoAk0RfAJNIXwCTS1+HQINEXwCDSF8Ag0tfAJNJZACTRWQAk0xkh0CDSWQAg0VkAINMZACTS2kAk05pAJNHaYdAg0tpAINOaQCDR2kAk0lkAJNFZACTTGSHQINJZACDRWQAg0xkAJNOaQCTS2kAk0dph0CDTmkAg0tpAINHaQCTUGkAk0lpAJNNaZ4Ag1BpAINJaQCDTWmPAP8vAE1UcmsAAACgAMQvALQHfwC0CkAAtFtkvACUMG6HQIQwbgCUMG6HQIQwboNglC1ph0CELWkAlC1pgXCELWmBcJQzc4dAhDNzAJQzc4dAhDNzg2CULm6HQIQubgCULm6BcIQuboFwlDZzh0CENnMAlDFuh0CEMW4AlC1ph0CELWkAlDFuh0CEMW4AlC1ph0CELWkAlC9uh0CEL24AlDF0ngCEMXSPAP8vAE1UcmsAAAFRAMU5ALUHeAC1ChQAtVtktECVOVqBIIU5WgCVO1yBIIU7XACVPF6BIIU8XgCVPmCBIIU+YACVQGKBIIVAYgCVQWSBIIVBZACVQ1qDYIVDWgCVPFCBcIU8UACVPlKBcIU+UgCVQFWBcIVAVYFwlUVagXCFRVqBcJVDWI8AhUNYAJVGaYNghUZpAJU+X4FwhT5fAJU/YYFwhT9hAJVBZIFwhUFkgXCVSGmBcIVIaYFwlUZnjwCFRmcAlUlkg2CFSWQAlUFfgXCFQV8AlUJhgXCFQmEAlURkgXCFRGSBcJVLaYFwhUtpgXCVTGSBcIVMZIFwlURfgXCFRF+BcJVFYoFwhUVigXCVSWSBcIVJZIFwlUxugkCFTG4AlUlpgkCFSWkAlUxugkCFTG4AlU5zgkCFTnMAlUtugkCFS24AlU5zgkCFTnMAlVB4ngCFUHiPAP8vAE1UcmsAAAK4AMkAALkHfwC5W2S8AJkmZIEgiSZkAJkmZIEgiSZkAJkmZIEgiSZkAJkmZIEgiSZkAJkmZIEgiSZkAJkmZIEgiSZkAJkmZIEgiSZkAJkmZIEgiSZkAJkmZIEgiSZkAJkmZIEgiSZkAJkmZIEgiSZkAJkmZIEgiSZkg2CZJmSHQIkmZACZJmSBcIkmZIFwmSZkgSCJJmQAmSZkgSCJJmQAmSZkgSCJJmQAmSZkgSCJJmQAmSZkgSCJJmQAmSZkgSCJJmQAmSZkgSCJJmQAmSZkgSCJJmQAmSZkgSCJJmQAmSZkgSCJJmQAmSZkgSCJJmQAmSZkgSCJJmSDYJkmZIdAiSZkAJkmZIFwiSZkgXCZJmSDYIkmZACZJmSBcIkmZACZJmSBcIkmZACZJmSBIIkmZACZJmSBIIkmZACZJmSBIIkmZACZJmSBIIkmZACZJmSBIIkmZACZJmSBIIkmZACZJmSDYIkmZACZJmSBcIkmZACZJmSBcIkmZACZJmSBIIkmZACZJmSBIIkmZACZJmSBIIkmZACZJmSBIIkmZACZJmSBIIkmZACZJmSBIIkmZACZJmSCQIkmZACZJmSCQIkmZACZJmSCQIkmZACZJmSCQIkmZACZJmSCQIkmZACZJmSCQIkmZACZJmSBIIkmZACZJmaBIIkmZgCZJmiBIIkmaACZJmeBIIkmZwCZJmaBIIkmZgCZJmSBIIkmZACZJmKBIIkmYgCZJmCBIIkmYACZJl6BIIkmXgCZJlyBIIkmXACZJlqBIIkmWgCZJliBIIkmWACZJleBIIkmVwCZJlWBIIkmVQCZJlWBIIkmVQCZJlOBIIkmUwCZJlGBIIkmUQCZJk+BIIkmTwCZJk2BIIkmTQCZJkuBIIkmSwCZJkmBIIkmSQCZJkeBIIkmRwCZJkWBIIkmRZAg/y8ATVRyawAAAEW8AJkxc54AiTFzAJkxc54AiTFzAJkxc48AiTFzAJkxc48AiTFzAJkxc4dAiTFzAJkxeIdAiTF4AJkxf54AiTF/jwD/LwA=',
  75. maxamp: 'data:audio/mid;base64,TVRoZAAAAAYAAQAMAeBNVHJrAAAA1wD/Aw9PcmNoZXN0cmFsIEhhcnAAwC4AsAd/AP9RAwOTh4NgkENggXBDAABHYIFwRwAASmCBcEoAAEdggXBHAABKYIFwSgAAT2CBcE8AAEpggXBKAABPYIFwTwAAU2CBcFMAAE9ggXBPAABTYIFwUwAAVmCBcFYAAFtggXBbAABWYIFwVgAAU2CBcFMAAFZggXBWAABTYIFwUwAAT2CBcE8AAFNggXBTAABPYIFwTwAASmCBcEoAAE9ggXBPAABKYIFwSgAAR2CBcEcAAENggXBDAIkw/y8ATVRyawAAAHwA/wMPU3RyaW5nIEVuc2VtYmxlAMEwiTCRQ2AAO2AAPmCBcEMAADsAAD4AAENgADtgAD5ggXBDAAA7AAA+AABDYAA7YAA+YIFwQwAAOwAAPgAARGAAPGAAP2CLIEQAADwAAD8AAENgADtgAD5gmDBDAAA7AAA+AIkw/y8ATVRyawAAAOkA/wMHVGltcGFuaQDCL4Ngkit/hVArAAArf4FwKwAAK3+BcCsAACt/gXArAAArf4JoKwAAK3+CaCsAACt/gmgrAAArf4JoKwAAK394KwAAK394KwAAK394KwAAK394KwAAK394KwAAK394KwAAK394KwAAK394KwAAK394KwAAK394KwAAK394KwAAK394KwAAK394KwAAK394KwAAK394KwAAK394KwAAK394KwAAK394KwAAK394KwAAK394KwAAK394KwAAK394KwAAK394KwAAK394KwAAK394KwAAK394KwCJMP8vAE1UcmsAAAA4AMM4AP8DB1RydW1wZXSJMJNHf4FwRwAAR3+BcEcAAEd/gXBHAABIf4sgSAAAR3+YMEcAiTD/LwBNVHJrAAAACQD/AwC8AP8vAE1UcmsAAAApAP8DIEx1ZmlhIElJOiBSaXNlIG9mIHRoZSBTaW5pc3RyYWxzvAD/LwBNVHJrAAAAGgD/AxFCbHVlIFRyZWFzdXJlIEJveLwA/y8ATVRyawAAAAkA/wMAvAD/LwBNVHJrAAAAGwD/AxJieSBZYXN1bm9yaSBTaGlvbm+8AP8vAE1UcmsAAAAfAP8DFnNlcXVlbmNlZCBieSBTaW5jbGFpckO8AP8vAE1UcmsAAAAcAP8DE3NpbmNsYWlyQGFjcm9zcy5jb228AP8vAE1UcmsAAAAYAP8DD2x1ZjJibHVlYm94Lm1pZLwA/y8A',
  76. season: 'data:audio/mid;base64,TVRoZAAAAAYAAQAOAeBNVHJrAAAAXgD/UQMFuNgA/wMRUGl6emljYXRvIFN0cmluZ3MAwC2HQLAHcABbUJZAkFRweFQAeEtoeEsAeE9geE8AeEhYeEgAeEtQeEsAeENIeEMAeEhAeEgAeD84eD8Aj3j/LwBNVHJrAAABIwD/Aw9TdHJpbmcgRW5zZW1ibGUAwTCHQLEHcABbUIdAkTxAAD8geDwAAD8AAD1DAEAjeD0AAEAAADxGAD8meDwAAD8AAD1JAEApeD0AAEAAAD9MAEIseD8AAEIAAEBQAEMweEAAAEMAAD9TAEIzeD8AAEIAAEBWAEM2eEAAAEMAAEFZAEQ5eEEAAEQAAEJcAEU8eEIAAEUAAEFgAERAeEEAAEQAAEJjAEVDeEIAAEUAAENmAEZGeEMAAEYAAERpAEdJeEQAAEcAAENsAEZMeEMAAEYAAERwAEdQeEhPACRQAEQAAEcAgXBIAAA/TIFwPwAAQ0iBcEMAADxEgXA8AAA/QIFwPwAANzyBcDcAADw4gXA8AAAzNIFwMwAAJACPAP8vAE1UcmsAAACmAP8DD1N0cmluZyBFbnNlbWJsZQDCMIdAsgdwAFtgh0CSMHCDYDAAACtwg2ArAAAncINgJwAAJHCDYCQAACRweCQAACRgeCQAACRweCQAACRgeCQAACRweCQAACRgeCQAACRweCQAACRgeCQAACRweCQAACRgeCQAACRweCQAACRgeCQAACRweCQAACRgeCQAACRweCQAACRgeCQAh0CyB3CHQP8vAE1UcmsAAAB9AP8DB1RpbXBhbmkAwy+HQLMHcABbYJZAkyR/eCQAACRyeCQAACRoeCQAACRfeCQAACRWeCQAACRNeCQAACRFeCQAACQ/eCQAACQ5eCQAACQzeCQAACQueCQAACQqeCQAACQneCQAACQleCQAACQjeCQAACQieCQAjwD/LwBNVHJrAAAAyADJMAD/AwpQZXJjdXNzaW9uh0C5B3AAW1CHQAcgAJkmcHgmAAAmQBi5ByZgmSYAACZQMLkHLEiZJgAAJmBIuQcyMJkmAAAmcGC5BzgYmSYAACZAeCYAALkHPgCZJlB4JgAAJmAYuQdEYJkmAAAmcDC5B0pImSYAACZASLkHUDCZJgAAJlBguQdWGJkmAAAmYHgmAAC5B1wAmSZweCYAACZAGLkHYmCZJgAAJlAwuQdoSJkmAAAmYEi5B24wmSYAALkHcJ4A/y8ATVRyawAAAAW8AP8vAE1UcmsAAAAbAP8DEk9ncmUgQmF0dGxlIChTTkVTKbwA/y8ATVRyawAAABIA/wMJRGFuZ2Vyb3VzvAD/LwBNVHJrAAAABbwA/y8ATVRyawAAABwA/wMTYnkgSGl0b3NoaSBTYWtpbW90b7wA/y8ATVRyawAAAB8A/wMWc2VxdWVuY2VkIGJ5IFNpbmNsYWlyQ7wA/y8ATVRyawAAABwA/wMTc2luY2xhaXJAYWNyb3NzLmNvbbwA/y8ATVRyawAAAAW8AP8vAE1UcmsAAAAUAP8DC29ibG9zZTIubWlkvAD/LwA=',
  77. washed: 'data:audio/mid;base64,TVRoZAAAAAYAAAABAYBNVHJrAAAB7wD/AwpES0MyLzNCRk5TAP9YBAQCGAgA/1EDB6EghSOZJmQBkk1kAJVBZHqJJgAAmSNkBMYgBoJNAADDOwCSSmQBk0ZkAcQ7BJRKZAGFQQAAlT5kA8YgA5YiZFeJIwABgkoAAJJNZAGDRgABhT4AAIRKAAGVQWQBhiIAboJNAACZJmQBkk9kAZNEZAGUSmQBhUEAAJVDZACWImRwgk8AAIkmAACSUGQBg0QAAYRKAAWFQwAAlURkbYJQAACZI2QBklFkAZNGZAGFRAAAlExkAZVFZAGGIgAAliRkbokjAAGCUQAAmSZkAJJUZAGDRgABhEwAAYVFAACVSGRxiSYAAJkmZAGCVAAAklZkAZNGZAGFSAAAlExkAZVKZAGGJAAAliRkb4kmAACZKGQBglYAAYNGAACSWWQBk0VkBIRMAAGGJAAAhUoAAJRNZACVTWQAlh1kZ4koAAGCWQB0g0UAAJJWZAGFTQABlUpkAYYdAHGZJmQBglYAAJJXZAGTRWQBhE0AAJRIZAGFSgABlUtkAZYdZGuJJgAAmSZkcokmAHWZMmQciTIAAZkwZByJMAABmS9kHIkvAACZLWQdiS0AAZkrZBuJKwAAmTFkAJkpZB2JKQAAiTEAOoYdAHaDRQAAglcAAYRIAAGFSwCIWv8vAA==',
  78. tourney: 'data:audio/mid;base64,TVRoZAAAAAYAAQAHAeBNVHJrAAAALQD/WAQBAhgIAP9ZAgAAAP9RAwdTAAD/BgdmYW5mYXJlg2D/WAQEAhgIAP8vAE1UcmsAAABfAP8hAQAA/wMEUEVUMQCwAAEAwDgAsAduALAKP4NgkEhkUEgAUEhkUEgAUEhkUEgAUEhkg2BIAABEZINgRAAARmSDYEYAAEhkgR9IAIEhRmSBH0YAAUhkix9IAAD/LwBNVHJrAAAAXwD/IQEAAP8DBFBFVDIAsQABAME4ALEHbgCxCj+DYJFBZFBBAFBAZFBAAFA+ZFA+AFBAZINgQAAAPGSDYDwAAD5kg2A+AABAZIEfQACBIT5kgR8+AAFAZIsfQAAA/y8ATVRyawAAAF8A/yEBAAD/AwRQRVQzALIAAQDCOACyB24Asgo/g2CSPmRQPgBQPGRQPABQPGRQPABQPGSDYDwAADpkg2A6AAA6ZINgOgAAPGSBHzwAgSE8ZIEfPAABPGSLHzwAAP8vAE1UcmsAAABfAP8hAQAA/wMEUEVUNACzAAEAwzgAswduALMKP4NgkzlkUDkAUDdkUDcAUDVkUDUAUDdkg2A3AAAzZINgMwAANWSDYDUAADdkgR83AIEhNWSBHzUAATdkix83AAD/LwBNVHJrAAAAYQD/IQEAAP8DBlRST01CTwC0AAEAxDkAtAduALQKP4NglDxkUDwAUDxkUDwAUDxkUDwAUDxkg2A8AAA4ZINgOAAAOmSDYDoAADxkgR88AIEhOmSBHzoAATxkix88AAD/LwBNVHJrAAABLAD/IQEAAP8DBVNOQVJFALkAAQDJfwC5B24AuQo/ALkAAQCZKGQ8KAAAKF88KAAAKFo8KAAAKFU8KAAAKFA8KAAAKEs8KAAAKEY8KAAAKEE8KAAAKGSBICgAAChkgSAoAAAoZIEgKAAAKGQ8KAAAKFo8KAAAKFA8KAAAKEY8KAAAKDw8KAAAKDI8KAAAKCg8KAAAKB48KAAAKGSCQCgAACg8gSAoAAAoZIEgKAAAKGSBICgAAChkgSAoAAAoZII/KAABKGSBHygAAShkOygAAShfOygAAShaOygAAShVOygAAShQOygAAShLOygAAShGOygAAShBOygAASg8OygAASg3OygAASgyOygAASgtOygAASgoOygAASgjOygAASgeOygAASgZOygAAP8vAA=='
  79. }
  80.  
  81. var LEVEL = [
  82. [ 'Novice' ],
  83. [ 'Recruit' ],
  84. [ 'Apprentice' ],
  85. [ 'Initiate' ],
  86. [ 'Journeyman' ],
  87. [ 'Master' ],
  88. [ 'Grandmaster' ],
  89. [ 'Legendary' ],
  90. [ 'Hero' ],
  91. [ 'Knight' ],
  92. [ 'Lord', 'Lady', 'Lord/Lady' ],
  93. [ 'Baron', 'Baroness', 'Baron/Baroness' ],
  94. [ 'Count', 'Countess', 'Count/Countess' ],
  95. [ 'Duke', 'Duchess', 'Duke/Duchess' ],
  96. [ 'Grand Duke', 'Grand Duchess', 'Grand Duke/Grand Duchess' ],
  97. [ 'Archduke', 'Archduchess', 'Archduke/Archduchess' ]
  98. ];
  99.  
  100. var LNAME = 0, LZONE = 1, LLINK = 2, LLVL = 3, LMAP = 4, LWARNING = 5, LID = 6;
  101. var LOCATION = {
  102. region: [ 'Gnawnia', 'Valour', 'Whisker Woods', 'Varmint Valley', 'Burroughs', 'Furoma', 'Bristle Woods', 'Rodentia', 'Tribal Isles', 'Sandtail Desert', 'Rift Plane' ],
  103. detail: [
  104. [ 'Meadow', 0, 'meadow', 0, 6, false ], // 0
  105. [ 'Town of Gnawnia', 0, 'town_of_gnawnia', 1, 6, false ],
  106. [ 'Windmill', 0, 'windmill', 2, 6, false ],
  107. [ 'Harbour', 0, 'harbour', 3, 6, false ],
  108. [ 'Mountain', 0, 'mountain', 4, 6, false ],
  109. [ 'Slushy Shoreline', 0, 'slushy_shoreline', 10, 856, false ],
  110. [ 'King\'s Arms', 1, 'kings_arms', 1, 6, false ],
  111. [ 'Tournament Hall', 1, 'tournament_hall', 2, 6, false ],
  112. [ 'King\'s Gauntlet', 1, 'kings_gauntlet', 3, 4, false ],
  113. [ 'Calm Clearing', 2, 'calm_clearing', 4, 16, false ],
  114. [ 'Great Gnarled Tree', 2, 'great_gnarled_tree', 5, 5, false ],
  115. [ 'Lagoon', 2, 'lagoon', 6, 10, false ], // 10
  116. [ 'Claw Shot City', 3, 'claw_shot_city', 0, 6, false ],
  117. [ 'Gnawnian Express Station', 3, 'train_station', 0, 6, false ],
  118. [ 'Laboratory', 4, 'laboratory', 5, 9, false ],
  119. [ 'Toxic Spill', 4, 'pollution_outbreak', LEVEL.length, 9, false ],
  120. [ 'Town of Digby', 4, 'town_of_digby', 5, 3, false ],
  121. [ 'Mousoleum', 4, 'mousoleum', 5, [ 15, 12 ], false ],
  122. [ 'Bazaar', 4, 'bazaar', 6, 2, false ],
  123. [ 'Training Grounds', 5, 'training_grounds', 6, [ 13, 14 ], false ],
  124. [ 'Dojo', 5, 'dojo', 6, 14, false ],
  125. [ 'Meditation Room', 5, 'meditation_room', 6, 14, false ],
  126. [ 'Pinnacle Chamber', 5, 'pinnacle_chamber', 6, 14, false ],
  127. [ 'Catacombs', 6, 'catacombs', 7, 12, false ], // 20
  128. [ 'Forbidden Grove', 6, 'forbidden_grove', 7, 8, false ],
  129. [ 'Acolyte Realm', 6, 'acolyte_realm', 7, -1, true ],
  130. [ 'S.S. Huntington III', 7, 'ss_huntington_ii', 7, 7, false ],
  131. [ 'Seasonal Garden', 7, 'seasonal_garden', 10, 347, false ],
  132. [ 'Zugzwang\'s Tower', 7, 'zugzwang_tower', 10, 348, true ],
  133. [ 'Crystal Library', 7, 'zugzwang_library', 10, 646, false ],
  134. [ 'Iceberg', 7, 'iceberg', 10, 856, false ],
  135. [ 'Cape Clawed', 8, 'cape_clawed', 7, 11, false ],
  136. [ 'Elub Shore', 8, 'elub_shore', 7, 11, false ],
  137. [ 'Nerg Plains', 8, 'nerg_plains', 7, 11, false ],
  138. [ 'Derr Dunes', 8, 'derr_dunes', 7, 11, false ], // 30
  139. [ 'Jungle of Dread', 8, 'jungle_of_dread', 8, 11, false ],
  140. [ 'Dracano', 8, 'dracano', 9, 11, false ],
  141. [ 'Balack\'s Cove', 8, 'balacks_cove', 9, 1, false ],
  142. [ 'Fiery Warpath', 9, 'desert_warpath', 11, 529, false ],
  143. [ 'Muridae Market', 9, 'desert_city', 11, 528, false ],
  144. [ [ 'Living Garden', 'Twisted Garden' ], 9, 'desert_oasis', 11, 607, false ],
  145. [ [ 'Lost City', 'Cursed City' ], 9, 'lost_city', 11, 607, false ],
  146. [ [ 'Sand Dunes', 'Sand Crypts' ], 9, 'sand_dunes', 11, 607, false ],
  147. [ 'Gnawnia Rift', 10, 'rift_gnawnia', 12, 1422, false ],
  148. [ [ 'King\'s Party Zone', 'Vacant Lot', 'Birthday Party Celebration', 'Chocolate Factory', 'Festive Comet', 'Haunted Terrortories', 'Snow Fortress', 'Great Gnawnian Games', 'MegaBuy Mart', 'Calamity Carl\'s Cozy Cruise', 'Festive Snow Fort', 'Dance Hall' ], 0, 'special_event_location', 1, 6, false ],
  149. [ 'Ronza\'s Traveling Shoppe', 0, 'ronzas_traveling_shoppe', 1, 6, false ] // 40
  150. ],
  151. costs: [
  152. // Mead TGnaw Windm Harbo Mount Shore KArms THall Gaunt Clear GTree Lagoo ClwCty GESttn Labor Spill Digby Mouse Bazaa Train Dojo MRoom Pinna Catac Grove AcRlm SSIII SGard ZTowr CLibr Icbrg CapeC ElubS NergP DerrD Dread Draco BCove Fiery MMark LGard LCity SDune GnRift Event Ronza
  153. [ 0, 10, 260, 510, 1010, 1010, 1060, 1010, 1010, 250, 500, 1000, 500, 750, 2010, 2260, 2510, 2510, 2260, 3510, 3535, 3560, 3660, 4010, 5010, -99, 2010, 4010, 9010, 9710, 4510, 3510, 4010, 4010, 4010, 4510, 6510, 6510, 2200, 4100, 6300, 8650, 8650, 2400, 520, 60 ], // Meadow
  154. [ 0, 0, 250, 500, 1000, 1000, 1050, 1000, 1000, 260, 510, 1010, 510, 760, 2000, 2250, 2500, 2500, 2250, 3500, 3525, 3550, 3650, 4000, 5000, -99, 2000, 4000, 9000, 9700, 4500, 3500, 4000, 4000, 4000, 4500, 6500, 6500, 2210, 4110, 6310, 8660, 8660, 2410, 510, 50 ], // Town of Gnawnia
  155. [ 0, 250, 0, 250, 1250, 750, 800, 750, 750, 510, 760, 1260, 760, 1010, 2250, 2500, 2750, 2750, 2500, 3750, 3775, 3800, 3900, 4250, 5250, -99, 1750, 3750, 8750, 9450, 4250, 3250, 3750, 3750, 3750, 4250, 6250, 6250, 2460, 4360, 6560, 8910, 8910, 2660, 260, 300 ], // Windmill
  156. [ 0, 500, 250, 0, 1500, 500, 550, 500, 500, 760, 1010, 1510, 1010, 1260, 2500, 2750, 3000, 3000, 2750, 4000, 4025, 4050, 4150, 4500, 5500, -99, 1500, 3500, 8500, 9200, 4000, 3000, 3500, 3500, 3500, 4000, 6000, 6000, 2710, 4610, 6810, 9160, 9160, 2910, 10, 550 ], // Harbour
  157. [ 0, 1000, 1250, 1500, 0, 2000, 2050, 2000, 2000, 1260, 1510, 2010, 1510, 1760, 1000, 1250, 1500, 1500, 1250, 2500, 2525, 2550, 2650, 3000, 4000, -99, 3000, 5000, 10000, 10700, 5500, 4500, 5000, 5000, 5000, 5500, 7500, 7500, 3210, 5110, 7310, 9660, 9660, 3410, 1510, 1050 ], // Mountain
  158. [ 0, 1000, 750, 500, 2000, 0, 1050, 1000, 1000, 1260, 1510, 2010, 1510, 1760, 3000, 3250, 3500, 3500, 3250, 4500, 4525, 4550, 4650, 5000, 6000, -99, 2000, 4000, 9000, 9700, 4500, 3500, 4000, 4000, 4000, 4500, 6500, 6500, 3210, 5110, 7310, 9660, 9660, 3410, 510, 1050 ], // Slushy Shoreline
  159. [ 0, 1050, 800, 550, 2050, 1050, 0, 50, 1050, 1310, 1560, 2060, 1560, 1810, 3050, 3300, 3550, 3550, 3300, 4550, 4575, 4600, 4700, 5050, 6050, -99, 2050, 4050, 9050, 9750, 4550, 3550, 4050, 4050, 4050, 4550, 6550, 6550, 3260, 5160, 7360, 9710, 9710, 3460, 550, 1100 ], // King's Arms
  160. [ 0, 1000, 750, 500, 2000, 1000, 50, 0, 1000, 1260, 1510, 2010, 1510, 1760, 3000, 3250, 3500, 3500, 3250, 4500, 4525, 4550, 4650, 5000, 6000, -99, 2000, 4000, 9000, 9700, 4500, 3500, 4000, 4000, 4000, 4500, 6500, 6500, 3210, 5110, 7310, 9660, 9660, 3410, 510, 1050 ], // Tournament Hall
  161. [ 0, 1000, 750, 500, 2000, 1000, 1050, 1000, 0, 1260, 1510, 2010, 1510, 1760, 3000, 3250, 3500, 3500, 3250, 4500, 4525, 4550, 4650, 5000, 6000, -99, 2000, 4000, 9000, 9700, 4500, 3500, 4000, 4000, 4000, 4500, 6500, 6500, 3210, 5110, 7310, 9660, 9660, 3410, 510, 1050 ], // King's Gauntlet
  162. [ 0, 260, 510, 760, 1260, 1260, 1310, 1260, 1260, 0, 250, 750, 250, 500, 2260, 2510, 2760, 2760, 2510, 3760, 3785, 3810, 3910, 4260, 5260, -99, 2260, 4260, 9260, 9960, 4760, 3760, 4260, 4260, 4260, 4760, 6760, 6760, 1950, 3850, 6050, 8400, 8400, 2650, 770, 310 ], // Calm Clearing
  163. [ 0, 510, 760, 1010, 1510, 1510, 1560, 1510, 1510, 250, 0, 500, 500, 750, 2510, 2760, 3010, 3010, 2760, 4010, 4035, 4060, 4160, 4510, 5510, -99, 2510, 4510, 9510, 10210, 5010, 4010, 4510, 4510, 4510, 5010, 7010, 7010, 1700, 3600, 5800, 8150, 8150, 2900, 1020, 560 ], // Great Gnarled Tree
  164. [ 0, 1010, 1260, 1510, 2010, 2010, 2060, 2010, 2010, 750, 500, 0, 1000, 1250, 3010, 3260, 3510, 3510, 3260, 4510, 4535, 4560, 4660, 5010, 6010, -99, 3010, 5010, 10010, 10710, 5510, 4510, 5010, 5010, 5010, 5510, 7510, 7510, 1200, 3100, 5300, 7650, 7650, 3400, 1520, 1060 ], // Lagoon
  165. [ 0, 510, 760, 1010, 1510, 1510, 1560, 1510, 1510, 250, 500, 1000, 0, 250, 2510, 2760, 3010, 3010, 2760, 4010, 4035, 4060, 4160, 4510, 5510, -99, 2510, 4510, 9510, 10210, 5010, 4010, 4510, 4510, 4510, 5010, 7010, 7010, 2200, 4100, 6300, 8650, 8650, 2900, 1020, 560 ], // Claw Shot City
  166. [ 0, 760, 1010, 1260, 1760, 1760, 1810, 1760, 1760, 500, 750, 1250, 250, 0, 2760, 3010, 3260, 3260, 3010, 4260, 4285, 4310, 4410, 4760, 5760, -99, 2760, 4760, 9760, 10460, 5260, 4260, 4760, 4760, 4760, 5260, 7260, 7260, 2450, 4350, 6550, 8900, 8900, 3150, 1270, 810 ], // Gnawnian Express Station
  167. [ 0, 2000, 2250, 2500, 1000, 3000, 3050, 3000, 3000, 2260, 2510, 3010, 2510, 2760, 0, 250, 500, 500, 250, 1500, 1525, 1550, 1650, 2000, 3000, -99, 4000, 6000, 11000, 11700, 6500, 5500, 6000, 6000, 6000, 6500, 8500, 8500, 4210, 6110, 8310, 10660, 10660, 4410, 2510, 2050 ], // Laboratory
  168. [ 0, 2250, 2500, 2750, 1250, 3250, 3300, 3250, 3250, 2510, 2760, 3260, 2760, 3010, 250, 0, 750, 250, 250, 1750, 1775, 1800, 1900, 2250, 3250, -99, 4250, 6250, 11250, 11950, 6750, 5750, 6250, 6250, 6250, 6750, 8750, 8750, 4460, 6360, 8560, 10910, 10910, 4660, 2760, 2300 ], // Toxic Spill
  169. [ 0, 2500, 2750, 3000, 1500, 3500, 3550, 3500, 3500, 2760, 3010, 3510, 3010, 3260, 500, 750, 0, 1000, 750, 2000, 2025, 2050, 2150, 2500, 3500, -99, 4500, 6500, 11500, 12200, 7000, 6000, 6500, 6500, 6500, 7000, 9000, 9000, 4710, 6610, 8810, 11160, 11160, 4910, 3010, 2550 ], // Town of Digby
  170. [ 0, 2500, 2750, 3000, 1500, 3500, 3550, 3500, 3500, 2760, 3010, 3510, 3010, 3260, 500, 250, 1000, 0, 250, 1000, 1025, 1050, 1150, 1500, 2500, -99, 4500, 6500, 11500, 12200, 7000, 6000, 6500, 6500, 6500, 7000, 9000, 9000, 4710, 6610, 8810, 11160, 11160, 4910, 3010, 2550 ], // Mousoleum
  171. [ 0, 2250, 2500, 2750, 1250, 3250, 3300, 3250, 3250, 2510, 2760, 3260, 2760, 3010, 250, 250, 750, 250, 0, 1250, 1275, 1300, 1400, 1750, 2750, -99, 4250, 6250, 11250, 11950, 6750, 5750, 6250, 6250, 6250, 6750, 8750, 8750, 4460, 6360, 8560, 10910, 10910, 4660, 2760, 2300 ], // Bazaar
  172. [ 0, 3500, 3750, 4000, 2500, 4500, 4550, 4500, 4500, 3760, 4010, 4510, 4010, 4260, 1500, 1750, 2000, 1000, 1250, 0, 25, 50, 150, 2500, 3500, -99, 5500, 7500, 12500, 13200, 8000, 7000, 7500, 7500, 7500, 8000, 10000, 10000, 5710, 7610, 9810, 12160, 12160, 5910, 4010, 3550 ], // Training Grounds
  173. [ 0, 3525, 3775, 4025, 2525, 4525, 4575, 4525, 4525, 3785, 4035, 4535, 4035, 4285, 1525, 1775, 2025, 1025, 1275, 25, 0, 25, 125, 2525, 3525, -99, 5525, 7525, 12525, 13225, 8025, 7025, 7525, 7525, 7525, 8025, 10025, 10025, 5735, 7635, 9835, 12185, 12185, 5935, 4035, 3575 ], // Dojo
  174. [ 0, 3550, 3800, 4050, 2550, 4550, 4600, 4550, 4550, 3810, 4060, 4560, 4060, 4310, 1550, 1800, 2050, 1050, 1300, 50, 25, 0, 100, 2550, 3550, -99, 5550, 7550, 12550, 13250, 8050, 7050, 7550, 7550, 7550, 8050, 10050, 10050, 5760, 7660, 9860, 12210, 12210, 5960, 4060, 3600 ], // Meditation Room
  175. [ 0, 3650, 3900, 4150, 2650, 4650, 4700, 4650, 4650, 3910, 4160, 4660, 4160, 4410, 1650, 1900, 2150, 1150, 1400, 150, 125, 100, 0, 2650, 3650, -99, 5650, 7650, 12650, 13350, 8150, 7150, 7650, 7650, 7650, 8150, 10150, 10150, 5860, 7760, 9960, 12310, 12310, 6060, 4160, 3700 ], // Pinnacle Chamber
  176. [ 0, 4000, 4250, 4500, 3000, 5000, 5050, 5000, 5000, 4260, 4510, 5010, 4510, 4760, 2000, 2250, 2500, 1500, 1750, 2500, 2525, 2550, 2650, 0, 1000, -99, 6000, 8000, 13000, 13700, 8500, 7500, 8000, 8000, 8000, 8500, 10500, 10500, 6210, 8110, 10310, 12660, 12660, 6410, 4510, 4050 ], // Catacombs
  177. [ 0, 6500, 6750, 7000, 5500, 6000, 7550, 7500, 7500, 6760, 7010, 6010, 5510, 5760, 4500, 3250, 5000, 4000, 3250, 5000, 5025, 5050, 5150, 2500, 0, 0, 8500, 10500, 15500, 14700, 11000, 10000, 10500, 10500, 10500, 11000, 13000, 13000, 7210, 9110, 11310, 13660, 13660, 7410, 5510, 5050 ], // Forbidden Grove
  178. [ 0, 4500, 4750, 5000, 3500, -99, 5550, 5500, 5500, 4760, 5010, 5510, 5010, 5260, 2500, 2250, 3000, 2000, 2250, 3000, 3025, 3050, 3150, 500, 1500, 0, 6500, 8500, 13500, 12700, 9000, 8000, 8500, 8500, 8500, 9000, 11000, 11000, 5210, 7110, 9310, 11660, 11660, 5410, 3510, 3050 ], // Acolyte Realm
  179. [ 0, 2000, 1750, 1500, 3000, 2000, 2050, 2000, 2000, 2260, 2510, 3010, 2510, 2760, 4000, 4250, 4500, 4500, 4250, 5500, 5525, 5550, 5650, 4000, 7000, -99, 0, 2000, 7000, 7700, 2500, 1500, 2000, 2000, 2000, 2500, 4500, 4500, 4210, 6110, 8310, 10660, 10660, 4410, 1510, 2050 ], // S.S. Huntington II
  180. [ 0, 4000, 3750, 3500, 5000, 4000, 4050, 4000, 4000, 4260, 4510, 5010, 4510, 4760, 6000, 6250, 6500, 6500, 6250, 7500, 7525, 7550, 7650, 8000, 9000, -99, 2000, 0, 5000, 5700, 4500, 3500, 4000, 4000, 4000, 4500, 6500, 6500, 6210, 8110, 10310, 12660, 12660, 6410, 3510, 4050 ], // Seasonal Garden
  181. [ 0, 9000, 8750, 8500, 10000, 9000, 9050, 9000, 9000, 9260, 9510, 10010, 9510, 9760, 11000, 11250, 11500, 11500, 11250, 12500, 12525, 12550, 12650, 13000, 14000, -99, 7000, 5000, 0, 700, 9500, 8500, 9000, 9000, 9000, 9500, 11500, 11500, 11210, 13110, 15310, 17660, 17660, 11410, 8510, 9050 ], // Zugzwang's Tower
  182. [ 0, 9700, 9450, 9200, 10700, 9700, 9750, 9700, 9700, 9960, 10210, 10710, 10210, 10460, 11700, 11950, 12200, 12200, 11950, 13200, 13255, 13250, 13350, 13700, 14700, -99, 7700, 5700, 700, 0, 10200, 9200, 9700, 9700, 9700, 10200, 12200, 12200, 11910, 13810, 16010, 18360, 18360, 12110, 9210, 9750 ], // Crystal Library
  183. [ 0, 4500, 4250, 4000, 5500, 4500, 4550, 4500, 4500, 4760, 5010, 5510, 5010, 5260, 6500, 6750, 7000, 7000, 6750, 8000, 8025, 8050, 8150, 8500, 11000, -99, 2500, 4500, 9500, 10200, 0, 4000, 4500, 4500, 4500, 5000, 7000, 7000, 6710, 8610, 10810, 13160, 13160, 6910, 4010, 4550 ], // Iceberg
  184. [ 0, 3500, 3250, 3000, 4500, 3500, 3550, 3500, 3500, 3760, 4010, 4510, 4010, 4260, 5500, 5750, 6000, 6000, 5750, 7000, 7025, 7050, 7150, 7500, 8500, -99, 1500, 3500, 8500, 9200, 4000, 0, 500, 500, 500, 1000, 3000, 3000, 5710, 7610, 9810, 12160, 12160, 5910, 3010, 3550 ], // Cape Clawed
  185. [ 0, 4000, 3750, 3500, 5000, 4000, 4050, 4000, 4000, 4260, 4510, 5010, 4510, 4760, 6000, 6250, 6500, 6500, 6250, 7500, 7525, 7550, 7650, 8000, 9000, -99, 2000, 4000, 9000, 9700, 4500, 500, 0, 1000, 1000, 1500, 3500, 3500, 6210, 8110, 10310, 12660, 12660, 6410, 3510, 4050 ], // Elub Shore
  186. [ 0, 4000, 3750, 3500, 5000, 4000, 4050, 4000, 4000, 4260, 4510, 5010, 4510, 4760, 6000, 6250, 6500, 6500, 6250, 7500, 7525, 7550, 7650, 8000, 9000, -99, 2000, 4000, 9000, 9700, 4500, 500, 1000, 0, 1000, 1500, 3500, 3500, 6210, 8110, 10310, 12660, 12660, 6410, 3510, 4050 ], // Nerg Plains
  187. [ 0, 4000, 3750, 3500, 5000, 4000, 4050, 4000, 4000, 4260, 4510, 5010, 4510, 4760, 6000, 6250, 6500, 6500, 6250, 7500, 7525, 7550, 7650, 8000, 9000, -99, 2000, 4000, 9000, 9700, 4500, 500, 1000, 1000, 0, 1500, 3500, 3500, 6210, 8110, 10310, 12660, 12660, 6410, 3510, 4050 ], // Derr Dunes
  188. [ 0, 4500, 4250, 4000, 5500, 4500, 4550, 4500, 4500, 4760, 5010, 5510, 5010, 5260, 6500, 6750, 7000, 7000, 6750, 8000, 8025, 8050, 8150, 8500, 9500, -99, 2500, 4500, 9500, 10200, 5000, 1000, 1500, 1500, 1500, 0, 2000, 2000, 6710, 8610, 10810, 13160, 13160, 6910, 4010, 4550 ], // Jungle of Dread
  189. [ 0, 6500, 6250, 6000, 6500, 6500, 6550, 6500, 6500, 6760, 7010, 7510, 7010, 7260, 8500, 8750, 9000, 9000, 8750, 10000, 10025, 10050, 10150, 10500, 11500, -99, 4500, 6500, 11500, 12200, 7000, 3000, 3500, 3500, 3500, 2000, 0, 4000, 8710, 10610, 12810, 15160, 15160, 8910, 6010, 6550 ], // Dracano
  190. [ 0, 6500, 6250, 6000, 6500, 6500, 6550, 6500, 6500, 6760, 7010, 7510, 7010, 7260, 8500, 8750, 9000, 9000, 8750, 10000, 10025, 10050, 10150, 10500, 11500, -99, 4500, 6500, 11500, 12200, 7000, 3000, 3500, 3500, 3500, 2000, 4000, 0, 8710, 10610, 12810, 15160, 15160, 8910, 6010, 6550 ], // Balack's Cove
  191. [ 0, 2210, 2460, 2710, 3210, 3210, 3260, 3210, 3210, 1950, 1700, 1200, 2200, 2450, 4210, 4460, 4710, 4710, 4460, 5710, 5735, 5760, 5860, 6210, 7210, -99, 4210, 6210, 11210, 11910, 6710, 5710, 6210, 6210, 6210, 6710, 8710, 8710, 0, 1900, 4100, 6450, 6450, 4600, 2720, 2260 ], // Fiery Warpath
  192. [ 0, 4110, 4360, 4610, 5110, 5110, 5160, 5110, 5110, 3850, 3600, 3100, 4100, 4350, 6110, 6360, 6610, 6610, 6360, 7610, 7635, 7660, 7760, 8110, 9110, -99, 6110, 8110, 13110, 13810, 8610, 7610, 8110, 8110, 8110, 8610, 10610, 10610, 1900, 0, 2200, 4550, 4550, 6500, 4620, 4160 ], // Muridae Market
  193. [ 0, 6310, 6560, 6810, 7310, 7310, 7360, 7310, 7310, 6050, 5800, 5300, 6300, 6550, 8310, 8560, 8810, 8810, 8560, 9810, 9835, 9860, 9960, 10310, 11310, -99, 8310, 10310, 15310, 16010, 10810, 9810, 10310, 10310, 10310, 10810, 12810, 12810, 4100, 2200, 0, 2350, 2350, 8700, 6720, 6360 ], // Living Garden
  194. [ 0, 8660, 8910, 9160, 9660, 9660, 9710, 9660, 9660, 8400, 8150, 7650, 8650, 8900, 10660, 10910, 11160, 11160, 10910, 12160, 12185, 12210, 12310, 12660, 13660, -99, 10660, 12660, 17660, 18360, 13160, 12160, 12660, 12660, 12660, 13160, 15160, 15160, 6450, 4550, 2350, 0, 2350, 11050, 9070, 8710 ], // Lost City
  195. [ 0, 8660, 8910, 9160, 9660, 9660, 9710, 9660, 9660, 8400, 8150, 7650, 8650, 8900, 10660, 10910, 11160, 11160, 10910, 12160, 12185, 12210, 12310, 12660, 13660, -99, 10660, 12660, 17660, 18360, 13160, 12160, 12660, 12660, 12660, 13160, 15160, 15160, 6450, 4550, 2350, 2350, 0, 11050, 9070, 8710 ], // Sand Dunes
  196. [ 0, 2410, 2660, 2910, 3410, 3410, 3460, 3410, 3410, 2650, 2900, 3400, 2900, 3150, 4410, -99, 4910, 4910, 4660, 5910, 5935, 5960, 6060, 6410, 7410, -99, 4410, 6410, 11410, 12110, 6910, 5910, 6410, 6410, 6410, 6910, 8910, 8910, 4600, 6500, 8700, 11050, 11050, 0, 2920, -99 ], // Gnawnia Rift
  197. [ 0, 510, 260, 10, 1510, -99, 550, 510, 510, 770, 1020, 1520, 1020, 1270, 2510, 2760, 3010, 3010, 2760, 4010, 4035, 4060, 4160, 4510, 5510, -99, 1510, 3510, 8510, 9210, 4010, 3010, 3510, 3510, 3510, 4010, 6010, 6010, 2720, 4620, 6720, 9070, 9070, 2920, 0, -99 ], // Special Event Location
  198. [ 0, 50, 300, 550, 1050, 1050, 1100, 1050, 1050, 310, 560, 1060, 560, 810, 2050, 2300, 2550, 2550, 2300, 3550, 3575, 3600, 3700, 4050, 5050, -99, 2050, 4050, 9050, 9750, 4550, 3550, 4050, 4050, 4050, 4550, 6550, 6550, 2260, 4160, 6360, 8710, 8710, -99, -99, 0 ] // Ronza
  199. // Mead TGnaw Windm Harbo Mount Shore KArms THall Gaunt Clear GTree Lagoo ClwCty GESttn Labor Spill Digby Mouse Bazaa Train Dojo MRoom Pinna Catac Grove AcRlm SSIII SGard ZTowr CLibr Icbrg CapeC ElubS NergP DerrD Dread Draco BCove Fiery MMark LGard LCity SDune GnRift Event Ronza
  200. ],
  201. distance: null,
  202. previous: null
  203. }
  204.  
  205. var PNAME = 0, PINGREDIENTS = 1;
  206. var PATTERNS = [
  207. [ 'Base - Dehydration Base', { 'dehydration_base_blueprints_craft_item':'1', 'salt_craft_item':'213', 'splintered_wood_craft_item':'4' } ],
  208. [ 'Base - Deep Freeze Base', { 'bead_of_slumber_craft_item':'1', 'deep_freeze_base_blueprints_crafting_item':'1', 'steam_nine_crafting_item':'1', 'cold_fusion_crafting_item':'6', 'platinum_bar_crafting_item':'6', 'frosty_metal_crafting_item':'18', 'wire_spool_crafting_item':'20', 'stale_super_brie_craft_item':'22', 'living_shard_crafting_item':'32' } ],
  209. [ 'Base - Gingerbread Base', { 'candies_craft_item':'5', 'gingerbread_base_blueprints_craft_item':'1', 'icing_sugar_craft_item':'1', 'plank_of_gingerbread_craft_item':'1' } ],
  210. [ 'Base - Hearthstone Base', { 'hearthstone_base_blueprints_crafting_item':'1', 'wire_spool_crafting_item':'14', 'heating_oil_crafting_item':'8', 'frosty_metal_crafting_item':'8', 'cold_fusion_crafting_item':'10' } ],
  211. [ 'Base - Magnet Base', { 'magnet_base_blueprints_crafting_item':'1', 'wire_spool_crafting_item':'5', 'heating_oil_crafting_item':'2', 'frosty_metal_crafting_item':'5', 'cold_fusion_crafting_item':'3' } ],
  212. [ 'Base - Molten Shrapnel Base', { 'dragon_ember':'1', 'platinum_bar_crafting_item':'12', 'scrap_metal_craft_item':'200' } ],
  213. [ 'Base - Remote Detonator Base', { 'remote_detonator_base_blueprints_crafting_item':'1', 'wire_spool_crafting_item':'8', 'heating_oil_crafting_item':'1', 'frosty_metal_crafting_item':'2', 'cold_fusion_crafting_item':'3' } ],
  214. [ 'Base - Rift Base', { 'rift_base_blueprints_crafting_item':'1', 'rift_crystal_crafting_item':'1', 'rift_mist_crafting_item':'1', 'rift_stars_crafting_item':'1' } ],
  215. [ 'Base - Soiled Base', { 'soiled_base_blueprints_crafting_item':'1', 'fresh_living_garden_soil_crafting_item':'3', 'dewthief_petal_crafting_item':'1', 'duskshade_petal_crafting_item':'1', 'graveblossom_petal_crafting_item':'1', 'lunaria_petal_crafting_item':'1' } ],
  216. [ 'Base - Spellbook Base', { 'spellbook_base_blueprints_crafting_item':'1', 'master_binding_crafting_item':'1', 'technic_page_crafting_item':'3', 'mystic_page_crafting_item':'3', 'platinum_bar_crafting_item':'6' } ],
  217. [ 'Base - Spiked Base', { 'spiked_base_blueprints_crafting_item':'1', 'wire_spool_crafting_item':'5', 'heating_oil_crafting_item':'10', 'frosty_metal_crafting_item':'5', 'splintered_wood_craft_item':'50', 'cold_fusion_crafting_item':'6' } ],
  218. [ 'Base - Tiki Base', { 'tiki_base_blueprints_crafting_item':'1', 'tribal_timber_crafting_item':'3' } ],
  219. [ 'Base - Tribal Base', { 'tribal_timber_crafting_item':'3' } ],
  220. [ 'Blueprints - Ancient Box Trap', { 'ancient_frayed_blueprint_piece_craft_item':'1', 'ancient_mangled_blueprint_piece_craft_item':'1', 'ancient_ripped_blueprint_piece_craft_item':'1', 'ancient_torn_blueprint_piece_craft_item':'1' } ],
  221. [ 'Blueprints - Clockwork Portal', { 'essence_f_crafting_item':'1', 'essence_i_crafting_item':'1' } ],
  222. [ 'Blueprints - Grand Arcanum', { 'essence_g_crafting_item':'1', 'essence_i_crafting_item':'1' } ],
  223. [ 'Blueprints - Phantasmic Oasis', { 'essence_e_crafting_item':'1', 'essence_f_crafting_item':'1', 'essence_i_crafting_item':'1' } ],
  224. [ 'Blueprints - Soiled Base', { 'essence_f_crafting_item':'1', 'essence_g_crafting_item':'1', 'essence_h_crafting_item':'1' } ],
  225. [ 'Charm - Antiskele Charm', { 'radioactive_sludge_craft_item':'1', 'simple_orb_crafting_item':'1', 'charmbit_crafting_item':'36' } ],
  226. [ 'Charm - Brain Charm', { 'brain_bit_crafting_item':'10', 'simple_orb_crafting_item':'1', 'charmbit_crafting_item':'40' } ],
  227. [ 'Charm - Double Sponge Charm', { 'essence_a_crafting_item':'2', 'flawless_orb_crafting_item':'1', 'blue_double_dewdrop_powder_crafting_item':'1' } ],
  228. [ 'Charm - Dragonbane Charm', { 'frozen_scroll_craft_item':'1', 'perfect_orb':'1', 'charmbit_crafting_item':'120' } ],
  229. [ 'Charm - Empowered Anchor Charm', { 'scrap_metal_craft_item':'1', 'flawless_orb_crafting_item':'1', 'charmbit_crafting_item':'40' } ],
  230. [ 'Charm - Growth Chram', { 'perfect_orb':'1', 'charmbit_crafting_item':'1000', 'essence_d_crafting_item':'1' } ],
  231. [ 'Charm - Prospector\'s Charm', { 'meteorite_piece_craft_item':'1', 'simple_orb_crafting_item':'1', 'charmbit_crafting_item':'16' } ],
  232. [ 'Charm - Red Double Sponge Charm', { 'essence_b_crafting_item':'2', 'perfect_orb':'1', 'red_double_dewdrop_powder_crafting_item':'1' } ],
  233. [ 'Charm - Rotten Charm', { 'stale_cheese_craft_item':'1', 'flawed_orb_crafting_item':'1', 'charmbit_crafting_item':'12' } ],
  234. [ 'Charm - Scientist\'s Charm', { 'living_shard_crafting_item':'1', 'flawless_orb_crafting_item':'1', 'charmbit_crafting_item':'4' } ],
  235. [ 'Charm - Shattering Charm', { 'aromatic_oil_crafting_item':'1', 'epic_orb_crafting_item':'1', 'essence_i_crafting_item':'1', 'charmbit_crafting_item':'1000' } ],
  236. [ 'Charm - Soap Charm', { 'soapy_suds_crafting_item':'2', 'flawed_orb_crafting_item':'1', 'charmbit_crafting_item':'10' } ],
  237. [ 'Charm - Super Rotten Charm', { 'stale_super_brie_craft_item':'1', 'flawed_orb_crafting_item':'1', 'charmbit_crafting_item':'12' } ],
  238. [ 'Charm - Super Salt Charm', { 'essence_b_crafting_item':'2', 'perfect_orb':'1', 'extra_coarse_salt_crafting_item':'1' } ],
  239. [ 'Charm - Super Warpath Cavalry Charm', { 'desert_horseshoe_crafting_item':'1', 'magic_essence_craft_item':'1', 'simple_orb_crafting_item':'1', 'charmbit_crafting_item':'2' } ],
  240. [ 'Charm - Super Warpath Mage Charm', { 'heatproof_mage_cloth_crafting_item':'1', 'magic_essence_craft_item':'1', 'simple_orb_crafting_item':'1', 'charmbit_crafting_item':'2' } ],
  241. [ 'Charm - Ultimate Charm', { 'epic_orb_crafting_item':'1', 'rift_crystal_crafting_item':'1', 'rift_mist_crafting_item':'1', 'rift_stars_crafting_item':'1', 'charmbit_crafting_item':'2500' } ],
  242. [ 'Charm - Ultimate Luck Charm', { 'perfect_orb':'1', 'charmbit_crafting_item':'1000', 'essence_f_crafting_item':'1' } ],
  243. [ 'Charm - Ultimate Power Charm', { 'perfect_orb':'1', 'charmbit_crafting_item':'1000', 'essence_e_crafting_item':'1' } ],
  244. [ 'Charm - Warpath Cavalry Charm', { 'desert_horseshoe_crafting_item':'1', 'ionized_salt_craft_item':'1', 'simple_orb_crafting_item':'1', 'charmbit_crafting_item':'2' } ],
  245. [ 'Charm - Warpath Mage Charm', { 'heatproof_mage_cloth_crafting_item':'1', 'ionized_salt_craft_item':'1', 'simple_orb_crafting_item':'1', 'charmbit_crafting_item':'2' } ],
  246. [ 'Charm - Wild Growth Charm', { 'epic_orb_crafting_item':'1', 'charmbit_crafting_item':'1000', 'essence_e_crafting_item':'1', 'fresh_living_garden_soil_crafting_item':'1' } ],
  247. [ 'Charm - Yellow Double Sponge Charm', { 'essence_b_crafting_item':'2', 'perfect_orb':'1', 'yellow_double_dewdrop_powder_crafting_item':'1' } ],
  248. [ 'Cheese - Ancient (3)', { 'ionized_salt_craft_item':'6', 'stale_cheese_craft_item':'3' } ],
  249. [ 'Cheese - Ancient using SB+ (6)', { 'ionized_salt_craft_item':'6', 'magic_essence_craft_item':'3', 'stale_cheese_craft_item':'3' } ],
  250. [ 'Cheese - Checkmate (3)', { 'mystic_curd_crafting_item':'1', 'tech_cheese_mould_crafting_item':'1', 'ionized_salt_craft_item':'12' } ],
  251. [ 'Cheese - Checkmate using SB+ (9)', { 'mystic_curd_crafting_item':'1', 'tech_cheese_mould_crafting_item':'1', 'ionized_salt_craft_item':'12', 'magic_essence_craft_item':'6' } ],
  252. [ 'Cheese - Combat (3)', { 'curds_and_whey_craft_item':'5', 'paintbrand_paint_craft_item':'1', 'splintered_wood_craft_item':'1', 'token_of_the_cheese_fang_craft_item':'3' } ],
  253. [ 'Cheese - Creamy Havarti (6)', { 'coconut_milk_craft_item':'10', 'creamy_orange_pepper_craft_item':'6', 'curds_and_whey_craft_item':'18', 'salt_craft_item':'6' } ],
  254. [ 'Cheese - Crunchy Havarti (6)', { 'coconut_milk_craft_item':'4', 'crunchy_green_pepper_craft_item':'6', 'curds_and_whey_craft_item':'18', 'salt_craft_item':'6' } ],
  255. [ 'Cheese - Crunchy (15)', { 'coconut_milk_craft_item':'20', 'curds_and_whey_craft_item':'10', 'delicious_stone_craft_item':'30', 'salt_craft_item':'30' } ],
  256. [ 'Cheese - Crunchy using SB+ (20)', { 'coconut_milk_craft_item':'20', 'curds_and_whey_craft_item':'10', 'delicious_stone_craft_item':'30', 'salt_craft_item':'30', 'magic_essence_craft_item':'5' } ],
  257. [ 'Cheese - Gumbo (15)', { 'coconut_milk_craft_item':'15', 'curds_and_whey_craft_item':'90', 'salt_craft_item':'1', 'savoury_vegetables_craft_item':'30' } ],
  258. [ 'Cheese - Gumbo using SB+ (20)', { 'coconut_milk_craft_item':'15', 'curds_and_whey_craft_item':'90', 'salt_craft_item':'1', 'savoury_vegetables_craft_item':'30', 'magic_essence_craft_item':'5' } ],
  259. [ 'Cheese - Glutter (3)', { 'cheesy_fluffs_craft_item':'1', 'curds_and_whey_craft_item':'7', 'invisiglu_craft_item':'1', 'token_of_the_cheese_belt_craft_item':'3' } ],
  260. [ 'Cheese - Inferno Havarti (6)', { 'coconut_milk_craft_item':'16', 'curds_and_whey_craft_item':'18', 'fire_salt_craft_item':'6', 'inferno_pepper_craft_item':'6' } ],
  261. [ 'Cheese - Limelight (3)', { 'curds_and_whey_craft_item':'30', 'living_shard_crafting_item':'3', 'radioactive_sludge_craft_item':'3' } ],
  262. [ 'Cheese - Magical Havarti (6)', { 'coconut_milk_craft_item':'2', 'curds_and_whey_craft_item':'18', 'magical_blue_pepper_craft_item':'6', 'salt_craft_item':'6' } ],
  263. [ 'Cheese - Magical Rift Cheese (1)', { 'magic_essence_craft_item':'1', 'essence_a_crafting_item':'1', 'rift_cheese_curd_crafting_item':'1' } ],
  264. [ 'Cheese - Maki (3)', { 'curds_and_whey_craft_item':'3', 'magic_essence_craft_item':'3', 'nori_craft_item':'1' } ],
  265. [ 'Cheese - Moon (1)', { 'curds_and_whey_craft_item':'3', 'magic_essence_craft_item':'2', 'meteorite_piece_craft_item':'1' } ],
  266. [ 'Cheese - Mountain Cheese (5)', { 'mountain_cheese_ore_crafting_item':'10', 'curds_and_whey_craft_item':'5', 'salt_craft_item':'10' } ],
  267. [ 'Cheese - Onyx Gorgonzola (3)', { 'curds_and_whey_craft_item':'60', 'ionized_salt_craft_item':'6', 'onyx_stone_craft_item':'1' } ],
  268. [ 'Cheese - Pungent Havarti (6)', { 'coconut_milk_craft_item':'8', 'curds_and_whey_craft_item':'18', 'pungent_purple_pepper_craft_item':'6', 'salt_craft_item':'6' } ],
  269. [ 'Cheese - Rancid RB Cheese (1)', { 'radioactive_curd_crafting_item':'2', 'radioactive_sludge_craft_item':'1', 'ionized_salt_craft_item':'1' } ],
  270. [ 'Cheese - Resonator Cheese (3)', { 'magic_seed_crafting_item':'3', 'riftgrass_crafting_item':'3', 'rift_dust_crafting_item':'3', 'rift_cheese_curd_crafting_item':'1', 'ionized_salt_craft_item':'1' } ],
  271. [ 'Cheese - Res. Cheese using SB+ (4)', { 'magic_seed_crafting_item':'3', 'riftgrass_crafting_item':'3', 'rift_dust_crafting_item':'3', 'rift_cheese_curd_crafting_item':'1', 'ionized_salt_craft_item':'1', 'magic_essence_craft_item':'1' } ],
  272. [ 'Cheese - Rumble with Seal (3)', { 'curds_and_whey_craft_item':'20', 'ionized_salt_craft_item':'1', 'masters_seal_craft_item':'1' } ],
  273. [ 'Cheese - Rumble with Shards (3)', { 'curds_and_whey_craft_item':'20', 'ionized_salt_craft_item':'1', 'master_belt_shard_craft_item':'1', 'master_claw_shard_craft_item':'1', 'master_fang_shard_craft_item':'1' } ],
  274. [ 'Cheese - Runic (1)', { 'ionized_salt_craft_item':'3', 'rune_craft_item':'1', 'stale_cheese_craft_item':'1' } ],
  275. [ 'Cheese - Runic using SB+ (2)', { 'ionized_salt_craft_item':'3', 'rune_craft_item':'1', 'stale_cheese_craft_item':'1', 'magic_essence_craft_item':'1' } ],
  276. [ 'Cheese - Shell (15)', { 'coconut_milk_craft_item':'10', 'curds_and_whey_craft_item':'60', 'salt_craft_item':'40', 'seashell_craft_item':'30' } ],
  277. [ 'Cheese - Shell using SB+ (20)', { 'coconut_milk_craft_item':'10', 'curds_and_whey_craft_item':'60', 'salt_craft_item':'40', 'seashell_craft_item':'30', 'magic_essence_craft_item':'5' } ],
  278. [ 'Cheese - Spicy Havarti (6)', { 'coconut_milk_craft_item':'12', 'curds_and_whey_craft_item':'18', 'salt_craft_item':'6', 'spicy_red_pepper_craft_item':'6' } ],
  279. [ 'Cheese - SUPER|brie+ (1)', { 'curds_and_whey_craft_item':'1', 'magic_essence_craft_item':'1', 'salt_craft_item':'1' } ],
  280. [ 'Cheese - Susheese (3)', { 'burroughs_salmon_craft_item':'1', 'curds_and_whey_craft_item':'3', 'nori_craft_item':'1', 'token_of_the_cheese_claw_craft_item':'3' } ],
  281. [ 'Cheese - Sweet Havarti (6)', { 'coconut_milk_craft_item':'6', 'curds_and_whey_craft_item':'18', 'salt_craft_item':'6', 'sweet_yellow_pepper_craft_item':'6' } ],
  282. [ 'Cheese - Vanilla Stilton (15)', { 'coconut_milk_craft_item':'15', 'curds_and_whey_craft_item':'15', 'salt_craft_item':'15', 'vanilla_bean_crafting_item':'15' } ],
  283. [ 'Cheese - V. Stilton using SB+ (15)', { 'coconut_milk_craft_item':'15', 'curds_and_whey_craft_item':'15', 'salt_craft_item':'15', 'vanilla_bean_crafting_item':'5', 'magic_essence_craft_item':'15' } ],
  284. [ 'Cheese - Vengeful Vanilla Stilton (1)', { 'bottled_up_rage_crafting_item':'1', 'coconut_milk_craft_item':'1', 'curds_and_whey_craft_item':'1', 'ionized_salt_craft_item':'1', 'pinch_of_annoyance_crafting_item':'1', 'raisins_of_wrath':'1', 'vanilla_bean_crafting_item':'1' } ],
  285. [ 'Cheese - Venge V. Stilton using SB+ (3)', { 'bottled_up_rage_crafting_item':'1', 'coconut_milk_craft_item':'1', 'curds_and_whey_craft_item':'1', 'ionized_salt_craft_item':'1', 'magic_essence_craft_item':'3', 'pinch_of_annoyance_crafting_item':'1', 'raisins_of_wrath':'1', 'vanilla_bean_crafting_item':'1' } ],
  286. [ 'Cheese - White Cheddar (1)', { 'curds_and_whey_craft_item':'1', 'salt_craft_item':'1' } ],
  287. [ 'Essence - Ber', { 'essence_a_crafting_item':'3', 'essence_prism_crafting_item':'1' } ],
  288. [ 'Essence - Cynd', { 'essence_b_crafting_item':'3', 'essence_prism_crafting_item':'1' } ],
  289. [ 'Essence - Dol', { 'essence_c_crafting_item':'3', 'essence_prism_crafting_item':'1' } ],
  290. [ 'Essence - Est', { 'essence_d_crafting_item':'3', 'essence_prism_crafting_item':'1' } ],
  291. [ 'Essence - Fel', { 'essence_e_crafting_item':'3', 'essence_prism_crafting_item':'1' } ],
  292. [ 'Essence - Gur', { 'essence_f_crafting_item':'3', 'essence_prism_crafting_item':'1' } ],
  293. [ 'Essence - Hix', { 'essence_g_crafting_item':'3', 'essence_prism_crafting_item':'1' } ],
  294. [ 'Essence - Icuri', { 'essence_h_crafting_item':'3', 'essence_prism_crafting_item':'1' } ],
  295. [ 'Map - Balack\'s Lantern', { 'dragon_ember':'3', 'old_lantern':'1' } ],
  296. [ 'Map - Ocean Navigation Kit', { 'compass_craft_item':'1', 'sextant_craft_item':'1', 'telescope_craft_item':'1' } ],
  297. [ 'Map - S.S. Huntington III', { 'bolt_of_cloth_craft_item':'70', 'kings_reserve_bubbleh_craft_item':'1', 'rope_craft_item':'100', 'scrap_metal_craft_item':'18', 'ship_blueprints_craft_item':'1', 'splintered_wood_craft_item':'900' } ],
  298. [ 'Map - S.S. Huntington III', { 'kings_reserve_bubbleh_craft_item':'1', 'unchristened_ship_craft_item':'1' } ],
  299. [ 'Master\'s Seal', { 'master_belt_shard_craft_item':'1', 'master_claw_shard_craft_item':'1', 'master_fang_shard_craft_item':'1' } ],
  300. [ 'Plant - Creamy Orange Pepper', { 'plant_pot_craft_item':'1', 'red_pepper_seed_craft_item':'1', 'yellow_pepper_seed_craft_item':'1' } ],
  301. [ 'Plant - Crunchy Green Pepper', { 'plant_pot_craft_item':'1', 'blue_pepper_seed_craft_item':'1', 'yellow_pepper_seed_craft_item':'1' } ],
  302. [ 'Plant - Inferno Pepper', { 'plant_pot_craft_item':'1', 'blue_pepper_seed_craft_item':'1', 'red_pepper_seed_craft_item':'1', 'yellow_pepper_seed_craft_item':'1' } ],
  303. [ 'Plant - Magical Blue Pepper', { 'plant_pot_craft_item':'1', 'blue_pepper_seed_craft_item':'2' } ],
  304. [ 'Plant - Pungent Purple Pepper', { 'plant_pot_craft_item':'1', 'blue_pepper_seed_craft_item':'1', 'red_pepper_seed_craft_item':'1' } ],
  305. [ 'Plant - Spicy Red Pepper', { 'plant_pot_craft_item':'1', 'red_pepper_seed_craft_item':'2' } ],
  306. [ 'Plant - Sweet Yellow Pepper', { 'plant_pot_craft_item':'1', 'yellow_pepper_seed_craft_item':'2' } ],
  307. [ 'Theme - Halloween', { 'halloween_theme_scrap_1_crafting_item':'1', 'halloween_theme_scrap_2_crafting_item':'1', 'halloween_theme_scrap_3_crafting_item':'1' } ],
  308. [ 'Theme - Living Garden', { 'living_garden_theme_scrap_1_crafting_item':'1', 'living_garden_theme_scrap_2_crafting_item':'1', 'living_garden_theme_scrap_3_crafting_item':'1' } ],
  309. [ 'Theme - Halloween Undead', { 'halloween_undead_theme_scrap_1_crafting_item':'1', 'halloween_undead_theme_scrap_2_crafting_item':'1', 'halloween_undead_theme_scrap_3_crafting_item':'1' } ],
  310. [ 'Trap - A.C.R.o.N.Y.M.', { 'magic_essence_craft_item':'3', 'mysterious_blueprints_craft_item':'1', 'obelisk_parts_craft_item':'1', 'onyx_stone_craft_item':'1', 'scrap_metal_craft_item':'12' } ],
  311. [ 'Trap - A.C.R.o.N.Y.M. (repair)', { 'acronym_parts_crafting_item':'1' } ],
  312. [ 'Trap - Ambush', { 'ambush_trap_blueprints_craft_item':'1', 'droid_parts_craft_item':'8', 'masters_seal_craft_item':'1', 'rice_paper_craft_item':'3', 'splintered_wood_craft_item':'5' } ],
  313. [ 'Trap - Ambush (repair)', { 'ambush_trap_parts_crafting_item':'1' } ],
  314. [ 'Trap - Ancient Box', { 'ancient_box_trap_blueprints_craft_item':'1', 'ancient_relic_staff_craft_item':'1', 'encrusted_metal_of_time_craft_item':'1', 'engraved_solid_stone_slab_craft_item':'1', 'ethereal_rope_craft_item':'1', 'hinge_of_eternity_craft_item':'1', 'timeless_mystic_gem_craft_item':'1' } ],
  315. [ 'Trap - Ancient Spear Gun', { 'ancient_spear_craft_item':'1', 'ancient_spear_launcher_blueprints_craft_item':'1', 'launcher_parts_craft_item':'1' } ],
  316. [ 'Trap - Blackstone Pass', { 'blackstone_pass_blueprints_crafting_item':'1', 'coal_craft_item':'4', 'mystic_crystal_crafting_item':'1' } ],
  317. [ 'Trap - Cackle Lantern (LE)', { 'digby_drillbot_parts_craft_item':'1', 'dragon_ember':'1', 'obelisk_parts_craft_item':'1', 'smashed_pumpkin_crafting_item':'1', 'venus_mouse_trap_husk_craft_item':'1', 'platinum_bar_crafting_item':'24' } ],
  318. [ 'Trap - Clockapult of Time (repair)', { 'clock_parts_crafting_item':'1' } ],
  319. [ 'Trap - Clockwork Portal', { 'clockwork_portal_blueprints_crafting_item':'1', 'clock_parts_crafting_item':'1', 'umbral_capacitor_crafting_item':'8' } ],
  320. [ 'Trap - Chrome MonstroBot', { 'chrome_monstrobot_upgrade_crafting_item':'1', 'sandstorm_monstrobot_parts_crafting_item':'1' } ],
  321. [ 'Trap - Chrome Nannybot (LE)', { 'chrome_nanite_coating_crafting_item':'1', 'nanny_glasses_crafting_item':'1', 'nannybot_parts_crafting_item':'1', 'timeout_upgrade_crafting_item':'1' } ],
  322. [ 'Trap - Digby Drillbot (repair)', { 'digby_drillbot_parts_craft_item':'1' } ],
  323. [ 'Trap - Double Diamond Adventure (LE)', { 'climbing_pitons_crafting_item':'1', 'mine_crafting_item':'1', 'lava_bucket_crafting_item':'1', 'missile_cone_crafting_item':'1', 'ski_sign_crafting_item':'1', 'toboggan_ride_parts_crafting_item':'1', 'platinum_bar_crafting_item':'18' } ],
  324. [ 'Trap - Enraged RhinoBot', { 'rhinobot_parts_crafting_item':'1', 'rhino_horn_craft_item':'3', 'stale_super_brie_craft_item':'48', 'platinum_bar_crafting_item':'6' } ],
  325. [ 'Trap - Fluffy DeathBot', { 'fluffy_deathbot_skin_crafting_item':'1', 'deathbot_parts_craft_item':'1' } ],
  326. [ 'Trap - Gingerbread House Surprise', { 'candies_craft_item':'10', 'gingerbread_house_plans_craft_item':'1', 'icing_sugar_craft_item':'5', 'plank_of_gingerbread_craft_item':'7' } ],
  327. [ 'Trap - Glacier Gatler (LE)', { 'ice_blaster_parts_crafting_item':'1', 'oasis_bead_crafting_item':'1', 'frosty_metal_crafting_item':'7', 'living_shard_crafting_item':'600' } ],
  328. [ 'Trap - Grand Arcanum', { 'grand_arcanum_blueprints_crafting_item':'1', 'acronym_parts_crafting_item':'1', 'arcane_crystal_crafting_item':'1', 'platinum_bar_crafting_item':'40' } ],
  329. [ 'Trap - Grungy DeathBot', { 'grungy_deathbot_skin_crafting_item':'1', 'deathbot_parts_craft_item':'1' } ],
  330. [ 'Trap - Harpoon Gun (repair)', { 'launcher_parts_craft_item':'1' } ],
  331. [ 'Trap - Heat Bath', { 'launcher_parts_craft_item':'2', 'heat_bath_blueprints_crafting_item':'1', 'scrap_metal_craft_item':'6', 'coal_craft_item':'36' } ],
  332. [ 'Trap - High Tension Spring (repair)', { 'high_tension_spring_parts_craft_item':'1' } ],
  333. [ 'Trap - HitGrab Rainbow Rockin\' Horsey (LE)', { 'rainbow_mohawk_wig_of_awesomeness_craft_item':'1', 'hobby_horse_parts_craft_item':'1', 'invisiglu_craft_item':'1' } ],
  334. [ 'Trap - Horrific Venus Mouse Trap', { 'radioactive_sludge_craft_item':'20', 'thorned_venus_mouse_trap_husk_craft_item':'1' } ],
  335. [ 'Trap - Ice Blaster (LE)', { 'ice_blaster_parts_crafting_item':'1' } ],
  336. [ 'Trap - Ice Maiden', { 'frozen_scroll_craft_item':'1', 'high_tension_spring_parts_craft_item':'1', 'rune_craft_item':'60' } ],
  337. [ 'Trap - Mouse DeathBot', { 'deathbot_parts_craft_item':'1' } ],
  338. [ 'Trap - Mutated Venus Mouse Trap', { 'radioactive_sludge_craft_item':'20', 'venus_mouse_trap_husk_craft_item':'1' } ],
  339. [ 'Trap - Net Cannon Trap', { 'launcher_parts_craft_item':'1', 'rope_craft_item':'1' } ],
  340. [ 'Trap - Ninja Ambush', { 'ambush_trap_parts_crafting_item':'1', 'ninja_ambush_skin_crafting_item':'1' } ],
  341. [ 'Trap - Oasis Water Node Trap', { 'oasis_water_node_blueprint_crafting_item':'1', 'oasis_bead_crafting_item':'1', 'living_shard_crafting_item':'1000', 'coconut_milk_craft_item':'1', 'flameshard_crafting_item':'150' } ],
  342. [ 'Trap - Oasis Water Node Trap (repair)', { 'oasis_water_node_parts_crafting_item':'1' } ],
  343. [ 'Trap - Obelisk of Incineration', { 'coal_craft_item':'1', 'obelisk_of_incineration_blueprints_craft_item':'1', 'obelisk_parts_craft_item':'1', 'scrap_metal_craft_item':'2', 'splintered_wood_craft_item':'3' } ],
  344. [ 'Trap - Obelisk of Slumber', { 'obelisk_parts_craft_item':'1', 'bead_of_slumber_craft_item':'1' } ],
  345. [ 'Trap - Onyx Mallet', { 'onyx_mallet_blueprints_crafting_item':'1', 'onyx_stone_craft_item':'12', 'platinum_bar_crafting_item':'10' } ],
  346. [ 'Trap - Obvious Ambush', { 'obvious_ambush_blueprints_crafting_item':'1', 'droid_jetpack_crafting_item':'1', 'droid_parts_craft_item':'1' } ],
  347. [ 'Trap - PartyBot (LE)', { 'deathbot_parts_craft_item':'1', 'party_hat_craft_item':'1' } ],
  348. [ 'Trap - Phantasmic Oasis', { 'phantasmic_oasis_blueprints_crafting_item':'1', 'oasis_water_node_parts_crafting_item':'1', 'phantasmic_essence_crafting_item':'3' } ],
  349. [ 'Trap - Pumpkin Pummeler (LE)', { 'evil_pumpkin_seed_crafting_item':'1', 'pumpkin_pummeler_blueprints_crafting_item':'1' } ],
  350. [ 'Trap - Reaper\'s Perch', { 'droid_parts_craft_item':'1', 'repear_perch_blueprint_crafting_item':'1', 'monolithic_slab_crafting_item':'6', 'onyx_stone_craft_item':'6', 'rune_craft_item':'6' } ],
  351. [ 'Trap - RhinoBot', { 'digby_drillbot_parts_craft_item':'1', 'rhino_horn_craft_item':'1', 'rhinobot_blueprints_craft_item':'1', 'stale_super_brie_craft_item':'24' } ],
  352. [ 'Trap - RhinoBot (repair)', { 'rhinobot_parts_crafting_item':'1' } ],
  353. [ 'Trap - Sandstorm MonstroBot', { 'sandstormbot_weapon_blueprint_crafting_item':'1', 'flameshard_crafting_item':'400', 'sandblasted_metal_crafting_item':'2', 'rhinobot_parts_crafting_item':'1', 'digby_drillbot_parts_craft_item':'1', 'deathbot_parts_craft_item':'1' } ],
  354. [ 'Trap - Sandstorm MonstroBot (repair)', { 'sandstorm_monstrobot_parts_crafting_item':'1' } ],
  355. [ 'Trap - Soul Catcher (LE) (repair)', { 'soul_catcher_parts_crafting_item':'1' } ],
  356. [ 'Trap - Soul Harvester (LE)', { 'soul_catcher_parts_crafting_item':'1', 'onyx_stone_craft_item':'2', 'monolithic_slab_crafting_item':'2', 'platinum_bar_crafting_item':'12', 'living_shard_crafting_item':'12' } ],
  357. [ 'Trap - Sphynx Wrath', { 'sphynx_weapon_blueprint_crafting_item':'1', 'sphynx_crystal_crafting_item':'1', 'gold_leaf_crafting_item':'28', 'flameshard_crafting_item':'200' } ],
  358. [ 'Trap - Steam Laser Mk. I (repair)', { 'steam_laser_mk_i_parts_crafting_item':'1' } ],
  359. [ 'Trap - Steam Laser Mk. II', { 'steam_laser_mk_i_parts_crafting_item':'1', 'well_sealed_canister_crafting_item':'1', 'wire_spool_crafting_item':'15', 'heating_oil_crafting_item':'15', 'frosty_metal_crafting_item':'15', 'cold_fusion_crafting_item':'4' } ],
  360. [ 'Trap - Steam Laser Mk. II (repair)', { 'steam_laser_mk_ii_parts_crafting_item':'1' } ],
  361. [ 'Trap - Steam Laser Mk. III', { 'steam_laser_mk_ii_parts_crafting_item':'1', 'steam_nine_crafting_item':'1' } ],
  362. [ 'Trap - Thorned Venus Mouse Trap', { 'thorned_mouse_trap_plans_craft_item':'1', 'thorned_vine_craft_item':'1', 'venus_mouse_trap_husk_craft_item':'1' } ],
  363. [ 'Trap - Venus Mouse Trap (repair)', { 'venus_mouse_trap_husk_craft_item':'1' } ],
  364. [ 'Trap - Zugzwang\'s First Move', { 'magical_feather_crafting_item':'1', 'zugzwangs_first_move_crafting_item':'1', 'chess_pieces_crafting_item':'1' } ],
  365. [ 'Trap - Zugzwang\'s Last Move (repair)', { 'chess_pieces_crafting_item':'1' } ],
  366. [ 'Trap - Zurreal\'s Folly', { 'zzl_marchingflameresearch_crafting_item':'1', 'zzl_ripper_nail':'3', 'zzl_ectoplasm':'3', 'zzl_gnawniaresearch_crafting_item':'1', 'zzl_fine_wood_crafting_item':'6', 'zzl_stonework_runes':'3', 'zzl_mesh_netting':'1', 'zzl_lich_jewel':'1', 'zzl_draconic_book':'1' } ],
  367. [ 'Unchirstened Ship', { 'bolt_of_cloth_craft_item':'70', 'rope_craft_item':'100', 'scrap_metal_craft_item':'18', 'ship_blueprints_craft_item':'1', 'splintered_wood_craft_item':'900' } ],
  368. [ 'Unstable Curd', { 'curds_and_whey_craft_item':'1', 'ionized_salt_craft_item':'1', 'onyx_stone_craft_item':'1' } ],
  369. [ 'Unstable Gourd', { 'essence_e_crafting_item':'1', 'plant_pot_craft_item':'1' } ],
  370. [ 'Zugzwang\'s Tower Key', { 'summer_key_shard_crafting_item':'1', 'fall_key_shard_crafting_item':'1', 'winter_key_shard_crafting_item':'1', 'spring_key_shard_crafting_item':'1' } ]
  371. ];
  372.  
  373. var INVID = 0, INVTYPE = 1, INVNAME = 2, INVDETAIL = 3, INVQTY = 4, INVEXTRA = 5;
  374. var INVENTORY = Array();
  375. var INV_TYPE_BAIT = 0, INV_TYPE_BASE = 1, INV_TYPE_BREAK = 2, INV_TYPE_CONVERT = 3, INV_TYPE_MAPS = 4, INV_TYPE_NOVELTY = 5, INV_TYPE_PLANKRUN = 6, INV_TYPE_POTION = 7, INV_TYPE_WEAPON = 8, INV_TYPE_NONE = 9;
  376. var INVENTORY_TYPES_TEXT = [ 'bait', 'base', 'breakable', 'covertible', 'map_piece', 'collectible', 'torn_page', 'potion', 'weapon', 'none' ];
  377.  
  378. var CRAFTID = 0, CRAFTNAME = 1, CRAFTDETAIL = 2, CRAFTQTY = 3;
  379. var CRAFTING = Array();
  380.  
  381. var LOCATION_TIMERS = [
  382. [ 'Seasonal Garden', { first: 1283616000, length: 288000, breakdown: [ 1, 1, 1, 1 ], name: [ 'Summer', 'Autumn', 'Winter', 'Spring' ], color: [ 'Red', 'Orange', 'Blue', 'Green' ], effective: [ 'tactical', 'shadow', 'hydro', 'physical' ] } ],
  383. [ 'Balack\'s Cove', { first: 1294680060, length: 1200, breakdown: [ 48, 3, 2, 3 ], name: [ 'Low', 'Medium (in)', 'High', 'Medium (out)' ], color: [ 'Green', 'Orange', 'Red', 'Orange' ] } ],
  384. [ 'Forbidden Grove', { first: 1285704000, length: 14400, breakdown: [ 4, 1 ], name: [ 'Open', 'Closed' ], color: [ 'Green', 'Red' ] } ],
  385. [ 'Relic Hunter', { url: 'http://horntracker.com/backend/relichunter.php?functionCall=relichunt' } ],
  386. [ 'Toxic Spill', { url: 'http://horntracker.com/backend/new/toxic.php?functionCall=spill' } ]
  387. ];
  388.  
  389. function DSXC_setValue(name, value)
  390. {
  391. localStorage.setItem('MHH ' + name, '' + value);
  392. }
  393.  
  394. function DSXC_getValue(name, value, full)
  395. {
  396. var DSXC_getValueReturn = value;
  397. if (typeof(full) != 'boolean') full = false;
  398. var getvalue = localStorage.getItem('MHH ' + name);
  399. if (getvalue)
  400. {
  401. if (getvalue == 'true')
  402. getvalue = true;
  403. else if (getvalue == 'false')
  404. getvalue = false;
  405. DSXC_getValueReturn = getvalue;
  406. }
  407. return DSXC_getValueReturn;
  408. }
  409.  
  410. function ValueDetail(type, value)
  411. {
  412. var ValueDetailReturn = '';
  413. switch (type)
  414. {
  415. case 'string':
  416. {
  417. ValueDetailReturn = value;
  418. } break;
  419. case 'boolean':
  420. {
  421. switch (value)
  422. {
  423. case 'true':
  424. {
  425. ValueDetailReturn = true;
  426. } break;
  427. case 'false':
  428. {
  429. ValueDetailReturn = false;
  430. } break;
  431. }
  432. } break;
  433. case 'number':
  434. {
  435. ValueDetailReturn = Number(value);
  436. }
  437. }
  438. return ValueDetailReturn;
  439. }
  440.  
  441. function DSXC_log(text)
  442. {
  443. GM_log(text);
  444. }
  445.  
  446. function GetFullDomain(text)
  447. {
  448. var FullDomainReturn = '';
  449. var StartPos = text.indexOf('//');
  450. if (StartPos != -1)
  451. {
  452. var EndPos = text.indexOf('/', StartPos + 2);
  453. if (EndPos == -1) EndPos = text.length;
  454. FullDomainReturn = text.substring(StartPos + 2, EndPos);
  455. if (FullDomainReturn.substring((FullDomainReturn.length - 1)) == '/')
  456. {
  457. FullDomainReturn = FullDomainReturn.substring(0, (FullDomainReturn.length - 1));
  458. }
  459. }
  460. return FullDomainReturn;
  461. }
  462.  
  463. function DSXC_xmlHttpRequest(options)
  464. {
  465. var request = new XMLHttpRequest()
  466. if (request != null)
  467. {
  468. request.onload = function() {
  469. var response = {
  470. responseText: request.responseText,
  471. readyState: request.readyState,
  472. responseHeaders: (request.readyState == 4 ? request.getAllResponseHeaders() : ''),
  473. status: request.readyState == 4 ? request.status : 0,
  474. statusText: request.readyState == 4 ? request.statusText : ''
  475. };
  476. options.onload(response);
  477. }
  478. request.open(options.method, options.url, true);
  479. if (options.headers)
  480. {
  481. if (!options.headers["X-Requested-With"])
  482. {
  483. options.headers["X-Requested-With"] = "XMLHttpRequest";
  484. }
  485. }
  486. // set the headers
  487. for (var header in options.headers) {
  488. request.setRequestHeader(header, options.headers[header]);
  489. }
  490. // send the data
  491. request.send(options.data);
  492. }
  493. return request;
  494. }
  495.  
  496. serialize = function(obj)
  497. {
  498. var str = [];
  499. for (var item in obj)
  500. {
  501. if (typeof obj[item] === "object")
  502. {
  503. for (var subitem in obj[item])
  504. {
  505. if (typeof obj[item][subitem] !== "function")
  506. str.push(encodeURIComponent(item) + "[" + encodeURIComponent(subitem) + "]=" + encodeURIComponent(obj[item][subitem]));
  507. }
  508. }
  509. else if (typeof obj[item] !== "function")
  510. {
  511. str.push(encodeURIComponent(item) + "=" + encodeURIComponent(obj[item]));
  512. }
  513. }
  514. return str.join("&");
  515. }
  516.  
  517. function ReadSettings()
  518. {
  519. SETTINGS.horn = DSXC_getValue('SETTINGS.horn', STATE_OFF);
  520. SETTINGS.king = DSXC_getValue('SETTINGS.king', STATE_OFF);
  521. SETTINGS.cheese = DSXC_getValue('SETTINGS.cheese', STATE_OFF);
  522. SETTINGS.washed = DSXC_getValue('SETTINGS.washed', STATE_OFF);
  523. SETTINGS.season = DSXC_getValue('SETTINGS.season', STATE_OFF);
  524. SETTINGS.tourney = DSXC_getValue('SETTINGS.tourney', STATE_OFF);
  525.  
  526. SETTINGS.direct = DSXC_getValue('SETTINGS.direct', false);
  527. SETTINGS.showall = DSXC_getValue('SETTINGS.showall', false);
  528. SETTINGS.timers = DSXC_getValue('SETTINGS.timers', true);
  529. SETTINGS.title = DSXC_getValue('SETTINGS.title', true);
  530. SETTINGS.auto = DSXC_getValue('SETTINGS.auto', false);
  531. SETTINGS.buttons = DSXC_getValue('SETTINGS.buttons', false);
  532. SETTINGS.length = DSXC_getValue('SETTINGS.length', 10);
  533. }
  534.  
  535. function SaveSettings()
  536. {
  537. DSXC_setValue('SETTINGS.horn', SETTINGS.horn);
  538. DSXC_setValue('SETTINGS.king', SETTINGS.king);
  539. DSXC_setValue('SETTINGS.cheese', SETTINGS.cheese);
  540. DSXC_setValue('SETTINGS.washed', SETTINGS.washed);
  541. DSXC_setValue('SETTINGS.season', SETTINGS.season);
  542. DSXC_setValue('SETTINGS.tourney', SETTINGS.tourney);
  543.  
  544. DSXC_setValue('SETTINGS.direct', SETTINGS.direct);
  545. DSXC_setValue('SETTINGS.showall', SETTINGS.showall);
  546. DSXC_setValue('SETTINGS.timers', SETTINGS.timers);
  547. DSXC_setValue('SETTINGS.title', SETTINGS.title);
  548. DSXC_setValue('SETTINGS.auto', SETTINGS.auto);
  549. DSXC_setValue('SETTINGS.buttons', SETTINGS.buttons);
  550. DSXC_setValue('SETTINGS.length', SETTINGS.length);
  551. }
  552.  
  553. function ResetSettings()
  554. {
  555. SETTINGS.horn = STATE_OFF;
  556. SETTINGS.king = STATE_OFF;
  557. SETTINGS.cheese = STATE_OFF;
  558. SETTINGS.washed = STATE_OFF;
  559. SETTINGS.season = STATE_OFF;
  560. SETTINGS.tourney = STATE_OFF;
  561.  
  562. SETTINGS.direct = false;
  563. SETTINGS.showall = false;
  564. SETTINGS.timers = true;
  565. SETTINGS.title = true;
  566. SETTINGS.auto = false;
  567. SETTINGS.buttons = false;
  568. SETTINGS.length = 5;
  569. ResetWindows();
  570. }
  571.  
  572. function Initialize()
  573. {
  574. DSXC_log('MHH v' + SCRIPT.version + ' - startup');
  575. // initialize the user object
  576. InitUserObject(document.documentElement.innerHTML);
  577. // determine current base
  578. DetermineBase();
  579. // determine current cheese
  580. DetermineCheese();
  581. // determine the unique hash
  582. DetermineHash();
  583. // determine current level
  584. DetermineLevel();
  585. // determine current location
  586. DetermineLocation();
  587. // determine current trap
  588. DetermineTrap();
  589. ReadSettings();
  590.  
  591. // read the saved inventory from settings
  592. LoadCrafting();
  593. LoadInventory();
  594. InitWindow();
  595.  
  596. StartTimers();
  597. }
  598.  
  599. Initialize();
  600.  
  601. function InitUserObject(value)
  602. {
  603. DSXC_log('Init UserObject');
  604. var OldUserObject = STATE.userobject;
  605. if (value != null)
  606. {
  607. if (typeof value == "string")
  608. {
  609. DSXC_log(' - from HTML');
  610. var StartPos = value.indexOf('user = ');
  611. var EndPos = value.indexOf('};', StartPos);
  612. if (StartPos != -1)
  613. {
  614. var FullObjectText = value.substring(StartPos + 7, EndPos + 1);
  615. STATE.userobject = JSON.parse(FullObjectText);
  616. }
  617. }
  618. else if (typeof value == "object")
  619. {
  620. DSXC_log(' - from javascript');
  621. STATE.userobject = value;
  622. }
  623. }
  624. if (STATE.userobject != null)
  625. {
  626. if (OldUserObject != null && OldUserObject.location != STATE.userobject.location)
  627. DSXC_log('Not at expected location, expected ' + OldUserObject.location + ' but at ' + STATE.userobject.location);
  628. UpdatePercentage(STATE.userobject.title_percentage);
  629. }
  630. }
  631.  
  632. function LoadInventory()
  633. {
  634. var TotalItems = DSXC_getValue('Inventory - Max ID', -1);
  635. DSXC_log('Load Inventory Items');
  636. for (iCount1 = 0; iCount1 <= TotalItems; iCount1++)
  637. {
  638. var InventoryDetail = DSXC_getValue('Inventory Item - ' + iCount1, 'INVALID');
  639. INVENTORY[iCount1] = Array();
  640. if (InventoryDetail != 'INVALID')
  641. {
  642. var InvValues = InventoryDetail.split(',');
  643. INVENTORY[iCount1][INVID] = iCount1;
  644. INVENTORY[iCount1][INVTYPE] = InvValues[0];
  645. INVENTORY[iCount1][INVNAME] = InvValues[1];
  646. INVENTORY[iCount1][INVDETAIL] = InvValues[2];
  647. INVENTORY[iCount1][INVQTY] = Number(InvValues[3]);
  648. if (InvValues.length == 5)
  649. {
  650. INVENTORY[iCount1][INVEXTRA] = InvValues[4];
  651. }
  652. }
  653. else
  654. {
  655. INVENTORY[iCount1][INVID] = -1;
  656. INVENTORY[iCount1][INVTYPE] = INVENTORY_TYPES_TEXT[INV_TYPE_NONE];
  657. INVENTORY[iCount1][INVQTY] = 0;
  658. }
  659. }
  660. DSXC_log(' - ' + iCount1 + ' loaded');
  661. }
  662.  
  663. function LoadCrafting()
  664. {
  665. var TotalItems = DSXC_getValue('Crafting - Max ID', -1);
  666. var NextItem = 0;
  667. DSXC_log('Load Crafting Items');
  668. for (iCount1 = 0; iCount1 <= TotalItems; iCount1++)
  669. {
  670. var CraftDetail = DSXC_getValue('Crafting Item - ' + iCount1, 'INVALID');
  671. if (CraftDetail != 'INVALID')
  672. {
  673. var CraftValues = CraftDetail.split(',');
  674. CRAFTING[NextItem] = Array();
  675. CRAFTING[NextItem][CRAFTID] = iCount1;
  676. CRAFTING[NextItem][CRAFTNAME] = CraftValues[0];
  677. CRAFTING[NextItem][CRAFTDETAIL] = CraftValues[1];
  678. CRAFTING[NextItem][CRAFTQTY] = Number(CraftValues[2]);
  679. NextItem++;
  680. }
  681. }
  682. DSXC_log(' - ' + NextItem + ' loaded');
  683. }
  684.  
  685. function InitWindow()
  686. {
  687. // display the windows
  688. DisplayState();
  689. DisplayTimers();
  690. DisplayDetail();
  691. }
  692.  
  693. function DetermineLevel()
  694. {
  695. STATE.level = -1;
  696. if (STATE.userobject != null)
  697. {
  698. DSXC_log("Determine Level");
  699. for (count1 = 0; count1 < LEVEL.length && STATE.level == -1; count1++)
  700. {
  701. for (count2 = 0; count2 < LEVEL[count1].length; count2++)
  702. {
  703. if (STATE.userobject.title_name == LEVEL[count1][count2])
  704. {
  705. STATE.level = count1;
  706. }
  707. }
  708. }
  709. DSXC_log(" - Level is " + STATE.userobject.title_name);
  710. }
  711. if (STATE.level == -1)
  712. {
  713. setTimeout(DetermineLevel, 500);
  714. }
  715. }
  716.  
  717. function DetermineCheese()
  718. {
  719. if (STATE.userobject != null && STATE.userobject.bait_item_id != null)
  720. {
  721. DSXC_log("Determine Cheese");
  722. STATE.cheese = STATE.userobject.bait_item_id;
  723.  
  724. if (STATE.cheese != -1 && STATE.cheese < INVENTORY.length)
  725. {
  726. DSXC_log(" - Cheese is " + INVENTORY[STATE.cheese][INVNAME]);
  727. }
  728. else
  729. {
  730. setTimeout(DetermineCheese, 500);
  731. }
  732. }
  733. else
  734. {
  735. setTimeout(DetermineCheese, 500);
  736. }
  737. }
  738.  
  739. function DetermineLocation()
  740. {
  741. STATE.location = -1;
  742. if (STATE.userobject != null)
  743. {
  744. DSXC_log("Determine Location");
  745. STATE.location = GetLocationID(STATE.userobject.location);
  746. if (STATE.location != -1)
  747. {
  748. // update expected location, this is updated when the page is loaded or you use travel
  749. DSXC_setValue('STATE.location', STATE.userobject.location);
  750. DSXC_log(" - Location is " + LOCATION.detail[STATE.location][LNAME]);
  751. }
  752. }
  753. else
  754. {
  755. setTimeout(DetermineLocation, 500);
  756. }
  757. }
  758.  
  759. function CalculateRouteCosts()
  760. {
  761. var TotalLocations = LOCATION.costs.length;
  762.  
  763. LOCATION.distance = new Array(TotalLocations);
  764. LOCATION.previous = new Array(TotalLocations);
  765. for (var iCount1 = 0; iCount1 < TotalLocations; iCount1++)
  766. {
  767. LOCATION.distance[iCount1] = new Array(TotalLocations);
  768. LOCATION.previous[iCount1] = new Array(TotalLocations);
  769. for (var iCount2 = 0; iCount2 < TotalLocations; iCount2++)
  770. {
  771. LOCATION.previous[iCount1][iCount2] = -99;
  772. LOCATION.distance[iCount1][iCount2] = -99;
  773. if (CheckMap(LOCATION.detail[iCount2][LMAP]))
  774. {
  775. LOCATION.distance[iCount1][iCount2] = LOCATION.costs[iCount1][iCount2];
  776. }
  777. }
  778. }
  779. for (var iCount1 = 0; iCount1 < TotalLocations; iCount1++)
  780. {
  781. for (var iCount2 = 0; iCount2 < TotalLocations; iCount2++)
  782. {
  783. for (var iCount3 = 0; iCount3 < TotalLocations; iCount3++)
  784. {
  785. if ((LOCATION.distance[iCount2][iCount1] + LOCATION.distance[iCount1][iCount3] < LOCATION.distance[iCount2][iCount3] || LOCATION.distance[iCount2][iCount3] == -99) && LOCATION.distance[iCount2][iCount1] != -99 && LOCATION.distance[iCount1][iCount3] != -99)
  786. {
  787. LOCATION.distance[iCount2][iCount3] = LOCATION.distance[iCount2][iCount1] + LOCATION.distance[iCount1][iCount3];
  788. LOCATION.previous[iCount2][iCount3] = iCount1;
  789. }
  790. }
  791. }
  792. }
  793. }
  794.  
  795. function CalculateRoute(wherefrom, whereto, route)
  796. {
  797. if (route == null)
  798. {
  799. route = new Array();
  800. route.push(whereto);
  801. }
  802. if (LOCATION.previous[wherefrom][whereto] == -99)
  803. {
  804. route.reverse();
  805. return route;
  806. }
  807. else
  808. {
  809. route.push(LOCATION.previous[wherefrom][whereto]);
  810. }
  811. return CalculateRoute(wherefrom, LOCATION.previous[wherefrom][whereto], route);
  812. }
  813.  
  814. function DetermineHash()
  815. {
  816. if (STATE.userobject != null)
  817. {
  818. DSXC_log('Determine Hash');
  819. STATE.hash = STATE.userobject.unique_hash;
  820. DSXC_setValue('STATE.hash', STATE.hash);
  821. DSXC_log(' - Hash is ' + STATE.hash);
  822. }
  823. else
  824. {
  825. setTimeout(DetermineHash, 500);
  826. }
  827. }
  828.  
  829. function DetermineTrap()
  830. {
  831. STATE.trap = -1;
  832. if (STATE.userobject != null)
  833. {
  834. DSXC_log("Determine Trap");
  835. STATE.trap = STATE.userobject.weapon_item_id;
  836. DSXC_log(" - Trap is " + STATE.userobject.weapon_name);
  837. }
  838. else
  839. {
  840. setTimeout(DetermineTrap, 500);
  841. }
  842. }
  843.  
  844. function DetermineBase()
  845. {
  846. STATE.base = -1;
  847. if (STATE.userobject != null)
  848. {
  849. DSXC_log("Determine Base");
  850. STATE.base = STATE.userobject.base_item_id;
  851. DSXC_log(" - Base is " + STATE.userobject.base_name);
  852. }
  853. else
  854. {
  855. setTimeout(DetermineBase, 500);
  856. }
  857. }
  858.  
  859. function CalculatePower(trap, base)
  860. {
  861. var total_power = 0;
  862. var multiplier = 1.0;
  863. if (trap != -1 && base != -1)
  864. {
  865. total_power = total_power + TRAPS[trap][TPOWER] + BASES[base][BPOWER];
  866. multiplier = multiplier + ((TRAPS[trap][TBONUS] + BASES[base][BBONUS]) / 100);
  867. total_power = Math.round((total_power * multiplier) * 10) / 10; // round to 1 decimal place
  868. total_power = Math.round(total_power);
  869. }
  870. return total_power;
  871. }
  872.  
  873. /************************ Drag n drop*******************************/
  874. function CreatePopupWindow(name, w, h, display)
  875. {
  876. if (display == null) display = true;
  877. if (document.getElementById(name + '_Message') == null)
  878. {
  879. if (display)
  880. {
  881. var CloseButton = "<A HREF='#' ID='" + name + "_Close'><IMG SRC='" + IMAGE.close + "' border='0' TITLE='Close' ALT='X' /></A>";
  882. var PopupWindow = document.createElement("div");
  883. var WindowPosition = DSXC_getValue("Position - " + name, "90px_300px");
  884. WindowPosition = WindowPosition.split("_");
  885. PopupWindow.style.position = 'absolute';
  886. PopupWindow.style.top = WindowPosition[0];
  887. PopupWindow.style.left = WindowPosition[1];
  888. PopupWindow.style.zIndex = 910;
  889. PopupWindow.id = name + "_Message";
  890. PopupWindow.innerHTML = "<DIV STYLE='position:absolute; z-index:911; background: white; padding: 0px 0px; color: black; border: 1px solid; font:10pt Verdana; width: " + w + "px; height: " + h + "px;'><DIV ID='" + name + "_Titlebar' STYLE='background: navy; color: white; cursor:move; font-weight: bold'>&nbsp;" + name + " <DIV STYLE='position:absolute; right:0px; top: 0px'>" + CloseButton + "</DIV></DIV><DIV ID='" + name + "' STYLE='padding: 5px 5px; text-align: left; overflow: auto; height: " + (h - 26) + "px;'></DIV></DIV>";
  891. document.body.appendChild(PopupWindow);
  892. makeDraggable(document.getElementById(name + '_Titlebar'));
  893. document.getElementById(name + '_Close').addEventListener("click", function() { document.getElementById(name + '_Message').parentNode.removeChild(document.getElementById(name + '_Message')) }, false);
  894. return document.getElementById(name);
  895. }
  896. }
  897. else
  898. {
  899. document.getElementById(name + '_Message').parentNode.removeChild(document.getElementById(name + '_Message'));
  900. }
  901. return null;
  902. }
  903.  
  904. function CreateSlider(node, width, minimum, maximum, show)
  905. {
  906. var SliderCtrl = document.getElementById(node);
  907. if (SliderCtrl != null)
  908. {
  909. SliderCtrl.setAttribute('SliderCtrl', 'idle');
  910. SliderCtrl.setAttribute('RangeMin', minimum);
  911. SliderCtrl.setAttribute('RangeMax', maximum);
  912. SliderCtrl.setAttribute('SliderTrack', 'Slider_Track_' + node);
  913. SliderCtrl.setAttribute('SliderThumb', 'Slider_Thumb_' + node);
  914. if (show != null) SliderCtrl.setAttribute('SliderValue', show);
  915. SliderCtrl.innerHTML = '<DIV ID="Slider_Track_' + node + '" STYLE="width: 200px; left: 2px; height: 1px; border: 1px solid black"><DIV ID="Slider_Thumb_' + node + '" STYLE="z-index:100; margin-top: -3px; width: 5px; height: 6px; border: 1px solid black; background-color: white"></DIV></DIV>';
  916. SliderCtrl.addEventListener("mousedown", function(ev) { this.setAttribute('SliderCtrl', 'drag'); return false; }, false);
  917. SliderCtrl.addEventListener("mouseup", function(ev) { this.setAttribute('SliderCtrl', 'idle'); return false; }, false);
  918. SliderCtrl.addEventListener("mousemove", function(ev) {
  919. if (this.getAttribute('SliderCtrl') == 'drag')
  920. {
  921. var SliderTrack = document.getElementById(this.getAttribute('SliderTrack'));
  922. var SliderThumb = document.getElementById(this.getAttribute('SliderThumb'));
  923. var MousePos = mouseCoords(ev);
  924. var TrackPos = getPosition(SliderTrack);
  925. var ThumbPos = getPosition(SliderThumb);
  926. var Range = {
  927. min: (TrackPos.x + 2),
  928. max: (TrackPos.x + parseFloat(SliderTrack.style.width) - 6)
  929. };
  930. SliderThumb.style.position = 'relative';
  931.  
  932. if (Range.min > MousePos.x)
  933. {
  934. SliderThumb.style.left = '0px';
  935. }
  936. else if (Range.max < MousePos.x)
  937. {
  938. SliderThumb.style.left = (Range.max - Range.min) + 'px';
  939. }
  940. else
  941. {
  942. SliderThumb.style.left = (MousePos.x - Range.min) + 'px';
  943. }
  944. if (this.getAttribute('SliderValue') != null && document.getElementById(this.getAttribute('SliderValue')) != null)
  945. {
  946. document.getElementById(this.getAttribute('SliderValue')).innerHTML = Math.ceil(((parseFloat(SliderThumb.style.left) + 1) * this.getAttribute('RangeMax')) / parseFloat(SliderTrack.style.width));
  947. }
  948. return false;
  949. }
  950. }, false);
  951. }
  952. }
  953.  
  954. var mouseOffset = null;
  955. var mousePos = [ 0, 0 ];
  956. var iMouseDown = false;
  957. var lMouseState = false;
  958. var dragObject = null;
  959. var curTarget = null;
  960.  
  961. function mouseCoords(ev)
  962. {
  963. return { x: ev.pageX, y: ev.pageY };
  964. }
  965.  
  966. function makeClickable(object)
  967. {
  968. object.onmousedown = function()
  969. {
  970. dragObject = this;
  971. }
  972. }
  973.  
  974. function getMouseOffset(target, ev)
  975. {
  976. var dPos = getPosition(target.parentNode);
  977. var mPos = mouseCoords(ev);
  978. return { x:mPos.x - dPos.x, y:mPos.y - dPos.y };
  979. }
  980.  
  981. function getPosition(e)
  982. {
  983. var border_left;
  984. var border_top;
  985. var left = 0;
  986. var top = 0;
  987. while (e.offsetParent)
  988. {
  989. border_left = (e.currentStyle ? parseInt(e.currentStyle.borderLeftWidth) : 0);
  990. border_top = (e.currentStyle ? parseInt(e.currentStyle.borderTopWidth) : 0);
  991. left += e.offsetLeft + (typeof(border_left) == "number" ? border_left : 0);
  992. top += e.offsetTop + (typeof(border_top) == "number" ? border_top : 0);
  993. e = e.offsetParent;
  994. }
  995. border_left = (e.currentStyle ? parseInt(e.currentStyle.borderLeftWidth) : 0);
  996. border_top = (e.currentStyle ? parseInt(e.currentStyle.borderTopWidth) : 0);
  997. left += e.offsetLeft + (typeof(border_left) == "number" ? border_left : 0);
  998. top += e.offsetTop + (typeof(border_top) == "number" ? border_top : 0);
  999. return { x: left, y: top };
  1000. }
  1001.  
  1002. function mouseMove(ev)
  1003. {
  1004. var target = ev.target;
  1005. mousePos = mouseCoords(ev);
  1006.  
  1007. if (dragObject)
  1008. {
  1009. dragObject.parentNode.style.position = 'absolute';
  1010. dragObject.parentNode.style.top = Math.max(0, (mousePos.y - mouseOffset.y)) +"px";
  1011. dragObject.parentNode.style.left = Math.max(0, (mousePos.x - mouseOffset.x)) +"px";
  1012. }
  1013. lMouseState = iMouseDown;
  1014. return false;
  1015. }
  1016.  
  1017. function mouseUp(ev)
  1018. {
  1019. if (dragObject != null)
  1020. {
  1021. if (dragObject.parentNode.id.indexOf('_Message') != -1)
  1022. {
  1023. var item_name = dragObject.parentNode.id.substring(0, dragObject.parentNode.id.indexOf('_Message'));
  1024. DSXC_setValue("Position - " + item_name, dragObject.parentNode.style.top + "_" + dragObject.parentNode.style.left);
  1025. }
  1026. dragObject = null;
  1027. }
  1028. iMouseDown = false;
  1029. }
  1030.  
  1031. function mouseDown(ev)
  1032. {
  1033. var mousePos = mouseCoords(ev);
  1034. var target = ev.target;
  1035. iMouseDown = true;
  1036. if (target.getAttribute('DragObj'))
  1037. {
  1038. return false;
  1039. }
  1040. }
  1041.  
  1042. function makeDraggable(item)
  1043. {
  1044. if (!item) return;
  1045. item.addEventListener("mousedown",
  1046. function(ev)
  1047. {
  1048. dragObject = this.parentNode;
  1049. mouseOffset = getMouseOffset(this.parentNode, ev);
  1050. return false;
  1051. },
  1052. false);
  1053. }
  1054.  
  1055. document.addEventListener("mousemove", mouseMove, false);
  1056. document.addEventListener("mousedown", mouseDown, false);
  1057. document.addEventListener("mouseup", mouseUp, false);
  1058.  
  1059. function getElementById(search, node, tag)
  1060. {
  1061. var FoundElement = null;
  1062. if (node == null) node = document;
  1063. if (tag == null) tag = '*';
  1064. var AllElements = node.getElementsByTagName(tag);
  1065. for (count = 0; count < AllElements.length && FoundElement == null; count++)
  1066. {
  1067. if (AllElements[count].id != null)
  1068. {
  1069. if (AllElements[count].id.indexOf(search) != -1)
  1070. {
  1071. FoundElement = AllElements[count];
  1072. }
  1073. }
  1074. }
  1075. return FoundElement;
  1076. }
  1077.  
  1078. function getElementsByPartialId(search, node, tag)
  1079. {
  1080. var FoundElements = new Array();
  1081. if (node == null) node = document;
  1082. if (tag == null) tag = '*';
  1083. var AllElements = node.getElementsByTagName(tag);
  1084. for (count = 0; count < AllElements.length; count++)
  1085. {
  1086. if (AllElements[count].id != null)
  1087. {
  1088. if (AllElements[count].id.indexOf(search) != -1)
  1089. {
  1090. FoundElements.push(AllElements[count]);
  1091. }
  1092. }
  1093. }
  1094. return FoundElements;
  1095. }
  1096.  
  1097. function getElementsByClass(search, node, tag)
  1098. {
  1099. var FoundElements = new Array();
  1100. if (node == null) node = document;
  1101. if (tag == null) tag = '*';
  1102. var AllElements = node.getElementsByTagName(tag);
  1103. for (count = 0; count < AllElements.length; count++)
  1104. {
  1105. if (AllElements[count].className != null)
  1106. {
  1107. if (AllElements[count].className == search)
  1108. {
  1109. FoundElements.push(AllElements[count]);
  1110. }
  1111. }
  1112. }
  1113. return FoundElements;
  1114. }
  1115.  
  1116. function getElementsByPartialClass(search, node, tag)
  1117. {
  1118. var FoundElements = new Array();
  1119. if (node == null) node = document;
  1120. if (tag == null) tag = '*';
  1121. var AllElements = node.getElementsByTagName(tag);
  1122. for (count = 0; count < AllElements.length; count++)
  1123. {
  1124. if (AllElements[count].className != null)
  1125. {
  1126. if (AllElements[count].className.indexOf(search) != -1)
  1127. {
  1128. FoundElements.push(AllElements[count]);
  1129. }
  1130. }
  1131. }
  1132. return FoundElements;
  1133. }
  1134.  
  1135. if (typeof String.prototype.startsWith != 'function') {
  1136. String.prototype.startsWith = function (str){
  1137. return this.slice(0, str.length) == str;
  1138. };
  1139. }
  1140.  
  1141. if (typeof String.prototype.endsWith != 'function') {
  1142. String.prototype.endsWith = function (str){
  1143. return this.slice(-str.length) == str;
  1144. };
  1145. }
  1146.  
  1147. function GetMessageText(text)
  1148. {
  1149. var StartPos = text.indexOf('pagemessage');
  1150. var EndPos = text.indexOf('<div id="tabbarContent');
  1151.  
  1152. var MessageText = "";
  1153. if (StartPos != -1)
  1154. {
  1155. MessageText = text.substring(StartPos + 53, EndPos);
  1156. }
  1157. return MessageText;
  1158. }
  1159.  
  1160. var MessageTimeout;
  1161.  
  1162. function ShowMessageWindow(text, time)
  1163. {
  1164. clearTimeout(MessageTimeout);
  1165. if (time == null) time = 0;
  1166. var CurrentMessage = document.getElementById('pagemessage');
  1167. if (typeof text != 'string') text = '';
  1168. if (CurrentMessage != null)
  1169. {
  1170. CurrentMessage.innerHTML = text;
  1171. if (time > 0)
  1172. {
  1173. MessageTimeout = setTimeout(ShowMessageWindow, (time * 1000));
  1174. }
  1175. }
  1176. }
  1177.  
  1178. function ShowConfigWindow(display)
  1179. {
  1180. var ConfigWindow = CreatePopupWindow('Configuration', 275, 350, display);
  1181. if (ConfigWindow != null)
  1182. {
  1183. ConfigWindow.innerHTML = "<TABLE HEIGHT='100%'><TR><TD WIDTH='200'>Alerts</TD><TD STYLE='text-align: right; width: 100'><SPAN STYLE='font-size: 8px'>Snd&nbsp;&nbsp;&nbsp;Msg</SPAN></TD></TR><TR><TD WIDTH='200'>&nbsp;&nbsp;&nbsp;Horn Ready</TD><TD STYLE='text-align: right; width: 100'><INPUT TYPE='Checkbox' ID='Hunter_Horn_Sound'><INPUT TYPE='Checkbox' ID='Hunter_Horn_Popup'></TD></TR><TR><TD WIDTH='200'>&nbsp;&nbsp;&nbsp;King's Reward</TD><TD STYLE='text-align: right; width: 100'><INPUT TYPE='Checkbox' ID='Kings_Reward_Sound'><INPUT TYPE='Checkbox' ID='Kings_Reward_Popup'></TD></TR><TR><TD WIDTH='200'>&nbsp;&nbsp;&nbsp;Cheese Empty</TD><TD STYLE='text-align: right; width: 100'><INPUT TYPE='Checkbox' ID='Out_of_Cheese_Sound'><INPUT TYPE='Checkbox' ID='Out_of_Cheese_Popup'></TD></TR><TR><TD WIDTH='200'>&nbsp;&nbsp;&nbsp;Washed Away</TD><TD STYLE='text-align: right; width: 100'><INPUT TYPE='Checkbox' ID='Washed_Away_Sound'><INPUT TYPE='Checkbox' ID='Washed_Away_Popup'></TD></TR><TR><TD WIDTH='200'>&nbsp;&nbsp;&nbsp;Season Change / Tower Amp</TD><TD STYLE='text-align: right; width: 100'><INPUT TYPE='Checkbox' ID='Season_Change_Sound'><INPUT TYPE='Checkbox' ID='Season_Change_Popup'></TD></TR><TR><TD WIDTH='200'>&nbsp;&nbsp;&nbsp;Tournament Soon</TD><TD STYLE='text-align: right; width: 100'><INPUT TYPE='Checkbox' ID='Tourney_Warning_Sound'><INPUT TYPE='Checkbox' ID='Tourney_Warning_Popup'></TD></TR><TR><TD WIDTH='200'>Direct Travel</TD><TD STYLE='text-align: right; width: 100'><INPUT TYPE='Checkbox' ID='Direct_Travel'></TD></TR><TR><TD WIDTH='200'>Display Timers</TD><TD STYLE='text-align: right; width: 100'><INPUT TYPE='Checkbox' ID='Display_Timers'></TD></TR><TR><TD WIDTH='200'>Timer in Title</TD><TD STYLE='text-align: right; width: 100'><INPUT TYPE='Checkbox' ID='Timer_Title'></TD></TR><TR><TD WIDTH='200'>Show All Crafting Items</TD><TD STYLE='text-align: right; width: 100'><INPUT TYPE='Checkbox' ID='Show_All_Craft'></TD></TR><TR><TD WIDTH='200'>Automatic Inventory Update</TD><TD STYLE='text-align: right; width: 100'><INPUT TYPE='Checkbox' ID='Inventory_Update'></TD></TR><TR><TD WIDTH='200'>Change Button Style</TD><TD STYLE='text-align: right; width: 100'><INPUT TYPE='Checkbox' ID='Display_Button'></TD></TR><TR><TD WIDTH='200'>Update Timer Length</TD><TD STYLE='text-align: right; width: 100'><INPUT TYPE='Text' ID='Update_Length' SIZE='3'></TD></TR><TR HEIGHT='100%'><TD COLSPAN='2' style='vertical-align: bottom'>Version " + SCRIPT.version + "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href=\"#\" ajaxify=\"/ajax/pages/fan_status.php?fbpage_id=134975893200179&add=1&reload=1&preserve_tab=1&use_primer=1\" rel=\"async-post\">Like</a>&nbsp;&nbsp;&nbsp;&nbsp;<A HREF='#' ID='Reset_to_Default'>Defaults</A></TD></TR></TABLE>";
  1184.  
  1185. document.getElementById('Hunter_Horn_Sound').checked = SETTINGS.horn & STATE_SOUND;
  1186. document.getElementById('Hunter_Horn_Popup').checked = SETTINGS.horn & STATE_MESSAGE;
  1187. document.getElementById('Kings_Reward_Sound').checked = SETTINGS.king & STATE_SOUND;
  1188. document.getElementById('Kings_Reward_Popup').checked = SETTINGS.king & STATE_MESSAGE;
  1189. document.getElementById('Out_of_Cheese_Sound').checked = SETTINGS.cheese & STATE_SOUND;
  1190. document.getElementById('Out_of_Cheese_Popup').checked = SETTINGS.cheese & STATE_MESSAGE;
  1191. document.getElementById('Washed_Away_Sound').checked = SETTINGS.washed & STATE_SOUND;
  1192. document.getElementById('Washed_Away_Popup').checked = SETTINGS.washed & STATE_MESSAGE;
  1193. document.getElementById('Season_Change_Sound').checked = SETTINGS.season & STATE_SOUND;
  1194. document.getElementById('Season_Change_Popup').checked = SETTINGS.season & STATE_MESSAGE;
  1195. document.getElementById('Tourney_Warning_Sound').checked = SETTINGS.tourney & STATE_SOUND;
  1196. document.getElementById('Tourney_Warning_Popup').checked = SETTINGS.tourney & STATE_MESSAGE;
  1197. document.getElementById('Direct_Travel').checked = SETTINGS.direct;
  1198. document.getElementById('Show_All_Craft').checked = SETTINGS.showall;
  1199. document.getElementById('Display_Timers').checked = SETTINGS.timers;
  1200. document.getElementById('Timer_Title').checked = SETTINGS.title;
  1201. document.getElementById('Inventory_Update').checked = SETTINGS.auto;
  1202. document.getElementById('Display_Button').checked = SETTINGS.buttons;
  1203. document.getElementById('Update_Length').value = SETTINGS.length;
  1204.  
  1205. document.getElementById('Hunter_Horn_Sound').addEventListener('click', function () { SETTINGS.horn = SETTINGS.horn ^ STATE_SOUND; SaveSettings(); }, true);
  1206. document.getElementById('Hunter_Horn_Popup').addEventListener('click', function () { SETTINGS.horn = SETTINGS.horn ^ STATE_MESSAGE; SaveSettings(); }, true);
  1207. document.getElementById('Kings_Reward_Sound').addEventListener('click', function () { SETTINGS.king = SETTINGS.king ^ STATE_SOUND; SaveSettings(); }, true);
  1208. document.getElementById('Kings_Reward_Popup').addEventListener('click', function () { SETTINGS.king = SETTINGS.king ^ STATE_MESSAGE; SaveSettings(); }, true);
  1209. document.getElementById('Out_of_Cheese_Sound').addEventListener('click', function () { SETTINGS.cheese = SETTINGS.cheese ^ STATE_SOUND; SaveSettings(); }, true);
  1210. document.getElementById('Out_of_Cheese_Popup').addEventListener('click', function () { SETTINGS.cheese = SETTINGS.cheese ^ STATE_MESSAGE; SaveSettings(); }, true);
  1211. document.getElementById('Washed_Away_Sound').addEventListener('click', function () { SETTINGS.washed = SETTINGS.washed ^ STATE_SOUND; SaveSettings(); }, true);
  1212. document.getElementById('Washed_Away_Popup').addEventListener('click', function () { SETTINGS.washed = SETTINGS.washed ^ STATE_MESSAGE; SaveSettings(); }, true);
  1213. document.getElementById('Season_Change_Sound').addEventListener('click', function () { SETTINGS.season = SETTINGS.season ^ STATE_SOUND; SaveSettings(); }, true);
  1214. document.getElementById('Season_Change_Popup').addEventListener('click', function () { SETTINGS.season = SETTINGS.season ^ STATE_MESSAGE; SaveSettings(); }, true);
  1215. document.getElementById('Tourney_Warning_Sound').addEventListener('click', function () { SETTINGS.tourney = SETTINGS.tourney ^ STATE_SOUND; SaveSettings(); }, true);
  1216. document.getElementById('Tourney_Warning_Popup').addEventListener('click', function () { SETTINGS.tourney = SETTINGS.tourney ^ STATE_MESSAGE; SaveSettings(); }, true);
  1217.  
  1218. document.getElementById('Direct_Travel').addEventListener('click', function () { SETTINGS.direct = !SETTINGS.direct; SaveSettings(); }, true);
  1219. document.getElementById('Show_All_Craft').addEventListener('click', function () { SETTINGS.showall = !SETTINGS.showall; SaveSettings(); }, true);
  1220. document.getElementById('Display_Timers').addEventListener('click', function () { SETTINGS.timers = !SETTINGS.timers; SaveSettings(); }, true);
  1221. document.getElementById('Timer_Title').addEventListener('click', function () { SETTINGS.title = !SETTINGS.title; SaveSettings(); }, true);
  1222. document.getElementById('Inventory_Update').addEventListener('click', function () { SETTINGS.auto = !SETTINGS.auto; SaveSettings(); }, true);
  1223. document.getElementById('Display_Button').addEventListener('click', function () { SETTINGS.buttons = !SETTINGS.buttons; SaveSettings(); }, true);
  1224. document.getElementById('Update_Length').addEventListener('change', function () { SETTINGS.length = parseInt(document.getElementById('Update_Length').value); SaveSettings(); }, true);
  1225. document.getElementById('Reset_to_Default').addEventListener('click', function () { ResetSettings(); SaveSettings(); ShowConfigWindow(false); }, true);
  1226. }
  1227. }
  1228.  
  1229. function DisplayState()
  1230. {
  1231. var AllHUDs = getElementsByClass('headsup');
  1232. var HUD = AllHUDs[0];
  1233. var iCount = 1;
  1234.  
  1235. if (HUD != null)
  1236. {
  1237. var HUDStatLists = getElementsByClass('hudstatlist');
  1238. for (iCount = 1; iCount < HUDStatLists.length; iCount++)
  1239. {
  1240. var Embedded = document.createElement('li');
  1241. Embedded.id = 'MHH_Display_' + (iCount + 1);
  1242. HUDStatLists[iCount].firstChild.appendChild(Embedded);
  1243. }
  1244. }
  1245. if (document.getElementById('header') != null)
  1246. {
  1247. if (DSXC_getValue('Alert - Kings Reward', false))
  1248. {
  1249. ResetTimeout('Update - Kings Reward');
  1250. DSXC_setValue('Alert - Kings Reward', false);
  1251. }
  1252. DSXC_setValue('Alert - Cheese', false);
  1253. STATE.ready = true;
  1254. }
  1255. else
  1256. {
  1257. STATE.maintenance = true;
  1258. STATE.ready = true;
  1259. }
  1260. }
  1261.  
  1262. function DisplayTimers()
  1263. {
  1264. if (!STATE.maintenance)
  1265. {
  1266. if (SETTINGS.timers)
  1267. {
  1268. SetDisplayText(2, '<span class="hudstatlabel">Reward:</span>&nbsp;&nbsp;<span id="MHH_Kings_Reward_Timer"></span>');
  1269.  
  1270. var MHHornTimer = document.getElementById('huntTimer');
  1271. MHHornTimer.style.display = 'none';
  1272. var HornTimer = document.createElement('div');
  1273. HornTimer.id = 'MHH_Display_1';
  1274. HornTimer.className = 'hunttimer';
  1275. HornTimer.innerHTML = '<span style="font-size: 12px"><B>Horn:</B></span>&nbsp;&nbsp;<span style="font-size: 12px" id="MHH_Horn_Timer"></span>';
  1276. MHHornTimer.parentNode.appendChild(HornTimer);
  1277. }
  1278. }
  1279. }
  1280.  
  1281. function HeaderDetail(text, stylestart, styleend, link, linktext)
  1282. {
  1283. var HeaderText = "<div class='uiHeader uiHeaderTopAndBottomBorder mbs uiSideHeader'><div class='clearfix uiHeaderTop'>";
  1284. if (link != null) HeaderText = HeaderText + "<a href='" + link + "' class='uiHeaderActions rfloat'>" + linktext + "</a>";
  1285. HeaderText = HeaderText + "<div>";
  1286. if (stylestart != null) HeaderText = HeaderText + stylestart;
  1287. HeaderText = HeaderText + text;
  1288. if (styleend != null) HeaderText = HeaderText + styleend;
  1289. HeaderText = HeaderText + "</div></div></div>"
  1290. return HeaderText;
  1291. }
  1292.  
  1293. function DisplayDetail()
  1294. {
  1295. var TopBanner = getElementById("hgBanner");
  1296. if (TopBanner != null && !STATE.maintenance)
  1297. {
  1298. var sBackground = (SETTINGS.buttons ? " style='padding: 3px; background: url(" + IMAGE.background + ") no-repeat'" : "");
  1299. var sConfigOpen = "<a href='#' id='Config_Open' class='config_open_btn'><img" + sBackground + " src='" + IMAGE.config + "' border=0 title='Configuration' /></a>";
  1300. var sRefresh = "<a href='#' id='Refresh_Inventory' class='refresh_btn'><img" + sBackground + " src='" + IMAGE.refresh + "' border=0 title='Refresh Inventory' /></a>";
  1301. var sTravelOpen = "<a href='#' id='Travel_Open' class='config_open_btn'><img" + sBackground + " src='" + IMAGE.travel + "' border=0 title='Travel' /></a>";
  1302. var sCraftingOpen = "<a href='#' id='Crafting_Open' class='crafting_open_btn'><img" + sBackground + " src='" + IMAGE.craft + "' border=0 title='Crafting' /></a>";
  1303. var sPotionsOpen = "<a href='#' id='Potions_Open' class='potion_open_btn'><img" + sBackground + " src='" + IMAGE.potion + "' border=0 title='Potions' /></a>";
  1304. var sJournalOpen = "<a href='#' id='Journal_Open' class='journal_open_btn'><img" + sBackground + " src='" + IMAGE.journal + "' border=0 title='Journal' /></a>";
  1305. var sMHHButtons = "<div style=\"float: left\"><table id='MHH_Buttons' style='width: 245px'>";
  1306. sMHHButtons = sMHHButtons + "<tr height=\"25\"><th colspan=\"6\" style=\"text-align: center;\"><b><a target=\"_new\" href=\"http://www.facebook.com/pages/DSXCs-Mousehunt-Helper/134975893200179\">MouseHunt Helper</a></b></th></tr>";
  1307. //sMHHButtons = sMHHButtons + "<tr><td style='width: 20%; text-align: center'>" + sCraftingOpen + "</td><td style='width: 20%; text-align: center'>" + sTravelOpen + "</td><td style='width: 20%; text-align: center'>" + sJournalOpen + "</td><td style='width: 20%; text-align: center'>" + sRefresh + "</td><td style='width: 20%; text-align: center'>" + sConfigOpen + "</td></tr>";
  1308. sMHHButtons = sMHHButtons + "<tr><td style='width: 20%; text-align: center'>" + sCraftingOpen + "</td><td style='width: 20%; text-align: center'>" + sPotionsOpen + "</td><td style='width: 20%; text-align: center'>" + sTravelOpen + "</td><td style='width: 20%; text-align: center'>" + sJournalOpen + "</td><td style='width: 20%; text-align: center'>" + sRefresh + "</td><td style='width: 20%; text-align: center'>" + sConfigOpen + "</td></tr>";
  1309. //sMHHButtons = sMHHButtons + "<tr><td style='font-size: 8px; width: 20%; text-align: center'>Craft</td><td style='font-size: 8px; width: 20%; text-align: center'>Travel</td><td style='font-size: 8px; width: 20%; text-align: center'>Journal</td><td style='font-size: 8px; width: 20%; text-align: center'>Refresh</td><td style='font-size: 8px; width: 20%; text-align: center'>Config</td></tr>";
  1310. sMHHButtons = sMHHButtons + "<tr><td style='font-size: 8px; width: 20%; text-align: center'>Craft</td><td style='font-size: 8px; width: 20%; text-align: center'>Potion</td><td style='font-size: 8px; width: 20%; text-align: center'>Travel</td><td style='font-size: 8px; width: 20%; text-align: center'>Journal</td><td style='font-size: 8px; width: 20%; text-align: center'>Refresh</td><td style='font-size: 8px; width: 20%; text-align: center'>Config</td></tr>";
  1311. sMHHButtons = sMHHButtons + "</table><p /></div>";
  1312. var sMHHTimers = "<div style=\"float: right\"><table id='MHH_Buttons' style='width: 450px'>";
  1313. sMHHTimers = sMHHTimers + "<tr height=\"25\"><th colspan=\"5\" style=\"text-align: center; font-size: 9px;\">";
  1314. if (STATE.userobject != null && STATE.userobject.has_shield)
  1315. {
  1316. var expiry = new Date(STATE.userobject.shield_expiry);
  1317. var now = new Date();
  1318. var days = days_between(expiry, now);
  1319. if (days > 0)
  1320. sMHHTimers = sMHHTimers + "Lucky shield expires in " + days + " days";
  1321. else
  1322. sMHHTimers = sMHHTimers + "Lucky shield expires today!";
  1323. }
  1324. sMHHTimers = sMHHTimers + "</th></tr><tr>";
  1325. var ColumnWidth = 100 / LOCATION_TIMERS.length;
  1326.  
  1327. for (iCount1 = 0; iCount1 < LOCATION_TIMERS.length; iCount1++)
  1328. {
  1329. sMHHTimers = sMHHTimers + "<td style=\"font-size: 9px;\"><b>" + LOCATION_TIMERS[iCount1][0] + "</b><br>";
  1330. sMHHTimers = sMHHTimers + "&nbsp;&nbsp;State: <span id='MHH_Location_" + iCount1 + "_State'></span><br>";
  1331. sMHHTimers = sMHHTimers + "&nbsp;&nbsp;Changes: <span id='MHH_Location_" + iCount1 + "_Change'>the future</span></td>";
  1332. }
  1333. sMHHTimers = sMHHTimers + "</tr></table><p /></div>";
  1334. TopBanner.innerHTML = sMHHButtons + sMHHTimers + "<div style=\"clear: both\"></div>";
  1335. TopBanner.id = 'MHH_modified';
  1336. if (document.getElementById('Crafting_Open') != null) document.getElementById('Crafting_Open').addEventListener("click", ShowCraftingWindow, false);
  1337. if (document.getElementById('Potions_Open') != null) document.getElementById('Potions_Open').addEventListener("click", ShowPotionsWindow, false);
  1338. if (document.getElementById('Travel_Open') != null) document.getElementById('Travel_Open').addEventListener("click", ShowTravelWindow, false);
  1339. if (document.getElementById('Journal_Open') != null) document.getElementById('Journal_Open').addEventListener("click", ShowJournalWindow, false);
  1340. if (document.getElementById('Refresh_Inventory') != null) document.getElementById('Refresh_Inventory').addEventListener("click", ForceRefresh, false);
  1341. if (document.getElementById('Config_Open') != null) document.getElementById('Config_Open').addEventListener("click", ShowConfigWindow, false);
  1342. }
  1343. }
  1344.  
  1345. function days_between(date1, date2)
  1346. {
  1347. // The number of milliseconds in one day
  1348. var ONE_DAY = 1000 * 60 * 60 * 24;
  1349. // Convert both dates to milliseconds
  1350. var date1_ms = date1.getTime() + (date2.getTimezoneOffset() * 60 * 1000);
  1351. var date2_ms = date2.getTime();
  1352. // Calculate the difference in milliseconds
  1353. var difference_ms = Math.abs(date1_ms - date2_ms);
  1354. // Convert back to days and return
  1355. return Math.round(difference_ms / ONE_DAY);
  1356. }
  1357.  
  1358. function AlertSound(sound)
  1359. {
  1360. var SoundAlert = document.createElement("div");
  1361. SoundAlert.innerHTML = '<embed src="' + sound + '" height="50" width="200" hidden=true autostart="true" loop="false"></embed>';
  1362. if (document.getElementById('hgAppContainer') != null)
  1363. document.getElementById('hgAppContainer').appendChild(SoundAlert);
  1364. else
  1365. document.body.appendChild(SoundAlert);
  1366. }
  1367.  
  1368. function SoundHorn()
  1369. {
  1370. if (!DSXC_getValue('Alert - Sound', false))
  1371. {
  1372. DSXC_setValue('Alert - Sound', true);
  1373. if (SETTINGS.horn & STATE_SOUND)
  1374. {
  1375. AlertSound(AUDIO.horn);
  1376. }
  1377. if (SETTINGS.horn & STATE_MESSAGE)
  1378. {
  1379. alert('The horn is ready to be sounded');
  1380. }
  1381. }
  1382. }
  1383.  
  1384. function UpdateTimer(timeleft, inhours)
  1385. {
  1386. var ReturnValue = "";
  1387. var FirstPart;
  1388. var SecondPart;
  1389. var Size;
  1390. if (timeleft > 0)
  1391. {
  1392. if (inhours != null && inhours == true)
  1393. {
  1394. FirstPart = Math.floor(timeleft / (60 * 60));
  1395. SecondPart = Math.floor(timeleft / 60) % 60;
  1396. Size = 'hrs';
  1397. }
  1398. else
  1399. {
  1400. FirstPart = Math.floor(timeleft / 60);
  1401. SecondPart = timeleft % 60;
  1402. Size = 'mins';
  1403. }
  1404. if (SecondPart < 10)
  1405. {
  1406. SecondPart = '0' + SecondPart;
  1407. }
  1408. ReturnValue = FirstPart + ':' + SecondPart + ' ' + Size;
  1409. }
  1410. else
  1411. {
  1412. ReturnValue = 'Soon...';
  1413. }
  1414. return ReturnValue;
  1415. }
  1416.  
  1417. function Get(url, callback)
  1418. {
  1419. // DO NOT OPEN OTHER PAGES DURING KINGS REWARD OR MAINTENANCE
  1420. if (!STATE.king && !STATE.maintenance)
  1421. {
  1422. DSXC_log('Get - ' + url);
  1423. try
  1424. {
  1425. DSXC_xmlHttpRequest({
  1426. method: 'GET',
  1427. url: url,
  1428. onload: function(result) {
  1429. if (result.status != 200)
  1430. {
  1431. throw("GET failed - " + url + " " + Flatten(result));
  1432. }
  1433. else
  1434. {
  1435. if (url.startsWith(STATE.baseurl))
  1436. {
  1437. InitUserObject(result.responseText);
  1438. DetermineHash();
  1439. if (result.responseText.indexOf("Claim Your Reward!") != -1)
  1440. {
  1441. window.location = STATE.baseurl;
  1442. }
  1443. else
  1444. {
  1445. callback(result.responseText);
  1446. }
  1447. }
  1448. else
  1449. {
  1450. callback(result.responseText);
  1451. }
  1452. }
  1453. }
  1454. });
  1455. }
  1456. catch (ex)
  1457. {
  1458. DSXC_log(ex);
  1459. }
  1460. }
  1461. }
  1462.  
  1463. function Post(url, data, callback)
  1464. {
  1465. // DO NOT OPEN OTHER PAGES DURING KINGS REWARD OR MAINTENANCE
  1466. if (!STATE.king && !STATE.maintenance)
  1467. {
  1468. DSXC_log('Post - ' + url + ' - ' + data);
  1469. if (!data)
  1470. data = {}
  1471. data.hg_is_ajax = 1;
  1472. // the window.parent is not accessible by the fb apps page due to cross site
  1473. // security, this is the only way to check if someone is using the fb version
  1474. try
  1475. {
  1476. window.parent.location.toString();
  1477. data.sn = 'Hitgrab';
  1478. }
  1479. catch (ex)
  1480. {
  1481. data.sn = 'Facebook';
  1482. }
  1483. try
  1484. {
  1485. DSXC_xmlHttpRequest({
  1486. method: 'POST',
  1487. data: serialize(data).replace(" ", "+"),
  1488. headers: { "Content-Type": "application/x-www-form-urlencoded" },
  1489. url: url,
  1490. onload: function(result) {
  1491. if (result.status != 200)
  1492. {
  1493. throw("POST failed - " + url);
  1494. }
  1495. else
  1496. {
  1497. if (url.startsWith(STATE.baseurl))
  1498. {
  1499. responseData = JSON.parse(result.responseText);
  1500. InitUserObject(responseData.user);
  1501. if (document.getElementById('headerTop') != null)
  1502. document.getElementById('headerTop').style.backgroundImage = "url(\'" + STATE.userobject.location_header + "\')";
  1503. DetermineHash();
  1504. if (STATE.userobject.has_puzzle)
  1505. {
  1506. window.location = STATE.baseurl;
  1507. }
  1508. else
  1509. {
  1510. callback(responseData);
  1511. }
  1512. }
  1513. else
  1514. {
  1515. callback(responseData);
  1516. }
  1517. }
  1518. }
  1519. });
  1520. }
  1521. catch (ex)
  1522. {
  1523. DSXC_log(ex);
  1524. }
  1525. }
  1526. }
  1527.  
  1528. function CheckTimeout(timer, minutes, hours)
  1529. {
  1530. var Today = new Date();
  1531. var iReturnValue = 0;
  1532. var szLastCheck = DSXC_getValue(timer, 'never');
  1533. if (minutes == null) minutes = 0;
  1534. if (hours == null) hours = 0;
  1535. var WaitLength = ((minutes * 60) + (hours * 60 * 60));
  1536. if (szLastCheck != 'never')
  1537. {
  1538. var CurrentTime = Today.getTime();
  1539. var PreviousTime = new Date(szLastCheck).getTime();
  1540. var Interval = Math.floor((CurrentTime - PreviousTime) / 1000);
  1541. if (Interval >= WaitLength)
  1542. {
  1543. iReturnValue = 0;
  1544. }
  1545. else
  1546. {
  1547. iReturnValue = (WaitLength - Interval);
  1548. }
  1549. }
  1550. else
  1551. {
  1552. iReturnValue = 0;
  1553. }
  1554. return iReturnValue;
  1555. }
  1556.  
  1557. function ResetTimeout(timer)
  1558. {
  1559. var Today = new Date();
  1560. DSXC_setValue(timer, String(Today));
  1561. }
  1562.  
  1563. function ResetInventory()
  1564. {
  1565. var MaxItemID = DSXC_getValue('Inventory - Max ID', -1);
  1566. for (iCount1 = 0; iCount1 < MaxItemID; iCount1++)
  1567. {
  1568. var InventoryDetail = DSXC_getValue('Inventory Item - ' + iCount1, 'INVALID');
  1569. if (InventoryDetail != 'INVALID')
  1570. {
  1571. var InvValues = InventoryDetail.split(',');
  1572. DSXC_setValue('Inventory Item - ' + iCount1, InvValues[0] + ',' + InvValues[1] + ',' + InvValues[2] + ',0');
  1573. }
  1574. }
  1575. }
  1576.  
  1577. function ForceRefresh()
  1578. {
  1579. CheckInventory(0);
  1580. }
  1581.  
  1582. function CheckInventory(when)
  1583. {
  1584. if (when == 0 || SETTINGS.auto)
  1585. {
  1586. if (CheckTimeout('Update - Inventory', when) == 0)
  1587. {
  1588. ResetTimeout('Update - Inventory');
  1589. ResetInventory();
  1590. ShowMessageWindow('<div class="pagemessage s"><div class="messagetop"></div><div class="messagebody"><div class="messagetitle">Updating Inventory</div><div class="messagecontent">This window will disappear once the update has occurred.</div></div><div class="messagebottom"></div></div></div>');
  1591. Get(STATE.baseurl + "inventory.php", UpdateInventory);
  1592. }
  1593. }
  1594. }
  1595.  
  1596. function UpdateInventoryQuantity(item_id, quantity)
  1597. {
  1598. INVENTORY[item_id][INVQTY] = Number(quantity);
  1599. DSXC_setValue('Inventory Item - ' + item_id, INVENTORY[item_id][INVTYPE] + ',' + INVENTORY[item_id][INVNAME] + ',' + INVENTORY[item_id][INVDETAIL] + ',' + INVENTORY[item_id][INVQTY]);
  1600. }
  1601.  
  1602. function UpdateCraftingQuantity(item_id, quantity)
  1603. {
  1604. CRAFTING[item_id][CRAFTQTY] = Number(quantity);
  1605. DSXC_setValue('Crafting Item - ' + item_id, CRAFTING[item_id][CRAFTNAME] + ',' + CRAFTING[item_id][CRAFTDETAIL] + ',' + CRAFTING[item_id][CRAFTQTY]);
  1606. }
  1607.  
  1608. function UpdateInventory(data)
  1609. {
  1610. if (typeof data == "object")
  1611. {
  1612. if (data.items != null)
  1613. {
  1614. for (var detail in data.items)
  1615. {
  1616. UpdateInventoryDetail(data.items[detail]);
  1617. }
  1618. }
  1619. if (data.inventory != null)
  1620. {
  1621. for (var detail in data.inventory)
  1622. {
  1623. if (data.inventory[detail].classification == "crafting_item")
  1624. {
  1625. var mat_id = CraftingLookup(data.inventory[detail].type);
  1626. if (mat_id != -1)
  1627. UpdateCraftingQuantity(mat_id, data.inventory[detail].quantity);
  1628. }
  1629. else
  1630. {
  1631. UpdateInventoryDetail(data.inventory[detail]);
  1632. }
  1633. }
  1634. }
  1635.  
  1636. LoadCrafting();
  1637. LoadInventory();
  1638. }
  1639. else if (data == null)
  1640. {
  1641. params = { "classifications": [ "map_piece", "bait", "skin", "weapon", "base", "trinket", "potion", "stat", "quest", "convertible", "collectible", "message_item", "torn_page" ], "action": "get_items_by_classification", "uh": STATE.hash };
  1642. Post(STATE.baseurl + "managers/ajax/users/userInventory.php", params, function(response)
  1643. {
  1644. for (var item = 0; item < response.items.length; item++)
  1645. {
  1646. UpdateInventoryDetail(response.items[item]);
  1647. }
  1648. ShowMessageWindow('');
  1649. LoadInventory();
  1650. });
  1651. }
  1652. else
  1653. {
  1654. var ItemText = "";
  1655. var StartPos = data.indexOf('CraftingInstance.init');
  1656. var EndPos = 0;
  1657. if (StartPos != -1)
  1658. {
  1659. var MaxItemID = -1;
  1660. DSXC_log('Update Crafting Items');
  1661. StartPos = data.indexOf('[', StartPos);
  1662. EndPos = data.indexOf('], ', StartPos);
  1663. var ExtractedData = data.substring(StartPos, EndPos + 1);
  1664. var ItemArray = JSON.parse(ExtractedData);
  1665. for (id = 0; id < ItemArray.length; id++)
  1666. {
  1667. DSXC_setValue('Crafting Item - ' + id, ItemArray[id].name + ',' + ItemArray[id].type + ',' + ItemArray[id].quantity);
  1668. if (id > MaxItemID)
  1669. {
  1670. MaxItemID = id;
  1671. }
  1672. }
  1673. if (MaxItemID > DSXC_getValue('Crafting - Max ID', -1))
  1674. DSXC_setValue('Crafting - Max ID', MaxItemID);
  1675. LoadCrafting();
  1676. }
  1677. UpdateInventory();
  1678. }
  1679. }
  1680.  
  1681. function UpdateInventoryDetail(inventory_item)
  1682. {
  1683. switch (inventory_item.classification)
  1684. {
  1685. case INVENTORY_TYPES_TEXT[INV_TYPE_POTION]:
  1686. {
  1687. var PotionDetails = inventory_item.produced_item.name;
  1688. if (inventory_item.is_enabled)
  1689. {
  1690. for (iCount = 0; iCount < inventory_item.recipe_list.length; iCount++)
  1691. {
  1692. PotionDetails = PotionDetails + "#" + inventory_item.recipe_list[iCount].item.name + "_" + inventory_item.recipe_list[iCount].yield + "_" + inventory_item.recipe_list[iCount].cost;
  1693. }
  1694. }
  1695. else
  1696. {
  1697. PotionDetails = 'disabled';
  1698. }
  1699.  
  1700. DSXC_setValue('Inventory Item - ' + inventory_item.item_id, inventory_item.classification + ',' + inventory_item.name + ',' + inventory_item.type + ',' + inventory_item.quantity + ',' + PotionDetails);
  1701. } break;
  1702. case INVENTORY_TYPES_TEXT[INV_TYPE_BASE]:
  1703. case INVENTORY_TYPES_TEXT[INV_TYPE_WEAPON]:
  1704. {
  1705. DSXC_setValue('Inventory Item - ' + inventory_item.item_id, inventory_item.classification + ',' + inventory_item.name + ',' + inventory_item.type + ',' + inventory_item.quantity + ',' + inventory_item.power_type_name + '_' + inventory_item.power + '_' + inventory_item.power_bonus + '_' + inventory_item.attraction_bonus + '_' + inventory_item.luck + '_' + inventory_item.cheese_effect);
  1706. } break;
  1707.  
  1708. default:
  1709. {
  1710. DSXC_setValue('Inventory Item - ' + inventory_item.item_id, inventory_item.classification + ',' + inventory_item.name + ',' + inventory_item.type + ',' + inventory_item.quantity);
  1711. }
  1712. }
  1713. var item_id = parseInt(inventory_item.item_id);
  1714. if (item_id > DSXC_getValue('Inventory - Max ID', -1))
  1715. DSXC_setValue('Inventory - Max ID', item_id);
  1716. }
  1717.  
  1718. Array.prototype.indexOf = function(test)
  1719. {
  1720. var ReturnValue = -1;
  1721. for (iCount = 0; iCount < this.length && ReturnValue == -1; iCount++)
  1722. {
  1723. if (this[iCount] == test)
  1724. {
  1725. ReturnValue = iCount;
  1726. }
  1727. }
  1728. return ReturnValue;
  1729. }
  1730.  
  1731. Array.prototype.has = function(test)
  1732. {
  1733. var ReturnValue = false;
  1734. for (iCount = 0; iCount < this.length && !ReturnValue; iCount++)
  1735. {
  1736. if (this[iCount] == test)
  1737. {
  1738. ReturnValue = true;
  1739. }
  1740. }
  1741. return ReturnValue;
  1742. }
  1743.  
  1744. function Flatten(obj)
  1745. {
  1746. var flat = "{ ";
  1747. for (var key in obj)
  1748. {
  1749. if (flat != "{ ") flat = flat + ", ";
  1750. if (obj.hasOwnProperty(key))
  1751. {
  1752. var value = obj[key];
  1753. if (null === value || undefined === value)
  1754. {
  1755. continue;
  1756. }
  1757. else
  1758. {
  1759. if (typeof value == "object")
  1760. {
  1761. flat = flat + key + ": " + Flatten(value);
  1762. }
  1763. else
  1764. {
  1765. flat = flat + key + ": " + value;
  1766. }
  1767. }
  1768. }
  1769. }
  1770. return flat + " }";
  1771. }
  1772.  
  1773. function Craft()
  1774. {
  1775. var crafting_item = this.id.substring(8);
  1776. if (crafting_item != -1)
  1777. {
  1778. var total_to_craft = document.getElementById('Craft_Qty').innerHTML;
  1779. ShowCraftingWindow(false);
  1780. CraftItem(crafting_item, total_to_craft);
  1781. }
  1782. }
  1783.  
  1784. function CraftItem(pattern, qty)
  1785. {
  1786. params = { "parts": PATTERNS[pattern][PINGREDIENTS], "uh": STATE.hash, "craftQty": qty };
  1787. Post(STATE.baseurl + "managers/ajax/users/crafting.php", params, function(response)
  1788. {
  1789. ShowCraftingMessage(response);
  1790. if (response.success == 1)
  1791. {
  1792. if (response.inventory != null || response.items != null)
  1793. UpdateInventory(response);
  1794. }
  1795. });
  1796. }
  1797.  
  1798. function TravelTo(destination)
  1799. {
  1800. if (destination == 0)
  1801. {
  1802. Get(STATE.baseurl + 'travel.php?freeTravel=true?&uh=' + STATE.hash, function() { STATE.location = 0; });
  1803. }
  1804. else
  1805. {
  1806. if (STATE.location == -1)
  1807. STATE.location = 0;
  1808.  
  1809. params = { "origin": LOCATION.detail[STATE.location][LLINK], "destination": LOCATION.detail[destination][LLINK], "uh": STATE.hash };
  1810. Post(STATE.baseurl + "managers/ajax/users/changeenvironment.php", params, function() { STATE.location = destination; });
  1811. }
  1812. }
  1813.  
  1814. function Travel()
  1815. {
  1816. var destintation_location = this.className.substring(4);
  1817.  
  1818. if (this.className.indexOf('Buy_') != -1)
  1819. {
  1820. STATE.redirect = 'generalstore.php';
  1821. }
  1822. if (destintation_location != -1)
  1823. {
  1824. CalculateRouteCosts();
  1825. ShowCraftingWindow(false);
  1826. ShowTravelWindow(false);
  1827. if (destintation_location != STATE.location)
  1828. {
  1829. if (STATE.location != -1 && LOCATION.detail[STATE.location][LWARNING])
  1830. {
  1831. var continue_travel = confirm("WARNING: You are in a special location, are you sure you want to leave?");
  1832. if (continue_travel == false)
  1833. return;
  1834. }
  1835. if (STATE.location != -1 && !SETTINGS.direct)
  1836. {
  1837. STATE.route = CalculateRoute(STATE.location, destintation_location);
  1838. }
  1839. else
  1840. {
  1841. STATE.route = [ destintation_location ];
  1842. }
  1843. SetDisplayText(3, 'Travelling');
  1844. TravelTo(STATE.route[0]);
  1845. setTimeout(AutoTravel, 1000);
  1846. }
  1847. }
  1848. }
  1849.  
  1850. var auto_count = 0;
  1851. function AutoTravel()
  1852. {
  1853. if (auto_count >= 5)
  1854. {
  1855. auto_count = 0;
  1856. SetDisplayText(3, 'Travelling');
  1857. }
  1858. else
  1859. {
  1860. auto_count++;
  1861. SetDisplayText(3, GetDisplayText(3) + '.');
  1862. }
  1863. DetermineLocation();
  1864. if (STATE.location == STATE.route[0])
  1865. {
  1866. STATE.route.shift();
  1867. if (STATE.route.length == 0)
  1868. {
  1869. SetDisplayText(3, '');
  1870. ShowMessageWindow('<div class="pagemessage s"><div class="messagetop"></div><div class="messagebody"><div class="messagetitle">Travel</div><div class="messagecontent">You have arrived at your destination.</div></div><div class="messagebottom"></div></div></div>', 5);
  1871. return;
  1872. }
  1873. else
  1874. {
  1875. TravelTo(STATE.route[0]);
  1876. }
  1877. }
  1878. setTimeout(AutoTravel, 1000);
  1879. }
  1880.  
  1881. function SortCraftingArray(a, b)
  1882. {
  1883. var x = a[CRAFTNAME];
  1884. var y = b[CRAFTNAME];
  1885. return ((x < y) ? -1 : ((x > y) ? 1 : 0));
  1886. }
  1887.  
  1888. function ShowCraftingWindow(display)
  1889. {
  1890. var CraftingWindow = CreatePopupWindow('Crafting', 325, 420, display);
  1891. if (CraftingWindow != null)
  1892. {
  1893. var WindowTable = "<TABLE CELLSPACING='0' CELLPADDING='1'>";
  1894. var MaxToCraft = 0;
  1895. var pattern_is_craftable = new Array();
  1896. var travel_craftable = new Array();
  1897. for (count1 = 0; count1 < PATTERNS.length; count1++)
  1898. {
  1899. var can_craft = true;
  1900. var missing_item = -1;
  1901. var total_to_craft = 10000000; // 10 million
  1902. var total_mats = 0;
  1903. var ingredients = PATTERNS[count1][PINGREDIENTS];
  1904. DSXC_log("Cratable State: " + PATTERNS[count1][PNAME]);
  1905. for (var key in ingredients)
  1906. {
  1907. if (ingredients.hasOwnProperty(key))
  1908. {
  1909. var mat_name = key;
  1910. var mat_id = CraftingLookup(mat_name);
  1911. var mat_qty = Number(ingredients[key]);
  1912. total_mats++;
  1913. if (mat_id != -1)
  1914. {
  1915. var current_qty = Number(CRAFTING[mat_id][CRAFTQTY]);
  1916. if (current_qty < mat_qty)
  1917. {
  1918. DSXC_log(" - low quantity of " + mat_name + " (" + CRAFTING[mat_id][CRAFTQTY] + ")");
  1919. total_to_craft = 0;
  1920. can_craft = false;
  1921. }
  1922. else
  1923. {
  1924. mat_to_craft = Math.floor(current_qty / mat_qty);
  1925. total_to_craft = Math.min(mat_to_craft, total_to_craft);
  1926. DSXC_log(" - enough of " + mat_name + " (" + mat_to_craft + ")");
  1927. }
  1928. }
  1929. else
  1930. {
  1931. DSXC_log(" - unknown material " + mat_name);
  1932. total_to_craft = 0;
  1933. can_craft = false;
  1934. }
  1935. }
  1936. }
  1937. if (can_craft || SETTINGS.showall)
  1938. {
  1939. MaxToCraft = Math.max(MaxToCraft, total_to_craft);
  1940. if ((STATE.level + 1) >= total_mats)
  1941. {
  1942. pattern_is_craftable.push( [ count1, total_to_craft ] );
  1943. }
  1944. }
  1945. }
  1946. if (pattern_is_craftable.length > 0)
  1947. {
  1948. var PatternTable = "<TR><TH COLSPAN='2'><I>Craftable</I><br /><br /></TH></TR>";
  1949. PatternTable += "<TR><TD><DIV ID='Craft_Scroll'></DIV><br /></TD><TD STYLE='text-align: right;'><SPAN ID='Craft_Qty'>1</SPAN><br /></TD></TH></TR>";
  1950.  
  1951. for (count1 = 0; count1 < pattern_is_craftable.length; count1++)
  1952. {
  1953. if (pattern_is_craftable[count1][1] == 0)
  1954. {
  1955. PatternTable += "<TR STYLE='font-size: 8px'><TD WIDTH='240'><A HREF='#' ID='Pattern_" + pattern_is_craftable[count1][0] + "' STYLE='color: red'>" + PATTERNS[pattern_is_craftable[count1][0]][PNAME] + "</A></TD><TD STYLE='text-align: right; font-size: 7px; font-weight: bold' WIDTH='50'>" + pattern_is_craftable[count1][1] + "</TD></TR>";
  1956. }
  1957. else
  1958. {
  1959. PatternTable += "<TR STYLE='font-size: 8px'><TD WIDTH='240'><A HREF='#' ID='Pattern_" + pattern_is_craftable[count1][0] + "'>" + PATTERNS[pattern_is_craftable[count1][0]][PNAME] + "</A></TD><TD STYLE='text-align: right; font-size: 7px; font-weight: bold' WIDTH='50'>" + pattern_is_craftable[count1][1] + "</TD></TR>";
  1960. }
  1961. }
  1962. WindowTable += PatternTable;
  1963. WindowTable += "<TR><TD><BR></TD></TR>";
  1964. }
  1965.  
  1966. var IngredientsTable = "<TR><TH COLSPAN='2'><I>Ingredients</I></TH></TR>";
  1967. total_ingredients = 0;
  1968. var SortedArray = CRAFTING.slice(0, CRAFTING.length);
  1969. SortedArray.sort(SortCraftingArray);
  1970. for (count1 = 0; count1 < SortedArray.length; count1++)
  1971. {
  1972. if (SortedArray[count1][CRAFTQTY] > 0 || SETTINGS.showall)
  1973. {
  1974. total_ingredients++;
  1975. IngredientsTable += "<TR STYLE='font-size: 8px;'><TD WIDTH='190'><A HREF=\"" + STATE.baseurl + "item.php?item_type=" + SortedArray[count1][CRAFTDETAIL] + "\">" + SortedArray[count1][CRAFTNAME] + "</A></TD><TD STYLE='text-align: right; font-size: 7px; font-weight: bold' WIDTH='50'><SPAN ID='Crafting_Qty_" + SortedArray[count1][CRAFTID] + "'>" + SortedArray[count1][CRAFTQTY] + "</SPAN></TD></TR>";
  1976. }
  1977. }
  1978.  
  1979. if (total_ingredients > 0)
  1980. {
  1981. WindowTable += IngredientsTable;
  1982. }
  1983. WindowTable += "</TABLE>";
  1984. CraftingWindow.innerHTML = WindowTable;
  1985.  
  1986. if (document.getElementById('Craft_Scroll') != null)
  1987. {
  1988. CreateSlider('Craft_Scroll', 250, 1, Math.min(MaxToCraft, 100), 'Craft_Qty');
  1989. }
  1990.  
  1991. for (count1 = 0; count1 < pattern_is_craftable.length; count1++)
  1992. {
  1993. var Pattern = document.getElementById('Pattern_' + pattern_is_craftable[count1][0]);
  1994. if (Pattern != null)
  1995. {
  1996. Pattern.addEventListener("click", Craft, false);
  1997. Pattern.addEventListener("mouseover", ShowIngredients, false);
  1998. Pattern.addEventListener("mouseout", HideIngredients, false);
  1999. }
  2000. }
  2001. }
  2002. else
  2003. {
  2004. var RecipeWindows = getElementsByPartialId('PatternWindow_');
  2005. for (count1 = 0; count1 < RecipeWindows.length; count1++)
  2006. {
  2007. RecipeWindows[count1].parentNode.removeChild(RecipeWindows[count1]);
  2008. }
  2009. }
  2010. }
  2011.  
  2012. function ShowIngredients()
  2013. {
  2014. var pattern_id = -1;
  2015. if (this.id.indexOf('Pattern') != -1)
  2016. {
  2017. pattern_id = this.id.substring(8);
  2018. }
  2019. else if (this.id.indexOf('Cft') != -1)
  2020. {
  2021. pattern_id = this.id.substring(4);
  2022. }
  2023. if (pattern_id != -1)
  2024. {
  2025. if (document.getElementById('PatternWindow_' + pattern_id) == null)
  2026. {
  2027. var PopupWindow = document.createElement("div");
  2028. PopupWindow.style.position = 'absolute';
  2029. PopupWindow.style.top = (mousePos.y + 18) + "px";
  2030. PopupWindow.style.left = (mousePos.x) + "px";
  2031. PopupWindow.id = "PatternWindow_" + pattern_id;
  2032. var pattern_detail = "<B>" + PATTERNS[pattern_id][PNAME] + "</B><BR><TABLE><TR><TH WIDTH=\"180\">Ingredient</TH><TH WIDTH=\"35\" STYLE='text-align: center;'>Needs</TH><TH WIDTH=\"35\" STYLE='text-align: center;'>Stock</TH></TR>";
  2033. var total_mats = 0;
  2034. var ingredients = PATTERNS[pattern_id][PINGREDIENTS];
  2035. for (var key in ingredients)
  2036. {
  2037. if (ingredients.hasOwnProperty(key))
  2038. {
  2039. total_mats++;
  2040.  
  2041. var mat_name = key;
  2042. var mat_id = CraftingLookup(mat_name);
  2043. var mat_qty = Number(ingredients[key]);
  2044. if (mat_id != -1)
  2045. {
  2046. var current_qty = Number(CRAFTING[mat_id][CRAFTQTY]);
  2047. if (current_qty < mat_qty)
  2048. {
  2049. pattern_detail = pattern_detail + "<TR><TD STYLE='font: 6pt Verdana; color: red'>" + CRAFTING[mat_id][CRAFTNAME] + "</TD><TD STYLE='font: 6pt Verdana; text-align: center;'>" + mat_qty + "</TD><TD STYLE='font: 6pt Verdana; text-align: center;'>" + current_qty + "</TD></TR>";
  2050. }
  2051. else
  2052. {
  2053. pattern_detail = pattern_detail + "<TR><TD STYLE='font: 6pt Verdana; color: black'>" + CRAFTING[mat_id][CRAFTNAME] + "</TD><TD STYLE='font: 6pt Verdana; text-align: center;'>" + mat_qty + "</TD><TD STYLE='font: 6pt Verdana; text-align: center;'>" + current_qty + "</TD></TR>";
  2054. }
  2055. }
  2056. else
  2057. {
  2058. pattern_detail = pattern_detail + "<TR><TD STYLE='font: 6pt Verdana; color: red'>" + mat_name + "</TD><TD STYLE='font: 6pt Verdana; text-align: center;'>" + mat_qty + "</TD><TD STYLE='font: 6pt Verdana; text-align: center;'>0</TD></TR>";
  2059. }
  2060. }
  2061. }
  2062. pattern_detail = pattern_detail + "</TABLE>";
  2063. var height = 30 + (total_mats * 10);
  2064. var width = 250;
  2065. PopupWindow.innerHTML = "<DIV STYLE='position:absolute; z-index:912; background: white; padding: 0px 0px; color: black; border: 1px solid; font: 6pt Verdana; width: " + width + "px; height: " + height + "px;'><DIV STYLE='padding: 5px 5px; text-align: left; overflow: auto; height: 100%; font: 6pt Verdana;'>" + pattern_detail + "</DIV></DIV>";
  2066. document.body.appendChild(PopupWindow);
  2067. }
  2068. }
  2069. }
  2070.  
  2071. function HideIngredients()
  2072. {
  2073. var pattern_id = -1;
  2074. if (this.id.indexOf('Pattern') != -1)
  2075. {
  2076. pattern_id = this.id.substring(8);
  2077. }
  2078. else if (this.id.indexOf('Cft') != -1)
  2079. {
  2080. pattern_id = this.id.substring(4);
  2081. }
  2082. if (pattern_id != -1)
  2083. {
  2084. if (document.getElementById('PatternWindow_' + pattern_id) != null)
  2085. {
  2086. document.getElementById('PatternWindow_' + pattern_id).parentNode.removeChild(document.getElementById('PatternWindow_' + pattern_id));
  2087. }
  2088. }
  2089. }
  2090.  
  2091. function CraftingLookup(name)
  2092. {
  2093. var ReturnValue = -1;
  2094.  
  2095. for (counter = 0; counter < CRAFTING.length && ReturnValue == -1; counter++)
  2096. {
  2097. if (CRAFTING[counter][CRAFTDETAIL] == name)
  2098. {
  2099. ReturnValue = counter
  2100. }
  2101. }
  2102. return ReturnValue;
  2103. }
  2104.  
  2105. function InventoryLookup(name, detail)
  2106. {
  2107. var ReturnValue = -1;
  2108. for (counter = 0; counter < INVENTORY.length && ReturnValue == -1; counter++)
  2109. {
  2110. if (INVENTORY[counter][INVNAME] == name || INVENTORY[counter][INVDETAIL] == detail)
  2111. {
  2112. ReturnValue = counter;
  2113. }
  2114. }
  2115. return ReturnValue;
  2116. }
  2117.  
  2118. function ShowPotionsWindow(display)
  2119. {
  2120. var PotionsWindow = CreatePopupWindow('Potions', 250, 320, display);
  2121. if (PotionsWindow != null)
  2122. {
  2123. var PotionsAvailable = new Array();
  2124. var WindowTable = "<TABLE CELLSPACING='0' CELLPADDING='1'>";
  2125. var MaxToCraft = 0;
  2126. var PotionsTable = "<TR><TH COLSPAN='2'><I>Potions</I></TH></TR><TR><TD><DIV ID='Potion_Scroll'></DIV></TD><TD STYLE='text-align: right;'><SPAN ID='Potion_Qty'>1</SPAN></TD></TH></TR>";
  2127. var TotalPotions = 0;
  2128. for (count1 = 0; count1 < INVENTORY.length; count1++)
  2129. {
  2130. if (INVENTORY[count1][INVQTY] > 0 && INVENTORY[count1][INVTYPE] == INVENTORY_TYPES_TEXT[INV_TYPE_POTION])
  2131. {
  2132. MaxToCraft = Math.max(INVENTORY[count1][INVQTY], MaxToCraft);
  2133. PotionsTable += "<TR STYLE='font-size: 8px'><TD WIDTH='190'>" + INVENTORY[count1][INVNAME] + "</TD><TD STYLE='text-align: right; font-size: 7px; font-weight: bold' WIDTH='50'>" + INVENTORY[count1][INVQTY] + "</TD></TR>";
  2134. PotionsTable += "<TR><TD STYLE='font-size: 7px; font-weight: bold;'>&nbsp;";
  2135.  
  2136. var PotionDetail = INVENTORY[count1][INVEXTRA];
  2137. if (PotionDetail == "disabled")
  2138. {
  2139. PotionsTable += "&nbsp;&nbsp;&nbsp;&nbsp;Not yet available";
  2140. }
  2141. else
  2142. {
  2143. var PotionsArray = PotionDetail.split('#');
  2144. for (count2 = 1; count2 < PotionsArray.length; count2++)
  2145. {
  2146. var ConvertDetail = PotionsArray[count2].split('_');
  2147. PotionsTable += "&nbsp;&nbsp;&nbsp;&nbsp;<A HREF='#' ID='Potion_" + count1 + "_" + (count2 - 1) + "' CLASS='" + ConvertDetail[0] + "_" + INVENTORY[count1][INVNAME] + "'>" + ConvertDetail[1] + "x" + ConvertDetail[0] + "</A>";
  2148. PotionsAvailable.push( [ count1, (count2 - 1) ] );
  2149. }
  2150. }
  2151. PotionsTable += "</TD><TD ID='Potion_Cost_" + count1 +"' STYLE='text-align: right; font-size: 7px; font-weight: bold' WIDTH='50'></TD></TR>";
  2152. TotalPotions++;
  2153. }
  2154. }
  2155. if (TotalPotions > 0)
  2156. {
  2157. WindowTable += PotionsTable;
  2158. WindowTable += "<TR><TD><BR></TD></TR>";
  2159. }
  2160. WindowTable += "</TABLE>";
  2161. PotionsWindow.innerHTML = WindowTable;
  2162. if (document.getElementById('Potion_Scroll') != null)
  2163. {
  2164. CreateSlider('Potion_Scroll', 200, 1, Math.min(MaxToCraft, 50), 'Potion_Qty');
  2165. }
  2166. for (count1 = 0; count1 < PotionsAvailable.length; count1++)
  2167. {
  2168. var PotionLink = document.getElementById('Potion_' + PotionsAvailable[count1][0] + '_' + PotionsAvailable[count1][1]);
  2169. if (PotionLink != null)
  2170. {
  2171. PotionLink.addEventListener("mouseover", UpdatePotionCost, false);
  2172. PotionLink.addEventListener("mouseout", UpdatePotionCost, false);
  2173. PotionLink.addEventListener("click", CraftPotion, false);
  2174. }
  2175. }
  2176. }
  2177. }
  2178.  
  2179. function UpdatePotionCost(ev)
  2180. {
  2181. var PotionType = Number(this.id.substring(7, this.id.indexOf('_', 7)));
  2182. var CheeseType = Number(this.id.substring(this.id.indexOf('_', 7) + 1));
  2183. if (ev.type == 'mouseover')
  2184. {
  2185. var PotionDetail = INVENTORY[PotionType][INVEXTRA];
  2186. if (PotionDetail != "disabled")
  2187. {
  2188. var PotionsArray = PotionDetail.split('#');
  2189. var ConvertDetail = PotionsArray[(CheeseType + 1)].split('_');
  2190. var ConvPrice = Number(ConvertDetail[2]);
  2191. var TotalCheese = Number(ConvertDetail[1]) * Number(document.getElementById('Potion_Qty').innerHTML);
  2192. if (ConvPrice > 0)
  2193. {
  2194. document.getElementById('Potion_Cost_' + PotionType).innerHTML = (TotalCheese * ConvPrice) + 'g';
  2195. }
  2196. else
  2197. {
  2198. document.getElementById('Potion_Cost_' + PotionType).innerHTML = TotalCheese + ' pieces';
  2199. }
  2200. }
  2201. }
  2202. else if (ev.type == 'mouseout')
  2203. {
  2204. if (document.getElementById('Potion_Cost_' + PotionType) != null)
  2205. document.getElementById('Potion_Cost_' + PotionType).innerHTML = '';
  2206. }
  2207. }
  2208.  
  2209. function CraftPotion()
  2210. {
  2211. var PotionType = this.id.substring(7, this.id.indexOf('_', 7));
  2212. var CheeseType = this.id.substring(this.id.indexOf('_', 7) + 1);
  2213. if (INVENTORY[PotionType][INVTYPE] == INVENTORY_TYPES_TEXT[INV_TYPE_POTION])
  2214. {
  2215. var TotalToCraft = document.getElementById('Potion_Qty').innerHTML;
  2216. ShowPotionsWindow(false);
  2217.  
  2218. UsePotion(INVENTORY[PotionType][INVDETAIL], CheeseType, TotalToCraft);
  2219. }
  2220. }
  2221.  
  2222. function UsePotion(potion, cheese, qty)
  2223. {
  2224. params = { "tab": 3, "potion": potion, "uh": STATE.hash, "num_potions": qty, "recipe_index": cheese };
  2225. Post(STATE.baseurl + "managers/ajax/users/usepotion.php", params, function(response)
  2226. {
  2227. ShowCraftingMessage(response);
  2228. if (response.success == 1)
  2229. {
  2230. if (response.inventory != null || response.items != null)
  2231. UpdateInventory(response);
  2232. }
  2233. });
  2234. }
  2235.  
  2236. function ShowCraftingMessage(response)
  2237. {
  2238. if (response.success == 1)
  2239. {
  2240. ShowMessageWindow('<div class="pagemessage msgsuccess"><div class="messagetop"></div><div class="messagebody"><div class="messagetitle">' + response.jsDialog.tokens.title.value + '</div><div class="messagecontent">' + response.jsDialog.tokens.content.value + '</div></div><div class="messagebottom"></div></div></div>', 5);
  2241. }
  2242. else
  2243. {
  2244. ShowMessageWindow('<div class="pagemessage msgerror"><div class="messagetop"></div><div class="messagebody"><div class="messagetitle">' + response.jsDialog.tokens.title.value + '</div><div class="messagecontent">' + response.jsDialog.tokens.content.value + '</div></div><div class="messagebottom"></div></div></div>');
  2245. }
  2246. }
  2247.  
  2248. function ResetWindows()
  2249. {
  2250. DSXC_setValue("Position - Configuration", "90px_300px");
  2251. DSXC_setValue("Position - Crafting", "90px_300px");
  2252. DSXC_setValue("Position - Potions", "90px_300px");
  2253. DSXC_setValue("Position - Travel", "90px_300px");
  2254. }
  2255.  
  2256. function CheckMap(mapdetail)
  2257. {
  2258. var MapAvailable = false;
  2259. if (mapdetail instanceof Array)
  2260. {
  2261. for (var count = 0; count < mapdetail.length && !MapAvailable; count++)
  2262. {
  2263. MapAvailable = CheckMap(mapdetail[count]);
  2264. }
  2265. }
  2266. else
  2267. {
  2268. if (mapdetail != -1 && INVENTORY[mapdetail] != null && INVENTORY[mapdetail][INVQTY] > 0)
  2269. {
  2270. MapAvailable = true;
  2271. }
  2272. }
  2273. return MapAvailable;
  2274. }
  2275.  
  2276.  
  2277. function GetLocationID(locationname)
  2278. {
  2279. var locationid = -1;
  2280. for (count = 0; count < LOCATION.detail.length && locationid == -1; count++)
  2281. {
  2282. if (CheckLocation(locationname, LOCATION.detail[count][LNAME]))
  2283. {
  2284. locationid = count;
  2285. }
  2286. }
  2287. return locationid;
  2288. }
  2289.  
  2290. function CheckLocation(locationname, locations)
  2291. {
  2292. if (locations instanceof Array)
  2293. {
  2294. for (var count = 0; count < locations.length; count++)
  2295. {
  2296. if (CheckLocation(locationname, locations[count]))
  2297. {
  2298. return true;
  2299. }
  2300. }
  2301. }
  2302. else
  2303. {
  2304. if (locationname == locations)
  2305. {
  2306. return true;
  2307. }
  2308. }
  2309. return false;
  2310. }
  2311.  
  2312. function ShowTravelWindow(display)
  2313. {
  2314. var TravelWindow = CreatePopupWindow('Travel', 250, 320, display);
  2315. if (TravelWindow != null)
  2316. {
  2317. CalculateRouteCosts();
  2318. var newHTML = "<TABLE>";
  2319. var region_name = "None";
  2320. var total_found;
  2321. for (count1 = 0; count1 < LOCATION.region.length; count1++)
  2322. {
  2323. newHTML = newHTML + "<TR><TH COLSPAN='2'><I>" + LOCATION.region[count1] + "</I></TH></TR>";
  2324. total_found = 0;
  2325. for (count2 = 0; count2 < LOCATION.detail.length; count2++)
  2326. {
  2327. if (LOCATION.detail[count2][LZONE] == count1 && count2 != STATE.location && LOCATION.detail[count2][LLVL] <= STATE.level && CheckMap(LOCATION.detail[count2][LMAP]))
  2328. {
  2329. var LocationName = LOCATION.detail[count2][LNAME];
  2330. if (LocationName instanceof Array)
  2331. {
  2332. LocationName = LOCATION.detail[count2][LNAME][0];
  2333. }
  2334. var travel_cost = 0;
  2335. if (STATE.location == -1)
  2336. {
  2337. // force travel via Meadow
  2338. travel_cost = LOCATION.costs[0][count2];
  2339. }
  2340. else if (SETTINGS.direct)
  2341. {
  2342. travel_cost = LOCATION.costs[STATE.location][count2];
  2343. }
  2344. else
  2345. {
  2346. travel_cost = LOCATION.distance[STATE.location][count2];
  2347. }
  2348. if (LOCATION.distance[STATE.location][count2] != -99)
  2349. {
  2350. newHTML = newHTML + "<TR STYLE='font-size: 8px'><TD WIDTH='170'><A HREF='#' ID='Loc_" + count2 + "' CLASS='Loc_" + count2 + "'>" + LocationName + "</A></TD><TD STYLE='text-align: right; font-size: 7px; font-weight: bold' WIDTH='70'>" + travel_cost + " gold</TD></TR>";
  2351. total_found++;
  2352. }
  2353. }
  2354. }
  2355. if (total_found == 0)
  2356. {
  2357. newHTML = newHTML + "<TR><TD COLSPAN='2'>Not available<P></TD></TR>";
  2358. }
  2359. else
  2360. {
  2361. newHTML = newHTML + "<TR><TD><BR></TD></TR>";
  2362. }
  2363. }
  2364. newHTML = newHTML + "</TABLE>";
  2365. TravelWindow.innerHTML = newHTML;
  2366. for (count1 = 0; count1 < LOCATION.detail.length; count1++)
  2367. {
  2368. if (document.getElementById('Loc_' + count1) != null) document.getElementById('Loc_' + count1).addEventListener("click", Travel, false);
  2369. }
  2370. }
  2371. }
  2372.  
  2373. function CheckHornState()
  2374. {
  2375. var HornState = getElementsByPartialClass("hornready");
  2376. if (HornState.length > 0)
  2377. {
  2378. if (STATE.hornstate != 1)
  2379. {
  2380. if (SETTINGS.title)
  2381. {
  2382. document.title = 'Now! | ' + STATE.title;
  2383. }
  2384. else
  2385. {
  2386. document.title = STATE.title;
  2387. }
  2388. document.getElementById('MHH_Horn_Timer').innerHTML = '<B>Now!</B>';
  2389. SoundHorn();
  2390. STATE.hornstate = 1;
  2391. }
  2392. }
  2393. else
  2394. {
  2395. DSXC_setValue('Alert - Sound', false);
  2396. HornState = getElementsByPartialClass("hornsounding");
  2397.  
  2398. if (HornState.length > 0)
  2399. {
  2400. if (STATE.hornstate != 2)
  2401. {
  2402. STATE.hornstate = 2;
  2403. }
  2404. }
  2405. else
  2406. {
  2407. if (STATE.hornstate != 0)
  2408. setTimeout(ResetUserObject, 10000);
  2409. STATE.hornstate = 0;
  2410. }
  2411. }
  2412. setTimeout(CheckHornState, 500);
  2413. }
  2414.  
  2415. function ResetUserObject()
  2416. {
  2417. InitUserObject(unsafeWindow.user);
  2418. }
  2419.  
  2420. function GetTimeout()
  2421. {
  2422. return new Date().valueOf(); // milliseconds since 1 Jan 1970
  2423. }
  2424.  
  2425. function KingsRewardTimer()
  2426. {
  2427. var TimeLeft = CheckTimeout('Update - Kings Reward', 0, 3);
  2428. var KRTimerString = UpdateTimer(TimeLeft, true);
  2429. var KRTimer = document.getElementById('MHH_Kings_Reward_Timer');
  2430. if (KRTimer != null) KRTimer.innerHTML = KRTimerString;
  2431. if (TimeLeft > 0)
  2432. {
  2433. setTimeout(KingsRewardTimer, 10000);
  2434. }
  2435. }
  2436.  
  2437. function InventoryTimer()
  2438. {
  2439. CheckInventory(SETTINGS.length);
  2440. setTimeout(InventoryTimer, 30000);
  2441. }
  2442.  
  2443. function CurrentTimeStamp()
  2444. {
  2445. return parseInt(new Date().getTime().toString().substring(0, 10));
  2446. }
  2447.  
  2448. function HornCountdownTimer()
  2449. {
  2450. var Start = GetTimeout();
  2451. if (STATE.hornstate == 0)
  2452. {
  2453. if (STATE.userobject != null)
  2454. {
  2455. if (STATE.userobject.has_puzzle)
  2456. {
  2457. STATE.king = true;
  2458. DSXC_setValue('Alert - Sound', false);
  2459. if (!DSXC_getValue('Alert - Kings Reward', false))
  2460. {
  2461. DSXC_setValue('Alert - Kings Reward', true);
  2462. if (SETTINGS.king & STATE_SOUND)
  2463. {
  2464. AlertSound(AUDIO.reward);
  2465. }
  2466. if (SETTINGS.king & STATE_MESSAGE)
  2467. {
  2468. alert('Claim a King\'s Reward to continue hunting');
  2469. }
  2470. }
  2471. }
  2472. else
  2473. {
  2474. DSXC_setValue('Alert - Kings Reward', false);
  2475. }
  2476.  
  2477. var TimeRemaining = STATE.userobject.activeturn_wait_seconds - (CurrentTimeStamp() - STATE.userobject.last_activeturn_timestamp);
  2478. var HornTimerString = UpdateTimer(TimeRemaining, false);
  2479. if (SETTINGS.title)
  2480. {
  2481. document.title = HornTimerString + ' | ' + STATE.title;
  2482. }
  2483. else
  2484. {
  2485. document.title = STATE.title;
  2486. }
  2487. var HornTimer = document.getElementById('MHH_Horn_Timer');
  2488. if (HornTimer != null) HornTimer.innerHTML = HornTimerString;
  2489. }
  2490. }
  2491.  
  2492. var End = GetTimeout();
  2493. setTimeout(HornCountdownTimer, ((SETTINGS.length * 1000) - (End - Start)));
  2494. }
  2495.  
  2496. function HornSoundedEvent(aEvent)
  2497. {
  2498. var newData = JSON.parse(aEvent.newValue);
  2499.  
  2500. if (newData.last_read_journal_entry_id != 0)
  2501. DSXC_setValue('STATE.lastjournal', newData.last_read_journal_entry_id);
  2502. if (newData.user != null)
  2503. InitUserObject(newData.user);
  2504. }
  2505.  
  2506. function BaitTimer()
  2507. {
  2508. var BaitValue = document.getElementById('hud_baitName');
  2509. if (BaitValue != null)
  2510. {
  2511. if (BaitValue.innerHTML.indexOf('None!') != -1)
  2512. {
  2513. if (!DSXC_getValue('Alert - Cheese', false))
  2514. {
  2515. DSXC_setValue('Alert - Cheese', true);
  2516. if (SETTINGS.cheese & STATE_SOUND)
  2517. {
  2518. AlertSound(AUDIO.cheese);
  2519. }
  2520. if (SETTINGS.cheese & STATE_MESSAGE)
  2521. {
  2522. alert('You are out of cheese. Rebait to continue hunting.');
  2523. }
  2524. }
  2525. }
  2526. else
  2527. {
  2528. DSXC_setValue('Alert - Cheese', false);
  2529. }
  2530. }
  2531. setTimeout(BaitTimer, (SETTINGS.length * 1000));
  2532. }
  2533.  
  2534. var CurrentURLTimer = -1;
  2535.  
  2536. function LocationCheckTimer()
  2537. {
  2538. if (SETTINGS.washed > 0)
  2539. {
  2540. if (STATE.userobject != null)
  2541. {
  2542. var ExpectedLocation = DSXC_getValue('STATE.location', 'None');
  2543. if (ExpectedLocation == 'Balack\'s Cove' && ExpectedLocation != STATE.userobject.location)
  2544. {
  2545. if (!DSXC_getValue('Alert - Washed Away', false))
  2546. {
  2547. DSXC_setValue('Alert - Washed Away', true);
  2548. if (SETTINGS.washed & STATE_SOUND)
  2549. {
  2550. AlertSound(AUDIO.washed);
  2551. }
  2552. if (SETTINGS.washed & STATE_MESSAGE)
  2553. {
  2554. alert('You have been washed away from Balack\'s Cove. I would recomend changing your bait before continuing to hunt.');
  2555. }
  2556. }
  2557. }
  2558. else
  2559. {
  2560. DSXC_setValue('Alert - Washed Away', false);
  2561. }
  2562. }
  2563. }
  2564. var CurrentTime = CurrentTimeStamp();
  2565. for (iCount1 = 0; iCount1 < LOCATION_TIMERS.length; iCount1++)
  2566. {
  2567. if (typeof LOCATION_TIMERS[iCount1][1].url != 'undefined')
  2568. {
  2569. // retrieve from script values, check for timeout, request url
  2570. var Remaining = CheckTimeout(LOCATION_TIMERS[iCount1][0] + ' - Last Update', 10, 0)
  2571. if (CurrentURLTimer == -1 && Remaining == 0)
  2572. {
  2573. CurrentURLTimer = iCount1;
  2574. ResetTimeout(LOCATION_TIMERS[iCount1][0] + ' - Last Update');
  2575. // read from URL
  2576. //Post(LOCATION_TIMERS[iCount1][1].url, null, function(text) {
  2577. Get(LOCATION_TIMERS[iCount1][1].url, function(text) {
  2578. if (text != 'Can\'t connect to MySQL')
  2579. {
  2580. var LocationData = JSON.parse(text);
  2581. if (typeof LocationData.next_move != 'undefined')
  2582. {
  2583. var TimeRemaining = LocationData.next_move;
  2584. if (LocationData.location == '???')
  2585. TimeRemaining = -1;
  2586. DSXC_setValue(LOCATION_TIMERS[CurrentURLTimer][0] + ' - Location', LocationData.location);
  2587. DSXC_setValue(LOCATION_TIMERS[CurrentURLTimer][0] + ' - Next Move', UpdateTimer(TimeRemaining, true));
  2588. }
  2589. else if (typeof LocationData.level != 'undefined')
  2590. {
  2591. // update the current level to be able to travel
  2592. LOCATION.detail[15][LLVL] = GetLevel(LocationData.level);
  2593. DSXC_setValue(LOCATION_TIMERS[CurrentURLTimer][0] + ' - Location', LocationData.level);
  2594. if (LocationData.percent == -1)
  2595. DSXC_setValue(LOCATION_TIMERS[CurrentURLTimer][0] + ' - Next Move', 'Unknown');
  2596. else
  2597. DSXC_setValue(LOCATION_TIMERS[CurrentURLTimer][0] + ' - Next Move', (100 - LocationData.percent) + '%');
  2598. }
  2599. }
  2600. else
  2601. {
  2602. DSXC_setValue(LOCATION_TIMERS[CurrentURLTimer][0] + ' - Location', '???');
  2603. }
  2604. CurrentURLTimer = -1;
  2605. });
  2606. }
  2607.  
  2608. document.getElementById('MHH_Location_' + iCount1 + '_State').innerHTML = '<font color="green">' + DSXC_getValue(LOCATION_TIMERS[iCount1][0] + ' - Location') + '</font>';
  2609. document.getElementById('MHH_Location_' + iCount1 + '_Change').innerHTML = DSXC_getValue(LOCATION_TIMERS[iCount1][0] + ' - Next Move');
  2610. }
  2611. else
  2612. {
  2613. var CurrentName = -1;
  2614. var CurrentBreakdown = 0;
  2615. var TotalBreakdown = 0;
  2616. for (iCount2 = 0; iCount2 < LOCATION_TIMERS[iCount1][1].breakdown.length; iCount2++)
  2617. {
  2618. TotalBreakdown += LOCATION_TIMERS[iCount1][1].breakdown[iCount2];
  2619. }
  2620. var CurrentValue = Math.floor((CurrentTime - LOCATION_TIMERS[iCount1][1].first) / LOCATION_TIMERS[iCount1][1].length) % TotalBreakdown;
  2621. for (iCount2 = 0; iCount2 < LOCATION_TIMERS[iCount1][1].breakdown.length && CurrentName == -1; iCount2++)
  2622. {
  2623. CurrentBreakdown += LOCATION_TIMERS[iCount1][1].breakdown[iCount2];
  2624. if (CurrentValue < CurrentBreakdown)
  2625. {
  2626. CurrentName = iCount2;
  2627. }
  2628. }
  2629. var SeasonLength = (LOCATION_TIMERS[iCount1][1].length * LOCATION_TIMERS[iCount1][1].breakdown[CurrentName]);
  2630. var CurrentTimer = (CurrentTime - LOCATION_TIMERS[iCount1][1].first);
  2631. var SeasonRemaining = 0;
  2632. while (CurrentTimer > 0)
  2633. {
  2634. for (iCount2 = 0; iCount2 < LOCATION_TIMERS[iCount1][1].breakdown.length && CurrentTimer > 0; iCount2++)
  2635. {
  2636. SeasonRemaining = CurrentTimer;
  2637. CurrentTimer -= (LOCATION_TIMERS[iCount1][1].length * LOCATION_TIMERS[iCount1][1].breakdown[iCount2])
  2638. }
  2639. }
  2640. SeasonRemaining = SeasonLength - SeasonRemaining;
  2641. document.getElementById('MHH_Location_' + iCount1 + '_State').innerHTML = '<font color="' + LOCATION_TIMERS[iCount1][1].color[CurrentName] + '">' + LOCATION_TIMERS[iCount1][1].name[CurrentName] + '</font>';
  2642. if (LOCATION_TIMERS[iCount1][1].effective != null)
  2643. {
  2644. document.getElementById('MHH_Location_' + iCount1 + '_State').innerHTML += ' (' + LOCATION_TIMERS[iCount1][1].effective[CurrentName] + ')';
  2645. }
  2646. document.getElementById('MHH_Location_' + iCount1 + '_Change').innerHTML = UpdateTimer(SeasonRemaining, true);
  2647. }
  2648. }
  2649. if (STATE.userobject != null)
  2650. {
  2651. if (STATE.userobject.location == 'Seasonal Garden')
  2652. {
  2653. if (STATE.userobject.viewing_atts.zzt_amplifier == STATE.userobject.viewing_atts.zzt_max_amplifier)
  2654. {
  2655. if (!DSXC_getValue('Alert - Max Amplifier', false))
  2656. {
  2657. DSXC_setValue('Alert - Max Amplifier', true);
  2658. if (SETTINGS.season & STATE_SOUND)
  2659. {
  2660. AlertSound(AUDIO.maxamp);
  2661. }
  2662. if (SETTINGS.season & STATE_MESSAGE)
  2663. {
  2664. alert('You have reached your maximum for Zugzwang\'s Tower Amplifier. Time to head inside!');
  2665. }
  2666. }
  2667. }
  2668. else
  2669. {
  2670. DSXC_setValue('Alert - Max Amplifier', false);
  2671. }
  2672. }
  2673. var SeasonIcon = document.getElementById('hud_seasonIcon');
  2674. if (SeasonIcon != null)
  2675. {
  2676. var CurrentSeason = DSXC_getValue('Current Season', 'none');
  2677. if (CurrentSeason != 'none' && CurrentSeason != SeasonIcon.className)
  2678. {
  2679. if (!DSXC_getValue('Alert - Season Change', false))
  2680. {
  2681. DSXC_setValue('Alert - Season Change', true);
  2682. if (SETTINGS.season & STATE_SOUND)
  2683. {
  2684. AlertSound(AUDIO.season);
  2685. }
  2686. if (SETTINGS.season & STATE_MESSAGE)
  2687. {
  2688. var AlertText = 'The season has changed, make sure you change your trap. ';
  2689. switch (SeasonIcon.className)
  2690. {
  2691. case ' seasonicon sr': AlertText = AlertText + 'It is now Summer, using a Tactical trap is most effective.'; break;
  2692. case ' seasonicon fl': AlertText = AlertText + 'It is now Fall, using a Shadow trap is most effective.'; break;
  2693. case ' seasonicon wr': AlertText = AlertText + 'It is now Winter, using a Hydro trap is most effective.'; break;
  2694. case ' seasonicon sg': AlertText = AlertText + 'It is now Spring, using a Physical or Tactical trap is most effective.'; break;
  2695. }
  2696. alert(AlertText);
  2697. }
  2698. }
  2699. }
  2700. else
  2701. {
  2702. DSXC_setValue('Alert - Season Change', false);
  2703. }
  2704. DSXC_setValue('Current Season', SeasonIcon.className);
  2705. }
  2706. }
  2707. else
  2708. {
  2709. DSXC_setValue('Current Season', 'none');
  2710. }
  2711. setTimeout(LocationCheckTimer, 10000);
  2712. }
  2713.  
  2714. function StartTimers()
  2715. {
  2716. if (STATE.maintenance)
  2717. {
  2718. // if in maintenance, do nothing
  2719. }
  2720. else
  2721. {
  2722. // check every 30 seconds
  2723. InventoryTimer();
  2724. UpdateQuestProgress();
  2725. // check every 10 seconds
  2726. KingsRewardTimer();
  2727. LocationCheckTimer();
  2728. // check every second
  2729. BaitTimer();
  2730. HornCountdownTimer();
  2731. TournamentTimer();
  2732. // background timer for horn sounding
  2733. CheckHornState();
  2734. }
  2735. }
  2736.  
  2737. function GetDisplayText(id)
  2738. {
  2739. var DisplayWindowText = 'MHH_Display_' + id;
  2740. var DisplayWindow = document.getElementById(DisplayWindowText);
  2741. if (DisplayWindow != null)
  2742. {
  2743. return DisplayWindow.innerHTML;
  2744. }
  2745. else
  2746. {
  2747. return '';
  2748. }
  2749. }
  2750.  
  2751. function SetDisplayText(id, text)
  2752. {
  2753. var DisplayWindowText = 'MHH_Display_' + id;
  2754. var DisplayWindow = document.getElementById(DisplayWindowText);
  2755. if (DisplayWindow != null)
  2756. {
  2757. DisplayWindow.innerHTML = text;
  2758. }
  2759. else
  2760. {
  2761. DisplayState();
  2762. DisplayTimers();
  2763. SetDisplayText(id, text);
  2764. }
  2765. }
  2766.  
  2767. function UpdatePercentage(percent)
  2768. {
  2769. var DisplayProgress = document.getElementById('hud_titlePercentage');
  2770. if (DisplayProgress != null) DisplayProgress.innerHTML = percent;
  2771. }
  2772.  
  2773. function ShowJournalWindow(display)
  2774. {
  2775. var JournalWindow = CreatePopupWindow('Journal Summary', 275, 380, display);
  2776. if (JournalWindow != null)
  2777. {
  2778. STATE.lastjournal = DSXC_getValue('STATE.lastjournal', 51);
  2779. JournalWindow.innerHTML = "<B>Catches:</B><BR /><DIV ID=\"MH_Journal_Catches\" STYLE=\"font: 8pt Verdana\"><I>Updating...</I></DIV><BR /><B>Gold and Points:</B><BR /><DIV ID=\"MH_Journal_Gains\" STYLE=\"font: 8pt Verdana\"><I>Updating...</I></DIV><BR /><B>Loot:</B><BR /><DIV ID=\"MH_Journal_Loot\" STYLE=\"font: 8pt Verdana\"><I>Updating...</I></DIV><BR />";
  2780. JournalSummary();
  2781. }
  2782. }
  2783.  
  2784. function JournalSummary()
  2785. {
  2786. DSXC_log("UpdateJournalSummary");
  2787. var journal = STATE.lastjournal - 50;
  2788. if (journal < 1)
  2789. journal = 1;
  2790. params = { "last_read_journal_entry_id": journal, "uh": STATE.hash };
  2791. Post(STATE.baseurl + "managers/ajax/turns/activeturn.php", params, UpdateJournalSummary);
  2792. }
  2793.  
  2794. var TotalCatches;
  2795. var TotalGold;
  2796. var TotalGoldStolen;
  2797. var TotalPoints;
  2798. var TotalPointsLost;
  2799. var TotalWeight;
  2800.  
  2801. var ArrayMouse;
  2802. var ArrayLoot;
  2803.  
  2804. function UpdateJournalSummary(response)
  2805. {
  2806. STATE.lastjournal = response.last_read_journal_entry_id;
  2807. DSXC_setValue('STATE.lastjournal', STATE.lastjournal);
  2808. DSXC_log(" - last journal read " + response.last_read_journal_entry_id);
  2809. if (response.journal_markup != null && response.journal_markup.length > 0)
  2810. {
  2811. DSXC_log(" - found " + response.journal_markup.length + " journal entries");
  2812. TotalCatches = 0;
  2813. TotalMisses = 0;
  2814. TotalFailures = 0;
  2815. TotalGold = 0;
  2816. TotalGoldStolen = 0;
  2817. TotalPoints = 0;
  2818. TotalPointsLost = 0;
  2819. TotalWeight = 0;
  2820. ArrayMouse = Array();
  2821. ArrayLoot = Array();
  2822. for (var count = 0; count < response.journal_markup.length; count++)
  2823. {
  2824. var journal_entry = response.journal_markup[count];
  2825. if (journal_entry.publish_data != null)
  2826. {
  2827. var szJournalType = journal_entry.publish_data.attachment.name;
  2828. var szJournalText = journal_entry.publish_data.attachment.description;
  2829. if (szJournalType.indexOf('I caught ') != -1 && szJournalType.indexOf('I caught an elusive Relic Hunter') == -1 && szJournalType.indexOf(' in a row!') == -1 && szJournalType.indexOf(' and was pulled through') == -1)
  2830. {
  2831. TotalCatches++;
  2832. iJournalStartPos = szJournalText.indexOf('I caught a') + 11;
  2833. iJournalEndPos = szJournalText.indexOf(' lb.', iJournalStartPos);
  2834. if (iJournalEndPos != -1)
  2835. {
  2836. TotalWeight = TotalWeight + (Number(szJournalText.substring(iJournalStartPos, iJournalEndPos)) * 16);
  2837. iJournalStartPos = iJournalEndPos + 5;
  2838. }
  2839. iJournalEndPos = szJournalText.indexOf(' oz.', iJournalStartPos);
  2840. TotalWeight = TotalWeight + Number(szJournalText.substring(iJournalStartPos, iJournalEndPos));
  2841. iJournalStartPos = iJournalEndPos + 5;
  2842. iJournalEndPos = szJournalText.indexOf(' worth', iJournalStartPos);
  2843. szCurrentMouse = szJournalText.substring(iJournalStartPos, iJournalEndPos);
  2844. AddMouse(szCurrentMouse);
  2845. iJournalStartPos = szJournalText.indexOf(' worth ', iJournalEndPos) + 7;
  2846. iJournalEndPos = szJournalText.indexOf(' points and ', iJournalStartPos);
  2847. TotalPoints = TotalPoints + Number(szJournalText.substring(iJournalStartPos, iJournalEndPos).replace(/,/g, ""));
  2848. iJournalStartPos = iJournalEndPos + 12;
  2849. iJournalEndPos = szJournalText.indexOf(' gold', iJournalStartPos);
  2850. TotalGold = TotalGold + Number(szJournalText.substring(iJournalStartPos, iJournalEndPos).replace(/,/g, ""));
  2851. iJournalStartPos = szJournalText.indexOf('dropped the following loot:', iJournalEndPos)
  2852. if (iJournalStartPos != -1)
  2853. {
  2854. var LootText = szJournalText.substring(iJournalStartPos + 27);
  2855. var LootItems = Array();
  2856.  
  2857. if (LootText.indexOf(" and ") != -1)
  2858. {
  2859. var TempLootItems = LootText.split(" and ");
  2860. LootItems.push(TempLootItems[1]);
  2861. if (LootText.indexOf(", ") != -1)
  2862. LootItems.concat(TempLootItems[0].split(", "));
  2863. else
  2864. LootItems.push(TempLootItems[0]);
  2865. }
  2866. else
  2867. {
  2868. LootItems.push(LootText);
  2869. }
  2870. for (var count2 = 0; count2 < LootItems.length; count2++)
  2871. {
  2872. iJournalStartPos = LootItems[count2].indexOf(' ');
  2873. iQuantity = Number(LootItems[count2].substring(0, iJournalStartPos));
  2874. szItemName = LootItems[count2].substring(iJournalStartPos);
  2875. AddLoot(szItemName, iQuantity);
  2876. }
  2877. }
  2878. }
  2879. else if (szJournalType.indexOf('I failed to catch ') != -1)
  2880. {
  2881. TotalMisses++;
  2882. if (szJournalText.indexOf('Additionally, ') != -1)
  2883. {
  2884. iJournalStartPos = szJournalText.indexOf(' pillaged ');
  2885. if (iJournalStartPos != -1)
  2886. {
  2887. iJournalStartPos = iJournalStartPos + 10;
  2888. iJournalEndPos = szJournalText.indexOf(' gold');
  2889. TotalGoldStolen = TotalGoldStolen + Number(szJournalText.substring(iJournalStartPos, iJournalEndPos).replace(/,/g, ""));
  2890. }
  2891. iJournalStartPos = szJournalText.indexOf(' setting me back ');
  2892. if (iJournalStartPos != -1)
  2893. {
  2894. iJournalStartPos = iJournalStartPos + 17;
  2895. iJournalEndPos = szJournalText.indexOf(' points!');
  2896. TotalPointsLost = TotalPointsLost + Number(szJournalText.substring(iJournalStartPos, iJournalEndPos).replace(/,/g, ""));
  2897. }
  2898. }
  2899. }
  2900. else if (szJournalType.indexOf('I failed to attract ') != -1)
  2901. {
  2902. TotalFailures++;
  2903. }
  2904. }
  2905. }
  2906. UpdateJournalDisplay();
  2907. }
  2908. }
  2909.  
  2910. function UpdateJournalDisplay()
  2911. {
  2912. ArrayMouse.sort(compare);
  2913. szJournalText = "";
  2914. for (iCount = 0; iCount < ArrayMouse.length; iCount++)
  2915. {
  2916. if (iCount > 0)
  2917. szJournalText = szJournalText + ", ";
  2918. szJournalText = szJournalText + ArrayMouse[iCount].value + " " + ArrayMouse[iCount].name;
  2919. }
  2920. szJournalText = szJournalText + "<BR /><BR />Total catches: " + TotalCatches + "<BR />Total misses: " + TotalMisses + "<BR />FTA / Stale: " + TotalFailures + "<BR />Average weight: " + Math.round(TotalWeight / TotalCatches) + " oz.";
  2921. if (document.getElementById('MH_Journal_Catches') != null) document.getElementById('MH_Journal_Catches').innerHTML = szJournalText;
  2922. szJournalText = addCommas(TotalGold) + " gold gained, " + addCommas(TotalGoldStolen) + " gold lost<BR />";
  2923. szJournalText = szJournalText + addCommas(TotalPoints) + " points gained, " + addCommas(TotalPointsLost) + " points lost<BR />";
  2924. szJournalText = szJournalText + addCommas((TotalGold - TotalGoldStolen)) + " net gold, " + addCommas((TotalPoints - TotalPointsLost)) + " net points<BR />";
  2925. if (document.getElementById('MH_Journal_Gains') != null) document.getElementById('MH_Journal_Gains').innerHTML = szJournalText;
  2926.  
  2927. szJournalText = "None";
  2928. if (ArrayLoot.length > 0)
  2929. {
  2930. ArrayLoot.sort(compare);
  2931. szJournalText = "";
  2932. for (iCount = 0; iCount < ArrayLoot.length; iCount++)
  2933. {
  2934. szJournalText = szJournalText + ArrayLoot[iCount].name + " (x" + ArrayLoot[iCount].quantity + ")<BR />";
  2935. }
  2936. }
  2937. if (document.getElementById('MH_Journal_Loot') != null) document.getElementById('MH_Journal_Loot').innerHTML = szJournalText;
  2938. }
  2939.  
  2940. function AddMouse(szMouseName)
  2941. {
  2942. var MouseIndex = -1;
  2943. for (var count = 0; count < ArrayMouse.length && MouseIndex == -1; count++)
  2944. {
  2945. if (ArrayMouse[count].name == szMouseName)
  2946. MouseIndex = count;
  2947. }
  2948. if (MouseIndex == -1)
  2949. ArrayMouse.push({ name: szMouseName, value: 1 });
  2950. else
  2951. ArrayMouse[MouseIndex].value++;
  2952. }
  2953.  
  2954. function AddLoot(szItemName, iQty)
  2955. {
  2956. if (iQty > 1)
  2957. {
  2958. if (szItemName.substr(-3) == "ies")
  2959. szItemName = szItemName.substr(0, szItemName.length - 3)+"y";
  2960. if (szItemName.substr(-2) == "'s")
  2961. szItemName = szItemName.substr(0, szItemName.length - 2);
  2962. if (szItemName.substr(-1) == "s")
  2963. szItemName = szItemName.substr(0, szItemName.length - 1);
  2964. }
  2965. var LootIndex = -1;
  2966. for (var count = 0; count < ArrayLoot.length && LootIndex == -1; count++)
  2967. {
  2968. if (ArrayLoot[count].name == szItemName)
  2969. LootIndex = count;
  2970. }
  2971. if (LootIndex == -1)
  2972. ArrayLoot.push({ name: szItemName, quantity: iQty });
  2973. else
  2974. ArrayLoot[LootIndex].quantity += iQty;
  2975. }
  2976.  
  2977. function compare(a, b)
  2978. {
  2979. if (a.name < b.name)
  2980. return -1;
  2981. if (a.name > b.name)
  2982. return 1;
  2983. return 0;
  2984. }
  2985.  
  2986. function addCommas(nStr)
  2987. {
  2988. nStr += '';
  2989. x = nStr.split('.');
  2990. x1 = x[0];
  2991. x2 = x.length > 1 ? '.' + x[1] : '';
  2992. var rgx = /(\d+)(\d{3})/;
  2993. while (rgx.test(x1)) {
  2994. x1 = x1.replace(rgx, '$1' + ',' + '$2');
  2995. }
  2996. return x1 + x2;
  2997. }
  2998.  
  2999. function TournamentTimer()
  3000. {
  3001. setTimeout(TournamentTimer, 10000);
  3002. if (SETTINGS.tourney != STATE_OFF)
  3003. {
  3004. if (STATE.userobject != null && typeof(STATE.userobject.viewing_atts.tournament) != 'undefined')
  3005. {
  3006. var tournament = STATE.userobject.viewing_atts.tournament;
  3007. if (STATE.tourney == -1)
  3008. STATE.tourney = tournament.seconds_remaining;
  3009. else
  3010. STATE.tourney = STATE.tourney - 10;
  3011. if (tournament.status == "pending" && STATE.tourney > 0)
  3012. {
  3013. if (STATE.tourney < 300)
  3014. {
  3015. var lastAlert = DSXC_getValue("Alert - Tournament", -1);
  3016. if (lastAlert != tournament.tournament_id)
  3017. {
  3018. DSXC_setValue('Alert - Tournament', tournament.tournament_id);
  3019. if (SETTINGS.tourney & STATE_SOUND)
  3020. {
  3021. AlertSound(AUDIO.tourney);
  3022. }
  3023. if (SETTINGS.tourney & STATE_MESSAGE)
  3024. {
  3025. alert('Your tournament is about to start');
  3026. }
  3027. }
  3028. }
  3029. else if (STATE.tourney < 1200)
  3030. {
  3031. var lastAlert = DSXC_getValue("Alert - Tournament Early Warning", -1);
  3032. if (lastAlert != tournament.tournament_id)
  3033. {
  3034. DSXC_setValue('Alert - Tournament Early Warning', tournament.tournament_id);
  3035. if (SETTINGS.tourney & STATE_SOUND)
  3036. {
  3037. AlertSound(AUDIO.tourney);
  3038. }
  3039. if (SETTINGS.tourney & STATE_MESSAGE)
  3040. {
  3041. alert('Your tournament will start in around 20 minutes');
  3042. }
  3043. }
  3044. }
  3045. }
  3046. }
  3047. }
  3048. }
  3049.  
  3050. function IcebergProgress()
  3051. {
  3052. var progress = getElementById('MHH_Iceberg_Progress');
  3053. if (progress == null)
  3054. {
  3055. var iceberg = getElementsByPartialClass("depth");
  3056. var depth = iceberg[0];
  3057. if (depth != null)
  3058. {
  3059. var progress = document.createElement("div");
  3060. progress.id = "MHH_Iceberg_Progress";
  3061. progress.style.fontSize = "10px";
  3062. depth.appendChild(progress);
  3063. }
  3064. }
  3065. return progress;
  3066. }
  3067.  
  3068. function UpdateIcebergProgress()
  3069. {
  3070. var quest = STATE.userobject.quests.QuestIceberg;
  3071. var turnsTaken = quest.turns_taken;
  3072. var currentDepth = quest.user_progress;
  3073. var maxTurns = quest.max_turns;
  3074. var maxDepth = quest.max_depth;
  3075. if (quest.in_bonus)
  3076. {
  3077. var avgPerHunt = currentDepth / turnsTaken;
  3078. var currentRate = turnsTaken + ((2000 - currentDepth) / avgPerHunt);
  3079. var status = "Current rate " + avgPerHunt.toFixed(2) + "', complete by #" + Math.ceil(currentRate) + "<BR>";
  3080. var color = "Lime";
  3081.  
  3082. if (Math.abs(currentRate - 250) <= 2)
  3083. color = "Yellow";
  3084. else if (avgPerHunt < reqPerHunt)
  3085. color = "Red";
  3086. var reqPerHunt = (2000 - currentDepth) / (250 - turnsTaken);
  3087. status = "<FONT COLOR='" + color + "'>Hidden Depths: " + reqPerHunt.toFixed(2) + "'</FONT> ";
  3088. }
  3089. else
  3090. {
  3091. var avgPerHunt = currentDepth / turnsTaken;
  3092. var currentRate = turnsTaken + ((maxDepth - currentDepth) / avgPerHunt);
  3093. var status = "Current rate " + avgPerHunt.toFixed(2) + "', complete by #" + Math.ceil(currentRate) + "<BR>";
  3094. var totalShown = 0;
  3095. if (turnsTaken < quest.chests[0].turn)
  3096. {
  3097. if (quest.chests.length < 4)
  3098. quest.chests.push({"id":4,"name":"Hidden Depths","turn":250,"active":(turnsTaken <= 250),"position":400});
  3099. for (var count = (quest.chests.length - 1); count >= 0 && totalShown < 2; count--)
  3100. {
  3101. if (turnsTaken < quest.chests[count].turn)
  3102. {
  3103. var reqPerHunt = maxDepth / quest.chests[count].turn;
  3104. var color = "Lime";
  3105.  
  3106. if (Math.abs(avgPerHunt - reqPerHunt) <= 0.1)
  3107. color = "Yellow";
  3108. else if (avgPerHunt < reqPerHunt)
  3109. color = "Red";
  3110. status = status + "<FONT COLOR='" + color + "'>" + quest.chests[count].name + ": " + reqPerHunt.toFixed(2) + "'</FONT> ";
  3111. totalShown++;
  3112. }
  3113. }
  3114. }
  3115. if (totalShown == 0)
  3116. {
  3117. status = status + "<FONT COLOR='Red'><B>Better luck next time!</B></FONT>";
  3118. }
  3119. }
  3120. var progress = IcebergProgress();
  3121. if (progress != null)
  3122. progress.innerHTML = status;
  3123. }
  3124.  
  3125. function UpdateEssences(essences, essence)
  3126. {
  3127. if (essence == null) essence = 'essence_a_crafting_item';
  3128. var addon = 0;
  3129. var prisms = 0;
  3130. var reached = false;
  3131. var essence_name = "A";
  3132. for (var count = 0; count < essences.length; count++)
  3133. {
  3134. var spanElement = getElementById('MHH_' + essences[count].type);
  3135. if (typeof(spanElement) != "undefined")
  3136. {
  3137. if (reached)
  3138. {
  3139. spanElement.innerHTML = essences[count].quantity;
  3140. }
  3141. else
  3142. {
  3143. if (addon > 0)
  3144. essence_name = essences[count].type.substring(8, 9).toUpperCase()
  3145. prisms += addon;
  3146. if (essences[count].type == essence)
  3147. {
  3148. reached = true;
  3149. spanElement.innerHTML = (essences[count].quantity + addon);
  3150. if (addon > 0)
  3151. spanElement.parentNode.title = spanElement.parentNode.currentTitle + ' - needs ' + prisms + ' prisms';
  3152. addon = 0;
  3153. }
  3154. else
  3155. {
  3156. var quantity = essences[count].quantity + addon;
  3157. spanElement.innerHTML = (quantity % 3);
  3158. addon = Math.floor(quantity / 3);
  3159. }
  3160. }
  3161. }
  3162. }
  3163. }
  3164.  
  3165. function UpdateLivingGardenProgress(quest)
  3166. {
  3167. var progress = getElementsByPartialId('MHH_essence_');
  3168. if (progress.length == 0)
  3169. {
  3170. var essences = quest.essences;
  3171. for (var count = 0; count < essences.length; count++)
  3172. {
  3173. var essence = getElementsByClass("item " + essences[count].type);
  3174. if (essence.length == 1)
  3175. {
  3176. if (typeof(essence[0].currentTitle) == "undefined")
  3177. essence[0].currentTitle = essence[0].title;
  3178. essence[0].innerHTML = '<span id="MHH_' + essences[count].type + '">' + essences[count].quantity + '</span>';
  3179. essence[0].onmouseover = function()
  3180. {
  3181. UpdateEssences(essences, this.className.substring(5));
  3182. };
  3183. essence[0].onmouseout = function()
  3184. {
  3185. UpdateEssences(essences);
  3186. };
  3187. }
  3188. }
  3189. }
  3190. }
  3191.  
  3192. function UpdateQuestProgress()
  3193. {
  3194. if (STATE.userobject != null && typeof(STATE.userobject.quests) != "undefined")
  3195. {
  3196. if (typeof(STATE.userobject.quests.QuestIceberg) != "undefined")
  3197. {
  3198. UpdateIcebergProgress();
  3199. }
  3200. else if (typeof(STATE.userobject.quests.QuestLivingGarden) != "undefined")
  3201. {
  3202. UpdateLivingGardenProgress(STATE.userobject.quests.QuestLivingGarden);
  3203. }
  3204. else if (typeof(STATE.userobject.quests.QuestLostCity) != "undefined")
  3205. {
  3206. UpdateLivingGardenProgress(STATE.userobject.quests.QuestLostCity);
  3207. }
  3208. else if (typeof(STATE.userobject.quests.QuestSandDunes) != "undefined")
  3209. {
  3210. UpdateLivingGardenProgress(STATE.userobject.quests.QuestSandDunes);
  3211. }
  3212. }
  3213. setTimeout(UpdateQuestProgress, 5000);
  3214. }
  3215.  
  3216. function UpdateScript()
  3217. {
  3218. window.location = SCRIPT.scripturl;
  3219. }
  3220.  
  3221. function CheckForUpdate()
  3222. {
  3223. var szPageText;
  3224. var szOnlineVersion = 'none';
  3225. var fCurrentVersion, fOnlineVersion, fLastVersion;
  3226. // check for an update every 30 minutes
  3227. if (CheckTimeout('Update - Script', 30) == 0)
  3228. {
  3229. ResetTimeout('Update - Script');
  3230. var today = new Date();
  3231. var current_time = today.getTime();
  3232. Get(SCRIPT.versionurl + '?' + current_time, function(text) {
  3233. szPageText = text;
  3234. szOnlineVersion = text.substring(text.indexOf('@version') + 13, text.indexOf('@version') + 17);
  3235. fLastVersion = parseFloat(DSXC_getValue('Script - Last Revision', '0.0'));
  3236. fOnlineVersion = parseFloat(szOnlineVersion);
  3237. fCurrentVersion = parseFloat(SCRIPT.version);
  3238. if (fOnlineVersion > fCurrentVersion && fOnlineVersion != fLastVersion)
  3239. {
  3240. DSXC_setValue('Script - Last Revision', szOnlineVersion);
  3241. var szMessageText = 'DSXC\'s MouseHunt Helper (' + szOnlineVersion + ') is available!\n\n';
  3242. var iStartPos = text.indexOf('@revision');
  3243. var iEndPos;
  3244. while (iStartPos != -1)
  3245. {
  3246. iEndPos = text.indexOf('//', iStartPos);
  3247. szMessageText = szMessageText + text.substring(iStartPos + 10, iEndPos);
  3248. iStartPos = text.indexOf('@revision', iEndPos);
  3249. }
  3250. szMessageText = szMessageText + '\nDo you want to upgrade now?';
  3251. if (window.confirm(szMessageText))
  3252. {
  3253. UpdateScript();
  3254. }
  3255. }
  3256. });
  3257. }
  3258. }