kol.js 0.1.7 → 0.1.8

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.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "kol.js",
3
- "version": "0.1.7",
3
+ "version": "0.1.8",
4
4
  "main": "src/index.ts",
5
5
  "type": "module",
6
6
  "files": [
@@ -13,23 +13,22 @@
13
13
  "format": "prettier --write ."
14
14
  },
15
15
  "devDependencies": {
16
- "prettier": "^3.3.3",
17
- "typescript": "^5.6.2",
18
- "vitest": "^2.1.0"
16
+ "prettier": "^3.5.3",
17
+ "typescript": "^5.8.2",
18
+ "vitest": "^3.0.9"
19
19
  },
20
20
  "dependencies": {
21
21
  "async-mutex": "^0.5.0",
22
22
  "css-select": "^5.1.0",
23
- "date-fns": "^3.6.0",
23
+ "date-fns": "^4.1.0",
24
24
  "domhandler": "^5.0.3",
25
- "domutils": "^3.1.0",
26
- "got": "^14.4.2",
27
- "html-entities": "^2.5.2",
28
- "htmlparser2": "^9.1.0",
29
- "image-size": "^1.1.1",
30
- "node-html-parser": "^6.1.13",
25
+ "domutils": "^3.2.2",
26
+ "got": "^14.4.6",
27
+ "html-entities": "^2.5.3",
28
+ "htmlparser2": "^10.0.0",
29
+ "image-size": "^2.0.1",
31
30
  "querystring": "^0.2.1",
32
- "tough-cookie": "^5.0.0",
31
+ "tough-cookie": "^5.1.2",
33
32
  "ts-dedent": "^2.2.0",
34
33
  "typed-emitter": "^2.1.0"
35
34
  }
package/src/Client.ts CHANGED
@@ -42,6 +42,17 @@ type Familiar = {
42
42
  image: string;
43
43
  };
44
44
 
