|
javascript:colors=['blue','yellow','green','pink','black'];function parse(a){var b={'type':null,'player':'','cards':[]},d='';for(const f of a['childNodes']){if(f['nodeType']==0x3)d+=f['nodeValue'];colors['indexOf'](f['className'])>-0x1&&b['cards']['push']({'color':f['className'],'value':toint(f['innerText'])});}textToType=new Map([['plays','plays'],['new\x20mission','new\x20mission'],['wins\x20the\x20trick','wins\x20the\x20trick'],['играет','plays'],['новую\x20миссию','new\x20mission'],['выигрывает\x20взятку','wins\x20the\x20trick'],['joue','plays'],['nouvelle\x20mission','new\x20mission'],['remporte\x20le\x20pli','wins\x20the\x20trick']]);for(let [g,h]of textToType['entries']()){if(d['indexOf'](g)<0x0)continue;b['type']=h;break;}if(b['type']==null)return null;if(b['type']=='plays'&&b['cards']['length']==0x0)return null;return a['querySelector']('.playername')&&(b['player']=a['querySelector']('.playername')['innerText']),b;}class State{constructor(){this['players']=new Set(),this['reset']();}['reset'](){this['cards']=new Map(),this['missing']=new Map();for(const a of this['players'])this['missing']['set'](a,new Set());this['currentColor']='';for(const b of colors){this['cards']['set'](b,b=='black'?[0x1,0x2,0x3,0x4]:[0x1,0x2,0x3,0x4,0x5,0x6,0x7,0x8,0x9]);}}['run'](a){switch(a['type']){case'new\x20mission':this['reset']();break;case'plays':!this['players']['has'](a['player'])&&(this['missing']['set'](a['player'],new Set()),this['players']['add'](a['player']));const b=a['cards'][0x0];this['cards']['get'](b['color'])[b['value']-0x1]=0x0;if(this['currentColor']=='')this['currentColor']=b['color'];else{if(this['currentColor']!=b['color'])this['missing']['get'](a['player'])['add'](this['currentColor']);}break;case'wins\x20the\x20trick':this['currentColor']='';break;default:console['error']('unknown\x20action\x20type',a['type']);}}}function drawState(a){area=document['querySelector']('#customTable');!area&&(area=document['createElement']('div'),area['id']='customTable',area['style']='width:\x20280px;\x20height:\x20150px;\x20padding:\x205px;\x20font-weight:\x20bold;',document['getElementById']('playertable_central')['appendChild'](area));area['innerHTML']='';for(const b of colors){row=document['createElement']('div'),row['style']='display:\x20flex;';for(const d of a['cards']['get'](b)){tile=document['createElement']('div'),tile['innerText']=d,dc=d<0x1?'transparent':b,tile['style']='display:\x20block;\x20min-height:\x2025px;\x20min-width:\x2025px;\x20margin:\x202px;\x20line-height:\x2025px;\x20color:\x20'+dc+';\x20border:\x201px\x20solid\x20'+dc+';',row['appendChild'](tile);}area['appendChild'](row);}for(const e of a['players']){document['querySelectorAll']('.playertablename')['forEach'](f=>{if(f['innerText']['trim']()['indexOf'](e)==-0x1)return;m=f['querySelector']('.missing');!m&&(m=document['createElement']('div'),m['className']='missing',m['style']='display:\x20inline-block;\x20font-size:\x2014px;\x20',f['appendChild'](m));m['innerHTML']='';for(const g of a['missing']['get'](e)){tile=document['createElement']('div'),tile['innerText']='X',tile['style']='display:\x20inline-block;\x20min-height:\x2015px;\x20margin:\x202px;\x20min-width:\x2015px;\x20line-height:\x2015px;\x20color:\x20'+g+';\x20border:\x201px\x20solid\x20'+g+';',m['appendChild'](tile);}});}}function crewTable(){logs=Array['from'](document['querySelectorAll']('#logs\x20.log\x20>\x20div')),logs=logs['reverse']();const a=logs['map'](parse)['filter'](c=>c);let b=new State();a['forEach'](c=>{b['run'](c);}),drawState(b);};window['setInterval'](crewTable,0x1f4); |
Hey, great script !
I localised it in French, but there was an error when a player takes too long to play (same keyword "plays", in French) . I fixed it by adding
line 30 :
https://gist.github.com/lhoang/6157785d3356f4d4c00a69e655c4f0b4