kol.js 0.3.0 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (51) hide show
  1. package/package.json +10 -5
  2. package/src/Client.test.ts +245 -64
  3. package/src/Client.ts +201 -191
  4. package/src/LoathingDate.test.ts +202 -0
  5. package/src/LoathingDate.ts +390 -0
  6. package/src/Player.test.ts +83 -82
  7. package/src/Player.ts +112 -181
  8. package/src/domains/AutomatedFuture.test.ts +19 -0
  9. package/src/domains/AutomatedFuture.ts +46 -0
  10. package/src/domains/Bookmobile.test.ts +20 -0
  11. package/src/domains/Bookmobile.ts +66 -0
  12. package/src/domains/ClanDungeon.ts +230 -0
  13. package/src/domains/Dreadsylvania.test.ts +424 -0
  14. package/src/domains/Dreadsylvania.ts +550 -0
  15. package/src/domains/Familiar.ts +82 -0
  16. package/src/domains/FloralMercantileExchange.test.ts +20 -0
  17. package/src/domains/FloralMercantileExchange.ts +51 -0
  18. package/src/{utils/leaderboard.test.ts → domains/Leaderboard.test.ts} +24 -4
  19. package/src/domains/Leaderboard.ts +173 -0
  20. package/src/domains/Players.test.ts +141 -0
  21. package/src/domains/Players.ts +108 -0
  22. package/src/domains/Raffle.test.ts +65 -0
  23. package/src/domains/Raffle.ts +60 -0
  24. package/src/domains/SkeletonOfCrimboPast.test.ts +55 -0
  25. package/src/domains/SkeletonOfCrimboPast.ts +38 -0
  26. package/src/domains/WardrobeOMatic.test.ts +141 -0
  27. package/src/domains/WardrobeOMatic.ts +650 -0
  28. package/src/domains/__fixtures__/automated_future.html +1 -0
  29. package/src/domains/__fixtures__/bookmobile_spooky.html +6 -0
  30. package/src/domains/__fixtures__/dread/cdr1-current.html +25 -0
  31. package/src/domains/__fixtures__/dread/cdr1-oldlogs-page0.html +25 -0
  32. package/src/domains/__fixtures__/dread/cdr2-current.html +25 -0
  33. package/src/domains/__fixtures__/dread/cdr2-oldlogs-page0.html +25 -0
  34. package/src/domains/__fixtures__/dread/raid-213013.html +24 -0
  35. package/src/domains/__fixtures__/dread/raid-217988.html +24 -0
  36. package/src/domains/__fixtures__/dread/raid-218029.html +24 -0
  37. package/src/domains/__fixtures__/dread/raid-218205.html +24 -0
  38. package/src/domains/__fixtures__/dread/raid-218286.html +24 -0
  39. package/src/domains/__fixtures__/dread/raid-218518.html +24 -0
  40. package/src/domains/__fixtures__/dread/raid-218519.html +24 -0
  41. package/src/domains/__fixtures__/flowers.html +229 -0
  42. package/src/domains/__fixtures__/raidlog.html +1 -0
  43. package/src/domains/__fixtures__/socp.html +1 -0
  44. package/src/index.ts +10 -4
  45. package/src/stats.ts +31 -0
  46. package/src/utils/kmail.ts +3 -3
  47. package/src/utils/utils.ts +43 -0
  48. package/src/Cache.ts +0 -33
  49. package/src/utils/leaderboard.ts +0 -78
  50. /package/src/{utils → domains}/__fixtures__/leaderboard_wotsf.html +0 -0
  51. /package/src/{__fixtures__ → domains/__fixtures__}/raffle.html +0 -0
