ps. 로그인 미세팁: 로그인된 스토브 런처에서 아무 이벤트 페이지나 누르고 이동하면 해당 웹브라우저가 로그인된 상태가 됩니다
*사용에 의한 불이익은 책임지지 않습니다.
사용자가 카드를 클릭하면 카드를 뒤집는 요청을 서버로 보내게 됩니다.
등록 방법
1. 아무 북마크를 생성합니다.
(크롬 기준 단축키 ctrl+D)
2. 해당 북마크를 우클릭 - 수정...
3. URL에 아래 글상자 내용을 복사하여 붙여넣기
(글상자를 2-3번 좌클릭하면 내용이 모두 선택됨)
사용 방법
이벤트 페이지로 이동한 이후, 방금 생성한 북마크를 눌러서 실행하면
우측 하단에 UI가 생성되고 기록을 시작합니다.
(북마크 바가 보이지 않는다면 ctrl+shift+B로 북마크를 보이게 할 수 있음)
북마크 방식이 싫다면 해당 스크립트를 복사해서 개발자 도구 - 콘솔에 붙여넣어도 됩니다.
수정 사항
v2
- 전체적인 UI 크기 확대
- 한 쌍을 찾은 경우 회색 처리
- 모든 판을 완료한 경우 자동 리셋
v2.1
- 회색 처리된 이미지가 초기화되지 않는 문제 수정
v3.0
- 패널 위치 및 크기 조절 기능 추가 (브라우저에 저장됩니다)
v4.0
- 마지막에 클릭한 카드와 동일한 이미지의 카드가 있다면 흔들림으로 알려줍니다.
v4.1
- 흔들림 기능이 일부 브라우저에서 동작하지 않는 문제 수정
- 패널 위치 저장 기능이 동작하지 않던 문제 수정
- 카드 게임 진행 사항이 저장되도록 기능 추가
javascript:(function(){!function(){if(window.__cardMemoInstalled)return void alert("카드 미리보기 스크립트가 이미 설치되어 있습니다.");window.__cardMemoInstalled=!0,window.__cardMemo=window.__cardMemo||{},window.__cardDone=[];const e=localStorage.getItem("__cardMemoResult");if(e)try{const t=JSON.parse(e);window.__cardMemo=t.cardMemo,window.__cardDone=t.cardDone}catch{}const t=document.createElement("div");t.id="card-memo-container",Object.assign(t.style,{position:"fixed",right:"12px",bottom:"12px",zIndex:2147483647,background:"rgba(255,255,255,0.95)",border:"1px solid rgba(0,0,0,0.2)",padding:"8px",borderRadius:"8px",boxShadow:"0 6px 18px rgba(0,0,0,0.15)",fontFamily:"Segoe UI, Roboto, Arial, sans-serif",fontSize:"12px",color:"#111",userSelect:"none"});const n=localStorage.getItem("__cardMemoPanel");let o={left:null,top:null,scale:1};if(n)try{o=JSON.parse(n)}catch{}null!==o.left&&null!==o.top&&(t.style.left=o.left+"px",t.style.top=o.top+"px",t.style.right="auto",t.style.bottom="auto"),1!==o.scale&&(t.style.transform=`scale(${o.scale})`);const a=document.createElement("div");a.style.display="flex",a.style.alignItems="center",a.style.justifyContent="space-between",a.style.marginBottom="6px",a.style.cursor="move";const s=document.createElement("div");s.textContent="카드 메모리 게임",s.style.fontWeight="600",s.style.marginRight="8px";const r=document.createElement("div"),l=document.createElement("button");l.textContent="초기화",l.title="기억한 카드 초기화",Object.assign(l.style,{padding:"4px 6px",fontSize:"11px",cursor:"pointer",marginLeft:"6px"});const d=document.createElement("button");d.textContent="×",d.title="닫기 (UI만 숨김)",Object.assign(d.style,{padding:"2px 6px",fontSize:"14px",cursor:"pointer",marginLeft:"6px"}),r.appendChild(l),r.appendChild(d),a.appendChild(s),a.appendChild(r),t.appendChild(a);const i=document.createElement("div");Object.assign(i.style,{position:"absolute",left:"0",top:"0",width:"12px",height:"12px",cursor:"nwse-resize",background:"rgba(0,0,0,0.2)",borderTopLeftRadius:"8px"}),t.appendChild(i);const c=document.createElement("div");c.id="card-memo-grid",Object.assign(c.style,{display:"grid",gridTemplateColumns:"repeat(6, 63px)",gridTemplateRows:"repeat(3, 84px)",gap:"6px",transition:"transform 0.1s",transformOrigin:"top left"});const m=[];for(let e=0;e<18;e++){const t=document.createElement("div");t.className="card-memo-slot",t.dataset.index=String(e),Object.assign(t.style,{width:"63px",height:"84px",border:"1px dashed rgba(0,0,0,0.15)",borderRadius:"4px",overflow:"hidden",display:"flex",alignItems:"center",justifyContent:"center",background:"#fafafa",position:"relative",cursor:"default"});const n=document.createElement("img");n.style.maxWidth="100%",n.style.maxHeight="100%",n.style.display="none",n.alt="",t.appendChild(n),c.appendChild(t),m.push(t)}t.appendChild(c);const p=document.createElement("div");p.textContent="클릭한 카드가 열리면 해당 칸에 이미지가 저장됩니다.",Object.assign(p.style,{marginTop:"6px",fontSize:"11px",color:"rgba(0,0,0,0.6)"}),t.appendChild(p),document.body.appendChild(t),function(){let e=!1,n=0,s=0;a.addEventListener("mousedown",(o=>{e=!0,n=o.clientX-t.offsetLeft,s=o.clientY-t.offsetTop,document.body.style.userSelect="none"})),window.addEventListener("mouseup",(()=>{e&&(e=!1,localStorage.setItem("__cardMemoPanel",JSON.stringify({left:t.offsetLeft,top:t.offsetTop,scale:o.scale}))),document.body.style.userSelect=""})),window.addEventListener("mousemove",(o=>{if(!e)return;const a=o.clientX-n,r=o.clientY-s;t.style.left=a+"px",t.style.top=r+"px",t.style.right="auto",t.style.bottom="auto"}))}(),function(){let e=!1,n=0,a=0,s=o.scale;i.addEventListener("mousedown",(t=>{t.preventDefault(),e=!0,n=t.clientX,a=t.clientY,s=o.scale})),window.addEventListener("mouseup",(()=>{e&&(e=!1,localStorage.setItem("__cardMemoPanel",JSON.stringify({left:t.offsetLeft,top:t.offsetTop,scale:o.scale})))})),window.addEventListener("mousemove",(r=>{if(!e)return;const l=(n-r.clientX+(a-r.clientY))/400;let d=Math.min(Math.max(.5,s+l),3);o.scale=d,t.style.transform=`scale(${d})`}))}(),d.addEventListener("click",(()=>{t.style.display="none"})),l.addEventListener("click",(()=>{confirm("저장된 카드 정보를 모두 삭제하시겠습니까?")&&(window.__cardMemo={},u())}));const f=document.createElement("style");function u(e=void 0){for(let t=0;t<18;t++){const n=window.__cardMemo[t],o=m[t],a=o.querySelector("img");n?(a.src=n,a.style.display="block",o.style.background="#fff",o.style.borderStyle="solid"):(a.src="",a.style.display="none",o.style.background="#fafafa",o.style.borderStyle="dashed");const s=window.__cardDone.includes(t);s?(a.style.filter="grayscale(100%)",a.style.opacity="0.2"):(a.style.removeProperty("filter"),a.style.removeProperty("opacity")),n&&t!=e&&n===window.__cardMemo[e]&&!s?o.classList.add("card-memo-game-shake"):o.classList.remove("card-memo-game-shake")}localStorage.setItem("__cardMemoResult",JSON.stringify({cardMemo:window.__cardMemo,cardDone:window.__cardDone}))}f.textContent="n @keyframes card-memo-game-shake {n 0%, 100% { transform: translateX(0); }n 20%, 60% { transform: translateX(-5px); }n 40%, 80% { transform: translateX(5px); }n }n .card-memo-game-shake {n animation: card-memo-game-shake 0.4s ease-in-out infinite;n }n ",document.head.appendChild(f),function(){const e=window.XMLHttpRequest;window.XMLHttpRequest=function t(){const n=new e;let o=null,a=null,s=null;const r=n.open;n.open=function(e,t){return a=e,o=t,r.apply(n,arguments)};const l=n.send;return n.send=function(e){return s=e,n.addEventListener("load",(function(){try{if(!o)return;if(new URL(o,location.href).pathname.endsWith("/Promotion/Card/GetCard251105")&&a&&"POST"===a.toUpperCase()){let e=null;if("string"==typeof s){const t=s.match(/(?:^|&)index=([^&]+)/);t&&(e=decodeURIComponent(t[1]))}else(s instanceof FormData||s instanceof URLSearchParams)&&(e=s.get("index"));const t=n.responseText;if(!t)return;const o=JSON.parse(t);if(o){if(null!=o.img){const t=null!=e?Number(e):null;null!==t&&!Number.isNaN(t)&&t>=0&&t<18&&(window.__cardMemo[t]=new URL(o.img,"https://cdn-lostark.game.onstove.com").href)}o.isMatch&&(window.__cardDone=[...window.__cardDone,...o.index]),o.complete&&(window.__cardDone=[],window.__cardMemo={}),u(e)}}}catch(e){console.error(e)}})),l.apply(n,arguments)},t.prototype=e.prototype,n}}(),u(),console.log("Card Memo installed with drag & resize.")}();}());