forked from tkkcc/ArkLights
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathskill.lua
599 lines (572 loc) · 34.5 KB
/
skill.lua
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
----------- how to generate skill.lua
----------- first open https://prts.wiki/w/%E5%90%8E%E5%8B%A4%E6%8A%80%E8%83%BD%E4%B8%80%E8%A7%88, open console
----------- then paste the following code, copy result and paste into skill.lua
-- let dex2hex = (x)=>{
-- return parseInt(x,10).toString(16).padStart(2,'0')
-- }
-- let rgb2hex = (r,g,b)=>{
-- return '#'+ dex2hex(r)+dex2hex(g)+dex2hex(b)
-- }
-- let canvas = document.createElement("canvas")
-- canvas.width=36
-- canvas.height=36
-- let context = canvas.getContext("2d")
-- let app=document.querySelector('#mw-content-text').querySelectorAll('tr')
-- // let ans='skill={'
-- let ans = new Set();
-- for(let tr of app){
-- if(tr.children.length===4 && tr.children){
-- let name=tr.children[1].innerText
-- let description=tr.children[2].innerText
-- let operator=[...tr.children[3].querySelectorAll('a')].map(x=>x.title)
-- let img=tr.children[0].querySelector('img')
-- if (!img) continue
-- ans += window.location.host+ img.dataset.src+'\n'
-- continue
-- context.drawImage(img, 0, 0)
-- let data = context.getImageData(0, 0, canvas.width, canvas.height).data
-- let rgbs =[]
-- let alphas =[]
-- for(let i=0;i<canvas.width*canvas.height;++i){
-- let rgb = rgb2hex(data[i*4],data[i*4+1],data[i*4+2])
-- let alpha= data[i*4+3]
-- rgbs.push(rgb)
-- alphas.push(alpha)
-- }
-- //operator.forEach(x=> ans.add(x.trim()))
-- ans +=`{[[${name.trim()}]],[[${description.trim()}]],{${operator.map(x=>"\""+x.trim()+"\"").join(',')}},{${rgbs.map(x=>"\""+x+"\"").join(',')}},{${alphas.map(x=>x).join(',')}} },\n`
-- // ans.push( [name,description,operator,rgbs,alphas] )
-- // break
-- }
-- }
-- ans=[...ans].join('')
-- // ans+='}'
-- console.log(ans)
fetchSkillIcon = function() downloadFile() end
discover = function()
local corner = findOnes("第一干员卡片")
local card = {}
if #corner == 0 then stop("基建换班2115") end
for _, v in pairs(corner) do
table.insert(card, {v.x, v.y})
table.insert(card, {v.x, scale(801)})
end
log(card)
for _, v in pairs(card) do
-- 技能判断
local icon1 = {
v[1] + scale(7), v[2] + scale(18), v[1] + scale(60), v[2] + scale(70),
}
local icon2 = {
v[1] + scale(70), v[2] + scale(18), v[1] + scale(123), v[2] + scale(70),
}
png = gg(table.unpack(icon1)) or 'empty1.png'
-- png = 'empty1.png'
operator = skillpng2operator[png]
if #operator == 1 then
else
png = gg(table.unpack(icon2)) or 'empty2.png'
operator2 = skillpng2operator[png]
operator = table.intersect(operator, operator2)
end
if #operator < #skillpng2operator['empty2.png'] then log(operator) end
-- exit()
-- 心情判断
local mood = 0
-- log(v[1])
local mood1 = {v[1] + scale(49), v[2] + scale(93)}
-- log(mood1)
for i = 24, 1, -1 do
local moodi = {mood1[1] + scale((i - 1) * 5.3478), mood1[2]}
-- log(moodi, getColor(moodi[1], moodi[2]))
-- if getColor(moodi[1], moodi[2]) == 'FFFFFF' then
if cmpColor(moodi[1], moodi[2], 'FFFFFF', 0.4) == 1 then
mood = i
break
end
end
-- log(v, mood)
-- if mood == 19 then break end
end
end
discover = still_wrapper(discover)
skillpng = {
"Bskill_ctrl_aegir2.png", "Bskill_ctrl_aegir.png", "Bskill_ctrl_ash.png",
"Bskill_ctrl_cost_aegir.png", "Bskill_ctrl_cost_bd1.png",
"Bskill_ctrl_cost_bd2.png", "Bskill_ctrl_cost.png", "Bskill_ctrl_c_wt1.png",
"Bskill_ctrl_c_wt2.png", "Bskill_ctrl_c_wt.png", "Bskill_ctrl_h_spd.png",
"Bskill_ctrl_lda.png", "Bskill_ctrl_lungmen.png", "Bskill_ctrl_p_bot.png",
"Bskill_ctrl_psk.png", "Bskill_ctrl_p_spd.png", "Bskill_ctrl_r6.png",
"Bskill_ctrl_sp.png", "Bskill_ctrl_tachanka.png",
"Bskill_ctrl_token_p_spd.png", "Bskill_ctrl_t_spd.png",
"Bskill_ctrl_ussg.png", "Bskill_dorm_all1.png",
"Bskill_dorm_all%26bd_n1_n2.png", "Bskill_dorm_all%26bd_n1.png",
"Bskill_dorm_all%26one1.png", "Bskill_dorm_all%26one2.png",
"Bskill_dorm_all%26one3.png", "Bskill_dorm_all2.png", "Bskill_dorm_all3.png",
"Bskill_dorm_one1.png", "Bskill_dorm_one2.png", "Bskill_dorm_one3.png",
"Bskill_dorm_one4.png", "Bskill_dorm_one5.png", "Bskill_dorm_one.png",
"Bskill_dorm_single1.png", "Bskill_dorm_single%26one01.png",
"Bskill_dorm_single%26one02.png", "Bskill_dorm_single%26one11.png",
"Bskill_dorm_single%26one12.png", "Bskill_dorm_single%26one21.png",
"Bskill_dorm_single%26one22.png", "Bskill_dorm_single2.png",
"Bskill_dorm_single3.png", "Bskill_dorm_single4.png",
"Bskill_dorm_single_indigo.png", "Bskill_dorm_single_schwarz.png",
"Bskill_dorm_single_tomimi.png", "Bskill_hire_blitz.png",
"Bskill_hire_skgoat.png", "Bskill_hire_spd1.png",
"Bskill_hire_spd%26blacksteel2.png", "Bskill_hire_spd%26clue.png",
"Bskill_hire_spd%26cost1.png", "Bskill_hire_spd%26cost2.png",
"Bskill_hire_spd%26ursus2.png", "Bskill_hire_spd2.png",
"Bskill_hire_spd4.png", "Bskill_hire_spd5.png",
"Bskill_hire_spd_bd_n1_n1.png", "Bskill_hire_spd_bd_n2.png",
"Bskill_hire_spd_memento.png", "Bskill_man_cost_all.png",
"Bskill_man_exp1.png", "Bskill_man_exp%26cost.png",
"Bskill_man_exp%26limit1.png", "Bskill_man_exp%26limit2.png",
"Bskill_man_exp2.png", "Bskill_man_exp3.png", "Bskill_man_gold1.png",
"Bskill_man_gold2.png", "Bskill_man_limit%26cost1.png",
"Bskill_man_limit%26cost2.png", "Bskill_man_limit%26cost3.png",
"Bskill_man_originium1.png", "Bskill_man_originium2.png",
"Bskill_man_skill_spd.png", "Bskill_man_spd1.png",
"Bskill_man_spd%26limit1.png", "Bskill_man_spd%26limit%26cost1.png",
"Bskill_man_spd%26limit%26cost2.png", "Bskill_man_spd%26limit%26cost3.png",
"Bskill_man_spd%26limit%26cost4.png", "Bskill_man_spd%26limit3.png",
"Bskill_man_spd%26power1.png", "Bskill_man_spd%26power2.png",
"Bskill_man_spd%26power3.png", "Bskill_man_spd%26trade.png",
"Bskill_man_spd2.png", "Bskill_man_spd3.png", "Bskill_man_spd_add1.png",
"Bskill_man_spd_add2.png", "Bskill_man_spd_bd1.png", "Bskill_man_spd_bd2.png",
"Bskill_man_spd_bd_n1.png", "Bskill_man_spd_variable11.png",
"Bskill_man_spd_variable21.png", "Bskill_man_spd_variable31.png",
"Bskill_meet_blacksteel2.png", "Bskill_meet_flag_rhine.png",
"Bskill_meet_flag_rhodes.png", "Bskill_meet_flag_ursus.png",
"Bskill_meet_glasgow2.png", "Bskill_meet_kjerag2.png",
"Bskill_meet_penguin1.png", "Bskill_meet_penguin2.png",
"Bskill_meet_rhine2.png", "Bskill_meet_rhodes1.png",
"Bskill_meet_rhodes2.png", "Bskill_meet_spd1.png", "Bskill_meet_spd2.png",
"Bskill_meet_spd3.png", "Bskill_meet_ursus1.png", "Bskill_meet_ursus2.png",
"Bskill_pow_jnight.png", "Bskill_pow_spd1.png", "Bskill_pow_spd%26cost.png",
"Bskill_pow_spd2.png", "Bskill_pow_spd3.png", "Bskill_tra_bd_n2.png",
"Bskill_tra_flow_gc1.png", "Bskill_tra_flow_gc2.png",
"Bskill_tra_flow_gs1.png", "Bskill_tra_flow_gs2.png",
"Bskill_train1_caster1.png", "Bskill_train1_guard1.png",
"Bskill_train1_sniper2.png", "Bskill_train1_specialist1.png",
"Bskill_train2_caster1.png", "Bskill_train2_defender1.png",
"Bskill_train2_guard1.png", "Bskill_train3_guard1.png",
"Bskill_train3_sniper2.png", "Bskill_train3_supporter2.png",
"Bskill_train_all.png", "Bskill_train_caster1.png",
"Bskill_train_caster2.png", "Bskill_train_caster3.png",
"Bskill_train_chen.png", "Bskill_train_defender1.png",
"Bskill_train_defender2.png", "Bskill_train_defender3.png",
"Bskill_train_guard1.png", "Bskill_train_guard2.png",
"Bskill_train_guard3.png", "Bskill_train_knight_bd1.png",
"Bskill_train_knight_bd2.png", "Bskill_train_medic1.png",
"Bskill_train_medic2.png", "Bskill_train_medic3.png",
"Bskill_train_skadi.png", "Bskill_train_sniper1.png",
"Bskill_train_sniper2.png", "Bskill_train_sniper3.png",
"Bskill_train_specialist1.png", "Bskill_train_specialist2.png",
"Bskill_train_specialist3.png", "Bskill_train_supporter1.png",
"Bskill_train_supporter2.png", "Bskill_train_supporter3.png",
"Bskill_train_vanguard1.png", "Bskill_train_vanguard2.png",
"Bskill_train_vanguard3.png", "Bskill_train_w.png",
"Bskill_tra_Lappland1.png", "Bskill_tra_Lappland2.png",
"Bskill_tra_limit%26cost.png", "Bskill_tra_limit_count.png",
"Bskill_tra_limit_diff.png", "Bskill_tra_long1.png", "Bskill_tra_long2.png",
"Bskill_tra_spd1.png", "Bskill_tra_spd%26cost.png",
"Bskill_tra_spd%26dorm1.png", "Bskill_tra_spd%26dorm2.png",
"Bskill_tra_spd%26limit1.png", "Bskill_tra_spd%26limit2.png",
"Bskill_tra_spd%26limit3.png", "Bskill_tra_spd%26limit4.png",
"Bskill_tra_spd%26limit5.png", "Bskill_tra_spd%26limit6.png",
"Bskill_tra_spd%26limit7.png", "Bskill_tra_spd2.png", "Bskill_tra_spd3.png",
"Bskill_tra_spd_variable21.png", "Bskill_tra_spd_variable22.png",
"Bskill_tra_texas1.png", "Bskill_tra_texas2.png", "Bskill_tra_vodfox.png",
"Bskill_tra_wt%26cost1.png", "Bskill_tra_wt%26cost2.png",
"Bskill_ws_asc1.png", "Bskill_ws_asc2.png", "Bskill_ws_asc_cost1.png",
"Bskill_ws_build1.png", "Bskill_ws_build2.png", "Bskill_ws_build3.png",
"Bskill_ws_build_cost2.png", "Bskill_ws_build_cost.png",
"Bskill_ws_constant.png", "Bskill_ws_cost_blemishine.png",
"Bskill_ws_cost_magallan.png", "Bskill_ws_device.png",
"Bskill_ws_drop_oriron.png", "Bskill_ws_evolve1.png", "Bskill_ws_evolve2.png",
"Bskill_ws_evolve3.png", "Bskill_ws_evolve4.png",
"Bskill_ws_evolve_cost1.png", "Bskill_ws_evolve_cost2.png",
"Bskill_ws_evolve_cost.png", "Bskill_ws_evolve_dorm1.png",
"Bskill_ws_evolve_dorm2.png", "Bskill_ws_free.png", "Bskill_ws_frost.png",
"Bskill_ws_nian.png", "Bskill_ws_orirock.png", "Bskill_ws_oriron.png",
"Bskill_ws_p1.png", "Bskill_ws_p2.png", "Bskill_ws_p3.png",
"Bskill_ws_p4.png", "Bskill_ws_p5.png", "Bskill_ws_polyester.png",
"Bskill_ws_recovery.png", "Bskill_ws_skill1.png", "Bskill_ws_skill2.png",
"Bskill_ws_skill3.png", "Bskill_ws_skill_cost1.png", -- "skillpng.txt",
"empty2.png",
}
skillpng2operator = JsonDecode(
'{"Bskill_ctrl_p_spd.png":["凯尔希2"],"Bskill_ctrl_token_p_spd.png":["布丁1"],"Bskill_ctrl_p_bot.png":["森蚺2"],"Bskill_ctrl_t_spd.png":["阿米娅0","诗怀雅0"],"Bskill_ctrl_h_spd.png":["琴柳2"],"Bskill_ctrl_cost_aegir.png":["歌蕾蒂娅0"],"Bskill_ctrl_aegir.png":["歌蕾蒂娅0"],"Bskill_ctrl_aegir2.png":["歌蕾蒂娅2"],"Bskill_ctrl_psk.png":["焰尾2"],"Bskill_ctrl_lda.png":["吽2"],"Bskill_ctrl_lungmen.png":["陈0"],"Bskill_ctrl_ussg.png":["早露0"],"Bskill_ctrl_sp.png":["炎狱炎熔0"],"Bskill_ctrl_cost.png":["焰尾0","灰喉0","苇草2","暴雨0","送葬人2","临光0","杜宾0","清道夫0","红0","坚雷1"],"Bskill_ctrl_cost_bd1.png":["夕0"],"Bskill_ctrl_cost_bd2.png":["夕0"],"Bskill_ctrl_ash.png":["灰烬2"],"Bskill_ctrl_r6.png":["战车0","灰烬0","闪击0","霜华0"],"Bskill_ctrl_tachanka.png":["战车2"],"Bskill_ctrl_c_wt.png":["阿0"],"Bskill_ctrl_c_wt2.png":["惊蛰2"],"Bskill_ctrl_c_wt1.png":["惊蛰0"],"Bskill_pow_spd3.png":["雷蛇2","炎狱炎熔2","格雷伊0"],"Bskill_pow_spd2.png":["伊芙利特2","异客2","格劳克斯2","深靛1","雷蛇0","布丁0","阿消1","清流0"],"Bskill_pow_spd1.png":["异客0","格劳克斯0","深靛0","伊芙利特0","炎熔0","煌0","Castle-30","Lancet-20","THRM-EX0","正义骑士号0"],"Bskill_pow_spd%26cost.png":["THRM-EX0"],"Bskill_pow_jnight.png":["正义骑士号0"],"Bskill_man_exp3.png":["断罪者1","食铁兽2"],"Bskill_man_exp2.png":["Castle-30","白雪1","红豆0","霜叶1","食铁兽0"],"Bskill_man_exp1.png":["帕拉斯2"],"Bskill_man_gold2.png":["砾1"],"Bskill_man_gold1.png":["夜烟0","斑点1"],"Bskill_man_spd%26trade.png":["清流1"],"Bskill_man_spd_bd_n1.png":["迷迭香0"],"Bskill_man_spd_bd1.png":["迷迭香0"],"Bskill_man_spd_bd2.png":["迷迭香2"],"Bskill_man_spd_variable21.png":["槐琥2"],"Bskill_man_spd3.png":["梅尔2"],"Bskill_man_spd2.png":["灰毫2","远牙2","野鬃2","白面鸮2","赫默2","调香师1","史都华德1","杰西卡0","水月2","罗比菈塔1","香草0"],"Bskill_man_limit%26cost3.png":["石棉2"],"Bskill_man_spd%26limit%26cost3.png":["石棉0","泡普卡0"],"Bskill_man_spd_add1.png":["芬0","刻俄柏2"],"Bskill_man_spd_add2.png":["稀音0","克洛丝0"],"Bskill_man_spd1.png":["灰毫0","远牙0","野鬃0","白面鸮0","赫默0","豆苗0","夜刀0","流星0"],"Bskill_man_spd%26power3.png":["温蒂2"],"Bskill_man_spd%26power2.png":["森蚺2","温蒂0"],"Bskill_man_spd%26power1.png":["异客2","森蚺0"],"Bskill_man_skill_spd.png":["水月0"],"Bskill_man_spd%26limit3.png":["蛇屠箱0","黑角0"],"Bskill_man_spd%26limit1.png":["卡缇0","米格鲁0"],"Bskill_man_spd%26limit%26cost2.png":["火神2"],"Bskill_man_spd%26limit%26cost1.png":["火神0"],"Bskill_man_spd%26limit%26cost4.png":["贝娜0"],"Bskill_man_exp%26limit2.png":["卡达1"],"Bskill_man_exp%26limit1.png":["稀音2"],"Bskill_man_limit%26cost2.png":["泡泡0"],"Bskill_man_spd_variable31.png":["泡泡1"],"Bskill_man_limit%26cost1.png":["帕拉斯0","刻俄柏0","豆苗1","清道夫1","红云0"],"Bskill_man_spd_variable11.png":["红云1"],"Bskill_man_exp%26cost.png":["卡达0"],"Bskill_man_originium2.png":["艾雅法拉0","锡兰2","地灵1","炎熔1"],"Bskill_man_originium1.png":["薄绿1","月见夜1"],"Bskill_man_cost_all.png":["槐琥0"],"Bskill_tra_Lappland1.png":["拉普兰德0"],"Bskill_tra_Lappland2.png":["拉普兰德2"],"Bskill_tra_texas1.png":["德克萨斯0"],"Bskill_tra_texas2.png":["德克萨斯2"],"Bskill_tra_vodfox.png":["巫恋2"],"Bskill_tra_spd3.png":["能天使2"],"Bskill_tra_spd_variable22.png":["雪雉2"],"Bskill_tra_spd%26cost.png":["古米0","月见夜0","空爆0"],"Bskill_tra_spd%26limit7.png":["可颂2","拜松2"],"Bskill_tra_spd2.png":["空2","夜刀0","夜烟1","安比尔1","慕斯0","缠丸1","芬1"],"Bskill_tra_spd%26limit6.png":["梓兰1","玫兰莎0","远山0"],"Bskill_tra_spd_variable21.png":["雪雉0"],"Bskill_tra_spd%26limit5.png":["银灰2"],"Bskill_tra_spd1.png":["可颂0","能天使0","拜松0","安德切尔0","深海色0","蛇屠箱1","香草1"],"Bskill_tra_spd%26limit4.png":["崖心2"],"Bskill_tra_spd%26limit3.png":["角峰0","讯使0","银灰0"],"Bskill_tra_spd%26limit2.png":["四月2"],"Bskill_tra_spd%26limit1.png":["四月0","翎羽1","黑角0"],"Bskill_tra_flow_gs2.png":["图耶2"],"Bskill_tra_flow_gs1.png":["图耶0"],"Bskill_tra_flow_gc2.png":["绮良2"],"Bskill_tra_flow_gc1.png":["绮良0"],"Bskill_tra_limit_diff.png":["孑0"],"Bskill_tra_limit_count.png":["孑1"],"Bskill_tra_spd%26dorm2.png":["空弦2"],"Bskill_tra_spd%26dorm1.png":["空弦0"],"Bskill_tra_wt%26cost2.png":["柏喙2","卡夫卡2"],"Bskill_tra_wt%26cost1.png":["巫恋0","柏喙0","贝娜2","卡夫卡0"],"Bskill_tra_bd_n2.png":["乌有2"],"Bskill_tra_long2.png":["龙舌兰2"],"Bskill_tra_long1.png":["龙舌兰0"],"Bskill_tra_limit%26cost.png":["史都华德0","暗索1","桃金娘0"],"Bskill_dorm_all%26one2.png":["杜林0"],"Bskill_dorm_all%26one1.png":["安比尔0","杜林0"],"Bskill_dorm_all3.png":["推进之王2","夜莺2","凛冬2"],"Bskill_dorm_all2.png":["阿米娅2","空0","波登可1","凛冬0","推进之王0","桃金娘1"],"Bskill_dorm_all%26one3.png":["远牙0","风笛0","赫拉格2"],"Bskill_dorm_all1.png":["赫拉格1","四月0","夜莺0"],"Bskill_dorm_all%26bd_n1_n2.png":["爱丽丝0"],"Bskill_dorm_all%26bd_n1.png":["爱丽丝2"],"Bskill_dorm_single4.png":["闪灵2"],"Bskill_dorm_single3.png":["琴柳0","蜜莓2","断罪者0"],"Bskill_dorm_single2.png":["波登可1","Lancet-20"],"Bskill_dorm_single_schwarz.png":["黑0"],"Bskill_dorm_single_tomimi.png":["特米米0"],"Bskill_dorm_single_indigo.png":["深靛0"],"Bskill_dorm_single1.png":["安赛尔0","末药1","波登可0","流星1","芙蓉0","闪灵0"],"Bskill_dorm_single%26one22.png":["临光2","初雪0"],"Bskill_dorm_single%26one21.png":["泡普卡1"],"Bskill_dorm_single%26one12.png":["酸糖1","古米1","暴行2"],"Bskill_dorm_single%26one11.png":["慕斯1"],"Bskill_dorm_single%26one02.png":["崖心0"],"Bskill_dorm_single%26one01.png":["卡缇1","杰克0","米格鲁1"],"Bskill_dorm_one5.png":["斯卡蒂2"],"Bskill_dorm_one4.png":["幽灵鲨2","安哲拉2"],"Bskill_dorm_one3.png":["伊桑1"],"Bskill_dorm_one.png":["芳汀1"],"Bskill_dorm_one2.png":["克洛丝1","安哲拉0","幽灵鲨0","斯卡蒂0","灰喉2","艾丝黛尔1","苇草0","霜叶0"],"Bskill_dorm_one1.png":["赫拉格0"],"Bskill_ws_nian.png":["年0"],"Bskill_ws_evolve4.png":["年0"],"Bskill_ws_evolve_dorm2.png":["芳汀1"],"Bskill_ws_evolve_dorm1.png":["芳汀0"],"Bskill_ws_constant.png":["泥岩0"],"Bskill_ws_orirock.png":["泥岩2"],"Bskill_ws_polyester.png":["奥斯塔2"],"Bskill_ws_oriron.png":["熔泉2"],"Bskill_ws_device.png":["贾维2"],"Bskill_ws_evolve3.png":["锡兰0","蜜莓2","蚀清2","空爆1","陨星2","蓝毒2","苏苏洛1"],"Bskill_ws_drop_oriron.png":["蚀清2"],"Bskill_ws_evolve2.png":["慑砂2","蜜莓0","蚀清0","陨星0","亚叶0","蓝毒0","调香师0","嘉维尔0","安赛尔1","末药0"],"Bskill_ws_evolve_cost.png":["亚叶2"],"Bskill_ws_evolve1.png":["芙蓉1"],"Bskill_ws_cost_blemishine.png":["瑕光2"],"Bskill_ws_free.png":["瑕光0"],"Bskill_ws_build3.png":["煌1"],"Bskill_ws_build_cost2.png":["莱恩哈特2"],"Bskill_ws_build2.png":["莱恩哈特0"],"Bskill_ws_build_cost.png":["松果1"],"Bskill_ws_build1.png":["松果0","罗比菈塔0","阿消0"],"Bskill_ws_skill3.png":["赫拉格0","炎客2"],"Bskill_ws_skill_cost1.png":["羽毛笔0"],"Bskill_ws_skill2.png":["羽毛笔2"],"Bskill_ws_skill1.png":["暴行0","炎客0","缠丸0"],"Bskill_ws_asc2.png":["风笛2"],"Bskill_ws_asc_cost1.png":["刻刀1"],"Bskill_ws_asc1.png":["12F0","刻刀0","猎蜂1"],"Bskill_ws_p5.png":["凯尔希0"],"Bskill_ws_p4.png":["梅尔0"],"Bskill_ws_p3.png":["深海色1","艾丝黛尔0","巡林者0"],"Bskill_ws_p2.png":["棘刺0","麦哲伦0","吽0","安德切尔1","斑点0","格雷伊1"],"Bskill_ws_recovery.png":["棘刺2"],"Bskill_ws_cost_magallan.png":["麦哲伦2"],"Bskill_ws_frost.png":["霜华2"],"Bskill_ws_p1.png":["玫兰莎1","砾0"],"Bskill_ws_evolve_cost2.png":["慑砂0"],"Bskill_ws_evolve_cost1.png":["熔泉0","奥斯塔0","贾维0"],"Bskill_hire_skgoat.png":["地灵1"],"Bskill_hire_spd5.png":["普罗旺斯2","艾雅法拉2"],"Bskill_hire_spd4.png":["伊桑0","酸糖0","夜魔2","宴0","梓兰0"],"Bskill_hire_spd%26clue.png":["月禾2","乌有0"],"Bskill_hire_spd2.png":["地灵0","普罗旺斯0","月禾0"],"Bskill_hire_spd%26ursus2.png":["早露2"],"Bskill_hire_spd%26blacksteel2.png":["山0"],"Bskill_hire_spd_bd_n1_n1.png":["絮雨0"],"Bskill_hire_spd_memento.png":["絮雨2"],"Bskill_hire_spd%26cost2.png":["桑葚1"],"Bskill_hire_spd_bd_n2.png":["桑葚2"],"Bskill_hire_blitz.png":["闪击2"],"Bskill_hire_spd1.png":["巡林者0"],"Bskill_hire_spd%26cost1.png":["桑葚0"],"Bskill_train_vanguard3.png":["嵯峨2"],"Bskill_train_vanguard2.png":["格拉尼2","红豆1"],"Bskill_train_vanguard1.png":["嵯峨0","格拉尼0","翎羽0"],"Bskill_train3_guard1.png":["铸铁2"],"Bskill_train2_guard1.png":["燧石2"],"Bskill_train1_guard1.png":["赤冬2"],"Bskill_train_guard3.png":["史尔特尔2"],"Bskill_train_guard2.png":["布洛卡2","芙兰卡2"],"Bskill_train_guard1.png":["史尔特尔0","布洛卡0","燧石0","猎蜂0","芙兰卡0","赤冬0","铸铁0","鞭刃0"],"Bskill_train2_defender1.png":["暴雨2"],"Bskill_train_defender3.png":["星熊2"],"Bskill_train_defender2.png":["角峰1"],"Bskill_train_defender1.png":["坚雷0","星熊0","暴雨0"],"Bskill_train3_sniper2.png":["W2"],"Bskill_train_w.png":["W2"],"Bskill_train1_sniper2.png":["假日威龙陈2"],"Bskill_train_sniper3.png":["黑2"],"Bskill_train_sniper2.png":["白金2"],"Bskill_train_sniper1.png":["W0","假日威龙陈0","白金0","送葬人0"],"Bskill_train2_caster1.png":["薄绿2"],"Bskill_train_caster3.png":["卡涅利安2"],"Bskill_train1_caster1.png":["特米米2"],"Bskill_train_caster2.png":["天火2","蜜蜡2"],"Bskill_train_caster1.png":["卡涅利安0","夜魔0","天火0","薄绿0","蜜蜡0"],"Bskill_train3_supporter2.png":["浊心斯卡蒂2"],"Bskill_train_chen.png":["假日威龙陈2"],"Bskill_train_skadi.png":["浊心斯卡蒂2"],"Bskill_train_supporter3.png":["铃兰2"],"Bskill_train_supporter2.png":["初雪2"],"Bskill_train_supporter1.png":["浊心斯卡蒂0","真理0","铃兰0"],"Bskill_train_medic3.png":["阿2"],"Bskill_train_medic2.png":["华法琳2"],"Bskill_train_medic1.png":["华法琳0","嘉维尔1","苏苏洛0"],"Bskill_train1_specialist1.png":["罗宾2"],"Bskill_train_specialist3.png":["傀影2"],"Bskill_train_specialist2.png":["狮蝎2"],"Bskill_train_specialist1.png":["傀影0","狮蝎0","罗宾0"],"Bskill_train_all.png":["杜宾1","诗怀雅2","鞭刃2"],"Bskill_train_knight_bd1.png":["耀骑士临光0"],"Bskill_train_knight_bd2.png":["耀骑士临光2"],"Bskill_meet_rhodes2.png":["安洁莉娜2"],"Bskill_meet_rhodes1.png":["极境0"],"Bskill_meet_flag_rhodes.png":["极境2"],"Bskill_meet_kjerag2.png":["讯使1"],"Bskill_meet_glasgow2.png":["因陀罗2","微风2"],"Bskill_meet_ursus2.png":["真理2"],"Bskill_meet_ursus1.png":["苦艾0"],"Bskill_meet_flag_ursus.png":["苦艾2"],"Bskill_meet_blacksteel2.png":["芙兰卡2","杰西卡1"],"Bskill_meet_penguin2.png":["莫斯提马2"],"Bskill_meet_penguin1.png":["梅1"],"Bskill_meet_rhine2.png":["塞雷娅2"],"Bskill_meet_flag_rhine.png":["山2"],"Bskill_meet_spd3.png":["陈2","红2","星极2","远山1"],"Bskill_meet_spd2.png":["12F0","守林人2","宴1","断崖2","暗索0","杰克1","梅0","白雪0"],"Bskill_meet_spd1.png":["因陀罗0","塞雷娅0","守林人0","安洁莉娜0","微风0","断崖0","星极0","芙兰卡0","莫斯提马0"]}')
-- 扩充干员等级
for k, v in pairs(skillpng2operator) do
local extra = {}
for _, o in pairs(v) do if o:endsWith('1') then table.insert(extra, 1) end end
table.extend(v, extra)
end
-- 只有1个技能干员
skillpng2operator['empty2.png'] = table.appear_times(table.flatten(
skillpng2operator), 1)
-- 所有干员
skillpng2operator['empty1.png'] = table.remove_duplicate(table.flatten(
skillpng2operator))
-- 贸易站干员选择
-- operator: 列表,每个元素包含两个技能图标
-- dormitoryCapacity: 宿舍可容纳人数
-- dormitoryLevelSum: 宿舍等级之和
-- goldStationNum: 赤金生产线数
-- 返回效率最高的index
tradingStationOperatorBest = function(operator, dormitoryCapacity,
dormitoryLevelSum, goldStationNum)
-- 参考 https://prts.wiki/w/罗德岛基建
local maxStorage, maxOperator
maxOperator = level
if level == 1 then
maxStorage = 6
elseif level == 2 then
maxStorage = 8
else
maxStorage = 10
end
-- 输入index组合,计算平均加成,与groundtruth差距:
-- 1. 只考虑8小时平均收益,非实际换班间隔
-- 2. 12心情以下干员不考虑,也忽略心情消耗
-- 3. 忽略 ?? 效果
local base, storage, all, gold
local score = function(icons)
base = 0
storage = 0 -- 容量
extra = 0 -- 额外加成
gold = goldStationNum
all = {}
-- 应用独立技能效果
for _, icon in pairs(table.flatten(icons)) do
all[icon] = 1
-- log(266, icon, goodType, base)
if icon == 'Bskill_tra_spd3.png' then
base = base + 0.35
elseif icon == 'Bskill_tra_spd%26cost.png' then
base = base + 0.3
elseif icon == 'Bskill_tra_spd%26limit7.png' then
base = base + 0.3
storage = storage + 1
elseif icon == 'Bskill_tra_spd%26limit6.png' then
base = base + 0.25
storage = storage + 4
elseif icon == 'Bskill_tra_spd%26limit4.png' then
base = base + 0.15
storage = storage + 4
elseif icon == 'Bskill_tra_spd%26limit3.png' then
base = base + 0.15
storage = storage + 2
elseif icon == 'Bskill_tra_spd%26limit2.png' then
base = base + 0.1
storage = storage + 4
elseif icon == 'Bskill_tra_spd%26limit1.png' then
base = base + 0.1
storage = storage + 2
elseif icon == 'Bskill_tra_spd2.png' then
base = base + 0.3
elseif icon == 'Bskill_tra_spd1.png' then
base = base + 0.2
elseif icon == 'Bskill_tra_flow_gc2.png' then
base = base + 0.05
gold = gold + (gold // 2) * 2
elseif icon == 'Bskill_tra_flow_gc1.png' then
base = base + 0.05
gold = gold + (gold // 4) * 2
elseif icon == 'Bskill_tra_spd%26dorm2.png' then
base = base + 0.02 * dormitoryLevelSum
elseif icon == 'Bskill_tra_spd%26dorm1.png' then
base = base + 0.01 * dormitoryLevelSum
elseif icon == 'Bskill_tra_bd_n2.png' then
-- 忽略其他站人间烟火
base = base + 0.01 * dormitoryCapacity
elseif icon == 'Bskill_tra_limit%26cost.png"' then
storage = storage + 5
elseif icon == 'Bskill_tra_wt%26cost2.png' then
-- 认为裁缝B单独用效果极小
base = base + 0.02
elseif icon == 'Bskill_tra_wt%26cost1.png' then
-- 认为裁缝B单独用效果极小
base = base + 0.01
elseif all['Bskill_tra_long2.png'] then
-- 认为投资B单独用效果极小
base = base + 0.02
elseif all['Bskill_tra_long1.png'] then
-- 认为投资A单独用效果极小
base = base + 0.01
end
end
-- 应用全局性技能
-- 拉狗徳狗
local texas = all['Bskill_tra_texas1.png'] or all['Bskill_tra_texas2.png']
if all['Bskill_tra_Lappland1.png'] then
if texas then
storage = storage + 2
base = base + 0.65
end
elseif all['Bskill_tra_Lappland2.png'] then
if texas then
storage = storage + 4
base = base + 0.65
end
end
-- 巫恋
if all['Bskill_tra_vodfox.png'] then
if maxOperator == 1 then
base = 0
elseif maxOperator == 2 then
base = 0.45 + 0.01
else
-- 参考 https://bbs.nga.cn/read.php?tid=25965441&rand=365
if all['Bskill_tra_wt%26cost2.png'] and all['Bskill_tra_long2.png'] then
base = 1.7192
elseif all['Bskill_tra_long2.png'] then
base = 1.4734
elseif all['Bskill_tra_wt%26cost2.png'] and all['Bskill_tra_long1.png'] then
base = 1.3205
elseif all['Bskill_tra_long1.png'] then
base = 1.1927
elseif all['Bskill_tra_wt%26cost2.png'] then
base = 0.9218
else
-- 尽量用白板
base = 0.9120 - base * 0.001
end
end
end
-- 雪雉
if all['Bskill_tra_spd_variable22.png'] then
base = base + min(0.35, base // 0.05 * 0.05)
end
-- 图耶
if all['Bskill_tra_flow_gs2.png'] then
base = base + 0.05 + (gold // 2) * 0.15
end
if all['Bskill_tra_flow_gs1.png'] then
base = base + 0.05 + (gold // 4) * 0.15
end
-- 孑
if all['Bskill_tra_limit_count.png'] then
-- 孑精1
base = base + max(1, (maxStorage + storage - base // 0.1)) * 0.04
elseif all['Bskill_tra_limit_diff.png'] then
-- 孑精0 近似 14及以上仓库时为0.36
base = base + 0.36 * min(1, (maxStorage + storage) / 14)
end
return base
end
-- 过滤心情小于阈值的干员
local minAllowedMood = 12
operator = table.filter(operator,
function(x) return x[3] >= minAllowedMood end)
-- 移除心情
operator = map(function(x) return {x[1], x[2]} end, operator)
-- 遍历全部组合
local best
local best_score = -1
for _, c in pairs(table.combination(range(1, #operator), maxOperator)) do
local s = score(table.index(operator, c))
log(401, table.index(operator, c), s)
if s > best_score then
best = c
best_score = s
end
end
return best, best_score
end
testManufacturingStationOperatorBest = function()
local operator = {
{'Bskill_man_exp3.png', 'Bskill_man_exp1.png', 12},
{'Bskill_man_exp2.png', '', 12}, {'', 'Bskill_man_spd_variable31.png', 12},
{'Bskill_man_spd2.png', '', 12},
{'', 'Bskill_man_spd%26limit%26cost2.png', 12},
{'', 'Bskill_man_spd%26limit%26cost4.png', 12},
}
local tradingStationNum = 3
local powerStationNum = 3
local goodType = "作战记录"
local level = 3
local best, best_score
best, best_score = manufacturingStationOperatorBest(operator,
tradingStationNum,
powerStationNum, goodType,
level)
log(best, best_score)
end
-- 贸易站干员选择
-- operator: 列表,每个元素包含两个技能图标与心情
-- tradingStationNum: 贸易站数量
-- powerStationNum: 发电站数量
-- type: 制造物类别
-- level: 制造站等级
-- 返回效率最高的index
manufacturingStationOperatorBest = function(operator, tradingStationNum,
powerStationNum, goodType, level)
-- 参考 https://prts.wiki/w/罗德岛基建/制造站
local maxStorage, maxOperator
maxOperator = level
if level == 1 then
maxStorage = 24
elseif level == 2 then
maxStorage = 36
else
maxStorage = 54
end
log("maxStorage", maxStorage)
log("maxOperator", maxOperator)
-- 输入index组合,计算平均加成,与groundtruth差距:
-- 1. 只考虑8小时平均收益,非实际换班间隔
-- 2. 12心情以下干员不考虑,也忽略心情消耗
-- 3. 忽略 迷迭香所有技能 效果
-- 4. 忽略 意识协议 效果(标准化技能识别不支持)
-- 5. 忽略 我寻思能行 效果(发电站技能加成)
local base, disable_moon_effect, storage, storages, standard, all, station,
station_only
local score = function(icons)
base = 0
storage = {} -- 容量效果
standard = 0 -- 标准化技能数量
station = 0 -- 根据设施加成
station_only = false -- 是否只根据设施加成
all = {}
log(icons)
log(table.flatten(icons))
-- 应用独立技能效果
for _, icon in pairs(table.flatten(icons)) do
all[icon] = 1
-- log(266, icon, goodType, base)
if icon == 'Bskill_man_exp3.png' then
if goodType == '作战记录' then base = base + 0.35 end
-- log(272, base)
elseif icon == 'Bskill_man_exp2.png' then
if goodType == '作战记录' then base = base + 0.30 end
elseif icon == 'Bskill_man_exp1.png' then
if goodType == '作战记录' then base = base + 0.25 end
elseif icon == 'Bskill_man_gold2.png' then
if goodType == '贵金属' then base = base + 0.35 end
elseif icon == 'Bskill_man_gold1.png' then
if goodType == '贵金属' then base = base + 0.30 end
elseif icon == 'Bskill_man_spd%26trade.png' then
-- 清流,使用贸易站数量
if goodType == '贵金属' then
-- base = base + 0.20 * tradingStationNum
station = station + 0.20 * tradingStationNum
end
elseif icon == 'Bskill_man_spd_bd_n1.png' then
-- 迷迭香不考虑
elseif icon == 'Bskill_man_spd_bd1.png' then
-- 迷迭香不考虑
elseif icon == 'Bskill_man_spd_bd2.png' then
-- 迷迭香不考虑
elseif icon == 'Bskill_man_spd3.png' then
base = base + 0.30
elseif icon == 'Bskill_man_spd2.png' then
base = base + 0.25
elseif icon == 'Bskill_man_limit%26cost3.png' then
table.insert(storage, 16)
elseif icon == 'Bskill_man_spd%26limit%26cost3.png' then
base = base + 0.25
table.insert(storage, -12)
elseif icon == 'Bskill_man_spd_add1.png' then
-- 8小时平均收益 ((0.2+0.24)/2*5+0.25*3)/8
base = base + 0.23125
elseif icon == 'Bskill_man_spd_add2.png' then
-- 8小时平均收益 ((0.15+0.23)/2*5+0.25*3)/8
base = base + 0.2125
elseif icon == 'Bskill_man_spd1.png' then
base = base + 0.15
elseif icon == 'Bskill_man_spd%26limit3.png' then
base = base + 0.1
table.insert(storage, 10)
elseif icon == 'Bskill_man_spd%26limit1.png' then
base = base + 0.1
table.insert(storage, 6)
elseif icon == 'Bskill_man_spd%26limit%26cost2.png' then
base = base - 0.05
table.insert(storage, 19)
elseif icon == 'Bskill_man_spd%26limit%26cost1.png' then
base = base - 0.05
table.insert(storage, 16)
elseif icon == 'Bskill_man_spd%26limit%26cost4.png' then
base = base - 0.05
table.insert(storage, 17)
elseif icon == 'Bskill_man_exp%26limit2.png' then
if goodType == '作战记录' then table.insert(storage, 15) end
elseif icon == 'Bskill_man_exp%26limit1.png' then
if goodType == '作战记录' then table.insert(storage, 12) end
elseif icon == 'Bskill_man_limit%26cost2.png' then
table.insert(storage, 10)
elseif icon == 'Bskill_man_limit%26cost1.png' then
table.insert(storage, 8)
elseif icon == 'Bskill_man_exp%26cost.png' then
-- Vlog 心情消耗不考虑
elseif icon == 'Bskill_man_originium2.png' then
if goodType == '源石' then base = base + 0.35 end
elseif icon == 'Bskill_man_originium1.png' then
if goodType == '源石' then base = base + 0.3 end
elseif icon == 'empty.png' then
log('empty')
end
end
-- 应用全局性技能
if all['Bskill_man_spd_variable31.png'] then
-- 泡泡
for _, s in pairs(storage) do
if s > 0 and s <= 16 then
base = base + s * 0.01
elseif s > 16 then
base = base + s * 0.03
end
end
elseif all['Bskill_man_spd_variable11.png'] then
-- 红云
base = base + max(table.sum(storage), 0) * 0.02
end
if all['Bskill_man_spd_variable21.png'] then
-- 槐虎
base = base + min(0.4, base // 0.05 * 0.05)
end
if all['Bskill_man_spd%26power3.png'] then
station_only = true
staition = station + 0.15 * powerStationNum
end
-- 需要优先,发电站数
if all['Bskill_man_spd%26power2.png'] then
station_only = true
staition = station + 0.1 * powerStationNum
end
if all['Bskill_man_spd%26power1.png'] then
station_only = true
staition = station + 0.05 * powerStationNum
end
if all['Bskill_man_skill_spd.png'] then
-- 水月,标准化技能数量
base = base + standard * 0.05
end
if station_only then
base = station
else
base = base + station
end
return base
end
-- 过滤心情小于阈值的干员
local minAllowedMood = 12
operator = table.filter(operator,
function(x) return x[3] >= minAllowedMood end)
-- 移除心情
operator = map(function(x) return {x[1], x[2]} end, operator)
-- 遍历全部组合
local best
local best_score = -1
for _, c in pairs(table.combination(range(1, #operator), maxOperator)) do
local s = score(table.index(operator, c))
log(401, table.index(operator, c), s)
if s > best_score then
best = c
best_score = s
end
end
return best, best_score
end