@@ -0,0 +1,24 @@
1
+ <html><head>
2
+ <script language=Javascript>
3
+ <!--
4
+ //-->
5
+ </script>
6
+ <script language=Javascript src="https://d2uyhvukfffg5a.cloudfront.net/scripts/keybinds.min.2.js"></script>
7
+ <script language=Javascript src="https://d2uyhvukfffg5a.cloudfront.net/scripts/window.20111231.js"></script>
8
+ <script language="javascript">function chatFocus(){if(top.chatpane.document.chatform.graf) top.chatpane.document.chatform.graf.focus();}
9
+ if (typeof defaultBind != 'undefined') { defaultBind(47, 2, chatFocus); defaultBind(190, 2, chatFocus);defaultBind(191, 2, chatFocus); defaultBind(47, 8, chatFocus);defaultBind(190, 8, chatFocus); defaultBind(191, 8, chatFocus); }</script><script language=Javascript src="https://d2uyhvukfffg5a.cloudfront.net/scripts/jquery-1.3.1.min.js"></script>
10
+ <link rel="stylesheet" type="text/css" href="https://d2uyhvukfffg5a.cloudfront.net/styles.20230117d.css">
11
+ <style type='text/css'>
12
+ .faded {
13
+ zoom: 1;
14
+ filter: alpha(opacity=35);
15
+ opacity: 0.35;
16
+ -khtml-opacity: 0.35;
17
+ -moz-opacity: 0.35;
18
+ }
19
+ </style>
20
+
21
+ </head>
22
+
23
+ <body>
24
+ <span class=small><center><b>Dreadsylvania run, March 11, 2026</b></center><center><b>3593</b> kisses earned in this dungeon so far.</center><p><center>Your clan has defeated <b>1,000</b> monster(s) in the Castle.</center><br><center>Your clan has defeated <b>1,000</b> monster(s) in the Village.</center><br><center>Your clan has defeated <b>1,000</b> monster(s) in the Forest.</center><br><b>The Woods</b><blockquote>Less Than Three (#395328) recycled some newspapers (1 turn)<br>Less Than Three (#395328) made a cool iron ingot (1 turn)<br>Doppelgrimmer (#510454) defeated hot werewolf x 16 (16 turns)<br>Doppelgrimmer (#510454) defeated hot bugbear x 27 (27 turns)<br>Doppelgrimmer (#510454) defeated sleaze werewolf x 23 (23 turns)<br>Doppelgrimmer (#510454) defeated spooky werewolf x 15 (15 turns)<br>Doppelgrimmer (#510454) defeated cold werewolf x 23 (23 turns)<br>Doppelgrimmer (#510454) defeated stench bugbear x 20 (20 turns)<br>Doppelgrimmer (#510454) defeated stench werewolf x 18 (18 turns)<br>Doppelgrimmer (#510454) defeated spooky bugbear x 15 (15 turns)<br>Doppelgrimmer (#510454) defeated cold bugbear x 23 (23 turns)<br>Doppelgrimmer (#510454) defeated sleaze bugbear x 20 (20 turns)<br>Dician (#992702) got a blood kiwi (1 turn)<br>Dician (#992702) defeated sleaze bugbear (1 turn)<br>Dician (#992702) defeated cold bugbear x 2 (2 turns)<br>Dician (#992702) defeated hot werewolf x 2 (2 turns)<br>Dician (#992702) defeated hot bugbear (1 turn)<br>Dician (#992702) defeated spooky bugbear (1 turn)<br>Dician (#992702) defeated spooky werewolf (1 turn)<br>Dician (#992702) defeated stench werewolf x 2 (2 turns)<br><b>Dician (#992702) defeated Falls-From-Sky (1 turn)</b><br>The Great White Hunter (#1546607) knocked some fruit loose (1 turn)<br>tHE eROsIoNseEker (#1937905) made some bone flour (1 turn)<br>Quincunx (#1954873) defeated stench werewolf x 25 (25 turns)<br>Quincunx (#1954873) defeated spooky bugbear x 49 (49 turns)<br>Quincunx (#1954873) defeated hot bugbear x 45 (45 turns)<br>Quincunx (#1954873) defeated spooky werewolf x 25 (25 turns)<br>Quincunx (#1954873) defeated cold bugbear x 46 (46 turns)<br>Quincunx (#1954873) defeated sleaze bugbear x 32 (32 turns)<br>Quincunx (#1954873) defeated stench bugbear x 47 (47 turns)<br>Quincunx (#1954873) defeated hot werewolf x 19 (19 turns)<br>Quincunx (#1954873) defeated cold werewolf x 29 (29 turns)<br>Quincunx (#1954873) defeated sleaze werewolf x 23 (23 turns)<br>VeeArr (#2045369) recycled some newspapers (1 turn)<br>VeeArr (#2045369) found and sold a rare baseball card (1 turn)<br>trou (#2216598) recycled some newspapers (1 turn)<br>trou (#2216598) found and sold a rare baseball card (1 turn)<br>trou (#2216598) defeated cold bugbear x 11 (11 turns)<br>trou (#2216598) defeated stench bugbear x 12 (12 turns)<br>trou (#2216598) defeated spooky werewolf x 8 (8 turns)<br>trou (#2216598) defeated sleaze bugbear x 14 (14 turns)<br>trou (#2216598) defeated sleaze werewolf x 10 (10 turns)<br>trou (#2216598) defeated hot bugbear x 10 (10 turns)<br>trou (#2216598) defeated hot werewolf x 4 (4 turns)<br>trou (#2216598) defeated spooky bugbear x 14 (14 turns)<br>trou (#2216598) defeated stench werewolf x 7 (7 turns)<br>trou (#2216598) defeated cold werewolf x 10 (10 turns)<br>Wakwak (#3096759) made an impression of a complicated lock (1 turn)<br>Wakwak (#3096759) found and sold a rare baseball card (1 turn)<br>Sauceress Worldwalker (#3578299) defeated spooky bugbear x 46 (46 turns)<br>Sauceress Worldwalker (#3578299) defeated sleaze bugbear x 30 (30 turns)<br>Sauceress Worldwalker (#3578299) defeated hot werewolf x 33 (33 turns)<br>Sauceress Worldwalker (#3578299) defeated hot bugbear x 50 (50 turns)<br>Sauceress Worldwalker (#3578299) defeated cold bugbear x 43 (43 turns)<br>Sauceress Worldwalker (#3578299) defeated stench werewolf x 28 (28 turns)<br>Sauceress Worldwalker (#3578299) defeated stench bugbear x 31 (31 turns)<br>Sauceress Worldwalker (#3578299) defeated cold werewolf x 32 (32 turns)<br>Sauceress Worldwalker (#3578299) defeated sleaze werewolf x 31 (31 turns)<br>Sauceress Worldwalker (#3578299) defeated spooky werewolf x 26 (26 turns)<br>Sauceress Worldwalker (#3578299) acquired a chunk of moon-amber (1 turn)<br>Sauceress Worldwalker (#3578299) recycled some newspapers (1 turn)<br>Sauceress Worldwalker (#3578299) found and sold a rare baseball card (1 turn)<br></blockquote><b>The Village</b><blockquote>Less Than Three (#395328) made a cool iron breastplate (1 turn)<br>Less Than Three (#395328) robbed some graves (1 turn)<br>Doppelgrimmer (#510454) unlocked the schoolhouse (1 turn)<br>Doppelgrimmer (#510454) defeated sleaze zombie x 40 (40 turns)<br>Doppelgrimmer (#510454) defeated hot ghost x 24 (24 turns)<br>Doppelgrimmer (#510454) defeated spooky zombie x 35 (35 turns)<br>Doppelgrimmer (#510454) defeated cold zombie x 40 (40 turns)<br>Doppelgrimmer (#510454) defeated cold ghost x 28 (28 turns)<br>Doppelgrimmer (#510454) defeated stench zombie x 29 (29 turns)<br>Doppelgrimmer (#510454) defeated sleaze ghost x 20 (20 turns)<br>Doppelgrimmer (#510454) defeated spooky ghost x 28 (28 turns)<br>Doppelgrimmer (#510454) defeated hot zombie x 37 (37 turns)<br>Doppelgrimmer (#510454) defeated stench ghost x 19 (19 turns)<br>Dician (#992702) unlocked the master suite (1 turn)<br>Dician (#992702) made a ghost shawl (1 turn)<br>Dician (#992702) defeated spooky zombie (1 turn)<br>Dician (#992702) defeated cold zombie x 3 (3 turns)<br>Dician (#992702) defeated cold ghost (1 turn)<br>Dician (#992702) defeated stench ghost (1 turn)<br>Dician (#992702) defeated stench zombie x 3 (3 turns)<br>Dician (#992702) defeated sleaze zombie (1 turn)<br><b>Dician (#992702) was defeated by the Zombie Homeowners' Association x 3 (3 turns)</b><br><b>Dician (#992702) defeated the Zombie Homeowners' Association (1 turn)</b><br>UberJew (#1382257) collected a ghost pencil (1 turn)<br>CarltheChemist (#1969700) collected a ghost pencil (1 turn)<br>Duster (#1995050) collected a ghost pencil (1 turn)<br>Duster (#1995050) defeated hot ghost x 12 (12 turns)<br>Duster (#1995050) defeated hot zombie x 22 (22 turns)<br>Duster (#1995050) defeated spooky zombie x 26 (26 turns)<br>Duster (#1995050) defeated stench zombie x 27 (27 turns)<br>Duster (#1995050) defeated sleaze ghost x 11 (11 turns)<br>Duster (#1995050) defeated stench ghost x 17 (17 turns)<br>Duster (#1995050) defeated cold zombie x 23 (23 turns)<br>Duster (#1995050) defeated spooky ghost x 16 (16 turns)<br>Duster (#1995050) defeated cold ghost x 12 (12 turns)<br>Duster (#1995050) defeated sleaze zombie x 24 (24 turns)<br>Duster (#1995050) was defeated by hot zombie (1 turn)<br>VeeArr (#2045369) looted the blacksmith's till (1 turn)<br>VeeArr (#2045369) robbed some graves (1 turn)<br>trou (#2216598) looted the blacksmith's till (1 turn)<br>trou (#2216598) looted the tinker's shack (1 turn)<br>trou (#2216598) robbed some graves (1 turn)<br>trou (#2216598) defeated spooky zombie x 66 (66 turns)<br>trou (#2216598) defeated hot ghost x 47 (47 turns)<br>trou (#2216598) defeated spooky ghost x 43 (43 turns)<br>trou (#2216598) defeated hot zombie x 73 (73 turns)<br>trou (#2216598) defeated cold ghost x 37 (37 turns)<br>trou (#2216598) defeated stench ghost x 40 (40 turns)<br>trou (#2216598) defeated stench zombie x 51 (51 turns)<br>trou (#2216598) defeated sleaze zombie x 47 (47 turns)<br>trou (#2216598) defeated cold zombie x 55 (55 turns)<br>trou (#2216598) defeated sleaze ghost x 41 (41 turns)<br>trou (#2216598) was defeated by hot zombie (1 turn)<br>trou (#2216598) was defeated by stench zombie (1 turn)<br>trou (#2216598) was defeated by cold ghost (1 turn)<br>Malibu Stacey (#2705901) made a complicated key (1 turn)<br>Wakwak (#3096759) polished some moon-amber (1 turn)<br>Wakwak (#3096759) looted the blacksmith's till (1 turn)<br>Sauceress Worldwalker (#3578299) looted the blacksmith's till (1 turn)<br>Sauceress Worldwalker (#3578299) robbed some graves (1 turn)<br>nisemono (#3656168) collected a ghost pencil (1 turn)<br></blockquote><b>Miscellaneous</b><blockquote>Captain Scotch (#437479) got the carriageman 2001 sheet(s) drunker<br></blockquote><b>The Castle</b><blockquote>Captain Scotch (#437479) unlocked the lab (1 turn)<br>Captain Scotch (#437479) fixed The Machine (1 turn)<br><b>Dician (#992702) defeated Count Drunkula (1 turn)</b><br>Duster (#1995050) defeated spooky vampire x 61 (61 turns)<br>Duster (#1995050) defeated stench vampire x 64 (64 turns)<br>Duster (#1995050) defeated hot skeleton x 44 (44 turns)<br>Duster (#1995050) defeated sleaze vampire x 62 (62 turns)<br>Duster (#1995050) defeated cold vampire x 62 (62 turns)<br>Duster (#1995050) defeated spooky skeleton x 31 (31 turns)<br>Duster (#1995050) defeated hot vampire x 56 (56 turns)<br>Duster (#1995050) defeated sleaze skeleton x 44 (44 turns)<br>Duster (#1995050) defeated stench skeleton x 47 (47 turns)<br>Duster (#1995050) defeated cold skeleton x 29 (29 turns)<br>trou (#2216598) sifted through some ashes (1 turn)<br>trou (#2216598) defeated stench vampire x 11 (11 turns)<br>trou (#2216598) defeated sleaze skeleton x 11 (11 turns)<br>trou (#2216598) defeated hot skeleton x 9 (9 turns)<br>trou (#2216598) defeated cold skeleton x 4 (4 turns)<br>trou (#2216598) defeated spooky vampire x 13 (13 turns)<br>trou (#2216598) defeated hot vampire x 15 (15 turns)<br>trou (#2216598) defeated spooky skeleton x 5 (5 turns)<br>trou (#2216598) defeated cold vampire x 18 (18 turns)<br>trou (#2216598) defeated stench skeleton x 7 (7 turns)<br>trou (#2216598) defeated sleaze vampire x 7 (7 turns)<br>Sauceress Worldwalker (#3578299) defeated stench vampire x 21 (21 turns)<br>Sauceress Worldwalker (#3578299) defeated stench skeleton x 9 (9 turns)<br>Sauceress Worldwalker (#3578299) defeated cold vampire x 18 (18 turns)<br>Sauceress Worldwalker (#3578299) defeated sleaze vampire x 23 (23 turns)<br>Sauceress Worldwalker (#3578299) defeated hot vampire x 22 (22 turns)<br>Sauceress Worldwalker (#3578299) defeated sleaze skeleton x 16 (16 turns)<br>Sauceress Worldwalker (#3578299) defeated spooky vampire x 20 (20 turns)<br>Sauceress Worldwalker (#3578299) defeated cold skeleton x 10 (10 turns)<br>Sauceress Worldwalker (#3578299) defeated spooky skeleton x 16 (16 turns)<br>Sauceress Worldwalker (#3578299) defeated hot skeleton x 8 (8 turns)<br>nisemono (#3656168) defeated cold skeleton x 19 (19 turns)<br>nisemono (#3656168) defeated hot skeleton x 23 (23 turns)<br>nisemono (#3656168) defeated spooky vampire x 24 (24 turns)<br>nisemono (#3656168) defeated sleaze vampire x 25 (25 turns)<br>nisemono (#3656168) defeated spooky skeleton x 22 (22 turns)<br>nisemono (#3656168) defeated hot vampire x 24 (24 turns)<br>nisemono (#3656168) defeated sleaze skeleton x 18 (18 turns)<br>nisemono (#3656168) defeated cold vampire x 33 (33 turns)<br>nisemono (#3656168) defeated stench skeleton x 16 (16 turns)<br>nisemono (#3656168) defeated stench vampire x 33 (33 turns)<br></blockquote><p><b>Loot Distribution:</b><p><blockquote>Dician (#992702) distributed <b>Warms-Your-Tush</b> to Duster (#1995050)<br>Dician (#992702) distributed <b>Protects-Your-Junk</b> to trou (#2216598)<br>Dician (#992702) distributed <b>Gets-You-Drunk</b> to Duster (#1995050)<br>Dician (#992702) distributed <b>Gets-You-Drunk</b> to nisemono (#3656168)<br>Dician (#992702) distributed <b>zombie mariachi hat</b> to Sauceress Worldwalker (#3578299)<br>Dician (#992702) distributed <b>HOA zombie eyes</b> to Wakwak (#3096759)<br>Dician (#992702) distributed <b>wriggling severed nose</b> to Dician (#992702)<br>Dician (#992702) distributed <b>wriggling severed nose</b> to Dician (#992702)<br>Dician (#992702) distributed <b>Drunkula's cape</b> to trou (#2216598)<br>Dician (#992702) distributed <b>Drunkula's wineglass</b> to Doppelgrimmer (#510454)<br>Dician (#992702) distributed <b>bottle of Bloodweiser</b> to Sauceress Worldwalker (#3578299)<br>Dician (#992702) distributed <b>bottle of Bloodweiser</b> to Quincunx (#1954873)<br>Dician (#992702) distributed <b>skull capacitor</b> to Captain Scotch (#437479)<br></blockquote><center><a href=clan_oldraidlogs.php?startrow=0>Back to raid logs</a></center></span></body></html>
@@ -0,0 +1,229 @@
1
+ <html><head>
2
+ <script language=Javascript>
3
+ <!--
4
+ if (parent.frames.length == -1) location.href="game.php";
5
+ //-->
6
+ </script>
7
+ <script language=Javascript src="/images/scripts/jquery-1.5.1.js"></script>
8
+ <script language=Javascript src="/images/scripts/keybinds.min.2.js"></script>
9
+ <script language=Javascript src="/images/scripts/window.20111231.js"></script>
10
+ <script language="javascript">function chatFocus(){if(top.chatpane.document.chatform.graf) top.chatpane.document.chatform.graf.focus();}
11
+ if (typeof defaultBind != 'undefined') { defaultBind(47, 2, chatFocus); defaultBind(190, 2, chatFocus);defaultBind(191, 2, chatFocus); defaultBind(47, 8, chatFocus);defaultBind(190, 8, chatFocus); defaultBind(191, 8, chatFocus); }</script><script language="javascript">
12
+ function updateParseItem(iid, field, info) {
13
+ var tbl = $('#ic'+iid);
14
+ var data = parseItem(tbl);
15
+ if (!data) return;
16
+ data[field] = info;
17
+ var out = [];
18
+ for (i in data) {
19
+ if (!data.hasOwnProperty(i)) continue;
20
+ out.push(i+'='+data[i]);
21
+ }
22
+ tbl.attr('rel', out.join('&'));
23
+ }
24
+ function parseItem(tbl) {
25
+ tbl = $(tbl);
26
+ var rel = tbl.attr('rel');
27
+ var data = {};
28
+ if (!rel) return data;
29
+ var parts = rel.split('&');
30
+ for (i in parts) {
31
+ if (!parts.hasOwnProperty(i)) continue;
32
+ var kv = parts[i].split('=');
33
+ tbl.data(kv[0], kv[1]);
34
+ data[kv[0]] = kv[1];
35
+ }
36
+ return data;
37
+ }
38
+ </script><script type="text/javascript" src="/images/scripts/pop_query.20230713.js"></script>
39
+ <script type="text/javascript" src="/images/scripts/ircm.20230626.js"></script>
40
+ <script type="text/javascript">
41
+ var tp = top;
42
+ function pop_ircm_contents(i, some) {
43
+ var contents = '',
44
+ shown = 0,
45
+ da = '&nbsp;<a href="#" rel="?" class="small dojaxy">[some]</a>&nbsp;<a href="#" rel="',
46
+ db = '" class="small dojaxy">[all]</a>',
47
+ dc = '<div style="width:100%; padding-bottom: 3px;" rel="',
48
+ dd = '<a href="#" rel="1" class="small dojaxy">[';
49
+
50
+ return [contents, shown];
51
+ }
52
+ tp=top
53
+ var todo = [];
54
+ function nextAction() {
55
+ var next_todo = todo.shift();
56
+ if (next_todo) {
57
+ eval(next_todo);
58
+ }
59
+ }
60
+ function dojax(dourl, afterFunc, hoverCaller, failureFunc, method, params) {
61
+ $.ajax({
62
+ type: method || 'GET', url: dourl, cache: false,
63
+ data: params || null,
64
+ global: false,
65
+ success: function (out) {
66
+ nextAction();
67
+ if (out.match(/no\|/)) {
68
+ var parts = out.split(/\|/);
69
+ if (failureFunc) failureFunc(parts[1]);
70
+ else if (window.dojaxFailure) window.dojaxFailure(parts[1]);
71
+ else if (tp.chatpane.handleMessage) tp.chatpane.handleMessage({type: 'event', msg: 'Oops! Sorry, Dave, you appear to be ' + parts[1]});
72
+ else $('#ChatWindow').append('<font color="green">Oops! Sorry, Dave, you appear to be ' + parts[1] + '.</font><br />' + "\n");
73
+ return;
74
+ }
75
+
76
+ if (hoverCaller) {
77
+ float_results(hoverCaller, out);
78
+ if (afterFunc) { afterFunc(out); }
79
+ return;
80
+ }
81
+ $(tp.mainpane.document).find("#effdiv").remove(); if(!window.dontscroll || (window.dontscroll && dontscroll==0)) { window.scroll(0,0);}
82
+ var $eff = $(tp.mainpane.document).find('#effdiv');
83
+ if ($eff.length == 0) {
84
+ var d = tp.mainpane.document.createElement('DIV');
85
+ d.id = 'effdiv';
86
+ var b = tp.mainpane.document.body;
87
+ if ($('#content_').length > 0) {
88
+ b = $('#content_ div:first')[0];
89
+ }
90
+ b.insertBefore(d, b.firstChild);
91
+ $eff = $(d);
92
+ }
93
+ $eff.find('a[name="effdivtop"]').remove().end()
94
+ .prepend('<a name="effdivtop"></a><center>' + out + '</center>').css('display','block');
95
+ if (!window.dontscroll || (window.dontscroll && dontscroll==0)) {
96
+ tp.mainpane.document.location = tp.mainpane.document.location + "#effdivtop";
97
+ }
98
+ if (afterFunc) { afterFunc(out); }
99
+ }
100
+ });
101
+ }
102
+ </script> <link rel="stylesheet" type="text/css" href="/images/styles.20230117d.css">
103
+ <style type='text/css'>
104
+ .faded {
105
+ zoom: 1;
106
+ filter: alpha(opacity=35);
107
+ opacity: 0.35;
108
+ -khtml-opacity: 0.35;
109
+ -moz-opacity: 0.35;
110
+ }
111
+ </style>
112
+
113
+ <script language="Javascript" src="/basics.js"></script><link rel="stylesheet" href="/basics.1.css" /></head>
114
+
115
+ <body>
116
+ <script src="/images/scripts/jquery.ui.tooltip.min.js?v=12"></script>
117
+ <style>
118
+ .ui-helper-hidden-accessible {display: none; }
119
+ .tip {
120
+ /*max-height: 300px; */
121
+ overflow: auto;
122
+ background-color: white;
123
+ border: 1px solid black;
124
+ display:none;
125
+ width:350px;
126
+ padding:10px;
127
+ color:black;
128
+ z-index: 99;
129
+ position: absolute;
130
+ }
131
+ #loading {
132
+ position: fixed; top: 0px; right: 0px; padding: 2px; background-color: blue; color: white; display: none; z-index: 100;
133
+ }
134
+ </style>
135
+ <div id="loading">Loading description...</div>
136
+ <script>
137
+ var boom;
138
+ var cur_tip;
139
+ var invtip = function(callback) {
140
+ if (cur_tip == $(this).attr('rel')) return null;
141
+ //$('#loading').show();
142
+ var d = $('<div>Loading...</div>');
143
+ cur_tip = $(this).attr('rel');
144
+ $.get($(this).attr('rel'), function (res) {
145
+ var h = res.replace(/[\s\S]*<div id="description"/m,'<div').replace(/<script[\s\S]*/,'')+'</div>'
146
+ $('#loading').remove();
147
+ setTimeout(function () {
148
+ callback(h);
149
+ }, 500);
150
+ });
151
+ return "Loading description...";
152
+ };
153
+ var tooltip_options = {
154
+ content: invtip,
155
+ show: {delay: 250, duration: 10},
156
+ hide: {delay: 5000000, duration: 100},
157
+ position: {collision: 'flipfit', at: 'right' },
158
+ open: function (e, ui) {
159
+ clearTimeout(boom);
160
+ $('.ui-tooltip').each(function () {
161
+ if ($(ui.tooltip).attr('id') != $(this).attr('id')) $(this).remove();
162
+ });
163
+ },
164
+ close : function (e) {
165
+ var killme = function () { $('.tip').remove(); cur_tip = null; };
166
+ boom = setTimeout(function () { $('.tip').remove(); cur_tip = null; }, 1000);
167
+ $('.tip').hover(
168
+ function () { clearTimeout(boom); },
169
+ killme
170
+ );
171
+ },
172
+ tooltipClass: 'tip'
173
+ };
174
+ jQuery(function ($) {
175
+ if ($('.pop').tooltip) {
176
+ $('.pop').attr('title','').tooltip(tooltip_options);
177
+ }
178
+ var uia = function (e) {
179
+ e.preventDefault();
180
+ var p = $(this).parents('.ui-tooltip');
181
+ $.get($(this).attr('href'), function (res) {
182
+ p.empty().append(res);
183
+ });
184
+ };
185
+ var ua = navigator.userAgent,
186
+ cname = (ua.match(/iP(hone|ad)/i)) ? "touchend" : "click";
187
+ $(document).bind(cname, function (e) {
188
+ if ($(e.target).parents('.ui-tooltip').length || $(e.target).is('.ircm')) return;
189
+ $('.tip').remove(); cur_tip = null;
190
+ });
191
+ $(document).bind('contextmenu',function (e) {
192
+ $('.tip').remove(); cur_tip = null;
193
+ });
194
+ if ($(document).live) $('.ui-tooltip a').live('click',uia);
195
+ else if ($.on) $(document).on('click', '.ui-tooltip a', uia);
196
+ });
197
+ </script>
198
+ <centeR><table width=95% cellspacing=0 cellpadding=0><tr><td style="background-color: blue" align=center ><b style="color: white">The Central Loathing Floral Mercantile Exchange</b></td></tr><tr><td style="padding: 5px; border: 1px solid blue;"><center><table><tr><td><center><center><table width=80%><tr><td>You make your way to the crowded trading floor of the Central Loathing Floral Mercantile Exchange. Ambitious young flowerbrokers stand shoulder to shoulder, shouting "Buy! Sell! Let's get those in some water right away! Buy! Sell!"
199
+ <p>
200
+ You check the board for up-to-the-minute prices:</td></tr></table></center><form name=bigform action=shop.php method=post><input type=hidden name=pwd value=eca84f8a1868a103c468e967fc13be97><input type=hidden name=whichshop value="flowertradein"><input type=hidden name=action value=buyitem><br><table cellspacing=2 cellpadding=0><tr><td></td><td colspan=2 align=center><b>Item:</b> (click for description)</td><td colspan=10 align=center><b>Price:</b></td></tr><tr rel="7567"><td valign=center></td><td><img src="/images/itemimages/chroner.gif" class="hand pop" rel="desc_item.php?whichitem=783338147" onClick='javascript:descitem(783338147)'></td><td valign=center><a onClick='javascript:descitem(783338147)'><b>Chroner</b>&nbsp;&nbsp;&nbsp;&nbsp;</a></td><td><img src=/images/itemimages/twitchrose.gif width=30 height=30 onClick='javascript:descitem(619164426)' alt="rose" title="rose"></td><td><b>2</b></td><td valign=center class=tiny>rose</td><td></td><td></td><td valign=center class=tiny></td><td></td><td></td><td valign=center class=tiny></td><td></td><td></td><td valign=center class=tiny></td><td></td><td></td><td valign=center class=tiny></td><td valign=center><input class="button doit multibuy disabled" disabled type=button rel='shop.php?whichshop=flowertradein&action=buyitem&quantity=1&whichrow=759&pwd=eca84f8a1868a103c468e967fc13be97' value='Trade In'></td></tr><tr rel="7567"><td valign=center></td><td><img src="/images/itemimages/chroner.gif" class="hand pop" rel="desc_item.php?whichitem=783338147" onClick='javascript:descitem(783338147)'></td><td valign=center><a onClick='javascript:descitem(783338147)'><b>Chroner</b>&nbsp;<b>(11)</b>&nbsp;&nbsp;&nbsp;&nbsp;</a></td><td><img src=/images/itemimages/twitchtulip.gif width=30 height=30 onClick='javascript:descitem(973996072)' alt="red tulip" title="red tulip"></td><td><b>1</b></td><td valign=center class=tiny>red tulip</td><td></td><td></td><td valign=center class=tiny></td><td></td><td></td><td valign=center class=tiny></td><td></td><td></td><td valign=center class=tiny></td><td></td><td></td><td valign=center class=tiny></td><td valign=center><input class="button doit multibuy disabled" disabled type=button rel='shop.php?whichshop=flowertradein&action=buyitem&quantity=1&whichrow=760&pwd=eca84f8a1868a103c468e967fc13be97' value='Trade In'></td></tr><tr rel="7567"><td valign=center></td><td><img src="/images/itemimages/chroner.gif" class="hand pop" rel="desc_item.php?whichitem=783338147" onClick='javascript:descitem(783338147)'></td><td valign=center><a onClick='javascript:descitem(783338147)'><b>Chroner</b>&nbsp;<b>(11)</b>&nbsp;&nbsp;&nbsp;&nbsp;</a></td><td><img src=/images/itemimages/twitchtulip.gif width=30 height=30 onClick='javascript:descitem(156741343)' alt="white tulip" title="white tulip"></td><td><b>1</b></td><td valign=center class=tiny>white tulip</td><td></td><td></td><td valign=center class=tiny></td><td></td><td></td><td valign=center class=tiny></td><td></td><td></td><td valign=center class=tiny></td><td></td><td></td><td valign=center class=tiny></td><td valign=center><input class="button doit multibuy disabled" disabled type=button rel='shop.php?whichshop=flowertradein&action=buyitem&quantity=1&whichrow=761&pwd=eca84f8a1868a103c468e967fc13be97' value='Trade In'></td></tr><tr rel="7567"><td valign=center></td><td><img src="/images/itemimages/chroner.gif" class="hand pop" rel="desc_item.php?whichitem=783338147" onClick='javascript:descitem(783338147)'></td><td valign=center><a onClick='javascript:descitem(783338147)'><b>Chroner</b>&nbsp;<b>(12)</b>&nbsp;&nbsp;&nbsp;&nbsp;</a></td><td><img src=/images/itemimages/twitchtulip.gif width=30 height=30 onClick='javascript:descitem(126513532)' alt="blue tulip" title="blue tulip"></td><td><b>1</b></td><td valign=center class=tiny>blue tulip</td><td></td><td></td><td valign=center class=tiny></td><td></td><td></td><td valign=center class=tiny></td><td></td><td></td><td valign=center class=tiny></td><td></td><td></td><td valign=center class=tiny></td><td valign=center><input class="button doit multibuy disabled" disabled type=button rel='shop.php?whichshop=flowertradein&action=buyitem&quantity=1&whichrow=762&pwd=eca84f8a1868a103c468e967fc13be97' value='Trade In'></td></tr></table></form></form><div id="ass" style="font-size: .8em; text-align: center; width: 100%">*Right-Click to Multi-Trade In</div><p><b>You have:</b><table><tr><td><img src=/images/itemimages/twitchrose.gif width=30 height=30 onClick='javascript:descitem(619164426)' alt="rose" title="rose"></td><td>1 rose</td></tr><tr><td><img src=/images/itemimages/twitchtulip.gif width=30 height=30 onClick='javascript:descitem(973996072)' alt="red tulip" title="red tulip"></td><td>no red tulips</td></tr><tr><td><img src=/images/itemimages/twitchtulip.gif width=30 height=30 onClick='javascript:descitem(156741343)' alt="white tulip" title="white tulip"></td><td>no white tulips</td></tr><tr><td><img src=/images/itemimages/twitchtulip.gif width=30 height=30 onClick='javascript:descitem(126513532)' alt="blue tulip" title="blue tulip"></td><td>no blue tulips</td></tr></table><p><a href=inventory.php>Back to your Inventory</a></center></td></tr></table></center></td></tr><tr><td height=4></td></tr></table></center><script>
201
+ jQuery(function ($) {
202
+ var ass = false;
203
+ $('.doit').bind('contextmenu', function (e) {
204
+ e.preventDefault();
205
+ var l = $(this);
206
+ pop_query(l, 'How Many?', 'Trade In', function (num) {
207
+ var url = l.attr('rel');
208
+ url = url.replace(/quantity=1/, 'quantity=' + num);
209
+ parent.mainpane.location=url;
210
+ })
211
+ }).each(function () {
212
+ //$(this).val($(this).val() + '*');
213
+ ass = true;
214
+ }).click(function (e) {
215
+ e.preventDefault();
216
+ if (e.shiftKey) {
217
+ var t= this;
218
+ setTimeout(function () { $(t).trigger('contextmenu');}, 500);
219
+ return;
220
+ }
221
+ var url = $(this).attr('rel');
222
+ parent.mainpane.location=url;
223
+ });
224
+
225
+ if (!ass) { $('#ass').hide() }
226
+
227
+ });
228
+ </script>
229
+ </body><script src="/ircm_extend.3.js"></script><script src="/onfocus.1.js"></script></html>
@@ -0,0 +1 @@
1
+ <html><head><script language=Javascript><!--if (parent.frames.length == 0) location.href="game.php";top.charpane.location.href="charpane.php";//--></script><script language=Javascript src="https://d2uyhvukfffg5a.cloudfront.net/scripts/keybinds.min.2.js"></script><script language=Javascript src="https://d2uyhvukfffg5a.cloudfront.net/scripts/window.20111231.js"></script><script language="javascript">function chatFocus(){if(top.chatpane.document.chatform.graf) top.chatpane.document.chatform.graf.focus();}if (typeof defaultBind != 'undefined') { defaultBind(47, 2, chatFocus); defaultBind(190, 2, chatFocus);defaultBind(191, 2, chatFocus); defaultBind(47, 8, chatFocus);defaultBind(190, 8, chatFocus); defaultBind(191, 8, chatFocus); }</script><script language=Javascript src="https://d2uyhvukfffg5a.cloudfront.net/scripts/jquery-1.3.1.min.js"></script> <link rel="stylesheet" type="text/css" href="https://d2uyhvukfffg5a.cloudfront.net/styles.20230117d.css"><style type='text/css'>.faded { zoom: 1; filter: alpha(opacity=35); opacity: 0.35; -khtml-opacity: 0.35; -moz-opacity: 0.35;}</style></head><body><centeR><table width=95% cellspacing=0 cellpadding=0><tr><td style="color: white;" align=center bgcolor=blue><b>Clan Dungeon Logs</b></td></tr><tr><td style="padding: 5px; border: 1px solid blue;"><center><table><tr><td><b>Current Clan Dungeons:</b><p><div id='Dreadsylvania'><center><b>Dreadsylvania:<!--dvid:206555--></b><p><table style='border: 1px solid black;' cellpadding=5><tr><td class=small><center><b>508</b> kisses earned in this dungeon so far.</center><p><center>Your clan has defeated <b>484</b> monster(s) in the Castle.</center><br><center>Your clan has defeated <b>27</b> monster(s) in the Forest.</center><br><b>The Village</b><blockquote>WenChtober (#1628649) unlocked the schoolhouse (1 turn)<br>WenChtober (#1628649) collected a ghost pencil (1 turn)<br>Jimmyking (#3272033) made a shepherd's pie (1 turn)<br>Dudefromaway (#3537053) was defeated by cold ghost (1 turn)<br>Trutmat (#3615409) collected a ghost pencil (1 turn)<br>Trutmat (#3615409) robbed some graves (1 turn)<br></blockquote><b>The Castle</b><blockquote>WenChtober (#1628649) defeated spooky skeleton x 7 (7 turns)<br>WenChtober (#1628649) defeated cold vampire x 3 (3 turns)<br>WenChtober (#1628649) defeated cold skeleton x 6 (6 turns)<br>WenChtober (#1628649) defeated hot vampire x 11 (11 turns)<br>WenChtober (#1628649) defeated stench skeleton x 7 (7 turns)<br>WenChtober (#1628649) defeated sleaze skeleton x 6 (6 turns)<br>WenChtober (#1628649) defeated stench vampire x 8 (8 turns)<br>WenChtober (#1628649) defeated hot skeleton x 3 (3 turns)<br>WenChtober (#1628649) sifted through some ashes (1 turn)<br>WenChtober (#1628649) defeated sleaze vampire x 5 (5 turns)<br>WenChtober (#1628649) got some roast beast (1 turn)<br>WenChtober (#1628649) defeated spooky vampire x 3 (3 turns)<br>WenChtober (#1628649) raided a dresser (1 turn)<br>Datris (#2430207) unlocked the lab (1 turn)<br>Datris (#2430207) fixed The Machine (1 turn)<br>MeatballMarinaraMaster (#2802400) defeated stench skeleton x 47 (47 turns)<br>MeatballMarinaraMaster (#2802400) defeated hot skeleton x 57 (57 turns)<br>MeatballMarinaraMaster (#2802400) defeated sleaze vampire x 45 (45 turns)<br>MeatballMarinaraMaster (#2802400) defeated spooky vampire x 26 (26 turns)<br>MeatballMarinaraMaster (#2802400) defeated stench vampire x 23 (23 turns)<br>MeatballMarinaraMaster (#2802400) defeated hot vampire x 35 (35 turns)<br>MeatballMarinaraMaster (#2802400) defeated cold vampire x 39 (39 turns)<br>MeatballMarinaraMaster (#2802400) defeated cold skeleton x 34 (34 turns)<br>MeatballMarinaraMaster (#2802400) defeated sleaze skeleton x 56 (56 turns)<br>MeatballMarinaraMaster (#2802400) defeated spooky skeleton x 61 (61 turns)<br>MeatballMarinaraMaster (#2802400) sifted through some ashes (1 turn)<br>Jimmyking (#3272033) unlocked the ballroom (1 turn)<br>Jimmyking (#3272033) twirled on the dance floor (1 turn)<br>Hippasus (#3361506) got a wax banana (1 turn)<br>Dudefromaway (#3537053) defeated hot skeleton (1 turn)<br>Dudefromaway (#3537053) defeated cold skeleton (1 turn)<br></blockquote><b>Miscellaneous</b><blockquote>Datris (#2430207) got the carriageman 2016 sheet(s) drunker<br>Laggycat (#3137318) used The Machine, assisted by rulerofsmurfs and Datris<br></blockquote><b>The Woods</b><blockquote>Datris (#2430207) unlocked the attic of the cabin (1 turn)<br>Datris (#2430207) made the forest less spooky (1 turn)<br>Jimmyking (#3272033) got a Dreadsylvanian auditor's badge (1 turn)<br>Jimmyking (#3272033) got a cool seed pod (1 turn)<br>Hippasus (#3361506) made an impression of a complicated lock (1 turn)<br>Dudefromaway (#3537053) defeated stench bugbear x 5 (5 turns)<br>Dudefromaway (#3537053) defeated hot werewolf x 3 (3 turns)<br>Dudefromaway (#3537053) was defeated by cold werewolf (1 turn)<br>Dudefromaway (#3537053) was defeated by hot bugbear (1 turn)<br>Dudefromaway (#3537053) defeated sleaze bugbear x 2 (2 turns)<br>Dudefromaway (#3537053) defeated sleaze werewolf x 2 (2 turns)<br>Dudefromaway (#3537053) defeated hot bugbear x 4 (4 turns)<br>Dudefromaway (#3537053) defeated cold bugbear x 3 (3 turns)<br>Dudefromaway (#3537053) defeated stench werewolf x 4 (4 turns)<br>Dudefromaway (#3537053) defeated spooky bugbear (1 turn)<br>Dudefromaway (#3537053) defeated cold werewolf (1 turn)<br>Dudefromaway (#3537053) defeated spooky werewolf x 2 (2 turns)<br></blockquote><p><b>Loot Distribution:</b><p><blockquote>(none yet)</blockquote></table></div><div id='Hobopolis'><center><b>Hobopolis:<!--hoid:206542--></b><p><table style='border: 1px solid black;' cellpadding=5><tr><td class=small><center><b>3,187</b> turns spent in this dungeon:</center><p><b>Sewers:</b><blockquote>Inertia Reel (#593089) defeated a giant zombie goldfish x 5 (5 turns)<br>Inertia Reel (#593089) defeated a C. H. U. M. x 8 (8 turns)<br>Inertia Reel (#593089) defeated a sewer gator x 4 (4 turns)<br>Inertia Reel (#593089) explored 10 dark sewer tunnels (10 turns)<br>Inertia Reel (#593089) made it through the sewer (1 turn)<br>WenChtober (#1628649) explored 11 dark sewer tunnels (11 turns)<br>WenChtober (#1628649) defeated a C. H. U. M. x 8 (8 turns)<br>WenChtober (#1628649) defeated a giant zombie goldfish x 8 (8 turns)<br>WenChtober (#1628649) defeated a sewer gator x 6 (6 turns)<br>WenChtober (#1628649) made it through the sewer (1 turn)<br>Aquagelia (#1878048) defeated a sewer gator (1 turn)<br>Amandayla (#2114198) defeated a giant zombie goldfish x 26 (26 turns)<br>Amandayla (#2114198) defeated a sewer gator x 25 (25 turns)<br>Amandayla (#2114198) defeated a C. H. U. M. x 29 (29 turns)<br>Amandayla (#2114198) opened 4 sewer grates (4 turns)<br>Amandayla (#2114198) explored 4 dark sewer tunnels (4 turns)<br>Amandayla (#2114198) lowered the water level 6 times (6 turns)<br>Amandayla (#2114198) rescued AverageChumBait from a C. H. U. M. cage (1 turn)<br>Amandayla (#2114198) made it through the sewer (1 turn)<br>Les Popyur Highman (#3056134) defeated a C. H. U. M. x 10 (10 turns)<br>Les Popyur Highman (#3056134) opened 4 sewer grates (4 turns)<br>Les Popyur Highman (#3056134) defeated a giant zombie goldfish x 12 (12 turns)<br>Les Popyur Highman (#3056134) lowered the water level 5 times (5 turns)<br>Les Popyur Highman (#3056134) defeated a sewer gator x 9 (9 turns)<br>Les Popyur Highman (#3056134) explored 10 dark sewer tunnels (10 turns)<br>Les Popyur Highman (#3056134) made it through the sewer (1 turn)<br>SwaggerFortune (#3268818) defeated a C. H. U. M. x 12 (12 turns)<br>SwaggerFortune (#3268818) lowered the water level 5 times (5 turns)<br>SwaggerFortune (#3268818) opened 8 sewer grates (8 turns)<br>SwaggerFortune (#3268818) defeated a giant zombie goldfish x 14 (14 turns)<br>SwaggerFortune (#3268818) was defeated by a giant zombie goldfish (1 turn)<br>SwaggerFortune (#3268818) explored 6 dark sewer tunnels (6 turns)<br>SwaggerFortune (#3268818) was defeated by a sewer gator (1 turn)<br>SwaggerFortune (#3268818) defeated a sewer gator x 8 (8 turns)<br>SwaggerFortune (#3268818) made it through the sewer (1 turn)<br>Ethan44 (#3336934) explored 5 dark sewer tunnels (5 turns)<br>Ethan44 (#3336934) opened a sewer grate (1 turn)<br>Ethan44 (#3336934) defeated a sewer gator x 7 (7 turns)<br>Ethan44 (#3336934) defeated a C. H. U. M. x 9 (9 turns)<br>Ethan44 (#3336934) defeated a giant zombie goldfish x 6 (6 turns)<br>Ethan44 (#3336934) made it through the sewer (1 turn)<br>Dudefromaway (#3537053) defeated a giant zombie goldfish x 12 (12 turns)<br>Dudefromaway (#3537053) defeated a sewer gator x 12 (12 turns)<br>Dudefromaway (#3537053) defeated a C. H. U. M. x 14 (14 turns)<br>Dudefromaway (#3537053) explored 12 dark sewer tunnels (12 turns)<br>Dudefromaway (#3537053) made it through the sewer (1 turn)<br>Milbert Boofella (#3602580) explored a dark sewer tunnel (1 turn)<br>Milbert Boofella (#3602580) defeated a C. H. U. M. x 2 (2 turns)<br>Milbert Boofella (#3602580) defeated a sewer gator x 2 (2 turns)<br>Cavatappi11 (#3605099) opened 2 sewer grates (2 turns)<br>Cavatappi11 (#3605099) explored 8 dark sewer tunnels (8 turns)<br>Cavatappi11 (#3605099) defeated a sewer gator x 9 (9 turns)<br>Cavatappi11 (#3605099) defeated a C. H. U. M. x 7 (7 turns)<br>Cavatappi11 (#3605099) defeated a giant zombie goldfish x 5 (5 turns)<br>Cavatappi11 (#3605099) made it through the sewer (1 turn)<br>Tarken (#3616249) defeated a giant zombie goldfish x 9 (9 turns)<br>Tarken (#3616249) defeated a sewer gator x 7 (7 turns)<br>Tarken (#3616249) defeated a C. H. U. M. x 9 (9 turns)<br>Tarken (#3616249) lowered the water level 2 times (2 turns)<br>Tarken (#3616249) opened a sewer grate (1 turn)<br></blockquote><b>Exposure Esplanade:</b><blockquote>Inertia Reel (#593089) defeated Cold hobo x 100 (100 turns)<br>Inertia Reel (#593089) yodeled like crazy (1 turn)<br>Inertia Reel (#593089) raided a freezer (1 turn)<br>Inertia Reel (#593089) diverted some cold water out of Exposure Esplanade (16 turns)<br>Inertia Reel (#593089) diverted some cold water to Burnbarrel Blvd. (2 turns)<br>Inertia Reel (#593089) broke a water pipe (1 turn)<br>Inertia Reel (#593089) was defeated by Cold hobo x 53 (53 turns)<br>WenChtober (#1628649) was defeated by Cold hobo x 22 (22 turns)<br>WenChtober (#1628649) yodeled like crazy (1 turn)<br>WenChtober (#1628649) defeated Cold hobo x 2 (2 turns)<br>OGL (#2873594) defeated Cold hobo x 2 (2 turns)<br>Les Popyur Highman (#3056134) diverted some cold water to Burnbarrel Blvd. (15 turns)<br>Les Popyur Highman (#3056134) defeated Cold hobo x 104 (104 turns)<br>Les Popyur Highman (#3056134) diverted some cold water out of Exposure Esplanade (14 turns)<br>Les Popyur Highman (#3056134) was defeated by Cold hobo x 15 (15 turns)<br>Les Popyur Highman (#3056134) raided 4 freezers (4 turns)<br>Les Popyur Highman (#3056134) yodeled like crazy (1 turn)<br>Les Popyur Highman (#3056134) broke a water pipe (1 turn)<br></blockquote><b>Town Square:</b><blockquote>WenChtober (#1628649) defeated Normal hobo x 257 (257 turns)<br>WenChtober (#1628649) went shopping in the Marketplace (3 turns)<br>WenChtober (#1628649) was defeated by Normal hobo (1 turn)<br>Amandayla (#2114198) defeated Normal hobo x 57 (57 turns)<br>Amandayla (#2114198) went shopping in the Marketplace (2 turns)<br>OGL (#2873594) defeated Normal hobo x 2 (2 turns)<br>Les Popyur Highman (#3056134) defeated Normal hobo x 497 (497 turns)<br>Les Popyur Highman (#3056134) went shopping in the Marketplace (1 turn)<br>SwaggerFortune (#3268818) defeated Normal hobo x 312 (312 turns)<br>SwaggerFortune (#3268818) went shopping in the Marketplace (1 turn)<br>SwaggerFortune (#3268818) was defeated by Normal hobo (1 turn)<br>Ethan44 (#3336934) defeated Normal hobo x 119 (119 turns)<br>Ethan44 (#3336934) went shopping in the Marketplace (1 turn)<br>Ethan44 (#3336934) was defeated by Normal hobo (1 turn)<br>Dudefromaway (#3537053) defeated Normal hobo x 9 (9 turns)<br></blockquote><b>Burnbarrel Blvd.:</b><blockquote>WenChtober (#1628649) defeated Hot hobo x 182 (182 turns)<br>WenChtober (#1628649) threw 7 tires on the fire (7 turns)<br>WenChtober (#1628649) started 7 tirevalanches (7 turns)<br>Amandayla (#2114198) defeated Hot hobo (1 turn)<br>Les Popyur Highman (#3056134) threw 6 tires on the fire (6 turns)<br>Les Popyur Highman (#3056134) defeated Hot hobo x 7 (7 turns)<br><b>Les Popyur Highman (#3056134) defeated Ol' Scratch (1 turn)</b><br>Ethan44 (#3336934) threw 33 tires on the fire (33 turns)<br>Ethan44 (#3336934) defeated Hot hobo x 89 (89 turns)<br>Ethan44 (#3336934) started a tirevalanche (1 turn)<br>Cavatappi11 (#3605099) threw 9 tires on the fire (9 turns)<br>Cavatappi11 (#3605099) defeated Hot hobo x 26 (26 turns)<br>Cavatappi11 (#3605099) got burned by a hot door (1 turn)<br>Cavatappi11 (#3605099) found a cache of Meat for the clan coffer (1 turn)<br></blockquote><b>The Heap:</b><blockquote>WenChtober (#1628649) defeated Stench hobo x 311 (311 turns)<br>WenChtober (#1628649) was defeated by Stench hobo (1 turn)<br>Amandayla (#2114198) defeated Stench hobo x 155 (155 turns)<br>Amandayla (#2114198) started 2 trashcano eruptions (2 turns)<br>Amandayla (#2114198) sent 2 batches of compost to the Burial Ground (2 turns)<br><b>Amandayla (#2114198) defeated Oscus (1 turn)</b><br>Les Popyur Highman (#3056134) defeated Stench hobo x 17 (17 turns)<br>Les Popyur Highman (#3056134) sent a batch of compost to the Burial Ground (1 turn)<br>Dudefromaway (#3537053) defeated Stench hobo x 3 (3 turns)<br></blockquote><b>The Ancient Hobo Burial Ground:</b><blockquote>WenChtober (#1628649) was defeated by Spooky hobo (1 turn)<br>Les Popyur Highman (#3056134) defeated Spooky hobo x 64 (64 turns)<br></blockquote><b>The Purple Light District:</b><blockquote>WenChtober (#1628649) defeated Sleaze hobo x 219 (219 turns)<br>WenChtober (#1628649) sent some trash to The Heap (9 turns)<br></blockquote><p><b>Loot Distribution:</b><p><blockquote>(none yet)</blockquote></table></div><div id='SlimeTube'><center><b>The Slime Tube:<!--slid:206540--></b><p><table style='border: 1px solid black;' cellpadding=5><tr><td class=small><center><b>348</b> turns spent in this dungeon:</center><p><b>Miscellaneous</b><blockquote>Tissen (#51350) defeated a Slime Tube monster x 5 (5 turns)<br>Tissen (#51350) squeezed a Slime gall bladder (1 turn)<br>Tissen (#51350) was defeated by a Slime Tube monster (1 turn)<br>WenChtober (#1628649) defeated a Slime Tube monster x 103 (103 turns)<br>WenChtober (#1628649) was defeated by a Slime Tube monster x 2 (2 turns)<br>WenChtober (#1628649) squeezed a Slime gall bladder (1 turn)<br>Amandayla (#2114198) defeated a Slime Tube monster x 71 (71 turns)<br>Amandayla (#2114198) tickled a Slime uvula (1 turn)<br>Follyhall (#2197653) was defeated by a Slime Tube monster (1 turn)<br>Follyhall (#2197653) defeated a Slime Tube monster (1 turn)<br>deakr (#2432933) defeated a Slime Tube monster x 25 (25 turns)<br>Canart (#3138482) defeated a Slime Tube monster x 42 (42 turns)<br>Ethan44 (#3336934) tickled a Slime uvula (1 turn)<br>Ethan44 (#3336934) defeated a Slime Tube monster x 3 (3 turns)<br>Dudefromaway (#3537053) defeated a Slime Tube monster x 2 (2 turns)<br>Dudefromaway (#3537053) tickled a Slime uvula (1 turn)<br>HereBeJohnny (#3594190) defeated a Slime Tube monster x 76 (76 turns)<br>HereBeJohnny (#3594190) tickled a Slime uvula (1 turn)<br>HereBeJohnny (#3594190) was defeated by a Slime Tube monster x 3 (3 turns)<br>Milbert Boofella (#3602580) defeated a Slime Tube monster x 4 (4 turns)<br>CausingInsanity (#3623018) defeated a Slime Tube monster (1 turn)<br>CausingInsanity (#3623018) was defeated by a Slime Tube monster (1 turn)<br>Penny Lasagna (#3631550) defeated a Slime Tube monster (1 turn)<br></blockquote><p><b>Loot Distribution:</b><p><blockquote>(none yet)</blockquote></table></div><center><p><b>Previous Clan Dungeon Runs:</b><p><iframe src=clan_oldraidlogs.php width=700 height=300 style='border: 1px solid black;'></iframe></center><p><Center><a href="clan_basement.php">Back to clan basement</a></center></td></tr></table></center></td></tr><tr><td height=4></td></tr></table></body></html>
@@ -0,0 +1 @@
1
+ <html><head><script language=Javascript><!--if (parent.frames.length == 0) location.href="game.php";//--></script><script language=Javascript src="https://d2uyhvukfffg5a.cloudfront.net/scripts/jquery-1.5.1.js"></script><script language=Javascript src="https://d2uyhvukfffg5a.cloudfront.net/scripts/keybinds.min.2.js"></script><script language=Javascript src="https://d2uyhvukfffg5a.cloudfront.net/scripts/window.20111231.js"></script><script language="javascript">function chatFocus(){if(top.chatpane.document.chatform.graf) top.chatpane.document.chatform.graf.focus();}if (typeof defaultBind != 'undefined') { defaultBind(47, 2, chatFocus); defaultBind(190, 2, chatFocus);defaultBind(191, 2, chatFocus); defaultBind(47, 8, chatFocus);defaultBind(190, 8, chatFocus); defaultBind(191, 8, chatFocus); }</script><script>function switchFocus(){if (top.chatpane.document.chatform.graf.focus)top.chatpane.document.chatform.graf.focus();return false;}function repeat(){var linx = document.getElementsByTagName("A");for (var i = 0; i < linx.length; i++){if (typeof timersfunc != 'undefined') {if (!timersfunc()) {return;}timersfunc = null;}var link = linx[i];if (link.innerHTML.match(/Adventure Again/) || link.innerHTML.match(/Do it again/) || (link.getAttribute && link.getAttribute('id')=='againlink'))location.href = link.href;}}defaultBind(47, CTRL, switchFocus);defaultBind(191, CTRL, switchFocus);defaultBind(47, META, switchFocus);defaultBind(191, META, switchFocus);defaultBind(192, NONE, repeat);defaultBind(220, NONE, repeat);</script><script language="javascript">function updateParseItem(iid, field, info) {var tbl = $('#ic'+iid);var data = parseItem(tbl);if (!data) return;data[field] = info;var out = [];for (i in data) {if (!data.hasOwnProperty(i)) continue;out.push(i+'='+data[i]);}tbl.attr('rel', out.join('&'));}function parseItem(tbl) {tbl = $(tbl);var rel = tbl.attr('rel');var data = {};if (!rel) return data;var parts = rel.split('&');for (i in parts) {if (!parts.hasOwnProperty(i)) continue;var kv = parts[i].split('=');tbl.data(kv[0], kv[1]);data[kv[0]] = kv[1];}return data;}</script><script type="text/javascript" src="https://d2uyhvukfffg5a.cloudfront.net/scripts/pop_query.20230713.js"></script><script type="text/javascript" src="https://d2uyhvukfffg5a.cloudfront.net/scripts/ircm.20230626.js"></script><script type="text/javascript">var tp = top;function pop_ircm_contents(i, some) {var contents = '',shown = 0,da = '&nbsp;<a href="#" rel="?" class="small dojaxy">[some]</a>&nbsp;<a href="#" rel="',db = '" class="small dojaxy">[all]</a>',dc = '<div style="width:100%; padding-bottom: 3px;" rel="',dd = '<a href="#" rel="1" class="small dojaxy">[';return [contents, shown];}tp=topvar todo = [];function nextAction() {var next_todo = todo.shift();if (next_todo) {eval(next_todo);}}function dojax(dourl, afterFunc, hoverCaller, failureFunc, method, params) {$.ajax({type: method || 'GET', url: dourl, cache: false,data: params || null,global: false,success: function (out) {nextAction();if (out.match(/no\|/)) {var parts = out.split(/\|/);if (failureFunc) failureFunc(parts[1]);else if (window.dojaxFailure) window.dojaxFailure(parts[1]);else if (tp.chatpane.handleMessage) tp.chatpane.handleMessage({type: 'event', msg: 'Oops! Sorry, Dave, you appear to be ' + parts[1]});else $('#ChatWindow').append('<font color="green">Oops! Sorry, Dave, you appear to be ' + parts[1] + '.</font><br />' + "\n");return;}if (hoverCaller) {float_results(hoverCaller, out);if (afterFunc) { afterFunc(out); }return;}$(tp.mainpane.document).find("#effdiv").remove(); if(!window.dontscroll || (window.dontscroll && dontscroll==0)) { window.scroll(0,0);}var $eff = $(tp.mainpane.document).find('#effdiv');if ($eff.length == 0) {var d = tp.mainpane.document.createElement('DIV');d.id = 'effdiv';var b = tp.mainpane.document.body;if ($('#content_').length > 0) {b = $('#content_ div:first')[0];}b.insertBefore(d, b.firstChild);$eff = $(d);}$eff.find('a[name="effdivtop"]').remove().end().prepend('<a name="effdivtop"></a><center>' + out + '</center>').css('display','block');if (!window.dontscroll || (window.dontscroll && dontscroll==0)) {tp.mainpane.document.location = tp.mainpane.document.location + "#effdivtop";}if (afterFunc) { afterFunc(out); }}});}</script><script>var currentkey = 49;$(document).ready(function () {$('form').each(function () {var form = this;defaultBind(currentkey++, NONE, function () { form.submit(); });return currentkey < 58;});});</script> <link rel="stylesheet" type="text/css" href="https://d2uyhvukfffg5a.cloudfront.net/styles.20230117d.css"><style type='text/css'>.faded {zoom: 1;filter: alpha(opacity=35);opacity: 0.35;-khtml-opacity: 0.35;-moz-opacity: 0.35;}</style></head><body><Center><centeR><!--faaaaaaart--><table width=95% cellspacing=0 cellpadding=0><tr><td style="background-color: blue" align=center ><b style="color: white">Visiting the Skeleton of Crimbo Past</b></td></tr><tr><td style="padding: 5px; border: 1px solid blue;"><center><table><tr><td>You cringe as the Skeleton of Crimbo Past opens his coat, but it turns out he just has a bunch of stuff in there to sell to you. He points to an array of items with prices listed in knucklebones. <i>"Whaddya buyin'?"</i> he would doubtlessly say, in a gravelly, Cockney-esque voice, if he could talk. <p>You have 7452 knucklebones.<center><form style='margin: 0px 0px 0px 0px;' name=choiceform1 action=choice.php method=post><input type=hidden name=pwd value='f2581975789fef914fb102a569acf2ed'><input type=hidden name=whichchoice value=1567><input type=hidden name=option value=1><table><tr><td valign=center><input class=button type=submit value="Buy a Smoking Pope"></td><td valign=center><img style="margin-right: 1em; cursor:pointer; " onclick="descitem(636925864)" alt="Smoking Pope" title="Smoking Pope" src="https://d2uyhvukfffg5a.cloudfront.net/itemimages/smokingpope.gif" height="30" width="30" /> (5 knucklebones)</td></tr></table></form><p><form style='margin: 0px 0px 0px 0px;' name=choiceform2 action=choice.php method=post><input type=hidden name=pwd value='f2581975789fef914fb102a569acf2ed'><input type=hidden name=whichchoice value=1567><input type=hidden name=option value=2><table><tr><td valign=center><input class=button type=submit value="Buy a prize turkey"></td><td valign=center><img style="margin-right: 1em; cursor:pointer; " onclick="descitem(691007693)" alt="prize turkey" title="prize turkey" src="https://d2uyhvukfffg5a.cloudfront.net/itemimages/prizeturkey.gif" height="30" width="30" />(5 knucklebones)</td></tr></table></form><p><form style='margin: 0px 0px 0px 0px;' name=choiceform3 action=choice.php method=post><input type=hidden name=pwd value='f2581975789fef914fb102a569acf2ed'><input type=hidden name=whichchoice value=1567><input type=hidden name=option value=3><table><tr><td valign=center><input class=button type=submit value="Buy medical gruel"></td><td valign=center><img style="margin-right: 1em; cursor:pointer; " onclick="descitem(965873114)" alt="medicinal gruel" title="medicinal gruel" src="https://d2uyhvukfffg5a.cloudfront.net/itemimages/soupbowl.gif" height="30" width="30" />(5 knucklebones)</td></tr></table></form><p><form style='margin: 0px 0px 0px 0px;' name=choiceform4 action=choice.php method=post><input type=hidden name=pwd value='f2581975789fef914fb102a569acf2ed'><input type=hidden name=whichchoice value=1567><input type=hidden name=option value=4><table><tr><td valign=center><input class=button type=submit value="Daily Special: roboduck-on-a-string"></td><td valign=center><img style="margin-right: 1em; cursor:pointer;" onclick="descitem(153919945)" alt="roboduck-on-a-string" title="roboduck-on-a-string" src="https://d2uyhvukfffg5a.cloudfront.net/itemimages/roboduck.gif" height="30" width="30" />(1388 knucklebones)</td></tr></table></form><p><form style='margin: 0px 0px 0px 0px;' name=choiceform5 action=choice.php method=post><input type=hidden name=pwd value='f2581975789fef914fb102a569acf2ed'><input type=hidden name=whichchoice value=1567><input type=hidden name=option value=5><input class=button type=submit value="Let's talk later"></form><p></center></td></tr></table></center></td></tr><tr><td height=4></td></tr></table></center><!--faaaaaaart--></body></html>
package/src/index.ts CHANGED
@@ -1,6 +1,12 @@
1
- export { Player } from "./Player.js";
2
- export { Client, type MallPrice } from "./Client.js";
1
+ export { Player, type ProfileData } from "./Player.js";
2
+ export { AuthError, Client, type MallPrice, RolloverError } from "./Client.js";
3
+ export { LoathingDate } from "./LoathingDate.js";
4
+ export { statsForLevel, levelForMainstat, levelForSubstat } from "./stats.js";
3
5
 
