@seojin08/skill-finder 0.3.3 → 0.3.5
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.
- package/CHANGELOG.md +20 -0
- package/README.md +1 -1
- package/package.json +3 -2
- package/seed-index.json.gz +0 -0
- package/server/src/app.js +3 -0
- package/server/src/bootstrap.js +2 -1
- package/server/src/db/schema.js +3 -0
- package/server/src/db/seed.js +89 -0
- package/server/src/db/store.js +4 -3
- package/server/src/index.js +11 -0
- package/server/src/indexer.js +5 -1
- package/server/src/install/installed.js +95 -25
- package/server/src/recommend/readme.js +14 -2
- package/server/src/routes/favorites.js +55 -10
- package/server/src/routes/install.js +33 -7
- package/server/src/routes/translate.js +35 -0
- package/server/src/search/result.js +9 -1
- package/server/src/security.js +4 -1
- package/server/src/sources/gitTree.js +11 -1
- package/server/src/sources/github.js +17 -2
- package/server/src/tasks.js +45 -5
- package/server/src/translate/models.js +140 -0
- package/server/src/update.js +1 -1
- package/web/dist/THIRD-PARTY-LICENSES.txt +6 -0
- package/web/dist/assets/{ArasakaGame-C1Wkmqik.js → ArasakaGame-zvqzlnfW.js} +2 -2
- package/web/dist/assets/__vite-browser-external-BDfy7Drd.js +1 -0
- package/web/dist/assets/index-BGfauLB6.css +2 -0
- package/web/dist/assets/index-Bhi_rUeJ.js +66 -0
- package/web/dist/assets/rolldown-runtime-XKyaHtl9.js +1 -0
- package/web/dist/assets/translator-CCFr2ykW.js +2 -0
- package/web/dist/bergamot/bergamot-translator-worker.js +2919 -0
- package/web/dist/bergamot/bergamot-translator-worker.wasm +0 -0
- package/web/dist/bergamot/translator-worker.js +475 -0
- package/web/dist/index.html +3 -2
- package/web/dist/assets/index-BgL1OaU4.css +0 -2
- package/web/dist/assets/index-Ec2XBK4-.js +0 -66
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{r as e}from"./rolldown-runtime-XKyaHtl9.js";import{n as t,r as n}from"./index-Bhi_rUeJ.js";var r=e(n(),1),i=[`trash`,`common`,`hq`,`rare`,`legendary`,`epic`],a={trash:`폐품`,common:`일반`,hq:`고급`,rare:`희귀`,legendary:`전설`,epic:`에픽`},o={trash:.72,common:.86,hq:1,rare:1.18,legendary:1.42,epic:1.75},s={trash:[0,1],common:[1,1],hq:[1,2],rare:[2,2],legendary:[2,3],epic:[3,3]},c=[`primary`,`special`,`destructive`,`helmet`,`upper`,`lower`,`boots`],l=[`primary`,`special`,`destructive`],u={primary:`주무기`,special:`특수무기`,destructive:`파괴무기`,helmet:`머리`,upper:`상의`,lower:`하의`,boots:`신발`},d={primary:[`볼트 리볼버`,`니들 SMG`,`스파크 권총`,`코일 카빈`,`플레셰트 피스톨`],special:[`아크 라이플`,`이온 캐스터`,`펄스 블래스터`,`플라즈마 랜스`],destructive:[`레일 캐논`,`분쇄 런처`,`그래비티 해머`,`싱귤러 모르타르`],helmet:[`신경 바이저`,`방탄 후드`,`전술 헤드셋`,`거울 고글`],upper:[`케블라 재킷`,`나노 플레이트`,`라이너 코트`,`외골격 조끼`],lower:[`강화 카고`,`충격 레깅스`,`세그먼트 바지`],boots:[`마그 부츠`,`그립 러너`,`사일런트 스텝`]},f={trash:[`녹슨`,`테이프 감은`,`삐걱대는`],common:[`표준형`,`공장제`,`중고`],hq:[`튜닝된`,`밀스펙`,`정밀`],rare:[`블랙라벨`,`실험형`,`오버드라이브`],legendary:[`유령의`,`제로데이`,`네메시스`],epic:[`특이점`,`오메가`,`아라사카 원형`]},p={hp:`체력`,shield:`실드`,armor:`방어`,crit:`치명타`,critDmg:`치명 피해`,evade:`회피`,escape:`도주`,stun:`기절`,regen:`재생`,dmgPct:`피해`},m=[`crit`,`critDmg`,`evade`,`escape`,`stun`,`dmgPct`],h={crit:60,evade:35,stun:25,escape:85,critDmg:250},g={hp:`생체 버퍼`,shield:`실드 코일`,armor:`세라믹 라이너`,crit:`조준 보조칩`,critDmg:`약점 분석기`,evade:`반사 신경칩`,escape:`도주 경로칩`,stun:`쇼크 모듈`,regen:`나노 재생기`,dmgPct:`출력 증폭기`},_=[{name:`진통 패치`,heal:90,med:1,parts:1,price:18},{name:`나노 봉합기`,heal:200,med:6,parts:2,price:50},{name:`트라우마 키트`,heal:380,med:14,parts:4,price:120},{name:`재생 주사`,heal:650,med:24,parts:7,price:260},{name:`풀리셋 앰플`,heal:1050,med:36,parts:12,price:520}],v={frenzied:{label:`광폭한`,hint:`공격 +25%`},plated:{label:`장갑 두른`,hint:`받는 피해 -20%`},warded:{label:`방벽 친`,hint:`체력의 1.5배 실드`},twitchy:{label:`경련하는`,hint:`회피 15%, 작은 실드`},deadeye:{label:`저격수`,hint:`치명타 +15%, 치명 피해 +50%`},hulking:{label:`거대한`,hint:`체력 ×1.8, 공격 +20%`}},y=[{name:`하수 순환로`,glyph:`≈`,blurb:`도시 아래로 흐르는 폐수 터널. 버려진 드론과 굶주린 스캐빈저가 산다.`,areas:[{name:`배수 펌프장`,min:1,max:3},{name:`쥐굴 시장`,min:3,max:6},{name:`침수된 변전소`,min:6,max:9}],dungeons:[{name:`녹슨 저수조`,level:3,fragment:`α`},{name:`폐 정수장`,level:6,fragment:`β`},{name:`심층 방류구`,level:9,fragment:`γ`}],enemies:[`배관 스캐빈저`,`고장 난 청소 드론`,`하수 갱 꼬마`,`변이 쥐떼`,`전선 도둑`,`독가스 중독자`],bosses:[`펌프장 왕 그루트`,`하수 여왕 메로`]},{name:`네온 바자르`,glyph:`◈`,blurb:`24시간 꺼지지 않는 노점가. 해적판 크롬과 가짜 장기가 거래된다.`,areas:[{name:`국수 골목`,min:9,max:12},{name:`짝퉁 크롬 상가`,min:12,max:15},{name:`홀로 간판 옥상`,min:15,max:18}],dungeons:[{name:`밀수 창고`,level:12,fragment:`α`},{name:`불법 클리닉`,level:15,fragment:`β`},{name:`삼합회 도박장`,level:18,fragment:`γ`}],enemies:[`노점 깡패`,`장기 브로커`,`네온 폭주족`,`사이버 사기꾼`,`삼합회 집행자`,`해킹된 경비봇`],bosses:[`도박장 주인 진`,`클리닉 원장 닥터 소`]},{name:`데이터 항만`,glyph:`▤`,blurb:`컨테이너마다 서버가 잠든 부두. 데이터 해적과 기업 보안팀이 맞붙는다.`,areas:[{name:`컨테이너 미로`,min:18,max:21},{name:`냉각수 부두`,min:21,max:25},{name:`크레인 관제탑`,min:25,max:28}],dungeons:[{name:`침몰한 서버선`,level:21,fragment:`α`},{name:`세관 보관소`,level:25,fragment:`β`},{name:`해적 방송국`,level:28,fragment:`γ`}],enemies:[`데이터 해적`,`부두 보안요원`,`케이블 거미봇`,`항만 노조 해결사`,`불법 채굴 리그`,`침투 넷러너`],bosses:[`해적 선장 베일`,`관제 AI 하버마스터`]},{name:`아콜로지 하층`,glyph:`▲`,blurb:`기업 탑의 아래층. 위층에 올라가지 못한 사람들과 그들을 막는 벽.`,areas:[{name:`서비스 승강로`,min:28,max:32},{name:`수경 재배층`,min:32,max:36},{name:`경비 검문소`,min:36,max:40}],dungeons:[{name:`폐쇄된 연구동`,level:32,fragment:`α`},{name:`임원 대피호`,level:36,fragment:`β`},{name:`코어 냉각실`,level:40,fragment:`γ`}],enemies:[`기업 경비대`,`전투 안드로이드`,`사이코 엔지니어`,`보안 드론 편대`,`반란군 폭파병`,`실험체 탈주자`],bosses:[`보안 책임자 하야시`,`실험체 제로-나인`]},{name:`블랙월 경계`,glyph:`◆`,blurb:`넷의 끝. 벽 너머에서 무언가가 이쪽을 보고 있다.`,areas:[{name:`데드존 회선`,min:40,max:45},{name:`폭주 AI 묘지`,min:45,max:50},{name:`벽의 틈`,min:50,max:55}],dungeons:[{name:`버려진 데이터센터`,level:45,fragment:`α`},{name:`유령 프로토콜`,level:50,fragment:`β`},{name:`블랙월 균열`,level:55,fragment:`γ`}],enemies:[`폭주 AI 조각`,`데몬 사냥꾼`,`블랙 아이스 망령`,`자기복제 웜`,`넷 유령`,`경계 감시자`],bosses:[`폭주 AI 레퀴엠`,`벽 너머의 목소리`]}],b=[`벽에 스프레이로 적힌 글: "아라사카는 비가 오는 날에도 돈을 번다."`,`찢어진 전단지. "신경칩 무료 이식 — 첫 달 광고 시청 의무."`,`죽은 단말기에 남은 마지막 메시지: "백업 안 했으면 너도 이제 과거야."`,`누군가 손톱으로 긁어 놓은 숫자들. 날짜인지 좌표인지 알 수 없다.`,`깨진 홀로 광고가 같은 말만 반복한다. "당신의 기억, 클라우드에 안전하게."`,`낡은 노트 한 장. "블랙월은 막으려고 만든 게 아니라, 숨기려고 만든 것이다."`,`배관에 붙은 스티커: "이 구역의 공기는 유료입니다. 숨 쉰 만큼 청구됩니다."`,`바닥에 떨어진 신분증. 얼굴 사진만 정성스럽게 지워져 있다.`,`스피커에서 흘러나오는 사내 방송. "오늘도 생산성 지표 102%! 휴가는 없습니다."`,`벽돌 틈에 끼워진 쪽지: "09시 정각, 블랙마켓 문이 열린다. 늦으면 없다."`],x=[`외팔 정비공`,`은퇴한 넷러너`,`수상한 약사`,`떠돌이 해결사`,`배달 드론 조종사`,`도망친 실험체`],S=[`"이봐, 거기. 잠깐 거래 좀 하자고."`,`"눈빛 보니 쓸 만한 러너구만."`,`"쉿. 여기선 목소리 낮춰."`,`"내 물건을 잃어버렸어. 대신 구해 주면 사례하지."`],C=[{id:`over1`,label:`과충전 I`,stat:`dmg`,pct:5},{id:`over2`,label:`과충전 II`,stat:`dmg`,pct:10},{id:`over3`,label:`과충전 III`,stat:`dmg`,pct:15},{id:`plate1`,label:`장갑 강화 I`,stat:`def`,pct:5},{id:`plate2`,label:`장갑 강화 II`,stat:`def`,pct:10},{id:`plate3`,label:`장갑 강화 III`,stat:`def`,pct:15},{id:`ward1`,label:`실드 증폭 I`,stat:`shield`,pct:10},{id:`ward2`,label:`실드 증폭 II`,stat:`shield`,pct:20},{id:`ward3`,label:`실드 증폭 III`,stat:`shield`,pct:30}],w=[{id:`print`,name:`프린터 실습`,desc:`공방 견습. 인쇄 숙련도가 오른다.`},{id:`med`,name:`의료 연구소`,desc:`실험 보조. 의료 숙련도와 의료 부품.`},{id:`ammo`,name:`탄약 공장 라인`,desc:`야간 교대. 탄약 숙련도와 탄약 부품.`},{id:`scav`,name:`고철 수집`,desc:`폐허를 뒤진다. 고철·부품, 가끔 상자.`},{id:`guard`,name:`경비 알바`,desc:`창고 경비. 크레딧과 경험치.`}],T=[15,60,240,480],E={city:{tag:`중앙 허브`,npc:``,lines:[`대륙에서 가장 시끄러운 광장. 거래, 소문, 일감이 전부 여기서 시작된다.`],hue:190},rail:{tag:`모험`,npc:`역무 AI 칸나`,lines:[`마그레일은 초음속입니다. 멀미 봉투는 좌석 아래에 있습니다.`,`다음 노선은 열쇠가 있어야 열립니다. 규정이에요.`],hue:200},forge:{tag:`제작`,npc:`미오`,lines:[`상자만 가져와. 분자 단위로 다시 짜 줄게. 다리는 빼고.`,`폐품 상자부터 찍어. 손이 기억해야 좋은 걸 찍지.`],hue:45},smith:{tag:`무기상`,npc:`도크`,lines:[`총은 거짓말을 안 해. 쏘는 놈이 하지.`,`반물질은 아껴. 실드 두꺼운 놈한텐 반만 박힌다.`],hue:15},pharm:{tag:`의료`,npc:`간호사 린`,lines:[`출혈은 셀프 서비스예요. 계산은 카운터에서.`,`던전 들어가기 전에 단축칸부터 채우세요. 진심이에요.`],hue:150},terminal:{tag:`해킹`,npc:`키퍼`,lines:[`조각 세 개. 그게 문을 여는 유일한 방법이다.`,`ICE는 3분마다 재정렬된다. 그 틈을 노려라.`],hue:280},gigs:{tag:`일감`,npc:`브로커 맥스`,lines:[`자리 비울 거면 일이라도 걸어 둬. 시간도 돈이야.`,`경비 알바는 지루하지만 안전하지. 대부분은.`],hue:210},market:{tag:`암시장`,npc:`그림자`,lines:[`아침 9시에 물건이 들어온다. 늦으면 없다.`,`출처는 묻지 마. 나도 모르니까.`],hue:300},raid:{tag:`작전`,npc:`지휘관 볼크`,lines:[`혼자 가겠다고? 장례식은 간단하게 해 주지.`,`용병 둘이면 해볼 만하다. 하루 한 번뿐이다.`],hue:350},relay:{tag:`송신`,npc:`파이`,lines:[`출력을 올리면 30분은 날아다닐 거야. 그다음은 몰라.`],hue:60},records:{tag:`기록`,npc:`아카이브`,lines:[`모든 러너의 흔적은 여기 남는다. 지워지지 않는다.`],hue:170},street:{tag:`거리`,npc:``,lines:[`근처에 적의가 느껴진다. 골라서 싸워라. 여기선 회복제를 쓸 수 없다.`],hue:330}},ee=[`중장갑 집행기 TITAN-7`,`군용 AI 오로보로스`,`사이보그 군벌 카르텔`,`궤도 폭격 드론 하이페리온`],te=[`용병 레이븐`,`용병 탱크`,`용병 스파크`,`용병 노바`,`용병 독스`],D=[{who:`k1ra`,text:`하수 순환로 저수조 보물방은 대체로 맨 끝 방이야. 미니맵 잘 봐.`},{who:`ratking`,text:`방벽 친 놈은 특수무기로 실드부터 벗겨. 파괴무기는 실드에 반만 박혀.`},{who:`doc_null`,text:`회복제는 Q W E 칸에 박아 둬. 던전에선 그게 전부야.`},{who:`mox`,text:`오늘 블랙마켓 물건 괜찮더라. 09시 지나면 바로 가 봐.`},{who:`ghost_42`,text:`분해 많이 하면 인쇄 숙련도 금방 올라. 폐품 상자는 아끼지 말고 찍어.`},{who:`v3ra`,text:`레이드는 용병 둘 데려가는 게 정신 건강에 좋아.`},{who:`sasha`,text:`길거리 싸움은 도주가 100% 성공이니까 질 것 같으면 그냥 빼.`},{who:`byte`,text:`터미널 ICE 크래킹 은근 짭짤함. 3분마다 한 판씩.`},{who:`k1ra`,text:"`(백틱) 누르면 화면이 코드 에디터로 바뀜. 팀장 지나갈 때 써."},{who:`ratking`,text:`플랫라인 당하면 10초 동안 아무것도 못 해. 회복제 아끼다 죽지 마.`}],ne=`import { Injectable } from '@nestjs/common';
|
|
2
2
|
import { InjectRepository } from '@nestjs/typeorm';
|
|
3
3
|
import { Repository, In } from 'typeorm';
|
|
4
4
|
import { Invoice, InvoiceStatus } from './invoice.entity';
|
|
@@ -32,5 +32,5 @@ export class InvoiceReconciler {
|
|
|
32
32
|
return report;
|
|
33
33
|
}
|
|
34
34
|
}
|
|
35
|
-
`,O=class extends Error{};function k(e){throw new O(e)}var A=e=>Math.round(e),j=e=>i.indexOf(e);function M(e,t,n=`info`,r=0){e.log.push({at:r,text:t,tone:n}),e.log.length>80&&e.log.splice(0,e.log.length-80)}var N=(e,t)=>e.stacks[t]??0;function P(e,t,n){let r=Math.min(1e4,N(e,t)+n);r<0&&k(`재료가 부족합니다`),r===0?delete e.stacks[t]:e.stacks[t]=r}function F(e,t,n,r){N(e,t)<n&&k(`${r}이(가) 부족합니다 (${N(e,t)}/${n})`),P(e,t,-n)}function I(e,t){e.credits<t&&k(`크레딧이 부족합니다 (¥${e.credits} / ¥${t})`),e.credits-=t}var re=e=>`heal:${e}`,L=(e,t)=>`cache:${e}:${t}`,ie=(e,t)=>`frag:${e}:${t}`,ae=9;function oe(e,t){return new Date(e+t*6e4-ae*36e5).toISOString().slice(0,10)}function se(e,t){let n=e+t*6e4;return(Math.floor((n-ae*36e5)/864e5)+1)*864e5+ae*36e5-t*6e4}var R=e=>A(25*e**1.55+25),ce=e=>8+4*e;function le(e,t,n){if(!(t<=0||e.level>=60)){for(e.xp+=t,e.totalXp+=t,e.totalXpAt=n;e.level<60&&e.xp>=R(e.level);)e.xp-=R(e.level),e.level++,e.hp=B(e,n).maxHp,M(e,`레벨 업! Lv.${e.level}. 체력이 가득 찼다`,`good`,n);e.level>=60&&(e.xp=0)}}function z(e,t,n,r){let i=e.skills[t];for(i.xp+=n;i.lv<100&&i.xp>=ce(i.lv);)i.xp-=ce(i.lv),i.lv++,M(e,`${t===`printing`?`인쇄`:t===`medical`?`의료`:`탄약`} 숙련도 ${i.lv}`,`good`,r)}var ue=(e,t)=>e.buffs.filter(e=>e.until>t);function B(e,t){let n={hp:0,shield:0,armor:0,crit:5,critDmg:150,evade:0,escape:30,stun:0,regen:0,dmgPct:0},r={primary:0,special:0,destructive:0};for(let t of e.items)if(t.kind===`gear`&&t.equipped&&t.slot){l.includes(t.slot)?r[t.slot]=t.main:n.hp+=t.main;for(let[e,r]of Object.entries(t.affixes))n[e]+=r??0;for(let r of e.items)r.installedIn===t.id&&r.stat&&(n[r.stat]+=r.main)}let i=0,a=0;for(let r of ue(e,t)){let e=C.find(e=>e.id===r.id);e&&(e.stat===`dmg`?n.dmgPct+=e.pct:e.stat===`def`?a+=e.pct:i+=e.pct)}(e.overclockUntil??0)>t&&(n.dmgPct+=20);for(let e of Object.keys(h))n[e]=Math.min(n[e],h[e]??1/0);let o=1+n.dmgPct/100;return{maxHp:A(60+10*(e.level-1)+n.hp),maxShield:A(n.shield*(1+i/100)),armor:A(n.armor*10)/10,crit:n.crit,critDmg:n.critDmg,evade:n.evade,escape:n.escape,stun:n.stun,regen:A(n.regen),dmgPct:n.dmgPct,defPct:a,dmg:{primary:A((r.primary||2+e.level)*o),special:A(r.special*o),destructive:A(r.destructive*o)}}}function V(e,t,n=0,r=`trash`){let a=e.next()**(1/(1+n+t/45)),o=[.5,.78,.92,.975,.995].findIndex(e=>a<e);return o<0&&(o=5),i[Math.max(o,j(r))]}var de=[`crit`,`critDmg`,`stun`,`dmgPct`],fe=[`crit`,`critDmg`,`evade`,`escape`,`regen`,`stun`],pe={trash:[0,0],common:[0,1],hq:[1,1],rare:[2,2],legendary:[2,3],epic:[3,3]};function me(e,t,n,r){let i=e.between(.6,1);return A({crit:1.5+2.5*r*i,critDmg:6+12*r*i,evade:1+2.5*r*i,escape:2+5*r*i,stun:1+2.5*r*i,regen:(.5+.25*n)*r*i,dmgPct:2+4*r*i,hp:(4+3*n)*r*i,shield:(2+1.2*n)*r*i,armor:(.2+.1*n)*r*i}[t]*10)/10}function he(e,t,n,r,i,a){let c=o[r],u=()=>e.between(.92,1.08),p=n,m={},h,g=(5+2.6*p)*c;switch(t){case`primary`:h=g*u();break;case`special`:h=g*1.6*u();break;case`destructive`:h=g*2.4*u();break;case`helmet`:h=(8+5*p)*c*u(),m.shield=A((2+1.5*p)*c*u());break;case`upper`:h=(14+9*p)*c*u(),m.shield=A((3+2*p)*c*u()),m.armor=A((.4+.28*p)*c*u()*10)/10;break;case`lower`:h=(12+8*p)*c*u(),m.armor=A((.3+.22*p)*c*u()*10)/10;break;case`boots`:h=(6+4*p)*c*u(),m.escape=A((3+.1*p)*c*u()*10)/10}let _=l.includes(t)?de:fe,[v,y]=pe[r],b=e.int(v,y);for(let t=0;t<b;t++){let t=e.pick(_);m[t]=A(((m[t]??0)+me(e,t,p,c))*10)/10}let[x,S]=s[r];return{id:e.uuid(),kind:`gear`,slot:t,rarity:r,level:n,name:`${e.pick(f[r])} ${e.pick(d[t])}`,main:A(h),affixes:m,modSlots:e.int(x,S),equipped:!1,source:i,at:a}}var ge=[`hp`,`shield`,`armor`,`crit`,`critDmg`,`evade`,`escape`,`stun`,`regen`,`dmgPct`];function _e(e,t,n,r,i){let a=e.pick(ge);return{id:e.uuid(),kind:`module`,stat:a,rarity:n,level:t,name:g[a],main:me(e,a,t,o[n]*1.2),affixes:{},modSlots:0,equipped:!1,source:r,at:i}}var ve={trash:.6,common:1,hq:1.8,rare:3.5,legendary:7,epic:14},ye=e=>A((4+2.2*e.level)*ve[e.rarity]*(e.kind===`module`?.8:1)),be=e=>e.items.filter(e=>!e.equipped&&!e.installedIn).length;function xe(e,t,n){if(be(e)>=e.bagCap){let r=1+j(t.rarity)*2;return P(e,`scrap`,r),M(e,`가방이 가득 차서 ${t.name}을(를) 고철 ${r}개로 바꿨다`,`bad`,n),`고철 ${r} (가방 가득)`}return e.items.push(t),t.name}var Se=e=>.8+.011*e,Ce=e=>(12+9*e)*Se(e),we=e=>(6+4.3*e)*Se(e);function Te(e,t,n,r,i){let a=y[t],o=Ce(n)*e.between(.9,1.1),s=we(n),c=0,l=5,u=150,d=0,f=0,p=e.pick(a.enemies);r===`elite`&&(o*=2.2,s*=1.15,p=`정예 ${p}`),r===`boss`&&(o*=5,s*=1.35,p=e.pick(a.bosses));let m=[],h=r===`boss`?1+ +!!e.chance(.5):+!!e.chance(i),g=[`frenzied`,`plated`,`warded`,`twitchy`,`deadeye`,`hulking`];for(;m.length<h;){let t=e.pick(g);m.includes(t)||m.push(t)}for(let e of m)e===`frenzied`&&(s*=1.25),e===`plated`&&(f+=20),e===`warded`&&(o*=.85,c+=o*1.5),e===`twitchy`&&(d+=15,c+=o*.4),e===`deadeye`&&(l+=15,u+=50),e===`hulking`&&(o*=1.8,s*=1.2);return{name:p,level:n,rank:r,hp:A(o),maxHp:A(o),shield:A(c),maxShield:A(c),atk:A(s*10)/10,crit:l,critDmg:u,evade:d,defPct:f,mods:m}}function Ee(e,t){let n=(e.rank===`boss`?8:e.rank===`elite`?3:1)*(1+.25*e.mods.length),r=(5+3.2*e.level**1.12)*n,i=t-e.level;return i>6&&(r*=Math.max(.1,1-(i-6)*.15)),A(r)}function De(e,t,n,r,i,a,o){let s=[],c=(t,n,r)=>{n<=0||(P(e,t,n),s.push(`${r} ×${n}`))},l=r===`boss`?6:r===`elite`?2.5:i===`crate`?1.6:1,u=A((3+1.8*n)*t.between(.8,1.2)*l);e.credits+=u,s.unshift(`¥${u}`),t.chance(i===`crate`?.6:.35)&&c(`cells`,t.int(1,3)+Math.floor(n/10),`에너지 탄약`),t.chance(i===`crate`?.3:.12)&&c(`antimatter`,1+Math.floor(n/20),`반물질`),t.chance(.22)&&c(`med`,t.int(1,2),`의료 부품`),t.chance(.22)&&c(`ammoparts`,t.int(1,2),`탄약 부품`),t.chance(.25)&&c(`scrap`,t.int(1,2),`고철`);let d=r===`boss`?1:r===`elite`?.6:i===`crate`?.45:i===`dungeon`?.09:.05,f=(r===`boss`?.8:r===`elite`?.4:i===`crate`?.3:0)+(a?.3:0);if(t.chance(d)){let e=t.chance(.5)?`weapon`:`armor`,r=V(t,n,f);c(L(e,r),1,`${e===`weapon`?`무기`:`방어구`} 상자(${ke(r)})`)}if(r===`boss`){let r=he(t,t.pick([`primary`,`special`,`destructive`,`helmet`,`upper`,`lower`,`boots`]),Math.min(n,e.level),V(t,n,1.2,`rare`),`drop`,o);s.push(xe(e,r,o))}return t.chance(r===`boss`?.35:.03)&&s.push(xe(e,_e(t,Math.min(n,e.level),V(t,n,f),`drop`,o),o)),s}var Oe={trash:`폐품`,common:`일반`,hq:`고급`,rare:`희귀`,legendary:`전설`,epic:`에픽`},ke=e=>Oe[e],Ae={kill:{need:[8,14],f:1},street:{need:[5,8],f:.8},dungeon:{need:[1,2],f:1.6},print:{need:[2,4],f:.7},craft:{need:[3,6],f:.7},crate:{need:[3,6],f:.9},ice:{need:[1,1],f:.6}},je={kill:`적 처치`,street:`길거리 적 처치`,dungeon:`던전 보물방 정리`,print:`상자 인쇄`,craft:`아이템 제작`,crate:`던전 상자 열기`,ice:`ICE 크래킹 성공`};function Me(e,t){for(;e.quests.length<3;){let n=e.quests.map(e=>e.kind),r=Object.keys(Ae).filter(e=>!n.includes(e)),i=t.pick(r),a=Ae[i];e.quests.push({id:++e.questSeq,kind:i,need:t.int(...a.need),have:0,credits:A((30+14*e.level)*a.f),xp:A(R(e.level)*.12*a.f)})}}function Ne(e,t,n=1){for(let r of e.quests)r.kind===t&&(r.have=Math.min(r.need,r.have+n))}var Pe=.04,Fe=.008;function Ie(e,t){let n=B(e,t).maxHp;if(e.loc===`dungeon`||e.combat||t<=e.hpAt)return Math.min(e.hp,n);let r=e.loc===`town`?Pe:Fe;return Math.min(n,A(e.hp+n*r*((t-e.hpAt)/1e3)))}function Le(e,t){let{now:n}=t;e.flatlineUntil&&n>=e.flatlineUntil&&(e.flatlineUntil=void 0),n>e.hpAt&&(e.hp=Ie(e,n),e.hpAt=n),e.buffs=e.buffs.filter(e=>e.until>n),Me(e,t.rng)}function Re(e,t){let n={v:2,rng:[],createdAt:t,level:1,xp:0,totalXp:0,totalXpAt:t,credits:120,hp:1,hpAt:t,unlocked:0,bagCap:40,hotbar:[0,null,null],skills:{printing:{lv:1,xp:0},medical:{lv:1,xp:0},ammo:{lv:1,xp:0}},stats:{kills:0,bossKills:0,deaths:0,dungeonClears:0,challengeClears:0,raidAttempts:0,raidWins:0,cratesOpened:0,itemsPrinted:0,iceCracked:0},items:[],stacks:{[re(0)]:5,cells:20,antimatter:2},records:[],loc:`town`,quests:[],questSeq:0,buffs:[],log:[]};for(let r of[`primary`,`special`,`upper`,`lower`,`boots`]){let i=he(e,r,1,r===`primary`?`common`:`trash`,`start`,t);i.equipped=!0,n.items.push(i)}return n.hp=B(n,t).maxHp,Me(n,e),M(n,`접속 완료. 제로 플라자에 도착했다. 마그레일 역에서 하수 순환로로 가 보자.`,`info`,t),n}function ze(e){let t=e[0]>>>0,n=e[1]>>>0,r=e[2]>>>0,i=e[3]>>>0,a=()=>{let e=(t+n|0)+i|0;return i=i+1|0,t=n^n>>>9,n=r+(r<<3)|0,r=r<<21|r>>>11,r=r+e|0,e>>>0},o=()=>a()/4294967296,s=e=>e.toString(16).padStart(8,`0`);return{next:o,int:(e,t)=>e+Math.floor(o()*(t-e+1)),between:(e,t)=>e+o()*(t-e),chance:e=>o()<e,pick:e=>e[Math.floor(o()*e.length)],uuid:()=>{let e=[a(),a(),a(),a()].map(s).join(``),t=(parseInt(e[16],16)&3|8).toString(16);return`${e.slice(0,8)}-${e.slice(8,12)}-4${e.slice(13,16)}-${t}${e.slice(17,20)}-${e.slice(20,32)}`},save:()=>[t>>>0,n>>>0,r>>>0,i>>>0]}}function Be(e){let t=e>>>0,n=()=>{t=t+2654435769|0;let e=t;return e=Math.imul(e^e>>>16,2246822507),e=Math.imul(e^e>>>13,3266489909),(e^e>>>16)>>>0},r=ze([n(),n(),n(),n()]);for(let e=0;e<12;e++)r.next();return r.save()}var Ve={primary:null,special:{code:`cells`,label:`에너지 탄약`},destructive:{code:`antimatter`,label:`반물질`}},He={primary:1,special:1.2,destructive:.5};function Ue(e,t,n,r,i={}){let a=B(e,r.now);e.combat={where:n,foe:structuredClone(t),entId:i.entId,streetIdx:i.streetIdx,allies:i.allies??[],shield:a.maxShield,maxShield:a.maxShield,turn:0,rewards:[],events:[{text:`${t.name}(Lv.${t.level})와(과) 교전을 시작했다`}]}}function We(e,t,n){let r=Math.min(e.shield,t*n);e.shield=A(e.shield-r),e.hp=Math.max(0,A(e.hp-(t-r/n)))}function Ge(e,t,n,r){let i=r.rng,a=e.foe;if(i.chance(a.evade/100)){e.events.push({text:`${a.name}이(가) 피했다`,target:`foe`,miss:!0,hp:a.hp,shield:a.shield});return}let o=t.dmg[n]*i.between(.9,1.1),s=i.chance(t.crit/100);s&&(o*=t.critDmg/100),o=Math.max(1,A(o*(1-a.defPct/100))),We(a,o,He[n]);let c=n===`primary`?`주무기`:n===`special`?`특수무기`:`파괴무기`;e.events.push({text:`${c}로 ${o} 피해${s?` (치명타!)`:``}`,target:`foe`,dmg:o,crit:s,hp:a.hp,shield:a.shield}),a.hp>0&&i.chance(t.stun/100)&&(a.stunned=!0,e.events.push({text:`${a.name}이(가) 기절했다`,target:`foe`,hp:a.hp,shield:a.shield}))}function Ke(e,t){let n=e.foe;for(let r of e.allies){if(r.hp<=0||n.hp<=0)continue;let i=A(r.atk*t.rng.between(.85,1.15)*(1-n.defPct/100));We(n,i,1),e.events.push({text:`${r.name}: ${i} 피해`,target:`foe`,dmg:i,hp:n.hp,shield:n.shield})}}function qe(e,t,n,r){let i=r.rng,a=t.foe;if(a.stunned){a.stunned=!1,t.events.push({text:`${a.name}은(는) 기절해서 움직이지 못한다`});return}let o=a.atk*i.between(.9,1.1),s=i.chance(a.crit/100);s&&(o*=a.critDmg/100);let c=t.allies.map((e,t)=>({a:e,i:t})).filter(e=>e.a.hp>0);if(c.length&&i.chance(c.length/(c.length+1))){let{a:e,i:n}=i.pick(c),r=A(o*.9);e.hp=Math.max(0,e.hp-r),t.events.push({text:`${a.name} → ${e.name} ${r}${s?` (치명타)`:``}${e.hp===0?` — 쓰러졌다`:``}`,target:n,dmg:r,crit:s,hp:e.hp});return}if(i.chance(n.evade/100)){t.events.push({text:`${a.name}의 공격을 피했다`,target:`player`,miss:!0,hp:e.hp,shield:t.shield});return}let l=Math.max(1,A((o-n.armor)*(1-n.defPct/100))),u={hp:e.hp,shield:t.shield};We(u,l,1),e.hp=u.hp,t.shield=u.shield,t.events.push({text:`${a.name}에게 ${l} 피해를 입었다${s?` (치명타!)`:``}`,target:`player`,dmg:l,crit:s,hp:e.hp,shield:t.shield})}function Je(e,t,n){let r=e.combat;r||k(`전투 중이 아닙니다`),r.result&&k(`이미 끝난 전투입니다`);let i=B(e,n.now);if(r.events=[],r.turn++,t.t===`attack`){if(t.w!==`primary`){i.dmg[t.w]<=0&&k(`${t.w===`special`?`특수무기`:`파괴무기`}를 장착하지 않았습니다`);let n=Ve[t.w];F(e,n.code,1,n.label)}Ge(r,i,t.w,n)}else if(t.t===`useItem`){r.where===`street`&&k(`길거리 전투에서는 아이템을 쓸 수 없습니다`);let n=e.hotbar[t.slot];n??k(`빈 단축칸입니다`),F(e,re(n),1,_[n].name);let a=Math.min(i.maxHp-e.hp,_[n].heal);e.hp+=a,r.events.push({text:`${_[n].name}: 체력 +${a}`,target:`player`,heal:a,hp:e.hp,shield:r.shield})}else{let e=r.where===`street`?1:i.escape/100;if(n.rng.chance(e)){r.result=`fled`,r.events.push({text:`도주에 성공했다`});return}r.events.push({text:`도주 실패 (${Math.round(e*100)}%)`})}if(r.foe.hp<=0||(Ke(r,n),r.foe.hp<=0))return Ye(e,n);if(qe(e,r,i,n),e.hp>0&&i.regen>0){let t=Math.min(i.maxHp-e.hp,i.regen);t>0&&(e.hp+=t,r.events.push({text:`재생 +${t}`,target:`player`,heal:t,hp:e.hp,shield:r.shield}))}e.hp<=0&&Ze(e,n)}function Ye(e,t){let n=e.combat,{now:r}=t,i=t.rng,a=n.foe;if(n.result=`win`,n.events.push({text:`${a.name}을(를) 쓰러뜨렸다!`,target:`foe`,hp:0,shield:0}),e.stats.kills++,a.rank===`boss`&&e.stats.bossKills++,n.where===`raid`){e.stats.raidWins++;let t=120*e.level,a=A(R(e.level)*.5);e.credits+=t,le(e,a,r),n.rewards=[`경험치 +${a}`,`¥${t}`];for(let t=0;t<2;t++){let t=i.chance(.5)?`weapon`:`armor`,r=V(i,e.level,1,`hq`);P(e,L(t,r),1),n.rewards.push(`${t===`weapon`?`무기`:`방어구`} 상자(${ke(r)})`)}let o=i.pick([`primary`,`special`,`destructive`,`helmet`,`upper`,`lower`,`boots`]);n.rewards.push(xe(e,he(i,o,e.level,V(i,e.level,1.5,`rare`),`raid`,r),r)),M(e,`레이드 승리! ${n.rewards.join(`, `)}`,`loot`,r);return}let o=Ee(a,e.level),s=e.dungeon?.challenge??!1,c=e.credits,l=e.level-a.level>10?[`(레벨 차이가 커서 전리품 없음)`]:De(e,i,a.level,a.rank,n.where,s,r);if(le(e,o,r),n.rewards=[`경험치 +${o}`,...l],Ne(e,`kill`),n.where===`street`&&e.street&&n.streetIdx!=null){Ne(e,`street`);let t=y[e.street.station].areas[e.street.area];e.street.foes[n.streetIdx]=Te(i,e.street.station,i.int(t.min,t.max),`normal`,.15)}if(n.where===`dungeon`&&e.dungeon){let r=e.dungeon,i=r.rooms[r.cur],a=i.ents.find(e=>e.id===n.entId);a&&(a.done=!0),r.loot.xp+=o,r.loot.credits+=e.credits-c,i.ents.some(e=>e.k===`foe`&&!e.done)||(n.rewards.push(`방 정리 — 문이 열렸다`),i.kind===`treasure`&&!r.cleared&&Xe(e,t))}}function Xe(e,t){let n=e.dungeon,{now:r}=t;n.cleared=!0;let i=Math.max(1,r-n.startedAt);e.stats.dungeonClears++,n.challenge&&e.stats.challengeClears++,Ne(e,`dungeon`);let a=A(R(e.level)*(n.challenge?.25:.15)),o=A((20+8*n.level)*(n.challenge?2:1));e.credits+=o,le(e,a,r);let s=e.records.find(e=>e.station===n.station&&e.dungeon===n.idx&&e.challenge===n.challenge);s||(s={station:n.station,dungeon:n.idx,challenge:n.challenge,clears:0,firstAt:r},e.records.push(s)),s.clears++;let c=s.bestMs==null||i<s.bestMs;c&&(s.bestMs=i,s.bestAt=r);let l=y[n.station].dungeons[n.idx].name,u=`${Math.floor(i/6e4)}분 ${Math.floor(i%6e4/1e3)}초`;e.combat?.rewards.push(`던전 정리 보너스: 경험치 +${a}, ¥${o}`,`기록 ${u}${c?` (최고 기록!)`:``}`),M(e,`${l}${n.challenge?`(도전)`:``} 보물방 정리! ${u}${c?` — 최고 기록`:``}`,`good`,r)}function Ze(e,t){let n=e.combat,{now:r}=t;n.result=`lose`,e.stats.deaths++;let i=[];if(e.level>=5){let t=Math.floor(e.credits*.1),n=Math.min(e.xp,Math.floor(R(e.level)*.1));e.credits-=t,e.xp-=n,e.totalXp-=n,i.push(`¥${t} 손실`,`경험치 -${n}`)}e.flatlineUntil=r+1e4,e.hp=A(B(e,r).maxHp*.3),e.hpAt=e.flatlineUntil,e.dungeon=void 0,e.street=void 0,e.loc=`town`,n.rewards=[`FLATLINE — 10초 동안 행동할 수 없다`,...i],M(e,`플랫라인. ${i.join(`, `)||`잃은 것 없음`}`,`bad`,r)}function Qe(e){let t=e.combat;if(t||k(`전투 중이 아닙니다`),t.result||k(`전투가 아직 끝나지 않았습니다`),t.result===`fled`){let n={...t.foe,stunned:!1};if(t.where===`dungeon`&&e.dungeon){let r=e.dungeon.rooms[e.dungeon.cur].ents.find(e=>e.id===t.entId);r&&(r.foe=n)}t.where===`street`&&e.street&&t.streetIdx!=null&&(e.street.foes[t.streetIdx]=n)}e.combat=void 0}function $e(e,t,n){let r=B(e,n.now),i=[...te];return Array.from({length:t},()=>{let e=i.splice(n.rng.int(0,i.length-1),1)[0],t=A(r.maxHp*.7);return{name:e,hp:t,maxHp:t,atk:A(Math.max(r.dmg.primary,r.dmg.special*.8)*.75)}})}var H=[`n`,`s`,`e`,`w`],U={n:[0,-1],s:[0,1],e:[1,0],w:[-1,0]},et={n:`s`,s:`n`,e:`w`,w:`e`},W={n:[7,0],s:[7,10],w:[0,5],e:[14,5]},tt={n:[7,1],s:[7,9],w:[1,5],e:[13,5]},nt=[7,5],G=(e,t)=>`${e},${t}`;function rt(e,t){let n=new Set([G(...nt)]),r=[nt];for(;r.length;){let[i,a]=r.shift();for(let o of H){let s=i+U[o][0],c=a+U[o][1],l=G(s,c),u=e[c]?.[s];!u||u===`#`||n.has(l)||t.has(l)||(n.add(l),u!==`+`&&r.push([s,c]))}}return n}function it(e,t,n){for(let r=0;r<30;r++){let i=Array.from({length:11},(e,t)=>Array.from({length:15},(e,n)=>n===0||t===0||n===14||t===10?`#`:`.`));for(let e of H)t[e]!=null&&(i[W[e][1]][W[e][0]]=`+`);if(n&&r<25){let t=e.int(3,6);for(let n=0;n<t;n++){let t=e.chance(.5),n=e.int(1,3),r=e.int(2,12),a=e.int(2,8);for(let e=0;e<n;e++){let n=t?r+e:r,o=t?a:a+e;n<2||n>12||o<2||o>8||Math.abs(n-nt[0])<=1&&Math.abs(o-nt[1])<=1||Object.values(tt).some(([e,t])=>Math.abs(e-n)+Math.abs(t-o)<=1)||(i[o][n]=`#`)}}}let a=i.map(e=>e.join(``)),o=rt(a,new Set);if(a.flatMap((e,t)=>[...e].map((e,n)=>e===`.`||e===`+`?G(n,t):``)).filter(Boolean).every(e=>o.has(e)))return a}return it(e,t,!1)}function at(e,t,n){let r=new Set([G(...nt),...Object.values(tt).map(([e,t])=>G(e,t))]),i=t.flatMap((e,t)=>[...e].map((e,n)=>e===`.`&&!r.has(G(n,t))?[n,t]:null)).filter(e=>!!e);for(let r=0;r<40;r++){let r=[...i],a=n.map(t=>{let[n,i]=r.splice(e.int(0,r.length-1),1)[0];return{...t,x:n,y:i}}),o=rt(t,new Set(a.filter(e=>e.k!==`foe`).map(e=>G(e.x,e.y)))),s=H.every(e=>t[W[e][1]][W[e][0]]!==`+`||o.has(G(...W[e]))),c=a.every(e=>H.some(t=>o.has(G(e.x+U[t][0],e.y+U[t][1]))));if(s&&c)return a}return at(e,it(e,{},!1),n)}function ot(e,t,n,r,i){let a=y[t].dungeons[n].level+(r?2:0),o=e.int(6,8)+(r?2:0),s=[{gx:0,gy:0,doors:{}}],c=new Map([[G(0,0),0]]);for(let t=0;s.length<o&&t<500;t++){let t=e.int(0,s.length-1),n=e.pick(H),r=s[t].gx+U[n][0],i=s[t].gy+U[n][1];if(c.has(G(r,i)))continue;let a=s.push({gx:r,gy:i,doors:{}})-1;c.set(G(r,i),a),s[t].doors[n]=a,s[a].doors[et[n]]=t}s.forEach((t,n)=>{for(let r of H){let i=c.get(G(t.gx+U[r][0],t.gy+U[r][1]));i!=null&&t.doors[r]==null&&e.chance(.15)&&(t.doors[r]=i,s[i].doors[et[r]]=n)}});let l=s.map(()=>-1);l[0]=0;let u=[0];for(;u.length;){let e=u.shift();for(let t of Object.values(s[e].doors))t!=null&&l[t]<0&&(l[t]=l[e]+1,u.push(t))}let d=l.indexOf(Math.max(...l)),f=s.map((e,t)=>t).filter(e=>e!==0&&e!==d),p=e.pick(f),m=new Set([e.pick(f),e.pick(f),0]),h=.2+(r?.15:0);return{station:t,idx:n,challenge:r,level:a,rooms:s.map((n,i)=>{let o=i===0?`start`:i===d?`treasure`:`normal`,s=[],c=e=>`${i}-${e}-${s.length}`,l=(n,r)=>s.push({id:c(`f`),k:`foe`,foe:Te(e,t,Math.max(1,r),n,h)});if(o===`normal`){let t=e.int(r?2:1,3);for(let n=0;n<t;n++)l(`normal`,a+e.int(-1,1));e.chance(.55)&&s.push({id:c(`c`),k:`crate`})}if(o===`treasure`){for(let t=0;t<3;t++)l(`normal`,a+e.int(0,1));l(r?`boss`:`elite`,a+2),s.push({id:c(`c`),k:`crate`},{id:c(`c`),k:`crate`},{id:c(`g`),k:`frag`})}i===p&&s.push({id:c(`q`),k:`quest`}),m.has(i)&&s.push({id:c(`l`),k:`lore`,lore:e.int(0,b.length-1)});let u=it(e,n.doors,o!==`start`);return{gx:n.gx,gy:n.gy,doors:n.doors,kind:o,visited:i===0,walls:u,ents:at(e,u,s)}}),cur:0,x:nt[0],y:nt[1],startedAt:i,cleared:!1,loot:{credits:0,xp:0,items:0}}}var st=e=>e.ents.filter(e=>e.k===`foe`&&!e.done),ct=(e,t,n)=>e.ents.some(e=>e.x===t&&e.y===n&&!e.done);function lt(e,t,n){let r=G(...n),i=new Map([[G(...t),[``,`n`]]]),a=[t];for(;a.length;){let[t,n]=a.shift();if(G(t,n)===r)break;for(let o of H){let s=t+U[o][0],c=n+U[o][1],l=G(s,c),u=e.walls[c]?.[s];u&&u!==`#`&&!i.has(l)&&(l===r||u!==`+`&&!ct(e,s,c))&&(i.set(l,[G(t,n),o]),a.push([s,c]))}}if(!i.has(r))return null;let o=[];for(let e=r;e!==G(...t);){let[t,n]=i.get(e);o.unshift(n),e=t}return o}function ut(e,t){let n=[{code:`med`,n:e.int(2,5)},{code:`ammoparts`,n:e.int(2,5)},{code:`scrap`,n:e.int(3,6)},{code:`cells`,n:e.int(8,20)},{code:`heal:0`,n:e.int(2,4)}],r=t<15?1:t<35?2:3,i=e.pick([`over`,`plate`,`ward`]);return{who:e.pick(x),line:e.pick(S),want:e.pick(n),buff:`${i}${r}`,minutes:e.int(20,45)}}var dt=14,ft=1e4;function pt(e,t,n){return{kind:`sync`,entId:t,seq:Array.from({length:dt},()=>e.pick(H)),startedAt:n,limitMs:ft}}function mt(e,t,n,r){let i=e.dungeon,a=e.credits,o=De(e,n.rng,i.level,`normal`,`crate`,i.challenge,n.now);r&&(P(e,`cells`,3),o.push(`동기화 보너스: 에너지 탄약 ×3`)),i.loot.credits+=e.credits-a,t.done=!0,e.stats.cratesOpened++,Ne(e,`crate`),M(e,`상자: ${o.join(`, `)}`,`loot`,n.now)}function ht(e,t,n,r,i){let a=y[t]?.dungeons[n];a||k(`없는 던전입니다`),t>e.unlocked&&k(`아직 열리지 않은 구역입니다. 터미널에서 열쇠를 만드세요`),(e.dungeon||e.combat)&&k(`이미 다른 곳에 있습니다`);let o=a.level+(r?2:0);e.level<o-6&&k(`레벨이 너무 낮습니다 (Lv.${o-6} 이상)`),e.street=void 0,e.dungeon=ot(i.rng,t,n,r,i.now),e.loc=`dungeon`,M(e,`${a.name}${r?`(도전)`:``}에 접속했다. 방 ${e.dungeon.rooms.length}개`,`info`,i.now)}function gt(e,t){let n=e.dungeon;n||k(`던전에 있지 않습니다`),(e.combat||e.modal)&&k(`지금은 나갈 수 없습니다`),e.dungeon=void 0,e.loc=`town`,M(e,`던전에서 나왔다. 이번 진입: 경험치 +${n.loot.xp}, ¥${n.loot.credits}`,`info`,t.now)}function _t(e,t,n){let r=e.dungeon;if(!r||e.combat||e.modal||e.loc!==`dungeon`)return;let i=r.rooms[r.cur],a=r.x+U[t][0],o=r.y+U[t][1],s=i.walls[o]?.[a];if(!s||s===`#`)return;if(s===`+`){let t=H.find(e=>W[e][0]===a&&W[e][1]===o);if(st(i).length){M(e,`적이 남아 있어 문이 잠겨 있다`,`bad`,n.now);return}let s=i.doors[t];r.cur=s,[r.x,r.y]=tt[et[t]];let c=r.rooms[s];c.visited||(c.visited=!0,c.kind===`treasure`&&M(e,`보물방이다. 강한 기척이 느껴진다`,`bad`,n.now));return}let c=i.ents.find(e=>e.x===a&&e.y===o&&!e.done);if(c){if(c.k===`foe`){Ue(e,c.foe,`dungeon`,n,{entId:c.id});return}if(c.k===`crate`||c.k===`frag`){if(st(i).length){M(e,`적부터 처리해야 열 수 있다`,`bad`,n.now);return}if(c.k===`frag`)P(e,ie(r.station,r.idx),1),c.done=!0,M(e,`열쇠 조각 ${y[r.station].dungeons[r.idx].fragment}을(를) 얻었다`,`loot`,n.now);else if(n.rng.chance(.25)){e.modal=pt(n.rng,c.id,n.now);return}else mt(e,c,n,!1)}else if(c.k===`quest`){c.offer??=ut(n.rng,r.level),e.modal={kind:`giver`,entId:c.id,...c.offer};return}else if(c.k===`lore`){c.done=!0,e.modal={kind:`lore`,text:b[c.lore??0]};return}}r.x=a,r.y=o}var vt=(e,t)=>e.dungeon?.rooms[e.dungeon.cur].ents.find(e=>e.id===t);function yt(e,t,n){let r=e.modal;r?.kind!==`sync`&&k(`진행 중인 동기화가 없습니다`);let i=vt(e,r.entId);i||k(`상자를 찾을 수 없습니다`),(!(n.now-r.startedAt<=r.limitMs+3e3)||t.length!==r.seq.length||t.some((e,t)=>e!==r.seq[t]))&&k(`동기화 실패 — 다시 시도하거나 포기하세요`),e.modal=void 0,mt(e,i,n,!0)}function bt(e,t){let n=e.modal;n?.kind!==`sync`&&k(`진행 중인 동기화가 없습니다`),e.modal=pt(t.rng,n.entId,t.now)}function xt(e,t){let n=e.modal;n?.kind!==`sync`&&k(`진행 중인 동기화가 없습니다`);let r=vt(e,n.entId);r&&(r.done=!0),e.modal=void 0,M(e,`잠금 해제에 실패해 상자가 자폭했다`,`bad`,t.now)}function St(e,t,n){let r=e.modal;if(r?.kind!==`giver`&&k(`대화 중이 아닙니다`),!t){e.modal=void 0;return}let i=r.want.code.startsWith(`heal`)?`진통 패치`:r.want.code===`med`?`의료 부품`:r.want.code===`ammoparts`?`탄약 부품`:r.want.code===`scrap`?`고철`:`에너지 탄약`;F(e,r.want.code,r.want.n,i);let a=C.find(e=>e.id===r.buff);e.buffs=e.buffs.filter(e=>e.id!==r.buff),e.buffs.push({id:r.buff,until:n.now+r.minutes*6e4});let o=vt(e,r.entId);o&&(o.done=!0),e.modal=void 0;let s=A(R(e.level)*.03);le(e,s,n.now),M(e,`${r.who}에게 ${i} ${r.want.n}개를 건넸다. ${a.label} ${r.minutes}분, 경험치 +${s}`,`good`,n.now)}function K(e,t,n){e.combat&&k(`전투 중입니다`),e.dungeon&&k(`던전 안에서는 ${n}할 수 없습니다`),e.flatlineUntil&&t.now<e.flatlineUntil&&k(`플랫라인 중입니다. 잠시 기다리세요`)}function Ct(e,t,n,r){K(e,r,`이동`);let i=y[t]?.areas[n];i||k(`없는 지역입니다`),t>e.unlocked&&k(`아직 열리지 않은 구역입니다`),e.street={station:t,area:n,foes:Array.from({length:4},()=>Te(r.rng,t,r.rng.int(i.min,i.max),`normal`,.15))},e.loc=`street`}function wt(e,t,n){e.street||k(`길거리에 있지 않습니다`),e.combat&&k(`이미 전투 중입니다`),e.flatlineUntil&&n.now<e.flatlineUntil&&k(`플랫라인 중입니다`);let r=e.street.foes[t];r||k(`없는 적입니다`),Ue(e,r,`street`,n,{streetIdx:t})}function Tt(e){e.combat&&k(`전투 중입니다`),e.street=void 0,e.loc===`street`&&(e.loc=`town`)}var Et=(e,t)=>e.items.find(e=>e.id===t)??k(`없는 아이템입니다`);function Dt(e,t){e.combat&&k(`전투 중에는 장비를 바꿀 수 없습니다`);let n=Et(e,t);if(n.kind===`gear`&&n.slot||k(`장비가 아닙니다`),!n.equipped){n.level>e.level&&k(`Lv.${n.level} 장비는 아직 쓸 수 없습니다`);for(let t of e.items)t.equipped&&t.slot===n.slot&&(t.equipped=!1);n.equipped=!0}}function Ot(e,t){e.combat&&k(`전투 중에는 장비를 바꿀 수 없습니다`);let n=Et(e,t);n.equipped&&=(be(e)>=e.bagCap&&k(`가방이 가득 찼습니다`),!1)}function kt(e,t){t.equipped&&k(`장착 중인 장비입니다. 먼저 해제하세요`),t.installedIn&&k(`장비에 끼워진 모듈입니다. 먼저 빼세요`);for(let n of e.items)n.installedIn===t.id&&(n.installedIn=void 0);e.items=e.items.filter(e=>e!==t)}function At(e,t,n){K(e,n,`판매`);let r=Et(e,t);kt(e,r);let i=ye(r);e.credits+=i,M(e,`${r.name} 판매: ¥${i}`,`info`,n.now)}function jt(e,t,n){K(e,n,`분해`);let r=Et(e,t);kt(e,r);let i=1+j(r.rarity)*2+Math.floor(r.level/10);P(e,`scrap`,i),z(e,`printing`,3,n.now),M(e,`${r.name} 분해: 고철 ×${i}, 인쇄 경험 +3`,`info`,n.now)}function Mt(e,t,n){e.combat&&k(`전투 중입니다`);let r=Et(e,t),i=Et(e,n);(r.kind!==`module`||i.kind!==`gear`)&&k(`모듈을 장비에 끼워야 합니다`),r.installedIn&&k(`이미 끼워진 모듈입니다`),r.level>i.level&&k(`모듈 레벨(${r.level})이 장비 레벨(${i.level})보다 높습니다`),e.items.filter(e=>e.installedIn===i.id).length>=i.modSlots&&k(`빈 모듈 칸이 없습니다`),r.installedIn=i.id}function Nt(e,t){e.combat&&k(`전투 중입니다`);let n=Et(e,t);n.installedIn&&=(be(e)>=e.bagCap&&k(`가방이 가득 찼습니다`),void 0)}function Pt(e,t,n){(t<0||t>2)&&k(`없는 단축칸입니다`),n!=null&&!_[n]&&k(`없는 회복제입니다`),e.hotbar[t]=n}var Ft={trash:1,common:1.6,hq:2.6,rare:4.5,legendary:8,epic:14},It={trash:6,common:10,hq:18,rare:32,legendary:60,epic:110},Lt=e=>Math.min(e.skills.printing.lv,e.level),Rt=(e,t)=>A((10+4*Lt(e))*Ft[t]);function zt(e,t,n,r){K(e,r,`인쇄`),i.includes(n)||k(`없는 등급입니다`);let a=L(t,n);N(e,a)<1&&k(`그 상자가 없습니다`),be(e)>=e.bagCap&&k(`가방이 가득 찼습니다`),I(e,Rt(e,n)),F(e,a,1,`상자`);let o=t===`weapon`?l:[`helmet`,`upper`,`lower`,`boots`],s=he(r.rng,r.rng.pick(o),Lt(e),n,`print`,r.now);xe(e,s,r.now),z(e,`printing`,It[n],r.now),e.stats.itemsPrinted++,Ne(e,`print`),M(e,`인쇄 완료: ${s.name} (Lv.${s.level} ${ke(n)})`,`loot`,r.now)}var Bt=e=>25*e.level;function Vt(e,t,n,r){e.combat&&k(`전투 중입니다`);let i=e.skills.ammo.lv;if(t===`heal`){let t=_[n]??k(`없는 회복제입니다`);e.skills.medical.lv<t.med&&k(`의료 숙련도 ${t.med}이(가) 필요합니다`),F(e,`med`,t.parts,`의료 부품`),P(e,re(n),1),z(e,`medical`,2+2*n,r.now)}else if(t===`cells`)F(e,`ammoparts`,1,`탄약 부품`),P(e,`cells`,3+Math.floor(i/8)),z(e,`ammo`,1,r.now);else if(t===`antimatter`)N(e,`scrap`)<1&&k(`고철이 부족합니다`),F(e,`ammoparts`,3,`탄약 부품`),F(e,`scrap`,1,`고철`),P(e,`antimatter`,1+Math.floor(i/15)),z(e,`ammo`,2,r.now);else if(t===`module`){be(e)>=e.bagCap&&k(`가방이 가득 찼습니다`),N(e,`scrap`)<12&&k(`고철이 부족합니다 (${N(e,`scrap`)}/12)`),I(e,Bt(e)),F(e,`scrap`,12,`고철`);let t=_e(r.rng,e.level,V(r.rng,e.level,.2),`craft`,r.now);xe(e,t,r.now),M(e,`모듈 조립: ${t.name} (${ke(t.rarity)})`,`loot`,r.now)}else k(`없는 제작법입니다`);Ne(e,`craft`)}var Ht=e=>A(10*(3+.1*e.level)),Ut=e=>A(3*(18+e.level)),Wt={med:15,ammoparts:12},Gt=e=>Math.min(_.length-1,e.unlocked+1);function Kt(e,t,n,r,i){let a=he(e,e.pick([`primary`,`special`,`destructive`,`helmet`,`upper`,`lower`,`boots`]),t.level,n,`shop`,r);return{id:a.id,kind:`gear`,item:a,price:A(ye(a)*i)}}function qt(e,t,n=!1){let r=Math.floor(t.now/36e5);if(!n&&e.smith?.hour===r&&e.smith.level===e.level)return;let i=t.rng,a=Array.from({length:5},()=>{let n=V(i,e.level,.3,`common`);return Kt(i,e,j(n)>3?`rare`:n,t.now,3)});e.smith={hour:r,level:e.level,offers:a}}function Jt(e,t,n){K(e,n,`구매`),$t(e,e.smith?.offers,t,n)}function Yt(e,t){K(e,t,`구매`),I(e,20*e.level),qt(e,t,!0)}function Xt(e,t,n){K(e,n,`구매`),t===`cells`?(I(e,Ht(e)),P(e,`cells`,10)):(I(e,Ut(e)),P(e,`antimatter`,3))}function Zt(e,t,n,r){K(e,r,`구매`),(t>Gt(e)||!_[t])&&k(`아직 팔지 않는 약입니다`),(n<1||n>20)&&k(`수량은 1~20입니다`),I(e,_[t].price*n),P(e,re(t),n)}function Qt(e,t,n){K(e,n,`구매`),I(e,Wt[t]*5),P(e,t,5)}function $t(e,t,n,r){let i=t?.find(e=>e.id===n)??k(`없는 상품입니다`);i.sold&&k(`이미 팔린 상품입니다`),i.kind===`gear`&&be(e)>=e.bagCap&&k(`가방이 가득 찼습니다`),I(e,i.price),i.sold=!0,i.kind===`gear`?(e.items.push({...i.item,at:r.now}),M(e,`구매: ${i.item.name} ¥${i.price}`,`loot`,r.now)):(P(e,i.code,i.n),M(e,`구매: ${i.label} ¥${i.price}`,`loot`,r.now))}function en(e,t){let n=oe(t.now,t.utcOffsetMin);if(e.market?.day===n)return;let r=t.rng,i=e.level,a=Array.from({length:4},()=>Kt(r,e,V(r,i,.6,`hq`),t.now,3));for(let e=0;e<2;e++){let e=r.chance(.5)?`weapon`:`armor`,t=V(r,i,.8,`hq`);a.push({id:r.uuid(),kind:`stack`,code:L(e,t),n:1,label:`${e===`weapon`?`무기`:`방어구`} 상자(${ke(t)})`,price:A((10+4*i)*Ft[t]*6)})}let o=Gt(e);a.push({id:r.uuid(),kind:`stack`,code:re(o),n:5,label:`${_[o].name} ×5 (20% 할인)`,price:A(_[o].price*5*.8)}),a.push({id:r.uuid(),kind:`stack`,code:`cells`,n:30,label:`에너지 탄약 ×30 (30% 할인)`,price:A(Ht(e)*3*.7)}),a.push({id:r.uuid(),kind:`stack`,code:`antimatter`,n:6,label:`반물질 ×6 (30% 할인)`,price:A(Ut(e)*2*.7)}),e.market={day:n,level:i,offers:a}}function tn(e,t,n){K(e,n,`구매`),en(e,n),$t(e,e.market?.offers,t,n)}var nn=e=>150*(e+1)**2;function rn(e,t,n){K(e,n,`열쇠 합성`),(t!==e.unlocked||t>=y.length-1)&&k(`지금 만들 수 있는 열쇠가 아닙니다`);for(let n=0;n<3;n++)N(e,ie(t,n))<1&&k(`${y[t].dungeons[n].name}의 조각이 없습니다`);I(e,nn(t));for(let n=0;n<3;n++)P(e,ie(t,n),-1);e.unlocked++,M(e,`비밀 열쇠 완성. ${y[e.unlocked].name} 노선이 열렸다!`,`good`,n.now)}var an=18e4;function on(e,t){K(e,t,`해킹`),e.modal&&k(`다른 창이 열려 있습니다`),(e.iceUntil??0)>t.now&&k(`ICE가 재정렬 중입니다. 잠시 뒤에 다시 시도하세요`),e.iceUntil=t.now+an,e.modal={kind:`ice`,code:Array.from({length:4},()=>t.rng.int(0,5)),guesses:[],max:7}}function sn(e,t,n){let r=e.modal;(r?.kind!==`ice`||r.done)&&k(`진행 중인 해킹이 없습니다`),(t.length!==4||t.some(e=>!Number.isInteger(e)||e<0||e>5))&&k(`0~5 숫자 4개를 입력하세요`);let i=0,a=[],o=[];t.forEach((e,t)=>e===r.code[t]?i++:(a.push(r.code[t]),o.push(e)));let s=0;for(let e of o){let t=a.indexOf(e);t>=0&&(s++,a.splice(t,1))}if(r.guesses.push({g:t,exact:i,near:s}),i===4){r.done=`won`;let t=25+10*e.level;e.credits+=t,P(e,`ammoparts`,2),P(e,`med`,1),e.stats.iceCracked++,Ne(e,`ice`);let i=``;if(n.rng.chance(.15)){let t=V(n.rng,e.level,0,`common`),r=n.rng.chance(.5)?`weapon`:`armor`;P(e,L(r,t),1),i=`, ${r===`weapon`?`무기`:`방어구`} 상자(${ke(t)})`}M(e,`ICE 돌파! ¥${t}, 탄약 부품 ×2, 의료 부품 ×1${i}`,`loot`,n.now)}else r.guesses.length>=r.max&&(r.done=`lost`,M(e,`ICE 크래킹 실패. 코드는 ${r.code.join(``)}였다`,`bad`,n.now))}function cn(e){let t=e.modal;t&&(t.kind===`sync`&&k(`상자 잠금을 풀거나 포기하세요`),t.kind===`giver`&&k(`수락하거나 거절하세요`),e.modal=void 0)}function ln(e,t,n,r){e.job&&k(`이미 일감을 하고 있습니다`),w.some(e=>e.id===t)||k(`없는 일감입니다`),T.includes(n)||k(`없는 시간입니다`),e.job={id:t,startedAt:r.now,endsAt:r.now+n*6e4}}function un(e,t){let n=e.job??k(`하고 있는 일감이 없습니다`),r=(Math.min(t.now,n.endsAt)-n.startedAt)/6e4;if(e.job=void 0,r<1){M(e,`일감을 취소했다`,`info`,t.now);return}let i=(e.overclockUntil??0)>t.now?1.5:1,a=r*i,o=e.level,s=[],c=(t,n,r)=>{n>0&&(P(e,t,n),s.push(`${r} ×${n}`))};switch(n.id){case`print`:z(e,`printing`,A(.8*a),t.now),s.push(`인쇄 경험 +${A(.8*a)}`);break;case`med`:z(e,`medical`,A(.5*a),t.now),s.push(`의료 경험 +${A(.5*a)}`),c(`med`,Math.floor(.15*a),`의료 부품`);break;case`ammo`:z(e,`ammo`,A(.5*a),t.now),s.push(`탄약 경험 +${A(.5*a)}`),c(`ammoparts`,Math.floor(.25*a),`탄약 부품`);break;case`scav`:c(`scrap`,Math.floor(.3*a),`고철`),c(`med`,Math.floor(.05*a),`의료 부품`),c(`ammoparts`,Math.floor(.08*a),`탄약 부품`);for(let e=0;e<Math.floor(a/30);e++){let e=V(t.rng,o,0,`trash`),n=t.rng.chance(.5)?`weapon`:`armor`;c(L(n,j(e)>1?`common`:e),1,`${n===`weapon`?`무기`:`방어구`} 상자`)}break;case`guard`:{let n=A((1+.5*o)*a),r=A((.4+.25*o)*a);e.credits+=n,le(e,r,t.now),s.push(`¥${n}`,`경험치 +${r}`);break}}M(e,`일감 정산 (${Math.floor(r)}분${i>1?`, 오버클럭 ×1.5`:``}): ${s.join(`, `)||`없음`}`,`loot`,t.now)}function dn(e,t,n){let r=e.quests.find(e=>e.id===t)??k(`없는 퀘스트입니다`);r.have<r.need&&k(`아직 끝나지 않은 퀘스트입니다`),e.quests=e.quests.filter(e=>e!==r),e.credits+=r.credits,le(e,r.xp,n.now),M(e,`퀘스트 보상: ¥${r.credits}, 경험치 +${r.xp}`,`good`,n.now),Me(e,n.rng)}var fn=e=>100*e.level;function pn(e,t){I(e,fn(e)),e.overclockUntil=Math.max(t.now,e.overclockUntil??0)+18e5,M(e,`오버클럭 가동: 30분간 피해 +20%, 일감 보상 ×1.5`,`good`,t.now)}var mn=e=>40*e.level,hn={hp:16,atk:1.6,shield:.35},gn=(e,t)=>e.raidDay!==oe(t.now,t.utcOffsetMin);function _n(e,t,n){K(e,n,`레이드`),gn(e,n)||k(`오늘 레이드는 끝났습니다. 내일 09:00에 다시 열립니다`),(!Number.isInteger(t)||t<0||t>2)&&k(`용병은 0~2명입니다`),I(e,t*mn(e)),e.raidDay=oe(n.now,n.utcOffsetMin),e.stats.raidAttempts++;let r=n.rng,i=e.level,a=Te(r,Math.min(e.unlocked,y.length-1),i,`boss`,0),o=A(Ce(i)*hn.hp*r.between(.9,1.1)),s=A(o*hn.shield),c={...a,name:r.pick(ee),hp:o,maxHp:o,shield:s,maxShield:s,atk:A(we(i)*hn.atk*10)/10};Ue(e,c,`raid`,n,{allies:$e(e,t,n)}),M(e,`레이드 시작: ${c.name}. 용병 ${t}명`,`info`,n.now)}function vn(e,t,n){if(e.flatlineUntil&&n.now<e.flatlineUntil&&![`combat.close`,`modal.close`,`sync`,`hotbar`,`equip`,`unequip`,`mod.install`,`mod.remove`,`quest.claim`,`job.claim`,`job.start`].includes(t.t))throw new O(`플랫라인 중입니다. 잠시 기다리세요`);switch(t.t){case`move`:return _t(e,t.dir,n);case`attack`:case`useItem`:case`escape`:return Je(e,t,n);case`combat.close`:return Qe(e);case`dungeon.enter`:return ht(e,t.station,t.dungeon,t.challenge,n);case`dungeon.leave`:return gt(e,n);case`sync.submit`:return yt(e,t.inputs,n);case`sync.retry`:return bt(e,n);case`sync.abandon`:return xt(e,n);case`giver`:return St(e,t.accept,n);case`modal.close`:return cn(e);case`street.enter`:return Ct(e,t.station,t.area,n);case`street.fight`:return wt(e,t.idx,n);case`street.leave`:return Tt(e);case`equip`:return Dt(e,t.id);case`unequip`:return Ot(e,t.id);case`sell`:return At(e,t.id,n);case`scrap`:return jt(e,t.id,n);case`mod.install`:return Mt(e,t.mod,t.gear);case`mod.remove`:return Nt(e,t.mod);case`hotbar`:return Pt(e,t.slot,t.tier);case`print`:return zt(e,t.kind,t.rarity,n);case`craft`:return Vt(e,t.recipe,t.tier,n);case`smith.buy`:return Jt(e,t.id,n);case`smith.refresh`:return Yt(e,n);case`smith.ammo`:return Xt(e,t.kind,n);case`pharm.buy`:return Zt(e,t.tier,t.n,n);case`pharm.parts`:return Qt(e,t.code,n);case`market.buy`:return tn(e,t.id,n);case`key.forge`:return rn(e,t.station,n);case`ice.start`:return on(e,n);case`ice.guess`:return sn(e,t.g,n);case`job.start`:return ln(e,t.id,t.minutes,n);case`job.claim`:return un(e,n);case`quest.claim`:return dn(e,t.id,n);case`overclock`:return pn(e,n);case`raid.start`:return _n(e,t.crew,n);case`sync`:return;default:throw new O(`알 수 없는 행동입니다`)}}function yn(e,t,n){let r=structuredClone(e),i=ze(r.rng),a={...n,rng:i};for(let e of t)Le(r,a),vn(r,e,a);Le(r,a),qt(r,a),en(r,a);for(let e of r.log)e.at===0&&(e.at=n.now);return r.rng=i.save(),r}function bn(e,t){let n=ze(Be(e)),r=Re(n,t.now),i={...t,rng:n};return qt(r,i),en(r,i),r.rng=n.save(),r}var xn=()=>({now:Date.now(),utcOffsetMin:-new Date().getTimezoneOffset()}),Sn=`arasaka-in-save-v2`;function Cn(){let e=new Uint32Array(1);return crypto.getRandomValues(e),e[0]}var wn=class{read(){try{let e=localStorage.getItem(Sn),t=e?JSON.parse(e):null;return t?.state?.v===2?t:null}catch{return null}}write(e){try{localStorage.setItem(Sn,JSON.stringify(e))}catch{}}async load(){return this.read()||this.reset()}async send(e,t){let n=this.read()??await this.reset();if(n.version!==e)throw new O(`다른 창에서 진행이 바뀌었습니다. 최신 상태를 불러왔습니다`);let r={state:yn(n.state,t,xn()),version:e+1};return this.write(r),r}async reset(){let e={state:bn(Cn(),xn()),version:0};return this.write(e),e}},q=n();function Tn(e){let t=2166136261;for(let n of e)t=Math.imul(t^n.charCodeAt(0),16777619);return()=>(t=Math.imul(t^t>>>15,2246822507),t=Math.imul(t^t>>>13,3266489909),((t^=t>>>16)>>>0)/4294967296)}function En(e,t){let n=Tn(`${e}:${t}`),r=[];for(let e=-20;e<1020;){let i=34+n()*(t?70:50),a=(t?90:150)+n()*(t?170:130),o=[];for(let r=300-a+14;r<290;r+=14)for(let a=e+6;a<e+i-8;a+=10)o.push({x:a,y:r,on:n()<(t?.18:.08)});r.push({x:e,w:i,h:a,windows:o,antenna:n()<.3}),e+=i+(n()<.25?n()*18:1)}return r}function Dn({title:e,tag:t,npc:n,lines:i,hue:a,glyph:o,children:s}){let c=(0,r.useMemo)(()=>En(e,0),[e]),l=(0,r.useMemo)(()=>En(e,1),[e]),u=(0,r.useMemo)(()=>{let t=Tn(`${e}:signs`);return Array.from({length:5},()=>({x:t()*960,y:70+t()*150,w:20+t()*60,h:4+t()*10,alt:t()<.4}))},[e]),[d]=(0,r.useState)(()=>i[Math.floor(Math.random()*i.length)]??``),f=350+(a%21-10),p=`hsl(${f} 70% 52%)`,m=`hsl(${f+8} 55% 42%)`;return(0,q.jsxs)(`section`,{className:`sc`,children:[(0,q.jsxs)(`svg`,{className:`sc-sky`,viewBox:`0 0 1000 300`,preserveAspectRatio:`xMidYMax slice`,"aria-hidden":!0,children:[(0,q.jsx)(`rect`,{width:`1000`,height:`300`,fill:`#1a1b1d`}),c.map((e,t)=>(0,q.jsxs)(`g`,{children:[(0,q.jsx)(`rect`,{x:e.x,y:300-e.h,width:e.w,height:e.h,fill:`#222427`}),e.windows.filter(e=>e.on).map((e,t)=>(0,q.jsx)(`rect`,{x:e.x,y:e.y,width:`4`,height:`5`,fill:`#5a5f63`,opacity:`0.5`},t))]},`b${t}`)),u.map((e,t)=>(0,q.jsx)(`rect`,{x:e.x,y:e.y,width:e.w,height:e.h,fill:e.alt?m:p,opacity:`0.85`},`s${t}`)),l.map((e,t)=>(0,q.jsxs)(`g`,{children:[(0,q.jsx)(`rect`,{x:e.x,y:300-e.h,width:e.w,height:e.h,fill:`#121314`}),e.antenna&&(0,q.jsx)(`rect`,{x:e.x+e.w/2,y:300-e.h-26,width:`2`,height:`26`,fill:`#121314`}),e.windows.filter(e=>e.on).map((e,t)=>(0,q.jsx)(`rect`,{x:e.x,y:e.y,width:`4`,height:`5`,fill:t%4?`#6b7074`:p,opacity:`0.55`},t))]},`f${t}`))]}),(0,q.jsx)(`div`,{className:`sc-dots`,"aria-hidden":!0}),o&&(0,q.jsx)(`span`,{className:`sc-emblem`,"aria-hidden":!0,children:o}),(0,q.jsx)(`h2`,{className:`sc-title`,children:e}),(d||s)&&(0,q.jsxs)(`div`,{className:`sc-dialog`,children:[t&&(0,q.jsxs)(`span`,{className:`sc-tag`,children:[`[`,t,`]`]}),n&&(0,q.jsxs)(`b`,{children:[n,`:`]}),d&&(0,q.jsx)(`p`,{children:d}),s]})]})}var On={ArrowUp:`up`,ArrowDown:`down`,ArrowLeft:`left`,ArrowRight:`right`,KeyW:`up`,KeyS:`down`,KeyA:`left`,KeyD:`right`},kn={Backquote:`bossKey`,Escape:`close`},An={menu:kn,dungeon:{...kn,...On},sync:{...kn,...On},combat:{...kn,Digit1:`weapon1`,Digit2:`weapon2`,Digit3:`weapon3`,Numpad1:`weapon1`,Numpad2:`weapon2`,Numpad3:`weapon3`,KeyQ:`item1`,KeyW:`item2`,KeyE:`item3`,KeyX:`escape`,Enter:`confirm`,Space:`confirm`}};function jn(e,t){let n=e.target;return n&&(n.tagName===`INPUT`||n.tagName===`TEXTAREA`||n.isContentEditable)?e.code===`Escape`?`close`:null:e.ctrlKey||e.metaKey||e.altKey?null:An[t][e.code]??null}var Mn=/\b(import|from|export|class|constructor|private|readonly|async|await|const|for|of|if|continue|return|new)\b/g;function Nn(e){let t=[],n=e.indexOf(`/**`)>=0?e.indexOf(`/**`):e.indexOf(`//`),r=n>=0?e.slice(0,n):e,i=0;for(let e of r.matchAll(RegExp(`${Mn.source}|'[^']*'|@\\w+`,`g`))){e.index>i&&t.push(r.slice(i,e.index));let n=e[0];t.push((0,q.jsx)(`span`,{className:n.startsWith(`'`)?`bk-str`:n.startsWith(`@`)?`bk-dec`:`bk-kw`,children:n},e.index)),i=e.index+n.length}return t.push(r.slice(i)),n>=0&&t.push((0,q.jsx)(`span`,{className:`bk-com`,children:e.slice(n)},`c`)),t}function Pn({onBack:e}){let t=ne.split(`
|
|
35
|
+
`,O=class extends Error{};function k(e){throw new O(e)}var A=e=>Math.round(e),j=e=>i.indexOf(e);function M(e,t,n=`info`,r=0){e.log.push({at:r,text:t,tone:n}),e.log.length>80&&e.log.splice(0,e.log.length-80)}var N=(e,t)=>e.stacks[t]??0;function P(e,t,n){let r=Math.min(1e4,N(e,t)+n);r<0&&k(`재료가 부족합니다`),r===0?delete e.stacks[t]:e.stacks[t]=r}function F(e,t,n,r){N(e,t)<n&&k(`${r}이(가) 부족합니다 (${N(e,t)}/${n})`),P(e,t,-n)}function I(e,t){e.credits<t&&k(`크레딧이 부족합니다 (¥${e.credits} / ¥${t})`),e.credits-=t}var re=e=>`heal:${e}`,L=(e,t)=>`cache:${e}:${t}`,ie=(e,t)=>`frag:${e}:${t}`,ae=9;function oe(e,t){return new Date(e+t*6e4-ae*36e5).toISOString().slice(0,10)}function se(e,t){let n=e+t*6e4;return(Math.floor((n-ae*36e5)/864e5)+1)*864e5+ae*36e5-t*6e4}var R=e=>A(25*e**1.55+25),ce=e=>8+4*e;function le(e,t,n){if(!(t<=0||e.level>=60)){for(e.xp+=t,e.totalXp+=t,e.totalXpAt=n;e.level<60&&e.xp>=R(e.level);)e.xp-=R(e.level),e.level++,e.hp=B(e,n).maxHp,M(e,`레벨 업! Lv.${e.level}. 체력이 가득 찼다`,`good`,n);e.level>=60&&(e.xp=0)}}function z(e,t,n,r){let i=e.skills[t];for(i.xp+=n;i.lv<100&&i.xp>=ce(i.lv);)i.xp-=ce(i.lv),i.lv++,M(e,`${t===`printing`?`인쇄`:t===`medical`?`의료`:`탄약`} 숙련도 ${i.lv}`,`good`,r)}var ue=(e,t)=>e.buffs.filter(e=>e.until>t);function B(e,t){let n={hp:0,shield:0,armor:0,crit:5,critDmg:150,evade:0,escape:30,stun:0,regen:0,dmgPct:0},r={primary:0,special:0,destructive:0};for(let t of e.items)if(t.kind===`gear`&&t.equipped&&t.slot){l.includes(t.slot)?r[t.slot]=t.main:n.hp+=t.main;for(let[e,r]of Object.entries(t.affixes))n[e]+=r??0;for(let r of e.items)r.installedIn===t.id&&r.stat&&(n[r.stat]+=r.main)}let i=0,a=0;for(let r of ue(e,t)){let e=C.find(e=>e.id===r.id);e&&(e.stat===`dmg`?n.dmgPct+=e.pct:e.stat===`def`?a+=e.pct:i+=e.pct)}(e.overclockUntil??0)>t&&(n.dmgPct+=20);for(let e of Object.keys(h))n[e]=Math.min(n[e],h[e]??1/0);let o=1+n.dmgPct/100;return{maxHp:A(60+10*(e.level-1)+n.hp),maxShield:A(n.shield*(1+i/100)),armor:A(n.armor*10)/10,crit:n.crit,critDmg:n.critDmg,evade:n.evade,escape:n.escape,stun:n.stun,regen:A(n.regen),dmgPct:n.dmgPct,defPct:a,dmg:{primary:A((r.primary||2+e.level)*o),special:A(r.special*o),destructive:A(r.destructive*o)}}}function V(e,t,n=0,r=`trash`){let a=e.next()**(1/(1+n+t/45)),o=[.5,.78,.92,.975,.995].findIndex(e=>a<e);return o<0&&(o=5),i[Math.max(o,j(r))]}var de=[`crit`,`critDmg`,`stun`,`dmgPct`],fe=[`crit`,`critDmg`,`evade`,`escape`,`regen`,`stun`],pe={trash:[0,0],common:[0,1],hq:[1,1],rare:[2,2],legendary:[2,3],epic:[3,3]};function me(e,t,n,r){let i=e.between(.6,1);return A({crit:1.5+2.5*r*i,critDmg:6+12*r*i,evade:1+2.5*r*i,escape:2+5*r*i,stun:1+2.5*r*i,regen:(.5+.25*n)*r*i,dmgPct:2+4*r*i,hp:(4+3*n)*r*i,shield:(2+1.2*n)*r*i,armor:(.2+.1*n)*r*i}[t]*10)/10}function he(e,t,n,r,i,a){let c=o[r],u=()=>e.between(.92,1.08),p=n,m={},h,g=(5+2.6*p)*c;switch(t){case`primary`:h=g*u();break;case`special`:h=g*1.6*u();break;case`destructive`:h=g*2.4*u();break;case`helmet`:h=(8+5*p)*c*u(),m.shield=A((2+1.5*p)*c*u());break;case`upper`:h=(14+9*p)*c*u(),m.shield=A((3+2*p)*c*u()),m.armor=A((.4+.28*p)*c*u()*10)/10;break;case`lower`:h=(12+8*p)*c*u(),m.armor=A((.3+.22*p)*c*u()*10)/10;break;case`boots`:h=(6+4*p)*c*u(),m.escape=A((3+.1*p)*c*u()*10)/10}let _=l.includes(t)?de:fe,[v,y]=pe[r],b=e.int(v,y);for(let t=0;t<b;t++){let t=e.pick(_);m[t]=A(((m[t]??0)+me(e,t,p,c))*10)/10}let[x,S]=s[r];return{id:e.uuid(),kind:`gear`,slot:t,rarity:r,level:n,name:`${e.pick(f[r])} ${e.pick(d[t])}`,main:A(h),affixes:m,modSlots:e.int(x,S),equipped:!1,source:i,at:a}}var ge=[`hp`,`shield`,`armor`,`crit`,`critDmg`,`evade`,`escape`,`stun`,`regen`,`dmgPct`];function _e(e,t,n,r,i){let a=e.pick(ge);return{id:e.uuid(),kind:`module`,stat:a,rarity:n,level:t,name:g[a],main:me(e,a,t,o[n]*1.2),affixes:{},modSlots:0,equipped:!1,source:r,at:i}}var ve={trash:.6,common:1,hq:1.8,rare:3.5,legendary:7,epic:14},ye=e=>A((4+2.2*e.level)*ve[e.rarity]*(e.kind===`module`?.8:1)),be=e=>e.items.filter(e=>!e.equipped&&!e.installedIn).length;function xe(e,t,n){if(be(e)>=e.bagCap){let r=1+j(t.rarity)*2;return P(e,`scrap`,r),M(e,`가방이 가득 차서 ${t.name}을(를) 고철 ${r}개로 바꿨다`,`bad`,n),`고철 ${r} (가방 가득)`}return e.items.push(t),t.name}var Se=e=>.8+.011*e,Ce=e=>(12+9*e)*Se(e),we=e=>(6+4.3*e)*Se(e);function Te(e,t,n,r,i){let a=y[t],o=Ce(n)*e.between(.9,1.1),s=we(n),c=0,l=5,u=150,d=0,f=0,p=e.pick(a.enemies);r===`elite`&&(o*=2.2,s*=1.15,p=`정예 ${p}`),r===`boss`&&(o*=5,s*=1.35,p=e.pick(a.bosses));let m=[],h=r===`boss`?1+ +!!e.chance(.5):+!!e.chance(i),g=[`frenzied`,`plated`,`warded`,`twitchy`,`deadeye`,`hulking`];for(;m.length<h;){let t=e.pick(g);m.includes(t)||m.push(t)}for(let e of m)e===`frenzied`&&(s*=1.25),e===`plated`&&(f+=20),e===`warded`&&(o*=.85,c+=o*1.5),e===`twitchy`&&(d+=15,c+=o*.4),e===`deadeye`&&(l+=15,u+=50),e===`hulking`&&(o*=1.8,s*=1.2);return{name:p,level:n,rank:r,hp:A(o),maxHp:A(o),shield:A(c),maxShield:A(c),atk:A(s*10)/10,crit:l,critDmg:u,evade:d,defPct:f,mods:m}}function Ee(e,t){let n=(e.rank===`boss`?8:e.rank===`elite`?3:1)*(1+.25*e.mods.length),r=(5+3.2*e.level**1.12)*n,i=t-e.level;return i>6&&(r*=Math.max(.1,1-(i-6)*.15)),A(r)}function De(e,t,n,r,i,a,o){let s=[],c=(t,n,r)=>{n<=0||(P(e,t,n),s.push(`${r} ×${n}`))},l=r===`boss`?6:r===`elite`?2.5:i===`crate`?1.6:1,u=A((3+1.8*n)*t.between(.8,1.2)*l);e.credits+=u,s.unshift(`¥${u}`),t.chance(i===`crate`?.6:.35)&&c(`cells`,t.int(1,3)+Math.floor(n/10),`에너지 탄약`),t.chance(i===`crate`?.3:.12)&&c(`antimatter`,1+Math.floor(n/20),`반물질`),t.chance(.22)&&c(`med`,t.int(1,2),`의료 부품`),t.chance(.22)&&c(`ammoparts`,t.int(1,2),`탄약 부품`),t.chance(.25)&&c(`scrap`,t.int(1,2),`고철`);let d=r===`boss`?1:r===`elite`?.6:i===`crate`?.45:i===`dungeon`?.09:.05,f=(r===`boss`?.8:r===`elite`?.4:i===`crate`?.3:0)+(a?.3:0);if(t.chance(d)){let e=t.chance(.5)?`weapon`:`armor`,r=V(t,n,f);c(L(e,r),1,`${e===`weapon`?`무기`:`방어구`} 상자(${ke(r)})`)}if(r===`boss`){let r=he(t,t.pick([`primary`,`special`,`destructive`,`helmet`,`upper`,`lower`,`boots`]),Math.min(n,e.level),V(t,n,1.2,`rare`),`drop`,o);s.push(xe(e,r,o))}return t.chance(r===`boss`?.35:.03)&&s.push(xe(e,_e(t,Math.min(n,e.level),V(t,n,f),`drop`,o),o)),s}var Oe={trash:`폐품`,common:`일반`,hq:`고급`,rare:`희귀`,legendary:`전설`,epic:`에픽`},ke=e=>Oe[e],Ae={kill:{need:[8,14],f:1},street:{need:[5,8],f:.8},dungeon:{need:[1,2],f:1.6},print:{need:[2,4],f:.7},craft:{need:[3,6],f:.7},crate:{need:[3,6],f:.9},ice:{need:[1,1],f:.6}},je={kill:`적 처치`,street:`길거리 적 처치`,dungeon:`던전 보물방 정리`,print:`상자 인쇄`,craft:`아이템 제작`,crate:`던전 상자 열기`,ice:`ICE 크래킹 성공`};function Me(e,t){for(;e.quests.length<3;){let n=e.quests.map(e=>e.kind),r=Object.keys(Ae).filter(e=>!n.includes(e)),i=t.pick(r),a=Ae[i];e.quests.push({id:++e.questSeq,kind:i,need:t.int(...a.need),have:0,credits:A((30+14*e.level)*a.f),xp:A(R(e.level)*.12*a.f)})}}function Ne(e,t,n=1){for(let r of e.quests)r.kind===t&&(r.have=Math.min(r.need,r.have+n))}var Pe=.04,Fe=.008;function Ie(e,t){let n=B(e,t).maxHp;if(e.loc===`dungeon`||e.combat||t<=e.hpAt)return Math.min(e.hp,n);let r=e.loc===`town`?Pe:Fe;return Math.min(n,A(e.hp+n*r*((t-e.hpAt)/1e3)))}function Le(e,t){let{now:n}=t;e.flatlineUntil&&n>=e.flatlineUntil&&(e.flatlineUntil=void 0),n>e.hpAt&&(e.hp=Ie(e,n),e.hpAt=n),e.buffs=e.buffs.filter(e=>e.until>n),Me(e,t.rng)}function Re(e,t){let n={v:2,rng:[],createdAt:t,level:1,xp:0,totalXp:0,totalXpAt:t,credits:120,hp:1,hpAt:t,unlocked:0,bagCap:40,hotbar:[0,null,null],skills:{printing:{lv:1,xp:0},medical:{lv:1,xp:0},ammo:{lv:1,xp:0}},stats:{kills:0,bossKills:0,deaths:0,dungeonClears:0,challengeClears:0,raidAttempts:0,raidWins:0,cratesOpened:0,itemsPrinted:0,iceCracked:0},items:[],stacks:{[re(0)]:5,cells:20,antimatter:2},records:[],loc:`town`,quests:[],questSeq:0,buffs:[],log:[]};for(let r of[`primary`,`special`,`upper`,`lower`,`boots`]){let i=he(e,r,1,r===`primary`?`common`:`trash`,`start`,t);i.equipped=!0,n.items.push(i)}return n.hp=B(n,t).maxHp,Me(n,e),M(n,`접속 완료. 제로 플라자에 도착했다. 마그레일 역에서 하수 순환로로 가 보자.`,`info`,t),n}function ze(e){let t=e[0]>>>0,n=e[1]>>>0,r=e[2]>>>0,i=e[3]>>>0,a=()=>{let e=(t+n|0)+i|0;return i=i+1|0,t=n^n>>>9,n=r+(r<<3)|0,r=r<<21|r>>>11,r=r+e|0,e>>>0},o=()=>a()/4294967296,s=e=>e.toString(16).padStart(8,`0`);return{next:o,int:(e,t)=>e+Math.floor(o()*(t-e+1)),between:(e,t)=>e+o()*(t-e),chance:e=>o()<e,pick:e=>e[Math.floor(o()*e.length)],uuid:()=>{let e=[a(),a(),a(),a()].map(s).join(``),t=(parseInt(e[16],16)&3|8).toString(16);return`${e.slice(0,8)}-${e.slice(8,12)}-4${e.slice(13,16)}-${t}${e.slice(17,20)}-${e.slice(20,32)}`},save:()=>[t>>>0,n>>>0,r>>>0,i>>>0]}}function Be(e){let t=e>>>0,n=()=>{t=t+2654435769|0;let e=t;return e=Math.imul(e^e>>>16,2246822507),e=Math.imul(e^e>>>13,3266489909),(e^e>>>16)>>>0},r=ze([n(),n(),n(),n()]);for(let e=0;e<12;e++)r.next();return r.save()}var Ve={primary:null,special:{code:`cells`,label:`에너지 탄약`},destructive:{code:`antimatter`,label:`반물질`}},He={primary:1,special:1.2,destructive:.5};function Ue(e,t,n,r,i={}){let a=B(e,r.now);e.combat={where:n,foe:structuredClone(t),entId:i.entId,streetIdx:i.streetIdx,allies:i.allies??[],shield:a.maxShield,maxShield:a.maxShield,turn:0,rewards:[],events:[{text:`${t.name}(Lv.${t.level})와(과) 교전을 시작했다`}]}}function We(e,t,n){let r=Math.min(e.shield,t*n);e.shield=A(e.shield-r),e.hp=Math.max(0,A(e.hp-(t-r/n)))}function Ge(e,t,n,r){let i=r.rng,a=e.foe;if(i.chance(a.evade/100)){e.events.push({text:`${a.name}이(가) 피했다`,target:`foe`,miss:!0,hp:a.hp,shield:a.shield});return}let o=t.dmg[n]*i.between(.9,1.1),s=i.chance(t.crit/100);s&&(o*=t.critDmg/100),o=Math.max(1,A(o*(1-a.defPct/100))),We(a,o,He[n]);let c=n===`primary`?`주무기`:n===`special`?`특수무기`:`파괴무기`;e.events.push({text:`${c}로 ${o} 피해${s?` (치명타!)`:``}`,target:`foe`,dmg:o,crit:s,hp:a.hp,shield:a.shield}),a.hp>0&&i.chance(t.stun/100)&&(a.stunned=!0,e.events.push({text:`${a.name}이(가) 기절했다`,target:`foe`,hp:a.hp,shield:a.shield}))}function Ke(e,t){let n=e.foe;for(let r of e.allies){if(r.hp<=0||n.hp<=0)continue;let i=A(r.atk*t.rng.between(.85,1.15)*(1-n.defPct/100));We(n,i,1),e.events.push({text:`${r.name}: ${i} 피해`,target:`foe`,dmg:i,hp:n.hp,shield:n.shield})}}function qe(e,t,n,r){let i=r.rng,a=t.foe;if(a.stunned){a.stunned=!1,t.events.push({text:`${a.name}은(는) 기절해서 움직이지 못한다`});return}let o=a.atk*i.between(.9,1.1),s=i.chance(a.crit/100);s&&(o*=a.critDmg/100);let c=t.allies.map((e,t)=>({a:e,i:t})).filter(e=>e.a.hp>0);if(c.length&&i.chance(c.length/(c.length+1))){let{a:e,i:n}=i.pick(c),r=A(o*.9);e.hp=Math.max(0,e.hp-r),t.events.push({text:`${a.name} → ${e.name} ${r}${s?` (치명타)`:``}${e.hp===0?` — 쓰러졌다`:``}`,target:n,dmg:r,crit:s,hp:e.hp});return}if(i.chance(n.evade/100)){t.events.push({text:`${a.name}의 공격을 피했다`,target:`player`,miss:!0,hp:e.hp,shield:t.shield});return}let l=Math.max(1,A((o-n.armor)*(1-n.defPct/100))),u={hp:e.hp,shield:t.shield};We(u,l,1),e.hp=u.hp,t.shield=u.shield,t.events.push({text:`${a.name}에게 ${l} 피해를 입었다${s?` (치명타!)`:``}`,target:`player`,dmg:l,crit:s,hp:e.hp,shield:t.shield})}function Je(e,t,n){let r=e.combat;r||k(`전투 중이 아닙니다`),r.result&&k(`이미 끝난 전투입니다`);let i=B(e,n.now);if(r.events=[],r.turn++,t.t===`attack`){if(t.w!==`primary`){i.dmg[t.w]<=0&&k(`${t.w===`special`?`특수무기`:`파괴무기`}를 장착하지 않았습니다`);let n=Ve[t.w];F(e,n.code,1,n.label)}Ge(r,i,t.w,n)}else if(t.t===`useItem`){r.where===`street`&&k(`길거리 전투에서는 아이템을 쓸 수 없습니다`);let n=e.hotbar[t.slot];n??k(`빈 단축칸입니다`),F(e,re(n),1,_[n].name);let a=Math.min(i.maxHp-e.hp,_[n].heal);e.hp+=a,r.events.push({text:`${_[n].name}: 체력 +${a}`,target:`player`,heal:a,hp:e.hp,shield:r.shield})}else{let e=r.where===`street`?1:i.escape/100;if(n.rng.chance(e)){r.result=`fled`,r.events.push({text:`도주에 성공했다`});return}r.events.push({text:`도주 실패 (${Math.round(e*100)}%)`})}if(r.foe.hp<=0||(Ke(r,n),r.foe.hp<=0))return Ye(e,n);if(qe(e,r,i,n),e.hp>0&&i.regen>0){let t=Math.min(i.maxHp-e.hp,i.regen);t>0&&(e.hp+=t,r.events.push({text:`재생 +${t}`,target:`player`,heal:t,hp:e.hp,shield:r.shield}))}e.hp<=0&&Ze(e,n)}function Ye(e,t){let n=e.combat,{now:r}=t,i=t.rng,a=n.foe;if(n.result=`win`,n.events.push({text:`${a.name}을(를) 쓰러뜨렸다!`,target:`foe`,hp:0,shield:0}),e.stats.kills++,a.rank===`boss`&&e.stats.bossKills++,n.where===`raid`){e.stats.raidWins++;let t=120*e.level,a=A(R(e.level)*.5);e.credits+=t,le(e,a,r),n.rewards=[`경험치 +${a}`,`¥${t}`];for(let t=0;t<2;t++){let t=i.chance(.5)?`weapon`:`armor`,r=V(i,e.level,1,`hq`);P(e,L(t,r),1),n.rewards.push(`${t===`weapon`?`무기`:`방어구`} 상자(${ke(r)})`)}let o=i.pick([`primary`,`special`,`destructive`,`helmet`,`upper`,`lower`,`boots`]);n.rewards.push(xe(e,he(i,o,e.level,V(i,e.level,1.5,`rare`),`raid`,r),r)),M(e,`레이드 승리! ${n.rewards.join(`, `)}`,`loot`,r);return}let o=Ee(a,e.level),s=e.dungeon?.challenge??!1,c=e.credits,l=e.level-a.level>10?[`(레벨 차이가 커서 전리품 없음)`]:De(e,i,a.level,a.rank,n.where,s,r);if(le(e,o,r),n.rewards=[`경험치 +${o}`,...l],Ne(e,`kill`),n.where===`street`&&e.street&&n.streetIdx!=null){Ne(e,`street`);let t=y[e.street.station].areas[e.street.area];e.street.foes[n.streetIdx]=Te(i,e.street.station,i.int(t.min,t.max),`normal`,.15)}if(n.where===`dungeon`&&e.dungeon){let r=e.dungeon,i=r.rooms[r.cur],a=i.ents.find(e=>e.id===n.entId);a&&(a.done=!0),r.loot.xp+=o,r.loot.credits+=e.credits-c,i.ents.some(e=>e.k===`foe`&&!e.done)||(n.rewards.push(`방 정리 — 문이 열렸다`),i.kind===`treasure`&&!r.cleared&&Xe(e,t))}}function Xe(e,t){let n=e.dungeon,{now:r}=t;n.cleared=!0;let i=Math.max(1,r-n.startedAt);e.stats.dungeonClears++,n.challenge&&e.stats.challengeClears++,Ne(e,`dungeon`);let a=A(R(e.level)*(n.challenge?.25:.15)),o=A((20+8*n.level)*(n.challenge?2:1));e.credits+=o,le(e,a,r);let s=e.records.find(e=>e.station===n.station&&e.dungeon===n.idx&&e.challenge===n.challenge);s||(s={station:n.station,dungeon:n.idx,challenge:n.challenge,clears:0,firstAt:r},e.records.push(s)),s.clears++;let c=s.bestMs==null||i<s.bestMs;c&&(s.bestMs=i,s.bestAt=r);let l=y[n.station].dungeons[n.idx].name,u=`${Math.floor(i/6e4)}분 ${Math.floor(i%6e4/1e3)}초`;e.combat?.rewards.push(`던전 정리 보너스: 경험치 +${a}, ¥${o}`,`기록 ${u}${c?` (최고 기록!)`:``}`),M(e,`${l}${n.challenge?`(도전)`:``} 보물방 정리! ${u}${c?` — 최고 기록`:``}`,`good`,r)}function Ze(e,t){let n=e.combat,{now:r}=t;n.result=`lose`,e.stats.deaths++;let i=[];if(e.level>=5){let t=Math.floor(e.credits*.1),n=Math.min(e.xp,Math.floor(R(e.level)*.1));e.credits-=t,e.xp-=n,e.totalXp-=n,i.push(`¥${t} 손실`,`경험치 -${n}`)}e.flatlineUntil=r+1e4,e.hp=A(B(e,r).maxHp*.3),e.hpAt=e.flatlineUntil,e.dungeon=void 0,e.street=void 0,e.loc=`town`,n.rewards=[`FLATLINE — 10초 동안 행동할 수 없다`,...i],M(e,`플랫라인. ${i.join(`, `)||`잃은 것 없음`}`,`bad`,r)}function Qe(e){let t=e.combat;if(t||k(`전투 중이 아닙니다`),t.result||k(`전투가 아직 끝나지 않았습니다`),t.result===`fled`){let n={...t.foe,stunned:!1};if(t.where===`dungeon`&&e.dungeon){let r=e.dungeon.rooms[e.dungeon.cur].ents.find(e=>e.id===t.entId);r&&(r.foe=n)}t.where===`street`&&e.street&&t.streetIdx!=null&&(e.street.foes[t.streetIdx]=n)}e.combat=void 0}function $e(e,t,n){let r=B(e,n.now),i=[...te];return Array.from({length:t},()=>{let e=i.splice(n.rng.int(0,i.length-1),1)[0],t=A(r.maxHp*.7);return{name:e,hp:t,maxHp:t,atk:A(Math.max(r.dmg.primary,r.dmg.special*.8)*.75)}})}var H=[`n`,`s`,`e`,`w`],U={n:[0,-1],s:[0,1],e:[1,0],w:[-1,0]},et={n:`s`,s:`n`,e:`w`,w:`e`},W={n:[7,0],s:[7,10],w:[0,5],e:[14,5]},tt={n:[7,1],s:[7,9],w:[1,5],e:[13,5]},nt=[7,5],G=(e,t)=>`${e},${t}`;function rt(e,t){let n=new Set([G(...nt)]),r=[nt];for(;r.length;){let[i,a]=r.shift();for(let o of H){let s=i+U[o][0],c=a+U[o][1],l=G(s,c),u=e[c]?.[s];!u||u===`#`||n.has(l)||t.has(l)||(n.add(l),u!==`+`&&r.push([s,c]))}}return n}function it(e,t,n){for(let r=0;r<30;r++){let i=Array.from({length:11},(e,t)=>Array.from({length:15},(e,n)=>n===0||t===0||n===14||t===10?`#`:`.`));for(let e of H)t[e]!=null&&(i[W[e][1]][W[e][0]]=`+`);if(n&&r<25){let t=e.int(3,6);for(let n=0;n<t;n++){let t=e.chance(.5),n=e.int(1,3),r=e.int(2,12),a=e.int(2,8);for(let e=0;e<n;e++){let n=t?r+e:r,o=t?a:a+e;n<2||n>12||o<2||o>8||Math.abs(n-nt[0])<=1&&Math.abs(o-nt[1])<=1||Object.values(tt).some(([e,t])=>Math.abs(e-n)+Math.abs(t-o)<=1)||(i[o][n]=`#`)}}}let a=i.map(e=>e.join(``)),o=rt(a,new Set);if(a.flatMap((e,t)=>[...e].map((e,n)=>e===`.`||e===`+`?G(n,t):``)).filter(Boolean).every(e=>o.has(e)))return a}return it(e,t,!1)}function at(e,t,n){let r=new Set([G(...nt),...Object.values(tt).map(([e,t])=>G(e,t))]),i=t.flatMap((e,t)=>[...e].map((e,n)=>e===`.`&&!r.has(G(n,t))?[n,t]:null)).filter(e=>!!e);for(let r=0;r<40;r++){let r=[...i],a=n.map(t=>{let[n,i]=r.splice(e.int(0,r.length-1),1)[0];return{...t,x:n,y:i}}),o=rt(t,new Set(a.filter(e=>e.k!==`foe`).map(e=>G(e.x,e.y)))),s=H.every(e=>t[W[e][1]][W[e][0]]!==`+`||o.has(G(...W[e]))),c=a.every(e=>H.some(t=>o.has(G(e.x+U[t][0],e.y+U[t][1]))));if(s&&c)return a}return at(e,it(e,{},!1),n)}function ot(e,t,n,r,i){let a=y[t].dungeons[n].level+(r?2:0),o=e.int(6,8)+(r?2:0),s=[{gx:0,gy:0,doors:{}}],c=new Map([[G(0,0),0]]);for(let t=0;s.length<o&&t<500;t++){let t=e.int(0,s.length-1),n=e.pick(H),r=s[t].gx+U[n][0],i=s[t].gy+U[n][1];if(c.has(G(r,i)))continue;let a=s.push({gx:r,gy:i,doors:{}})-1;c.set(G(r,i),a),s[t].doors[n]=a,s[a].doors[et[n]]=t}s.forEach((t,n)=>{for(let r of H){let i=c.get(G(t.gx+U[r][0],t.gy+U[r][1]));i!=null&&t.doors[r]==null&&e.chance(.15)&&(t.doors[r]=i,s[i].doors[et[r]]=n)}});let l=s.map(()=>-1);l[0]=0;let u=[0];for(;u.length;){let e=u.shift();for(let t of Object.values(s[e].doors))t!=null&&l[t]<0&&(l[t]=l[e]+1,u.push(t))}let d=l.indexOf(Math.max(...l)),f=s.map((e,t)=>t).filter(e=>e!==0&&e!==d),p=e.pick(f),m=new Set([e.pick(f),e.pick(f),0]),h=.2+(r?.15:0);return{station:t,idx:n,challenge:r,level:a,rooms:s.map((n,i)=>{let o=i===0?`start`:i===d?`treasure`:`normal`,s=[],c=e=>`${i}-${e}-${s.length}`,l=(n,r)=>s.push({id:c(`f`),k:`foe`,foe:Te(e,t,Math.max(1,r),n,h)});if(o===`normal`){let t=e.int(r?2:1,3);for(let n=0;n<t;n++)l(`normal`,a+e.int(-1,1));e.chance(.55)&&s.push({id:c(`c`),k:`crate`})}if(o===`treasure`){for(let t=0;t<3;t++)l(`normal`,a+e.int(0,1));l(r?`boss`:`elite`,a+2),s.push({id:c(`c`),k:`crate`},{id:c(`c`),k:`crate`},{id:c(`g`),k:`frag`})}i===p&&s.push({id:c(`q`),k:`quest`}),m.has(i)&&s.push({id:c(`l`),k:`lore`,lore:e.int(0,b.length-1)});let u=it(e,n.doors,o!==`start`);return{gx:n.gx,gy:n.gy,doors:n.doors,kind:o,visited:i===0,walls:u,ents:at(e,u,s)}}),cur:0,x:nt[0],y:nt[1],startedAt:i,cleared:!1,loot:{credits:0,xp:0,items:0}}}var st=e=>e.ents.filter(e=>e.k===`foe`&&!e.done),ct=(e,t,n)=>e.ents.some(e=>e.x===t&&e.y===n&&!e.done);function lt(e,t,n){let r=G(...n),i=new Map([[G(...t),[``,`n`]]]),a=[t];for(;a.length;){let[t,n]=a.shift();if(G(t,n)===r)break;for(let o of H){let s=t+U[o][0],c=n+U[o][1],l=G(s,c),u=e.walls[c]?.[s];u&&u!==`#`&&!i.has(l)&&(l===r||u!==`+`&&!ct(e,s,c))&&(i.set(l,[G(t,n),o]),a.push([s,c]))}}if(!i.has(r))return null;let o=[];for(let e=r;e!==G(...t);){let[t,n]=i.get(e);o.unshift(n),e=t}return o}function ut(e,t){let n=[{code:`med`,n:e.int(2,5)},{code:`ammoparts`,n:e.int(2,5)},{code:`scrap`,n:e.int(3,6)},{code:`cells`,n:e.int(8,20)},{code:`heal:0`,n:e.int(2,4)}],r=t<15?1:t<35?2:3,i=e.pick([`over`,`plate`,`ward`]);return{who:e.pick(x),line:e.pick(S),want:e.pick(n),buff:`${i}${r}`,minutes:e.int(20,45)}}var dt=14,ft=1e4;function pt(e,t,n){return{kind:`sync`,entId:t,seq:Array.from({length:dt},()=>e.pick(H)),startedAt:n,limitMs:ft}}function mt(e,t,n,r){let i=e.dungeon,a=e.credits,o=De(e,n.rng,i.level,`normal`,`crate`,i.challenge,n.now);r&&(P(e,`cells`,3),o.push(`동기화 보너스: 에너지 탄약 ×3`)),i.loot.credits+=e.credits-a,t.done=!0,e.stats.cratesOpened++,Ne(e,`crate`),M(e,`상자: ${o.join(`, `)}`,`loot`,n.now)}function ht(e,t,n,r,i){let a=y[t]?.dungeons[n];a||k(`없는 던전입니다`),t>e.unlocked&&k(`아직 열리지 않은 구역입니다. 터미널에서 열쇠를 만드세요`),(e.dungeon||e.combat)&&k(`이미 다른 곳에 있습니다`);let o=a.level+(r?2:0);e.level<o-6&&k(`레벨이 너무 낮습니다 (Lv.${o-6} 이상)`),e.street=void 0,e.dungeon=ot(i.rng,t,n,r,i.now),e.loc=`dungeon`,M(e,`${a.name}${r?`(도전)`:``}에 접속했다. 방 ${e.dungeon.rooms.length}개`,`info`,i.now)}function gt(e,t){let n=e.dungeon;n||k(`던전에 있지 않습니다`),(e.combat||e.modal)&&k(`지금은 나갈 수 없습니다`),e.dungeon=void 0,e.loc=`town`,M(e,`던전에서 나왔다. 이번 진입: 경험치 +${n.loot.xp}, ¥${n.loot.credits}`,`info`,t.now)}function _t(e,t,n){let r=e.dungeon;if(!r||e.combat||e.modal||e.loc!==`dungeon`)return;let i=r.rooms[r.cur],a=r.x+U[t][0],o=r.y+U[t][1],s=i.walls[o]?.[a];if(!s||s===`#`)return;if(s===`+`){let t=H.find(e=>W[e][0]===a&&W[e][1]===o);if(st(i).length){M(e,`적이 남아 있어 문이 잠겨 있다`,`bad`,n.now);return}let s=i.doors[t];r.cur=s,[r.x,r.y]=tt[et[t]];let c=r.rooms[s];c.visited||(c.visited=!0,c.kind===`treasure`&&M(e,`보물방이다. 강한 기척이 느껴진다`,`bad`,n.now));return}let c=i.ents.find(e=>e.x===a&&e.y===o&&!e.done);if(c){if(c.k===`foe`){Ue(e,c.foe,`dungeon`,n,{entId:c.id});return}if(c.k===`crate`||c.k===`frag`){if(st(i).length){M(e,`적부터 처리해야 열 수 있다`,`bad`,n.now);return}if(c.k===`frag`)P(e,ie(r.station,r.idx),1),c.done=!0,M(e,`열쇠 조각 ${y[r.station].dungeons[r.idx].fragment}을(를) 얻었다`,`loot`,n.now);else if(n.rng.chance(.25)){e.modal=pt(n.rng,c.id,n.now);return}else mt(e,c,n,!1)}else if(c.k===`quest`){c.offer??=ut(n.rng,r.level),e.modal={kind:`giver`,entId:c.id,...c.offer};return}else if(c.k===`lore`){c.done=!0,e.modal={kind:`lore`,text:b[c.lore??0]};return}}r.x=a,r.y=o}var vt=(e,t)=>e.dungeon?.rooms[e.dungeon.cur].ents.find(e=>e.id===t);function yt(e,t,n){let r=e.modal;r?.kind!==`sync`&&k(`진행 중인 동기화가 없습니다`);let i=vt(e,r.entId);i||k(`상자를 찾을 수 없습니다`),(!(n.now-r.startedAt<=r.limitMs+3e3)||t.length!==r.seq.length||t.some((e,t)=>e!==r.seq[t]))&&k(`동기화 실패 — 다시 시도하거나 포기하세요`),e.modal=void 0,mt(e,i,n,!0)}function bt(e,t){let n=e.modal;n?.kind!==`sync`&&k(`진행 중인 동기화가 없습니다`),e.modal=pt(t.rng,n.entId,t.now)}function xt(e,t){let n=e.modal;n?.kind!==`sync`&&k(`진행 중인 동기화가 없습니다`);let r=vt(e,n.entId);r&&(r.done=!0),e.modal=void 0,M(e,`잠금 해제에 실패해 상자가 자폭했다`,`bad`,t.now)}function St(e,t,n){let r=e.modal;if(r?.kind!==`giver`&&k(`대화 중이 아닙니다`),!t){e.modal=void 0;return}let i=r.want.code.startsWith(`heal`)?`진통 패치`:r.want.code===`med`?`의료 부품`:r.want.code===`ammoparts`?`탄약 부품`:r.want.code===`scrap`?`고철`:`에너지 탄약`;F(e,r.want.code,r.want.n,i);let a=C.find(e=>e.id===r.buff);e.buffs=e.buffs.filter(e=>e.id!==r.buff),e.buffs.push({id:r.buff,until:n.now+r.minutes*6e4});let o=vt(e,r.entId);o&&(o.done=!0),e.modal=void 0;let s=A(R(e.level)*.03);le(e,s,n.now),M(e,`${r.who}에게 ${i} ${r.want.n}개를 건넸다. ${a.label} ${r.minutes}분, 경험치 +${s}`,`good`,n.now)}function K(e,t,n){e.combat&&k(`전투 중입니다`),e.dungeon&&k(`던전 안에서는 ${n}할 수 없습니다`),e.flatlineUntil&&t.now<e.flatlineUntil&&k(`플랫라인 중입니다. 잠시 기다리세요`)}function Ct(e,t,n,r){K(e,r,`이동`);let i=y[t]?.areas[n];i||k(`없는 지역입니다`),t>e.unlocked&&k(`아직 열리지 않은 구역입니다`),e.street={station:t,area:n,foes:Array.from({length:4},()=>Te(r.rng,t,r.rng.int(i.min,i.max),`normal`,.15))},e.loc=`street`}function wt(e,t,n){e.street||k(`길거리에 있지 않습니다`),e.combat&&k(`이미 전투 중입니다`),e.flatlineUntil&&n.now<e.flatlineUntil&&k(`플랫라인 중입니다`);let r=e.street.foes[t];r||k(`없는 적입니다`),Ue(e,r,`street`,n,{streetIdx:t})}function Tt(e){e.combat&&k(`전투 중입니다`),e.street=void 0,e.loc===`street`&&(e.loc=`town`)}var Et=(e,t)=>e.items.find(e=>e.id===t)??k(`없는 아이템입니다`);function Dt(e,t){e.combat&&k(`전투 중에는 장비를 바꿀 수 없습니다`);let n=Et(e,t);if(n.kind===`gear`&&n.slot||k(`장비가 아닙니다`),!n.equipped){n.level>e.level&&k(`Lv.${n.level} 장비는 아직 쓸 수 없습니다`);for(let t of e.items)t.equipped&&t.slot===n.slot&&(t.equipped=!1);n.equipped=!0}}function Ot(e,t){e.combat&&k(`전투 중에는 장비를 바꿀 수 없습니다`);let n=Et(e,t);n.equipped&&=(be(e)>=e.bagCap&&k(`가방이 가득 찼습니다`),!1)}function kt(e,t){t.equipped&&k(`장착 중인 장비입니다. 먼저 해제하세요`),t.installedIn&&k(`장비에 끼워진 모듈입니다. 먼저 빼세요`);for(let n of e.items)n.installedIn===t.id&&(n.installedIn=void 0);e.items=e.items.filter(e=>e!==t)}function At(e,t,n){K(e,n,`판매`);let r=Et(e,t);kt(e,r);let i=ye(r);e.credits+=i,M(e,`${r.name} 판매: ¥${i}`,`info`,n.now)}function jt(e,t,n){K(e,n,`분해`);let r=Et(e,t);kt(e,r);let i=1+j(r.rarity)*2+Math.floor(r.level/10);P(e,`scrap`,i),z(e,`printing`,3,n.now),M(e,`${r.name} 분해: 고철 ×${i}, 인쇄 경험 +3`,`info`,n.now)}function Mt(e,t,n){e.combat&&k(`전투 중입니다`);let r=Et(e,t),i=Et(e,n);(r.kind!==`module`||i.kind!==`gear`)&&k(`모듈을 장비에 끼워야 합니다`),r.installedIn&&k(`이미 끼워진 모듈입니다`),r.level>i.level&&k(`모듈 레벨(${r.level})이 장비 레벨(${i.level})보다 높습니다`),e.items.filter(e=>e.installedIn===i.id).length>=i.modSlots&&k(`빈 모듈 칸이 없습니다`),r.installedIn=i.id}function Nt(e,t){e.combat&&k(`전투 중입니다`);let n=Et(e,t);n.installedIn&&=(be(e)>=e.bagCap&&k(`가방이 가득 찼습니다`),void 0)}function Pt(e,t,n){(t<0||t>2)&&k(`없는 단축칸입니다`),n!=null&&!_[n]&&k(`없는 회복제입니다`),e.hotbar[t]=n}var Ft={trash:1,common:1.6,hq:2.6,rare:4.5,legendary:8,epic:14},It={trash:6,common:10,hq:18,rare:32,legendary:60,epic:110},Lt=e=>Math.min(e.skills.printing.lv,e.level),Rt=(e,t)=>A((10+4*Lt(e))*Ft[t]);function zt(e,t,n,r){K(e,r,`인쇄`),i.includes(n)||k(`없는 등급입니다`);let a=L(t,n);N(e,a)<1&&k(`그 상자가 없습니다`),be(e)>=e.bagCap&&k(`가방이 가득 찼습니다`),I(e,Rt(e,n)),F(e,a,1,`상자`);let o=t===`weapon`?l:[`helmet`,`upper`,`lower`,`boots`],s=he(r.rng,r.rng.pick(o),Lt(e),n,`print`,r.now);xe(e,s,r.now),z(e,`printing`,It[n],r.now),e.stats.itemsPrinted++,Ne(e,`print`),M(e,`인쇄 완료: ${s.name} (Lv.${s.level} ${ke(n)})`,`loot`,r.now)}var Bt=e=>25*e.level;function Vt(e,t,n,r){e.combat&&k(`전투 중입니다`);let i=e.skills.ammo.lv;if(t===`heal`){let t=_[n]??k(`없는 회복제입니다`);e.skills.medical.lv<t.med&&k(`의료 숙련도 ${t.med}이(가) 필요합니다`),F(e,`med`,t.parts,`의료 부품`),P(e,re(n),1),z(e,`medical`,2+2*n,r.now)}else if(t===`cells`)F(e,`ammoparts`,1,`탄약 부품`),P(e,`cells`,3+Math.floor(i/8)),z(e,`ammo`,1,r.now);else if(t===`antimatter`)N(e,`scrap`)<1&&k(`고철이 부족합니다`),F(e,`ammoparts`,3,`탄약 부품`),F(e,`scrap`,1,`고철`),P(e,`antimatter`,1+Math.floor(i/15)),z(e,`ammo`,2,r.now);else if(t===`module`){be(e)>=e.bagCap&&k(`가방이 가득 찼습니다`),N(e,`scrap`)<12&&k(`고철이 부족합니다 (${N(e,`scrap`)}/12)`),I(e,Bt(e)),F(e,`scrap`,12,`고철`);let t=_e(r.rng,e.level,V(r.rng,e.level,.2),`craft`,r.now);xe(e,t,r.now),M(e,`모듈 조립: ${t.name} (${ke(t.rarity)})`,`loot`,r.now)}else k(`없는 제작법입니다`);Ne(e,`craft`)}var Ht=e=>A(10*(3+.1*e.level)),Ut=e=>A(3*(18+e.level)),Wt={med:15,ammoparts:12},Gt=e=>Math.min(_.length-1,e.unlocked+1);function Kt(e,t,n,r,i){let a=he(e,e.pick([`primary`,`special`,`destructive`,`helmet`,`upper`,`lower`,`boots`]),t.level,n,`shop`,r);return{id:a.id,kind:`gear`,item:a,price:A(ye(a)*i)}}function qt(e,t,n=!1){let r=Math.floor(t.now/36e5);if(!n&&e.smith?.hour===r&&e.smith.level===e.level)return;let i=t.rng,a=Array.from({length:5},()=>{let n=V(i,e.level,.3,`common`);return Kt(i,e,j(n)>3?`rare`:n,t.now,3)});e.smith={hour:r,level:e.level,offers:a}}function Jt(e,t,n){K(e,n,`구매`),$t(e,e.smith?.offers,t,n)}function Yt(e,t){K(e,t,`구매`),I(e,20*e.level),qt(e,t,!0)}function Xt(e,t,n){K(e,n,`구매`),t===`cells`?(I(e,Ht(e)),P(e,`cells`,10)):(I(e,Ut(e)),P(e,`antimatter`,3))}function Zt(e,t,n,r){K(e,r,`구매`),(t>Gt(e)||!_[t])&&k(`아직 팔지 않는 약입니다`),(n<1||n>20)&&k(`수량은 1~20입니다`),I(e,_[t].price*n),P(e,re(t),n)}function Qt(e,t,n){K(e,n,`구매`),I(e,Wt[t]*5),P(e,t,5)}function $t(e,t,n,r){let i=t?.find(e=>e.id===n)??k(`없는 상품입니다`);i.sold&&k(`이미 팔린 상품입니다`),i.kind===`gear`&&be(e)>=e.bagCap&&k(`가방이 가득 찼습니다`),I(e,i.price),i.sold=!0,i.kind===`gear`?(e.items.push({...i.item,at:r.now}),M(e,`구매: ${i.item.name} ¥${i.price}`,`loot`,r.now)):(P(e,i.code,i.n),M(e,`구매: ${i.label} ¥${i.price}`,`loot`,r.now))}function en(e,t){let n=oe(t.now,t.utcOffsetMin);if(e.market?.day===n)return;let r=t.rng,i=e.level,a=Array.from({length:4},()=>Kt(r,e,V(r,i,.6,`hq`),t.now,3));for(let e=0;e<2;e++){let e=r.chance(.5)?`weapon`:`armor`,t=V(r,i,.8,`hq`);a.push({id:r.uuid(),kind:`stack`,code:L(e,t),n:1,label:`${e===`weapon`?`무기`:`방어구`} 상자(${ke(t)})`,price:A((10+4*i)*Ft[t]*6)})}let o=Gt(e);a.push({id:r.uuid(),kind:`stack`,code:re(o),n:5,label:`${_[o].name} ×5 (20% 할인)`,price:A(_[o].price*5*.8)}),a.push({id:r.uuid(),kind:`stack`,code:`cells`,n:30,label:`에너지 탄약 ×30 (30% 할인)`,price:A(Ht(e)*3*.7)}),a.push({id:r.uuid(),kind:`stack`,code:`antimatter`,n:6,label:`반물질 ×6 (30% 할인)`,price:A(Ut(e)*2*.7)}),e.market={day:n,level:i,offers:a}}function tn(e,t,n){K(e,n,`구매`),en(e,n),$t(e,e.market?.offers,t,n)}var nn=e=>150*(e+1)**2;function rn(e,t,n){K(e,n,`열쇠 합성`),(t!==e.unlocked||t>=y.length-1)&&k(`지금 만들 수 있는 열쇠가 아닙니다`);for(let n=0;n<3;n++)N(e,ie(t,n))<1&&k(`${y[t].dungeons[n].name}의 조각이 없습니다`);I(e,nn(t));for(let n=0;n<3;n++)P(e,ie(t,n),-1);e.unlocked++,M(e,`비밀 열쇠 완성. ${y[e.unlocked].name} 노선이 열렸다!`,`good`,n.now)}var an=18e4;function on(e,t){K(e,t,`해킹`),e.modal&&k(`다른 창이 열려 있습니다`),(e.iceUntil??0)>t.now&&k(`ICE가 재정렬 중입니다. 잠시 뒤에 다시 시도하세요`),e.iceUntil=t.now+an,e.modal={kind:`ice`,code:Array.from({length:4},()=>t.rng.int(0,5)),guesses:[],max:7}}function sn(e,t,n){let r=e.modal;(r?.kind!==`ice`||r.done)&&k(`진행 중인 해킹이 없습니다`),(t.length!==4||t.some(e=>!Number.isInteger(e)||e<0||e>5))&&k(`0~5 숫자 4개를 입력하세요`);let i=0,a=[],o=[];t.forEach((e,t)=>e===r.code[t]?i++:(a.push(r.code[t]),o.push(e)));let s=0;for(let e of o){let t=a.indexOf(e);t>=0&&(s++,a.splice(t,1))}if(r.guesses.push({g:t,exact:i,near:s}),i===4){r.done=`won`;let t=25+10*e.level;e.credits+=t,P(e,`ammoparts`,2),P(e,`med`,1),e.stats.iceCracked++,Ne(e,`ice`);let i=``;if(n.rng.chance(.15)){let t=V(n.rng,e.level,0,`common`),r=n.rng.chance(.5)?`weapon`:`armor`;P(e,L(r,t),1),i=`, ${r===`weapon`?`무기`:`방어구`} 상자(${ke(t)})`}M(e,`ICE 돌파! ¥${t}, 탄약 부품 ×2, 의료 부품 ×1${i}`,`loot`,n.now)}else r.guesses.length>=r.max&&(r.done=`lost`,M(e,`ICE 크래킹 실패. 코드는 ${r.code.join(``)}였다`,`bad`,n.now))}function cn(e){let t=e.modal;t&&(t.kind===`sync`&&k(`상자 잠금을 풀거나 포기하세요`),t.kind===`giver`&&k(`수락하거나 거절하세요`),e.modal=void 0)}function ln(e,t,n,r){e.job&&k(`이미 일감을 하고 있습니다`),w.some(e=>e.id===t)||k(`없는 일감입니다`),T.includes(n)||k(`없는 시간입니다`),e.job={id:t,startedAt:r.now,endsAt:r.now+n*6e4}}function un(e,t){let n=e.job??k(`하고 있는 일감이 없습니다`),r=(Math.min(t.now,n.endsAt)-n.startedAt)/6e4;if(e.job=void 0,r<1){M(e,`일감을 취소했다`,`info`,t.now);return}let i=(e.overclockUntil??0)>t.now?1.5:1,a=r*i,o=e.level,s=[],c=(t,n,r)=>{n>0&&(P(e,t,n),s.push(`${r} ×${n}`))};switch(n.id){case`print`:z(e,`printing`,A(.8*a),t.now),s.push(`인쇄 경험 +${A(.8*a)}`);break;case`med`:z(e,`medical`,A(.5*a),t.now),s.push(`의료 경험 +${A(.5*a)}`),c(`med`,Math.floor(.15*a),`의료 부품`);break;case`ammo`:z(e,`ammo`,A(.5*a),t.now),s.push(`탄약 경험 +${A(.5*a)}`),c(`ammoparts`,Math.floor(.25*a),`탄약 부품`);break;case`scav`:c(`scrap`,Math.floor(.3*a),`고철`),c(`med`,Math.floor(.05*a),`의료 부품`),c(`ammoparts`,Math.floor(.08*a),`탄약 부품`);for(let e=0;e<Math.floor(a/30);e++){let e=V(t.rng,o,0,`trash`),n=t.rng.chance(.5)?`weapon`:`armor`;c(L(n,j(e)>1?`common`:e),1,`${n===`weapon`?`무기`:`방어구`} 상자`)}break;case`guard`:{let n=A((1+.5*o)*a),r=A((.4+.25*o)*a);e.credits+=n,le(e,r,t.now),s.push(`¥${n}`,`경험치 +${r}`);break}}M(e,`일감 정산 (${Math.floor(r)}분${i>1?`, 오버클럭 ×1.5`:``}): ${s.join(`, `)||`없음`}`,`loot`,t.now)}function dn(e,t,n){let r=e.quests.find(e=>e.id===t)??k(`없는 퀘스트입니다`);r.have<r.need&&k(`아직 끝나지 않은 퀘스트입니다`),e.quests=e.quests.filter(e=>e!==r),e.credits+=r.credits,le(e,r.xp,n.now),M(e,`퀘스트 보상: ¥${r.credits}, 경험치 +${r.xp}`,`good`,n.now),Me(e,n.rng)}var fn=e=>100*e.level;function pn(e,t){I(e,fn(e)),e.overclockUntil=Math.max(t.now,e.overclockUntil??0)+18e5,M(e,`오버클럭 가동: 30분간 피해 +20%, 일감 보상 ×1.5`,`good`,t.now)}var mn=e=>40*e.level,hn={hp:16,atk:1.6,shield:.35},gn=(e,t)=>e.raidDay!==oe(t.now,t.utcOffsetMin);function _n(e,t,n){K(e,n,`레이드`),gn(e,n)||k(`오늘 레이드는 끝났습니다. 내일 09:00에 다시 열립니다`),(!Number.isInteger(t)||t<0||t>2)&&k(`용병은 0~2명입니다`),I(e,t*mn(e)),e.raidDay=oe(n.now,n.utcOffsetMin),e.stats.raidAttempts++;let r=n.rng,i=e.level,a=Te(r,Math.min(e.unlocked,y.length-1),i,`boss`,0),o=A(Ce(i)*hn.hp*r.between(.9,1.1)),s=A(o*hn.shield),c={...a,name:r.pick(ee),hp:o,maxHp:o,shield:s,maxShield:s,atk:A(we(i)*hn.atk*10)/10};Ue(e,c,`raid`,n,{allies:$e(e,t,n)}),M(e,`레이드 시작: ${c.name}. 용병 ${t}명`,`info`,n.now)}function vn(e,t,n){if(e.flatlineUntil&&n.now<e.flatlineUntil&&![`combat.close`,`modal.close`,`sync`,`hotbar`,`equip`,`unequip`,`mod.install`,`mod.remove`,`quest.claim`,`job.claim`,`job.start`].includes(t.t))throw new O(`플랫라인 중입니다. 잠시 기다리세요`);switch(t.t){case`move`:return _t(e,t.dir,n);case`attack`:case`useItem`:case`escape`:return Je(e,t,n);case`combat.close`:return Qe(e);case`dungeon.enter`:return ht(e,t.station,t.dungeon,t.challenge,n);case`dungeon.leave`:return gt(e,n);case`sync.submit`:return yt(e,t.inputs,n);case`sync.retry`:return bt(e,n);case`sync.abandon`:return xt(e,n);case`giver`:return St(e,t.accept,n);case`modal.close`:return cn(e);case`street.enter`:return Ct(e,t.station,t.area,n);case`street.fight`:return wt(e,t.idx,n);case`street.leave`:return Tt(e);case`equip`:return Dt(e,t.id);case`unequip`:return Ot(e,t.id);case`sell`:return At(e,t.id,n);case`scrap`:return jt(e,t.id,n);case`mod.install`:return Mt(e,t.mod,t.gear);case`mod.remove`:return Nt(e,t.mod);case`hotbar`:return Pt(e,t.slot,t.tier);case`print`:return zt(e,t.kind,t.rarity,n);case`craft`:return Vt(e,t.recipe,t.tier,n);case`smith.buy`:return Jt(e,t.id,n);case`smith.refresh`:return Yt(e,n);case`smith.ammo`:return Xt(e,t.kind,n);case`pharm.buy`:return Zt(e,t.tier,t.n,n);case`pharm.parts`:return Qt(e,t.code,n);case`market.buy`:return tn(e,t.id,n);case`key.forge`:return rn(e,t.station,n);case`ice.start`:return on(e,n);case`ice.guess`:return sn(e,t.g,n);case`job.start`:return ln(e,t.id,t.minutes,n);case`job.claim`:return un(e,n);case`quest.claim`:return dn(e,t.id,n);case`overclock`:return pn(e,n);case`raid.start`:return _n(e,t.crew,n);case`sync`:return;default:throw new O(`알 수 없는 행동입니다`)}}function yn(e,t,n){let r=structuredClone(e),i=ze(r.rng),a={...n,rng:i};for(let e of t)Le(r,a),vn(r,e,a);Le(r,a),qt(r,a),en(r,a);for(let e of r.log)e.at===0&&(e.at=n.now);return r.rng=i.save(),r}function bn(e,t){let n=ze(Be(e)),r=Re(n,t.now),i={...t,rng:n};return qt(r,i),en(r,i),r.rng=n.save(),r}var xn=()=>({now:Date.now(),utcOffsetMin:-new Date().getTimezoneOffset()}),Sn=`arasaka-in-save-v2`;function Cn(){let e=new Uint32Array(1);return crypto.getRandomValues(e),e[0]}var wn=class{read(){try{let e=localStorage.getItem(Sn),t=e?JSON.parse(e):null;return t?.state?.v===2?t:null}catch{return null}}write(e){try{localStorage.setItem(Sn,JSON.stringify(e))}catch{}}async load(){return this.read()||this.reset()}async send(e,t){let n=this.read()??await this.reset();if(n.version!==e)throw new O(`다른 창에서 진행이 바뀌었습니다. 최신 상태를 불러왔습니다`);let r={state:yn(n.state,t,xn()),version:e+1};return this.write(r),r}async reset(){let e={state:bn(Cn(),xn()),version:0};return this.write(e),e}},q=t();function Tn(e){let t=2166136261;for(let n of e)t=Math.imul(t^n.charCodeAt(0),16777619);return()=>(t=Math.imul(t^t>>>15,2246822507),t=Math.imul(t^t>>>13,3266489909),((t^=t>>>16)>>>0)/4294967296)}function En(e,t){let n=Tn(`${e}:${t}`),r=[];for(let e=-20;e<1020;){let i=34+n()*(t?70:50),a=(t?90:150)+n()*(t?170:130),o=[];for(let r=300-a+14;r<290;r+=14)for(let a=e+6;a<e+i-8;a+=10)o.push({x:a,y:r,on:n()<(t?.18:.08)});r.push({x:e,w:i,h:a,windows:o,antenna:n()<.3}),e+=i+(n()<.25?n()*18:1)}return r}function Dn({title:e,tag:t,npc:n,lines:i,hue:a,glyph:o,children:s}){let c=(0,r.useMemo)(()=>En(e,0),[e]),l=(0,r.useMemo)(()=>En(e,1),[e]),u=(0,r.useMemo)(()=>{let t=Tn(`${e}:signs`);return Array.from({length:5},()=>({x:t()*960,y:70+t()*150,w:20+t()*60,h:4+t()*10,alt:t()<.4}))},[e]),[d]=(0,r.useState)(()=>i[Math.floor(Math.random()*i.length)]??``),f=350+(a%21-10),p=`hsl(${f} 70% 52%)`,m=`hsl(${f+8} 55% 42%)`;return(0,q.jsxs)(`section`,{className:`sc`,children:[(0,q.jsxs)(`svg`,{className:`sc-sky`,viewBox:`0 0 1000 300`,preserveAspectRatio:`xMidYMax slice`,"aria-hidden":!0,children:[(0,q.jsx)(`rect`,{width:`1000`,height:`300`,fill:`#1a1b1d`}),c.map((e,t)=>(0,q.jsxs)(`g`,{children:[(0,q.jsx)(`rect`,{x:e.x,y:300-e.h,width:e.w,height:e.h,fill:`#222427`}),e.windows.filter(e=>e.on).map((e,t)=>(0,q.jsx)(`rect`,{x:e.x,y:e.y,width:`4`,height:`5`,fill:`#5a5f63`,opacity:`0.5`},t))]},`b${t}`)),u.map((e,t)=>(0,q.jsx)(`rect`,{x:e.x,y:e.y,width:e.w,height:e.h,fill:e.alt?m:p,opacity:`0.85`},`s${t}`)),l.map((e,t)=>(0,q.jsxs)(`g`,{children:[(0,q.jsx)(`rect`,{x:e.x,y:300-e.h,width:e.w,height:e.h,fill:`#121314`}),e.antenna&&(0,q.jsx)(`rect`,{x:e.x+e.w/2,y:300-e.h-26,width:`2`,height:`26`,fill:`#121314`}),e.windows.filter(e=>e.on).map((e,t)=>(0,q.jsx)(`rect`,{x:e.x,y:e.y,width:`4`,height:`5`,fill:t%4?`#6b7074`:p,opacity:`0.55`},t))]},`f${t}`))]}),(0,q.jsx)(`div`,{className:`sc-dots`,"aria-hidden":!0}),o&&(0,q.jsx)(`span`,{className:`sc-emblem`,"aria-hidden":!0,children:o}),(0,q.jsx)(`h2`,{className:`sc-title`,children:e}),(d||s)&&(0,q.jsxs)(`div`,{className:`sc-dialog`,children:[t&&(0,q.jsxs)(`span`,{className:`sc-tag`,children:[`[`,t,`]`]}),n&&(0,q.jsxs)(`b`,{children:[n,`:`]}),d&&(0,q.jsx)(`p`,{children:d}),s]})]})}var On={ArrowUp:`up`,ArrowDown:`down`,ArrowLeft:`left`,ArrowRight:`right`,KeyW:`up`,KeyS:`down`,KeyA:`left`,KeyD:`right`},kn={Backquote:`bossKey`,Escape:`close`},An={menu:kn,dungeon:{...kn,...On},sync:{...kn,...On},combat:{...kn,Digit1:`weapon1`,Digit2:`weapon2`,Digit3:`weapon3`,Numpad1:`weapon1`,Numpad2:`weapon2`,Numpad3:`weapon3`,KeyQ:`item1`,KeyW:`item2`,KeyE:`item3`,KeyX:`escape`,Enter:`confirm`,Space:`confirm`}};function jn(e,t){let n=e.target;return n&&(n.tagName===`INPUT`||n.tagName===`TEXTAREA`||n.isContentEditable)?e.code===`Escape`?`close`:null:e.ctrlKey||e.metaKey||e.altKey?null:An[t][e.code]??null}var Mn=/\b(import|from|export|class|constructor|private|readonly|async|await|const|for|of|if|continue|return|new)\b/g;function Nn(e){let t=[],n=e.indexOf(`/**`)>=0?e.indexOf(`/**`):e.indexOf(`//`),r=n>=0?e.slice(0,n):e,i=0;for(let e of r.matchAll(RegExp(`${Mn.source}|'[^']*'|@\\w+`,`g`))){e.index>i&&t.push(r.slice(i,e.index));let n=e[0];t.push((0,q.jsx)(`span`,{className:n.startsWith(`'`)?`bk-str`:n.startsWith(`@`)?`bk-dec`:`bk-kw`,children:n},e.index)),i=e.index+n.length}return t.push(r.slice(i)),n>=0&&t.push((0,q.jsx)(`span`,{className:`bk-com`,children:e.slice(n)},`c`)),t}function Pn({onBack:e}){let t=ne.split(`
|
|
36
36
|
`);return(0,q.jsxs)(`div`,{className:`bk`,onDoubleClick:e,children:[(0,q.jsx)(`div`,{className:`bk-title`,children:(0,q.jsx)(`span`,{children:`invoice-reconciler.service.ts — billing-core — Visual Studio Code`})}),(0,q.jsxs)(`div`,{className:`bk-body`,children:[(0,q.jsxs)(`div`,{className:`bk-activity`,"aria-hidden":!0,children:[(0,q.jsx)(`i`,{}),(0,q.jsx)(`i`,{}),(0,q.jsx)(`i`,{}),(0,q.jsx)(`i`,{})]}),(0,q.jsxs)(`div`,{className:`bk-tree`,children:[(0,q.jsx)(`p`,{children:`EXPLORER`}),(0,q.jsxs)(`ul`,{children:[(0,q.jsx)(`li`,{children:`▾ billing-core`}),(0,q.jsx)(`li`,{className:`bk-l1`,children:`▾ src`}),(0,q.jsx)(`li`,{className:`bk-l2`,children:`▾ invoices`}),(0,q.jsx)(`li`,{className:`bk-l3`,children:`invoice.entity.ts`}),(0,q.jsx)(`li`,{className:`bk-l3 is-on`,children:`invoice-reconciler.service.ts`}),(0,q.jsx)(`li`,{className:`bk-l3`,children:`invoices.module.ts`}),(0,q.jsx)(`li`,{className:`bk-l2`,children:`▸ payments`}),(0,q.jsx)(`li`,{className:`bk-l1`,children:`package.json`})]})]}),(0,q.jsxs)(`div`,{className:`bk-editor`,children:[(0,q.jsxs)(`div`,{className:`bk-tabs`,children:[(0,q.jsx)(`span`,{className:`is-on`,children:`invoice-reconciler.service.ts`}),(0,q.jsx)(`span`,{children:`invoice.entity.ts`})]}),(0,q.jsx)(`pre`,{children:t.map((e,t)=>(0,q.jsxs)(`div`,{children:[(0,q.jsx)(`span`,{className:`bk-ln`,children:t+1}),Nn(e)]},t))})]})]}),(0,q.jsxs)(`div`,{className:`bk-status`,children:[(0,q.jsx)(`span`,{children:`⎇ main`}),(0,q.jsx)(`span`,{children:`TypeScript`}),(0,q.jsx)(`span`,{children:`UTF-8`}),(0,q.jsx)(`span`,{children:`Ln 18, Col 42`})]})]})}var J=e=>Math.round(e).toLocaleString(`ko-KR`);function Y(e){let t=Math.max(0,Math.ceil(e/1e3)),n=Math.floor(t/3600),r=Math.floor(t%3600/60),i=t%60;return n?`${n}시간 ${r}분`:r?`${r}분 ${i}초`:`${i}초`}function X({value:e,max:t,kind:n,label:r,compact:i}){let a=t>0?Math.max(0,Math.min(100,e/t*100)):0;return(0,q.jsxs)(`div`,{className:`ar-bar ar-bar--${n}${i?` ar-bar--compact`:``}`,role:`meter`,"aria-valuenow":Math.round(e),"aria-valuemin":0,"aria-valuemax":Math.round(t),"aria-label":r,children:[(0,q.jsx)(`i`,{style:{width:`${a}%`}}),(0,q.jsxs)(`span`,{children:[r?`${r} `:``,J(e),` / `,J(t)]})]})}function Fn({r:e,children:t}){return(0,q.jsx)(`span`,{className:`rar rar-${e}`,children:t})}function In(e,t){return`${p[e]} +${m.includes(e)?`${t}%`:e===`armor`?t.toFixed(1):J(t)}`}function Ln(e){if(e.kind===`module`)return In(e.stat,e.main);let t=[e.slot===`primary`||e.slot===`special`||e.slot===`destructive`?`피해 ${J(e.main)}`:`체력 ${J(e.main)}`];for(let[n,r]of Object.entries(e.affixes))t.push(In(n,r??0));return t.join(` · `)}function Rn({it:e}){return(0,q.jsxs)(`span`,{className:`ar-item-name`,children:[(0,q.jsx)(Fn,{r:e.rarity,children:e.name}),(0,q.jsxs)(`small`,{children:[`Lv.`,e.level,` `,a[e.rarity],` `,e.kind===`module`?`모듈`:u[e.slot]]})]})}function Z({title:e,sub:t,children:n,aside:r,className:i}){return(0,q.jsxs)(`section`,{className:`ar-panel${i?` ${i}`:``}`,children:[(0,q.jsxs)(`header`,{children:[(0,q.jsxs)(`div`,{children:[(0,q.jsx)(`h2`,{children:e}),t&&(0,q.jsx)(`p`,{children:t})]}),r]}),(0,q.jsx)(`div`,{className:`ar-panel-body`,children:n})]})}function Q({children:e,onClick:t,disabled:n,kind:r=`normal`,title:i,hotkey:a}){return(0,q.jsxs)(`button`,{type:`button`,className:`ar-btn ar-btn--${r}`,onClick:t,disabled:n,title:i,children:[a&&(0,q.jsx)(`kbd`,{children:a}),e]})}var zn={cells:`에너지 탄약`,antimatter:`반물질`,med:`의료 부품`,ammoparts:`탄약 부품`,scrap:`고철`},Bn=(e,t)=>e.items.filter(e=>e.installedIn===t.id);function Vn({s:e,gear:t,send:n,busy:r}){let i=Bn(e,t);return(0,q.jsx)(`div`,{className:`ar-mods`,children:Array.from({length:t.modSlots},(e,t)=>{let a=i[t];return a?(0,q.jsxs)(`button`,{type:`button`,className:`ar-mod rar-${a.rarity}`,disabled:r,onClick:()=>void n([{t:`mod.remove`,mod:a.id}]),title:`눌러서 빼기`,children:[In(a.stat,a.main),` ✕`]},a.id):(0,q.jsx)(`span`,{className:`ar-mod is-empty`,children:`빈 모듈 칸`},t)})})}function Hn({s:e,send:t,busy:n,now:r}){let i=B(e,r),a=t=>e.items.find(e=>e.equipped&&e.slot===t),o=[[`최대 체력`,J(i.maxHp)],[`실드`,J(i.maxShield)],[`방어`,String(i.armor)],[`치명타`,`${i.crit.toFixed(1)}%`],[`치명 피해`,`${i.critDmg.toFixed(0)}%`],[`회피`,`${i.evade.toFixed(1)}%`],[`도주`,`${i.escape.toFixed(0)}%`],[`기절`,`${i.stun.toFixed(1)}%`],[`재생/턴`,J(i.regen)],[`피해 보너스`,`${i.dmgPct.toFixed(0)}%`],[`받는 피해 감소`,`${i.defPct}%`]];return(0,q.jsxs)(`div`,{className:`ar-split`,children:[(0,q.jsx)(Z,{title:`장비`,sub:`장비 레벨이 내 레벨보다 높으면 장착할 수 없다. 모듈은 가방에서 끼운다.`,children:(0,q.jsx)(`div`,{className:`ar-doll`,children:c.map(r=>{let i=a(r);return(0,q.jsxs)(`div`,{className:`ar-slot${i?` rar-edge-${i.rarity}`:` is-empty`}`,children:[(0,q.jsx)(`span`,{className:`ar-slot-label`,children:u[r]}),i?(0,q.jsxs)(q.Fragment,{children:[(0,q.jsx)(Rn,{it:i}),(0,q.jsx)(`small`,{children:Ln(i)}),(0,q.jsx)(Vn,{s:e,gear:i,send:t,busy:n}),(0,q.jsx)(Q,{kind:`ghost`,disabled:n||!!e.combat,onClick:()=>void t([{t:`unequip`,id:i.id}]),children:`해제`})]}):(0,q.jsx)(`span`,{className:`ar-dim`,children:l.includes(r)?r===`primary`?`맨손`:`없음 — 무기고나 포지에서`:`없음`})]},r)})})}),(0,q.jsxs)(`div`,{className:`ar-stack`,children:[(0,q.jsxs)(Z,{title:`능력치`,children:[(0,q.jsxs)(`div`,{className:`ar-weapon-line`,children:[(0,q.jsxs)(`span`,{children:[`주무기 `,(0,q.jsx)(`b`,{children:J(i.dmg.primary)})]}),(0,q.jsxs)(`span`,{children:[`특수 `,(0,q.jsx)(`b`,{children:J(i.dmg.special)})]}),(0,q.jsxs)(`span`,{children:[`파괴 `,(0,q.jsx)(`b`,{children:J(i.dmg.destructive)})]})]}),(0,q.jsx)(`dl`,{className:`ar-stats`,children:o.map(([e,t])=>(0,q.jsxs)(`div`,{children:[(0,q.jsx)(`dt`,{children:e}),(0,q.jsx)(`dd`,{children:t})]},e))})]}),(0,q.jsxs)(Z,{title:`숙련도·버프`,children:[[`printing`,`medical`,`ammo`].map(t=>(0,q.jsx)(X,{value:e.skills[t].xp,max:ce(e.skills[t].lv),kind:`xp`,label:`${t===`printing`?`인쇄`:t===`medical`?`의료`:`탄약`} ${e.skills[t].lv}`},t)),(0,q.jsxs)(`ul`,{className:`ar-buffs`,children:[(e.overclockUntil??0)>r&&(0,q.jsxs)(`li`,{children:[`오버클럭 · `,Y(e.overclockUntil-r)]}),ue(e,r).map(e=>(0,q.jsxs)(`li`,{children:[C.find(t=>t.id===e.id)?.label,` · `,Y(e.until-r)]},e.id)),!ue(e,r).length&&!((e.overclockUntil??0)>r)&&(0,q.jsx)(`li`,{className:`ar-dim`,children:`적용 중인 버프 없음`})]})]}),(0,q.jsx)(Z,{title:`단축칸 (Q · W · E)`,sub:`던전·레이드 전투에서 쓸 회복제`,children:(0,q.jsx)(`div`,{className:`ar-hotbar-set`,children:e.hotbar.map((r,i)=>(0,q.jsxs)(`label`,{children:[(0,q.jsx)(`kbd`,{children:`QWE`[i]}),(0,q.jsxs)(`select`,{value:r??``,disabled:n,onChange:e=>void t([{t:`hotbar`,slot:i,tier:e.target.value===``?null:Number(e.target.value)}]),children:[(0,q.jsx)(`option`,{value:``,children:`비우기`}),_.map((t,n)=>(0,q.jsxs)(`option`,{value:n,children:[t.name,` (`,N(e,`heal:${n}`),`)`]},t.name))]})]},i))})})]})]})}function Un({s:e,m:t,send:n,busy:i}){let a=e.items.filter(n=>n.kind===`gear`&&n.level>=t.level&&Bn(e,n).length<n.modSlots),[o,s]=(0,r.useState)(``);return a.length?(0,q.jsxs)(`span`,{className:`ar-btn-row`,children:[(0,q.jsxs)(`select`,{value:o,onChange:e=>s(e.target.value),"aria-label":`모듈을 끼울 장비`,children:[(0,q.jsx)(`option`,{value:``,children:`장비 선택`}),a.map(e=>(0,q.jsxs)(`option`,{value:e.id,children:[e.equipped?`[장착] `:``,e.name,` Lv.`,e.level]},e.id))]}),(0,q.jsx)(Q,{disabled:i||!o,onClick:()=>void n([{t:`mod.install`,mod:t.id,gear:o}]),children:`끼우기`})]}):(0,q.jsx)(`small`,{className:`ar-dim`,children:`끼울 수 있는 장비 없음`})}function Wn({s:e,send:t,busy:n}){let[o,s]=(0,r.useState)(`all`),c=e.items.filter(e=>!e.equipped&&!e.installedIn).filter(e=>o===`all`||(o===`module`?e.kind===`module`:e.kind===`gear`&&(l.includes(e.slot)?o===`weapon`:o===`armor`))).sort((e,t)=>t.level-e.level||i.indexOf(t.rarity)-i.indexOf(e.rarity)),u=!!e.dungeon,d=Object.entries(e.stacks).sort(([e],[t])=>e.localeCompare(t)),f=e=>{if(zn[e])return zn[e];let[t,n,r]=e.split(`:`);return t===`heal`?_[Number(n)].name:t===`cache`?(0,q.jsxs)(q.Fragment,{children:[(0,q.jsx)(Fn,{r,children:a[r]}),` `,n===`weapon`?`무기`:`방어구`,` 상자`]}):t===`frag`?`열쇠 조각 ${y[Number(n)].dungeons[Number(r)].fragment} (${y[Number(n)].name})`:e};return(0,q.jsxs)(`div`,{className:`ar-split`,children:[(0,q.jsx)(Z,{title:`가방 ${be(e)}/${e.bagCap}`,sub:u?`던전 안에서는 팔거나 분해할 수 없다.`:`가방이 가득 차면 새로 얻은 장비는 고철이 된다.`,aside:(0,q.jsx)(`div`,{className:`ar-seg`,role:`radiogroup`,"aria-label":`분류`,children:[`all`,`weapon`,`armor`,`module`].map(e=>(0,q.jsx)(`button`,{type:`button`,role:`radio`,"aria-checked":e===o,className:e===o?`is-on`:``,onClick:()=>s(e),children:{all:`전체`,weapon:`무기`,armor:`방어구`,module:`모듈`}[e]},e))}),children:c.length===0?(0,q.jsx)(`p`,{className:`ar-dim`,children:`비어 있다.`}):(0,q.jsx)(`ul`,{className:`ar-list`,children:c.map(r=>(0,q.jsxs)(`li`,{children:[(0,q.jsxs)(`div`,{children:[(0,q.jsx)(Rn,{it:r}),(0,q.jsxs)(`small`,{children:[Ln(r),r.kind===`gear`?` · 모듈 칸 ${r.modSlots}`:``]})]}),(0,q.jsxs)(`span`,{className:`ar-btn-row`,children:[r.kind===`gear`?(0,q.jsx)(Q,{kind:`primary`,disabled:n||r.level>e.level||!!e.combat,title:r.level>e.level?`Lv.${r.level} 필요`:void 0,onClick:()=>void t([{t:`equip`,id:r.id}]),children:`장착`}):(0,q.jsx)(Un,{s:e,m:r,send:t,busy:n}),(0,q.jsxs)(Q,{disabled:n||u,onClick:()=>void t([{t:`sell`,id:r.id}]),children:[`판매 ¥`,J(ye(r))]}),(0,q.jsx)(Q,{kind:`ghost`,disabled:n||u,onClick:()=>void t([{t:`scrap`,id:r.id}]),children:`분해`})]})]},r.id))})}),(0,q.jsx)(Z,{title:`소지품`,sub:`칸을 차지하지 않는다`,children:(0,q.jsxs)(`ul`,{className:`ar-stacks`,children:[(0,q.jsxs)(`li`,{children:[(0,q.jsx)(`span`,{children:`크레딧`}),(0,q.jsxs)(`b`,{children:[`¥`,J(e.credits)]})]}),d.map(([e,t])=>(0,q.jsxs)(`li`,{children:[(0,q.jsx)(`span`,{children:f(e)}),(0,q.jsx)(`b`,{children:J(t)})]},e))]})})]})}function Gn({s:e,send:t,busy:n}){let r=e.skills.medical,i=e.skills.ammo;return(0,q.jsxs)(`div`,{className:`ar-split`,children:[(0,q.jsxs)(Z,{title:`의료 제작`,sub:`의료 부품으로 회복제를 만든다. 숙련도가 오르면 상위 약이 열린다.`,children:[(0,q.jsx)(X,{value:r.xp,max:ce(r.lv),kind:`xp`,label:`의료 숙련 ${r.lv}`}),(0,q.jsx)(`ul`,{className:`ar-list`,children:_.map((i,a)=>(0,q.jsxs)(`li`,{className:r.lv<i.med?`is-sold`:``,children:[(0,q.jsxs)(`div`,{children:[(0,q.jsx)(`b`,{children:i.name}),(0,q.jsxs)(`small`,{children:[`체력 +`,J(i.heal),` · 의료 부품 `,i.parts,` · 숙련 `,i.med,` 필요 · 보유 `,N(e,`heal:${a}`)]})]}),(0,q.jsx)(Q,{disabled:n||r.lv<i.med||N(e,`med`)<i.parts,onClick:()=>void t([{t:`craft`,recipe:`heal`,tier:a}]),children:`제작`})]},i.name))}),(0,q.jsxs)(`p`,{className:`ar-hint`,children:[`의료 부품 `,N(e,`med`),`개 보유`]})]}),(0,q.jsxs)(Z,{title:`탄약·모듈`,sub:`탄약 숙련도가 오르면 같은 재료로 더 많이 만든다.`,children:[(0,q.jsx)(X,{value:i.xp,max:ce(i.lv),kind:`xp`,label:`탄약 숙련 ${i.lv}`}),(0,q.jsxs)(`ul`,{className:`ar-list`,children:[(0,q.jsxs)(`li`,{children:[(0,q.jsxs)(`div`,{children:[(0,q.jsxs)(`b`,{children:[`에너지 탄약 ×`,3+Math.floor(i.lv/8)]}),(0,q.jsx)(`small`,{children:`탄약 부품 1`})]}),(0,q.jsx)(Q,{disabled:n||N(e,`ammoparts`)<1,onClick:()=>void t([{t:`craft`,recipe:`cells`,tier:0}]),children:`제작`})]}),(0,q.jsxs)(`li`,{children:[(0,q.jsxs)(`div`,{children:[(0,q.jsxs)(`b`,{children:[`반물질 ×`,1+Math.floor(i.lv/15)]}),(0,q.jsx)(`small`,{children:`탄약 부품 3 + 고철 1`})]}),(0,q.jsx)(Q,{disabled:n||N(e,`ammoparts`)<3||N(e,`scrap`)<1,onClick:()=>void t([{t:`craft`,recipe:`antimatter`,tier:0}]),children:`제작`})]}),(0,q.jsxs)(`li`,{children:[(0,q.jsxs)(`div`,{children:[(0,q.jsxs)(`b`,{children:[`모듈 조립 (Lv.`,e.level,`)`]}),(0,q.jsxs)(`small`,{children:[`고철 12 + ¥`,J(Bt(e)),` · 능력치 하나, 등급 무작위`]})]}),(0,q.jsx)(Q,{disabled:n||N(e,`scrap`)<12||e.credits<Bt(e),onClick:()=>void t([{t:`craft`,recipe:`module`,tier:0}]),children:`조립`})]})]}),(0,q.jsxs)(`p`,{className:`ar-hint`,children:[`탄약 부품 `,N(e,`ammoparts`),` · 고철 `,N(e,`scrap`)]})]})]})}function Kn({s:e,send:t,busy:n}){return(0,q.jsx)(Z,{title:`퀘스트`,sub:`끝내면 바로 다음 의뢰가 들어온다.`,children:(0,q.jsx)(`ul`,{className:`ar-quests`,children:e.quests.map(e=>{let r=e.have>=e.need;return(0,q.jsxs)(`li`,{className:r?`is-done`:``,children:[(0,q.jsxs)(`div`,{children:[(0,q.jsxs)(`b`,{children:[je[e.kind],` `,e.need,e.kind===`dungeon`||e.kind===`ice`?`회`:`개`]}),(0,q.jsxs)(`small`,{children:[`보상 ¥`,J(e.credits),` · 경험치 `,J(e.xp)]}),(0,q.jsx)(X,{value:e.have,max:e.need,kind:`xp`,compact:!0})]}),(0,q.jsx)(Q,{kind:`primary`,disabled:n||!r,onClick:()=>void t([{t:`quest.claim`,id:e.id}]),children:`보상 받기`})]},e.id)})})})}var qn=[{id:`rail`,name:`마그레일 역`,glyph:`⇶`,desc:`구역 이동. 길거리 적과 던전`},{id:`forge`,name:`나노 포지`,glyph:`⬢`,desc:`상자를 장비로 인쇄`},{id:`smith`,name:`도크의 무기고`,glyph:`⚒`,desc:`장비·탄약 구매`},{id:`pharm`,name:`펄스 약국`,glyph:`✚`,desc:`회복제·부품 구매`},{id:`terminal`,name:`브루트포스 터미널`,glyph:`⌘`,desc:`열쇠 합성, ICE 크래킹`},{id:`gigs`,name:`긱 보드`,glyph:`☰`,desc:`자리를 비운 사이 일감`},{id:`market`,name:`블랙마켓`,glyph:`◐`,desc:`매일 09:00 재입고`},{id:`raid`,name:`레이드 브리핑`,glyph:`☠`,desc:`하루 한 번, 용병과 보스 사냥`},{id:`relay`,name:`오버클럭 송신탑`,glyph:`⌁`,desc:`30분 피해·일감 강화`},{id:`records`,name:`러너 기록`,glyph:`≡`,desc:`누적 기록과 최단 시간`}];function Jn({s:e,now:t,offset:n,go:r}){let i={rail:y[e.unlocked].name,gigs:e.job?t>=e.job.endsAt?`정산 가능`:`${Y(e.job.endsAt-t)} 남음`:`대기 중`,market:`재입고 ${Y(se(t,n)-t)}`,raid:gn(e,{now:t,utcOffsetMin:n})?`오늘 가능`:`내일 09:00`,terminal:(e.iceUntil??0)>t?`ICE ${Y(e.iceUntil-t)}`:`ICE 가능`,relay:(e.overclockUntil??0)>t?`가동 ${Y(e.overclockUntil-t)}`:`꺼짐`,forge:`숙련 ${e.skills.printing.lv}`},a=B(e,t).maxHp;return(0,q.jsxs)(`div`,{className:`ar-city`,children:[(0,q.jsx)(Dn,{title:`Zero Plaza · 제로 플라자`,tag:E.city.tag,lines:E.city.lines,hue:E.city.hue,children:(0,q.jsxs)(`p`,{className:`ar-dim`,children:[`도시에서는 체력이 빠르게 회복된다 (`,J(Ie(e,t)),`/`,J(a),`).`]})}),(0,q.jsx)(`h3`,{className:`ar-section`,children:`// 시설`}),(0,q.jsx)(`div`,{className:`ar-places`,children:qn.map(e=>(0,q.jsxs)(`button`,{type:`button`,className:`ar-place ar-place--${e.id}`,onClick:()=>r(e.id),children:[(0,q.jsx)(`span`,{className:`ar-place-glyph`,"aria-hidden":!0,children:e.glyph}),(0,q.jsx)(`span`,{className:`ar-place-name`,children:e.name}),(0,q.jsx)(`span`,{className:`ar-place-desc`,children:e.desc}),i[e.id]&&(0,q.jsx)(`em`,{className:`ar-place-badge`,children:i[e.id]})]},e.id))})]})}function Yn({s:e,send:t,busy:n}){let[i,a]=(0,r.useState)(e.unlocked),o=y[i],s=i>e.unlocked;return(0,q.jsxs)(Z,{title:`노선 안내`,sub:`하이퍼루프 노선. 열쇠를 만들면 다음 구역이 열린다.`,children:[(0,q.jsx)(`div`,{className:`ar-tabs`,role:`tablist`,children:y.map((t,n)=>(0,q.jsxs)(`button`,{type:`button`,role:`tab`,"aria-selected":n===i,className:n===i?`is-on`:``,onClick:()=>a(n),children:[(0,q.jsx)(`span`,{children:t.glyph}),` `,t.name,` `,n>e.unlocked&&`🔒`]},t.name))}),(0,q.jsxs)(`p`,{className:`ar-blurb`,children:[o.blurb,` `,(0,q.jsxs)(`span`,{className:`ar-dim`,children:[`권장 Lv.`,o.areas[0].min,`–`,o.areas[2].max]})]}),s?(0,q.jsxs)(`p`,{className:`ar-bad`,children:[`잠긴 노선. `,y[i-1].name,`의 열쇠 조각 3개를 터미널에서 합치세요.`]}):(0,q.jsxs)(`div`,{className:`ar-cols`,children:[(0,q.jsxs)(`div`,{children:[(0,q.jsx)(`h3`,{children:`길거리`}),(0,q.jsx)(`ul`,{className:`ar-list`,children:o.areas.map((e,r)=>(0,q.jsxs)(`li`,{children:[(0,q.jsxs)(`div`,{children:[(0,q.jsx)(`b`,{children:e.name}),(0,q.jsxs)(`small`,{children:[`적 Lv.`,e.min,`–`,e.max,` · 회복 불가, 도주 100%`]})]}),(0,q.jsx)(Q,{disabled:n,onClick:()=>void t([{t:`street.enter`,station:i,area:r}]),children:`이동`})]},e.name))})]}),(0,q.jsxs)(`div`,{children:[(0,q.jsx)(`h3`,{children:`던전`}),(0,q.jsx)(`ul`,{className:`ar-list`,children:o.dungeons.map((r,a)=>{let o=e.records.filter(e=>e.station===i&&e.dungeon===a),s=N(e,ie(i,a))>0;return(0,q.jsxs)(`li`,{children:[(0,q.jsxs)(`div`,{children:[(0,q.jsx)(`b`,{children:r.name}),(0,q.jsxs)(`small`,{children:[`Lv.`,r.level,` (도전 `,r.level+2,`) · 조각 `,r.fragment,` `,s?`보유`:`없음`,o.length?` · 최고 ${Y(Math.min(...o.map(e=>e.bestMs??1/0)))}`:``]})]}),(0,q.jsxs)(`span`,{className:`ar-btn-row`,children:[(0,q.jsx)(Q,{disabled:n||e.level<r.level-6,title:e.level<r.level-6?`Lv.${r.level-6} 이상`:void 0,onClick:()=>void t([{t:`dungeon.enter`,station:i,dungeon:a,challenge:!1}]),children:`일반`}),(0,q.jsx)(Q,{kind:`danger`,disabled:n||e.level<r.level-4,onClick:()=>void t([{t:`dungeon.enter`,station:i,dungeon:a,challenge:!0}]),children:`도전`})]})]},r.name)})}),(0,q.jsx)(`p`,{className:`ar-hint`,children:`도전 던전: 적이 더 많고 보스가 있다. 전리품 등급이 오른다.`})]})]})]})}function Xn({s:e,send:t,busy:n,now:r}){let i=e.street,a=y[i.station].areas[i.area],o=B(e,r).maxHp;return(0,q.jsxs)(q.Fragment,{children:[(0,q.jsx)(Dn,{title:a.name,tag:`${y[i.station].name} · Lv.${a.min}–${a.max}`,lines:E.street.lines,hue:(E.street.hue+i.station*40+i.area*12)%360,glyph:y[i.station].glyph}),(0,q.jsxs)(Z,{title:`근처의 적`,sub:`골라서 싸운다. 도주는 항상 성공한다.`,aside:(0,q.jsx)(Q,{kind:`ghost`,disabled:n,onClick:()=>void t([{t:`street.leave`}]),children:`도시로 돌아가기`}),children:[(0,q.jsx)(X,{value:Ie(e,r),max:o,kind:`hp`,label:`내 체력`}),(0,q.jsx)(`p`,{className:`ar-hint`,children:`길거리에서는 체력이 천천히 찬다. 도시로 가면 빨리 찬다.`}),(0,q.jsx)(`ul`,{className:`ar-foes`,children:i.foes.map((i,a)=>(0,q.jsxs)(`li`,{className:i.mods.length?`has-mods`:``,children:[(0,q.jsx)(`span`,{className:`ar-foe-glyph`,"aria-hidden":!0,children:`ж`}),(0,q.jsxs)(`div`,{children:[(0,q.jsxs)(`b`,{children:[i.mods.map(e=>v[e].label).join(` `),` `,i.name]}),(0,q.jsxs)(`small`,{children:[`Lv.`,i.level,` · 체력 `,J(i.hp),i.maxShield?` · 실드 ${J(i.shield)}`:``,i.mods.map(e=>` · ${v[e].hint}`).join(``)]})]}),(0,q.jsx)(Q,{kind:`primary`,disabled:n||Ie(e,r)<=0,onClick:()=>void t([{t:`street.fight`,idx:a}]),children:`공격`})]},a))})]})]})}function Zn({s:e,send:t,busy:n}){let r=e.skills.printing,o=Lt(e),s=[`weapon`,`armor`].map(t=>({kind:t,caches:i.map(n=>({r:n,n:N(e,L(t,n))}))}));return(0,q.jsxs)(Z,{title:`인쇄 대기열`,sub:`상자를 장비로 인쇄한다. 인쇄된 장비 레벨 = min(인쇄 숙련도, 내 레벨) = Lv.${o}`,children:[(0,q.jsx)(X,{value:r.xp,max:ce(r.lv),kind:`xp`,label:`인쇄 숙련 ${r.lv}`}),(0,q.jsx)(`p`,{className:`ar-hint`,children:`폐품 상자를 찍고 분해하면 숙련도가 빨리 오른다. 장비 분해: 가방에서.`}),(0,q.jsxs)(`table`,{className:`ar-table`,children:[(0,q.jsx)(`thead`,{children:(0,q.jsxs)(`tr`,{children:[(0,q.jsx)(`th`,{children:`상자`}),i.map(e=>(0,q.jsx)(`th`,{children:(0,q.jsx)(Fn,{r:e,children:a[e]})},e))]})}),(0,q.jsx)(`tbody`,{children:s.map(({kind:r,caches:i})=>(0,q.jsxs)(`tr`,{children:[(0,q.jsx)(`th`,{children:r===`weapon`?`무기`:`방어구`}),i.map(({r:i,n:a})=>(0,q.jsx)(`td`,{children:(0,q.jsxs)(`div`,{className:`ar-cache`,children:[(0,q.jsxs)(`b`,{children:[`×`,a]}),(0,q.jsxs)(Q,{disabled:n||a===0||e.credits<Rt(e,i),onClick:()=>void t([{t:`print`,kind:r,rarity:i}]),children:[`¥`,J(Rt(e,i))]})]})},i))]},r))})]})]})}function Qn({s:e,send:t,busy:n,now:r}){let i=e.smith?.offers??[],a=(Math.floor(r/36e5)+1)*36e5;return(0,q.jsxs)(Z,{title:`진열대`,sub:`"레벨 맞춰서 갖다 놨어. 한 시간마다 물건 바뀐다." — 다음 입고 ${Y(a-r)}`,aside:(0,q.jsxs)(Q,{kind:`ghost`,disabled:n,onClick:()=>void t([{t:`smith.refresh`}]),children:[`바로 재입고 ¥`,J(20*e.level)]}),children:[(0,q.jsx)(`ul`,{className:`ar-list`,children:i.map(r=>r.kind===`gear`&&(0,q.jsxs)(`li`,{className:r.sold?`is-sold`:``,children:[(0,q.jsxs)(`div`,{children:[(0,q.jsx)(Rn,{it:r.item}),(0,q.jsxs)(`small`,{children:[Ln(r.item),` · 모듈 칸 `,r.item.modSlots]})]}),(0,q.jsx)(Q,{kind:`primary`,disabled:n||!!r.sold||e.credits<r.price,onClick:()=>void t([{t:`smith.buy`,id:r.id}]),children:r.sold?`판매됨`:`¥${J(r.price)}`})]},r.id))}),(0,q.jsx)(`h3`,{children:`탄약`}),(0,q.jsxs)(`ul`,{className:`ar-list`,children:[(0,q.jsxs)(`li`,{children:[(0,q.jsxs)(`div`,{children:[(0,q.jsx)(`b`,{children:`에너지 탄약 ×10`}),(0,q.jsxs)(`small`,{children:[`특수무기용 · 보유 `,N(e,`cells`)]})]}),(0,q.jsxs)(Q,{disabled:n||e.credits<Ht(e),onClick:()=>void t([{t:`smith.ammo`,kind:`cells`}]),children:[`¥`,J(Ht(e))]})]}),(0,q.jsxs)(`li`,{children:[(0,q.jsxs)(`div`,{children:[(0,q.jsx)(`b`,{children:`반물질 ×3`}),(0,q.jsxs)(`small`,{children:[`파괴무기용 · 보유 `,N(e,`antimatter`)]})]}),(0,q.jsxs)(Q,{disabled:n||e.credits<Ut(e),onClick:()=>void t([{t:`smith.ammo`,kind:`antimatter`}]),children:[`¥`,J(Ut(e))]})]})]})]})}function $n({s:e,send:t,busy:n}){let r=Gt(e);return(0,q.jsx)(Z,{title:`약품 진열대`,sub:`새 구역이 열릴수록 더 좋은 약을 들여온다. 직접 만들면 더 싸다(제작).`,children:(0,q.jsxs)(`ul`,{className:`ar-list`,children:[_.map((i,a)=>(0,q.jsxs)(`li`,{className:a>r?`is-sold`:``,children:[(0,q.jsxs)(`div`,{children:[(0,q.jsx)(`b`,{children:i.name}),(0,q.jsxs)(`small`,{children:[`체력 +`,J(i.heal),` · 보유 `,N(e,`heal:${a}`),a>r?` · 아직 입고 전`:``]})]}),(0,q.jsxs)(`span`,{className:`ar-btn-row`,children:[(0,q.jsxs)(Q,{disabled:n||a>r||e.credits<i.price,onClick:()=>void t([{t:`pharm.buy`,tier:a,n:1}]),children:[`×1 ¥`,J(i.price)]}),(0,q.jsxs)(Q,{disabled:n||a>r||e.credits<i.price*5,onClick:()=>void t([{t:`pharm.buy`,tier:a,n:5}]),children:[`×5 ¥`,J(i.price*5)]})]})]},i.name)),[`med`,`ammoparts`].map(r=>(0,q.jsxs)(`li`,{children:[(0,q.jsxs)(`div`,{children:[(0,q.jsxs)(`b`,{children:[r===`med`?`의료 부품`:`탄약 부품`,` ×5`]}),(0,q.jsxs)(`small`,{children:[`제작 재료 · 보유 `,N(e,r)]})]}),(0,q.jsxs)(Q,{disabled:n||e.credits<Wt[r]*5,onClick:()=>void t([{t:`pharm.parts`,code:r}]),children:[`¥`,J(Wt[r]*5)]})]},r))]})})}function er({s:e,send:t,busy:n,now:r}){let i=e.unlocked,a=i<y.length-1,o=(e.iceUntil??0)-r;return(0,q.jsx)(Z,{title:`단말 접속`,sub:`열쇠 조각을 합쳐 다음 노선을 연다. 남는 시간엔 ICE를 깬다.`,children:(0,q.jsxs)(`div`,{className:`ar-cols`,children:[(0,q.jsxs)(`div`,{className:`ar-card`,children:[(0,q.jsx)(`h3`,{children:`비밀 열쇠`}),a?(0,q.jsxs)(q.Fragment,{children:[(0,q.jsxs)(`p`,{children:[y[i].name,` → `,(0,q.jsx)(`b`,{className:`ar-accent`,children:y[i+1].name})]}),(0,q.jsx)(`ul`,{className:`ar-frags`,children:y[i].dungeons.map((t,n)=>(0,q.jsxs)(`li`,{className:N(e,ie(i,n))?`is-have`:``,children:[(0,q.jsx)(`b`,{children:t.fragment}),(0,q.jsx)(`small`,{children:t.name})]},t.name))}),(0,q.jsxs)(Q,{kind:`primary`,disabled:n||[0,1,2].some(t=>!N(e,ie(i,t)))||e.credits<nn(i),onClick:()=>void t([{t:`key.forge`,station:i}]),children:[`합성 ¥`,J(nn(i))]})]}):(0,q.jsx)(`p`,{children:`모든 노선이 열렸다.`})]}),(0,q.jsxs)(`div`,{className:`ar-card`,children:[(0,q.jsx)(`h3`,{children:`ICE 크래킹`}),(0,q.jsx)(`p`,{children:`4자리 코드를 7번 안에 맞히면 크레딧과 부품. 3분마다 한 판.`}),(0,q.jsx)(Q,{kind:`primary`,disabled:n||o>0,onClick:()=>void t([{t:`ice.start`}]),children:o>0?`재정렬 ${Y(o)}`:`접속`})]})]})})}function tr({s:e,send:t,busy:n,now:i}){let[a,o]=(0,r.useState)(60),s=e.job;if(s){let e=w.find(e=>e.id===s.id),r=i>=s.endsAt;return(0,q.jsx)(Z,{title:`일감`,sub:`게임을 닫아 둬도 시간은 흐른다.`,children:(0,q.jsxs)(`div`,{className:`ar-card`,children:[(0,q.jsx)(`h3`,{children:e.name}),(0,q.jsx)(`p`,{children:e.desc}),(0,q.jsx)(X,{value:Math.min(i,s.endsAt)-s.startedAt,max:s.endsAt-s.startedAt,kind:`time`,label:r?`완료`:`${Y(s.endsAt-i)} 남음`}),(0,q.jsx)(Q,{kind:r?`primary`:`ghost`,disabled:n,onClick:()=>void t([{t:`job.claim`}]),children:r?`정산`:`지금까지만 정산하고 그만두기`})]})})}return(0,q.jsx)(Z,{title:`일감`,sub:`한 번에 하나. 오버클럭 중에 정산하면 ×1.5.`,aside:(0,q.jsx)(`div`,{className:`ar-seg`,role:`radiogroup`,"aria-label":`시간`,children:T.map(e=>(0,q.jsx)(`button`,{type:`button`,role:`radio`,"aria-checked":e===a,className:e===a?`is-on`:``,onClick:()=>o(e),children:e>=60?`${e/60}시간`:`${e}분`},e))}),children:(0,q.jsx)(`ul`,{className:`ar-list`,children:w.map(e=>(0,q.jsxs)(`li`,{children:[(0,q.jsxs)(`div`,{children:[(0,q.jsx)(`b`,{children:e.name}),(0,q.jsx)(`small`,{children:e.desc})]}),(0,q.jsx)(Q,{kind:`primary`,disabled:n,onClick:()=>void t([{t:`job.start`,id:e.id,minutes:a}]),children:`시작`})]},e.id))})})}function nr({s:e,send:t,busy:n,now:r,offset:i}){let a=e.market;return(0,q.jsxs)(Z,{title:`오늘의 물건`,sub:`매일 09:00(내 시간대) 재입고. 그때 내 레벨에 맞춘 물건. 품목마다 하나뿐. 다음 재입고 ${Y(se(r,i)-r)}`,children:[a?(0,q.jsx)(`ul`,{className:`ar-list`,children:a.offers.map(r=>(0,q.jsxs)(`li`,{className:r.sold?`is-sold`:``,children:[r.kind===`gear`?(0,q.jsxs)(`div`,{children:[(0,q.jsx)(Rn,{it:r.item}),(0,q.jsxs)(`small`,{children:[Ln(r.item),` · 모듈 칸 `,r.item.modSlots]})]}):(0,q.jsxs)(`div`,{children:[(0,q.jsx)(`b`,{children:r.label}),(0,q.jsx)(`small`,{children:`오늘 한정`})]}),(0,q.jsx)(Q,{kind:`primary`,disabled:n||!!r.sold||e.credits<r.price,onClick:()=>void t([{t:`market.buy`,id:r.id}]),children:r.sold?`판매됨`:`¥${J(r.price)}`})]},r.id))}):(0,q.jsx)(`p`,{children:`문이 닫혀 있다.`}),(0,q.jsxs)(`p`,{className:`ar-hint`,children:[`Lv.`,a?.level??e.level,` 기준 재고. 레벨이 올라도 다음 09:00까지 그대로.`]})]})}function rr({s:e,send:t,busy:n,now:r,offset:i}){let a=gn(e,{now:r,utcOffsetMin:i}),o=[`혼자: 거의 불가능`,`1명: 반반보다 낮음`,`2명: 대체로 승리`];return(0,q.jsxs)(Z,{title:`출격 편성`,sub:`원래는 여럿이 잡는 보스. 대신 용병을 고용한다. 하루 한 번(09:00 초기화).`,children:[a?(0,q.jsx)(`ul`,{className:`ar-list`,children:[0,1,2].map(r=>(0,q.jsxs)(`li`,{children:[(0,q.jsxs)(`div`,{children:[(0,q.jsxs)(`b`,{children:[`용병 `,r,`명`]}),(0,q.jsxs)(`small`,{children:[o[r],` · 용병은 내 턴 뒤에 공격하고, 보스는 무작위로 한 명을 노린다`]})]}),(0,q.jsxs)(Q,{kind:r===2?`primary`:`normal`,disabled:n||e.credits<r*mn(e),onClick:()=>void t([{t:`raid.start`,crew:r}]),children:[r?`¥${J(r*mn(e))}`:`무료`,` 출격`]})]},r))}):(0,q.jsxs)(`p`,{className:`ar-dim`,children:[`오늘의 레이드는 끝났다. 다음: `,Y(se(r,i)-r),` 뒤.`]}),(0,q.jsxs)(`p`,{className:`ar-hint`,children:[`승리: ¥`,J(120*e.level),`, 큰 경험치, 고급 이상 상자 2개, 희귀 이상 장비. 레이드에서는 회복제를 쓸 수 있다.`]})]})}function ir({s:e,send:t,busy:n,now:r}){let i=(e.overclockUntil??0)>r;return(0,q.jsxs)(Z,{title:`출력 제어`,sub:`원작의 서버 전체 버프를 혼자 쓰는 방식으로 바꿨다.`,children:[(0,q.jsx)(`p`,{children:`30분 동안 피해 +20%, 그 사이 정산한 일감 보상 ×1.5. 켜져 있을 때 사면 30분 연장.`}),i&&(0,q.jsxs)(`p`,{className:`ar-good`,children:[`가동 중 · `,Y(e.overclockUntil-r),` 남음`]}),(0,q.jsxs)(Q,{kind:`primary`,disabled:n||e.credits<fn(e),onClick:()=>void t([{t:`overclock`}]),children:[`가동 ¥`,J(fn(e))]})]})}function ar({s:e}){let t=e.stats,n=[[`처치`,t.kills],[`보스 처치`,t.bossKills],[`플랫라인`,t.deaths],[`던전 정리`,t.dungeonClears],[`도전 던전 정리`,t.challengeClears],[`레이드 승리`,t.raidWins],[`레이드 시도`,t.raidAttempts],[`연 상자`,t.cratesOpened],[`인쇄`,t.itemsPrinted],[`ICE 돌파`,t.iceCracked]];return(0,q.jsx)(Z,{title:`러너 기록`,sub:`온라인 랭킹이 열리면 이 기록이 서버 기록이 된다.`,children:(0,q.jsxs)(`div`,{className:`ar-cols`,children:[(0,q.jsxs)(`dl`,{className:`ar-stats`,children:[(0,q.jsxs)(`div`,{children:[(0,q.jsx)(`dt`,{children:`누적 경험치`}),(0,q.jsx)(`dd`,{children:J(e.totalXp)})]}),n.map(([e,t])=>(0,q.jsxs)(`div`,{children:[(0,q.jsx)(`dt`,{children:e}),(0,q.jsx)(`dd`,{children:J(t)})]},e))]}),(0,q.jsxs)(`div`,{children:[(0,q.jsx)(`h3`,{children:`던전 최단 기록`}),e.records.length===0?(0,q.jsx)(`p`,{className:`ar-dim`,children:`아직 정리한 던전이 없다.`}):(0,q.jsx)(`ul`,{className:`ar-list`,children:[...e.records].sort((e,t)=>e.station-t.station||e.dungeon-t.dungeon).map(e=>(0,q.jsxs)(`li`,{children:[(0,q.jsxs)(`div`,{children:[(0,q.jsxs)(`b`,{children:[y[e.station].dungeons[e.dungeon].name,e.challenge?` (도전)`:``]}),(0,q.jsxs)(`small`,{children:[e.clears,`회 정리`]})]}),(0,q.jsx)(`b`,{children:e.bestMs?Y(e.bestMs):`—`})]},`${e.station}-${e.dungeon}-${e.challenge}`))})]})]})})}var or=320,sr=[{w:`primary`,label:`PRIMARY`,key:`1`,note:`탄약 없음`},{w:`special`,label:`SPECIAL`,key:`2`,note:`실드에 강함`},{w:`destructive`,label:`DESTRUCT.`,key:`3`,note:`실드에 약함`}],cr=(e,t)=>({foeHp:t.foe.hp,foeShield:t.foe.shield,hp:e.hp,shield:t.shield,allies:t.allies.map(e=>e.hp)});function lr({s:e,send:t,busy:n,now:i}){let a=e.combat,o=B(e,i),[s,c]=(0,r.useState)(()=>cr(e,a)),[l,u]=(0,r.useState)(()=>a.events.map(e=>e.text)),[d,f]=(0,r.useState)(!1),[p,m]=(0,r.useState)([]),[h,g]=(0,r.useState)(null),y=(0,r.useRef)(a.turn),b=(0,r.useRef)(0),x=(0,r.useRef)({s:e,c:a});x.current={s:e,c:a},(0,r.useEffect)(()=>{let{s:e,c:t}=x.current;if(t.turn===y.current)return;y.current=t.turn;let n=t.events,r=cr(e,t),i=0;f(!0);let a=e=>{if(u(t=>[...t,e.text].slice(-7)),e.target!=null&&(c(t=>{let n={...t,allies:[...t.allies]};return e.target===`foe`?(n.foeHp=e.hp??n.foeHp,n.foeShield=e.shield??n.foeShield):e.target===`player`?(n.hp=e.hp??n.hp,n.shield=e.shield??n.shield):typeof e.target==`number`&&(n.allies[e.target]=e.hp??n.allies[e.target]),n}),e.dmg||e.heal||e.miss)){let t=++b.current,n=e.miss?`miss`:e.heal?`heal`:e.crit?`crit`:`dmg`,r=e.miss?`MISS`:e.heal?`+${J(e.heal)}`:`-${J(e.dmg)}`;m(i=>[...i,{id:t,target:e.target,text:r,kind:n}]),setTimeout(()=>m(e=>e.filter(e=>e.id!==t)),900),e.dmg&&(e.target===`player`||e.target===`foe`)&&(g(e.target),setTimeout(()=>g(null),220))}},o=setInterval(()=>{i<n.length&&a(n[i++]),i>=n.length&&(clearInterval(o),setTimeout(()=>{c(r),f(!1)},120))},or);return n.length&&a(n[i++]),()=>clearInterval(o)},[a.turn]);let S=!!a.result&&!d,C=!n&&!d&&!a.result,w=e=>{C&&t([e])},T=e=>w({t:`attack`,w:e}),E=e=>w({t:`useItem`,slot:e}),ee=()=>w({t:`escape`}),te=()=>{S&&!n&&t([{t:`combat.close`}])};(0,r.useEffect)(()=>{let e=e=>{let t=jn(e,`combat`);if(!t)return;let n={weapon1:()=>T(`primary`),weapon2:()=>T(`special`),weapon3:()=>T(`destructive`),item1:()=>E(0),item2:()=>E(1),item3:()=>E(2),escape:ee,confirm:te}[t];n&&(e.preventDefault(),n())};return window.addEventListener(`keydown`,e),()=>window.removeEventListener(`keydown`,e)});let D=a.foe,ne=a.where===`street`?100:Math.round(o.escape),O=e=>p.filter(t=>t.target===e).map(e=>(0,q.jsx)(`b`,{className:`ar-float ar-float--${e.kind}`,children:e.text},e.id)),k=a.where===`street`?`길거리 전투`:a.where===`raid`?`레이드`:`던전 전투`;return(0,q.jsxs)(`div`,{className:`ar-combat`,role:`dialog`,"aria-label":`${D.name}과의 전투`,children:[(0,q.jsxs)(`div`,{className:`ar-combat-top`,children:[(0,q.jsxs)(`button`,{type:`button`,className:`ar-escape`,onClick:ee,disabled:!C,title:`도주 (X)`,children:[(0,q.jsx)(`kbd`,{children:`X`}),` 도주 `,ne,`%`]}),(0,q.jsxs)(`span`,{className:`ar-dim`,children:[k,` · `,a.turn,`턴`]})]}),(0,q.jsxs)(`div`,{className:`ar-fighter ar-fighter--foe${h===`foe`?` is-hit`:``}${D.rank===`normal`?``:` is-${D.rank}`}`,children:[(0,q.jsxs)(`div`,{className:`ar-fighter-name`,children:[(0,q.jsxs)(`h2`,{children:[`Lv.`,D.level,` `,D.mods.map(e=>v[e].label).join(` `),` `,D.name]}),D.rank!==`normal`&&(0,q.jsx)(`em`,{className:`ar-tag ar-tag--red`,children:D.rank===`boss`?`BOSS`:`정예`}),D.mods.map(e=>(0,q.jsxs)(`em`,{className:`ar-tag`,title:v[e].hint,children:[v[e].label,`: `,v[e].hint]},e))]}),(0,q.jsx)(X,{value:s.foeHp,max:D.maxHp,kind:`hp`,label:`체력`}),D.maxShield>0&&(0,q.jsx)(X,{value:s.foeShield,max:D.maxShield,kind:`shield`,label:`실드`}),(0,q.jsx)(`div`,{className:`ar-floats`,children:O(`foe`)})]}),a.allies.length>0&&(0,q.jsx)(`div`,{className:`ar-allies`,children:a.allies.map((e,t)=>(0,q.jsxs)(`div`,{className:`ar-ally${s.allies[t]<=0?` is-down`:``}`,children:[(0,q.jsx)(`span`,{children:e.name}),(0,q.jsx)(X,{value:s.allies[t]??e.hp,max:e.maxHp,kind:`ally`,compact:!0}),(0,q.jsx)(`div`,{className:`ar-floats`,children:O(t)})]},e.name))}),(0,q.jsxs)(`div`,{className:`ar-fighter ar-fighter--me${h===`player`?` is-hit`:``}`,children:[(0,q.jsx)(`div`,{className:`ar-fighter-name`,children:(0,q.jsx)(`h2`,{children:`러너`})}),(0,q.jsx)(X,{value:s.hp,max:o.maxHp,kind:`hp`,label:`체력`}),a.maxShield>0&&(0,q.jsx)(X,{value:s.shield,max:a.maxShield,kind:`shield`,label:`실드`}),(0,q.jsx)(`div`,{className:`ar-floats`,children:O(`player`)})]}),(0,q.jsx)(`ol`,{className:`ar-combat-log`,"aria-live":`polite`,children:l.slice(-6).map((e,t)=>(0,q.jsx)(`li`,{children:e},`${a.turn}-${t}-${e}`))}),S?(0,q.jsxs)(`div`,{className:`ar-result ar-result--${a.result}`,children:[(0,q.jsx)(`h2`,{children:a.result===`win`?`TARGET DOWN`:a.result===`lose`?`FLATLINE`:`DISENGAGED`}),(0,q.jsx)(`ul`,{children:a.rewards.map((e,t)=>(0,q.jsx)(`li`,{children:e},t))}),(0,q.jsxs)(`button`,{type:`button`,className:`ar-btn ar-btn--primary`,onClick:te,disabled:n,autoFocus:!0,children:[(0,q.jsx)(`kbd`,{children:`Enter`}),` 계속`]})]}):(0,q.jsxs)(q.Fragment,{children:[(0,q.jsx)(`div`,{className:`ar-items`,children:e.hotbar.map((t,n)=>{let r=t==null?0:N(e,`heal:${t}`),i=a.where===`street`||t==null||r===0;return(0,q.jsxs)(`button`,{type:`button`,className:`ar-item-slot`,disabled:!C||i,onClick:()=>E(n),title:a.where===`street`?`길거리 전투에서는 아이템을 쓸 수 없다`:void 0,children:[(0,q.jsx)(`kbd`,{children:`QWE`[n]}),(0,q.jsx)(`span`,{children:t==null?`빈 칸`:_[t].name}),t!=null&&(0,q.jsxs)(`small`,{children:[`+`,J(_[t].heal),` · [`,r,`]`]})]},n)})}),(0,q.jsx)(`div`,{className:`ar-weapons`,children:sr.map(({w:t,label:n,key:r,note:i})=>{let a=Ve[t],s=a?N(e,a.code):null,c=o.dmg[t],l=c<=0||s!=null&&s<=0;return(0,q.jsxs)(`button`,{type:`button`,className:`ar-weapon ar-weapon--${t}`,disabled:!C||l,onClick:()=>T(t),children:[(0,q.jsx)(`span`,{className:`ar-weapon-tab`,children:n}),(0,q.jsx)(`kbd`,{children:r}),(0,q.jsx)(`span`,{className:`ar-weapon-dmg`,children:c>0?`DMG ${J(c)}`:`장착 안 함`}),(0,q.jsx)(`span`,{className:`ar-weapon-ammo`,children:s==null?`∞`:J(s)}),(0,q.jsx)(`small`,{children:a?`${a.label} · ${i}`:i})]},t)})})]})]})}var $={bg:`#17181a`,grid:`#1f2022`,wall:`#3d4143`,wallHi:`#53585a`,floor:`#2a2c2e`,text:`#9aa3a2`,accent:`#e5484d`,red:`#e5484d`,open:`#c4cbca`,crate:`#b9a46a`,elite:`#c98a5a`,cyan:`#7f9ba6`,violet:`#8a7bbf`,green:`#6fae84`,dim:`#454b4c`},ur=`"Cascadia Mono", "JetBrains Mono", Consolas, monospace`;function dr(e,t,n,r,i,a,o,s,c){let l=t.rooms[t.cur],u=st(l).length>0;e.fillStyle=$.bg,e.fillRect(0,0,15*n,11*n),e.textAlign=`center`,e.textBaseline=`middle`;for(let t=0;t<11;t++)for(let r=0;r<15;r++){let i=l.walls[t][r],a=r*n+n/2,o=t*n+n/2;if(i===`#`)e.fillStyle=$.bg,e.fillRect(r*n,t*n,n,n),e.fillStyle=r===0||t===0||r===14||t===10?$.wall:$.wallHi,e.font=`${n*.55}px ${ur}`,e.fillText(`#`,a,o+1);else if(i===`+`){e.fillStyle=u?$.red:$.open,e.globalAlpha=u?.8:.6;let t=r===0||r===14,i=t?n*.28:n*.8,s=t?n*.8:n*.28;e.fillRect(a-i/2,o-s/2,i,s),e.globalAlpha=1}else e.fillStyle=$.floor,e.fillRect(a-1,o-1,2,2)}e.fillStyle=`rgba(196, 203, 202, 0.25)`;for(let[t,r]of o)e.fillRect(t*n+n/2-3,r*n+n/2-3,6,6);a&&(e.strokeStyle=`rgba(196, 203, 202, 0.35)`,e.lineWidth=1,e.strokeRect(a[0]*n+1.5,a[1]*n+1.5,n-3,n-3));for(let t of l.ents){if(t.done&&t.k!==`lore`)continue;let r=t.x*n+n/2,i=t.y*n+n/2,a=`?`,o=$.text,s=.62;if(t.k===`foe`){let c=t.foe;a=c.rank===`boss`?`Ψ`:c.rank===`elite`?`Ж`:`ж`,o=c.rank===`boss`?$.red:c.rank===`elite`?$.elite:$.text,s=c.rank===`normal`?.62:.78,c.mods.length&&(e.fillStyle=`rgba(229, 72, 77, 0.08)`,e.beginPath(),e.arc(r,i,n*.42,0,Math.PI*2),e.fill()),c.hp<c.maxHp&&(e.fillStyle=`#3a1218`,e.fillRect(t.x*n+4,t.y*n+n-5,n-8,3),e.fillStyle=`#b8323f`,e.fillRect(t.x*n+4,t.y*n+n-5,(n-8)*(c.hp/c.maxHp),3))}else t.k===`crate`?(a=`▣`,o=u?$.dim:$.crate):t.k===`frag`?(a=`◈`,o=u?$.dim:$.cyan,s=.7):t.k===`quest`?(a=`?`,o=$.green,s=.7):t.k===`lore`&&(a=`!`,o=t.done?$.dim:$.violet);e.fillStyle=o,e.font=`bold ${n*s}px ${ur}`,e.fillText(a,r,i+1)}let d=i.x*n+n/2,f=i.y*n+n/2;e.fillStyle=`#d3d8d7`,e.font=`bold ${n*.7}px ${ur}`,e.fillText(`@`,d,f+1);let p=n*1.6;e.fillStyle=`#6a7171`,e.font=`${Math.max(9,n*.28)}px ${ur}`,e.fillText(`RUNNER`,d,f-n*.78),e.fillStyle=`#3c0b16`,e.fillRect(d-p/2,f-n*.55,p,2),e.fillStyle=`#b8323f`,e.fillRect(d-p/2,f-n*.55,p*c,2),s>0&&(e.fillStyle=`rgba(196, 203, 202, ${s*.06})`,e.fillRect(0,0,15*n,11*n))}function fr({d:e}){let t=e.rooms.map(e=>e.gx),n=e.rooms.map(e=>e.gy),r=Math.min(...t),i=Math.min(...n),a=Math.max(...t)-r+1,o=Math.max(...n)-i+1,s=(t,n)=>t.visited||Object.values(t.doors).some(t=>t!=null&&e.rooms[t].visited)||n===e.cur,c=Math.min(26,Math.floor(200/Math.max(a,o)));return(0,q.jsx)(`div`,{className:`ar-minimap`,style:{width:a*c*1.5,height:o*c*1.5},"aria-label":`미니맵`,children:e.rooms.map((t,n)=>{if(!s(t,n))return null;let a=(t.gx-r)*c*1.5,o=(t.gy-i)*c*1.5,l=[`ar-mm-room`,t.visited?`is-visited`:``,n===e.cur?`is-here`:``,t.visited&&t.kind===`treasure`?`is-treasure`:``,t.visited&&!st(t).length?`is-clear`:``].join(` `);return(0,q.jsxs)(`span`,{className:l,style:{left:a,top:o,width:c,height:c},title:t.kind===`treasure`&&t.visited?`보물방`:void 0,children:[t.doors.e!=null&&(0,q.jsx)(`i`,{className:`ar-mm-link ar-mm-link--h`,style:{left:c,width:c*.5,top:c/2-1}}),t.doors.s!=null&&(0,q.jsx)(`i`,{className:`ar-mm-link ar-mm-link--v`,style:{top:c,height:c*.5,left:c/2-1}}),t.visited&&t.kind===`treasure`?`★`:t.visited?``:`?`]},n)})})}function pr({s:e,send:t,busy:n}){let i=e.dungeon,a=i.rooms[i.cur],o=(0,r.useRef)(null),[s,c]=(0,r.useState)(40),l=(0,r.useRef)(null),u=(0,r.useRef)({from:{x:i.x,y:i.y},to:{x:i.x,y:i.y},at:0,room:i.cur,flash:0,foes:st(a).length}),d=(0,r.useRef)(null),[f,p]=(0,r.useState)([]),m=(0,r.useRef)(0),h=!e.combat&&!e.modal,g=Math.max(0,Math.min(1,e.hp/B(e,e.hpAt).maxHp));(0,r.useEffect)(()=>{let e=u.current,t=performance.now();if(e.room!==i.cur)e.from={x:i.x,y:i.y},e.flash=0;else{let n=Math.min(1,(t-e.at)/90);e.from={x:e.from.x+(e.to.x-e.from.x)*n,y:e.from.y+(e.to.y-e.from.y)*n}}e.to={x:i.x,y:i.y},e.at=t,e.room=i.cur;let n=st(i.rooms[i.cur]).length;e.foes>0&&n===0&&(e.flash=1),e.foes=n},[i.x,i.y,i.cur,i]),(0,r.useEffect)(()=>{let e=l.current;if(!e)return;let t=new ResizeObserver(()=>c(Math.max(22,Math.min(46,Math.floor(e.clientWidth/15)))));return t.observe(e),()=>t.disconnect()},[]),(0,r.useEffect)(()=>{let e=o.current;if(!e)return;let t=window.devicePixelRatio||1;e.width=15*s*t,e.height=11*s*t;let n=e.getContext(`2d`);n.setTransform(t,0,0,t,0,0);let r=0,a=performance.now(),c=e=>{let t=u.current,o=Math.min(1,(e-t.at)/90),l={x:t.from.x+(t.to.x-t.from.x)*o,y:t.from.y+(t.to.y-t.from.y)*o};t.flash=Math.max(0,t.flash-(e-a)/600),a=e,dr(n,i,s,e,l,d.current,f,t.flash,g),r=requestAnimationFrame(c)};return r=requestAnimationFrame(c),()=>cancelAnimationFrame(r)},[i,s,f,g]);let v=(0,r.useCallback)(e=>t([{t:`move`,dir:e}]),[t]);(0,r.useEffect)(()=>{if(!h)return;let e=e=>{let t=jn(e,`dungeon`),r=t===`up`?`n`:t===`down`?`s`:t===`left`?`w`:t===`right`?`e`:null;r&&(e.preventDefault(),m.current++,n||v(r))};return window.addEventListener(`keydown`,e),()=>window.removeEventListener(`keydown`,e)},[h,n,v]);let b=e=>{let t=e.currentTarget.getBoundingClientRect();return[Math.floor((e.clientX-t.left)/t.width*15),Math.floor((e.clientY-t.top)/t.height*11)]},x=e=>{let t=b(e),n=d.current;if(n&&n[0]===t[0]&&n[1]===t[1])return;d.current=t;let r=h?lt(a,[i.x,i.y],t):null,o=[],s=i.x,c=i.y;for(let e of(r??[]).slice(0,-1))s+=U[e][0],c+=U[e][1],o.push([s,c]);p(o)},S=async e=>{if(!h)return;let t=lt(a,[i.x,i.y],b(e));if(!t?.length)return;let n=++m.current;p([]);for(let e of t){if(m.current!==n||!await v(e))return;await new Promise(e=>setTimeout(e,70))}},C=y[i.station].dungeons[i.idx],w=i.rooms.filter(e=>e.visited).length,T=st(a).length;return(0,q.jsxs)(`div`,{className:`ar-dungeon`,children:[(0,q.jsxs)(`div`,{className:`ar-dungeon-map`,children:[(0,q.jsxs)(`header`,{className:`ar-dungeon-head`,children:[(0,q.jsxs)(`div`,{children:[(0,q.jsxs)(`h2`,{children:[C.name,i.challenge&&(0,q.jsx)(`em`,{className:`ar-tag ar-tag--red`,children:`도전`})]}),(0,q.jsxs)(`p`,{children:[`Lv.`,i.level,` · `,y[i.station].name,` · 방 `,w,`/`,i.rooms.length,a.kind===`treasure`&&(0,q.jsx)(`em`,{className:`ar-tag`,children:`보물방`}),i.cleared&&(0,q.jsx)(`em`,{className:`ar-tag ar-tag--green`,children:`정리 완료`})]})]}),(0,q.jsx)(`p`,{className:T?`ar-room-state is-locked`:`ar-room-state`,children:T?`적 ${T} · 문 잠김`:`문 열림`})]}),(0,q.jsx)(`div`,{className:`ar-canvas-wrap`,ref:l,children:(0,q.jsx)(`canvas`,{ref:o,style:{width:15*s,height:11*s},onMouseMove:x,onMouseLeave:()=>{d.current=null,p([])},onClick:e=>void S(e),"aria-label":`던전 방. 방향키나 WASD로 움직이고, 칸을 눌러 그 칸으로 걸어갈 수 있다`})}),(0,q.jsxs)(`ul`,{className:`ar-legend`,children:[(0,q.jsxs)(`li`,{children:[(0,q.jsx)(`b`,{className:`g-me`,children:`@`}),` 나`]}),(0,q.jsxs)(`li`,{children:[(0,q.jsx)(`b`,{className:`g-foe`,children:`ж`}),` 적`]}),(0,q.jsxs)(`li`,{children:[(0,q.jsx)(`b`,{className:`g-elite`,children:`Ж`}),` 정예`]}),(0,q.jsxs)(`li`,{children:[(0,q.jsx)(`b`,{className:`g-boss`,children:`Ψ`}),` 보스`]}),(0,q.jsxs)(`li`,{children:[(0,q.jsx)(`b`,{className:`g-crate`,children:`▣`}),` 상자`]}),(0,q.jsxs)(`li`,{children:[(0,q.jsx)(`b`,{className:`g-frag`,children:`◈`}),` 열쇠 조각`]}),(0,q.jsxs)(`li`,{children:[(0,q.jsx)(`b`,{className:`g-quest`,children:`?`}),` 의뢰인`]}),(0,q.jsxs)(`li`,{children:[(0,q.jsx)(`b`,{className:`g-lore`,children:`!`}),` 기록`]}),(0,q.jsxs)(`li`,{className:`ar-legend-keys`,children:[(0,q.jsx)(`kbd`,{children:`WASD`}),`/`,(0,q.jsx)(`kbd`,{children:`방향키`}),` 이동 · 칸 클릭 = 걸어가기 · 적에게 부딪히면 전투`]})]})]}),(0,q.jsxs)(`aside`,{className:`ar-dungeon-side`,children:[(0,q.jsxs)(`div`,{className:`ar-card`,children:[(0,q.jsx)(`h3`,{children:`지도`}),(0,q.jsx)(fr,{d:i})]}),(0,q.jsxs)(`div`,{className:`ar-card`,children:[(0,q.jsx)(`h3`,{children:`단축칸`}),(0,q.jsx)(`ul`,{className:`ar-hotbar-list`,children:e.hotbar.map((t,n)=>(0,q.jsxs)(`li`,{children:[(0,q.jsx)(`kbd`,{children:`QWE`[n]}),t==null?(0,q.jsx)(`span`,{className:`ar-dim`,children:`비어 있음`}):(0,q.jsxs)(`span`,{children:[_[t].name,` `,(0,q.jsxs)(`b`,{children:[`×`,N(e,`heal:${t}`)]})]})]},n))}),(0,q.jsx)(`p`,{className:`ar-hint`,children:`회복은 던전 전투 중에만. 체력은 던전에서 저절로 차지 않는다.`})]}),(0,q.jsxs)(`div`,{className:`ar-card`,children:[(0,q.jsx)(`h3`,{children:`이번 진입`}),(0,q.jsxs)(`p`,{children:[`경험치 +`,J(i.loot.xp),` · ¥`,J(i.loot.credits)]}),(0,q.jsxs)(`p`,{className:`ar-dim`,children:[`탄약 `,N(e,`cells`),` · 반물질 `,N(e,`antimatter`)]})]}),(0,q.jsx)(Q,{kind:`danger`,disabled:n,onClick:()=>void t([{t:`dungeon.leave`}]),children:`던전 나가기`})]})]})}var mr={n:`↑`,s:`↓`,w:`←`,e:`→`};function hr({title:e,children:t,wide:n}){return(0,q.jsx)(`div`,{className:`ar-modal-back`,children:(0,q.jsxs)(`div`,{className:`ar-modal${n?` ar-modal--wide`:``}`,role:`dialog`,"aria-modal":`true`,"aria-label":e,children:[(0,q.jsx)(`h2`,{children:e}),t]})})}function gr({m:e,s:t,send:n,busy:r}){let i=C.find(t=>t.id===e.buff),a=e.want.code.startsWith(`heal`)?`진통 패치`:zn[e.want.code],o=N(t,e.want.code);return(0,q.jsxs)(hr,{title:`의뢰`,children:[(0,q.jsxs)(`div`,{className:`ar-dialog`,children:[(0,q.jsxs)(`p`,{children:[e.who,`이(가) 당신을 보고 말을 건다. `,e.line]}),(0,q.jsxs)(`p`,{children:[`"`,a,` `,e.want.n,`개만 구해 줘. 그러면 내 강화 주사를 놔 주지. `,(0,q.jsx)(`b`,{className:`ar-accent`,children:i.label}),`, `,e.minutes,`분짜리야."`]}),(0,q.jsxs)(`p`,{className:`ar-dim`,children:[`가진 `,a,`: `,o,`개 · 효과: `,i.stat===`dmg`?`피해`:i.stat===`def`?`받는 피해 감소`:`실드`,` +`,i.pct,`%`]})]}),(0,q.jsxs)(`div`,{className:`ar-modal-actions`,children:[(0,q.jsx)(Q,{kind:`primary`,disabled:r||o<e.want.n,onClick:()=>void n([{t:`giver`,accept:!0}]),children:`수락하고 건넨다`}),(0,q.jsx)(Q,{kind:`ghost`,disabled:r,onClick:()=>void n([{t:`giver`,accept:!1}]),children:`나중에`})]})]})}function _r({m:e,send:t,busy:n}){let[i,a]=(0,r.useState)(0),[o,s]=(0,r.useState)(null),[c,l]=(0,r.useState)(e.limitMs),u=(0,r.useRef)(performance.now()),d=(0,r.useRef)(!1);(0,r.useEffect)(()=>{a(0),s(null),l(e.limitMs),u.current=performance.now(),d.current=!1},[e.seq,e.limitMs]),(0,r.useEffect)(()=>{if(o||i>=e.seq.length)return;let t=setInterval(()=>{let t=e.limitMs-(performance.now()-u.current);l(t),t<=0&&s(`시간 초과`)},50);return()=>clearInterval(t)},[o,i,e.limitMs,e.seq.length]);let f=n=>{if(o||i>=e.seq.length)return;if(n!==e.seq[i]){s(`신호 불일치`);return}let r=i+1;a(r),r===e.seq.length&&!d.current&&(d.current=!0,t([{t:`sync.submit`,inputs:e.seq}]))};(0,r.useEffect)(()=>{let e=e=>{let t=jn(e,`sync`),n=t===`up`?`n`:t===`down`?`s`:t===`left`?`w`:t===`right`?`e`:null;n&&(e.preventDefault(),f(n))};return window.addEventListener(`keydown`,e),()=>window.removeEventListener(`keydown`,e)});let p=Math.round(i/e.seq.length*100);return(0,q.jsxs)(hr,{title:`잠긴 상자`,children:[(0,q.jsxs)(`div`,{className:`ar-sync`,children:[(0,q.jsxs)(`div`,{className:`ar-decrypt-progress`,children:[(0,q.jsx)(`span`,{children:`DECRYPTION PROGRESS`}),(0,q.jsxs)(`span`,{children:[i,` / `,e.seq.length,` · `,p,`%`]})]}),(0,q.jsx)(`div`,{className:`ar-decrypt-ticks`,children:(0,q.jsx)(`i`,{style:{width:`${p}%`}})}),(0,q.jsxs)(`div`,{className:`ar-decrypt-head`,children:[(0,q.jsx)(`h3`,{children:`DECRYPTION`}),(0,q.jsx)(`p`,{children:`신호를 순서대로 입력해 잠금 해제 · 틀리면 실패`})]}),(0,q.jsxs)(`div`,{className:`ar-decrypt-timer`,"aria-live":`off`,children:[(0,q.jsx)(`b`,{children:Math.max(0,Math.ceil(c/1e3))}),(0,q.jsx)(`span`,{children:`seconds`})]}),(0,q.jsx)(`div`,{className:`ar-sync-seq`,"aria-live":`polite`,children:e.seq.map((e,t)=>(0,q.jsx)(`span`,{className:t<i?`is-done`:t===i?`is-now`:t<=i+2?`is-next`:`is-later`,children:mr[e]},t))}),(0,q.jsxs)(`div`,{className:`ar-decrypt-banner`,children:[(0,q.jsx)(`span`,{children:`이 신호를 입력 (방향키·WASD)`}),(0,q.jsx)(`b`,{children:i<e.seq.length?mr[e.seq[i]]:`✓`})]}),(0,q.jsx)(`div`,{className:`ar-sync-pad`,children:[`n`,`w`,`s`,`e`].map(e=>(0,q.jsx)(`button`,{type:`button`,className:`ar-pad ar-pad--${e}`,onClick:()=>f(e),disabled:!!o,"aria-label":mr[e],children:mr[e]},e))})]}),o&&(0,q.jsxs)(`div`,{className:`ar-modal-actions`,children:[(0,q.jsxs)(`p`,{className:`ar-bad`,children:[`DECRYPTION FAILED — `,o]}),(0,q.jsx)(Q,{kind:`primary`,disabled:n,onClick:()=>void t([{t:`sync.retry`}]),children:`다시 시도`}),(0,q.jsx)(Q,{kind:`danger`,disabled:n,onClick:()=>void t([{t:`sync.abandon`}]),children:`포기 (상자 파괴)`})]})]})}function vr({m:e,send:t,busy:n}){let[i,a]=(0,r.useState)([]),o=()=>{i.length===4&&!n&&(t([{t:`ice.guess`,g:i}]),a([]))};return(0,r.useEffect)(()=>{let t=t=>{if(!e.done){if(/^Digit[0-5]$/.test(t.code))a(e=>e.length<4?[...e,Number(t.code.slice(5))]:e);else if(t.code===`Backspace`)a(e=>e.slice(0,-1));else if(t.code===`Enter`)o();else return;t.preventDefault()}};return window.addEventListener(`keydown`,t),()=>window.removeEventListener(`keydown`,t)}),(0,q.jsxs)(hr,{title:`ICE 크래킹`,wide:!0,children:[(0,q.jsxs)(`p`,{className:`ar-dim`,children:[`0~5 숫자 4개짜리 코드. `,e.max,`번 안에 맞히세요. `,(0,q.jsx)(`b`,{children:`●`}),` 자리·숫자 모두 맞음, `,(0,q.jsx)(`b`,{children:`○`}),` 숫자만 맞음.`]}),(0,q.jsx)(`table`,{className:`ar-ice`,children:(0,q.jsx)(`tbody`,{children:Array.from({length:e.max},(t,n)=>{let r=e.guesses[n],a=n===e.guesses.length&&!e.done,o=r?r.g:a?i:[];return(0,q.jsxs)(`tr`,{className:a?`is-now`:``,children:[(0,q.jsx)(`th`,{children:String(n+1).padStart(2,`0`)}),[0,1,2,3].map(e=>(0,q.jsx)(`td`,{children:o[e]??`·`},e)),(0,q.jsx)(`td`,{className:`ar-ice-fb`,children:r?`${`●`.repeat(r.exact)}${`○`.repeat(r.near)}`:``})]},n)})})}),e.done?(0,q.jsxs)(`div`,{className:`ar-modal-actions`,children:[(0,q.jsx)(`p`,{className:e.done===`won`?`ar-good`:`ar-bad`,children:e.done===`won`?`ACCESS GRANTED`:`ACCESS DENIED — 코드 ${e.code.join(``)}`}),(0,q.jsx)(Q,{kind:`primary`,disabled:n,onClick:()=>void t([{t:`modal.close`}]),children:`닫기`})]}):(0,q.jsxs)(`div`,{className:`ar-ice-pad`,children:[[0,1,2,3,4,5].map(e=>(0,q.jsx)(`button`,{type:`button`,className:`ar-pad`,disabled:i.length>=4,onClick:()=>a(t=>[...t,e]),children:e},e)),(0,q.jsx)(`button`,{type:`button`,className:`ar-pad`,onClick:()=>a(e=>e.slice(0,-1)),"aria-label":`지우기`,children:`⌫`}),(0,q.jsx)(Q,{kind:`primary`,disabled:n||i.length<4,onClick:o,children:`입력`})]})]})}function yr({s:e,send:t,busy:n}){let r=e.modal;if(!r)return null;if(r.kind===`giver`)return(0,q.jsx)(gr,{m:r,s:e,send:t,busy:n});if(r.kind===`sync`)return(0,q.jsx)(_r,{m:r,send:t,busy:n});if(r.kind===`ice`)return(0,q.jsx)(vr,{m:r,send:t,busy:n});let i=r.kind===`lore`?`기록`:r.title,a=r.kind===`lore`?[r.text]:r.lines;return(0,q.jsxs)(hr,{title:i,children:[a.map((e,t)=>(0,q.jsx)(`p`,{className:`ar-dialog`,children:e},t)),(0,q.jsx)(`div`,{className:`ar-modal-actions`,children:(0,q.jsx)(Q,{kind:`primary`,disabled:n,onClick:()=>void t([{t:`modal.close`}]),children:`닫기`})})]})}var br=[{id:`gear`,label:`장비`,glyph:`◧`},{id:`bag`,label:`가방`,glyph:`▤`},{id:`craft`,label:`제작`,glyph:`⚗`},{id:`quests`,label:`퀘스트`,glyph:`◎`}];function xr({onClose:e}){let t=(0,r.useMemo)(()=>new wn,[]),[n,i]=(0,r.useState)(null),a=(0,r.useRef)(null),[o,s]=(0,r.useState)(!1),[c,l]=(0,r.useState)(null),[u,d]=(0,r.useState)(`here`),[f,p]=(0,r.useState)(!1),[m,h]=(0,r.useState)(()=>Date.now()),[g,_]=(0,r.useState)([]),v=(0,r.useRef)(Promise.resolve()),b=-new Date(m).getTimezoneOffset(),x=(0,r.useCallback)(e=>{let t=Date.now();l({id:t,text:e}),setTimeout(()=>l(e=>e?.id===t?null:e),2600)},[]),S=(0,r.useCallback)(e=>{let n=async()=>{let n=a.current;if(!n)return!1;s(!0);try{let r=await t.send(n.version,e);return a.current=r,i(r),!0}catch(e){if(e instanceof O){if(x(e.message),e.message.startsWith(`다른 창`)){let e=await t.load();a.current=e,i(e)}}else console.error(e),x(`알 수 없는 오류가 났습니다`);return!1}finally{s(!1)}},r=v.current.then(n,n);return v.current=r,r},[t,x]);(0,r.useEffect)(()=>{t.load().then(e=>{a.current=e,i(e),S([{t:`sync`}])})},[t,S]),(0,r.useEffect)(()=>{let e=setInterval(()=>h(Date.now()),1e3);return()=>clearInterval(e)},[]),(0,r.useEffect)(()=>{let e=setInterval(()=>{let e=D[Math.floor(Math.random()*D.length)];_(t=>[...t,{at:Date.now(),text:e.text,tone:`comms`,who:e.who}].slice(-12))},75e3);return()=>clearInterval(e)},[]);let T=n?.state,ee=T?.loc;if((0,r.useEffect)(()=>{ee&&ee!==`town`&&d(`here`)},[ee]),(0,r.useEffect)(()=>{let t=t=>{let n=jn(t,`menu`);if(n===`bossKey`&&(t.preventDefault(),p(e=>!e)),n===`close`){let n=a.current?.state;if(n?.combat||n?.modal)return;t.preventDefault(),e()}};return window.addEventListener(`keydown`,t),()=>window.removeEventListener(`keydown`,t)},[e]),f)return(0,q.jsx)(`div`,{className:`ar-root`,children:(0,q.jsx)(Pn,{onBack:()=>p(!1)})});if(!T)return(0,q.jsx)(`div`,{className:`ar-root`,children:(0,q.jsx)(`div`,{className:`ar ar--loading`,children:(0,q.jsx)(`p`,{children:`접속 중…`})})});let te=B(T,m),ne=Ie(T,m),k=(T.flatlineUntil??0)>m,A={s:T,send:S,busy:o,now:m,offset:b},j=qn.find(e=>e.id===u),M=T.quests.filter(e=>e.have>=e.need).length,N=T.dungeon?`${y[T.dungeon.station].dungeons[T.dungeon.idx].name}${T.dungeon.challenge?` (도전)`:``}`:T.street?`${y[T.street.station].name} · ${y[T.street.station].areas[T.street.area].name}`:`제로 플라자`,P=T.dungeon?`던전`:T.street?`길거리`:`도시`,F;if(u===`gear`)F=(0,q.jsx)(Hn,{...A});else if(u===`bag`)F=(0,q.jsx)(Wn,{...A});else if(u===`craft`)F=(0,q.jsx)(Gn,{...A});else if(u===`quests`)F=(0,q.jsx)(Kn,{...A});else if(T.dungeon)F=(0,q.jsx)(pr,{s:T,send:S,busy:o});else if(T.street)F=(0,q.jsx)(Xn,{...A});else if(u===`here`||!j)F=(0,q.jsx)(Jn,{s:T,now:m,offset:b,go:d});else{let e={rail:Yn,forge:Zn,smith:Qn,pharm:$n,terminal:er,gigs:tr,market:nr,raid:rr,relay:ir,records:ar}[j.id],t=E[j.id];F=(0,q.jsxs)(q.Fragment,{children:[(0,q.jsx)(`button`,{type:`button`,className:`ar-crumb`,onClick:()=>d(`here`),children:`← 제로 플라자`}),(0,q.jsx)(Dn,{title:j.name,tag:t.tag,npc:t.npc,lines:t.lines,hue:t.hue,glyph:j.glyph},j.id),(0,q.jsx)(e,{...A})]})}let I=[...T.log.map(e=>({...e})),...g].sort((e,t)=>e.at-t.at).slice(-40),re=T.job&&w.find(e=>e.id===T.job.id),L=ue(T,m);return(0,q.jsx)(`div`,{className:`ar-root`,children:(0,q.jsxs)(`div`,{className:`ar`,children:[(0,q.jsxs)(`header`,{className:`ar-top`,children:[(0,q.jsxs)(`div`,{className:`ar-logo`,"aria-label":`ARASAKA_IN`,children:[`ARASAKA`,(0,q.jsx)(`b`,{children:`_IN`})]}),(0,q.jsxs)(`div`,{className:`ar-where`,children:[(0,q.jsx)(`small`,{children:`위치`}),N]}),(0,q.jsxs)(`div`,{className:`ar-vitals`,children:[(0,q.jsxs)(`div`,{className:`ar-lv`,children:[(0,q.jsx)(`small`,{children:`LV`}),T.level]}),(0,q.jsxs)(`div`,{className:`ar-vital-bars`,children:[(0,q.jsx)(X,{value:ne,max:te.maxHp,kind:`hp`,label:`HP`,compact:!0}),(0,q.jsx)(X,{value:T.level>=60?1:T.xp,max:T.level>=60?1:R(T.level),kind:`xp`,label:`XP`,compact:!0})]})]}),(0,q.jsxs)(`div`,{className:`ar-money`,children:[(0,q.jsx)(`small`,{children:`크레딧`}),`¥`,J(T.credits)]}),(0,q.jsxs)(`div`,{className:`ar-buffchips`,children:[(T.overclockUntil??0)>m&&(0,q.jsxs)(`span`,{className:`ar-chip ar-chip--hot`,title:`피해 +20%`,children:[`오버클럭 `,Y(T.overclockUntil-m)]}),L.map(e=>(0,q.jsxs)(`span`,{className:`ar-chip`,children:[C.find(t=>t.id===e.id)?.label,` `,Y(e.until-m)]},e.id))]}),(0,q.jsx)(`button`,{type:`button`,className:`ar-top-btn`,onClick:()=>p(!0),title:"위장 화면 (` 키)",children:`⌨ 위장`}),(0,q.jsx)(`button`,{type:`button`,className:`ar-top-btn ar-top-close`,onClick:e,title:`닫기 (Esc)`,"aria-label":`게임 닫기`,children:`✕`})]}),(0,q.jsxs)(`nav`,{className:`ar-nav`,"aria-label":`게임 메뉴`,children:[(0,q.jsxs)(`button`,{type:`button`,className:u===`here`||j&&!T.dungeon&&!T.street?`is-on`:``,onClick:()=>d(`here`),children:[(0,q.jsx)(`span`,{"aria-hidden":!0,children:T.dungeon?`Ψ`:T.street?`ж`:`⌂`}),P]}),br.map(e=>(0,q.jsxs)(`button`,{type:`button`,className:u===e.id?`is-on`:``,onClick:()=>d(e.id),children:[(0,q.jsx)(`span`,{"aria-hidden":!0,children:e.glyph}),e.label,e.id===`quests`&&M>0&&(0,q.jsx)(`em`,{children:M})]},e.id)),(0,q.jsxs)(`div`,{className:`ar-nav-foot`,children:[(0,q.jsx)(`kbd`,{children:"`"}),` 위장`,(0,q.jsx)(`br`,{}),(0,q.jsx)(`kbd`,{children:`Esc`}),` 닫기`]})]}),(0,q.jsxs)(`main`,{className:`ar-main`,children:[F,T.combat&&(0,q.jsx)(lr,{s:T,send:S,busy:o,now:m}),k&&!T.combat&&(0,q.jsxs)(`div`,{className:`ar-flatline`,role:`alert`,children:[(0,q.jsx)(`h2`,{children:`FLATLINE`}),(0,q.jsxs)(`p`,{children:[`신경 재부팅 중… `,Y(T.flatlineUntil-m)]})]})]}),(0,q.jsxs)(`aside`,{className:`ar-side`,children:[re&&T.job&&(0,q.jsxs)(`div`,{className:`ar-card`,children:[(0,q.jsxs)(`h3`,{children:[`일감 · `,re.name]}),(0,q.jsx)(X,{value:Math.min(m,T.job.endsAt)-T.job.startedAt,max:T.job.endsAt-T.job.startedAt,kind:`time`,label:m>=T.job.endsAt?`완료`:Y(T.job.endsAt-m),compact:!0})]}),(0,q.jsxs)(`div`,{className:`ar-card`,children:[(0,q.jsx)(`h3`,{children:`퀘스트`}),(0,q.jsx)(`ul`,{className:`ar-mini-quests`,children:T.quests.map(e=>(0,q.jsxs)(`li`,{className:e.have>=e.need?`is-done`:``,children:[(0,q.jsx)(`span`,{children:{kill:`처치`,street:`길거리`,dungeon:`던전`,print:`인쇄`,craft:`제작`,crate:`상자`,ice:`ICE`}[e.kind]}),(0,q.jsxs)(`b`,{children:[e.have,`/`,e.need]})]},e.id))})]}),(0,q.jsxs)(`div`,{className:`ar-log`,"aria-live":`polite`,children:[(0,q.jsx)(`h3`,{children:`통신`}),(0,q.jsx)(`ol`,{children:I.map((e,t)=>(0,q.jsxs)(`li`,{className:`tone-${e.tone}`,children:[(0,q.jsx)(`time`,{children:new Date(e.at).toLocaleTimeString(`ko-KR`,{hour:`2-digit`,minute:`2-digit`})}),e.who&&(0,q.jsx)(`b`,{children:e.who}),e.text]},`${e.at}-${t}`))})]})]}),(0,q.jsx)(yr,{s:T,send:S,busy:o}),c&&(0,q.jsx)(`div`,{className:`ar-toast`,role:`status`,children:c.text})]})})}export{xr as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{t as e}from"./rolldown-runtime-XKyaHtl9.js";var t=e(((e,t)=>{t.exports={}}));export default t();
|