kol.js 0.0.2 → 0.1.1

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 (58) hide show
  1. package/package.json +7 -6
  2. package/src/Cache.ts +33 -0
  3. package/src/Client.test.ts +206 -0
  4. package/src/Client.ts +506 -0
  5. package/src/Player.test.ts +101 -0
  6. package/src/Player.ts +209 -0
  7. package/src/__fixtures__/backoffice_prices_alien_meat.html +46 -0
  8. package/src/__fixtures__/backoffice_prices_lov_elephant.html +30 -0
  9. package/src/__fixtures__/backoffice_prices_magical_mystery_juice.html +30 -0
  10. package/src/__fixtures__/backoffice_prices_tofurkey_leg.html +48 -0
  11. package/src/__fixtures__/backoffice_prices_turtle_wax_greaves.html +42 -0
  12. package/src/__fixtures__/backoffice_prices_turtle_wax_helmet.html +42 -0
  13. package/src/__fixtures__/backoffice_prices_turtle_wax_shield.html +47 -0
  14. package/src/__fixtures__/desc_effect_pasta_oneness.html +31 -0
  15. package/src/__fixtures__/desc_effect_the_visible_adventurer.html +31 -0
  16. package/src/__fixtures__/desc_item_alien_meat.html +38 -0
  17. package/src/__fixtures__/desc_item_hypodermic_needle.html +39 -0
  18. package/src/__fixtures__/desc_item_lov_elephant.html +39 -0
  19. package/src/__fixtures__/desc_item_magical_mystery_juice.html +39 -0
  20. package/src/__fixtures__/desc_item_mosquito_larva.html +39 -0
  21. package/src/__fixtures__/desc_item_tofurkey_leg.html +38 -0
  22. package/src/__fixtures__/desc_item_turtle_wax_shield.html +79 -0
  23. package/src/__fixtures__/desc_skill_impetuous_sauciness.html +32 -0
  24. package/src/__fixtures__/desc_skill_overload_discarded_refridgerator.html +32 -0
  25. package/src/__fixtures__/familiar_in_standard_run.html +184 -0
  26. package/src/__fixtures__/searchplayer_mad_carew.html +53 -0
  27. package/src/__fixtures__/showplayer_dependence_day.html +47 -0
  28. package/src/__fixtures__/showplayer_golden_gun.html +28 -0
  29. package/src/__fixtures__/showplayer_regular.html +56 -0
  30. package/{dist/index.d.ts → src/index.ts} +1 -0
  31. package/src/testUtils.ts +13 -0
  32. package/src/utils/avatar.ts +90 -0
  33. package/src/utils/kmail.ts +48 -0
  34. package/src/utils/leaderboard.ts +84 -0
  35. package/src/utils/utils.ts +33 -0
  36. package/dist/Cache.d.ts +0 -11
  37. package/dist/Cache.js +0 -26
  38. package/dist/Client.d.ts +0 -84
  39. package/dist/Client.js +0 -343
  40. package/dist/Client.test.d.ts +0 -1
  41. package/dist/Client.test.js +0 -162
  42. package/dist/Player.d.ts +0 -28
  43. package/dist/Player.js +0 -136
  44. package/dist/Player.test.d.ts +0 -1
  45. package/dist/Player.test.js +0 -48
  46. package/dist/index.js +0 -3
  47. package/dist/testUtils.d.ts +0 -2
  48. package/dist/testUtils.js +0 -10
  49. package/dist/utils/avatar.d.ts +0 -1
  50. package/dist/utils/avatar.js +0 -70
  51. package/dist/utils/kmail.d.ts +0 -32
  52. package/dist/utils/kmail.js +0 -1
  53. package/dist/utils/leaderboard.d.ts +0 -16
  54. package/dist/utils/leaderboard.js +0 -56
  55. package/dist/utils/utils.d.ts +0 -4
  56. package/dist/utils/utils.js +0 -27
  57. package/dist/utils/visit.d.ts +0 -3
  58. package/dist/utils/visit.js +0 -10