4
- export { resolveKoLImage } from "./utils/utils.js";
6
+ export {
7
+ resolveKoLImage,
8
+ cleanString,
9
+ toWikiLink,
10
+ parseKoLNumber,
11
+ } from "./utils/utils.js";
5
12
  export type { KmailItem, KoLMessage } from "./utils/kmail.js";
6
- export type { SubboardInfo } from "./utils/leaderboard.js";
package/src/stats.ts ADDED
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Convert a player level to the mainstat and substat thresholds needed.
3
+ *
4
+ * In KoL, each level requires a minimum mainstat, and each mainstat
5
+ * point requires substats² total substats to reach.
6
+ */
7
+ export function statsForLevel(level: number) {
8
+ return {
9
+ level,
10
+ mainstat: Math.pow(level, 2) - level * 2 + 5,
11
+ substat: Math.pow(Math.pow(level - 1, 2) + 4, 2),
12
+ };
13
+ }
14
+
15
+ /**
16
+ * Determine the level and total substat for a given mainstat value.
17
+ */
18
+ export function levelForMainstat(mainstat: number) {
19
+ return {
20
+ level: 1 + Math.floor(Math.sqrt(Math.max(0, mainstat - 4))),
21
+ mainstat,
22
+ substat: Math.pow(mainstat, 2),
23
+ };
24
+ }
25
+
26
+ /**
27
+ * Determine the mainstat and level for a given total substat count.
28
+ */
29
+ export function levelForSubstat(substat: number) {
30
+ return levelForMainstat(Math.floor(Math.sqrt(Math.max(0, substat))));
31
+ }
@@ -13,7 +13,7 @@ export type KmailItem = {
13
13
  };