45
+ type ApiStatus = {
46
+ /** number of ascensions */
47
+ ascensions: string;
48
+ /** number of turns played */
49
+ turnsplayed: string;
50
+ /** kol game day number */
51
+ daynumber: string;
52
+ /** session password */
53
+ pwd: string;
54
+ };
55
+
45
56
  export class Client extends (EventEmitter as unknown as new () => TypedEmitter<Events>) {
46
57
  actionMutex = new Mutex();
47
58
  session = got.extend({
@@ -135,7 +146,7 @@ export class Client extends (EventEmitter as unknown as new () => TypedEmitter<E
135
146
  if (await this.checkLoggedIn()) return true;
136
147
  if (this.#isRollover) return false;
137
148
  try {
138
- await this.session
149
+ const result = await this.session
139
150
  .post("login.php", {
140
151
  form: {
141
152
  loggingin: "Yup.",
@@ -147,6 +158,10 @@ export class Client extends (EventEmitter as unknown as new () => TypedEmitter<E
147
158
  })
148
159
  .text();
149
160
 
161
+ if (Client.#rolloverPattern.test(result)) {
162
+ throw new Error("It's rollover!");
163
+ }
164
+
150
165
  if (!(await this.checkLoggedIn())) return false;
151
166
 
152
167
  if (this.postRolloverLatch) {
@@ -181,11 +196,11 @@ export class Client extends (EventEmitter as unknown as new () => TypedEmitter<E
181
196
  }
182
197
  }
183
198
 
199
+ static #rolloverPattern =
200
+ /The system is currently down for nightly maintenance/;
201
+
184
202
  async #checkForRollover() {
185
- const isRollover =
186
- /The system is currently down for nightly maintenance/.test(
187
- await this.fetchText("/"),
188
- );
203
+ const isRollover = Client.#rolloverPattern.test(await this.fetchText(""));
189
204
 
190
205
  if (this.#isRollover && !isRollover) {
191
206
  // Set the post-rollover latch so the bot can react on next log in.
@@ -196,7 +211,7 @@ export class Client extends (EventEmitter as unknown as new () => TypedEmitter<E
196
211
 
197
212
  if (this.#isRollover) {
198
213
  // Rollover appears to be in progress. Check again in one minute.
199
- setTimeout(() => this.#checkForRollover(), 60000);
214
+ setTimeout(() => this.#checkForRollover(), 60_000);
200
215
  }
201
216
  }
202
217
 
@@ -251,6 +266,14 @@ export class Client extends (EventEmitter as unknown as new () => TypedEmitter<E
251
266
  });
252
267
  }
253
268
 
269
+ async fetchStatus(): Promise<ApiStatus | null> {
270
+ const api = await this.fetchJson<ApiStatus>("api.php", {
271
+ searchParams: { what: "status", for: `${this.#username} bot` },
272
+ });
273
+
274
+ return api;
275
+ }
276
+
254
277
  async fetchKmails(): Promise<KmailMessage[]> {
255
278
  const kmails = await this.fetchJson<KoLKmail[]>("api.php", {
256
279
  searchParams: {
@@ -542,17 +565,36 @@ export class Client extends (EventEmitter as unknown as new () => TypedEmitter<E
542
565
  );
543
566
  const yesterday = await Promise.all(
544
567
  winners
545
- ? [...winners].map(async (w) => ({
568
+ ? [...winners].map(async (w, i) => ({
546
569
  player: new Player(this, Number(w[2]), w[1]),
547
570
  item: await this.descIdToId(Number(w[3])),
548
571
  tickets: Number(w[4].replace(",", "")),
572
+ place: Math.min(i + 1, 2),
549
573
  }))
550
574
  : [],
551
575
  );
552
576
 
577
+ const { daynumber } = (await this.fetchStatus()) ?? { daynumber: "0" };
578
+
553
579
  return {
554
580
  today: { first, second },
555
581
  yesterday,
582
+ gameday: Number(daynumber),
556
583
  };
557
584
  }
585
+
586
+ async getStandard(date?: Date) {
587
+ if (!date) {
588
+ date = new Date();
589
+ date.setFullYear(date.getFullYear() - 2);
590
+ date.setMonth(0);
591
+ date.setDate(2);
592
+ }
593
+
594
+ const formattedDate = date.toISOString().split("T")[0];
595
+
596
+ return await this.fetchText("standard.php", {
597
+ searchParams: { date: formattedDate },
598
+ });
599
+ }
558
600
  }
@@ -0,0 +1,167 @@
1
+ <html><head>
2
+ <script language=Javascript>
3
+ <!--
4
+ if (parent.frames.length == -1) location.href="game.php";
5
+ top.charpane.location.href="charpane.php";
6
+ //-->
7
+ </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 src="/images/scripts/jquery-1.3.1.min.js"></script>
12
+ <script language=Javascript src="/images/scripts/window.js?foo=1"></script> <link rel="stylesheet" type="text/css" href="/images/styles.20230117d.css">
13
+ <style type='text/css'>
14
+ .faded {
15
+ zoom: 1;
16
+ filter: alpha(opacity=35);
17
+ opacity: 0.35;
18
+ -khtml-opacity: 0.35;
19
+ -moz-opacity: 0.35;
20
+ }
21
+ </style>
22
+
23
+ <script language="Javascript" src="/basics.js"></script><link rel="stylesheet" href="/basics.1.css" /></head>
24
+
25
+ <body>
26
+ <center><table width=95% cellspacing=0 cellpadding=0><tr><td style="color: white;" align=center bgcolor=blue><b>sweaty bill</b></td></tr><tr><td style="padding: 5px; border: 1px solid blue;"><center><table><tr><td><center><table><tr><td><div class='' style='position: relative'><img crossorigin="Anonymous" src="/images/otherimages/classav11_f.gif" width=60 height=100 border=0><img src="/images/otherimages/moustaches/17.png" style="position: absolute; top: 34px; left:12px; transform: rotate(7deg);" /></div></td><td valign=center><center><span style="position: relative;font-size: 200%"><b>sweaty bill</b> (#1515124)<br><div style="position: absolute; left: 250px; top: 87px"><img src="/images/otherimages/goldstart.png" height="30" width="30" /></div><div style="position: absolute; left: 189px; top: 102px"><img src="/images/otherimages/goldstart.png" height="30" width="30" /></div></span><span title='Bestowed by Beldur (#1046951)'>Farmed 15 Mr. As This Month</span></td><td valign=center align=center><a href=account_tattoos.php><img src="/images/otherimages/sigils/kgbtat.gif" alt="Tattoo: kgbtat" title="Tattoo: kgbtat" width=50 height=50 border=0></a></td></tr></table><table><tr><td colspan=2 height=1 bgcolor=black></td></tr><tr ><td align=right><b>Class:</b></td><td>Seal Clubber</td></tr><tr><td align=right><b>Points:</b></td><td>69 (+44)</td></tr><tr><td align=right><b>Sign:</b></td><td>The Platypus</td></tr><tr><td align=right><b>Muscle:</b></td><td><font color="blue">246</font> (30)</td></tr><tr><td align=right><b>Mysticality:</b></td><td><font color="blue">414</font> (129)</td></tr><tr><td align=right><b>Moxie:</b></td><td><font color="blue">118</font> (30)</td></tr><tr><td align=right><b>Cool:</b></td><td>&infin;</td></tr><tr><Td align=right><b><a class=nounder href="ascensionhistory.php?back=other&who=1515124">Ascensions</a>:</b></td><td>2,139</td></tr><tr><td align=right><b>Turns Played (total):</b></td><td>2,537,273</td></tr><tr><td align=right><b>Turns Played (this run):</b></td><td>0</td></tr><tr><td align=right><b>Trophies Collected:</b></td><td>39</td></tr><tr><td align=right><b>Tattoos Collected:</b></td><td>124</td></tr><tr><td align=right><b>Account Created:</b></td><td>November 09, 2007</td></tr><tr><td align=right><b>Last Login:</b></td><td>November 21, 2024</td></tr><tr><td align=right><b>Favorite Cheese:</b></td><td>Paneer</td></tr><tr><td align=right><b>Favorite Food:</b></td><td>FDKOL hotcakes </td></tr><tr><td align=right><b>Favorite Booze:</b></td><td>astral pilsner (11,597)</td></tr><tr><td align=right><b>Put a Ring On:</b></td><td><a href='showplayer.php?who=1197090'>gaUSiE</a></td></tr><tr><td colspan=2 height=1 bgcolor=black></td></tr></table><p><center>Witchess vs The World:</center><table><tr><td colspan=2 height=1 bgcolor=black></td></tr><td align="center"><table border="0"><tr><td align=right><b>Wins:</b></td><td>0</td></tr><tr><td align=right><b>Losses:</b></td><td>1</td></tr></table></td><tr><td colspan=2 height=1 bgcolor=black></td></tr></table><p><center>PvP:</center><table><tr><td colspan=2 height=1 bgcolor=black></td></tr><tr><td align=right><b>Fame:</b></td><td>2,079 (2,787 taken)</td></tr><tr><td align=right><b>Fame (Hardcore):</b></td><td>100 (0 taken)</td></tr><tr><td align=right><b>Winningness:</b></td><td>121</td></tr><tr><td align=right><b>PvP Allegiance:</b></td><td><a class=nounder href="showclan.php?whichclan=2046982453">Alliance from Hobopolis</a></td></tr><tr><td colspan=2 height=1 bgcolor=black></td></tr></table><p><center>PvP All-Time Best Ranks:</center><table><tr><td colspan=2 height=1 bgcolor=black></td></tr><tr><td align="center" valign="top"><i>Normal</i><table><tr><td align="right"><b>Fame:</b></td><td>29&nbsp;&nbsp;</td></tr><tr><td align="right"><b>Fame Taken:</b></td><td>8&nbsp;&nbsp;</td></tr><tr><td align="right"><b>Winningest:</b></td><td>25&nbsp;&nbsp;</td></tr></table></td><td align="center" valign="top"><i>Hardcore</i><table><tr><td align="right"><b>Winningest</b>:</td><td>13</td></tr></table></td></tr><tr><td colspan=2 height=1 bgcolor=black></td></tr></table><p><p><center>Equipment:</center><table><tr><td width='100' colspan=2 height=1 bgcolor=black></td></tr><tr ><td width=30 height=30><img src="/images/itemimages/vikinghat.gif" class=hand onClick='descitem(421476959, 1515124)'></td><td valign=center><b>norwhal helmet</b></td></tr><tr ><td width=30 height=30><img src="/images/itemimages/partymouse.gif" class=hand onClick='descitem(697608546, 1515124)'></td><td valign=center><b>Buddy Bjorn</b></td></tr><tr ><td width=30 height=30><img src="/images/itemimages/cardigan.gif" class=hand onClick='descitem(732556455, 1515124)'></td><td valign=center><b>LOV Eardigan</b></td></tr><tr ><td width=30 height=30><img src="/images/itemimages/may4sword.gif" class=hand onClick='descitem(651314979, 1515124)'></td><td valign=center><b>Fourth of May Cosplay Saber</b></td></tr><tr ><td width=30 height=30><img src="/images/itemimages/unbrella7.gif" class=hand onClick='descitem(712482724, 1515124)'></td><td valign=center><b>unbreakable umbrella</b></td></tr><tr ><td width=30 height=30><img src="/images/itemimages/sweats.gif" class=hand onClick='descitem(800334855, 1515124)'></td><td valign=center><b>designer sweatpants</b></td></tr><tr ><td width=30 height=30><img src="/images/itemimages/guzzlrtablet.gif" class=hand onClick='descitem(413321705, 1515124)'></td><td valign=center><b>Guzzlr tablet</b></td></tr><tr ><td width=30 height=30><img src="/images/itemimages/cincho.gif" class=hand onClick='descitem(408302806, 1515124)'></td><td valign=center><b>Cincho de Mayo</b></td></tr><tr ><td width=30 height=30><img src="/images/itemimages/barrelhoop.gif" class=hand onClick='descitem(855987487, 1515124)'></td><td valign=center><b>barrel hoop earring</b></td></tr><tr><td colspan=2 height=1 bgcolor=black></td></tr></table><p>Familiar:<Br><table><tr><td colspan=5 height=1 bgcolor=black></td></tr><tr><td><a href="showfamiliars.php?who=1515124"><img src="/images/itemimages/tottot.gif" width=30 height=30 border=0></a></td><td valign=center><b>Kendall</b>, the Trick-or-Treating Tot</td><td><td valign=center><b>(</b></td><td><img src="/images/itemimages/totstume4.gif" class=hand onClick='descitem(546137475,1515124)'></td><td valign=center><b>)</b></td></td></tr><tr><td colspan=5 height=1 bgcolor=black></td></tr></table><p> <script type="text/javascript">
27
+ $(document).ready(function () {
28
+ $('#toggleskillsokplease').click(function (e) {
29
+ e.preventDefault();
30
+ if ($(this).text().match(/View/)) {
31
+ $('tr.blahblah').show();
32
+ $(this).text('Hide Permanent Skills');
33
+ } else {
34
+ $('tr.blahblah').hide();
35
+ $(this).text('View Permanent Skills');
36
+ }
37
+ });
38
+ });
39
+ </script>
40
+ <style type="text/css"> .blahblah { display: none; } </style>
41
+ <div id="pskills">
42
+ <table>
43
+ <tr><td height=1 bgcolor=black></td></tr>
44
+ <tr><td align="center"><a href="#" id="toggleskillsokplease" class="" style="text-decoration: none; font-weight: bold">View Permanent Skills</a></td></tr>
45
+ <tr class="blahblah"><td><a onclick="javascript:skill(3011)">Spirit of Rigatoni</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(4006)">Advanced Saucecrafting</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(3017)">Flavour of Magic</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(4015)">Impetuous Sauciness</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(3006)">Pastamastery</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(45)">Vent Rage Gland</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(3010)">Leash of Linguini</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(2014)">Amphibian Sympathy</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(5006)">Mad Looting Skillz</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(5014)">Advanced Cocktailcrafting</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(2020)">Hero of the Half-Shell</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(1016)">Pulverize</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(5018)">Superhuman Cocktailcrafting</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(12)">Torso Awareness</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(6014)">The Ode to Booze</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(6004)">The Moxious Madrigal</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(6007)">The Magical Mojomuscular Melody</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(3004)">Entangling Noodles</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(2005)">Shieldbutt</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(2021)">Tao of the Terrapin</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(2009)">Empathy of the Newt</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(2011)">Wisdom of the Elder Tortoises</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(5017)">Smooth Movement</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(2023)">Toss</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(10)">Powers of Observatiogn</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(14)">Cosmic Ugnderstanding</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(3005)">Cannelloni Cannon</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(3012)">Cannelloni Cocoon</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(6015)">The Sonata of Sneakiness</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(6010)">Fat Leon's Phat Loot Lyric</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(6017)">Ur-Kel's Aria of Annoyance</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(6028)">Inigo's Incantation of Inspiration</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(6016)">Carlweather's Cantata of Confrontation</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(5024)">Kung Fu Hustler</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(5010)">Overdeveloped Sense of Self Preservation</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(6003)">Aloysius' Antiphon of Aptitude</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(6012)">Jackasses' Symphony of Destruction</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(4012)">Saucegeyser</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(4011)">Master Saucier</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(3022)">Candyblast</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(4005)">Saucestorm</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(1019)">Musk of the Moose</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(6023)">Chorale of Companionship</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(6026)">Donho's Bubbly Ballad</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(6021)">Benetton's Medley of Diversity</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(90)">Deep Dark Visions</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(54)">Unaccompanied Miner</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(6020)">The Ballad of Richie Thingfinder</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(88)">Singer's Faithful Ocelot</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(4030)">Itchy Curse Finger</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(4034)">Curse of Weaksauce</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(4016)">Diminished Gag Reflex</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(4007)">Elemental Saucesphere</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(4039)">Saucemaven</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(4018)">The Way of Sauce</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(6033)">Accordion Appreciation</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(6031)">Crab Claw Technique</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(6032)">Accordion Bash</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(6037)">Bawdy Refrain</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(6043)">Mariachi Memory</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(5025)">Deft Hands</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(5015)">Ambidextrous Funkslinging</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(28)">Awesome Balls of Fire</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(6030)">Cadenza</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(83)">Frigidalmatian</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(4029)">Curse of Marinara</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(2035)">Testudinal Teachings</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(1018)">Northern Exposure</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(1040)">Pride of the Puffin</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(89)">Drescher's Annoying Noise</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(4010)">Intrinsic Spiciness</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(58)">Fashionably Late</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(4004)">Expert Panhandling</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(4021)">Deep Saucery</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(2038)">The Long View</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(6035)">Five Finger Discount</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(6038)">Thief Among the Honorable</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(6041)">Master Accordion Master Thief</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(6039)">Sticky Fingers</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(6006)">The Polka of Plenty</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(4017)">Irrepressible Spunk</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(6040)">Cone of Zydeco</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(6005)">Cletus's Canticle of Celerity</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(6042)">Knowing Smile</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(131)">Garbage Nova</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(4028)">Inner Sauce</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(4027)">Soul Saucery</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(3018)">Transcendental Noodlecraft</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(3016)">Tolerance of the Kitchen</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(3034)">Thrall Unit Tactics</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(3008)">Weapon of the Pastalord</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(3030)">Bringing Up the Rear</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(3015)">Springy Fusilli</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(3003)">Ravioli Shurikens</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(3025)">Utensil Twist</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(125)">Rapid Prototyping</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(59)">Executive Narcolepsy</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(6011)">The Psalm of Pointiness</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(141)">Asbestos Heart</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(5007)">Disco Nap</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(5026)">Disco State of Mind</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(5028)">That's Not a Knife</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(5029)">Tricky Knifework</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(5011)">Adventurer of Leisure</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(5038)">Sensitive Fingers</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(5034)">Disco Bravado</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(5004)">Nimble Fingers</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(5027)">Frantic Gyrations</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(5039)">Disco Leer</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(5032)">Disco Greed</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(5030)">Flashy Dancer</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(5005)">Disco Dance of Doom</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(5008)">Disco Dance II: Electric Boogaloo</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(139)">Giant Growth</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(4025)">Simmer</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(4023)">K&auml;seso&szlig;esturm</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(4008)">Jalape&ntilde;o Saucesphere</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(1017)">Double-Fisted Skull Smashing</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(1010)">Tongue of the Walrus</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(1012)">Claws of the Walrus</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(1008)">Fortitude of the Muskox</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(1011)">Hide of the Walrus</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(1009)">Audacity of the Otter</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(140)">Ancestral Recall</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(3007)">Stuffed Mortar Shell</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(3014)">Spirit of Ravioli</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(6008)">The Power Ballad of the Arrowsmith</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(6013)">Stevedave's Shanty of Superiority</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(2)">Chronic Indigestion</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(15)">CLEESH</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(6000)">Moxie of the Mariachi</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(4035)">Wry Smile</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(4014)">Saucy Salve</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(4033)">Antibiotic Saucesphere</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(152)">Communism!</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(145)">Perfect Freeze</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(38)">Natural Born Scrabbler</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(39)">Thrift and Grift</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(41)">Marginally Insane</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(6036)">Suspicious Gaze</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(1015)">Rage of the Reindeer</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(2040)">Patient Smile</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(2016)">Cold-Blooded Fearlessness</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(2012)">Astral Shell</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(2004)">Skin of the Leatherback</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(2026)">Curiosity of Br'er Tarrypin</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(2025)">Jingle Bells</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(151)">Shivering Monkey Technique</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(150)">Snokebomb</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(149)">Shattering Punch</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(144)">Calculate the Universe</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(155)">Steely-Eyed Squint</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(159)">Astute Angler</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(153)">Bow-Legged Swagger</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(6009)">Brawnee's Anthem of Absorption</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(154)">Bend Hell</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(127)">Ruthless Efficiency</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(142)">Pyromania</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(133)">Rotten Memories</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(147)">Beardfreeze</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(113)">Grease Up</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(120)">Intimidating Mien</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(167)">Stack Lumps</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(166)">Sweet Synthesis</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(161)">Eldritch Intellect</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(53)">Summon Crimbo Candy</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(30)">Snowclone</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(32)">Eggsplosion</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(36)">Grease Lightning</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(42)">Raise Backup Dancer</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(60)">Lunch Break</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(137)">Dark Ritual</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(6025)">Sing</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(163)">Gingerbread Mob Hit</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(168)">Evoke Eldritch Horror</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(158)">20/20 Vision</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(40)">Abs of Tin</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(126)">Mathematical Precision</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(129)">Speluck</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(164)">Fifteen Minutes of Flame</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(165)">Ceci N'Est Pas Un Chapeau</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(119)">Hypersane</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(87)">Walberg's Dim Bulb</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(4031)">Curse of the Thousand Islands</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(4009)">Wave of Sauce</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(4000)">Sauce Contemplation</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(4020)">Salsaball</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(173)">Disintegrate</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(1028)">Cold Shoulder</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(1003)">Thrust-Smack</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(1029)">Wrath of the Wolverine</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(1030)">Buoyancy of the Beluga</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(1036)">Thirst of the Weasel</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(1034)">Seething of the Snow Leopard</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(1005)">Lunging Thrust-Smack</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(1039)">Precision of the Penguin</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(1035)">Ire of the Orca</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(1014)">Batter Up!</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(1038)">Northern Explosion</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(2000)">Patience of the Tortoise</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(2030)">Blessing of the War Snapper</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(2007)">Ghostly Shell</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(2036)">Pizza Lover</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(2006)">Armorcraftiness</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(2028)">Shell Up</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(2033)">Blessing of She-Who-Was</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(2008)">Reptilian Fortitude</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(2037)">Blessing of the Storm Tortoise</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(2039)">Spirit Boon</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(3023)">Stringozzi Serpent</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(3027)">Bind Vampieroghi</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(3028)">Arched Eyebrow of the Archmage</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(3029)">Bind Vermincelli</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(3037)">Bind Lasagmbie</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(3039)">Bind Spice Ghost</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(3036)">Subtle and Quick to Anger</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(3031)">Bind Angel Hair Wisp</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(3032)">Shield of the Pastalord</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(5016)">Heart of Polyester</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(5036)">Disco Dance 3: Back in the Habit</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(5009)">Disco Fever</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(5033)">Knife in the Dark</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(176)">Meteor Lore</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(175)">Eternal Flame</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(172)">Object Quasi-Permanence</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(3000)">Manicotti Meditation</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(1006)">Super-Advanced Meatsmithing</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(1033)">Club Foot</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(1000)">Seal Clubbing Frenzy</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(1022)">Clobber</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(1031)">Scowl of the Auk</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(1004)">Lunge Smack</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(3020)">Spaghetti Spear</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(170)">Quantum Movement</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(171)">5-D Earning Potential</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(3033)">Bind Undead Elbow Macaroni</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(3035)">Bind Penne Dreadful</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(5035)">Disco Shank</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(5021)">Suckerpunch</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(5000)">Disco Aerobics</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(1025)">Iron Palm Technique</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(115)">Alien Source Code</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(2034)">Butts of Steel</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(2024)">Summon Leviatuga</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(2043)">Gallapagosian Mating Call</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(6045)">Paul's Passionate Pop Song</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(11)">Gnefarious Pickpocketing</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(13)">Gnomish Hardigness</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(177)">Expert Corner-Cutter</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(1041)">Silent Hunter</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(2042)">Quiet Determination</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(6044)">Quiet Desperation</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(5040)">Silent Knife</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(4040)">Silent Treatment</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(3038)">Wizard Squint</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(3026)">Transcendent Al Dente</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(3041)">Bind Spaghetti Elemental</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(3042)">Quiet Judgement</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(3009)">Lasagna Bandages</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(3021)">Tempuramancy</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(1007)">Blubber Up</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(195)">Lock Picking</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(130)">Olfactory Burnout</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(194)">Always Never Not Guzzling</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(4026)">Icy Glare</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(1043)">Blood Frenzy</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(1032)">Furious Wallop</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(1037)">Cavalcade of Fury</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(190)">Visit your Favorite Bird</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(4042)">Blood Bubble</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(4032)">Saucecicle</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(182)">Carol of the Bulls</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(2044)">Blood Bond</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(2003)">Headbutt</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(2032)">Spirit Snap</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(2015)">Kneebutt</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(2031)">Spiky Shell</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(178)">Budget Conscious</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(5023)">Stealth Mistletoe</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(5003)">Disco Eye-Poke</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(5012)">Disco Face Stab</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(5031)">Disco Smirk</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(5037)">Disco Inferno</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(183)">Carol of the Hells</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(1042)">Get Big</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(189)">The Spirit of Taking</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(4041)">Love Mixology</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(112)">Unoffendable</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(179)">Drinking to Drink</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(6034)">Concerto de los Muertos</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(1023)">Harpoon!</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(1027)">Hibernate</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(2010)">Tenacity of the Snapper</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(2029)">Stiff Upper Lip</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(4024)">Curse of Vichyssoise</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(4003)">Stream of Sauce</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(4037)">Sauce Monocle</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(4038)">Blood Sugar Sauce Magic</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(5022)">Salacious Cocktailcrafting</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(6029)">Dissonant Riff</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(110)">Shrap</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(3043)">Inscrutable Gaze</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(96)">Song of the North</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(94)">Splattersmash</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(187)">Prevent Scurvy and Sobriety</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(105)">Song of Sauce</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(102)">Shadow Noodles</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(196)">Comprehensive Cartography</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(157)">Brain Games</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(184)">Carol of the Thrills</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(5041)">Acquire Rhinestones</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(43)">Creepy Lullaby</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(46)">Slimy Sinews</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(47)">Slimy Synapses</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(48)">Slimy Shoulders</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(75)">Summon &quot;Boner Battalion&quot;</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(111)">Psychokinetic Hug</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(181)">Army of Toddlers</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(197)">Long Winter's Nap</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(198)">Bowl Full of Jelly</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(199)">Ashes and Soot</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(200)">Eye and a Twist</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(2041)">Turtle Power</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(201)">Dimples, How Merry!</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(202)">Chubby and Plump</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(92)">Club Earth</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(93)">Carbohydrate Cudgel</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(95)">Grab a Cold One</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(97)">Turtleini</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(98)">Sauceshell</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(99)">Conspiratorial Whispers</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(100)">Song of Slowness</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(101)">Spaghetti Breakfast</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(103)">Song of Starch</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(104)">Splashdance</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(106)">Song of Bravado</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(2027)">Spirit Vacation</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(3019)">Fearful Fettucini</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(20)">Really Expensive Jewelrycrafting</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(203)">Emotionally Chipped</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(4019)">Scarysauce</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(2022)">Spectral Snapper</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(1020)">Snarl of the Timberwolf</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(5019)">Tango of Terror</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(6018)">Dirge of Dreadfulness</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(136)">Healing Salve</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(138)">Lightning Bolt</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(132)">Dinsey Operations Expert</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(143)">Firegate</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(62)">Managerial Manipulation</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(29)">Conjure Relaxing Campfire</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(31)">Maximum Chill</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(37)">Inappropriate Backrub</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(33)">Mudbath</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(56)">Wassail</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(57)">Toynado</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(61)">Offensive Joke</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(6022)">Elron's Explosive Etude</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(6024)">Prelude of Precision</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(146)">Refusal to Freeze</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(3044)">Blood Bucatini</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(5042)">Blood Blade</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(44)">Rainbow Gravitation</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(188)">Implode Universe</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(6027)">Cringle's Curative Carol</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(6046)">Bram's Bloody Bagatelle</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(148)">Frost Bite</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(4022)">Surge of Icing</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(63)">Natural Born Skeleton Killer</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(117)">Belch The Rainbow</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(1024)">Holiday Weight Gain</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(162)">Licorice Rope</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(114)">Sloppy Secrets</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(84)">Silent Slam</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(86)">Silent Slice</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(180)">Experience Safari</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(77)">Torment Plant</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(78)">Pinch Ghost</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(85)">Silent Squirt</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(79)">Tattle</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(186)">Tiki Mixology</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(80)">Thick-Skinned</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(205)">Dead Nostrils</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(81)">Chip on your Shoulder</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(107)">Summon Annoyance</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(206)">Ancient Crymbo Lore</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(121)">Summon Holiday Fun!</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(134)">Bear Essence</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(118)">Pirate Bellow</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(17047)">Mild Curse</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(210)">Crimbo Training: Track Switcher</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(212)">Crimbo Training: Waiter</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(215)">Crimbo Training: Night Watchman</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(217)">Crimbo Training: Graffiti Censor</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(209)">Crimbo Training: Concierge</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(214)">Crimbo Training: Dessert Steward</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(216)">Crimbo Training: Sanitation Consultant</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(211)">Crimbo Training: Bartender</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(213)">Crimbo Training: Coal Taster</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(208)">Crimbo Training: Passenger Greeter</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(207)">Crimbo Training: First Aid Technician</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(128)">Summon Carrot</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(225)">Secret Door Awareness</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(226)">Perpetrate Mild Evil</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(135)">Summon Kokomo Resort Pass</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(228)">Just the Facts</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(227)">Chitinous Soul</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(229)">Elf Guard Cooking</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(230)">Old-School Cocktailcrafting</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(231)">Elf Guard Extortion Techniques</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(232)">Fruit Recognition</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(233)">Elf Guard Relaxation Techniques</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onclick="javascript:skill(235)">Too Cool</a> (<b>HP</b>)</td></tr><tr class="blahblah"><td>Summon Sugar Sheets (<b>HP</b>)</td></tr><tr class="blahblah"><td>Summon Clip Art (<b>HP</b>)</td></tr><tr class="blahblah"><td>Summon Smithsness (<b>HP</b>)</td></tr><tr class="blahblah"><td>Summon Candy Heart (<b>HP</b>)</td></tr><tr class="blahblah"><td>Summon Party Favor (<b>HP</b>)</td></tr><tr class="blahblah"><td>Summon Love Song (<b>HP</b>)</td></tr><tr class="blahblah"><td>Summon BRICKOs (<b>HP</b>)</td></tr><tr class="blahblah"><td>Summon Dice (<b>HP</b>)</td></tr><tr class="blahblah"><td>Summon Resolutions (<b>HP</b>)</td></tr><tr class="blahblah"><td>Summon Taffy (<b>HP</b>)</td></tr><tr class="blahblah"><td>Summon Tasteful Items (<b>HP</b>)</td></tr><tr class="blahblah"><td>Summon Alice's Army Cards (<b>HP</b>)</td></tr><tr class="blahblah"><td>Summon Confiscated Things (<b>HP</b>)</td></tr><tr class="blahblah"><td><a onClick='javascript:skill(19)'>Transcendent Olfaction</a> (<b>HP</b>)</td></tr><tr><td height=1 bgcolor=black></td></tr></table></div><p><table><tr><td colspan=2 height=1 bgcolor=black></td></tr><tr><td colspan=2>Clan: <b><a class=nounder href="showclan.php?whichclan=84165">Alliance From Heck</a></b><br>Title: <b>Secretly a Creepy Mask</b></td></tr><tr><td colspan=2 height=1 bgcolor=black></td></tr></table><p><table><tr><td colspan=2 height=1 bgcolor=black></td></tr><tr><td colspan=2>Store: <b><a class=nounder href="mallstore.php?whichstore=1515124">dear jick thagnks for implemegnting gname chagnges</a></b></td></tr><tr><td colspan=2 height=1 bgcolor=black></td></tr></table><p><table><tr><td colspan=2 height=1 bgcolor=black></td></tr><tr><td colspan=2>This player owns a <a class=nounder href="displaycollection.php?who=1515124"><b>Display Case</b></a> in the Museum</td></tr><tr><td colspan=2 height=1 bgcolor=black></td></tr></table><p><table><tr><td align="center">sweaty bill has carved a Jack o' Lantern:</center></td></tr><tr><td height=1 bgcolor=black></td></tr><tr><td align="center"><table cellpadding=0 cellspacing=0><tr><td colspan=3 width=120 height=30><img src=/images/otherimages/jacko/jackotop.gif width=120 height=30></td></tr><tr><td width=50 height=40><img src=/images/otherimages/jacko/jackoleft0.gif width=50 height=40 id="jopic_le"></td><td width=20 height=30><img src=/images/otherimages/jacko/jackomiddle0.gif width=20 height=40 id="jopic_no"></td><td width=50 height=40><img src=/images/otherimages/jacko/jackoright0.gif width=50 height=40 id="jopic_re"></td><tr><td colspan=3 width=120 height=50><img src=/images/otherimages/jacko/jackobottom0.gif width=120 height=50 id="jopic_mo"></td></tr></table></td></tr><tr><td height=1 bgcolor=black></td></tr></table><p><p><Center>Profile:</center><table width=70%><tr><td colspan=2 height=1 bgcolor=black></td></tr><tr><td align=right><b>Gender:</b></td><td>Male</td></tr><tr><td align=right><b>Location:</b></td><td>he/him</td></tr><tr><td align=right valign=top><b>Website:</b></td><td><a href="https://api.aventuristo.net/av-snapshot?u=sweaty+bill" target="_blank">https://api.aventuristo.net/av -snapshot?u=sweaty+bill</a></td></tr><tr><td align=right valign=top><b>Quote:</b></td><td>formerly phreddrickkv2</td></tr><tr><td colspan=2 height=1 bgcolor=black></td></tr></table><p><p><Center>Trophies:</center><table><tr><td height=1 bgcolor=black></td></tr><tr><td align=center><img src="/images/otherimages/trophy/not_wearing_any_pants.gif" width=100 height=100 alt="Pantsless!" title="Pantsless!">&nbsp;<img src="/images/otherimages/trophy/oh_the_horror.gif" width=100 height=100 alt="Tentacle Tickler" title="Tentacle Tickler">&nbsp;<img src="/images/otherimages/trophy/look_what_i_can_do.gif" width=100 height=100 alt="Trivially Skilled" title="Trivially Skilled">&nbsp;<img src="/images/otherimages/trophy/bastard_son_thereof.gif" width=100 height=100 alt="Kissing Maniac" title="Kissing Maniac">&nbsp;<img src="/images/otherimages/trophy/he_aint_heavy_hes_my_familiar.gif" width=100 height=100 alt="Black Hole Terrarium" title="Black Hole Terrarium">&nbsp;<br><img src="/images/otherimages/trophy/howd_you_do_that_man_thats_creepy.gif" width=100 height=100 alt="Eerily Skilled" title="Eerily Skilled">&nbsp;<img src="/images/otherimages/trophy/raggedy_annie_leibovitz.gif" width=100 height=100 alt="Professional Photographer" title="Professional Photographer">&nbsp;<img src="/images/otherimages/trophy/working_class_republican.gif" width=100 height=100 alt="You Do It To Yourself" title="You Do It To Yourself">&nbsp;<img src="/images/otherimages/trophy/jeff_was_right.gif" width=100 height=100 alt="Bringer of Storms" title="Bringer of Storms">&nbsp;</td></tR><tr><td height=1 bgcolor=black></td></tr></table><a href="sendmessage.php?toid=1515124">send message</a> / <a href="town_sendgift.php?towho=1515124">send gift</a> / <a href="makeoffer.php?towho=1515124">propose trade</a><br><a href="showplayer.php?pwd=84a6c4026305124d449b7a4bf4ef0807&who=1515124&addtocontact=true">add to contact list</a> / <a href="showplayer.php?pwd=84a6c4026305124d449b7a4bf4ef0807&who=1515124&addtoignore=true">add to ignore list</a></td></tr></table></center></td></tr><tr><td height=4></td></tr></table><div style='position: fixed; bottom: 0; left: 0; right: 0; top: 0; pointer-events: none' id="psnowballs"></div>
46
+ <script src="https://cdnjs.cloudflare.com/ajax/libs/matter-js/0.19.0/matter.min.js" integrity="sha512-0z8URjGET6GWnS1xcgiLBZBzoaS8BNlKayfZyQNKz4IRp+s7CKXx0yz7Eco2+TcwoeMBa5KMwmTX7Kus7Fa5Uw==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>
47
+ <script>
48
+ var snow = function() {
49
+ var Engine = Matter.Engine,
50
+ Render = Matter.Render,
51
+ Runner = Matter.Runner,
52
+ Composites = Matter.Composites,
53
+ MouseConstraint = Matter.MouseConstraint,
54
+ Mouse = Matter.Mouse,
55
+ Composite = Matter.Composite,
56
+ Bodies = Matter.Bodies;
57
+
58
+ var engine = Engine.create(),
59
+ world = engine.world;
60
+
61
+ var width = window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth;
62
+ var height = window.innerHeight || document.documentElement.clientHeight || document.body.clientHeight;
63
+
64
+ // create renderer
65
+ var render = Render.create({
66
+ element: document.getElementById("psnowballs"),
67
+ engine: engine,
68
+ options: {
69
+ width: width,
70
+ height: height,
71
+ showAngleIndicator: false,
72
+ wireframes: false,
73
+ background: 'transparent'
74
+ }
75
+ });
76
+
77
+ Render.run(render);
78
+
79
+ // create runner
80
+ var runner = Runner.create();
81
+ Runner.run(runner, engine);
82
+
83
+ var balls_left = 1;
84
+ var balls = [];
85
+ var do_ball_batch = function() {
86
+ var num = Math.min(balls_left, 69);
87
+ balls_left -= num;
88
+ for (var i = 0; i < num; i++) {
89
+ var ball = Bodies.circle(width/2 + (Math.random() * 100), Math.random() * 100, 50, {
90
+ density: 15.0,
91
+ friction: 1.5,
92
+ frictionStatic: 4.5,
93
+ render: {
94
+ sprite: {
95
+ texture: "/images/otherimages/snowball.png"
96
+ }
97
+ }
98
+ });
99
+ Matter.Body.setAngularVelocity(ball, Math.random() * 0.1 - 0.05);
100
+ balls.push(ball);
101
+ Composite.add(world, ball);
102
+ }
103
+ if (balls_left > 0) setTimeout(do_ball_batch, 7500);
104
+ }
105
+
106
+ Composite.add(world, [
107
+ // walls
108
+ Bodies.rectangle(width / 2, height+26, width * 0.75, 50,{ isStatic: true, angle: Math.PI/90, render: { visible: false }, friction: 1.5, frictionStatic: 4.5, restitution: 0.1 }), //floor
109
+ Bodies.rectangle(-350, height / 2, 50, height,{ isStatic: true, render: { visible: false } }), //left wall
110
+ Bodies.rectangle(width+350, height / 2, 50, height, { isStatic: true, render: { visible: false } }), //right wall
111
+ ]);
112
+ do_ball_batch();
113
+
114
+ document.body.addEventListener('click', function(event) {
115
+ // Get the position of the click event relative to the page
116
+ var clickX = event.pageX;
117
+ var clickY = event.pageY;
118
+
119
+ // Get the element and its position relative to the page
120
+ var element = document.getElementById('psnowballs');
121
+ var rect = element.getBoundingClientRect();
122
+ var elementX = rect.left + window.scrollX;
123
+ var elementY = rect.top + window.scrollY;
124
+
125
+ // Subtract the position of the element from the position of the click event
126
+ var insideX = clickX - elementX;
127
+ var insideY = clickY - elementY;
128
+ var mousePosition = { x: insideX, y: insideY };
129
+
130
+ var ballClicked = false;
131
+ for (var i = 0; i < balls.length; i++) {
132
+ if (Matter.Vertices.contains(balls[i].vertices, mousePosition)) {
133
+ Matter.Body.applyForce(balls[i], balls[i].position, {x: (Math.random() * 50000) - 25000, y: -50000.0});
134
+ ballClicked = true;
135
+ break;
136
+ }
137
+ }
138
+ if (ballClicked) {
139
+ event.preventDefault();
140
+ }
141
+ });
142
+
143
+ // fit the render viewport to the scene
144
+ Render.lookAt(render, {
145
+ min: { x: 0, y: 0 },
146
+ max: { x: width, y: height }
147
+ });
148
+
149
+ // context for MatterTools.Demo
150
+ return {
151
+ engine: engine,
152
+ runner: runner,
153
+ render: render,
154
+ canvas: render.canvas,
155
+ stop: function() {
156
+ Matter.Render.stop(render);
157
+ Matter.Runner.stop(runner);
158
+ }
159
+ };
160
+ };
161
+ document.addEventListener("DOMContentLoaded", snow);
162
+ </script>
163
+ <style>
164
+ body { padding-bottom: 150px; }
165
+ </style>
166
+
167
+ </center><div id='menu' class='rcm'></div></body><script language="Javascript"> var notchat = true; var actions = { "sendmessage.php" : { "action" : 1, "title" : "Send Message", "arg" : "toid" }, "town_sendgift.php" : { "action" : 1, "title" : "Send Gift", "arg" : "towho" }, "makeoffer.php" : { "action" : 1, "title" : "Propose Trade", "arg" : "towho" }, "mallstore.php" : { "action" : 1, "title" : "Mall Store", "arg" : "whichstore" }, "/./curse.php" : { "action" : 1, "title" : "Throw TP", "arg" : "whichitem=1923&targetplayer" }, "/msg" : { "action" : 3, "useid" : true, "query" : "Enter message to send to %:" }}; </script><script language="Javascript" src="/images/scripts/rcm.20101215.js"></script><script src="/onfocus.1.js"></script></html>
@@ -0,0 +1,12 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { loadFixture } from "../testUtils.js";
3
+ import { generateAvatarSvg } from "./avatar.js";
4
+
5
+ describe("Avatars", () => {
6
+ it("can parse an avatar with a beard", async () => {
7
+ const page = await loadFixture(__dirname, "showplayer_dsh.html");
8
+ const svg = await generateAvatarSvg(page);
9
+ expect(svg).toContain(`title="/images/otherimages/classav11_f.gif"`);
10
+ expect(svg).toContain(`title="/images/otherimages/moustaches/17.png"`);
11
+ });
12
+ });
@@ -1,8 +1,11 @@
1
- import { parse } from "node-html-parser";
2
- import { resolveKoLImage } from "./utils.js";
1
+ import { selectAll, selectOne } from "css-select";
2
+ import { parseDocument } from "htmlparser2";
3
+ import { Element } from "domhandler";
3
4
  import { imageSize } from "image-size";
4
5
  import { dedent } from "ts-dedent";
5
6
 
7
+ import { resolveKoLImage } from "./utils.js";
8
+
6
9
  export async function generateAvatarSvg(profile: string) {
7
10
  const header = profile.match(
8
11
  /<center><table><tr><td><center>.*?(<div.*?>.*?<\/div>).*?<b>([^>]*?)<\/b> \(#(\d+)\)<br>/,
@@ -11,18 +14,20 @@ export async function generateAvatarSvg(profile: string) {
11
14
 
12
15
  if (!blockHtml) return null;
13
16
 
14
- const block = parse(blockHtml).querySelector("div");
17
+ const document = parseDocument(blockHtml);
18
+ const block = selectOne("div", document) as Element | null;
15
19
 
16
20
  if (!block) return null;
17
21
 
18
22
  const ocrsColour =
19
- ["gold", "red"].find((k) => block.classList.contains(k)) ?? "black";
23
+ ["gold", "red"].find((k) => block.attribs.class.includes(k)) ?? "black";
20
24
 
21
25
  const images = [];
22
26
 
23
- for (const imgElement of block.querySelectorAll("img")) {
24
- const src = imgElement.getAttribute("src");
27
+ for (const imgElement of selectAll("img", block)) {
28
+ const src = imgElement.attribs.src;
25
29
  if (!src) continue;
30
+ const name = src;
26
31
 
27
32
  const result = await fetch(resolveKoLImage(src));
28
33
  const buffer = Buffer.from(await result.arrayBuffer());
@@ -31,13 +36,14 @@ export async function generateAvatarSvg(profile: string) {
31
36
 
32
37
  const href = `data:image/png;base64,${buffer.toString("base64")}`;
33
38
 
34
- const style = imgElement.getAttribute("style");
39
+ const style = imgElement.attribs.style;
35
40
 
36
41
  const top = Number(style?.match(/top: ?(-?\d+)px/i)?.[1] || "0");
37
42
  const left = Number(style?.match(/left: ?(-?\d+)px/i)?.[1] || "0");
38
43
  const rotate = Number(style?.match(/rotate\((-?\d+)deg\)/)?.[1] || "0");
39
44
 
40
45
  images.push({
46
+ name,
41
47
  href,
42
48
  top,
43
49
  left,
@@ -72,6 +78,7 @@ export async function generateAvatarSvg(profile: string) {
72
78
  (i) =>
73
79
  dedent`
74
80
  <image
81
+ title="${i.name}"
75
82
  filter="url(#colorMask)"
76
83
  href="${i.href}"
77
84
  width="${i.width}"