package/src/Player.ts ADDED
@@ -0,0 +1,209 @@
1
+ import { Client } from "./Client.js";
2
+ import { generateAvatarSvg } from "./utils/avatar.js";
3
+ import { parsePlayerDate } from "./utils/utils.js";
4
+
5
+ export type If<
6
+ Value extends boolean,
7
+ TrueResult,
8
+ FalseResult = null,
9
+ > = Value extends true
10
+ ? TrueResult
11
+ : Value extends false
12
+ ? FalseResult
13
+ : TrueResult | FalseResult;
14
+
15
+ export class Player<IsFull extends boolean = boolean> {
16
+ #client: Client;
17
+
18
+ id: number;
19
+ name: string;
20
+
21
+ level: If<IsFull, number>;
22
+ kolClass: If<IsFull, string>;
23
+ avatar: If<IsFull, string>;
24
+ ascensions: If<IsFull, number>;
25
+ trophies: If<IsFull, number>;
26
+ tattoos: If<IsFull, number>;
27
+ favoriteFood: If<IsFull, string | null>;
28
+ favoriteBooze: If<IsFull, string | null>;
29
+ createdDate: If<IsFull, Date>;
30
+ lastLogin: If<IsFull, Date>;
31
+ hasDisplayCase: If<IsFull, boolean>;
32
+
33
+ constructor(
34
+ client: Client,
35
+ id: number,
36
+ name: string,
37
+ level: number | null = null,
38
+ kolClass: string | null = null,
39
+ ) {
40
+ this.#client = client;
41
+ this.id = id;
42
+ this.name = name;
43
+ this.level = level as If<IsFull, number>;
44
+ this.kolClass = kolClass as If<IsFull, string>;
45
+ this.avatar = null as If<IsFull, string>;
46
+ this.ascensions = null as If<IsFull, number>;
47
+ this.trophies = null as If<IsFull, number>;
48
+ this.tattoos = null as If<IsFull, number>;
49
+ this.favoriteFood = null as If<IsFull, string>;
50
+ this.favoriteBooze = null as If<IsFull, string>;
51
+ this.createdDate = null as If<IsFull, Date>;
52
+ this.lastLogin = null as If<IsFull, Date>;
53
+ this.hasDisplayCase = null as If<IsFull, boolean>;
54
+ }
55
+
56
+ isFull(): this is Player<true> {
57
+ return this.createdDate !== null;
58
+ }
59
+
60
+ isPartial(): this is Player<false> {
61
+ return this.createdDate === null;
62
+ }
63
+
64
+ static async getNameFromId(
65
+ client: Client,
66
+ id: number,
67
+ ): Promise<string | null> {
68
+ try {
69
+ const profile = await client.fetchText("showplayer.php", {
70
+ searchParams: { who: id },
71
+ });
72
+ const name = profile.match(/<b>([^>]*?)<\/b> \(#(\d+)\)<br>/)?.[1];
73
+ return name || null;
74
+ } catch {
75
+ return null;
76
+ }
77
+ }
78
+
79
+ static async fromName(
80
+ client: Client,
81
+ name: string,
82
+ ): Promise<Player<false> | null> {
83
+ try {
84
+ const matcher =
85
+ /href="showplayer.php\?who=(?<playerId>\d+)">(?<playerName>.*?)<\/a>\D+(clan=\d+[^<]+\D+)?\d+\D*(?<level>(\d+)|(inf_large\.gif))\D+valign=top>(?<class>[^<]*)<\/td>/i;
86
+ const search = await client.fetchText("searchplayer.php", {
87
+ searchParams: {
88
+ searchstring: name.replace(/_/g, "\\_"),
89
+ searching: "Yep.",
90
+ for: "",
91
+ startswith: 1,
92
+ hardcoreonly: 0,
93
+ },
94
+ });
95
+ const match = matcher.exec(search)?.groups;
96
+
97
+ if (!match) {
98
+ return null;
99
+ }
100
+
101
+ return new Player(
102
+ client,
103
+ Number(match.playerId),
104
+ match.playerName,
105
+ parseInt(match.level),
106
+ match.class,
107
+ );
108
+ } catch (error) {
109
+ return null;
110
+ }
111
+ }
112
+
113
+ static async fromId(
114
+ client: Client,
115
+ id: number,
116
+ ): Promise<Player<false> | null> {
117
+ const name = await Player.getNameFromId(client, id);
118
+ if (!name) return null;
119
+ return await Player.fromName(client, name);
120
+ }
121
+
122
+ static async from(
123
+ client: Client,
124
+ identifier: string | number,
125
+ ): Promise<Player<false> | null> {
126
+ const id = Number(identifier);
127
+
128
+ if (!Number.isNaN(id) || typeof identifier === "number") {
129
+ return await Player.fromId(client, id);
130
+ }
131
+
132
+ return await Player.fromName(client, identifier);
133
+ }
134
+
135
+ matchesIdentifier(identifier: string | number) {
136
+ const id = Number(identifier);
137
+ if (!Number.isNaN(id) || typeof identifier === "number") {
138
+ return this.id === identifier;
139
+ }
140
+
141
+ return this.name.toLowerCase() === identifier.toLowerCase();
142
+ }
143
+
144
+ async full(): Promise<Player<true> | null> {
145
+ const t = this as unknown as Player<true>;
146
+
147
+ if (this.isFull()) return this;
148
+
149
+ try {
150
+ const profile = await this.#client.fetchText("showplayer.php", {
151
+ searchParams: {
152
+ who: this.id,
153
+ },
154
+ });
155
+ const header = profile.match(
156
+ /<center><table><tr><td><center>.*?<img.*?src="(.*?)".*?<b>([^>]*?)<\/b> \(#(\d+)\)<br>/,
157
+ );
158
+ if (!header) return null;
159
+
160
+ t.avatar = (await generateAvatarSvg(profile)) || header[1];
161
+
162
+ t.ascensions =
163
+ Number(
164
+ profile
165
+ .match(/>Ascensions<\/a>:<\/b><\/td><td>(.*?)<\/td>/)?.[1]
166
+ ?.replace(/,/g, ""),
167
+ ) || 0;
168
+
169
+ t.trophies = Number(
170
+ profile.match(/>Trophies Collected:<\/b><\/td><td>(.*?)<\/td>/)?.[1] ??
171
+ 0,
172
+ );
173
+
174
+ t.tattoos = Number(
175
+ profile.match(/>Tattoos Collected:<\/b><\/td><td>(.*?)<\/td>/)?.[1] ??
176
+ 0,
177
+ );
178
+
179
+ t.favoriteFood =
180
+ profile.match(/>Favorite Food:<\/b><\/td><td>(.*?)<\/td>/)?.[1] ?? null;
181
+ t.favoriteBooze =
182
+ profile.match(/>Favorite Booze:<\/b><\/td><td>(.*?)<\/td>/)?.[1] ??
183
+ null;
184
+
185
+ t.createdDate = parsePlayerDate(
186
+ profile.match(/>Account Created:<\/b><\/td><td>(.*?)<\/td>/)?.[1],
187
+ );
188
+
189
+ t.lastLogin = parsePlayerDate(
190
+ profile.match(/>Last Login:<\/b><\/td><td>(.*?)<\/td>/)?.[1],
191
+ );
192
+
193
+ t.hasDisplayCase =
194
+ profile.match(/Display Case<\/b><\/a> in the Museum<\/td>/) !== null;
195
+
196
+ return t;
197
+ } catch (error) {
198
+ console.error(error);
199
+ return null;
200
+ }
201
+ }
202
+
203
+ async isOnline() {
204
+ const response = await this.#client.useChatMacro(`/whois ${this.name}`);
205
+ return (
206
+ response?.output.includes("This player is currently online") ?? false
207
+ );
208
+ }
209
+ }
@@ -0,0 +1,46 @@
1
+ <script type="text/javascript">
2
+ if (window.updateInv) updateInv([]);
3
+ </script>
4
+ <script type="text/javascript">
5
+ if (!window.updateInv && parent.mainpane.updateInv)
6
+ parent.mainpane.updateInv([]);
7
+ </script>
8
+ <center>
9
+ <table width="95%" cellspacing="0" cellpadding="0">
10
+ <tr>
11
+ <td style="color: white" align="center" bgcolor="blue">
12
+ <b>Results:</b>
13
+ </td>
14
+ </tr>
15
+ <tr>
16
+ <td style="padding: 5px; border: 1px solid blue">
17
+ <center>
18
+ <table>
19
+ <tr>
20
+ <td>
21
+ <div class="res">
22
+ <table border="0">
23
+ <tr>
24
+ <td>unlimited:</td>
25
+ <td><b>1,995</b> x12</td>
26
+ <td><b>2,000</b> x2</td>
27
+ <td><b>2,933</b> x41</td>
28
+ <td><b>2,934</b> x2104</td>
29
+ </tr>
30
+ <tr>
31
+ <td>limited:</td>
32
+ <td><b>6,390</b>(11/day) x78</td>
33
+ </tr>
34
+ </table>
35
+ </div>
36
+ </td>
37
+ </tr>
38
+ </table>
39
+ </center>
40
+ </td>
41
+ </tr>
42
+ <tr>
43
+ <td height="4"></td>
44
+ </tr>
45
+ </table>
46
+ </center>
@@ -0,0 +1,30 @@
1
+ <script type="text/javascript">
2
+ if (window.updateInv) updateInv([]);
3
+ </script>
4
+ <script type="text/javascript">
5
+ if (!window.updateInv && parent.mainpane.updateInv)
6
+ parent.mainpane.updateInv([]);
7
+ </script>
8
+ <center>
9
+ <table width="95%" cellspacing="0" cellpadding="0">
10
+ <tr>
11
+ <td style="color: white" align="center" bgcolor="blue">
12
+ <b>Results:</b>
13
+ </td>
14
+ </tr>
15
+ <tr>
16
+ <td style="padding: 5px; border: 1px solid blue">
17
+ <center>
18
+ <table>
19
+ <tr>
20
+ <td><div class="res">None in the mall</div></td>
21
+ </tr>
22
+ </table>
23
+ </center>
24
+ </td>
25
+ </tr>
26
+ <tr>
27
+ <td height="4"></td>
28
+ </tr>
29
+ </table>
30
+ </center>
@@ -0,0 +1,30 @@
1
+ <script type="text/javascript">
2
+ if (window.updateInv) updateInv([]);
3
+ </script>
4
+ <script type="text/javascript">
5
+ if (!window.updateInv && parent.mainpane.updateInv)
6
+ parent.mainpane.updateInv([]);
7
+ </script>
8
+ <center>
9
+ <table width="95%" cellspacing="0" cellpadding="0">
10
+ <tr>
11
+ <td style="color: white" align="center" bgcolor="blue">
12
+ <b>Results:</b>
13
+ </td>
14
+ </tr>
15
+ <tr>
16
+ <td style="padding: 5px; border: 1px solid blue">
17
+ <center>
18
+ <table>
19
+ <tr>
20
+ <td><div class="res">None in the mall</div></td>
21
+ </tr>
22
+ </table>
23
+ </center>
24
+ </td>
25
+ </tr>
26
+ <tr>
27
+ <td height="4"></td>
28
+ </tr>
29
+ </table>
30
+ </center>
@@ -0,0 +1,48 @@
1
+ <script type="text/javascript">
2
+ if (window.updateInv) updateInv([]);
3
+ </script>
4
+ <script type="text/javascript">
5
+ if (!window.updateInv && parent.mainpane.updateInv)
6
+ parent.mainpane.updateInv([]);
7
+ </script>
8
+ <center>
9
+ <table width="95%" cellspacing="0" cellpadding="0">
10
+ <tr>
11
+ <td style="color: white" align="center" bgcolor="blue">
12
+ <b>Results:</b>
13
+ </td>
14
+ </tr>
15
+ <tr>
16
+ <td style="padding: 5px; border: 1px solid blue">
17
+ <center>
18
+ <table>
19
+ <tr>
20
+ <td>
21
+ <div class="res">
22
+ <table border="0">
23
+ <tr>
24
+ <td>unlimited:</td>
25
+ <td><b>502</b> x7</td>
26
+ <td><b>502</b> x5</td>
27
+ <td><b>502</b> x6</td>
28
+ <td><b>502</b> x3</td>
29
+ </tr>
30
+ <tr>
31
+ <td>limited:</td>
32
+ <td><b>3,850</b>(1/day) x6</td>
33
+ <td><b>4,000</b>(1/day) x1</td>
34
+ <td><b>9,989</b>(5/day) x3</td>
35
+ </tr>
36
+ </table>
37
+ </div>
38
+ </td>
39
+ </tr>
40
+ </table>
41
+ </center>
42
+ </td>
43
+ </tr>
44
+ <tr>
45
+ <td height="4"></td>
46
+ </tr>
47
+ </table>
48
+ </center>
@@ -0,0 +1,42 @@
1
+ <script type="text/javascript">
2
+ if (window.updateInv) updateInv([]);
3
+ </script>
4
+ <script type="text/javascript">
5
+ if (!window.updateInv && parent.mainpane.updateInv)
6
+ parent.mainpane.updateInv([]);
7
+ </script>
8
+ <center>
9
+ <table width="95%" cellspacing="0" cellpadding="0">
10
+ <tr>
11
+ <td style="color: white" align="center" bgcolor="blue">
12
+ <b>Results:</b>
13
+ </td>
14
+ </tr>
15
+ <tr>
16
+ <td style="padding: 5px; border: 1px solid blue">
17
+ <center>
18
+ <table>
19
+ <tr>
20
+ <td>
21
+ <div class="res">
22
+ <table border="0">
23
+ <tr>
24
+ <td>unlimited:</td>
25
+ <td><b>300</b> x1</td>
26
+ <td><b>450</b> x1</td>
27
+ <td><b>500</b> x1</td>
28
+ <td><b>650</b> x1</td>
29
+ </tr>
30
+ </table>
31
+ </div>
32
+ </td>
33
+ </tr>
34
+ </table>
35
+ </center>
36
+ </td>
37
+ </tr>
38
+ <tr>
39
+ <td height="4"></td>
40
+ </tr>
41
+ </table>
42
+ </center>
@@ -0,0 +1,42 @@
1
+ <script type="text/javascript">
2
+ if (window.updateInv) updateInv([]);
3
+ </script>
4
+ <script type="text/javascript">
5
+ if (!window.updateInv && parent.mainpane.updateInv)
6
+ parent.mainpane.updateInv([]);
7
+ </script>
8
+ <center>
9
+ <table width="95%" cellspacing="0" cellpadding="0">
10
+ <tr>
11
+ <td style="color: white" align="center" bgcolor="blue">
12
+ <b>Results:</b>
13
+ </td>
14
+ </tr>
15
+ <tr>
16
+ <td style="padding: 5px; border: 1px solid blue">
17
+ <center>
18
+ <table>
19
+ <tr>
20
+ <td>
21
+ <div class="res">
22
+ <table border="0">
23
+ <tr>
24
+ <td>unlimited:</td>
25
+ <td><b>100</b> x1</td>
26
+ <td><b>331</b> x2</td>
27
+ <td><b>331</b> x1</td>
28
+ <td><b>350</b> x1</td>
29
+ </tr>
30
+ </table>
31
+ </div>
32
+ </td>
33
+ </tr>
34
+ </table>
35
+ </center>
36
+ </td>
37
+ </tr>
38
+ <tr>
39
+ <td height="4"></td>
40
+ </tr>
41
+ </table>
42
+ </center>
@@ -0,0 +1,47 @@
1
+ <script type="text/javascript">
2
+ if (window.updateInv) updateInv([]);
3
+ </script>
4
+ <script type="text/javascript">
5
+ if (!window.updateInv && parent.mainpane.updateInv)
6
+ parent.mainpane.updateInv([]);
7
+ </script>
8
+ <center>
9
+ <table width="95%" cellspacing="0" cellpadding="0">
10
+ <tr>
11
+ <td style="color: white" align="center" bgcolor="blue">
12
+ <b>Results:</b>
13
+ </td>
14
+ </tr>
15
+ <tr>
16
+ <td style="padding: 5px; border: 1px solid blue">
17
+ <center>
18
+ <table>
19
+ <tr>
20
+ <td>
21
+ <div class="res">
22
+ <table border="0">
23
+ <tr>
24
+ <td>unlimited:</td>
25
+ <td><b>500</b> x1</td>
26
+ <td><b>500</b> x2</td>
27
+ <td><b>500</b> x3</td>
28
+ <td><b>500</b> x4</td>
29
+ </tr>
30
+ <tr>
31
+ <td>limited:</td>
32
+ <td><b>999</b>(1/day) x3</td>
33
+ <td><b>999,999,999</b>(1/day) x2</td>
34
+ </tr>
35
+ </table>
36
+ </div>
37
+ </td>
38
+ </tr>
39
+ </table>
40
+ </center>
41
+ </td>
42
+ </tr>
43
+ <tr>
44
+ <td height="4"></td>
45
+ </tr>
46
+ </table>
47
+ </center>
@@ -0,0 +1,31 @@
1
+
2
+ <html><head>
3
+ <title>Effect Description</title>
4
+ <script language="Javascript" src="/basics.js"></script><link rel="stylesheet" href="/basics.1.css" /></head>
5
+ <body bgcolor=white text=black link=black alink=black vlink=black>
6
+ <div id="description">
7
+
8
+ <font face=Arial,Helvetica size=2><!-- effectid: 23 --><center><img src="/images/itemimages/mandala.gif" width=30 height=30><p><u><a class="hand" style="cursor: pointer;" onclick='window.open("http://kol.coldfront.net/thekolwiki/index.php/Pasta_Oneness", "_blank");window.close();'><b>Pasta Oneness</b></u></a><p></center><blockquote>You feel at one with the forces of the pastaverse. Your fingers pulse with Magicalness.</blockquote><center><font color=blue><b>Mysticality +2</b></font></center></font></font>
9
+ </div>
10
+ <script type="text/javascript">
11
+ <!--
12
+ var resizetries = 0;
13
+ var fsckinresize;
14
+ setTimeout(fsckinresize = function () {
15
+ var desch = document.getElementById('description').offsetHeight;
16
+ if (desch < 100 && resizetries < 5) {
17
+ setTimeout(fsckinresize, 100);
18
+ resizetries++;
19
+ }
20
+ if (desch < 100) desch = 200;
21
+ //alert('resizing on try #' + resizetries);
22
+ if (self.resizeTo && window.outerHeight) {
23
+ self.resizeTo(400, desch + (window.outerHeight - window.innerHeight) + 50);
24
+ }
25
+ else if (self.resizeTo ) { self.resizeTo(400, desch+130); }
26
+ else { window.innerHeight = newh; }
27
+ }, 100);
28
+ //-->
29
+ </script>
30
+ </body>
31
+ <script src="/onfocus.1.js"></script></html>
@@ -0,0 +1,31 @@
1
+
2
+ <html><head>
3
+ <title>Effect Description</title>
4
+ <script language="Javascript" src="/basics.js"></script><link rel="stylesheet" href="/basics.1.css" /></head>
5
+ <body bgcolor=white text=black link=black alink=black vlink=black>
6
+ <div id="description">
7
+
8
+ <font face=Arial,Helvetica size=2><!-- effectid: 1888 --><center><img src="/images/itemimages/handmirror.gif" width=30 height=30><p><u><a class="hand" style="cursor: pointer;" onclick='window.open("http://kol.coldfront.net/thekolwiki/index.php/The_Visible_Adventurer", "_blank");window.close();'><b>The Visible Adventurer</b></u></a><p></center><blockquote>You turned your skin transparent so that you could see what your skeleton looks like. It turns out it look like Charlie Brown's skeleton. Maybe you should see a doctor.</blockquote><center><font color=blue><b>Makes you look like a skeleton</b></font></center></font></font>
9
+ </div>
10
+ <script type="text/javascript">
11
+ <!--
12
+ var resizetries = 0;
13
+ var fsckinresize;
14
+ setTimeout(fsckinresize = function () {
15
+ var desch = document.getElementById('description').offsetHeight;
16
+ if (desch < 100 && resizetries < 5) {
17
+ setTimeout(fsckinresize, 100);
18
+ resizetries++;
19
+ }
20
+ if (desch < 100) desch = 200;
21
+ //alert('resizing on try #' + resizetries);
22
+ if (self.resizeTo && window.outerHeight) {
23
+ self.resizeTo(400, desch + (window.outerHeight - window.innerHeight) + 50);
24
+ }
25
+ else if (self.resizeTo ) { self.resizeTo(400, desch+130); }
26
+ else { window.innerHeight = newh; }
27
+ }, 100);
28
+ //-->
29
+ </script>
30
+ </body>
31
+ <script src="/onfocus.1.js"></script></html>
@@ -0,0 +1,38 @@
1
+ <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
2
+ "http://www.w3.org/TR/html4/loose.dtd">
3
+ <html><head>
4
+ <title>Item Description</title>
5
+ <link rel="stylesheet" type="text/css" href="/images/styles.20230117d.css">
6
+ <style>
7
+ a.hand {
8
+ cursor: pointer;
9
+ }
10
+ </style>
11
+ <script language=Javascript src="/images/scripts/keybinds.min.2.js"></script>
12
+ <script language=Javascript src="/images/scripts/window.20111231.js"></script>
13
+ <script language="Javascript" src="/basics.js"></script><link rel="stylesheet" href="/basics.1.css" /></head>
14
+ <body>
15
+
16
+ <div id="description" class=small><center><img src="/images/itemimages/alienmeat.gif" height=30 width=30 alt="alienmeat"><br><u><a class="hand" style="cursor: pointer;" onclick='window.open("http://kol.coldfront.net/thekolwiki/index.php/alien_meat", "_blank");window.close();'><b>alien meat</b></u></a></center><p><blockquote>This is a slab of meat from an alien animal.<!-- itemid: 9423 --><br><br>(Cooking ingredient)<br>Type: <b>food <font color=green>(good)</font></b><br>Size: <b>1</b><br>Selling Price: <b>8 Meat.</b><p><center><b><font color=blue>Gives 5 Adventures of a random positive effect</font></b></center></blockquote><script type="text/javascript">
17
+ <!--
18
+ var resizetries = 0;
19
+ var fsckinresize;
20
+ setTimeout(fsckinresize = function () {
21
+ var desch = document.getElementById('description').offsetHeight;
22
+ if (desch < 100 && resizetries < 5) {
23
+ setTimeout(fsckinresize, 100);
24
+ resizetries++;
25
+ }
26
+ if (desch < 100) desch = 200;
27
+ //alert('resizing on try #' + resizetries);
28
+ if (self.resizeTo && window.outerHeight) {
29
+ self.resizeTo(400, desch + (window.outerHeight - window.innerHeight) + 50);
30
+ }
31
+ else if (self.resizeTo ) { self.resizeTo(400, desch+130); }
32
+ else { window.innerHeight = newh; }
33
+ }, 100);
34
+ //-->
35
+ </script>
36
+ </div>
37
+ </body>
38
+ <script src="/onfocus.1.js"></script></html>
@@ -0,0 +1,39 @@
1
+ <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
2
+ "http://www.w3.org/TR/html4/loose.dtd">
3
+ <html><head>
4
+ <title>Item Description</title>
5
+ <link rel="stylesheet" type="text/css" href="/images/styles.20230117d.css">
6
+ <style>
7
+ a.hand {
8
+ cursor: pointer;
9
+ }
10
+ </style>
11
+ <script language=Javascript src="/images/scripts/keybinds.min.2.js"></script>
12
+ <script language=Javascript src="/images/scripts/window.20111231.js"></script>
13
+ <script language=Javascript src="/images/scripts/jquery-1.3.1.min.js"></script>
14
+ <script language="javascript" src="/tcrs.js"></script><link rel="stylesheet" href="/tcrs.css" /><script language="Javascript" src="/basics.js"></script><link rel="stylesheet" href="/basics.1.css" /></head>
15
+ <body>
16
+
17
+ <div id="description" class=small><center><img src="/images/itemimages/syringe.gif" height=30 width=30 alt="syringe"><br><u><a class="hand" style="cursor: pointer;" onclick='window.open("http://kol.coldfront.net/thekolwiki/index.php/hypodermic_needle", "_blank");window.close();'><b>hypodermic needle</b></u></a></center><p><blockquote>This is a tiny syringe that has been custom-made to be operated by a mosquito. How, you might ask? Yup, you certainly might ask. This should make the mosquito's blood collection much more efficient.<!-- itemid: 848 --><br><br>Type: <b>familiar equipment</b><br>Familiar: <b>Mosquito</b></b><br>Selling Price: <b>75 Meat.</b><p><center><b><font color=blue>+5 to Familiar Weight<br></font></b></center></blockquote><script type="text/javascript">
18
+ <!--
19
+ var resizetries = 0;
20
+ var fsckinresize;
21
+ setTimeout(fsckinresize = function () {
22
+ var desch = document.getElementById('description').offsetHeight;
23
+ if (desch < 100 && resizetries < 5) {
24
+ setTimeout(fsckinresize, 100);
25
+ resizetries++;
26
+ }
27
+ if (desch < 100) desch = 200;
28
+ //alert('resizing on try #' + resizetries);
29
+ if (self.resizeTo && window.outerHeight) {
30
+ self.resizeTo(400, desch + (window.outerHeight - window.innerHeight) + 50);
31
+ }
32
+ else if (self.resizeTo ) { self.resizeTo(400, desch+130); }
33
+ else { window.innerHeight = newh; }
34
+ }, 100);
35
+ //-->
36
+ </script>
37
+ </div>
38
+ </body>
39
+ <script src="/onfocus.1.js"></script></html>