14
14
 
15
15
  export type KoLChatMessage = {
16
- who?: Player<false>;
16
+ who?: Player;
17
17
  type?: string;
18
18
  msg?: string;
19
19
  link?: string;
@@ -27,7 +27,7 @@ export const isValidMessage = (
27
27
  msg: KoLChatMessage,
28
28
  ): msg is KoLChatMessage & {
29
29
  type: KoLMessageType;
30
- who: Player<false>;
30
+ who: Player;
31
31
  msg: string;
32
32
  } => msg.who !== undefined && msg.msg !== undefined;
33
33
 
@@ -43,7 +43,7 @@ export type KoLKmail = {
43
43
 
44
44
  export type BaseKoLMessage = {
45
45
  type: KoLMessageType;
46
- who: Player<false>;
46
+ who: Player;
47
47
  msg: string;
48
48
  time: Date;
49
49
  };
@@ -31,3 +31,46 @@ export function resolveKoLImage(path: string) {
31
31
  export function wait(ms: number) {
32
32
  return new Promise((r) => setTimeout(r, ms));
33
33
  }
34
+
35
+ const RESISTANCE_ADJECTIVES: Record<number, string> = {
36
+ [-9]: "Total",
37
+ [-7]: "Terrible",
38
+ [-5]: "Troubling",
39
+ [-4]: "Tragic",
40
+ [-3]: "Threatening",
41
+ [-2]: "Trifling",
42
+ [-1]: "Trivial",
43
+ 1: "Slight",
44
+ 2: "So-So",
45
+ 3: "Serious",
46
+ 4: "Stupendous",
47
+ 5: "Superhuman",
48
+ 6: "Superb",
49
+ 7: "Stunning",
50
+ 8: "Supreme",
51
+ 9: "Sublime",
52
+ };
53
+
54
+ export function getElementalResistanceAdjective(level: number): string {
55
+ return RESISTANCE_ADJECTIVES[level] ?? "Unknown";
56
+ }
57
+
58
+ /** Strip HTML tags and decode entities from KoL output. */
59
+ export function cleanString(input: string | undefined): string {
60
+ if (!input) return "";
61
+ return decodeHTML(input).replace(/<[^>]+>/g, "");
62
+ }
63
+
64
+ /** Build a URL to the KoL wiki for a given page name. */
65
+ export function toWikiLink(input: string): string {
66
+ return `https://wiki.kingdomofloathing.com/${encodeURI(
67
+ input.replace(/\s/g, "_"),
68
+ )
69
+ .replace(/\(/g, "%28")
70
+ .replace(/\)/g, "%29")}`;
71
+ }
72
+
73
+ /** Parse a KoL-formatted number (with comma separators). */
74
+ export function parseKoLNumber(input?: string): number {
75
+ return parseInt(input?.replaceAll(",", "") || "0");
76
+ }
package/src/Cache.ts DELETED
@@ -1,33 +0,0 @@
1
- import { Client } from "./Client.js";
2
- import { Player } from "./Player.js";
3
-
4
- export class Cache<T> {
5
- client: Client;
6
-
7
- constructor(client: Client) {
8
- this.client = client;
9
- }
10
-
11
- cache: T[] = [];
12
- }
13
-
14
- export class PlayerCache extends Cache<Player<boolean>> {
15
- async fetch(identifier: string | number, full: true): Promise<Player<true>>;
16
- async fetch(identifier: string | number): Promise<Player<boolean>>;
17
- async fetch(identifier: string | number, full = false) {
18
- const player = await (async () => {
19
- const cached = this.cache.find((p) => p.matchesIdentifier(identifier));
20
- if (cached) {
21
- return cached;
22
- }
23
- const fetched = await Player.from(this.client, identifier);
24
- if (!fetched) return null;
25
- this.cache.push(fetched);
26
- return fetched;
27
- })();
28
-
29
- if (!player) return player;
30
-
31
- return full ? await player.full() : player;
32
- }
33
- }
@@ -1,78 +0,0 @@
1
- import { selectAll, selectOne } from "css-select";
2
- import { parseDocument } from "htmlparser2";
3
- import { Element, Document, isComment, Text } from "domhandler";
4
- import { innerText } from "domutils";
5
-
6
- export type LeaderboardInfo = {
7
- name: string;
8
- boards: SubboardInfo[];
9
- };
10
-
11
- export type SubboardInfo = {
12
- name: string;
13
- runs: RunInfo[];
14
- updated: Date | null;
15
- };
16
-
17
- type RunInfo = {
18
- playerName: string;
19
- playerId: number;
20
- days: string;
21
- turns: string;
22
- };
23
-
24
- const blankNode = new Text("");
25
-
26
- export function parseLeaderboard(page: string): LeaderboardInfo {
27
- const doc = parseDocument(page);
28
- const [container, ...boards] = selectAll("table", doc);
29
-
30
- return {
31
- name: innerText(selectOne("tr", container) ?? blankNode)
32
- .replace(/\s+/g, " ")
33
- .trim(),
34
- boards: boards
35
- .slice(1)
36
- .filter((board) => {
37
- if (selectAll(":scope > tr, :scope > tbody > tr", board).length <= 1)
38
- return false;
39
- const text = innerText(selectOne("tr", board) ?? blankNode);
40
- return text.match(/^((Fast|Funn|B)est|Most (Goo|Elf))/);
41
- })
42
- .map((subboard) => {
43
- const rows = selectAll("tr", subboard);
44
-
45
- return {
46
- name: innerText(rows[0]),
47
- runs: selectAll("td tr", rows[1])
48
- .slice(2)
49
- .map((node) => {
50
- const rowText = selectAll("td", node).map((col) =>
51
- innerText(col).replace(/&amp;nbsp;/g, ""),
52
- );
53
- const playerLink = (selectOne("a", node) as Element | null)
54
- ?.attribs.href;
55
- const hasTwoNumbers = !!parseInt(rowText[rowText.length - 2]);
56
- return {
57
- playerName: rowText
58
- .slice(0, rowText.length - (hasTwoNumbers ? 2 : 1))
59
- .join("")
60
- .trim()
61
- .toString(),
62
- playerId: Number(
63
- playerLink?.substring(playerLink.indexOf("who=") + 4) ?? "0",
64
- ),
65
- days: hasTwoNumbers
66
- ? rowText[rowText.length - 2].toString() || "0"
67
- : "",
68
- turns: rowText[rowText.length - 1].toString() || "0",
69
- };
70
- }),
71
- updated:
72
- subboard.nextSibling && isComment(subboard.nextSibling)
73
- ? new Date(subboard.nextSibling.data.slice(9, -1))
74
- : null,
75
- };
76
- }),
77
- };
78
- }