@sjtdev/koishi-plugin-dota2tracker 1.1.0 → 1.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.
@@ -1,516 +1,543 @@
1
- <!DOCTYPE html>
2
- <html lang="en">
3
- <head>
4
- <meta charset="UTF-8" />
5
- <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
- <title>Document</title>
7
- <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/normalize/8.0.1/normalize.min.css" />
8
- <style>
9
- html,
10
- body {
11
- background-color: black;
12
- color: white;
13
- width: 800px;
14
- }
15
-
16
- .wrapper > *:not(.skills) {
17
- margin: 5px;
18
- box-shadow: 0 0 5px #fff;
19
- display: flex;
20
- }
21
-
22
- img {
23
- width: 100%;
24
- vertical-align: middle;
25
- }
26
-
27
- p {
28
- margin: 0;
29
- }
30
-
31
- .hero {
32
- position: relative;
33
- }
34
-
35
- .hero img {
36
- /* flex-grow: 1; */
37
- width: 25%;
38
- }
39
-
40
- .hero .pri_attr {
41
- position: absolute;
42
- width: 48px;
43
- left: 25%;
44
- }
45
-
46
- .hero .info {
47
- display: flex;
48
- width: 75%;
49
- /* height: 100%; */
50
- flex-direction: column;
51
- justify-content: space-around;
52
- align-items: center;
53
- padding: 4px;
54
- }
55
-
56
- .hero .info .name {
57
- font-size: 24px;
58
- }
59
-
60
- .hero .info .roles .role {
61
- font-size: 14px;
62
- }
63
-
64
- .hero .info .roles .role:not(:last-child) {
65
- margin-right: 12px;
66
- }
67
-
68
- .hero .info .roles .role::after {
69
- margin-left: 3px;
70
- font-size: 22px;
71
- }
72
-
73
- .hero .info .roles .role.level1::after {
74
- content: "■□□";
75
- }
76
-
77
- .hero .info .roles .role.level2::after {
78
- content: "■■□";
79
- }
80
-
81
- .hero .info .roles .role.level3::after {
82
- content: "■■■";
83
- }
84
-
85
- .hero .info .attrs {
86
- height: 16px;
87
- font-size: 16px;
88
- line-height: 1;
89
- }
90
- .hero .info .attrs > span {
91
- margin: 0 8px;
92
- vertical-align: middle;
93
- }
94
-
95
- .hero .info .attrs > span::before {
96
- display: inline-block;
97
- content: "";
98
- background-size: 100%;
99
- width: 16px;
100
- height: 16px;
101
- vertical-align: top;
102
- }
103
-
104
- .hero .info .attrs > span.str::before {
105
- background-image: url("https://cdn.cloudflare.steamstatic.com/apps/dota2/images/dota_react/icons/hero_strength.png");
106
- }
107
-
108
- .hero .info .attrs > span.agi::before {
109
- background-image: url("https://cdn.cloudflare.steamstatic.com/apps/dota2/images/dota_react/icons/hero_agility.png");
110
- }
111
-
112
- .hero .info .attrs > span.int::before {
113
- background-image: url("https://cdn.cloudflare.steamstatic.com/apps/dota2/images/dota_react/icons/hero_intelligence.png");
114
- }
115
-
116
- .details {
117
- flex-direction: row;
118
- }
119
-
120
- .details > * {
121
- width: 50%;
122
- }
123
-
124
- .details .hype_talents {
125
- display: flex;
126
- flex-direction: column;
127
- }
128
-
129
- .details .hype {
130
- padding: 8px;
131
- line-height: 1.25;
132
- }
133
-
134
- .talents {
135
- display: flex; /* 启用Flex布局 */
136
- flex-wrap: wrap; /* 允许元素换行 */
137
- justify-content: center; /* 水平居中整体内容 */
138
- border: #444 10px solid;
139
- /* background-color: ; */
140
- /* padding: 10px; */
141
- box-sizing: border-box;
142
- }
143
-
144
- .talents .talent {
145
- width: 375px;
146
- line-height: 35px;
147
- text-align: center;
148
- display: flex;
149
- }
150
-
151
- .talents .talent .left,
152
- .talents .talent .right {
153
- width: 170px;
154
- font-size: 12px;
155
- }
156
-
157
- .talents .talent:not(:last-child) {
158
- border-bottom: 10px solid #444;
159
- }
160
-
161
- .talents .talent .level {
162
- flex: 0 0 auto; /* 第二个元素不伸缩,保持自身宽度 */
163
- width: 35px; /* 给中间元素一个固定宽度 */
164
- height: 35px;
165
- font-size: 18px;
166
- line-height: 35px;
167
- text-align: center;
168
- box-sizing: border-box;
169
- border-radius: 100%;
170
- color: #e7d292;
171
- text-shadow: 0px 0px 8px #ff531c;
172
- background-color: #444;
173
- /* font-family: Reaver, serif;
174
- font-weight: bold; */
175
- }
176
-
177
- .details .list {
178
- }
179
-
180
- .details .list td {
181
- width: 50%;
182
- text-align: center;
183
- }
184
-
185
- .details .list tr:nth-child(even) {
186
- background-color: #333;
187
- }
188
-
189
- .skills {
190
- width: 800px;
191
- display: flex;
192
- flex-wrap: wrap;
193
- }
194
-
195
- .skill {
196
- position: relative;
197
- background-color: #141b1f;
198
- margin: 5px;
199
- box-shadow: 0 0 5px #fff;
200
- width: 390px;
201
- /* flex-direction: column; */
202
- }
203
-
204
- .skill > *:not(:nth-child(2)) {
205
- padding-left: 8px;
206
- }
207
-
208
- .skill > .title {
209
- background-color: #1f272b;
210
- padding: 8px;
211
- font-weight: 100;
212
- font-family: "KaiTi", "楷体", "楷体_GB2312", "STKaiti", serif;
213
- }
214
-
215
- .skill svg.scepter {
216
- position: absolute;
217
- right: 8px;
218
- top: 4.57px;
219
- }
220
-
221
- .skill svg.shard {
222
- position: absolute;
223
- right: 8px;
224
- top: 13.88px;
225
- }
226
-
227
- .skill .img_stats {
228
- display: flex;
229
- color: #546780;
230
- margin-bottom: 16px;
231
- border-top: #2a363c 1px solid;
232
- border-bottom: #2a363c 1px solid;
233
- }
234
-
235
- .skill .img_stats img {
236
- width: 128px;
237
- }
238
-
239
- .skill .img_stats .stats {
240
- padding: 8px;
241
- }
242
-
243
- .skill .stats .dmg_type.Physical::after {
244
- content: "物理";
245
- color: #ae2f28;
246
- }
247
-
248
- .skill .stats .dmg_type.Magical::after {
249
- content: "魔法";
250
- color: #5b93d1;
251
- }
252
-
253
- .skill .stats .dmg_type.Pure::after {
254
- content: "纯粹";
255
- color: #c29c4a;
256
- }
257
-
258
- .skill .stats .dispellable.Yes::after {
259
- content: "是";
260
- /* color: #c29c4a; */
261
- }
262
-
263
- .skill .stats .dispellable.No::after {
264
- content: "无法驱散";
265
- color: #f00;
266
- }
267
-
268
- .skill .stats .dispellable.Strong::after {
269
- content: "仅强驱散";
270
- color: #9828ae;
271
- }
272
-
273
- .skill .description {
274
- color: #9bb1ce;
275
- margin-bottom: 32px;
276
- }
277
-
278
- .skill .aghanim_description {
279
- padding-left: 0;
280
- color: #9bb1ce;
281
- margin-bottom: 16px;
282
- border: #263945 solid 3px;
283
- box-sizing: border-box;
284
- }
285
-
286
- .skill .aghanim_description .title {
287
- /* content: "阿哈利姆魔晶"; */
288
- display: block;
289
- font-size: 20px;
290
- background-color: #263945;
291
- padding: 12px;
292
- }
293
-
294
- .skill .aghanim_description .desc {
295
- margin: 12px;
296
- display: block;
297
- }
298
-
299
- .skill .notes {
300
- padding: 12px;
301
- margin-bottom: 12px;
302
- color: #9fb7c6;
303
- background-color: #263945;
304
- }
305
-
306
- .skill .attributes .item {
307
- color: #546780;
308
- }
309
-
310
- .skill .attributes .item::after {
311
- content: ":";
312
- }
313
-
314
- .skill .attributes .values {
315
- color: #4b525d;
316
- }
317
-
318
- .skill .attributes {
319
- margin-bottom: 12px;
320
- }
321
-
322
- .skill .mana_cost {
323
- padding-left: 12px;
324
- }
325
-
326
- .skill .cooldown::before,
327
- .skill .mana_cost::before {
328
- content: "";
329
- background-size: 100%;
330
- width: 21px;
331
- height: 21px;
332
- display: inline-block;
333
- vertical-align: middle;
334
- }
335
-
336
- .skill .cooldown::before {
337
- background-image: url("data:image/webp;base64,UklGRnABAABXRUJQVlA4TGMBAAAvE8AEEE2QTdqmkI5pRP/DS2wBEIT/bw8R/U8Ddq1NipSvGnd3eXJ3d3kmEM+GTDwBciCBTQCd7qpCeokBQdu2cc6f8tcQEBT5P9oEIGiwYuMBECqAbCUVIIAa19Py1I/AQMrJVGEABACe+DRqcl2GUxeOwIAzQkAAMCBxyi3BRcbSkzAKyIDTciQOAAgwyx43JA4CWRkeQXAAQKkGEs5+/siARwFHAHCUiAGwPwAEAGQSDgCAoCQUQc7OkwMbhgAAJBIKEAtkE9enBgcABEUxAIwyZ6cOx/lTkPiHsX+mqCQTMQRwcmAszPLUoTiCkVAAbDKEAWWUjWlGMYyEAR4n4wMeiBk8W9M1lphIQmAsmWxBJ1vfAJZIBMAoJwNQ0JTN04/yRaCCftofwWBkAMAjQ6BILaWMsEkFFVTTk/qEETyQlYFXnh9jmABKbkgzNQgemYwnTOKFEgAAOGJAeUbyhQIAAA==");
338
- }
339
-
340
- .skill .mana_cost::before {
341
- background-image: url("data:image/webp;base64,UklGRsYAAABXRUJQVlA4TLkAAAAvE8AEEIfBOIDbtEmdpEDhS8G2kSTF0eteuLOebJz/0KDREgwBAGEu/89yqe5LCyEaDT03NBcLpEXnJgkZKS2dmlqAlNSCgJXURBoNCHAY2bbSvEP0fxzi7sGh//rslRDR/xQxS0bXRkRMmr5Ho8iISY5523Ztr2vabBuaZZLVE99wRqWAUgGFAv4K+Cngo4CXAp4KeCjgroCbAi4KVv7pOnFwF8aP9+fRXeAaMZ63GbXWiIhxGJ0bEQA=");
342
- }
343
-
344
- .skill .lore {
345
- font-size: 13px;
346
- color: #3e4f5b;
347
- padding: 8px;
348
- line-height: 1.25;
349
- }
350
-
351
- body .wrapper > .lore {
352
- /* flex-direction: column; */
353
- display: block;
354
- line-height: 1.25;
355
- padding: 8px;
356
- font-family: "KaiTi", "楷体", "楷体_GB2312", "STKaiti", serif;
357
- color: #aaa;
358
- }
359
- </style>
360
- </head>
361
- <body>
362
- <div class="wrapper">
363
- <div class="hero">
364
- <img src="https://cdn.cloudflare.steamstatic.com/apps/dota2/images/dota_react/heroes/hoodwink.png" alt="" />
365
- <img class="pri_attr" src="https://cdn.cloudflare.steamstatic.com/apps/dota2/images/dota_react/icons/hero_universal.png" alt="" />
366
- <div class="info">
367
- <p class="name">森海飞霞</p>
368
- <p class="roles">
369
- <span class="role level2">ESCAPE</span>
370
- <span class="role level2">NUKER</span>
371
- <span class="role level1">DISABLER</span>
372
- <span class="role level2">SUPPORT</span>
373
- </p>
374
- <p class="attrs">
375
- <span class="str">17 <span class="gain">+2.0</span></span> <span class="agi">17 <span class="gain">+2.0</span></span>
376
- <span class="int">17 <span class="gain">+2.0</span></span>
377
- </p>
378
- </div>
379
- </div>
380
- <div class="details">
381
- <div class="hype_talents">
382
- <div class="hype">
383
- 麻烦来临时森海飞霞总是身在左近,她的生活就是与自己视为家乡的诡异林渊中充斥的威胁纠缠不清。
384
- 携带着<b>巨大的弩机</b>,同时仍能<b>在密林中轻松奔走</b>,森海飞霞在战斗中来去自如。只要有一瞬间没见到她,她就会从你背后现身——而你目瞪口呆的尸体已经挂在她的<b>一张网</b>里。
385
- </div>
386
- <div class="talents">
387
- <div class="talent">
388
- <div class="left">+10 zuobiantianfu</div>
389
- <div class="level">25</div>
390
- <div class="right">+20 youbiantianfu</div>
391
- </div>
392
- <div class="talent">
393
- <div class="left">+10 zuobiantianfu</div>
394
- <div class="level">20</div>
395
- <div class="right">+20 youbiantianfu</div>
396
- </div>
397
- <div class="talent">
398
- <div class="left">+10 zuobiantianfu</div>
399
- <div class="level">15</div>
400
- <div class="right">+20 youbiantianfu</div>
401
- </div>
402
- <div class="talent">
403
- <div class="left">+10 zzz</div>
404
- <div class="level">10</div>
405
- <div class="right">+40% 密林奔走开启时闪避</div>
406
- </div>
407
- </div>
408
- </div>
409
- <table class="list">
410
- <tbody>
411
- <tr>
412
- <td>初始生命值</td>
413
- <td>123</td>
414
- </tr>
415
- <tr>
416
- <td>初始生命回复</td>
417
- <td>1.23</td>
418
- </tr>
419
- <tr>
420
- <td>初始魔法值</td>
421
- <td>123</td>
422
- </tr>
423
- <tr>
424
- <td>初始魔法回复</td>
425
- <td>1.23</td>
426
- </tr>
427
- <tr>
428
- <td>初始攻击力</td>
429
- <td>55(11~22)</td>
430
- </tr>
431
- <tr>
432
- <td>基础攻击间隔</td>
433
- <td>2.0</td>
434
- </tr>
435
- <tr>
436
- <td>基础攻击前摇</td>
437
- <td>0.4</td>
438
- </tr>
439
- <tr>
440
- <td>攻击范围</td>
441
- <td>575</td>
442
- </tr>
443
- <tr>
444
- <td>护甲</td>
445
- <td>2(11%)</td>
446
- </tr>
447
- <tr>
448
- <td>移动速度</td>
449
- <td>333</td>
450
- </tr>
451
- <tr>
452
- <td>视野范围</td>
453
- <td>1800(800)</td>
454
- </tr>
455
- </tbody>
456
- </table>
457
- </div>
458
- <div class="skills">
459
- <div class="skill">
460
- <p class="title">爆栗出击</p>
461
- <svg class="shard" viewBox="0 0 19 10" fill="hsla(0,0%,100%,0.16)" width="24">
462
- <path
463
- d="M0.259504 4.54746C0.272981 4.60325 0.326002 4.64198 0.386194 4.64198C0.831857 4.62418 2.60461 4.45628 3.91732 2.90727C4.49956 2.22054 4.37916 1.21884 3.64777 0.671532C2.91819 0.125197 1.85256 0.238284 1.27032 0.924899C-0.0423919 2.47305 0.17864 4.13525 0.259504 4.54746Z"
464
- fill="url(#activeAghanimLeftShardGradient)"
465
- ></path>
466
- <path
467
- d="M9.46713 9.98081C9.42698 10.0064 9.37572 10.0064 9.33559 9.98081C8.88968 9.67166 6.33212 7.75166 6.33212 4.38581C6.33212 2.96661 7.70742 1.81406 9.40136 1.81406C11.0953 1.81406 12.4706 2.96661 12.4706 4.38581C12.4706 7.75166 9.91303 9.67166 9.46713 9.98081Z"
468
- fill="url(#activeAghanimMidShardGradient)"
469
- ></path>
470
- <path
471
- d="M18.6888 4.54746C18.6753 4.60325 18.6232 4.64198 18.5631 4.64198C18.1173 4.62418 16.3445 4.45628 15.0317 2.90727C14.4494 2.22054 14.5697 1.21884 15.3003 0.671532C16.0308 0.125197 17.0966 0.238284 17.6788 0.924899C18.9917 2.47305 18.7707 4.13525 18.6888 4.54746Z"
472
- fill="url(#activeAghanimRightShardGradient)"
473
- ></path>
474
- <defs>
475
- <radialGradient id="activeAghanimMidShardGradient" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(9.01787 2.49983) rotate(90) scale(7.50029 5.21143)">
476
- <stop stop-color="#00CEFF"></stop>
477
- <stop offset="1" stop-color="#3443C4"></stop>
478
- </radialGradient>
479
- <radialGradient id="activeAghanimLeftShardGradient" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(3.98746 0.625367) rotate(128.66) scale(6.00315 4.79432)">
480
- <stop stop-color="#00CEFF"></stop>
481
- <stop offset="1" stop-color="#3443C4"></stop>
482
- </radialGradient>
483
- <radialGradient id="activeAghanimRightShardGradient" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(14.2996 0.625367) rotate(51.3402) scale(6.00316 4.7942)">
484
- <stop stop-color="#00CEFF"></stop>
485
- <stop offset="1" stop-color="#3443C4"></stop>
486
- </radialGradient>
487
- </defs>
488
- </svg>
489
- <div class="img_stats">
490
- <img src="https://cdn.cloudflare.steamstatic.com/apps/dota2/images/dota_react/abilities/hoodwink_acorn_shot.png" alt="" />
491
- <div class="stats">
492
- <p class="stat">技能:点目标</p>
493
- <p class="dmg_type Magical">伤害类型:</p>
494
- </div>
495
- </div>
496
- <p class="description">森海飞霞向目标单位发射一颗橡栗,可以弹射至附近敌人,减缓他们的移动速度,并造成攻击伤害的一定百分比和额外伤害。</p>
497
- <p class="description">可以对地面施放,在目标地点种出一棵树,而橡栗会弹射至附近目标。设为多样施法后会强制沿用该行为。</p>
498
- <p class="shard aghanim_description"><span class="title"> 阿哈利姆魔晶</span><span class="desc">可以对地面施放,在目标地点种出一棵树,而橡栗会弹射至附近目标。设为多样施法后会强制沿用该行为。</span></p>
499
- <div class="notes">
500
- <p>同一个目标可以被击中超过一次。</p>
501
- <p>弹射会搜寻525范围内战争迷雾中的单位,但无视隐身单位。</p>
502
- <p>种下的树持续20秒。</p>
503
- <p>爆栗出击可以享受攻击距离加成效果。</p>
504
- </div>
505
- <div class="attributes"><span class="item">额外攻击距离</span><span class="values"> 125 / 200 / 275 / 350</span></div>
506
- <p><span class="cooldown"> 16 / 14 / 12 / 10 </span><span class="mana_cost" style="padding-left: 12px"> 70 / 75 / 80 / 85 </span></p>
507
- <p class="lore">虽然她几乎什么都能凑合着用,不过橡树和铁树之木的栗子是最有效的炮弹——也是森海飞霞大部分的存货来源。</p>
508
- </div>
509
- </div>
510
- <div class="lore">
511
- 在云硝国的边界,绿色的森林绵延不绝,生活悠然自得,森海飞霞的早年时光就是在这里度过的。但是随着王国的发展,居民和军队的需求急剧增加,互相竞争的矿石和木材大亨拼命地你追我赶,疯狂地进行扩张来满足日新月异的需求,而边界森林的自然美景不断遭到蚕食。
512
- <br /><br />生活在古老林地中的人们别无选择,摆在面前的选择有跟随一众难民进入和平地带,或者在保卫自己的房屋时倒在云硝国的火药和铁器之下,又或者继续北上,逃往云雾缭绕的托莫干森林,在幽谷和密林中碰碰运气。<br /><br />而正是在这片危险的北方林渊中,森海飞霞时刻都在躲避托莫干中可怕的捕食者,拉拢当地一些匪徒时也对其他帮派施以颜色,还会想尽一切办法来引发有意思的恶作剧——<i>听说</i>她常常就是罪魁祸首。就这样,她一路长大成年。<br /><br />但云硝国的大火终于有一丝气味飘到了她第二个故乡,森海飞霞的思绪落在侵略下存活的亲友身上——如今他们在被夷平的土地上苟延残喘,这让她心如刀割——她禁不住想前往文明的边际,看一眼摧毁她过去生活的恶魔。<br /><br />到了目的地之后,她亲眼见到了。她看到她童年里的怪物根本就不是怪物。他们只是……普通人。士兵,工人,商贩……还有难民。而士兵,就算配备了火药和铁器,也根本比不上托莫干的危险——那是真正的危险,有着触角和利齿——她像不停转动的枫子围绕着这些危险翩翩起舞。<br /><br />永远笼罩着浓雾的森林让多数热血的人们不敢涉足,而森海飞霞对其中盘根错节的小路了如指掌,现在她会对胆敢威胁林野的人出手——开心地从他们手里拿走自己喜爱的东西,摧毁她不感兴趣的,还有帮助幸存的同胞重拾森林中的生活。
513
- </div>
514
- </div>
515
- </body>
516
- </html>
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
+ <title>Document</title>
7
+ <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/normalize/8.0.1/normalize.min.css" />
8
+ <style>
9
+ html,
10
+ body {
11
+ background-color: black;
12
+ color: white;
13
+ width: 800px;
14
+ }
15
+
16
+ .wrapper > *:not(.skills) {
17
+ margin: 5px;
18
+ box-shadow: 0 0 5px #fff;
19
+ display: flex;
20
+ }
21
+
22
+ img {
23
+ width: 100%;
24
+ vertical-align: middle;
25
+ }
26
+
27
+ p {
28
+ margin: 0;
29
+ }
30
+
31
+ .hero {
32
+ position: relative;
33
+ }
34
+
35
+ .hero img {
36
+ /* flex-grow: 1; */
37
+ width: 25%;
38
+ }
39
+
40
+ .hero .pri_attr {
41
+ position: absolute;
42
+ width: 48px;
43
+ left: 25%;
44
+ }
45
+
46
+ .hero .info {
47
+ display: flex;
48
+ width: 75%;
49
+ /* height: 100%; */
50
+ flex-direction: column;
51
+ justify-content: space-around;
52
+ align-items: center;
53
+ padding: 4px;
54
+ }
55
+
56
+ .hero .info .name {
57
+ font-size: 24px;
58
+ }
59
+
60
+ .hero .info .roles .role {
61
+ font-size: 14px;
62
+ }
63
+
64
+ .hero .info .roles .role:not(:last-child) {
65
+ margin-right: 12px;
66
+ }
67
+
68
+ .hero .info .roles .role::after {
69
+ margin-left: 3px;
70
+ font-size: 22px;
71
+ }
72
+
73
+ .hero .info .roles .role.level1::after {
74
+ content: "■□□";
75
+ }
76
+
77
+ .hero .info .roles .role.level2::after {
78
+ content: "■■□";
79
+ }
80
+
81
+ .hero .info .roles .role.level3::after {
82
+ content: "■■■";
83
+ }
84
+
85
+ .hero .info .attrs {
86
+ height: 16px;
87
+ font-size: 16px;
88
+ line-height: 1;
89
+ }
90
+ .hero .info .attrs > span {
91
+ margin: 0 8px;
92
+ vertical-align: middle;
93
+ }
94
+
95
+ .hero .info .attrs > span::before {
96
+ display: inline-block;
97
+ content: "";
98
+ background-size: 100%;
99
+ width: 16px;
100
+ height: 16px;
101
+ vertical-align: top;
102
+ }
103
+
104
+ .hero .info .attrs > span.str::before {
105
+ background-image: url("https://cdn.cloudflare.steamstatic.com/apps/dota2/images/dota_react/icons/hero_strength.png");
106
+ }
107
+
108
+ .hero .info .attrs > span.agi::before {
109
+ background-image: url("https://cdn.cloudflare.steamstatic.com/apps/dota2/images/dota_react/icons/hero_agility.png");
110
+ }
111
+
112
+ .hero .info .attrs > span.int::before {
113
+ background-image: url("https://cdn.cloudflare.steamstatic.com/apps/dota2/images/dota_react/icons/hero_intelligence.png");
114
+ }
115
+
116
+ .details {
117
+ flex-direction: row;
118
+ }
119
+
120
+ .details > * {
121
+ width: 50%;
122
+ }
123
+
124
+ .details .hype_talents {
125
+ display: flex;
126
+ flex-direction: column;
127
+ }
128
+
129
+ .details .hype {
130
+ padding: 8px;
131
+ line-height: 1.25;
132
+ }
133
+
134
+ .talents {
135
+ display: flex; /* 启用Flex布局 */
136
+ flex-wrap: wrap; /* 允许元素换行 */
137
+ justify-content: center; /* 水平居中整体内容 */
138
+ border: #444 10px solid;
139
+ /* background-color: ; */
140
+ /* padding: 10px; */
141
+ box-sizing: border-box;
142
+ }
143
+
144
+ .talents .talent {
145
+ width: 375px;
146
+ line-height: 35px;
147
+ text-align: center;
148
+ display: flex;
149
+ }
150
+
151
+ .talents .talent .left,
152
+ .talents .talent .right {
153
+ width: 170px;
154
+ font-size: 12px;
155
+ }
156
+
157
+ .talents .talent:not(:last-child) {
158
+ border-bottom: 10px solid #444;
159
+ }
160
+
161
+ .talents .talent .level {
162
+ flex: 0 0 auto; /* 第二个元素不伸缩,保持自身宽度 */
163
+ width: 35px; /* 给中间元素一个固定宽度 */
164
+ height: 35px;
165
+ font-size: 18px;
166
+ line-height: 35px;
167
+ text-align: center;
168
+ box-sizing: border-box;
169
+ border-radius: 100%;
170
+ color: #e7d292;
171
+ text-shadow: 0px 0px 8px #ff531c;
172
+ background-color: #444;
173
+ /* font-family: Reaver, serif;
174
+ font-weight: bold; */
175
+ }
176
+
177
+ .details .list {
178
+ }
179
+
180
+ .details .list td {
181
+ width: 50%;
182
+ text-align: center;
183
+ }
184
+
185
+ .details .list tr:nth-child(even) {
186
+ background-color: #333;
187
+ }
188
+
189
+ .skills {
190
+ width: 800px;
191
+ display: flex;
192
+ flex-wrap: wrap;
193
+ }
194
+
195
+ .skill {
196
+ background-color: #141b1f;
197
+ margin: 5px;
198
+ box-shadow: 0 0 5px #fff;
199
+ width: 390px;
200
+ /* flex-direction: column; */
201
+ }
202
+
203
+ .skill > *:not(:nth-child(2)) {
204
+ padding-left: 8px;
205
+ }
206
+
207
+ .skill > .title {
208
+ position: relative;
209
+ background-color: #1f272b;
210
+ padding: 8px;
211
+ font-weight: 100;
212
+ font-family: "KaiTi", "楷体", "楷体_GB2312", "STKaiti", serif;
213
+ }
214
+
215
+ .skill img.scepter,
216
+ .skill img.shard {
217
+ position: absolute;
218
+ width: 24px;
219
+ right: 8px;
220
+ top: 50%;
221
+ transform: translateY(-50%);
222
+ }
223
+
224
+ .skill .img_stats {
225
+ display: flex;
226
+ color: #546780;
227
+ margin-bottom: 16px;
228
+ border-top: #2a363c 1px solid;
229
+ border-bottom: #2a363c 1px solid;
230
+ }
231
+
232
+ .skill .img_stats img {
233
+ width: 128px;
234
+ }
235
+
236
+ .skill .img_stats .stats {
237
+ padding: 8px;
238
+ }
239
+
240
+ .skill .stats .dmg_type.Physical::after {
241
+ content: "物理";
242
+ color: #ae2f28;
243
+ }
244
+
245
+ .skill .stats .dmg_type.Magical::after {
246
+ content: "魔法";
247
+ color: #5b93d1;
248
+ }
249
+
250
+ .skill .stats .dmg_type.Pure::after {
251
+ content: "纯粹";
252
+ color: #c29c4a;
253
+ }
254
+
255
+ .skill .stats .dispellable.Yes::after {
256
+ content: "是";
257
+ /* color: #c29c4a; */
258
+ }
259
+
260
+ .skill .stats .dispellable.No::after {
261
+ content: "无法驱散";
262
+ color: #f00;
263
+ }
264
+
265
+ .skill .stats .dispellable.Strong::after {
266
+ content: "仅强驱散";
267
+ color: #9828ae;
268
+ }
269
+
270
+ .skill .description {
271
+ color: #9bb1ce;
272
+ margin-bottom: 32px;
273
+ }
274
+
275
+ .skill .aghanim_description {
276
+ padding-left: 0;
277
+ color: #9bb1ce;
278
+ margin-bottom: 16px;
279
+ border: #263945 solid 3px;
280
+ box-sizing: border-box;
281
+ }
282
+
283
+ .skill .aghanim_description .title {
284
+ /* content: "阿哈利姆魔晶"; */
285
+ display: block;
286
+ font-size: 20px;
287
+ background-color: #263945;
288
+ padding: 12px;
289
+ }
290
+
291
+ .skill .aghanim_description .desc {
292
+ margin: 12px;
293
+ display: block;
294
+ }
295
+
296
+ .skill .aghanim_description img{
297
+ position: unset;
298
+ transform: none;
299
+ }
300
+
301
+ .skill .notes {
302
+ padding: 12px;
303
+ margin-bottom: 12px;
304
+ color: #9fb7c6;
305
+ background-color: #263945;
306
+ }
307
+
308
+ .skill .attributes .item {
309
+ color: #546780;
310
+ }
311
+
312
+ .skill .attributes .item::after {
313
+ content: ":";
314
+ }
315
+
316
+ .skill .attributes .values {
317
+ color: #4b525d;
318
+ }
319
+
320
+ .skill .attributes {
321
+ margin-bottom: 12px;
322
+ }
323
+
324
+ .skill .mana_cost {
325
+ padding-left: 12px;
326
+ }
327
+
328
+ .skill .cooldown::before,
329
+ .skill .mana_cost::before {
330
+ content: "";
331
+ background-size: 100%;
332
+ width: 21px;
333
+ height: 21px;
334
+ display: inline-block;
335
+ vertical-align: middle;
336
+ }
337
+
338
+ .skill .cooldown::before {
339
+ background-image: url("data:image/webp;base64,UklGRnABAABXRUJQVlA4TGMBAAAvE8AEEE2QTdqmkI5pRP/DS2wBEIT/bw8R/U8Ddq1NipSvGnd3eXJ3d3kmEM+GTDwBciCBTQCd7qpCeokBQdu2cc6f8tcQEBT5P9oEIGiwYuMBECqAbCUVIIAa19Py1I/AQMrJVGEABACe+DRqcl2GUxeOwIAzQkAAMCBxyi3BRcbSkzAKyIDTciQOAAgwyx43JA4CWRkeQXAAQKkGEs5+/siARwFHAHCUiAGwPwAEAGQSDgCAoCQUQc7OkwMbhgAAJBIKEAtkE9enBgcABEUxAIwyZ6cOx/lTkPiHsX+mqCQTMQRwcmAszPLUoTiCkVAAbDKEAWWUjWlGMYyEAR4n4wMeiBk8W9M1lphIQmAsmWxBJ1vfAJZIBMAoJwNQ0JTN04/yRaCCftofwWBkAMAjQ6BILaWMsEkFFVTTk/qEETyQlYFXnh9jmABKbkgzNQgemYwnTOKFEgAAOGJAeUbyhQIAAA==");
340
+ }
341
+
342
+ .skill .mana_cost::before {
343
+ background-image: url("data:image/webp;base64,UklGRsYAAABXRUJQVlA4TLkAAAAvE8AEEIfBOIDbtEmdpEDhS8G2kSTF0eteuLOebJz/0KDREgwBAGEu/89yqe5LCyEaDT03NBcLpEXnJgkZKS2dmlqAlNSCgJXURBoNCHAY2bbSvEP0fxzi7sGh//rslRDR/xQxS0bXRkRMmr5Ho8iISY5523Ztr2vabBuaZZLVE99wRqWAUgGFAv4K+Cngo4CXAp4KeCjgroCbAi4KVv7pOnFwF8aP9+fRXeAaMZ63GbXWiIhxGJ0bEQA=");
344
+ }
345
+
346
+ .skill .lore {
347
+ font-size: 13px;
348
+ color: #3e4f5b;
349
+ padding: 8px;
350
+ line-height: 1.25;
351
+ }
352
+
353
+ body .wrapper > .lore {
354
+ /* flex-direction: column; */
355
+ display: block;
356
+ line-height: 1.25;
357
+ padding: 8px;
358
+ font-family: "KaiTi", "楷体", "楷体_GB2312", "STKaiti", serif;
359
+ color: #aaa;
360
+ }
361
+ </style>
362
+ </head>
363
+ <body>
364
+ <% let hero = data; %>
365
+ <div class="wrapper">
366
+ <%- `
367
+ <div class="hero" id="${hero.id}">
368
+ <img src="${utils.getImageUrl(hero.shortName, ImageType.Heroes)}" alt="" />
369
+ <img class="pri_attr" src="${utils.getImageUrl(d2a.primary_attrs[dotaconstants.heroes[hero.id].primary_attr], ImageType.Icons)}" alt="" />
370
+ <div class="info">
371
+ <p class="name">${hero.language.displayName}</p>
372
+ <p class="roles">
373
+ ${hero.roles.map((item) => `<span class="role level${item.level}">${d2a.roles[item.roleId]}</span>`).join("")}
374
+ </p>
375
+ <p class="attrs">
376
+ <span class="str">${dotaconstants.heroes[hero.id].base_str} <span class="gain">+${dotaconstants.heroes[hero.id].str_gain.toFixed(1)}</span></span>
377
+ <span class="agi">${dotaconstants.heroes[hero.id].base_agi} <span class="gain">+${dotaconstants.heroes[hero.id].agi_gain.toFixed(1)}</span></span>
378
+ <span class="int">${dotaconstants.heroes[hero.id].base_int} <span class="gain">+${dotaconstants.heroes[hero.id].int_gain.toFixed(1)}</span></span>
379
+ </p>
380
+ </div>
381
+ </div>
382
+ <div class="details">
383
+ <div class="hype_talents">
384
+ <div class="hype">
385
+ ${hero.language.hype}
386
+ </div>
387
+ <div class="talents">
388
+ <div class="talent">
389
+ <div class="left">${hero.talents[7].name_cn}</div>
390
+ <div class="level">25</div>
391
+ <div class="right">${hero.talents[6].name_cn}</div>
392
+ </div>
393
+ <div class="talent">
394
+ <div class="left">${hero.talents[5].name_cn}</div>
395
+ <div class="level">20</div>
396
+ <div class="right">${hero.talents[4].name_cn}</div>
397
+ </div>
398
+ <div class="talent">
399
+ <div class="left">${hero.talents[3].name_cn}</div>
400
+ <div class="level">15</div>
401
+ <div class="right">${hero.talents[2].name_cn}</div>
402
+ </div>
403
+ <div class="talent">
404
+ <div class="left">${hero.talents[1].name_cn}</div>
405
+ <div class="level">10</div>
406
+ <div class="right">${hero.talents[0].name_cn}</div>
407
+ </div>
408
+ </div>
409
+ </div>
410
+ <table class="list">
411
+ <tbody>
412
+ <tr>
413
+ <td>初始生命值</td>
414
+ <td>${dotaconstants.heroes[hero.id].base_health + dotaconstants.heroes[hero.id].base_str * 22}</td>
415
+ </tr>
416
+ <tr>
417
+ <td>初始生命回复</td>
418
+ <td>${dotaconstants.heroes[hero.id].base_health_regen}</td>
419
+ </tr>
420
+ <tr>
421
+ <td>初始魔法值</td>
422
+ <td>${dotaconstants.heroes[hero.id].base_mana + dotaconstants.heroes[hero.id].base_int * 12}</td>
423
+ </tr>
424
+ <tr>
425
+ <td>初始魔法回复</td>
426
+ <td>${dotaconstants.heroes[hero.id].base_mana_regen}</td>
427
+ </tr>
428
+ <tr>
429
+ <td>初始攻击力</td>
430
+ <td>${dotaconstants.heroes[hero.id].base_mr + Math.round(dotaconstants.heroes[hero.id].primary_attr == "all" ?
431
+ (dotaconstants.heroes[hero.id].base_str + dotaconstants.heroes[hero.id].base_agi + dotaconstants.heroes[hero.id].base_int) * 0.7
432
+ : dotaconstants.heroes[hero.id]["base_" + dotaconstants.heroes[hero.id].primary_attr])}
433
+ (${dotaconstants.heroes[hero.id].base_attack_min + Math.round(dotaconstants.heroes[hero.id].primary_attr == "all" ?
434
+ (dotaconstants.heroes[hero.id].base_str + dotaconstants.heroes[hero.id].base_agi + dotaconstants.heroes[hero.id].base_int) * 0.7
435
+ : dotaconstants.heroes[hero.id]["base_" + dotaconstants.heroes[hero.id].primary_attr])}
436
+ ~${dotaconstants.heroes[hero.id].base_attack_max + Math.round(dotaconstants.heroes[hero.id].primary_attr == "all" ?
437
+ (dotaconstants.heroes[hero.id].base_str + dotaconstants.heroes[hero.id].base_agi + dotaconstants.heroes[hero.id].base_int) * 0.7
438
+ : dotaconstants.heroes[hero.id]["base_" + dotaconstants.heroes[hero.id].primary_attr])})
439
+ </td>
440
+ </tr>
441
+ <tr>
442
+ <td>基础攻击间隔</td>
443
+ <td>${dotaconstants.heroes[hero.id].attack_rate.toFixed(1)}</td>
444
+ </tr>
445
+ <tr>
446
+ <td>基础攻击前摇</td>
447
+ <td>${dotaconstants.heroes[hero.id].attack_point.toFixed(1)}</td>
448
+ </tr>
449
+ <tr>
450
+ <td>攻击范围</td>
451
+ <td>${dotaconstants.heroes[hero.id].attack_range}</td>
452
+ </tr>
453
+ <tr>
454
+ <td>护甲</td>
455
+ <td>${(Math.round((dotaconstants.heroes[hero.id].base_armor + dotaconstants.heroes[hero.id].base_agi * 0.167) * 10) / 10).toFixed(1)}</td>
456
+ </tr>
457
+ <tr>
458
+ <td>移动速度</td>
459
+ <td>${dotaconstants.heroes[hero.id].move_speed}</td>
460
+ </tr>
461
+ <tr>
462
+ <td>视野范围</td>
463
+ <td>${dotaconstants.heroes[hero.id].day_vision}(${dotaconstants.heroes[hero.id].night_vision})</td>
464
+ </tr>
465
+ </tbody>
466
+ </table>
467
+ </div>
468
+ <div class="skills">
469
+ ${hero.abilities.filter((item) => dotaconstants.abilities[item.ability.name].behavior != "Hidden")
470
+ .map((item) => `
471
+ <div class="skill">
472
+ <p class="title">
473
+ <span>${item.ability.language.displayName}</span>
474
+ ${item.ability.stat.isGrantedByScepter ?`<img src="${utils.getImageUrl("scepter")}" alt="" class="scepter"></p>`:""}
475
+ ${item.ability.stat.isGrantedByShard ?`<img src="${utils.getImageUrl("shard")}" alt="" class="shard"></p>`:""}
476
+ </p>
477
+ <div class="img_stats">
478
+ <img src="${utils.getImageUrl(item.ability.name, ImageType.Abilities)}" alt="" />
479
+ <div class="stats">
480
+ <p class="behavior">技能:${(Array.isArray(dotaconstants.abilities[item.ability.name].behavior) ? dotaconstants.abilities[item.ability.name].behavior : [dotaconstants.abilities[item.ability.name].behavior])
481
+ .filter((beh) => beh !== "Hidden" || !(item.ability.stat.isGrantedByShard || item.ability.stat.isGrantedByScepter))
482
+ .map((beh) => d2a.behavior[beh])
483
+ .join("/")}</p>
484
+ ${dotaconstants.abilities[item.ability.name].target_team
485
+ ? `<p class="target_team">影响:${(Array.isArray(dotaconstants.abilities[item.ability.name].target_team)
486
+ ? dotaconstants.abilities[item.ability.name].target_team
487
+ : [dotaconstants.abilities[item.ability.name].target_team])
488
+ .map((tt) => d2a.target_team[tt])
489
+ .join("/")}</p>`
490
+ : ""}
491
+ ${!Array.isArray(dotaconstants.abilities[item.ability.name].dmg_type) && dotaconstants.abilities[item.ability.name].dmg_type
492
+ ? `<p class="dmg_type ${dotaconstants.abilities[item.ability.name].dmg_type}">伤害类型:</p>`
493
+ : ""}
494
+ ${dotaconstants.abilities[item.ability.name].dispellable
495
+ ? `<p class="dispellable ${dotaconstants.abilities[item.ability.name].dispellable == "Strong Dispels Only" ? "Strong" : dotaconstants.abilities[item.ability.name].dispellable}">能否驱散:</p>`
496
+ : ""}
497
+ ${!Array.isArray(dotaconstants.abilities[item.ability.name].bkbpierce) && dotaconstants.abilities[item.ability.name].bkbpierce
498
+ ? `<p class="bkbpierce">无视减益免疫: ${dotaconstants.abilities[item.ability.name].bkbpierce == "Yes" ? "" : ""}</p>`
499
+ : ""}
500
+ </div>
501
+ </div>
502
+ ${item.ability.language.description.map((desc) => `<p class="description">${desc}</p>`).join("")}
503
+ ${item.ability.language.aghanimDescription
504
+ ? `<p class="aghanim_description">
505
+ <span class="title"><img src="${utils.getImageUrl("scepter")}" alt="" class="scepter">阿哈利姆神杖</span>
506
+ <span class="desc">${item.ability.language.aghanimDescription}</span>
507
+ </p>` : ""}
508
+ ${item.ability.language.shardDescription
509
+ ? `<p class="aghanim_description">
510
+ <span class="title"><img src="${utils.getImageUrl("shard")}" alt="" class="shard">阿哈利姆魔晶</span>
511
+ <span class="desc">${item.ability.language.shardDescription}</span>
512
+ </p>` : ""}
513
+ <div class="notes"${!item.ability.language.notes.length ? ` style="display:none;"` : ""}>
514
+ ${item.ability.language.notes.map((note) => `<p>${note}</p>`).join("")}
515
+ </div>
516
+ <div class="attributes">
517
+ ${item.ability.language.attributes
518
+ .map((attr) => {
519
+ const parts = attr.split(":");
520
+ return `<p><span class="item">${parts[0]}</span><span class="values">${parts[1]}</span></p>`;
521
+ })
522
+ .join("")}
523
+ </div>
524
+ <p>
525
+ ${dotaconstants.abilities[item.ability.name].cd ?
526
+ `<span class="cooldown"> ${(Array.isArray(dotaconstants.abilities[item.ability.name].cd)
527
+ ? dotaconstants.abilities[item.ability.name].cd
528
+ : [dotaconstants.abilities[item.ability.name].cd]).join(" / ")}
529
+ </span>` : ""}
530
+ ${dotaconstants.abilities[item.ability.name].mc ?
531
+ `<span class="mana_cost"> ${(Array.isArray(dotaconstants.abilities[item.ability.name].mc)
532
+ ? dotaconstants.abilities[item.ability.name].mc
533
+ : [dotaconstants.abilities[item.ability.name].mc]).join(" / ")}
534
+ </span>` : ""}
535
+ </p>
536
+ <p class="lore"${!item.ability.language.lore ? ` style="display:none;"` : ""}>${item.ability.language.lore}</p>
537
+ </div>`).join("")}
538
+ </div>
539
+ <div class="lore">
540
+ ${hero.language.lore}
541
+ </div>` %>
542
+ </body>
543
+ </html>